Source code for hwtLib.handshaked.splitPrioritized
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import Or
from hwtLib.handshaked.splitCopy import HsSplitCopy
[docs]class HsSplitPrioritized(HsSplitCopy):
"""
Split input stream to N output streams.
Data is send to output interface which is ready and has lowest index.
:note: combinational
.. figure:: ./_static/HsSplitPrioritized.png
.. hwt-autodoc:: _example_HsSplitPrioritized
"""
def _declr(self):
HsSplitCopy._declr(self)
def _impl(self):
dataOut = list(reversed(self.dataOut))
self.get_ready_signal(self.dataIn)(Or(*map(lambda x: self.get_ready_signal(x), dataOut)))
for i, out in enumerate(dataOut):
allWitLowerPriority = dataOut[i+1:]
vld = self.get_valid_signal(self.dataIn)
for _vld in map(lambda x: ~self.get_ready_signal(x), allWitLowerPriority):
vld = vld & _vld
out(self.dataIn,
exclude={self.get_ready_signal(out), self.get_valid_signal(out)})
self.get_valid_signal(out)(vld)
[docs]def _example_HsSplitPrioritized():
from hwt.interfaces.std import Handshaked
u = HsSplitPrioritized(Handshaked)
u.OUTPUTS = 4
return u
if __name__ == "__main__":
from hwt.synthesizer.utils import to_rtl_str
u = _example_HsSplitPrioritized()
print(to_rtl_str(u))