add python function writer, takes Appendix v3.0B pseudocode functions
[openpower-isa.git] / src / openpower / decoder / pseudo / pyfnwriter.py
1 # python code-writer for OpenPOWER ISA pseudo-code parsing
2
3 import os
4 import sys
5 import shutil
6 import subprocess
7 from openpower.decoder.pseudo.functionreader import ISAFunctions
8 from openpower.decoder.power_pseudo import convert_to_pure_python
9
10
11 def get_isafn_src_dir():
12 fdir = os.path.abspath(os.path.dirname(__file__))
13 fdir = os.path.split(fdir)[0]
14 return os.path.join(fdir, "isafunctions")
15
16
17 header = """\
18 # auto-generated by pyfnwriter.py, do not edit or commit
19
20 from openpower.decoder.isa.caller import inject
21 from openpower.decoder.helpers import (EXTS, EXTS64, EXTZ64, ROTL64, ROTL32,
22 MASK, MASK32,
23 ne, eq, gt, ge, lt, le, ltu, gtu, length,
24 trunc_divs, trunc_rems, MULS, DIVS, MODS,
25 EXTS128, undefined,
26 DOUBLE, SINGLE,
27 FPADD32, FPSUB32, FPMUL32, FPDIV32,
28 FPADD64, FPSUB64, FPMUL64, FPDIV64,
29 )
30 from openpower.decoder.selectable_int import SelectableInt
31 from openpower.decoder.selectable_int import selectconcat as concat
32
33 # %s
34 """
35
36
37 class PyISAFnWriter(ISAFunctions):
38 def __init__(self):
39 ISAFunctions.__init__(self)
40 self.pages_written = []
41
42 def write_pysource(self, pagename):
43 self.pages_written.append(pagename)
44 function = self.fns[pagename]
45 isadir = get_isafn_src_dir()
46 fname = os.path.join(isadir, "%s.py" % pagename)
47 with open(fname, "w") as f:
48 f.write(header % function['desc']) # write out header
49 # go through all instructions
50 pcode = function['pcode']
51 print(pcode)
52 pycode = convert_to_pure_python(pcode)
53 f.write(pycode)
54
55
56 def pyfnwriter():
57 isa = PyISAFnWriter()
58 write_isa_class = True
59 if len(sys.argv) == 1: # quick way to do it
60 print(dir(isa))
61 sources = isa.fns.keys()
62 else:
63 sources = sys.argv[1:]
64 if sources[0] == "noall": # don't rewrite all.py
65 write_isa_class = False
66 sources.pop(0)
67 print ("sources", write_isa_class, sources)
68 for source in sources:
69 isa.write_pysource(source)
70
71 if __name__ == '__main__':
72 pyfnwriter()