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.isa.caller import inject
21 from openpower.decoder.helpers import (EXTS, EXTS64, EXTZ64, ROTL64, ROTL32,
23 ne, eq, gt, ge, lt, le, ltu, gtu, length,
24 trunc_divs, trunc_rems, MULS, DIVS, MODS,
27 FPADD32, FPSUB32, FPMUL32, FPDIV32,
28 FPADD64, FPSUB64, FPMUL64, FPDIV64,
30 from openpower.decoder.selectable_int import SelectableInt
31 from openpower.decoder.selectable_int import selectconcat as concat
37 class PyISAFnWriter(ISAFunctions
):
39 ISAFunctions
.__init
__(self
)
40 self
.pages_written
= []
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']
53 pycode
= convert_to_pure_python(pcode
)
56 def write_isa_class(self
):
57 isadir
= get_isafn_src_dir()
58 fname
= os
.path
.join(isadir
, "all.py")
60 with
open(fname
, "w") as f
:
62 f
.write('# auto-generated by pyfnwriter.py: do not edit or commit\n')
63 f
.write('from openpower.decoder.helpers import ISACallerHelper\n')
64 for page
in self
.pages_written
:
65 module
= 'openpower.decoder.isafunctions.' + page
66 helper
= 'ISACallerFnHelper_' + page
67 helpers
.append(helper
)
68 f
.write('from %s import ISACallerFnHelper as %s\n' % (module
, helper
))
71 f
.write('class ISACallerFnHelper(%s):\n' % ', '.join(helpers
+ ['ISACallerHelper']))
77 write_isa_class
= True
78 if len(sys
.argv
) == 1: # quick way to do it
80 sources
= isa
.fns
.keys()
82 sources
= sys
.argv
[1:]
83 if sources
[0] == "noall": # don't rewrite all.py
84 write_isa_class
= False
86 print ("sources", write_isa_class
, sources
)
87 for source
in sources
:
88 isa
.write_pysource(source
)
92 if __name__
== '__main__':