Source code for hwtLib.handshaked.splitPrioritized

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

from hwt.code import Or
from hwt.pyUtils.typingFuture import override
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 """ @override def hwDeclr(self): HsSplitCopy.hwDeclr(self) @override def hwImpl(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.hwIOs.std import HwIODataRdVld m = HsSplitPrioritized(HwIODataRdVld) m.OUTPUTS = 4 return m
if __name__ == "__main__": from hwt.synth import to_rtl_str m = _example_HsSplitPrioritized() print(to_rtl_str(m))