Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / src / nas,5.n2.os.2 / pfe / samfe / ReadConfigDiag.py
CommitLineData
86530b38
AT
1"""handle riesling frontend's '-c config' option
2"""
3import sys, types
4
5OBJECT = 'OBJECT'
6TYPE = 'TYPE'
7OTHER = 'other'
8
9PLI_SOCKET = 'pli-socket'
10
11TYPE_NIAGARA = 'niagara'
12TYPE_NIAGARA2 = 'niagara2'
13TYPE_SYS_CONFIG = 'sys_config'
14
15class ReadConfigDiag:
16 """handle -c config option
17 """
18
19 def __init__ (self):
20 """
21 """
22 # data[objType][objId][dataType]
23 self.data = { }
24 # object[objId] = data[objType][objId]
25 self.object = { }
26 self.count = { }
27
28
29 def __str__ (self):
30 """
31 """
32 #buffer = [ '-----ReadConfigDiag.py-----\n' ]
33 buffer = [ ]
34 klist1 = self.data.keys()
35 klist1.sort()
36 for tkey in klist1:
37 #for tkey in self.data.keys():
38 klist2 = self.data[tkey].keys()
39 klist2.sort()
40 for okey in klist2:
41 #for okey in self.data[tkey].keys():
42 buffer.append('%s %s %s %s {\n' % (OBJECT, okey, TYPE, tkey))
43 klist3 = self.data[tkey][okey].keys()
44 klist3.sort()
45 for ikey in klist3:
46 buffer.append('\t%s : %s\n' % (ikey, self.data[tkey][okey][ikey]))
47 buffer.append('}\n')
48 return ''.join(buffer)
49
50
51 def readConfig (self, fname):
52 """
53 """
54 try:
55 self.fd = open(fname, 'r')
56 line = self.fd.readline()
57 while line:
58 if line.startswith(OBJECT):
59 self.readObject(line)
60 else:
61 if line.strip():
62 self.data[OTHER].append(line)
63 # next line
64 line = self.fd.readline()
65 self.fd.close()
66 except IOError, (errno, strerror):
67 print "readConfig : (%s): %s %s" % (errno, strerror,fname)
68 except:
69 raise
70
71
72 def readObject (self, line):
73 """read an OBJECT description of format like:
74 OBJECT th00 TYPE niagara2 {
75 ...
76 }
77 """
78 tokens = line.split()
79 if (not tokens[0] == OBJECT) or (not tokens[2] == TYPE):
80 raise RuntimeError, 'ERROR: wrong format %s' % (line)
81 else:
82 key = tokens[1]
83 type = tokens[3]
84 if not self.data.has_key(type):
85 self.data[type] = { }
86 self.count[type] = 0
87
88 if self.data[type].has_key(key):
89 raise RuntimeError, 'ERROR: %s already defined in %s' % (key, type)
90 else:
91 self.count[type] += 1
92 self.data[type][key] = { }
93 line = self.fd.readline()
94 while line.strip() != '}':
95 if line.strip():
96 i = line.find(':')
97 if i > -1:
98 kword = line[:i].strip()
99 value = line[i+1:].strip()
100 self.data[type][key][kword] = value
101 else:
102 # a continue data from previous line
103 self.data[type][key][kword] += ' ' + line.strip()
104 line = self.fd.readline()
105 # when done with the object, create a shortcut
106 self.object[key] = self.data[type][key]
107
108
109 def getCount (self, type):
110 """
111 """
112 if self.count.has_key(type):
113 return self.count[type]
114 else:
115 return 0
116
117
118 def getObjTypes (self):
119 """return a list of object types available in the configuration
120 """
121 return self.data.keys()
122
123
124 def getObjIds (self, objType, silent=0):
125 """return a list of object ids of the specified type
126 """
127 try:
128 return self.data[objType].keys()
129 except Exception, ex:
130 if not silent:
131 sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword (%s), ex=%s\n' % (objType, ex))
132 return []
133
134
135 def getObjKeys (self, objType, objId, silent=0):
136 """return a list of data keywords of the specified object type+id
137 """
138 try:
139 return self.data[objType][objId].keys()
140 except Exception, ex:
141 if not silent:
142 sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objType, objId, ex))
143 return []
144
145
146 def getObjData (self, objType, objId, key, silent=0):
147 """return the data field of the specified object type+id+keyword
148 """
149 try:
150 data = self.data[objType][objId][key]
151 if data.startswith('[') and data.endswith(']'):
152 data = self.convertList(data[1:-1])
153 return data
154 except Exception, ex:
155 if not silent:
156 sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s,%s), ex=%s\n' % (objType, objId, key, ex))
157 return None
158
159
160 def getData (self, objId, key, silent=0):
161 """return the data field of the specified object id+keyword
162 """
163 try:
164 data = self.object[objId][key]
165 if data.startswith('[') and data.endswith(']'):
166 data = self.convertList(data[1:-1])
167 return data
168 except Exception, ex:
169 if not silent:
170 sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objId, key, ex))
171 return None
172
173
174 def setDataLine (self, line):
175 """
176 @conf.mom0.setvar= "THREAD_BASED_STAT=1"
177 @conf.swvmem0.good_trap = get_addr('\.TRAPS\.T0_GoodTrap_0x100')
178 => eval'ed value
179 @conf.mom0.start_cycle= 1
180 """
181 AT_CONF = '@conf.'
182 SETVAR = 'setvar'
183 if line.startswith(AT_CONF):
184 #sys.stderr.write('DBX: ReadConfigDiag: @conf: %s\n' % (line))
185 append = 0
186 line = line[len(AT_CONF):]
187 i = line.find('.')
188 objId = line[:i]
189 j = line.find('=+', i)
190 if j > -1:
191 append = 1
192 else:
193 j = line.find('=', i)
194 key = line[i+1:j].strip()
195 if key == SETVAR:
196 # "key=value"
197 if append == 0:
198 expr = line[j+1:].strip()
199 else:
200 expr = line[j+2:].strip()
201 # strip "
202 expr = expr[1:-1]
203 k = expr.find('=')
204 key = expr[:k].strip()
205 value = expr[k+1:].strip()
206 else:
207 if append == 0:
208 value = line[j+1:].strip()
209 else:
210 value = line[j+2:].strip()
211
212 self.setData(objId, key, value, append=append)
213
214 else:
215 sys.stderr.write('WARNING: ReadConfigDiag: wrong %s syntax <%s>\n' % (AT_CONF, line))
216
217
218 def setData (self, objId, key, value, append=0):
219 """
220 """
221 #sys.stderr.write('DBX: ReadConfigDiag: objId=%s, key=%s, value=%s, append=%s\n' % (objId, key, value, append))
222
223 if not self.object.has_key(objId):
224 # OBJECT config0 TYPE sys_config {
225 # # a default system config to store basic system config info
226 # }
227 if not self.data.has_key(TYPE_SYS_CONFIG):
228 self.data[TYPE_SYS_CONFIG] = { }
229 self.count[TYPE_SYS_CONFIG] = 0
230
231 self.count[TYPE_SYS_CONFIG] += 1
232 self.data[TYPE_SYS_CONFIG][objId] = { }
233 self.object[objId] = self.data[TYPE_SYS_CONFIG][objId]
234
235 try:
236 if self.object[objId].has_key(key) and append == 0:
237 sys.stderr.write('WARNING: ReadConfigDiag: overwrite (%s,%s)=%s, new value=%s\n' % (objId, key, self.object[objId][key], value))
238 if append == 0:
239 self.object[objId][key] = value
240 else:
241 if not self.object[objId].has_key(key):
242 self.object[objId][key] = [ ]
243 self.object[objId][key].append(value)
244 except Exception, ex:
245 sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objId, key, ex))
246
247
248 def convertList(self, data):
249 """convert string (of list syntax) to real list
250 """
251 #sys.stderr.write('#DBX: data=%s\n' % (data)) #DBX
252 tokens = data.split(',')
253 datalist = []
254 for token in tokens:
255 token = token.strip().strip("'")
256 #sys.stderr.write('#DBX: token=%s\n' % (token)) #DBX
257 datalist.append(token)
258 #sys.stderr.write('#DBX: datalist=%s\n' % (datalist)) #DBX
259 return datalist
260
261
262"""self-testing
263"""
264if __name__ == "__main__":
265 """
266 """
267 # unit test here
268 import sys
269 reader = ReadConfigDiag()
270 reader.readConfig(sys.argv[1])
271 print reader