Source code for hwtLib.common_nonstd_interfaces.addr_data_hs
from hwt.interfaces.agents.handshaked import HandshakedAgent
from hwt.interfaces.std import VectSignal, HandshakeSync, Signal
from hwt.synthesizer.param import Param
from hwtSimApi.hdlSimulator import HdlSimulator
[docs]class AddrDataHs(HandshakeSync):
"""
Simple handshaked interface with address and data signal
.. hwt-autodoc::
"""
def _config(self):
self.ADDR_WIDTH = Param(8)
self.DATA_WIDTH = Param(8)
self.HAS_MASK = Param(False)
def _declr(self):
super(AddrDataHs, self)._declr()
self.addr = VectSignal(self.ADDR_WIDTH)
self.data = VectSignal(self.DATA_WIDTH)
if self.HAS_MASK:
assert self.DATA_WIDTH % 8 == 0, self.DATA_WIDTH
self.mask = VectSignal(self.DATA_WIDTH // 8)
[docs] def _initSimAgent(self, sim: HdlSimulator):
if self.HAS_MASK:
self._ag = AddrDataMaskHsAgent(sim, self)
else:
self._ag = AddrDataHsAgent(sim, self)
[docs]class AddrDataVldHs(AddrDataHs):
"""
:see: :class:`.AddrDataHs` with a vld_flag signal
.. hwt-autodoc::
"""
def _declr(self):
super(AddrDataVldHs, self)._declr()
self.vld_flag = Signal()
[docs] def _initSimAgent(self, sim: HdlSimulator):
self._ag = AddrDataVldAgent(sim, self)
[docs]class AddrDataBitMaskHs(AddrDataHs):
"""
:see: :class:`.AddrDataHs` with a mask signal
:note: mask has 1b granularity
.. hwt-autodoc::
"""
def _declr(self):
super(AddrDataBitMaskHs, self)._declr()
self.mask = VectSignal(self.DATA_WIDTH)
[docs] def _initSimAgent(self, sim: HdlSimulator):
self._ag = AddrDataMaskHsAgent(sim, self)
[docs]class AddrDataHsAgent(HandshakedAgent):
[docs] def set_data(self, data):
i = self.intf
if data is None:
addr, d = None, None
else:
addr, d = data
i.addr.write(addr)
i.data.write(d)
[docs] def get_data(self):
i = self.intf
return i.addr.read(), i.data.read()
[docs]class AddrDataMaskHsAgent(HandshakedAgent):
[docs] def set_data(self, data):
i = self.intf
if data is None:
addr, d, mask = None, None, None
else:
addr, d, mask = data
i.addr.write(addr)
i.data.write(d)
i.mask.write(mask)
[docs] def get_data(self):
i = self.intf
return i.addr.read(), i.data.read(), i.mask.read()
[docs]class AddrDataVldAgent(HandshakedAgent):
[docs] def set_data(self, data):
i = self.intf
if data is None:
addr, d, vld = None, None, None
else:
addr, d, vld = data
i.addr.write(addr)
i.data.write(d)
i.vld_flag.write(vld)
[docs] def get_data(self):
i = self.intf
return i.addr.read(), i.data.read(), i.vld_flag.read()