Source code for hwtLib.peripheral.usb.usb2.sie_interfaces

from hwt.hdl.types.bits import Bits
from hwt.interfaces.agents.vldSynced import VldSyncedAgent
from hwt.interfaces.std import VldSynced, Signal
from hwt.synthesizer.param import Param
from hwtLib.peripheral.usb.constants import usb_pid_t, usb_frame_number_t, \
    USB_PID
from hwtSimApi.hdlSimulator import HdlSimulator


[docs]class DataErrVldKeepLast(VldSynced): """ .. hwt-autodoc:: """ def _config(self): VldSynced._config(self) self.USE_KEEP: bool = Param(True) def _declr(self): VldSynced._declr(self) if self.USE_KEEP: self.keep = Signal(Bits(self.DATA_WIDTH // 8)) self.error = Signal() self.last = Signal()
[docs] def _initSimAgent(self, sim:HdlSimulator): self._ag = DataErrVldKeepLastAgent(sim, self)
[docs]class DataErrVldKeepLastAgent(VldSyncedAgent): """ A simulation agent for :class:`~.DataErrVldKeepLast` interface. """
[docs] def set_data(self, data): i = self.intf 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] def get_data(self): i = self.intf 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(VldSynced): """ :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:: """ def _config(self): pass def _declr(self): self.pid = Signal(usb_pid_t) self.endp = Signal(usb_pid_t) self.frame_number = Signal(usb_frame_number_t) self.error = Signal() # pid error or crc5 error or invalid address or missing/extra data self.vld = Signal()
[docs] def _initSimAgent(self, sim:HdlSimulator): self._ag = Usb2SieRxOutAgent(sim, self)
[docs]class Usb2SieRxOutAgent(VldSyncedAgent): """ A simulation agent for :class:`~.Usb2SieRxOut` interface. """
[docs] def set_data(self, data): if data is None: data = None, None, None, None pid, endp, frame_number, error = data i = self.intf 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] def get_data(self): i = self.intf return ( i.pid.read(), i.endp.read(), i.frame_number.read(), i.error.read(), )