add CA/CA32 to write regs fields in parser
[soc.git] / src / soc / decoder / pseudo / pagereader.py
index 0b3a3c368323a7fefdf0851cb4a7925181bdcc42..f9e153491adb49e9d733063f74778d830200000f 100644 (file)
@@ -41,15 +41,16 @@ this translates to:
     Special Registers Altered:
     4-space-indented register description
     blank
-    blank (optional)
-
+    blank(s) (optional for convenience at end-of-page)
 """
 
 from collections import namedtuple, OrderedDict
 from copy import copy
 import os
 
-op = namedtuple("Ops", ("desc", "form", "opcode", "regs", "pcode", "sregs"))
+opfields = ("desc", "form", "opcode", "regs", "pcode", "sregs", "page")
+Ops = namedtuple("Ops", opfields)
+
 
 def get_isa_dir():
     fdir = os.path.abspath(os.path.dirname(__file__))
@@ -59,18 +60,27 @@ def get_isa_dir():
     fdir = os.path.split(fdir)[0]
     return os.path.join(fdir, "libreriscv", "openpower", "isa")
 
+
 class ISA:
 
     def __init__(self):
         self.instr = OrderedDict()
         self.forms = {}
+        self.page = {}
+        for pth in os.listdir(os.path.join(get_isa_dir())):
+            print (get_isa_dir(), pth)
+            assert pth.endswith(".mdwn"), "only %s in isa dir" % pth
+            self.read_file(pth)
 
     def read_file(self, fname):
+        pagename = fname.split('.')[0]
         fname = os.path.join(get_isa_dir(), fname)
         with open(fname) as f:
             lines = f.readlines()
         
-        d = {}
+        # set up dict with current page name
+        d = {'page': pagename}
+
         l = lines.pop(0).rstrip() # get first line
         while lines:
             print (l)
@@ -144,30 +154,31 @@ class ISA:
         opcode, regs = o[0], o[1:]
         op = copy(d)
         op['regs'] = regs
+        regs[0] = regs[0].split(",")
         op['opcode'] = opcode
-        self.instr[opcode] = op
+        self.instr[opcode] = Ops(**op)
 
         # create list of instructions by form
         form = op['form']
         fl = self.forms.get(form, [])
         self.forms[form] = fl + [opcode]
 
+        # create list of instructions by page
+        page = op['page']
+        pl = self.page.get(page, [])
+        self.page[page] = pl + [opcode]
+
     def pprint_ops(self):
         for k, v in self.instr.items():
-            print ("# %s %s" % (v['opcode'], v['desc']))
-            print ("Form: %s Regs: %s" % (v['form'], v['regs']))
-            print ('\n'.join(map(lambda x: "    %s" % x, v['pcode'])))
+            print ("# %s %s" % (v.opcode, v.desc))
+            print ("Form: %s Regs: %s" % (v.form, v.regs))
+            print ('\n'.join(map(lambda x: "    %s" % x, v.pcode)))
             print ("Specials")
-            print ('\n'.join(map(lambda x: "    %s" % x, v['sregs'])))
+            print ('\n'.join(map(lambda x: "    %s" % x, v.sregs)))
             print ()
         for k, v in isa.forms.items():
             print (k, v)
 
 if __name__ == '__main__':
     isa = ISA()
-    for pth in os.listdir(os.path.join(get_isa_dir())):
-        print (get_isa_dir(), pth)
-        assert pth.endswith(".mdwn"), "only %s in isa dir" % pth
-        isa.read_file(pth)
-
     isa.pprint_ops()