Source code for hwt.hdl.types.bits

from hwt.doc_markers import internal
from hwt.hdl.types.hdlType import HdlType
from hwt.serializer.generic.indent import getIndent
from pyMathBitPrecise.bits3t import Bits3t

BITS_DEFAUTL_SIGNED = None
BITS_DEFAUTL_FORCEVECTOR = False
BITS_DEFAUTL_NEGATED = False


[docs]class Bits(HdlType, Bits3t): """ Elemental HDL type representing bits (vector or single bit) """
[docs] def __init__(self, bit_length, signed=BITS_DEFAUTL_SIGNED, force_vector=BITS_DEFAUTL_FORCEVECTOR, negated=BITS_DEFAUTL_NEGATED, name=None, const=False, strict_sign=True, strict_width=True): """ :param negated: if true the value is in negated form """ self.negated = negated HdlType.__init__(self, const=const) bit_length = int(bit_length) assert bit_length > 0, bit_length Bits3t.__init__(self, bit_length, signed, name=name, force_vector=force_vector or signed is not None, strict_sign=strict_sign, strict_width=strict_width)
[docs] @internal def domain_size(self): """ :return: how many values can have specified type """ return int(2 ** self.bit_length())
[docs] @internal @classmethod def get_auto_cast_fn(cls): from hwt.hdl.types.bitsCast import convertBits return convertBits
[docs] @internal @classmethod def get_reinterpret_cast_fn(cls): from hwt.hdl.types.bitsCast import reinterpretBits return reinterpretBits
[docs] @internal @classmethod def getValueCls(cls): try: return cls._valCls except AttributeError: from hwt.hdl.types.bitsVal import BitsVal cls._valCls = BitsVal return cls._valCls
def __hash__(self): return hash((Bits3t.__hash__(self), self.const)) def __eq__(self, other): return Bits3t.__eq__(self, other) and self.const == other.const def __repr__(self, indent=0, withAddr=None, expandStructs=False): """ :param indent: number of indentation :param withAddr: if is not None is used as a additional information about on which address this type is stored (used only by HStruct) :param expandStructs: expand HStructTypes (used by HStruct and HArray) """ constr = [] if self.name is not None: constr.append('"%s"' % self.name) c = self.bit_length() if c == 1: constr.append("1bit") if self.force_vector: constr.append("force_vector") else: constr.append(f"{c:d}bits") if self.const: constr.append("const") if self.signed: constr.append("signed") elif self.signed is False: constr.append("unsigned") if not self.strict_sign: constr.append("strict_sign=False") if not self.strict_width: constr.append("strict_width=False") return "%s<%s, %s>" % (getIndent(indent), self.__class__.__name__, ", ".join(constr))