test_caller_svp64_powmod: rename to test_aaa_caller_svp64_powmod so pytest tries...
[openpower-isa.git] / src / openpower / decoder / selectable_int.py
index ee8ef7e354a36e3638c1a015af44cfe90f6cbda7..1eb0d2a7bd22c53be962853731607a0ec680a80e 100644 (file)
@@ -78,7 +78,7 @@ class FieldSelectableInt:
         return len(self.br)
 
     def __getitem__(self, key):
-        log("getitem", key, self.br)
+        #log("getitem", key, self.br)
         if isinstance(key, SelectableInt):
             key = key.value
 
@@ -229,9 +229,19 @@ class SelectableInt:
     FieldSelectableInt can then operate on partial bits, and because there
     is a bit width associated with SelectableInt, slices operate correctly
     including negative start/end points.
+
+    value: int
+        the bits contained by `self`
+    bits: int
+        the number of bits contained by `self`.
+    ok: bool
+        a flag to detect if outputs have been written by pseudo-code
+
+        instruction inputs have `ok` set to `False`, all changed or new
+        SelectableInt instances set `ok` to `True`.
     """
 
-    def __init__(self, value, bits=None):
+    def __init__(self, value, bits=None, *, ok=True):
         if isinstance(value, FieldSelectableInt):
             value = value.get_range()
         if isinstance(value, SelectableInt):
@@ -241,6 +251,7 @@ class SelectableInt:
                     raise ValueError(value)
             bits = value.bits
             value = value.value
+            # intentionally don't copy ok
         else:
             if not isinstance(value, int):
                 raise ValueError(value)
@@ -250,10 +261,12 @@ class SelectableInt:
         self.value = value & mask
         self.bits = bits
         self.overflow = (value & ~mask) != 0
+        self.ok = ok
 
     def eq(self, b):
         self.value = b.value
         self.bits = b.bits
+        self.ok = True
 
     def to_signed_int(self):
         log ("to signed?", self.value & (1<<(self.bits-1)), self.value)
@@ -395,6 +408,7 @@ class SelectableInt:
             return selectconcat(*bits)
 
     def __setitem__(self, key, value):
+        self.ok = True
         if isinstance(key, SelectableInt):
             key = key.value
         if isinstance(key, int):
@@ -487,8 +501,10 @@ class SelectableInt:
         return self.value != 0
 
     def __repr__(self):
-        value = f"value={hex(self.value)}, bits={self.bits}"
-        return f"{self.__class__.__name__}({value})"
+        value = "value=%#x, bits=%d" % (self.value, self.bits)
+        if not self.ok:
+            value += ", ok=False"
+        return "%s(%s)" % (self.__class__.__name__, value)
 
     def __len__(self):
         return self.bits
@@ -562,7 +578,11 @@ def selectconcat(*args, repeat=1):
         for i in range(repeat):
             tmp += args
         args = tmp
-    res = copy(args[0])
+    if isinstance(args[0], FieldSelectableInt):
+        res = args[0].get_range()
+    else:
+        assert isinstance(args[0], SelectableInt), "can only concat SIs, sorry"
+        res = SelectableInt(args[0])
     for i in args[1:]:
         if isinstance(i, FieldSelectableInt):
             i = i.get_range()