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 Bits
from hwt.interfaces.std import Signal, VectSignal, BramPort_withoutClk
from hwt.interfaces.utils import addClkRstn
from hwt.synthesizer.hObjList import HObjList
from hwt.synthesizer.unit import Unit
from hwtLib.types.net.arp import arp_ipv4_t
[docs]class SimpleConcat(Unit):
"""
.. hwt-autodoc::
"""
def _declr(self):
self.a0 = Signal()
self.a1 = Signal()
self.a2 = Signal()
self.a3 = Signal()
self.a_out = VectSignal(4)._m()
def _impl(self):
self.a_out(Concat(self.a3, self.a2, self.a1, self.a0))
[docs]class ConcatAssign(Unit):
"""
.. hwt-autodoc::
"""
def _declr(self):
self.a0 = Signal()._m()
self.a1 = Signal()._m()
self.a2 = Signal()._m()
self.a3 = Signal()._m()
self.a_in = VectSignal(4)
def _impl(self):
# verilog like {a3, a2, a1, a0} = a_in
Concat(self.a3, self.a2, self.a1, self.a0)(self.a_in)
[docs]class ConcatIndexAssignMix0(Unit):
"""
.. hwt-autodoc::
"""
def _declr(self):
self.a = HObjList([VectSignal(2), VectSignal(2)])
self.b = HObjList([Signal()._m() for _ in range(4)])
def _impl(self) -> None:
a = Concat(*reversed(self.a))
for i, b in enumerate(self.b):
b(a[i])
[docs]class ConcatIndexAssignMix1(Unit):
"""
.. hwt-autodoc::
"""
def _declr(self):
self.a = HObjList([Signal() for _ in range(4)])
self.b = HObjList([VectSignal(2)._m(), VectSignal(2)._m()])
def _impl(self) -> None:
b = Concat(*reversed(self.b))
for i, a in enumerate(self.a):
b[i](a)
[docs]class ConcatIndexAssignMix2(Unit):
"""
.. hwt-autodoc::
"""
def _declr(self):
self.a = HObjList([VectSignal(2), VectSignal(4), VectSignal(2)])
self.b = HObjList([VectSignal(4)._m(), VectSignal(4)._m()])
def _impl(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(Unit):
"""
.. hwt-autodoc::
"""
def _declr(self):
addClkRstn(self)
self.port = BramPort_withoutClk()
self.port.DATA_WIDTH = 24
def _impl(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(Bits(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(Bits(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.synthesizer.utils import to_rtl_str
u = ConcatIndexAssignMix3()
print(to_rtl_str(u))