Source code for hwtLib.commonHwIO.index_key_hs
from typing import Union, Tuple
from hwt.hwIOs.agents.rdVldSync import HwIODataRdVldAgent
from hwt.hwIOs.std import HwIODataRdVld, HwIORdVldSync, HwIOVectSignal
from hwt.hwParam import HwParam
from hwt.pyUtils.typingFuture import override
from hwtLib.handshaked.hwIOBiDirectional import HwIORdVldSyncBiDirectionalDataAgent
from hwtSimApi.hdlSimulator import HdlSimulator
from ipCorePackager.constants import DIRECTION
[docs]
class HwIOIndexKeyRdVld(HwIODataRdVld):
"""
.. hwt-autodoc::
"""
@override
def hwConfig(self):
self.INDEX_WIDTH = HwParam(4)
self.KEY_WIDTH = HwParam(4)
@override
def hwDeclr(self):
HwIORdVldSync.hwDeclr(self)
if self.KEY_WIDTH:
self.key = HwIOVectSignal(self.KEY_WIDTH)
self.index = HwIOVectSignal(self.INDEX_WIDTH)
[docs]
@override
def _initSimAgent(self, sim: HdlSimulator):
self._ag = HwIOIndexKeyRdVldAgent(sim, self)
[docs]
class HwIOIndexKeyRdVldAgent(HwIODataRdVldAgent):
[docs]
@override
def get_data(self) -> Union[Tuple[int, int], int]:
i = self.hwIO
if i.KEY_WIDTH:
return (i.key.read(), i.index.read())
else:
return i.index.read()
[docs]
@override
def set_data(self, data: Union[Tuple[int, int], int]):
hwIO = self.hwIO
if hwIO.KEY_WIDTH:
if data is None:
k = None
i = None
else:
k, i = data
hwIO.key.write(k)
else:
i = data
hwIO.index.write(i)
[docs]
class HwIOIndexKeyInRdVld(HwIODataRdVld):
"""
.. hwt-autodoc::
"""
@override
def hwConfig(self):
self.INDEX_WIDTH = HwParam(4)
self.KEY_WIDTH = HwParam(4)
@override
def hwDeclr(self):
HwIORdVldSync.hwDeclr(self)
if self.KEY_WIDTH:
self.key = HwIOVectSignal(self.KEY_WIDTH, masterDir=DIRECTION.IN)
self.index = HwIOVectSignal(self.INDEX_WIDTH)
[docs]
@override
def _initSimAgent(self, sim: HdlSimulator):
self._ag = HwIOIndexKeyInRdVldAgent(sim, self)
[docs]
class HwIOIndexKeyInRdVldAgent(HwIORdVldSyncBiDirectionalDataAgent):
[docs]
@override
def onMonitorReady(self):
"write din"
i = self.hwIO
if i.KEY_WIDTH:
d = self.dinData.popleft()
i.key.write(d)
[docs]
@override
def onDriverWriteAck(self):
"read din"
i = self.hwIO
if i.KEY_WIDTH:
d = i.key.read()
self.dinData.append(d)
[docs]
@override
def get_data(self) -> Union[Tuple[int, int], int]:
return self.hwIO.index.read()
[docs]
@override
def set_data(self, data: Union[Tuple[int, int], int]):
self.hwIO.index.write(data)