hwt/hdl/types/structUtils.py
def HStruct_unpack(structT, data, getDataFn=None, dataWidth=None):
    """
    opposite of packAxiSFrame
    """
    if getDataFn is None:
        assert dataWidth is not None

        def _getDataFn(x):
            return toHVal(x)._auto_cast(Bits(dataWidth))

        getDataFn = _getDataFn

    val = structT.fromPy(None)

    fData = iter(data)

    # actual is storage variable for items from frameData
    actualOffset = 0
    actual = None

    for v in walkFlattenFields(val, skipPadding=False):
        # walk flatten fields and take values from fData and parse them to
        # field
        required = v._dtype.bit_length()

        if actual is None:
            actualOffset = 0
            try:
                actual = getDataFn(next(fData))
            except StopIteration:
                raise Exception("Input data too short")

            if dataWidth is None:
                dataWidth = actual._dtype.bit_length()
            actuallyHave = dataWidth
        else:
            actuallyHave = actual._dtype.bit_length() - actualOffset

        while actuallyHave < required:
            # collect data for this field
            try:
                d = getDataFn(next(fData))
            except StopIteration:
                raise Exception("Input data too short")

            actual = d._concat(actual)
            actuallyHave += dataWidth

        if actuallyHave >= required:
            # parse value of actual to field
            # skip padding
            _v = actual[(required + actualOffset):actualOffset]
            _v = _v._auto_cast(v._dtype)
            v.val = _v.val
            v.vldMask = _v.vldMask
            v.updateTime = _v.updateTime

            # update slice out what was taken
            actuallyHave -= required
            actualOffset += required

        if actuallyHave == 0:
            actual = None

    if actual is not None:
        assert actual._dtype.bit_length(
        ) - actualOffset < dataWidth, "It should be just a padding at the end of frame"

    return val
def HStruct_unpack(structT, data, getDataFn=None, dataWidth=None):
    """
    opposite of packAxiSFrame
    """
    if getDataFn is None:
        assert dataWidth is not None

        def _getDataFn(x):
            return toHVal(x)._auto_cast(Bits(dataWidth))

        getDataFn = _getDataFn

    val = structT.fromPy(None)

    fData = iter(data)

    # actual is storage variable for items from frameData
    actualOffset = 0
    actual = None

    for v in walkFlattenFields(val, skipPadding=False):
        # walk flatten fields and take values from fData and parse them to
        # field
        required = v._dtype.bit_length()

        if actual is None:
            actualOffset = 0
            try:
                actual = getDataFn(next(fData))
            except StopIteration:
                raise Exception("Input data too short")

            if dataWidth is None:
                dataWidth = actual._dtype.bit_length()
            actuallyHave = dataWidth
        else:
            actuallyHave = actual._dtype.bit_length() - actualOffset

        while actuallyHave < required:
            # collect data for this field
            try:
                d = getDataFn(next(fData))
            except StopIteration:
                raise Exception("Input data too short")

            actual = d._concat(actual)
            actuallyHave += dataWidth

        if actuallyHave >= required:
            # parse value of actual to field
            # skip padding
            _v = actual[(required + actualOffset):actualOffset]
            _v = _v._auto_cast(v._dtype)
            v.val = _v.val
            v.vldMask = _v.vldMask
            v.updateTime = _v.updateTime

            # update slice out what was taken
            actuallyHave -= required
            actualOffset += required

        if actuallyHave == 0:
            actual = None

    if actual is not None:
        assert actual._dtype.bit_length(
        ) - actualOffset < dataWidth, "It should be just a padding at the end of frame"

    return val
def HStruct_unpack ( structT , data , getDataFn = None , dataWidth = None ) : if getDataFn is None : assert dataWidth is not None def _getDataFn ( x ) : return toHVal ( x ) . _auto_cast ( Bits ( dataWidth ) ) getDataFn = _getDataFn val = structT . fromPy ( None ) fData = iter ( data ) # actual is storage variable for items from frameData actualOffset = 0 actual = None for v in walkFlattenFields ( val , skipPadding = False ) : # walk flatten fields and take values from fData and parse them to # field required = v . _dtype . bit_length ( ) if actual is None : actualOffset = 0 try : actual = getDataFn ( next ( fData ) ) except StopIteration : raise Exception ( "Input data too short" ) if dataWidth is None : dataWidth = actual . _dtype . bit_length ( ) actuallyHave = dataWidth else : actuallyHave = actual . _dtype . bit_length ( ) - actualOffset while actuallyHave < required : # collect data for this field try : d = getDataFn ( next ( fData ) ) except StopIteration : raise Exception ( "Input data too short" ) actual = d . _concat ( actual ) actuallyHave += dataWidth if actuallyHave >= required : # parse value of actual to field # skip padding _v = actual [ ( required + actualOffset ) : actualOffset ] _v = _v . _auto_cast ( v . _dtype ) v . val = _v . val v . vldMask = _v . vldMask v . updateTime = _v . updateTime # update slice out what was taken actuallyHave -= required actualOffset += required if actuallyHave == 0 : actual = None if actual is not None : assert actual . _dtype . bit_length ( ) - actualOffset < dataWidth , "It should be just a padding at the end of frame" return val
opposite of packAxiSFrame
opposite of packAxiSFrame