Source code for hwtLib.handshaked.hwIOBiDirectional
from collections import deque
from hwt.constants import DIRECTION
from hwt.hwIOs.agents.rdVldSync import HwIODataRdVldAgent
from hwt.hwIOs.std import HwIODataRdVld, HwIOVectSignal, HwIOSignal
from hwtSimApi.hdlSimulator import HdlSimulator
from hwt.pyUtils.typingFuture import override
[docs]
class HwIORdVldSyncBiDirectionalData(HwIODataRdVld):
"""
:class:`hwt.hwIOs.std.HwIODataRdVld` interface with data
channels in bout direction
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
self.din = HwIOVectSignal(self.DATA_WIDTH, masterDir=DIRECTION.IN)
self.dout = HwIOVectSignal(self.DATA_WIDTH)
self.vld = HwIOSignal()
self.rd = HwIOSignal(masterDir=DIRECTION.IN)
[docs]
@override
def _initSimAgent(self, sim: HdlSimulator):
self._ag = HwIORdVldSyncBiDirectionalDataAgent(sim, self)
[docs]
class HwIORdVldSyncBiDirectionalDataAgent(HwIODataRdVldAgent):
"""
Simulation agent for :class:`.HwIORdVldSyncBiDirectionalData` interface
:attention: for monitor number of items in dinData
has to match with number of received items
"""
[docs]
def __init__(self, sim, hwIO):
HwIODataRdVldAgent.__init__(self, sim, hwIO)
self.dinData = deque()
self._isMonitor = False
[docs]
@override
def getMonitors(self):
self._isMonitor = True
return HwIODataRdVldAgent.getMonitors(self)
[docs]
@override
def notReset(self):
nr = HwIODataRdVldAgent.notReset(self)
if self._isMonitor:
return nr and self.dinData
else:
return nr
[docs]
@override
def onMonitorReady(self):
"write din"
d = self.dinData.popleft()
self.hwIO.din.write(d)
[docs]
@override
def onDriverWriteAck(self):
"read din"
d = self.hwIO.din.read()
self.dinData.append(d)
[docs]
@override
def get_data(self):
"""extract data from interface"""
return self.hwIO.dout.read()
[docs]
@override
def set_data(self, data):
"""write data to interface"""
self.hwIO.dout.write(data)