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__))
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)
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()