add example on how to access regs list for cmp
[soc.git] / src / soc / decoder / pseudo / pagereader.py
index 9914a8155ee3cef86683cb603588d2d66840208e..a5d05cc53eb51fdc4a63263bf2181f164d416282 100644 (file)
@@ -49,7 +49,7 @@ from copy import copy
 import os
 
 opfields = ("desc", "form", "opcode", "regs", "pcode", "sregs", "page")
-op = namedtuple("Ops", opfields)
+Ops = namedtuple("Ops", opfields)
 
 
 def get_isa_dir():
@@ -66,30 +66,118 @@ 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)
+            print(get_isa_dir(), pth)
+            if "swp" in pth:
+                continue
             assert pth.endswith(".mdwn"), "only %s in isa dir" % pth
             self.read_file(pth)
+            continue
+            # code which helped add in the keyword "Pseudo-code:" automatically
+            rewrite = self.read_file_for_rewrite(pth)
+            name = os.path.join("/tmp", pth)
+            with open(name, "w") as f:
+                f.write('\n'.join(rewrite) + '\n')
+
+    def read_file_for_rewrite(self, fname):
+        pagename = fname.split('.')[0]
+        fname = os.path.join(get_isa_dir(), fname)
+        with open(fname) as f:
+            lines = f.readlines()
+        rewrite = []
+
+        l = lines.pop(0).rstrip()  # get first line
+        rewrite.append(l)
+        while lines:
+            print(l)
+            # expect get heading
+            assert l.startswith('#'), ("# not found in line %s" % l)
+
+            # whitespace expected
+            l = lines.pop(0).strip()
+            print(repr(l))
+            assert len(l) == 0, ("blank line not found %s" % l)
+            rewrite.append(l)
+
+            # Form expected
+            l = lines.pop(0).strip()
+            assert l.endswith('-Form'), ("line with -Form expected %s" % l)
+            rewrite.append(l)
+
+            # whitespace expected
+            l = lines.pop(0).strip()
+            assert len(l) == 0, ("blank line not found %s" % l)
+            rewrite.append(l)
+
+            # get list of opcodes
+            while True:
+                l = lines.pop(0).strip()
+                rewrite.append(l)
+                if len(l) == 0:
+                    break
+                assert l.startswith('*'), ("* not found in line %s" % l)
+
+            rewrite.append("Pseudo-code:")
+            rewrite.append("")
+            # get pseudocode
+            while True:
+                l = lines.pop(0).rstrip()
+                rewrite.append(l)
+                if len(l) == 0:
+                    break
+                assert l.startswith('    '), ("4spcs not found in line %s" % l)
+
+            # "Special Registers Altered" expected
+            l = lines.pop(0).rstrip()
+            assert l.startswith("Special"), ("special not found %s" % l)
+            rewrite.append(l)
+
+            # whitespace expected
+            l = lines.pop(0).strip()
+            assert len(l) == 0, ("blank line not found %s" % l)
+            rewrite.append(l)
+
+            # get special regs
+            while lines:
+                l = lines.pop(0).rstrip()
+                rewrite.append(l)
+                if len(l) == 0:
+                    break
+                assert l.startswith('    '), ("4spcs not found in line %s" % l)
+
+            # expect and drop whitespace
+            while lines:
+                l = lines.pop(0).rstrip()
+                rewrite.append(l)
+                if len(l) != 0:
+                    break
+
+        return rewrite
 
     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()
-        
+
         # set up dict with current page name
-        d = {'pagename': pagename}
+        d = {'page': pagename}
+
+        # line-by-line lexer/parser, quite straightforward: pops one
+        # line off the list and checks it.  nothing complicated needed,
+        # all sections are mandatory so no need for a full LALR parser.
 
-        l = lines.pop(0).rstrip() # get first line
+        l = lines.pop(0).rstrip()  # get first line
         while lines:
-            print (l)
+            print(l)
             # expect get heading
             assert l.startswith('#'), ("# not found in line %s" % l)
             d['desc'] = l[1:].strip()
 
             # whitespace expected
             l = lines.pop(0).strip()
-            print (repr(l))
+            print(repr(l))
             assert len(l) == 0, ("blank line not found %s" % l)
 
             # Form expected
@@ -105,20 +193,31 @@ class ISA:
             li = []
             while True:
                 l = lines.pop(0).strip()
-                if len(l) == 0: break
+                if len(l) == 0:
+                    break
                 assert l.startswith('*'), ("* not found in line %s" % l)
-                l = l[1:].split(' ') # lose star
-                l = filter(lambda x: len(x) != 0, l) # strip blanks
+                l = l[1:].split(' ')  # lose star
+                l = filter(lambda x: len(x) != 0, l)  # strip blanks
                 li.append(list(l))
             opcodes = li
 
+            # "Pseudocode" expected
+            l = lines.pop(0).rstrip()
+            assert l.startswith("Pseudo-code:"), ("pseudocode found %s" % l)
+
+            # whitespace expected
+            l = lines.pop(0).strip()
+            print(repr(l))
+            assert len(l) == 0, ("blank line not found %s" % l)
+
             # get pseudocode
             li = []
             while True:
                 l = lines.pop(0).rstrip()
-                if len(l) == 0: break
+                if len(l) == 0:
+                    break
                 assert l.startswith('    '), ("4spcs not found in line %s" % l)
-                l = l[4:] # lose 4 spaces
+                l = l[4:]  # lose 4 spaces
                 li.append(l)
             d['pcode'] = li
 
@@ -134,9 +233,10 @@ class ISA:
             li = []
             while lines:
                 l = lines.pop(0).rstrip()
-                if len(l) == 0: break
+                if len(l) == 0:
+                    break
                 assert l.startswith('    '), ("4spcs not found in line %s" % l)
-                l = l[4:] # lose 4 spaces
+                l = l[4:]  # lose 4 spaces
                 li.append(l)
             d['sregs'] = li
 
@@ -147,31 +247,42 @@ class ISA:
             # expect and drop whitespace
             while lines:
                 l = lines.pop(0).rstrip()
-                if len(l) != 0: break
+                if len(l) != 0:
+                    break
 
     def add_op(self, o, d):
         opcode, regs = o[0], o[1:]
         op = copy(d)
         op['regs'] = regs
+        if len(regs) != 0:
+            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 ("Specials")
-            print ('\n'.join(map(lambda x: "    %s" % x, v['sregs'])))
-            print ()
+            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()
         for k, v in isa.forms.items():
-            print (k, v)
+            print(k, v)
+
 
 if __name__ == '__main__':
     isa = ISA()
     isa.pprint_ops()
+    # example on how to access cmp regs:
+    print ("cmp regs:", isa.instr["cmp"].regs)