make sv_analysys python2 compatible
[libreriscv.git] / openpower / sv_analysis.py
1 #!/usr/bin/env python3
2 import csv
3 import os
4 from os.path import dirname, join
5 from glob import glob
6 from collections import OrderedDict
7
8
9 def find_wiki_file(name):
10 filedir = os.path.dirname(os.path.abspath(__file__))
11 tabledir = join(filedir, 'isatables')
12 file_path = join(tabledir, name)
13 return file_path
14
15 def get_csv(name):
16 file_path = find_wiki_file(name)
17 with open(file_path, 'r') as csvfile:
18 reader = csv.DictReader(csvfile)
19 return list(reader)
20
21 def blank_key(row):
22 #for v in row.values():
23 # if 'SPR' in v: # skip all SPRs
24 # return True
25 for v in row.values():
26 if v:
27 return False
28 return True
29
30 def isreg(field):
31 return field.startswith('R') or field.startswith('FR')
32
33
34 keycolumns = ['in1', 'in2', 'in3', 'out', 'CR in', 'CR out',
35 'ldst len'] # don't think we need these: , 'rc', 'lk']
36
37 def create_key(row):
38 res = OrderedDict()
39 #print ("row", row)
40 for key in keycolumns:
41 # registers IN
42 if key in ['in1', 'in2', 'in3']:
43 # TODO: replace this with a counter row['in']
44 # will need row['in'] initialising to 0 *outside* of the for-loop
45 if isreg(row[key]):
46 res[key] = 'R'
47 else:
48 res[key] = '0'
49 # registers OUT
50 if key == 'out':
51 if isreg(row[key]):
52 res[key] = 'R'
53 else:
54 res[key] = '0'
55 # CRs
56 if key.startswith('CR'):
57 if row[key].startswith('NONE'):
58 res[key] = '0'
59 else:
60 res[key] = '1'
61 # LDST len
62 if key.startswith('ldst'):
63 if row[key].startswith('NONE'):
64 res[key] = '0'
65 else:
66 res[key] = '1'
67 # rc, lk
68 if key in ['rc', 'lk']:
69 if row[key] == 'ONE':
70 res[key] = '1'
71 elif row[key] == 'NONE':
72 res[key] = '0'
73 else:
74 res[key] = 'R'
75 if key == 'lk':
76 res[key] = row[key]
77
78 return res
79
80 def dformat(d):
81 res = []
82 for k, v in d.items():
83 res.append("%s: %s" % (k, v))
84 return ' '.join(res)
85
86 def tformat(d):
87 return ' | '.join(d) + "|"
88
89
90 def process_csvs():
91 csvs = {}
92 bykey = {}
93 primarykeys = set()
94 dictkeys = OrderedDict()
95
96 pth = find_wiki_file("*.csv")
97 for fname in glob(pth):
98 if 'valid' in fname:
99 continue
100 if 'test' in fname:
101 continue
102 if 'sprs' in fname:
103 continue
104 #print (fname)
105 csvname = os.path.split(fname)[1]
106 csv = get_csv(fname)
107 csvs[fname] = csv
108 for row in csv:
109 if blank_key(row):
110 continue
111 dkey = create_key(row)
112 key = tuple(dkey.values())
113 dictkeys[key] = dkey
114 primarykeys.add(key)
115 if key not in bykey:
116 bykey[key] = []
117 bykey[key].append((csvname, row['opcode'], row['comment'],
118 row['form'].upper() + '-Form'))
119
120 primarykeys = list(primarykeys)
121 primarykeys.sort()
122
123 print ("# keys")
124 print ('')
125 print ('[[!table data="""')
126 print (tformat(keycolumns)) # TODO use alternative here which has
127 # 'in' rather than in1, in2, in3
128
129 for key in primarykeys:
130 print (tformat(dictkeys[key].values()))
131 print ('"""]]')
132 print ('')
133
134 for key in primarykeys:
135 print ("## %s " % dformat(dictkeys[key]))
136 print ('')
137 print ('[[!table data="""')
138 print (tformat(['CSV', 'opcode', 'asm', 'form']))
139 rows = bykey[key]
140 rows.sort()
141 for row in rows:
142 print (tformat(row))
143 print ('"""]]')
144 print ('')
145
146 bykey = {}
147 for fname, csv in csvs.items():
148 key
149
150 if __name__ == '__main__':
151 process_csvs()