Source code for hwt.hdl.types.structCast
from hwt.code import Concat
from hwt.doc_markers import internal
from hwt.hdl.types.array import HArray
from hwt.hdl.types.bits import Bits
from hwt.hdl.types.hdlType import default_reinterpret_cast_fn, HdlType
from hwt.hdl.types.struct import HStruct
from hwt.hdl.value import HValue
from hwt.interfaces.std import Signal
from hwt.synthesizer.interfaceLevel.mainBases import InterfaceBase
from hwt.synthesizer.rtlLevel.mainBases import RtlSignalBase
[docs]@internal
def hstruct_reinterpret_to_bits(self, sigOrVal, toType: HdlType):
assert toType.bit_length() == self.bit_length()
parts = []
for f in self.fields:
if f.name is None:
width = f.dtype.bit_length()
part = Bits(width).from_py(None)
else:
part = getattr(sigOrVal, f.name)
if isinstance(part, Signal):
part = part._sig
if not isinstance(part, (HValue, RtlSignalBase, InterfaceBase)):
part = f.dtype.from_py(part)
elif not isinstance(part._dtype, toType.__class__):
part = part._reinterpret_cast(toType.__class__(part._dtype.bit_length()))
parts.append(part)
return Concat(*reversed(parts))
[docs]@internal
def hstruct_reinterpret_using_bits(self, sigOrVal, toType: HdlType):
as_bits = sigOrVal._reinterpret_cast(Bits(self.bit_length()))
return as_bits._reinterpret_cast(toType)
[docs]@internal
def hstruct_reinterpret(self, sigOrVal, toType: HdlType):
if isinstance(toType, Bits):
return hstruct_reinterpret_to_bits(self, sigOrVal, toType)
elif isinstance(toType, (HStruct, HArray)):
return hstruct_reinterpret_using_bits(self, sigOrVal, toType)
else:
return default_reinterpret_cast_fn(self, sigOrVal, toType)