Source code for hwtLib.xilinx.ipif.buff

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

from hwt.code import If
from hwt.constants import DIRECTION
from hwt.hwIOs.utils import addClkRstn
from hwt.hwParam import HwParam
from hwt.pyUtils.typingFuture import override
from hwtLib.abstract.busBridge import BusBridge
from hwtLib.xilinx.ipif.hIOIpif import Ipif


[docs] class IpifBuff(BusBridge): """ Register or FIFO for IPIF interface, used to break critical paths and buffer transactions .. hwt-autodoc:: """ @override def hwConfig(self): Ipif.hwConfig(self) self.ADDR_BUFF_DEPTH = HwParam(1) self.DATA_BUFF_DEPTH = HwParam(1) @override def hwDeclr(self): if self.ADDR_BUFF_DEPTH != 1 or self.DATA_BUFF_DEPTH != 1: raise NotImplementedError() with self._hwParamsShared(): addClkRstn(self) self.s = Ipif() self.m = Ipif()._m()
[docs] def connectRegistered(self, hwIOFrom: Ipif, hwIOTo: Ipif): r = self._reg(hwIOFrom._name + "_reg", hwIOFrom._dtype) hwIOFrom._reg = r r(hwIOFrom) hwIOTo(r)
@override def hwImpl(self): din = self.s dout = self.m for hwIO in din._hwIOs: # exclude bus2ip_cs because it needs special care if hwIO is din.bus2ip_cs: continue if hwIO._masterDir == DIRECTION.OUT: _din = hwIO _dout = getattr(dout, hwIO._name) else: _dout = hwIO _din = getattr(dout, hwIO._name) self.connectRegistered(_din, _dout) cs = self._reg("bus2ip_cs_reg", def_val=0) # now bus2ip_cs has to be set after addr etc are valid # but we must not let start another transaction directly after one ended If(dout.ip2bus_rdack._reg | dout.ip2bus_wrack._reg, cs(0), dout.bus2ip_cs(0) ).Else( cs(din.bus2ip_cs), dout.bus2ip_cs(cs) )
if __name__ == "__main__": from hwt.synth import to_rtl_str m = IpifBuff() print(to_rtl_str(m))