1 # python code-writer for OpenPOWER ISA pseudo-code parsing
7 from openpower
.decoder
.pseudo
.functionreader
import ISAFunctions
, get_isafn_dir
8 from openpower
.decoder
.power_pseudo
import (convert_to_pure_python
,
12 def get_isafn_src_dir():
13 fdir
= os
.path
.abspath(os
.path
.dirname(__file__
))
14 fdir
= os
.path
.split(fdir
)[0]
15 return os
.path
.join(fdir
, "isafunctions")
19 # auto-generated by pyfnwriter.py, do not edit or commit
21 from openpower.decoder.helpers import (ISACallerHelper,
22 ne, eq, gt, ge, lt, le, ltu, gtu, length,
23 trunc_divs, trunc_rems, copy_assign_rhs,
25 from openpower.decoder.selectable_int import SelectableInt
26 from openpower.decoder.selectable_int import selectconcat as concat
32 class PyISAFnWriter(ISAFunctions
):
34 ISAFunctions
.__init
__(self
)
35 self
.pages_written
= []
37 def write_pysource(self
, pagename
):
38 self
.pages_written
.append(pagename
)
39 function
= self
.fns
[pagename
]
40 isadir
= get_isafn_src_dir()
41 os
.makedirs(isadir
, exist_ok
=True)
42 fname
= os
.path
.join(isadir
, "%s.py" % pagename
)
44 check_in_gitignore(fname
)
45 with
open(fname
, "w") as f
:
46 f
.write(header
% function
['desc']) # write out header
47 # go through all instructions
48 pcode
= function
['pcode']
50 # check if the code has already been compiled
52 if phash
in sourcecache
:
53 pycode
= sourcecache
[phash
]
55 filename
= os
.path
.join(get_isafn_dir(), pagename
+ ".mdwn")
56 pycode
= convert_to_pure_python(pcode
, True, filename
=filename
)
57 sourcecache
[phash
] = pycode
60 def write_isa_class(self
):
61 isadir
= get_isafn_src_dir()
62 fname
= os
.path
.join(isadir
, "all.py")
64 with
open(fname
, "w") as f
:
66 f
.write('# auto-generated by pyfnwriter.py: do not edit or commit\n')
67 f
.write('from openpower.decoder.helpers import ISACallerHelper\n')
68 for page
in self
.pages_written
:
69 module
= 'openpower.decoder.isafunctions.' + page
70 helper
= 'ISACallerFnHelper_' + page
71 helpers
.append(helper
)
72 f
.write('from %s import ISACallerFnHelper as %s\n' % (module
, helper
))
75 f
.write('class ISACallerFnHelper(%s):\n' % ', '.join(helpers
+ ['ISACallerHelper']))
81 write_isa_class
= True
82 if len(sys
.argv
) == 1: # quick way to do it
84 sources
= isa
.fns
.keys()
86 sources
= sys
.argv
[1:]
87 if sources
[0] == "noall": # don't rewrite all.py
88 write_isa_class
= False
90 print ("sources", write_isa_class
, sources
)
91 for source
in sources
:
92 isa
.write_pysource(source
)
96 if __name__
== '__main__':