Source code for hwtLib.xilinx.ipif.interconnectMatrix

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

from hwt.code import SwitchLogic
from hwt.interfaces.utils import addClkRstn
from hwt.math import log2ceil
from hwt.synthesizer.hObjList import HObjList
from hwtLib.abstract.busInterconnect import BusInterconnect, AUTO_ADDR
from hwtLib.xilinx.ipif.intf import Ipif
from pyMathBitPrecise.bit_utils import get_bit_range
from hwt.hdl.types.defs import BIT


[docs]class IpifInterconnectMatrix(BusInterconnect): """ Simple matrix interconnect for IPIF interface .. hwt-autodoc:: _example_IpifInterconnectMatrix """ def _config(self) -> None: super(IpifInterconnectMatrix, self)._config() Ipif._config(self) def _declr(self) -> None: self._normalize_config() addClkRstn(self) slavePorts = HObjList() for _ in self.MASTERS: s = Ipif() s._updateParamsFrom(self) slavePorts.append(s) self.s = slavePorts masterPorts = HObjList() for _, size in self.SLAVES: m = Ipif()._m() m.ADDR_WIDTH = log2ceil(size - 1) m.DATA_WIDTH = self.DATA_WIDTH masterPorts.append(m) self.m = masterPorts def _impl(self) -> None: if len(self.MASTERS) > 1: raise NotImplementedError() m = self.s[0] wrack = rdack = err = BIT.from_py(0) AW = int(self.ADDR_WIDTH) rdata = [] for i, (s, (s_offset, s_size)) in\ enumerate(zip(self.m, self.SLAVES)): s.bus2ip_addr(m.bus2ip_addr, fit=True) s.bus2ip_be(m.bus2ip_be) s.bus2ip_rnw(m.bus2ip_rnw) s.bus2ip_data(m.bus2ip_data) bitsOfSubAddr = log2ceil(s_size - 1) prefix = get_bit_range( s_offset, bitsOfSubAddr, AW - bitsOfSubAddr) cs = self._sig(f"m_cs_{i:d}") cs(m.bus2ip_addr[AW:bitsOfSubAddr]._eq(prefix)) s.bus2ip_cs(m.bus2ip_cs & cs) err = err | (cs & s.ip2bus_error) rdack = rdack | (cs & s.ip2bus_rdack) wrack = wrack | (cs & s.ip2bus_wrack) rdata.append((cs, s.ip2bus_data)) m.ip2bus_error(err) m.ip2bus_rdack(rdack) m.ip2bus_wrack(wrack) SwitchLogic( [(sel, m.ip2bus_data(data)) for sel, data in rdata], default=m.ip2bus_data(None) )
[docs]def _example_IpifInterconnectMatrix(): AUTO = AUTO_ADDR u = IpifInterconnectMatrix() u.MASTERS = (({0, 1, 2, 3}),) u.SLAVES = ( (0x0000, 0x100), (0x0100, 0x100), (AUTO, 0x100), (0x1000, 0x1000), ) return u
if __name__ == "__main__": from hwt.synthesizer.utils import to_rtl_str u = _example_IpifInterconnectMatrix() print(to_rtl_str(u))