sort out SelectableInt bit-ordering for identifying SVP64 fields
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 1 Feb 2021 14:49:01 +0000 (14:49 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 1 Feb 2021 14:49:01 +0000 (14:49 +0000)
src/soc/decoder/isa/caller.py
src/soc/decoder/selectable_int.py

index 38a439f087d2827280c1ea9ac3669047448f2d20..c58ad24808a5b7c8d29f391ba485711c7b88badc 100644 (file)
@@ -214,7 +214,6 @@ class PC:
 
 
 # Simple-V: see https://libre-soc.org/openpower/sv
 
 
 # Simple-V: see https://libre-soc.org/openpower/sv
-# also soc.sv.svstate SVSTATEREC
 class SVP64State:
     def __init__(self, init=0):
         self.spr = SelectableInt(init, 32)
 class SVP64State:
     def __init__(self, init=0):
         self.spr = SelectableInt(init, 32)
@@ -614,7 +613,9 @@ class ISACaller:
         pfx = SVP64PrefixFields()
         pfx.insn.value = opcode
         major = pfx.major.asint(msb0=True) # MSB0 inversion
         pfx = SVP64PrefixFields()
         pfx.insn.value = opcode
         major = pfx.major.asint(msb0=True) # MSB0 inversion
-        print ("prefix test: opcode:", major, bin(major))
+        print ("prefix test: opcode:", major, bin(major),
+                pfx.insn[7] == 0b1, pfx.insn[9] == 0b1,
+                bin(pfx.rm.asint(msb0=True)))
 
     def execute_one(self):
         """execute one instruction
 
     def execute_one(self):
         """execute one instruction
index 53e85036d444619d94f28e03d6f42de6dfcb8c76..7f60f5e4d71116e01bb17231e4c9a0498fb4867f 100644 (file)
@@ -117,8 +117,10 @@ class FieldSelectableInt:
     def asint(self, msb0=False):
         res = 0
         brlen = len(self.br)
     def asint(self, msb0=False):
         res = 0
         brlen = len(self.br)
-        for i, key in enumerate(self.br):
-            res |= self.si[key].value << ((brlen-i-1) if msb0 else i)
+        for i, key in self.br.items():
+            bit = self.si[key].value
+            #print("asint", i, key, bit)
+            res |= bit << ((brlen-i-1) if msb0 else i)
         return res
 
 
         return res
 
 
@@ -277,7 +279,6 @@ class SelectableInt:
     def __getitem__(self, key):
         if isinstance(key, SelectableInt):
             key = key.value
     def __getitem__(self, key):
         if isinstance(key, SelectableInt):
             key = key.value
-        print("getitem", key, self.bits, hex(self.value))
         if isinstance(key, int):
             assert key < self.bits, "key %d accessing %d" % (key, self.bits)
             assert key >= 0
         if isinstance(key, int):
             assert key < self.bits, "key %d accessing %d" % (key, self.bits)
             assert key >= 0
@@ -286,6 +287,7 @@ class SelectableInt:
             key = self.bits - (key + 1)
 
             value = (self.value >> key) & 1
             key = self.bits - (key + 1)
 
             value = (self.value >> key) & 1
+            print("getitem", key, self.bits, hex(self.value), value)
             return SelectableInt(value, 1)
         elif isinstance(key, slice):
             assert key.step is None or key.step == 1
             return SelectableInt(value, 1)
         elif isinstance(key, slice):
             assert key.step is None or key.step == 1
@@ -300,6 +302,7 @@ class SelectableInt:
             #print ("__getitem__ slice num bits", start, stop, bits)
             mask = (1 << bits) - 1
             value = (self.value >> start) & mask
             #print ("__getitem__ slice num bits", start, stop, bits)
             mask = (1 << bits) - 1
             value = (self.value >> start) & mask
+            print("getitem", key, self.bits, hex(self.value), value)
             return SelectableInt(value, bits)
 
     def __setitem__(self, key, value):
             return SelectableInt(value, bits)
 
     def __setitem__(self, key, value):