import os
opfields = ("desc", "form", "opcode", "regs", "pcode", "sregs", "page")
-op = namedtuple("Ops", opfields)
+Ops = namedtuple("Ops", opfields)
def get_isa_dir():
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)
+ 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
while lines:
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:
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)