Source code for hwt.simulator.utils

from collections import deque
from inspect import isgenerator
import sys
from typing import Union

from hwt.doc_markers import internal
from hwt.hdl.types.arrayVal import HArrayVal
from hwt.hdl.value import HValue
from hwt.serializer.generic.indent import getIndent
from hwt.synthesizer.hObjList import HObjList
from hwt.synthesizer.interfaceLevel.mainBases import InterfaceBase
from hwt.synthesizer.unit import Unit
from pyMathBitPrecise.bits3t import Bits3val


[docs]def pprintInterface(intf: Union[Unit, InterfaceBase], indent:int=0, prefix:str="", file=sys.stdout): """ Pretty print interface """ try: s = intf._sig except AttributeError: s = None if s is None: s = "" else: s = " " + repr(s) file.write("".join([getIndent(indent), prefix, repr(intf._getFullName()), s])) file.write("\n") if isinstance(intf, HObjList): for i, p in enumerate(intf): # interfaces have already name of this array and index in it's name pprintInterface(p, indent=indent + 1, prefix=prefix, file=file) else: for i in intf._interfaces: pprintInterface(i, indent=indent + 1, file=file)
[docs]def pprintAgents(unitOrIntf: Union[Unit, InterfaceBase], indent:int=0, prefix:str="", file=sys.stdout): if isinstance(unitOrIntf, InterfaceBase): ag = unitOrIntf._ag elif isinstance(unitOrIntf, HObjList): for i, item in enumerate(unitOrIntf): item_prefix = f"{prefix}_{i:d}" pprintAgents(item, indent=indent + 1, prefix=item_prefix, file=file) return else: ag = None if ag is not None: indent_str = getIndent(indent) file.write(f"{indent_str:s}{prefix:s}{ag}\n") for i in unitOrIntf._interfaces: pprintAgents(i, indent + 1, file=file)
[docs]@internal def reconnectUnitSignalsToModel(synthesisedUnitOrIntf: Union[Unit, InterfaceBase], rtl_simulator): """ Reconnect model signals to unit to run simulation with simulation model but use original unit interfaces for communication :param synthesisedUnitOrIntf: interface where should be signals replaced from signals from modelCls :param rtl_simulator: RTL simulator form where signals for synthesisedUnitOrIntf should be taken """ obj = synthesisedUnitOrIntf for intf in obj._interfaces: if intf._interfaces: reconnectUnitSignalsToModel(intf, rtl_simulator) else: # reconnect signal from model name = intf._sigInside.name # update name and dtype s = getattr(rtl_simulator.io, name) if s._dtype is None: s._dtype = intf._dtype s._name = intf._name s.name = name intf.read = s.read intf.write = s.write intf.wait = s.wait intf._sigInside = s
[docs]def valuesToInts(values): """ Iterable of values to ints (nonvalid = None) """ return [valToInt(d) for d in values]
[docs]def valToInt(v): try: return int(v) except ValueError: return None
[docs]def allValuesToInts(sequenceOrVal): """ Convert HValue instances to int recursively (for sequences) """ if isinstance(sequenceOrVal, HArrayVal): sequenceOrVal = sequenceOrVal.val if isinstance(sequenceOrVal, (HValue, Bits3val)): return valToInt(sequenceOrVal) elif not sequenceOrVal: return sequenceOrVal elif (isinstance(sequenceOrVal, (list, tuple, deque)) or isgenerator(sequenceOrVal)): seq = [] for i in sequenceOrVal: seq.append(allValuesToInts(i)) if isinstance(sequenceOrVal, tuple): return tuple(seq) return seq else: return sequenceOrVal