add bitrev to pywriter autogenerator
[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 os.makedirs(isadir, exist_ok=True)
47 fname = os.path.join(isadir, "%s.py" % pagename)
48 with open(fname, "w") as f:
49 f.write(header % function['desc']) # write out header
50 # go through all instructions
51 pcode = function['pcode']
52 print(pcode)
53 pycode = convert_to_pure_python(pcode)
54 f.write(pycode)
55
56
57 def pyfnwriter():
58 isa = PyISAFnWriter()
59 write_isa_class = True
60 if len(sys.argv) == 1: # quick way to do it
61 print(dir(isa))
62 sources = isa.fns.keys()
63 else:
64 sources = sys.argv[1:]
65 if sources[0] == "noall": # don't rewrite all.py
66 write_isa_class = False
67 sources.pop(0)
68 print ("sources", write_isa_class, sources)
69 for source in sources:
70 isa.write_pysource(source)
71
72 if __name__ == '__main__':
73 pyfnwriter()