class Register: """H-x800 register class.""" def __init__(self, data=0, name=None, width=16): if data < 0 or data > (2**width - 1): raise ValueError("Invalid value for %d-bit register!" % width) if name and name not in REGISTER_NAMES: raise ValueError("Invalid register name %s!" % name) if width != 16 and width != 24: raise ValueError("Invalid register width %d, must be 16 or 24!" % width) self._data = BitField(0, width=width, numbering=BitField.BIT_SCHEME_MSB_1, order=BitField.BIT_ORDER_MSB_LEFT) self._data[1:width] = data self._name = name self._width = width @property def value(self): return int(self._data) @value.setter def value(self, value): if value < 0 or value > (2**self._width - 1): raise ValueError("Invalid value for %d-bit register!" % self._width) self._data[1:self._width] = value @property def name(self): return self._name @property def width(self): return int(self._width) def __getitem__(self, key): if isinstance(key, slice): return self._data[key.start:key.stop] else: return self._data[key] def __setitem__(self, key, value): if isinstance(key, slice): self._data[key.start:key.stop] = value else: self._data[key] = value def __len__(self): return self.width def __repr__(self): return "0o%06o" % self.value def clear(self): self._data.clear()
def __init__(self, data=0, name=None, width=16): if data < 0 or data > (2**width - 1): raise ValueError("Invalid value for %d-bit register!" % width) if name and name not in REGISTER_NAMES: raise ValueError("Invalid register name %s!" % name) if width != 16 and width != 24: raise ValueError("Invalid register width %d, must be 16 or 24!" % width) self._data = BitField(0, width=width, numbering=BitField.BIT_SCHEME_MSB_1, order=BitField.BIT_ORDER_MSB_LEFT) self._data[1:width] = data self._name = name self._width = width
def __init__(self, data=0): if data < 0 or data > (2**48 - 1): raise ValueError("Invalid value for 48-bit word!") self.data = BitField(0, width=48, numbering=BitField.BIT_SCHEME_MSB_1, order=BitField.BIT_ORDER_MSB_LEFT) self.data[1:48] = data
def test_simple(): b = BitField() print("TEST: check initial value") my_assert(b.value, 0) print("TEST: check maxval") my_assert(b.maxval, 255) print("TEST: check width") my_assert(b.width, 8) print("TEST: check length") my_assert(len(b), 8)
def test_invalid_args(): gotexc = False try: print("TEST: test invalid width") b = BitField(256, width=65, order=BitField.BIT_ORDER_MSB_RIGHT) except ValueError: gotexc = True else: raise assert gotexc is True, "Invalid value should have thrown an exception!" gotexc = False try: print("TEST: test invalid initial value for width") b = BitField(256, width=8, order=BitField.BIT_ORDER_MSB_RIGHT) assert b is not None except ValueError: gotexc = True else: raise assert gotexc is True, "Invalid value should have thrown an exception!"
def test_misc_12bit(): b = BitField(0, width=12, numbering=BitField.BIT_SCHEME_MSB_1, order=BitField.BIT_ORDER_MSB_LEFT) print("TEST: check initial value") my_assert(b.value, 0) print("TEST: set bit 1") b[1] = 1 my_assert(b.value, 2**11) print("TEST: set bit 7") b[7] = 1 my_assert(b.value, 2**11 + 2**5) print("TEST: clear bits 1:6") b[1:6] = 0 my_assert(b.value, 2**5) print("TEST: set bits 8:12 to 00101") b[8:12] = 5 my_assert(b.value, 2**5 + 5)
def test_msb_left_15bit(): b = BitField(15, order=BitField.BIT_ORDER_MSB_LEFT) print("TEST: check initial value") my_assert(b.value, 15) print("TEST: check maxval") my_assert(b.maxval, 255) print("TEST: check width") my_assert(b.width, 8) print("TEST: check bit 7 clear") my_assert(b[7], 0) my_assert(b.isBitSet(7), False) my_assert(b.isBitClr(7), True) print("TEST: check bit 6 clear") my_assert(b[6], 0) my_assert(b.isBitSet(6), False) my_assert(b.isBitClr(6), True) print("TEST: check bit 5 clear") my_assert(b[5], 0) my_assert(b.isBitSet(5), False) my_assert(b.isBitClr(5), True) print("TEST: check bit 4 clear") my_assert(b[4], 0) my_assert(b.isBitSet(4), False) my_assert(b.isBitClr(4), True) print("TEST: check bit 3 set") my_assert(b[3], 1) my_assert(b.isBitSet(3), True) my_assert(b.isBitClr(3), False) print("TEST: check bit 2 set") my_assert(b[2], 1) my_assert(b.isBitSet(2), True) my_assert(b.isBitClr(2), False) print("TEST: check bit 1 set") my_assert(b[1], 1) my_assert(b.isBitSet(1), True) my_assert(b.isBitClr(1), False) print("TEST: check bit 0 set") my_assert(b[0], 1) my_assert(b.isBitSet(0), True) my_assert(b.isBitClr(0), False)
def test_msb_left_msb1_12bit(): b = BitField(0, width=12, numbering=BitField.BIT_SCHEME_MSB_1, order=BitField.BIT_ORDER_MSB_LEFT) print("TEST: check initial value") my_assert(b.value, 0) print("TEST: indices=", b.indices) print("TEST: check maxval") my_assert(b.maxval, 4095) print("TEST: check width") my_assert(b.width, 12) print("TEST: check length") my_assert(len(b), 12) print("TEST: set slice [9:12] = 15") b[9:12] = 0b1111 my_assert(b.value, 15) print("TEST: set value to zero") b[1:12] = 0 my_assert(b.value, 0) print("TEST: set value to all ones using slice") b[1:12] = b.maxval my_assert(b.value, 4095) print("TEST: set value to all zeros using slice") b[1:12] = 0 my_assert(b.value, 0) print("TEST: set value to all ones using set") b.set() my_assert(b.value, 4095) print("TEST: set value to all zeros using clear") b.clear() my_assert(b.value, 0) print("TEST: set high 6 bits to test-pattern") b[1:6] = 0b101010 my_assert(b.value, 2688) print("TEST: set value to all zeros using clear") b.clear() my_assert(b.value, 0) print("TEST: set low 6 bits to test-pattern") b[7:12] = 0b101010 my_assert(b.value, 42) print("TEST: set value to all zeros using clear") b.clear() my_assert(b.value, 0) print("TEST: ripple a one right") for i in range(12): b.set(i + 1) my_assert(b.value, 2**(12 - i - 1)) b.clear(i + 1) my_assert(b.value, 0) print("TEST: ripple a one left") for i in range(12): b.set(12 - i) my_assert(b.value, 2**i) b.clear(12 - i) my_assert(b.value, 0) print("TEST: shift a one right, filling") good = 0 for i in range(12): b.set(i + 1) good += 2**(12 - i - 1) my_assert(b.value, good) b.clear() my_assert(b.value, 0) print("TEST: shift a one left, filling") good = 0 for i in range(12): b.set(12 - i) good += 2**i my_assert(b.value, good) b.clear() my_assert(b.value, 0)
def test_msb_left_8bit(): b = BitField(8, order=BitField.BIT_ORDER_MSB_LEFT) print("TEST: indices=", b.indices) print("TEST: check initial value") my_assert(b.value, 8) print("TEST: check maxval") my_assert(b.maxval, 255) print("TEST: check width") my_assert(b.width, 8) print("TEST: check length") my_assert(len(b), 8) print("TEST: set slice [7:3] = 5") b[7:3] = 0b0101 my_assert(b.value, 40) my_assert(b[3], 1) my_assert(b.isBitSet(3), True) my_assert(b[5], 1) my_assert(b.isBitSet(5), True) print("TEST: set bit 7 = 1") b[7] = 1 my_assert(b[7], 1) my_assert(b.isBitSet(7), True) my_assert(b.value, 168) print("TEST: set slice [7:0] = 255") b[7:0] = 255 my_assert(b.value, 255) my_assert(b.isBitSet(7), True) my_assert(b.isBitClr(7), False) my_assert(b.isBitSet(6), True) my_assert(b.isBitClr(6), False) my_assert(b.isBitSet(5), True) my_assert(b.isBitClr(5), False) my_assert(b.isBitSet(4), True) my_assert(b.isBitClr(4), False) my_assert(b.isBitSet(3), True) my_assert(b.isBitClr(3), False) my_assert(b.isBitSet(2), True) my_assert(b.isBitClr(2), False) my_assert(b.isBitSet(1), True) my_assert(b.isBitClr(1), False) my_assert(b.isBitSet(0), True) my_assert(b.isBitClr(0), False) my_assert(b.value, 255) my_assert(b.isRange(7, 0, 1), True) my_assert(b.isRangeSet(7, 0), True) my_assert(b.isRangeClr(7, 0), False)
def test_msb_left_msb1_48bit(): b = BitField(0, width=48, numbering=BitField.BIT_SCHEME_MSB_1, order=BitField.BIT_ORDER_MSB_LEFT) print("TEST: check initial value") my_assert(b.value, 0) print("TEST: check maxval") my_assert(b.maxval, 2**48 - 1) print("TEST: check width") my_assert(b.width, 48) print("TEST: check length") my_assert(len(b), 48) print("TEST: set slice [33:48] = 65535") b[33:48] = 0b1111111111111111 my_assert(b.value, 65535) print("TEST: set value to zero") b[1:48] = 0 my_assert(b.value, 0) print("TEST: set value to all ones using slice") b[1:48] = b.maxval my_assert(b.value, 2**48 - 1) print("TEST: set value to all zeros using slice") b[1:48] = 0 my_assert(b.value, 0) print("TEST: set value to all ones using set") b.set() my_assert(b.value, 2**48 - 1) print("TEST: set value to all zeros using clear") b.clear() my_assert(b.value, 0) print("TEST: set high 12 bits to test-pattern") b[1:12] = 0b101010101010 my_assert(b.value, 187604171489280) print("TEST: set value to all zeros using clear") b.clear() my_assert(b.value, 0) print("TEST: set 2nd 12 bits to test-pattern") b[13:24] = 0b101010101010 my_assert(b.value, 45801799680) print("TEST: set value to all zeros using clear") b.clear() my_assert(b.value, 0) print("TEST: set 3rd 12 bits to test-pattern") b[25:36] = 0b101010101010 my_assert(b.value, 11182080) print("TEST: set value to all zeros using clear") b.clear() my_assert(b.value, 0) print("TEST: set low 12 bits to test-pattern") b[37:48] = 0b101010101010 my_assert(b.value, 2730) print("TEST: set value to all zeros using clear") b.clear() my_assert(b.value, 0)
def test_msb_right_8bit(): b = BitField(8, order=BitField.BIT_ORDER_MSB_RIGHT) print("TEST: check initial value") my_assert(b.value, 8) print("TEST: check maxval") my_assert(b.maxval, 255) print("TEST: check width") my_assert(b.width, 8) print("TEST: set slice [7:3] = 5") b[3:7] = 0b0101 my_assert(b.value, 40) my_assert(b[3], 1) my_assert(b.isBitSet(3), True) my_assert(b.isBitClr(3), False) my_assert(b[5], 1) my_assert(b.isBitSet(5), True) my_assert(b.isBitClr(5), False) print("TEST: set bit 7 = 1") b[7] = 1 my_assert(b[7], 1) my_assert(b.isBitSet(7), True) my_assert(b.isBitClr(7), False) my_assert(b.value, 168) print("TEST: set slice [0:7] = 255") b[0:7] = 255 my_assert(b.isBitSet(0), True) my_assert(b.isBitClr(0), False) my_assert(b.isBitSet(1), True) my_assert(b.isBitClr(1), False) my_assert(b.isBitSet(2), True) my_assert(b.isBitClr(2), False) my_assert(b.isBitSet(3), True) my_assert(b.isBitClr(3), False) my_assert(b.isBitSet(4), True) my_assert(b.isBitClr(4), False) my_assert(b.isBitSet(5), True) my_assert(b.isBitClr(5), False) my_assert(b.isBitSet(6), True) my_assert(b.isBitClr(6), False) my_assert(b.isBitSet(7), True) my_assert(b.isBitClr(7), False) my_assert(b.value, 255)