You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.3 KiB

6 years ago
6 years ago
  1. class Register:
  2. registers = []
  3. def __init__(self, n_bits, name=None):
  4. self.n_bits = n_bits
  5. if name is None:
  6. self.name = "r{}".format(len(Register.registers))
  7. else:
  8. self.name = name
  9. self.value = 0
  10. Register.registers.append(self)
  11. def truncate_val(self, value, bits=None):
  12. if bits is None:
  13. bits = self.n_bits
  14. return value & ((1 << bits) - 1)
  15. def trucate(self):
  16. self.value = self.truncate_val(self.value)
  17. def set(self, value):
  18. if value < 0:
  19. self.value = self.truncate_val(abs(value), self.n_bits - 1)
  20. self.negate()
  21. self.trucate()
  22. def get(self):
  23. return self.value
  24. def get_signed(self):
  25. if self.value & (1 << (self.n_bits - 1)) == 0:
  26. return self.value
  27. else:
  28. return self.value - (1 << self.n_bits)
  29. def complement(self):
  30. self.value = self.value ^ ((1 << self.n_bits) - 1)
  31. def negate(self):
  32. self.complement()
  33. self.value += 1
  34. def __str__(self):
  35. return "{:08b}".format(self.value)
  36. def __repr__(self):
  37. return "{} ({})".format(self, self.n_bits)
  38. class Acumulator(Register):
  39. positive_flag = False
  40. negative_flag = False
  41. zero_flag = False
  42. carry = False
  43. def add(self, register):
  44. pass