Source code for hwtLib.amba.axi_comp.buff
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from typing import Optional
from hwt.hwIOs.utils import addClkRstn
from hwt.hwParam import HwParam
from hwt.pyUtils.typingFuture import override
from hwt.serializer.mode import serializeParamsUniq
from hwtLib.abstract.busBridge import BusBridge
from hwtLib.amba.axis_comp.builder import Axi4SBuilder
[docs]
@serializeParamsUniq
class AxiBuff(BusBridge):
"""
Transaction buffer for AXI3/4/Lite and others
.. hwt-autodoc:: _example_AxiBuff
"""
[docs]
def __init__(self, hwIOCls, hdlName:Optional[str]=None):
self.hwIOCls = hwIOCls
super(AxiBuff, self).__init__(hdlName=hdlName)
@override
def hwConfig(self):
self.HWIO_CLS = HwParam(self.hwIOCls)
self.hwIOCls.hwConfig(self)
self.ADDR_BUFF_DEPTH = HwParam(4)
self.DATA_BUFF_DEPTH = HwParam(4)
@override
def hwDeclr(self):
addClkRstn(self)
with self._hwParamsShared():
self.s = self.hwIOCls()
with self._hwParamsShared():
self.m = self.hwIOCls()._m()
assert self.ADDR_BUFF_DEPTH > 0 or self.DATA_BUFF_DEPTH > 0, (
"This buffer is completely disabled,"
" it should not be instantiated at all",
self.ADDR_BUFF_DEPTH, self.DATA_BUFF_DEPTH)
@override
def hwImpl(self):
ADDR_DEPTH = self.ADDR_BUFF_DEPTH
DATA_DEPTH = self.DATA_BUFF_DEPTH
for name, m, s, depth in [("ar", self.s.ar, self.m.ar, ADDR_DEPTH),
("aw", self.s.aw, self.m.aw, ADDR_DEPTH),
("w", self.s.w, self.m.w, DATA_DEPTH)]:
i = Axi4SBuilder(self, m, name).buff(
items=depth
).end
s(i)
for name, m, s, depth in [("r", self.m.r, self.s.r, DATA_DEPTH),
("b", self.m.b, self.s.b, ADDR_DEPTH)]:
i = Axi4SBuilder(self, m, name).buff(
items=depth,
).end
s(i)
[docs]
def _example_AxiBuff():
from hwtLib.amba.axi4 import Axi4
m = AxiBuff(Axi4)
return m
if __name__ == "__main__":
from hwt.synth import to_rtl_str
m = _example_AxiBuff()
print(to_rtl_str(m))