Source code for hwtLib.handshaked.splitSelect
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import SwitchLogic
from hwt.hwIOs.hwIOArray import HwIOArray
from hwt.hwIOs.std import HwIODataRdVld
from hwt.hwIOs.utils import propagateClkRstn, addClkRstn
from hwt.hwParam import HwParam
from hwt.pyUtils.typingFuture import override
from hwtLib.handshaked.compBase import HandshakedCompBase
from hwtLib.handshaked.reg import HandshakedReg
[docs]
class HsSplitSelect(HandshakedCompBase):
"""
Split data from input interface to N output interfaces based on explicit
output index provided by select interface.
.. figure:: ./_static/HsSplitSelect.png
.. hwt-autodoc:: _example_HsSplitSelect
"""
@override
def hwConfig(self):
self.OUTPUTS = HwParam(3)
super().hwConfig()
@override
def hwDeclr(self):
addClkRstn(self)
outputs = int(self.OUTPUTS)
assert outputs > 1, outputs
self.selectOneHot = HwIODataRdVld()
self.selectOneHot.DATA_WIDTH = outputs
with self._hwParamsShared():
self.dataIn = self.hwIOCls()
self.dataOut = HwIOArray(
self.hwIOCls() for _ in range(int(self.OUTPUTS))
)._m()
[docs]
def _select_consume_en(self):
return True
@override
def hwImpl(self):
In = self.dataIn
rd = self.get_ready_signal
sel = self.selectOneHot
r = HandshakedReg(HwIODataRdVld)
r.DATA_WIDTH = sel.data._dtype.bit_length()
self.selReg = r
r.dataIn(sel)
propagateClkRstn(self)
sel = r.dataOut
for index, outHwIO in enumerate(self.dataOut):
for inIO, outIO in zip(In._hwIOs, outHwIO._hwIOs):
if inIO == self.get_valid_signal(In):
# out.vld
outIO(sel.vld & inIO & sel.data[index])
elif inIO == rd(In):
pass
else: # data
outIO(inIO)
din = self.dataIn
SwitchLogic(
cases=[(~sel.vld, [sel.rd(0),
rd(In)(0)])
] +
[(sel.data[index],
[rd(In)(rd(out)),
sel.rd(rd(out) & self.get_valid_signal(din) & sel.vld & self._select_consume_en())])
for index, out in enumerate(self.dataOut)],
default=[
sel.rd(None),
rd(In)(None)
]
)
[docs]
def _example_HsSplitSelect():
return HsSplitSelect(HwIODataRdVld)
if __name__ == "__main__":
from hwt.synth import to_rtl_str
m = _example_HsSplitSelect()
print(to_rtl_str(m))