add support for *_flag global variables needed by bfp_* functions
[openpower-isa.git] / src / openpower / decoder / pseudo / pyfnwriter.py
index c277b112caa9a2968000e899f5695846027de6f0..3560f782d39ceaa68341079e5e1be9cbf2e63ea1 100644 (file)
@@ -4,8 +4,9 @@ import os
 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():
@@ -17,15 +18,9 @@ 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
@@ -45,14 +40,41 @@ class PyISAFnWriter(ISAFunctions):
         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()
@@ -68,6 +90,8 @@ def pyfnwriter():
     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()