|
|
|
@ -0,0 +1,37 @@ |
|
|
|
class nBit: |
|
|
|
def __init__(self, bitlength): |
|
|
|
self.bitlength = bitlength |
|
|
|
self.registers = {"a": 0} |
|
|
|
self.carry_status = 0 |
|
|
|
|
|
|
|
def create_register(self, name): |
|
|
|
self.registers[name] = 0 |
|
|
|
|
|
|
|
def set_register(self, name, v): |
|
|
|
self.check(v) |
|
|
|
self.registers[name] = v |
|
|
|
|
|
|
|
def get_register(self, name): |
|
|
|
return self.registers[name] |
|
|
|
|
|
|
|
def check(self, n): |
|
|
|
if n.bitlength > self.bitlength: |
|
|
|
raise OverflowError |
|
|
|
|
|
|
|
def maybe_carry(self): |
|
|
|
if self.registers["a"].bit_length() > self.bitlength: |
|
|
|
self.registers["a"] &= 1 << self.bitlength - 1 |
|
|
|
self.carry_status |
|
|
|
|
|
|
|
def add(self, v): |
|
|
|
self.registers["a"] += v |
|
|
|
self.maybe_carry() |
|
|
|
|
|
|
|
def shift_right(self): |
|
|
|
self.registers["a"] >>= 1 |
|
|
|
if self.carry_status == 1: |
|
|
|
self.registers["a"] &= 1 << self.carry_status |
|
|
|
|
|
|
|
def shift_left(self): |
|
|
|
self.registers["a"] <<= 1 |
|
|
|
self.maybe_carry() |