9cb8a220f1dd058d6c94e700508b7811827b8a83
[soc.git] / src / soc / decoder / pseudo / pywriter.py
1 # python code-writer for OpenPOWER ISA pseudo-code parsing
2
3 import os
4 from soc.decoder.pseudo.pagereader import ISA
5 from soc.decoder.power_pseudo import convert_to_python
6
7 def get_isasrc_dir():
8 fdir = os.path.abspath(os.path.dirname(__file__))
9 fdir = os.path.split(fdir)[0]
10 return os.path.join(fdir, "isa")
11
12 def create_args(reglist, extra=None):
13 args = set()
14 for reg in reglist:
15 args.add(reg)
16 args = list(args)
17 if extra:
18 args = [extra] + args
19 return ', '.join(args)
20
21
22 class PyISAWriter(ISA):
23 def __init__(self):
24 ISA.__init__(self)
25
26 def write_pysource(self, pagename):
27 instrs = isa.page[pagename]
28 isadir = get_isasrc_dir()
29 fname = os.path.join(isadir, "%s.py" % pagename)
30 with open(fname, "w") as f:
31 f.write("class %s:\n" % pagename)
32 for page in instrs:
33 d = self.instr[page]
34 print (fname, d.opcode)
35 pcode = '\n'.join(d.pcode) + '\n'
36 print (pcode)
37 pycode, regsused = convert_to_python(pcode)
38 # create list of arguments to call
39 regs = regsused['read_regs'] + regsused['uninit_regs']
40 args = create_args(regs, 'self')
41 # create list of arguments to return
42 retargs = create_args(regsused['write_regs'])
43 f.write(" def %s(%s):\n" % (page.replace(".", "_"), args))
44 pycode = pycode.split("\n")
45 pycode = '\n'.join(map(lambda x: " %s" % x, pycode))
46 pycode = pycode.rstrip()
47 f.write(pycode + '\n')
48 if retargs:
49 f.write(" return (%s,)\n\n" % retargs)
50 else:
51 f.write("\n")
52
53 if __name__ == '__main__':
54 isa = PyISAWriter()
55 isa.write_pysource('comparefixed')
56 isa.write_pysource('fixedarith')