Source code for hwtLib.examples.operators.concat

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from math import ceil

from hwt.code import Concat, If, Switch
from hwt.hdl.types.bits import HBits
from hwt.hwIOs.hwIOArray import HwIOArray
from hwt.hwIOs.std import HwIOSignal, HwIOVectSignal, HwIOBramPort_noClk
from hwt.hwIOs.utils import addClkRstn
from hwt.hwModule import HwModule
from hwt.pyUtils.typingFuture import override
from hwtLib.types.net.arp import arp_ipv4_t


[docs] class SimpleConcat(HwModule): """ .. hwt-autodoc:: """ @override def hwDeclr(self): self.a0 = HwIOSignal() self.a1 = HwIOSignal() self.a2 = HwIOSignal() self.a3 = HwIOSignal() self.a_out = HwIOVectSignal(4)._m() @override def hwImpl(self): self.a_out(Concat(self.a3, self.a2, self.a1, self.a0))
[docs] class ConcatAssign(HwModule): """ .. hwt-autodoc:: """ @override def hwDeclr(self): self.a0 = HwIOSignal()._m() self.a1 = HwIOSignal()._m() self.a2 = HwIOSignal()._m() self.a3 = HwIOSignal()._m() self.a_in = HwIOVectSignal(4) @override def hwImpl(self): # verilog like {a3, a2, a1, a0} = a_in Concat(self.a3, self.a2, self.a1, self.a0)(self.a_in)
[docs] class ConcatIndexAssignMix0(HwModule): """ .. hwt-autodoc:: """ @override def hwDeclr(self): self.a = HwIOArray([HwIOVectSignal(2), HwIOVectSignal(2)]) self.b = HwIOArray(HwIOSignal() for _ in range(4))._m() @override def hwImpl(self) -> None: a = Concat(*reversed(self.a)) for i, b in enumerate(self.b): b(a[i])
[docs] class ConcatIndexAssignMix1(HwModule): """ .. hwt-autodoc:: """ @override def hwDeclr(self): self.a = HwIOArray(HwIOSignal() for _ in range(4)) self.b = HwIOArray([HwIOVectSignal(2), HwIOVectSignal(2)])._m() @override def hwImpl(self) -> None: b = Concat(*reversed(self.b)) for i, a in enumerate(self.a): b[i](a)
[docs] class ConcatIndexAssignMix2(HwModule): """ .. hwt-autodoc:: """ @override def hwDeclr(self): self.a = HwIOArray([HwIOVectSignal(2), HwIOVectSignal(4), HwIOVectSignal(2)]) self.b = HwIOArray([HwIOVectSignal(4), HwIOVectSignal(4)])._m() @override def hwImpl(self) -> None: b = Concat(*reversed(self.b)) a0, a1, a2 = self.a b[:6](a2) b[6:2](a1) b[2:](a0)
[docs] class ConcatIndexAssignMix3(HwModule): """ .. hwt-autodoc:: """ @override def hwDeclr(self): addClkRstn(self) self.port = HwIOBramPort_noClk() self.port.DATA_WIDTH = 24 @override def hwImpl(self) -> None: port = self.port d = self._reg("d", arp_ipv4_t, def_val={f.name: i for i, f in enumerate(arp_ipv4_t.fields)}) d_flat = d._reinterpret_cast(HBits(d._dtype.bit_length())) rd_cases = [] wr_cases = [] d_w = d_flat._dtype.bit_length() for i in range(ceil(d_w / 24)): start = i * 24 end = (i + 1) * 24 if end <= d_w: out_src = d_flat[end:start] in_dst_assig = out_src(port.din) else: out_src = Concat(HBits(end - d_w).from_py(0), d_flat[d_w:start]) in_dst_assig = d_flat[d_w:start](port.din[d_w - start:]) rd_cases.append((i, port.dout(out_src))) wr_cases.append((i, in_dst_assig)) If(self.clk._onRisingEdge() & port.en, Switch(port.addr)\ .add_cases(rd_cases)\ .Default(port.dout(None)), ) If(port.en & port.we, Switch(port.addr)\ .add_cases(wr_cases) )
if __name__ == "__main__": from hwt.synth import to_rtl_str m = ConcatIndexAssignMix3() print(to_rtl_str(m))