fix pattern-match for an expression such as "XLEN-16" when looking
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 30 Aug 2021 12:03:53 +0000 (13:03 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 30 Aug 2021 12:03:53 +0000 (13:03 +0100)
for concat substitutions

[item] * NUMBER was replaced with
concat(item, repeat=NUMBER)

but [item] * (XLEN-16) was not matching

by adding a HACK which spots ast.Binop then [item]*(XLEN-16) can be
recognised

src/openpower/decoder/power_pseudo.py
src/openpower/decoder/pseudo/parser.py

index 99f3ca47c708fdba863abcf0de8afb3d3bd74137..ec9bf0854fe1b5f306fa36dc4dc20e0b9346b0bb 100644 (file)
@@ -194,7 +194,17 @@ XLEN_test = """
 RA[XLEN:XLEN - 1]
 """
 
-code = XLEN_test
+concat_test1 = """
+[0]*16
+"""
+
+concat_test2 = """
+[0]*(XLEN-16)
+"""
+
+code = concat_test2
+#code = concat_test1
+#code = XLEN_test
 #code = logictest
 #code = SVSTATE_next
 #code = hextest
index 03d0fd5e6aca7128ecfa2d42d36be84e0ca0d353..b9779b0db5b00cbd19b3a9fa84d32d718766c044 100644 (file)
@@ -176,10 +176,21 @@ def check_concat(node):  # checks if the comparison is already a concat
 
 # identify SelectableInt pattern [something] * N
 # must return concat(something, repeat=N)
+# here is a TEMPORARY hack to support minimal expressions
+# such as (XLEN-16), looking for ast.BinOp
+# have to keep an eye on this
 def identify_sint_mul_pattern(p):
+    """here we are looking for patterns of this type:
+        [item] * something
+    these must specifically be returned as concat(item, repeat=something)
+    """
+    #print ("identify_sint_mul_pattern")
+    #for pat in p:
+    #    print("    ", astor.dump_tree(pat))
     if p[2] != '*':  # multiply
         return False
-    if not isinstance(p[3], ast.Constant):  # rhs = Num
+    if (not isinstance(p[3], ast.Constant) and  # rhs = Num
+        not isinstance(p[3], ast.BinOp)):       # rhs = (XLEN-something)
         return False
     if not isinstance(p[1], ast.List):  # lhs is a list
         return False