Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / api / samfe / src / ReadConfigDiag.py
CommitLineData
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"""
23import sys, types
24
25OBJECT = 'OBJECT'
26TYPE = 'TYPE'
27OTHER = 'other'
28
29PLI_SOCKET = 'pli-socket'
30
31TYPE_NIAGARA = 'niagara'
32TYPE_NIAGARA2 = 'niagara2'
33TYPE_SYS_CONFIG = 'sys_config'
34
35class 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"""
284if __name__ == "__main__":
285 """
286 """
287 # unit test here
288 import sys
289 reader = ReadConfigDiag()
290 reader.readConfig(sys.argv[1])
291 print reader