Source code for hwt.interfaces.agents.rdSynced

from collections import deque

from hwt.hdl.constants import NOP
from hwt.simulator.agentBase import SyncAgentBase
from hwtSimApi.hdlSimulator import HdlSimulator
from hwtSimApi.triggers import WaitCombRead, WaitWriteOnly


[docs]class RdSyncedAgent(SyncAgentBase): """ Simulation/verification agent for RdSynced interface """
[docs] def __init__(self, sim: HdlSimulator, intf, allowNoReset=True): super().__init__(sim, intf, allowNoReset=allowNoReset) self.actualData = NOP self.data = deque() self._rd = self.get_ready_signal(intf)
[docs] @classmethod def get_ready_signal(cls, intf): return intf.rd
[docs] def get_ready(self): return self._rd.read()
[docs] def set_ready(self, val): self._rd.write(val)
[docs] def setEnable_asMonitor(self, en): super(RdSyncedAgent, self).setEnable_asMonitor(en) if not en: self.set_ready(0)
[docs] def monitor(self): """Collect data from interface""" yield WaitCombRead() if self.notReset() and self._enabled: yield WaitWriteOnly() self.set_ready(1) yield WaitCombRead() d = self.get_data() self.data.append(d) else: yield WaitWriteOnly() self.set_ready(0)
[docs] def get_data(self): """extract data from interface""" return self.intf.data.read()
[docs] def set_data(self, data): """write data to interface""" self.intf.data.write(data)
[docs] def driver(self): """Push data to interface""" yield WaitWriteOnly() if self.actualData is NOP and self.data: self.actualData = self.data.popleft() do = self.actualData is not NOP if do: self.set_data(self.actualData) else: self.set_data(None) yield WaitCombRead() en = self.notReset() and self._enabled if not (en and do): return if en: rd = self.get_ready() try: rd = int(rd) except ValueError: raise AssertionError( ("%r: ready signal for interface %r is in invalid state," " this would cause desynchronization") % (self.sim.now, self.intf)) if rd: if self._debugOutput is not None: self._debugOutput.write("%s, wrote, %d: %r\n" % ( self.intf._getFullName(), self.sim.now, self.actualData)) if self.data: self.actualData = self.data.popleft() else: self.actualData = NOP