Source code for hwtLib.amba.axis_comp.frame_deparser.utils

from hwt.hdl.types.hdlType import HdlType
from hwt.hdl.types.stream import HStream
from hwt.hdl.types.struct import HStruct
from hwtLib.amba.axis import AxiStream, axis_mask_propagate_best_effort
from hwt.code_utils import connect_optional
from hwt.synthesizer.interface import Interface


[docs]def _get_only_stream(t: HdlType): """ Return HStream if base datatype is HStream. (HStream field may be nested in HStruct) """ if isinstance(t, HStream): return t elif isinstance(t, HStruct) and len(t.fields) == 1: return _get_only_stream(t.fields[0].dtype) return None
[docs]def connect_optional_with_best_effort_axis_mask_propagation(src, dst): def check_fn(a, b): if a._name in ("strb", "keep") and isinstance(a._parent, AxiStream): # if is srtb/keep we already connected it by # axis_mask_propagate_best_effort return False, [] if isinstance(a, AxiStream): res = axis_mask_propagate_best_effort(a, b) else: res = [] return True, res return connect_optional(src, dst, check_fn)
[docs]def drill_down_in_HStruct_fields(t: HdlType, intf: Interface): """ Find a base type and corresponding interface for nested HStruct with a single field. """ while isinstance(t, HStruct): assert len(t.fields) == 1, t f = t.fields[0] if f.name is None: intf = None elif intf is not None: intf = getattr(intf, f.name) t = f.dtype return t, intf