diff --git a/src/simudator/gui/module_graphics_item/integer_memory_graphic.py b/src/simudator/gui/module_graphics_item/integer_memory_graphic.py index 65c2ba3a149b5af743c7ab329eb6d47b851436a6..a177b6228b5395a5c163bf8d1c371f4e0f0a923a 100644 --- a/src/simudator/gui/module_graphics_item/integer_memory_graphic.py +++ b/src/simudator/gui/module_graphics_item/integer_memory_graphic.py @@ -17,6 +17,17 @@ class Base(Enum): HEXADECIMAL = 4 +class ValueTooBig(Exception): + """ + A class representing the error of a user inputting a value that does not fit in the memory. + + Used to differentiate between wrong input using the exception python raises by default (ValueError) + and the error of a value that does not fit. + """ + + pass + + class IntegerMemoryWindow(MemoryWindow): """ A class showing the contents of a memory module in a new window. @@ -187,6 +198,8 @@ class IntegerMemoryTable(MemoryTable): item = self.item(row, col) value = item.text() + max_value = 2**self._bit_length + min_value = -(2 ** (self._bit_length - 1)) # Turn every value into a positive int # in base 10 @@ -203,6 +216,10 @@ class IntegerMemoryTable(MemoryTable): self._base == Base.DECIMAL_SIGNED or self._base == Base.DECIMAL_UNSIGNED ): value = int(value) + + if value > max_value or value < min_value: + raise ValueTooBig + except ValueError: msg = None if self._base == Base.BINARY: @@ -217,12 +234,18 @@ class IntegerMemoryTable(MemoryTable): self.update() return + except ValueTooBig: + self._errorMessageWidget.showMessage( + f"Input value does not fit within the bit length of {self._bit_length}." + ) + self.update() + return + # Turn negative signed numbers into their positive unsigned # counter part # Ex 4 bits: # -7 = 1001 # -7 + 16 % 16 = 9 = 1001 = -7 - max_value = 2**self._bit_length value = (value + max_value) % max_value index = row * 4 + col