Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | # ========== Copyright Header Begin ========================================== |
2 | # | |
3 | # OpenSPARC T2 Processor File: ReadConfigDiag.py | |
4 | # Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. | |
5 | # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES. | |
6 | # | |
7 | # The above named program is free software; you can redistribute it and/or | |
8 | # modify it under the terms of the GNU General Public | |
9 | # License version 2 as published by the Free Software Foundation. | |
10 | # | |
11 | # The above named program is distributed in the hope that it will be | |
12 | # useful, but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | # General Public License for more details. | |
15 | # | |
16 | # You should have received a copy of the GNU General Public | |
17 | # License along with this work; if not, write to the Free Software | |
18 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. | |
19 | # | |
20 | # ========== Copyright Header End ============================================ | |
21 | """handle riesling frontend's '-c config' option | |
22 | """ | |
23 | import sys, types | |
24 | ||
25 | OBJECT = 'OBJECT' | |
26 | TYPE = 'TYPE' | |
27 | OTHER = 'other' | |
28 | ||
29 | PLI_SOCKET = 'pli-socket' | |
30 | ||
31 | TYPE_NIAGARA = 'niagara' | |
32 | TYPE_NIAGARA2 = 'niagara2' | |
33 | TYPE_SYS_CONFIG = 'sys_config' | |
34 | ||
35 | class ReadConfigDiag: | |
36 | """handle -c config option | |
37 | """ | |
38 | ||
39 | def __init__ (self): | |
40 | """ | |
41 | """ | |
42 | # data[objType][objId][dataType] | |
43 | self.data = { } | |
44 | # object[objId] = data[objType][objId] | |
45 | self.object = { } | |
46 | self.count = { } | |
47 | ||
48 | ||
49 | def __str__ (self): | |
50 | """ | |
51 | """ | |
52 | #buffer = [ '-----ReadConfigDiag.py-----\n' ] | |
53 | buffer = [ ] | |
54 | klist1 = self.data.keys() | |
55 | klist1.sort() | |
56 | for tkey in klist1: | |
57 | #for tkey in self.data.keys(): | |
58 | klist2 = self.data[tkey].keys() | |
59 | klist2.sort() | |
60 | for okey in klist2: | |
61 | #for okey in self.data[tkey].keys(): | |
62 | buffer.append('%s %s %s %s {\n' % (OBJECT, okey, TYPE, tkey)) | |
63 | klist3 = self.data[tkey][okey].keys() | |
64 | klist3.sort() | |
65 | for ikey in klist3: | |
66 | buffer.append('\t%s : %s\n' % (ikey, self.data[tkey][okey][ikey])) | |
67 | buffer.append('}\n') | |
68 | return ''.join(buffer) | |
69 | ||
70 | ||
71 | def readConfig (self, fname): | |
72 | """ | |
73 | """ | |
74 | try: | |
75 | self.fd = open(fname, 'r') | |
76 | line = self.fd.readline() | |
77 | while line: | |
78 | if line.startswith(OBJECT): | |
79 | self.readObject(line) | |
80 | else: | |
81 | if line.strip(): | |
82 | self.data[OTHER].append(line) | |
83 | # next line | |
84 | line = self.fd.readline() | |
85 | self.fd.close() | |
86 | except IOError, (errno, strerror): | |
87 | print "readConfig : (%s): %s %s" % (errno, strerror,fname) | |
88 | except: | |
89 | raise | |
90 | ||
91 | ||
92 | def readObject (self, line): | |
93 | """read an OBJECT description of format like: | |
94 | OBJECT th00 TYPE niagara2 { | |
95 | ... | |
96 | } | |
97 | """ | |
98 | tokens = line.split() | |
99 | if (not tokens[0] == OBJECT) or (not tokens[2] == TYPE): | |
100 | raise RuntimeError, 'ERROR: wrong format %s' % (line) | |
101 | else: | |
102 | key = tokens[1] | |
103 | type = tokens[3] | |
104 | if not self.data.has_key(type): | |
105 | self.data[type] = { } | |
106 | self.count[type] = 0 | |
107 | ||
108 | if self.data[type].has_key(key): | |
109 | raise RuntimeError, 'ERROR: %s already defined in %s' % (key, type) | |
110 | else: | |
111 | self.count[type] += 1 | |
112 | self.data[type][key] = { } | |
113 | line = self.fd.readline() | |
114 | while line.strip() != '}': | |
115 | if line.strip(): | |
116 | i = line.find(':') | |
117 | if i > -1: | |
118 | kword = line[:i].strip() | |
119 | value = line[i+1:].strip() | |
120 | self.data[type][key][kword] = value | |
121 | else: | |
122 | # a continue data from previous line | |
123 | self.data[type][key][kword] += ' ' + line.strip() | |
124 | line = self.fd.readline() | |
125 | # when done with the object, create a shortcut | |
126 | self.object[key] = self.data[type][key] | |
127 | ||
128 | ||
129 | def getCount (self, type): | |
130 | """ | |
131 | """ | |
132 | if self.count.has_key(type): | |
133 | return self.count[type] | |
134 | else: | |
135 | return 0 | |
136 | ||
137 | ||
138 | def getObjTypes (self): | |
139 | """return a list of object types available in the configuration | |
140 | """ | |
141 | return self.data.keys() | |
142 | ||
143 | ||
144 | def getObjIds (self, objType, silent=0): | |
145 | """return a list of object ids of the specified type | |
146 | """ | |
147 | try: | |
148 | return self.data[objType].keys() | |
149 | except Exception, ex: | |
150 | if not silent: | |
151 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword (%s), ex=%s\n' % (objType, ex)) | |
152 | return [] | |
153 | ||
154 | ||
155 | def getObjKeys (self, objType, objId, silent=0): | |
156 | """return a list of data keywords of the specified object type+id | |
157 | """ | |
158 | try: | |
159 | return self.data[objType][objId].keys() | |
160 | except Exception, ex: | |
161 | if not silent: | |
162 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objType, objId, ex)) | |
163 | return [] | |
164 | ||
165 | ||
166 | def getObjData (self, objType, objId, key, silent=0): | |
167 | """return the data field of the specified object type+id+keyword | |
168 | """ | |
169 | try: | |
170 | data = self.data[objType][objId][key] | |
171 | if data.startswith('[') and data.endswith(']'): | |
172 | data = self.convertList(data[1:-1]) | |
173 | return data | |
174 | except Exception, ex: | |
175 | if not silent: | |
176 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s,%s), ex=%s\n' % (objType, objId, key, ex)) | |
177 | return None | |
178 | ||
179 | ||
180 | def getData (self, objId, key, silent=0): | |
181 | """return the data field of the specified object id+keyword | |
182 | """ | |
183 | try: | |
184 | data = self.object[objId][key] | |
185 | if data.startswith('[') and data.endswith(']'): | |
186 | data = self.convertList(data[1:-1]) | |
187 | return data | |
188 | except Exception, ex: | |
189 | if not silent: | |
190 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objId, key, ex)) | |
191 | return None | |
192 | ||
193 | ||
194 | def setDataLine (self, line): | |
195 | """ | |
196 | @conf.mom0.setvar= "THREAD_BASED_STAT=1" | |
197 | @conf.swvmem0.good_trap = get_addr('\.TRAPS\.T0_GoodTrap_0x100') | |
198 | => eval'ed value | |
199 | @conf.mom0.start_cycle= 1 | |
200 | """ | |
201 | AT_CONF = '@conf.' | |
202 | SETVAR = 'setvar' | |
203 | if line.startswith(AT_CONF): | |
204 | #sys.stderr.write('DBX: ReadConfigDiag: @conf: %s\n' % (line)) | |
205 | append = 0 | |
206 | line = line[len(AT_CONF):] | |
207 | i = line.find('.') | |
208 | objId = line[:i] | |
209 | j = line.find('=+', i) | |
210 | if j > -1: | |
211 | append = 1 | |
212 | else: | |
213 | j = line.find('=', i) | |
214 | key = line[i+1:j].strip() | |
215 | if key == SETVAR: | |
216 | # "key=value" | |
217 | if append == 0: | |
218 | expr = line[j+1:].strip() | |
219 | else: | |
220 | expr = line[j+2:].strip() | |
221 | # strip " | |
222 | expr = expr[1:-1] | |
223 | k = expr.find('=') | |
224 | key = expr[:k].strip() | |
225 | value = expr[k+1:].strip() | |
226 | else: | |
227 | if append == 0: | |
228 | value = line[j+1:].strip() | |
229 | else: | |
230 | value = line[j+2:].strip() | |
231 | ||
232 | self.setData(objId, key, value, append=append) | |
233 | ||
234 | else: | |
235 | sys.stderr.write('WARNING: ReadConfigDiag: wrong %s syntax <%s>\n' % (AT_CONF, line)) | |
236 | ||
237 | ||
238 | def setData (self, objId, key, value, append=0): | |
239 | """ | |
240 | """ | |
241 | #sys.stderr.write('DBX: ReadConfigDiag: objId=%s, key=%s, value=%s, append=%s\n' % (objId, key, value, append)) | |
242 | ||
243 | if not self.object.has_key(objId): | |
244 | # OBJECT config0 TYPE sys_config { | |
245 | # # a default system config to store basic system config info | |
246 | # } | |
247 | if not self.data.has_key(TYPE_SYS_CONFIG): | |
248 | self.data[TYPE_SYS_CONFIG] = { } | |
249 | self.count[TYPE_SYS_CONFIG] = 0 | |
250 | ||
251 | self.count[TYPE_SYS_CONFIG] += 1 | |
252 | self.data[TYPE_SYS_CONFIG][objId] = { } | |
253 | self.object[objId] = self.data[TYPE_SYS_CONFIG][objId] | |
254 | ||
255 | try: | |
256 | if self.object[objId].has_key(key) and append == 0: | |
257 | sys.stderr.write('WARNING: ReadConfigDiag: overwrite (%s,%s)=%s, new value=%s\n' % (objId, key, self.object[objId][key], value)) | |
258 | if append == 0: | |
259 | self.object[objId][key] = value | |
260 | else: | |
261 | if not self.object[objId].has_key(key): | |
262 | self.object[objId][key] = [ ] | |
263 | self.object[objId][key].append(value) | |
264 | except Exception, ex: | |
265 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objId, key, ex)) | |
266 | ||
267 | ||
268 | def convertList(self, data): | |
269 | """convert string (of list syntax) to real list | |
270 | """ | |
271 | #sys.stderr.write('#DBX: data=%s\n' % (data)) #DBX | |
272 | tokens = data.split(',') | |
273 | datalist = [] | |
274 | for token in tokens: | |
275 | token = token.strip().strip("'") | |
276 | #sys.stderr.write('#DBX: token=%s\n' % (token)) #DBX | |
277 | datalist.append(token) | |
278 | #sys.stderr.write('#DBX: datalist=%s\n' % (datalist)) #DBX | |
279 | return datalist | |
280 | ||
281 | ||
282 | """self-testing | |
283 | """ | |
284 | if __name__ == "__main__": | |
285 | """ | |
286 | """ | |
287 | # unit test here | |
288 | import sys | |
289 | reader = ReadConfigDiag() | |
290 | reader.readConfig(sys.argv[1]) | |
291 | print reader |