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.

90 lines
2.2 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 truncate(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. else:
  22. self.value = value
  23. self.truncate()
  24. def get(self):
  25. return self.value
  26. def get_signed(self):
  27. if self.value & (1 << (self.n_bits - 1)) == 0:
  28. return self.value
  29. else:
  30. return self.value - (1 << self.n_bits)
  31. def complement(self):
  32. self.value = self.value ^ ((1 << self.n_bits) - 1)
  33. def negate(self):
  34. self.complement()
  35. self.value += 1
  36. def __str__(self):
  37. return "{:08b}".format(self.value)
  38. def __repr__(self):
  39. return "{} ({})".format(self, self.n_bits)
  40. class Accumulator(Register):
  41. negative_flag = False
  42. zero_flag = False
  43. carry_flag = False
  44. parity_flag = False
  45. def set_flags(self):
  46. self.negative_flag = False
  47. self.zero_flag = False
  48. if self.get_signed() < 0:
  49. self.negative_flag = True
  50. if self.get() == 0:
  51. self.zero_flag = True
  52. v = self.get()
  53. self.parity_flag = True
  54. while v > 0:
  55. if (v & 1) == 1:
  56. self.parity_flag = not self.parity_flag
  57. v >>= 1
  58. def add(self, register: Register):
  59. self.value += register.value
  60. if self.value.bit_length() > self.n_bits:
  61. self.carry_flag = True
  62. self.truncate()
  63. self.set_flags()
  64. def sub(self, register: Register):
  65. self.negate()
  66. self.add(register)
  67. self.negate()
  68. self.set_flags()
  69. def shift_right(self, through_carry=True):
  70. pass
  71. def shift_left(self, through_carry=True):
  72. pass