Source code for hwtLib.examples.builders.hsBuilderSplit
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.interfaces.std import Handshaked
from hwt.interfaces.utils import addClkRstn
from hwt.synthesizer.unit import Unit
from hwtLib.handshaked.builder import HsBuilder
[docs]class HsBuilderSplit(Unit):
"""
Example of HsBuilder.split_* functions
.. hwt-autodoc::
"""
def _declr(self):
addClkRstn(self)
self.a = Handshaked()
self.a_0 = Handshaked()._m()
self.a_1 = Handshaked()._m()
self.a_2 = Handshaked()._m()
self.b = Handshaked()
self.b_0 = Handshaked()._m()
self.b_1 = Handshaked()._m()
self.b_2 = Handshaked()._m()
self.b_selected = Handshaked()._m()
self.b_selected.DATA_WIDTH = 3
self.c = Handshaked()
self.c_0 = Handshaked()._m()
self.c_1 = Handshaked()._m()
self.d = Handshaked()
self.d_0 = Handshaked()._m()
self.d_1 = Handshaked()._m()
self.d_2 = Handshaked()._m()
self.e = Handshaked()
self.e_0 = Handshaked()._m()
self.e_1 = Handshaked()._m()
self.e_2 = Handshaked()._m()
self.e_select = Handshaked()
self.e_select.DATA_WIDTH = 3
def _impl(self):
# Builder is class which simplifies building of datapaths
# and keeps components which are used which this interface together
a = HsBuilder(self, self.a, name="builderFromA")
# .end = last interface in datapath
# .lastComp = last component in datapath
# ... take a look at AbstractStreamBuilder
# register
a.buff(items=1, latency=1, delay=0)
# fifo
a.buff(items=4, latency=1, delay=0)
# reg + fifo
a.buff(items=5, latency=2, delay=0)
# reg wit delay (breaks combinational loop of ready signal)
a.buff(items=1, latency=2, delay=1)
# create 3 identhical streams and connect them to a_0-3
# there is also only split_copy which only create split component
# but left output unconnected
a.split_copy_to(self.a_0, self.a_1, self.a_2)
# round robin like split, data is send only to one of output ports
# and there is cycling flag which selects priority for each output
# to assert uniform load
b = HsBuilder(self, self.b)\
.split_fair_to(self.b_0, self.b_1, self.b_2,
exportSelected=True)
self.b_selected(b.lastComp.selectedOneHot)
# send data output interface which is ready and has higher priority
# (=lowest index)
HsBuilder(self, self.c).split_prioritized_to(self.c_0, self.c_1)
# explicitly select output
HsBuilder(self, self.d)\
.split_select_to([1, 2, 1, 0],
self.d_0, self.d_1, self.d_2)
# explicitly select output
HsBuilder(self, self.e)\
.split_select_to(self.e_select,
self.e_0, self.e_1, self.e_2)
if __name__ == "__main__":
from hwt.synthesizer.utils import to_rtl_str
u = HsBuilderSplit()
print(to_rtl_str(u))