re-add accidentally-deleted low-level operators eq ne gt etc
[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.helpers import (ISACallerHelper,
21 ne, eq, gt, ge, lt, le, ltu, gtu, length,
22 trunc_divs, trunc_rems,
23 )
24 from openpower.decoder.selectable_int import SelectableInt
25 from openpower.decoder.selectable_int import selectconcat as concat
26
27 # %s
28 """
29
30
31 class PyISAFnWriter(ISAFunctions):
32 def __init__(self):
33 ISAFunctions.__init__(self)
34 self.pages_written = []
35
36 def write_pysource(self, pagename):
37 self.pages_written.append(pagename)
38 function = self.fns[pagename]
39 isadir = get_isafn_src_dir()
40 os.makedirs(isadir, exist_ok=True)
41 fname = os.path.join(isadir, "%s.py" % pagename)
42 with open(fname, "w") as f:
43 f.write(header % function['desc']) # write out header
44 # go through all instructions
45 pcode = function['pcode']
46 print(pcode)
47 pycode = convert_to_pure_python(pcode, True)
48 f.write(pycode)
49
50 def write_isa_class(self):
51 isadir = get_isafn_src_dir()
52 fname = os.path.join(isadir, "all.py")
53
54 with open(fname, "w") as f:
55 helpers = []
56 f.write('# auto-generated by pyfnwriter.py: do not edit or commit\n')
57 f.write('from openpower.decoder.helpers import ISACallerHelper\n')
58 for page in self.pages_written:
59 module = 'openpower.decoder.isafunctions.' + page
60 helper = 'ISACallerFnHelper_' + page
61 helpers.append(helper)
62 f.write('from %s import ISACallerFnHelper as %s\n' % (module, helper))
63 f.write('\n')
64 f.write('\n')
65 f.write('class ISACallerFnHelper(%s):\n' % ', '.join(helpers + ['ISACallerHelper']))
66 f.write(' pass\n')
67
68
69 def pyfnwriter():
70 isa = PyISAFnWriter()
71 write_isa_class = True
72 if len(sys.argv) == 1: # quick way to do it
73 print(dir(isa))
74 sources = isa.fns.keys()
75 else:
76 sources = sys.argv[1:]
77 if sources[0] == "noall": # don't rewrite all.py
78 write_isa_class = False
79 sources.pop(0)
80 print ("sources", write_isa_class, sources)
81 for source in sources:
82 isa.write_pysource(source)
83 if write_isa_class:
84 isa.write_isa_class()
85
86 if __name__ == '__main__':
87 pyfnwriter()