import sys
import shutil
import subprocess
-from openpower.decoder.pseudo.functionreader import ISAFunctions
-from openpower.decoder.power_pseudo import convert_to_pure_python
+from openpower.decoder.pseudo.functionreader import ISAFunctions, get_isafn_dir
+from openpower.decoder.power_pseudo import (convert_to_pure_python,
+ check_in_gitignore)
def get_isafn_src_dir():
header = """\
# auto-generated by pyfnwriter.py, do not edit or commit
-from openpower.decoder.isa.caller import inject
-from openpower.decoder.helpers import (EXTS, EXTS64, EXTZ64, ROTL64, ROTL32,
- MASK, MASK32,
+from openpower.decoder.helpers import (ISACallerHelper,
ne, eq, gt, ge, lt, le, ltu, gtu, length,
- trunc_divs, trunc_rems, MULS, DIVS, MODS,
- EXTS128, undefined,
- SINGLE,
- FPADD32, FPSUB32, FPMUL32, FPDIV32,
- FPADD64, FPSUB64, FPMUL64, FPDIV64,
+ trunc_divs, trunc_rems, copy_assign_rhs,
)
from openpower.decoder.selectable_int import SelectableInt
from openpower.decoder.selectable_int import selectconcat as concat
isadir = get_isafn_src_dir()
os.makedirs(isadir, exist_ok=True)
fname = os.path.join(isadir, "%s.py" % pagename)
+ sourcecache = dict()
+ check_in_gitignore(fname)
with open(fname, "w") as f:
f.write(header % function['desc']) # write out header
# go through all instructions
pcode = function['pcode']
print(pcode)
- pycode = convert_to_pure_python(pcode)
+ # check if the code has already been compiled
+ phash = hash(pcode)
+ if phash in sourcecache:
+ pycode = sourcecache[phash]
+ else:
+ filename = os.path.join(get_isafn_dir(), pagename + ".mdwn")
+ pycode = convert_to_pure_python(pcode, True, filename=filename)
+ sourcecache[phash] = pycode
f.write(pycode)
+ def write_isa_class(self):
+ isadir = get_isafn_src_dir()
+ fname = os.path.join(isadir, "all.py")
+
+ with open(fname, "w") as f:
+ helpers = []
+ f.write('# auto-generated by pyfnwriter.py: do not edit or commit\n')
+ f.write('from openpower.decoder.helpers import ISACallerHelper\n')
+ for page in self.pages_written:
+ module = 'openpower.decoder.isafunctions.' + page
+ helper = 'ISACallerFnHelper_' + page
+ helpers.append(helper)
+ f.write('from %s import ISACallerFnHelper as %s\n' % (module, helper))
+ f.write('\n')
+ f.write('\n')
+ f.write('class ISACallerFnHelper(%s):\n' % ', '.join(helpers + ['ISACallerHelper']))
+ f.write(' pass\n')
+
def pyfnwriter():
isa = PyISAFnWriter()
print ("sources", write_isa_class, sources)
for source in sources:
isa.write_pysource(source)
+ if write_isa_class:
+ isa.write_isa_class()
if __name__ == '__main__':
pyfnwriter()