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