Source code for hwtLib.xilinx.ipif.endpoint

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

from hwt.code import If, FsmBuilder
from hwt.hdl.types.enum import HEnum
from hwt.math import inRange
from hwtLib.abstract.busEndpoint import BusEndpoint
from hwtLib.xilinx.ipif.intf import Ipif


[docs]class IpifEndpoint(BusEndpoint): """ Delegate request from bus to fields of structure :attention: interfaces are dynamically generated from names of fileds in structure template :attention: byte enable and register clock enable signals are ignored .. hwt-autodoc:: _example_IpifEndpoint """ _getWordAddrStep = Ipif._getWordAddrStep _getAddrStep = Ipif._getAddrStep
[docs] def __init__(self, structTemplate, intfCls=Ipif, shouldEnterFn=None): BusEndpoint.__init__(self, structTemplate, intfCls=intfCls, shouldEnterFn=shouldEnterFn)
def _impl(self): self._parseTemplate() # build read data output mux st_t = HEnum('st_t', ['idle', "writeAck", 'readDelay', 'rdData']) ipif = self.bus addr = ipif.bus2ip_addr ipif.ip2bus_error(0) addrVld = ipif.bus2ip_cs isInMyAddrSpace = self.isInMyAddrRange(addr) st = FsmBuilder(self, st_t)\ .Trans(st_t.idle, (addrVld & isInMyAddrSpace & ipif.bus2ip_rnw, st_t.rdData), (addrVld & isInMyAddrSpace & ~ipif.bus2ip_rnw, st_t.writeAck) ).Trans(st_t.writeAck, st_t.idle ).Trans(st_t.readDelay, st_t.rdData ).Trans(st_t.rdData, st_t.idle ).stateReg wAck = st._eq(st_t.writeAck) ipif.ip2bus_rdack(st._eq(st_t.rdData)) ipif.ip2bus_wrack(wAck) ADDR_STEP = self._getAddrStep() dataToBus = ipif.ip2bus_data(None) for (_, _), t in reversed(self._bramPortMapped): # map addr for bram ports _addr = t.bitAddr // ADDR_STEP _isMyAddr = inRange(addr, _addr, t.bitAddrEnd // ADDR_STEP) port = self.getPort(t) self.propagateAddr(addr, ADDR_STEP, port.addr, port.dout._dtype.bit_length(), t) port.en(_isMyAddr & ipif.bus2ip_cs) port.we(_isMyAddr & wAck) dataToBus = If(_isMyAddr, ipif.ip2bus_data(port.dout) ).Else( dataToBus ) port.din(ipif.bus2ip_data) self.connect_directly_mapped_write(ipif.bus2ip_addr, ipif.bus2ip_data, ~ipif.bus2ip_rnw & wAck) self.connect_directly_mapped_read(ipif.bus2ip_addr, ipif.ip2bus_data, dataToBus)
[docs]def _example_IpifEndpoint(): from hwt.hdl.types.struct import HStruct from hwtLib.types.ctypes import uint32_t u = IpifEndpoint( HStruct( (uint32_t, "field0"), (uint32_t, "field1"), (uint32_t[32], "bramMapped") )) return u
if __name__ == "__main__": from hwt.synthesizer.utils import to_rtl_str u = _example_IpifEndpoint() print(to_rtl_str(u))