add in ability to concat ints
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 2 Apr 2020 10:53:30 +0000 (11:53 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 2 Apr 2020 10:53:30 +0000 (11:53 +0100)
src/soc/decoder/power_pseudo.py
src/soc/decoder/pseudo/lexer.py
src/soc/decoder/pseudo/parser.py
src/soc/decoder/selectable_int.py

index eb71052c20fef5a9f3a5623e5c094f4e17cfa0cc..104edd9866b20b25e3bb2877739c7269f5789f25 100644 (file)
@@ -19,7 +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
+from soc.decoder.selectable_int import SelectableInt, selectconcat
 
 ####### Test code #######
 
@@ -132,16 +132,14 @@ def test():
         print ("args", args)
         print ("-->", " ".join(map(str,args)))
 
-    def listconcat(l1, l2):
-        return l1 + l2
-
     from soc.decoder.helpers import (EXTS64, EXTZ64, ROTL64, ROTL32, MASK,)
 
     d = {}
     d["print"] = print_
     d["EXTS64"] = EXTS64
     d["EXTZ64"] = EXTZ64
-    d["concat"] = listconcat
+    d["SelectableInt"] = SelectableInt
+    d["concat"] = selectconcat
     d["GPR"] = gsc.gpr
 
     form = 'X'
index e2ba0a2ba308a60cf7f100d6eccddb25322fe523..9076672d58f8fa6c90eec40a25d13b1d591d9330 100644 (file)
@@ -10,7 +10,7 @@
 # Modifications for inclusion in PLY distribution
 from copy import copy
 from ply import lex
-
+from soc.decoder.selectable_int import SelectableInt
 
 ## I implemented INDENT / DEDENT generation as a post-processing filter
 
@@ -264,7 +264,7 @@ class PowerLexer:
 
     def t_BINARY(self, t):
         r"""0b[01]+"""
-        t.value = int(t.value, 2)
+        t.value = SelectableInt(int(t.value, 2), len(t.value)-2)
         return t
 
     #t_NUMBER = r'\d+'
index 1db988e7dad4765fa033447f950dd7a402130f0e..69fe6aa958491483473bf75985e1e4dbff3aab8f 100644 (file)
@@ -90,8 +90,9 @@ def check_concat(node): # checks if the comparison is already a concat
     print (node)
     if not isinstance(node, ast.Call):
         return [node]
-    if node[0].id != 'concat':
-        return node
+    print (node.func.id)
+    if node.func.id != 'concat':
+        return [node]
     return node[1]
 
 
index a73ceb5dd5885df78c473e53a9b6dbc7f1bc4989..e1fd8d64699738801e59fd5ba90c2cda26dfe09e 100644 (file)
@@ -1,4 +1,5 @@
 import unittest
+from copy import copy
 
 
 class SelectableInt:
@@ -99,6 +100,14 @@ class SelectableInt:
         return "SelectableInt(value={:x}, bits={})".format(self.value,
                                                            self.bits)
 
+def selectconcat(*args):
+    res = copy(args[0])
+    for i in args[1:]:
+        assert isinstance(i, SelectableInt), "can only concat SIs, sorry"
+        res.bits += i.bits
+        res.value = (res.value << i.bits) | i.value
+    return res
+
 
 class SelectableIntTestCase(unittest.TestCase):
     def test_arith(self):