Source code for hwtLib.xilinx.ipif.buff

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

from hwt.code import If
from hwt.hdl.constants import DIRECTION
from hwt.interfaces.utils import addClkRstn
from hwt.synthesizer.param import Param
from hwtLib.abstract.busBridge import BusBridge
from hwtLib.xilinx.ipif.intf import Ipif


[docs]class IpifBuff(BusBridge): """ Register or fifo for IPIF interface, used to break critical paths and buffer transactions .. hwt-autodoc:: """ def _config(self): Ipif._config(self) self.ADDR_BUFF_DEPTH = Param(1) self.DATA_BUFF_DEPTH = Param(1) def _declr(self): if self.ADDR_BUFF_DEPTH != 1 or self.DATA_BUFF_DEPTH != 1: raise NotImplementedError() with self._paramsShared(): addClkRstn(self) self.s = Ipif() self.m = Ipif()._m()
[docs] def connectRegistered(self, intfFrom, intfTo): r = self._reg(intfFrom._name + "_reg", intfFrom._dtype) intfFrom._reg = r r(intfFrom) intfTo(r)
def _impl(self): din = self.s dout = self.m for i in din._interfaces: # exclude bus2ip_cs because it needs special care if i is din.bus2ip_cs: continue if i._masterDir == DIRECTION.OUT: _din = i _dout = getattr(dout, i._name) else: _dout = i _din = getattr(dout, i._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.synthesizer.utils import to_rtl_str u = IpifBuff() print(to_rtl_str(u))