Sorta working add instruction
[soc.git] / src / soc / decoder / pseudo / pywriter.py
index 88746e28d9ae1ad045f9f4d6d84cdef4446cdea6..a9f58acd536f094c67f3ec6c7e67970ca3301cb3 100644 (file)
@@ -3,26 +3,23 @@
 import os
 from soc.decoder.pseudo.pagereader import ISA
 from soc.decoder.power_pseudo import convert_to_python
+from soc.decoder.orderedset import OrderedSet
+from soc.decoder.isa.caller import create_args
 
 def get_isasrc_dir():
     fdir = os.path.abspath(os.path.dirname(__file__))
     fdir = os.path.split(fdir)[0]
     return os.path.join(fdir, "isa")
 
-def create_args(reglist, extra=None):
-    args = set()
-    for reg in reglist:
-        args.add(reg)
-    args = list(args)
-    if extra:
-        args = [extra] + args
-    return ', '.join(args)
 
 header = """\
 # auto-generated by pywriter.py, do not edit or commit
 
-from soc.decoder.isa import ISACaller
+from soc.decoder.isa.caller import ISACaller, inject
 from soc.decoder.helpers import (EXTS64, EXTZ64, ROTL64, ROTL32, MASK,)
+from soc.decoder.selectable_int import SelectableInt
+from soc.decoder.selectable_int import selectconcat as concat
+from soc.decoder.orderedset import OrderedSet
 
 class %s(ISACaller):
 
@@ -47,13 +44,14 @@ class PyISAWriter(ISA):
                 print (pcode)
                 pycode, rused = convert_to_python(pcode)
                 # create list of arguments to call
-                regs = rused['read_regs'] + rused['uninit_regs']
-                args = create_args(regs, 'self')
+                regs = list(rused['read_regs']) + list(rused['uninit_regs'])
+                args = ', '.join(create_args(regs, 'self'))
                 # create list of arguments to return
-                retargs = create_args(rused['write_regs'])
+                retargs = ', '.join(create_args(rused['write_regs']))
                 # write out function.  pre-pend "op_" because some instrs are
                 # also python keywords (cmp).  also replace "." with "_"
                 op_fname ="op_%s" % page.replace(".", "_")
+                f.write("    @inject(self.namespace)\n")
                 f.write("    def %s(%s):\n" % (op_fname, args))
                 pycode = pycode.split("\n")
                 pycode = '\n'.join(map(lambda x: "        %s" % x, pycode))
@@ -64,7 +62,7 @@ class PyISAWriter(ISA):
                 else:
                     f.write("\n")
                 # accumulate the instruction info
-                iinfo = "(%s, %s, %s, %s)" % \
+                iinfo = "(%s, %s,\n                %s, %s)" % \
                             (op_fname, rused['read_regs'],
                             rused['uninit_regs'], rused['write_regs'])
                 iinf += "    instrs['%s'] = %s\n" % (page, iinfo)
@@ -74,5 +72,9 @@ class PyISAWriter(ISA):
 
 if __name__ == '__main__':
     isa = PyISAWriter()
+    isa.write_pysource('fixedlogical')
+    exit(0)
+    isa.write_pysource('fixedstore')
+    isa.write_pysource('fixedload')
     isa.write_pysource('comparefixed')
     isa.write_pysource('fixedarith')