From 2ecec80b841136e052b6e7d39b76abaca77bb612 Mon Sep 17 00:00:00 2001 From: Luke Kenneth Casson Leighton Date: Sat, 4 Apr 2020 20:24:08 +0100 Subject: [PATCH] add means to subscript two levels deep --- libreriscv | 2 +- src/soc/decoder/power_pseudo.py | 12 ++++++- src/soc/decoder/pseudo/parser.py | 56 +++++++++++++++++++++----------- 3 files changed, 49 insertions(+), 21 deletions(-) diff --git a/libreriscv b/libreriscv index 6ad52e42..d38dcfdc 160000 --- a/libreriscv +++ b/libreriscv @@ -1 +1 @@ -Subproject commit 6ad52e429bfcc8f815de14109833eb9288bc9c86 +Subproject commit d38dcfdcc6923a03b8b3ac0ff8d03781dc6e7e80 diff --git a/src/soc/decoder/power_pseudo.py b/src/soc/decoder/power_pseudo.py index c4f962a2..37aa56fc 100644 --- a/src/soc/decoder/power_pseudo.py +++ b/src/soc/decoder/power_pseudo.py @@ -126,11 +126,18 @@ MEM(EA, 1) <- (RS)[56:63] RB <- RA RA <- EA """ + +testgprslice = """ +MEM(EA, 4) <- GPR(r)[32:63] +#x <- x[0][32:63] +""" + #code = testmul #code = testgetzero #code = testcat #code = testgpr -code = testmem +#code = testmem +code = testgprslice #code = testreg #code = cnttzd #code = cmpi @@ -178,6 +185,9 @@ class GPR(dict): for i in range(32): self[i] = SelectableInt(regfile[i], 64) + def __call__(self, ridx): + return self[ridx] + def set_form(self, form): self.form = form diff --git a/src/soc/decoder/pseudo/parser.py b/src/soc/decoder/pseudo/parser.py index 9384ca21..6abe1913 100644 --- a/src/soc/decoder/pseudo/parser.py +++ b/src/soc/decoder/pseudo/parser.py @@ -151,6 +151,27 @@ def identify_sint_mul_pattern(p): elt = l[0] return isinstance(elt, ast.Constant) +def apply_trailer(atom, trailer): + if trailer[0] == "TLIST": + # assume depth of one + atom = apply_trailer(atom, trailer[1]) + trailer = trailer[2] + if trailer[0] == "CALL": + #p[0] = ast.Expr(ast.Call(p[1], p[2][1], [])) + return ast.Call(atom, trailer[1], []) + # if p[1].id == 'print': + # p[0] = ast.Printnl(ast.Tuple(p[2][1]), None, None) + # else: + # p[0] = ast.CallFunc(p[1], p[2][1], None, None) + else: + print("subscript atom", trailer[1]) + #raise AssertionError("not implemented %s" % p[2][0]) + subs = trailer[1] + if len(subs) == 1: + idx = subs[0] + else: + idx = ast.Slice(subs[0], subs[1], None) + return ast.Subscript(atom, idx, ast.Load()) ########## Parser (tokens -> AST) ###### @@ -451,30 +472,18 @@ class PowerParser: # power: atom trailer* ['**' factor] # trailers enables function calls (and subscripts). - # I only allow one level of calls - # so this is 'trailer' + # so this is 'trailerlist' def p_power(self, p): """power : atom - | atom trailer""" + | atom trailerlist""" if len(p) == 2: p[0] = p[1] else: - if p[2][0] == "CALL": - #p[0] = ast.Expr(ast.Call(p[1], p[2][1], [])) - p[0] = ast.Call(p[1], p[2][1], []) - # if p[1].id == 'print': - # p[0] = ast.Printnl(ast.Tuple(p[2][1]), None, None) - # else: - # p[0] = ast.CallFunc(p[1], p[2][1], None, None) - else: - print("subscript atom", p[2][1]) - #raise AssertionError("not implemented %s" % p[2][0]) - subs = p[2][1] - if len(subs) == 1: - idx = subs[0] - else: - idx = ast.Slice(subs[0], subs[1], None) - p[0] = ast.Subscript(p[1], idx, ast.Load()) + print("power dump atom") + print(astor.dump_tree(p[1])) + print("power dump trailerlist") + print(astor.dump_tree(p[2])) + p[0] = apply_trailer(p[1], p[2]) def p_atom_name(self, p): """atom : NAME""" @@ -533,6 +542,15 @@ class PowerParser: else: p[0] = p[2] + def p_trailerlist(self, p): + """trailerlist : trailer trailerlist + | trailer + """ + if len(p) == 2: + p[0] = p[1] + else: + p[0] = ("TLIST", p[1], p[2]) + # trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME def p_trailer(self, p): """trailer : trailer_arglist -- 2.30.2