Source code for hwtLib.cesnet.mi32.buff

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

from hwt.hdl.types.defs import BIT
from hwt.hdl.types.struct import HStruct
from hwt.hwIOs.std import HwIOVectSignal, HwIOSignal, HwIORdVldSync
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.cesnet.mi32.intf import Mi32
from hwtLib.handshaked.builder import HsBuilder


[docs] class Mi32AddrHs(HwIORdVldSync): """ Equivalent of Mi32 address/write data channel with HwIORdVldSync compatible signal names .. hwt-autodoc:: """ @override def hwConfig(self): Mi32.hwConfig(self) @override def hwDeclr(self): self.addr = HwIOVectSignal(self.ADDR_WIDTH) self.read = HwIOSignal() self.write = HwIOSignal() self.be = HwIOVectSignal(self.DATA_WIDTH // 8) self.dwr = HwIOVectSignal(self.DATA_WIDTH) super(Mi32AddrHs, self).hwDeclr()
[docs] class Mi32Buff(BusBridge): """ Buffer for Mi32 interface .. hwt-autodoc:: """ @override def hwConfig(self): Mi32.hwConfig(self) self.ADDR_BUFF_DEPTH = HwParam(1) self.DATA_BUFF_DEPTH = HwParam(1) @override def hwDeclr(self): addClkRstn(self) with self._hwParamsShared(): self.s = Mi32() self.m = Mi32()._m()
[docs] def _Mi32_addr_to_Mi32AddrHs(self, mi32: Mi32, tmp_name): tmp = Mi32AddrHs() tmp._updateHwParamsFrom(mi32) setattr(self, tmp_name, tmp) tmp(mi32, exclude={ tmp.vld, tmp.rd, tmp.read, tmp.write, mi32.ardy, mi32.rd, mi32.wr, mi32.drd, mi32.drdy}) tmp.read(mi32.rd) tmp.write(mi32.wr) tmp.vld(mi32.rd | mi32.wr) mi32.ardy(tmp.rd) return tmp
[docs] def _connect_Mi32AddrHs_to_Mi32(self, mi32ahs: Mi32AddrHs, mi32: Mi32): return [ mi32(mi32ahs, exclude={ mi32ahs.vld, mi32ahs.rd, mi32ahs.read, mi32ahs.write, mi32.ardy, mi32.rd, mi32.wr, mi32.drd, mi32.drdy}), mi32.rd(mi32ahs.vld & mi32ahs.read), mi32.wr(mi32ahs.vld & mi32ahs.write), mi32ahs.rd(mi32.ardy), ]
@override def hwImpl(self): m = self._Mi32_addr_to_Mi32AddrHs(self.s, "addr_tmp") m = HsBuilder(self, m).buff(items=self.ADDR_BUFF_DEPTH).end self._connect_Mi32AddrHs_to_Mi32(m, self.m) data_t = HStruct( (self.m.drd._dtype, "drd"), # read data (BIT, "drdy"), # read data valid ) m = (self.m.drd, self.m.drdy) for i in range(self.DATA_BUFF_DEPTH): reg = self._reg(f"read_data_reg{i:d}", data_t, def_val={"drdy": 0}) reg.drd(m[0]) reg.drdy(m[1]) m = (reg.drd, reg.drdy) self.s.drd(m[0]) self.s.drdy(m[1])
if __name__ == "__main__": from hwt.synth import to_rtl_str m = Mi32Buff() print(to_rtl_str(m))