Source code for hwtLib.peripheral.usb.usb2.sie_interfaces
from hwt.hdl.types.bits import HBits
from hwt.hwIOs.agents.vldSync import HwIODataVldAgent
from hwt.hwIOs.std import HwIODataVld, HwIOSignal
from hwt.hwParam import HwParam
from hwt.pyUtils.typingFuture import override
from hwtLib.peripheral.usb.constants import usb_pid_t, usb_frame_number_t, \
USB_PID
from hwtSimApi.hdlSimulator import HdlSimulator
[docs]
class DataErrVldKeepLast(HwIODataVld):
"""
.. hwt-autodoc::
"""
@override
def hwConfig(self):
HwIODataVld.hwConfig(self)
self.USE_KEEP: bool = HwParam(True)
@override
def hwDeclr(self):
HwIODataVld.hwDeclr(self)
if self.USE_KEEP:
self.keep = HwIOSignal(HBits(self.DATA_WIDTH // 8))
self.error = HwIOSignal()
self.last = HwIOSignal()
[docs]
@override
def _initSimAgent(self, sim:HdlSimulator):
self._ag = DataErrVldKeepLastAgent(sim, self)
[docs]
class DataErrVldKeepLastAgent(HwIODataVldAgent):
"""
A simulation agent for :class:`~.DataErrVldKeepLast` interface.
"""
[docs]
@override
def set_data(self, data):
i = self.hwIO
if i.USE_KEEP:
if data is None:
data = None, None, None, None
data, keep, error, last = data
i.keep.write(keep)
else:
if data is None:
data = None, None, None
data, error, last = data
i.data.write(data)
i.error.write(error)
i.last.write(last)
[docs]
@override
def get_data(self):
i = self.hwIO
if i.USE_KEEP:
return (
i.data.read(),
i.keep.read(),
i.error.read(),
i.last.read(),
)
else:
return (
i.data.read(),
i.error.read(),
i.last.read(),
)
[docs]
class Usb2SieRxOut(HwIODataVld):
"""
:note: address in not important because it is checked with current_usb_addr
it is only important if this is the address of this device
:attention: validity of the endp/frame_number depens on pid value
.. hwt-autodoc::
"""
@override
def hwConfig(self):
pass
@override
def hwDeclr(self):
self.pid = HwIOSignal(usb_pid_t)
self.endp = HwIOSignal(usb_pid_t)
self.frame_number = HwIOSignal(usb_frame_number_t)
self.error = HwIOSignal() # pid error or crc5 error or invalid address or missing/extra data
self.vld = HwIOSignal()
[docs]
@override
def _initSimAgent(self, sim:HdlSimulator):
self._ag = Usb2SieRxOutAgent(sim, self)
[docs]
class Usb2SieRxOutAgent(HwIODataVldAgent):
"""
A simulation agent for :class:`~.Usb2SieRxOut` interface.
"""
[docs]
@override
def set_data(self, data):
if data is None:
data = None, None, None, None
pid, endp, frame_number, error = data
i = self.hwIO
i.pid.write(pid)
i.endp.write(endp)
i.frame_number.write(frame_number if pid == USB_PID.TOKEN_SOF else None)
i.error.write(error)
[docs]
@override
def get_data(self):
i = self.hwIO
return (
i.pid.read(),
i.endp.read(),
i.frame_number.read(),
i.error.read(),
)