read all files from openpower/isa directory successfully
[soc.git] / src / soc / decoder / pseudo / pagereader.py
1 # Reads OpenPOWER ISA pages from http://libre-riscv.org/openpower/isa
2 from collections import namedtuple, OrderedDict
3 from copy import copy
4 import os
5
6 op = namedtuple("Ops", ("desc", "form", "opcode", "regs", "pcode", "sregs"))
7
8 def get_isa_dir():
9 fdir = os.path.abspath(os.path.dirname(__file__))
10 fdir = os.path.split(fdir)[0]
11 fdir = os.path.split(fdir)[0]
12 fdir = os.path.split(fdir)[0]
13 fdir = os.path.split(fdir)[0]
14 return os.path.join(fdir, "libreriscv", "openpower", "isa")
15
16 class ISA:
17
18 def __init__(self):
19 self.instr = OrderedDict()
20
21 def read_file(self, fname):
22 fname = os.path.join(get_isa_dir(), fname)
23 with open(fname) as f:
24 lines = f.readlines()
25
26 d = {}
27 l = lines.pop(0).rstrip() # get first line
28 while lines:
29 print (l)
30 # expect get heading
31 assert l.startswith('#'), ("# not found in line %s" % l)
32 d['desc'] = l[1:].strip()
33
34 # whitespace expected
35 l = lines.pop(0).strip()
36 print (repr(l))
37 assert len(l) == 0, ("blank line not found %s" % l)
38
39 # Form expected
40 l = lines.pop(0).strip()
41 assert l.endswith('-Form'), ("line with -Form expected %s" % l)
42 d['form'] = l.split('-')[0]
43
44 # whitespace expected
45 l = lines.pop(0).strip()
46 assert len(l) == 0, ("blank line not found %s" % l)
47
48 # get list of opcodes
49 li = []
50 while True:
51 l = lines.pop(0).strip()
52 if len(l) == 0: break
53 assert l.startswith('*'), ("* not found in line %s" % l)
54 l = l[1:].split(' ') # lose star
55 l = filter(lambda x: len(x) != 0, l) # strip blanks
56 li.append(list(l))
57 opcodes = li
58
59 # get pseudocode
60 li = []
61 while True:
62 l = lines.pop(0).rstrip()
63 if len(l) == 0: break
64 assert l.startswith(' '), ("4spcs not found in line %s" % l)
65 l = l[4:] # lose 4 spaces
66 li.append(l)
67 d['pcode'] = li
68
69 # "Special Registers Altered" expected
70 l = lines.pop(0).rstrip()
71 assert l.startswith("Special"), ("special not found %s" % l)
72
73 # whitespace expected
74 l = lines.pop(0).strip()
75 assert len(l) == 0, ("blank line not found %s" % l)
76
77 # get special regs
78 li = []
79 while lines:
80 l = lines.pop(0).rstrip()
81 if len(l) == 0: break
82 assert l.startswith(' '), ("4spcs not found in line %s" % l)
83 l = l[4:] # lose 4 spaces
84 li.append(l)
85 d['sregs'] = li
86
87 # add in opcode
88 for o in opcodes:
89 opcode, regs = o[0], o[1:]
90 op = copy(d)
91 op['regs'] = regs
92 op['opcode'] = opcode
93 self.instr[opcode] = op
94
95 # expect and drop whitespace
96 while lines:
97 l = lines.pop(0).rstrip()
98 if len(l) != 0: break
99
100 def pprint_ops(self):
101 for k, v in self.instr.items():
102 print ("# %s %s" % (v['opcode'], v['desc']))
103 print ("Form: %s Regs: %s" % (v['form'], v['regs']))
104 print ('\n'.join(map(lambda x: " %s" % x, v['pcode'])))
105 print ("Specials")
106 print ('\n'.join(map(lambda x: " %s" % x, v['sregs'])))
107 print ()
108
109 if __name__ == '__main__':
110 isa = ISA()
111 for pth in os.listdir(os.path.join(get_isa_dir())):
112 print (get_isa_dir(), pth)
113 assert pth.endswith(".mdwn"), "only %s in isa dir" % pth
114 isa.read_file(pth)
115
116 isa.pprint_ops()