1 # python code-writer for OpenPOWER ISA pseudo-code parsing
7 from openpower
.decoder
.pseudo
.functionreader
import ISAFunctions
8 from openpower
.decoder
.power_pseudo
import convert_to_pure_python
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")
18 # auto-generated by pyfnwriter.py, do not edit or commit
20 from openpower.decoder.helpers import (ISACallerHelper,
21 ne, eq, gt, ge, lt, le, ltu, gtu, length,
22 trunc_divs, trunc_rems,
24 from openpower.decoder.selectable_int import SelectableInt
25 from openpower.decoder.selectable_int import selectconcat as concat
31 class PyISAFnWriter(ISAFunctions
):
33 ISAFunctions
.__init
__(self
)
34 self
.pages_written
= []
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']
47 pycode
= convert_to_pure_python(pcode
, True)
50 def write_isa_class(self
):
51 isadir
= get_isafn_src_dir()
52 fname
= os
.path
.join(isadir
, "all.py")
54 with
open(fname
, "w") as f
:
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
))
65 f
.write('class ISACallerFnHelper(%s):\n' % ', '.join(helpers
+ ['ISACallerHelper']))
71 write_isa_class
= True
72 if len(sys
.argv
) == 1: # quick way to do it
74 sources
= isa
.fns
.keys()
76 sources
= sys
.argv
[1:]
77 if sources
[0] == "noall": # don't rewrite all.py
78 write_isa_class
= False
80 print ("sources", write_isa_class
, sources
)
81 for source
in sources
:
82 isa
.write_pysource(source
)
86 if __name__
== '__main__':