Source code for hwtLib.common_nonstd_interfaces.index_key_hs

from typing import Union, Tuple

from hwt.interfaces.agents.handshaked import HandshakedAgent
from hwt.interfaces.std import Handshaked, HandshakeSync, VectSignal
from hwt.synthesizer.param import Param
from hwtLib.handshaked.intfBiDirectional import HandshakedBiDirectionalAgent
from ipCorePackager.constants import DIRECTION
from hwtSimApi.hdlSimulator import HdlSimulator


[docs]class IndexKeyHs(Handshaked): """ .. hwt-autodoc:: """ def _config(self): self.INDEX_WIDTH = Param(4) self.KEY_WIDTH = Param(4) def _declr(self): HandshakeSync._declr(self) if self.KEY_WIDTH: self.key = VectSignal(self.KEY_WIDTH) self.index = VectSignal(self.INDEX_WIDTH)
[docs] def _initSimAgent(self, sim: HdlSimulator): self._ag = IndexKeyHsAgent(sim, self)
[docs]class IndexKeyHsAgent(HandshakedAgent):
[docs] def get_data(self) -> Union[Tuple[int, int], int]: i = self.intf if i.KEY_WIDTH: return (i.key.read(), i.index.read()) else: return i.index.read()
[docs] def set_data(self, data: Union[Tuple[int, int], int]): intf = self.intf if intf.KEY_WIDTH: if data is None: k = None i = None else: k, i = data intf.key.write(k) else: i = data intf.index.write(i)
[docs]class IndexKeyInHs(Handshaked): """ .. hwt-autodoc:: """ def _config(self): self.INDEX_WIDTH = Param(4) self.KEY_WIDTH = Param(4) def _declr(self): HandshakeSync._declr(self) if self.KEY_WIDTH: self.key = VectSignal(self.KEY_WIDTH, masterDir=DIRECTION.IN) self.index = VectSignal(self.INDEX_WIDTH)
[docs] def _initSimAgent(self, sim: HdlSimulator): self._ag = IndexKeyInHsAgent(sim, self)
[docs]class IndexKeyInHsAgent(HandshakedBiDirectionalAgent):
[docs] def onMonitorReady(self): "write din" i = self.intf if i.KEY_WIDTH: d = self.dinData.popleft() i.key.write(d)
[docs] def onDriverWriteAck(self): "read din" i = self.intf if i.KEY_WIDTH: d = i.key.read() self.dinData.append(d)
[docs] def get_data(self) -> Union[Tuple[int, int], int]: return self.intf.index.read()
[docs] def set_data(self, data: Union[Tuple[int, int], int]): self.intf.index.write(data)