Source code for hwt.hdl.transPart
from typing import Tuple, Optional
from hwt.hdl.transTmpl import TransTmpl
[docs]class TransPart(object):
"""
Container for informations about parts of TransTmpl split on databus words
:ivar ~.parent: instance of FrameTmpl
:ivar ~.tmpl: origin template which is this representation of
(StructField/HdlType instance)
:ivar ~.canBeRemoved: True if it is padding to assert data alignment and is not
actually part of data and can be removed
:ivar ~.isPadding: True if this TransaPart is just a padding
and contains non valid data
:ivar ~.startOfPart: bit addr of start of this part
:ivar ~.endOfPart: bit addr of end of this part
:ivar ~.inFieldOffset: bit offset of this part in parent field
"""
[docs] def __init__(self, parent: 'FrameTmpl',
tmpl: Optional[TransTmpl],
canBeRemoved: bool,
startOfPart: int,
endOfPart: int,
inFieldOffset: int):
self.parent = parent
self.tmpl = tmpl
# assert tmpl is None or isinstance(tmpl, TransTmpl), tmpl
self.isPadding = tmpl is None
self.canBeRemoved = canBeRemoved
self.startOfPart = startOfPart
self.endOfPart = endOfPart
self.inFieldOffset = inFieldOffset
[docs] def bit_length(self) -> int:
"""
:return: bit length of this part
"""
return self.endOfPart - self.startOfPart
[docs] def getBusWordBitRange(self) -> Tuple[int, int]:
"""
:return: bit range which contains data of this part on bus data signal
"""
offset = self.startOfPart % self.parent.wordWidth
return (offset + self.bit_length(), offset)
[docs] def getFieldBitRange(self) -> Tuple[int, int]:
"""
:return: bit range which contains data of this part on interface
of field
"""
offset = self.inFieldOffset
return (self.bit_length() + offset, offset)
[docs] def isLastPart(self) -> bool:
"""
:return: True if this part is last in parts derived from original field
else False
"""
return self.tmpl.bitAddrEnd == self.endOfPart
def __repr__(self):
return f"<{self.__class__.__name__:s} {self.tmpl}, startOfPart:{self.startOfPart:d}, endOfPart:{self.endOfPart:d}>"