success using SelectableInt in cnttzd test
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 2 Apr 2020 10:24:23 +0000 (11:24 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 2 Apr 2020 10:24:23 +0000 (11:24 +0100)
src/soc/decoder/helpers.py
src/soc/decoder/power_pseudo.py
src/soc/decoder/pseudo/lexer.py
src/soc/decoder/selectable_int.py

index 4c595ca9653af82d4e802f8292774c34dfbc0204..941bcbc8f46bc9f263aeef0596061879b2df390c 100644 (file)
@@ -1,4 +1,5 @@
 import unittest
+from soc.decoder.selectable_int import SelectableInt
 
 
 def exts(value, bits):
@@ -7,11 +8,15 @@ def exts(value, bits):
 
 
 def EXTS64(value):
-    return exts(value, 32) & ((1 << 64)-1)
+    if isinstance(value, SelectableInt):
+        value = value.value
+    return SelectableInt(exts(value, 32) & ((1 << 64)-1), 64)
 
 
 def EXTZ64(value):
-    return value & ((1<<32)-1)
+    if isinstance(value, SelectableInt):
+        value = value.value
+    return SelectableInt(value & ((1<<32)-1), 64)
 
 def rotl(value, bits, wordlen):
     mask = (1 << wordlen) - 1
index 36a7022e8b9290c757b2540d431e382d7feb82f1..eb71052c20fef5a9f3a5623e5c094f4e17cfa0cc 100644 (file)
@@ -19,6 +19,7 @@ from nmigen.back.pysim import Simulator, Delay
 from nmigen import Module, Signal
 
 from soc.decoder.pseudo.parser import GardenSnakeCompiler
+from soc.decoder.selectable_int import SelectableInt
 
 ####### Test code #######
 
@@ -53,9 +54,9 @@ RA <- [0]*56|| perm[0:7]
 cnttzd = """
 n  <- 0
 do while n < 64
-   if (RS)[63-n] = 0b1 then
+    if (RS)[63-n] = 0b1 then
         leave
-   n  <- n + 1
+    n  <- n + 1
 RA <- EXTZ64(n)
 print (RA)
 """
@@ -73,8 +74,7 @@ def tolist(num):
 
 
 def get_reg_hex(reg):
-    report = ''.join(map(str, reg))
-    return hex(int('0b%s' % report, 2))
+    return hex(reg.value)
 
 
 class GPR(dict):
@@ -83,7 +83,7 @@ class GPR(dict):
         self.sd = sd
         self.regfile = regfile
         for i in range(32):
-            self[i] = [0] * 64 # TODO: needs to be IntClass(value=0, len=64)
+            self[i] = SelectableInt(0, 64)
 
     def set_form(self, form):
         self.form = form
@@ -194,7 +194,7 @@ def test():
                 reg = getform[wname]
                 print ("write regs", wname, d[wname], reg)
                 regidx = yield reg
-                gsc.gpr[regidx] = tolist(d[wname])
+                gsc.gpr[regidx] = d[wname]
 
     sim.add_process(process)
     with sim.write_vcd("simulator.vcd", "simulator.gtkw",
index 82578ac93132d1e0a02f1c9ddd9eb7d05747e6f9..e2ba0a2ba308a60cf7f100d6eccddb25322fe523 100644 (file)
@@ -276,7 +276,8 @@ class PowerLexer:
 
     def t_STRING(self, t):
         r"'([^\\']+|\\'|\\\\)*'"  # I think this is right ...
-        t.value=t.value[1:-1].decode("string-escape") # .swapcase() # for fun
+        print (repr(t.value))
+        t.value=t.value[1:-1]
         return t
 
     t_COLON = r':'
index 8ef80a4650d29eb7db098cf5a6c3fd93ec2cf429..a73ceb5dd5885df78c473e53a9b6dbc7f1bc4989 100644 (file)
@@ -39,7 +39,7 @@ class SelectableInt:
 
     def __getitem__(self, key):
         if isinstance(key, int):
-            assert key < self.bits
+            assert key < self.bits, "key %d accessing %d" % (key, self.bits)
             assert key >= 0
             key = self.bits - (key + 1)