if referred to through GPR (GPR[RA]), add to read_regs in parser
[soc.git] / src / soc / decoder / pseudo / pagereader.py
index a95824811089848da555e0b2405989c58f523bad..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,22 +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)
@@ -148,21 +154,27 @@ 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)