Many more fixes for SPARC_FS. Gets us to the point where SOFTINT starts
[gem5.git] / src / base / traceflags.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2004-2005 The Regents of The University of Michigan
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are
8 # met: redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer;
10 # redistributions in binary form must reproduce the above copyright
11 # notice, this list of conditions and the following disclaimer in the
12 # documentation and/or other materials provided with the distribution;
13 # neither the name of the copyright holders nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #
29 # Authors: Nathan Binkert
30 # Steve Reinhardt
31
32 #
33 # This file generates the header and source files for the flags
34 # that control the tracing facility.
35 #
36
37 import sys
38
39 if len(sys.argv) != 2:
40 print "%s: Need argument (basename of cc/hh files)" % sys.argv[0]
41 sys.exit(1)
42
43 hhfilename = sys.argv[1] + '.hh'
44 ccfilename = sys.argv[1] + '.cc'
45
46 #
47 # The list of trace flags that can be used to condition DPRINTFs etc.
48 # To define a new flag, simply add it to this list.
49 #
50 baseFlags = [
51 'Activity',
52 'AlphaConsole',
53 'Annotate',
54 'BADADDR',
55 'BE',
56 'BPredRAS',
57 'Bus',
58 'BusAddrRanges',
59 'BusBridge',
60 'Cache',
61 'CachePort',
62 'Chains',
63 'Checker',
64 'Clock',
65 'Commit',
66 'CommitRate',
67 'Config',
68 'Console',
69 'ConsolePoll',
70 'ConsoleVerbose',
71 'Context',
72 'Cycle',
73 'DMA',
74 'DMAReadVerbose',
75 'DMAWriteVerbose',
76 'DebugPrintf',
77 'Decode',
78 'DiskImage',
79 'DiskImageRead',
80 'DiskImageWrite',
81 'DynInst',
82 'Ethernet',
83 'EthernetCksum',
84 'EthernetDMA',
85 'EthernetData',
86 'EthernetDesc',
87 'EthernetEEPROM',
88 'EthernetIntr',
89 'EthernetPIO',
90 'EthernetSM',
91 'Event',
92 'FE',
93 'Fault',
94 'Fetch',
95 'Flow',
96 'FreeList',
97 'FullCPU',
98 'FunctionalAccess',
99 'GDBAcc',
100 'GDBExtra',
101 'GDBMisc',
102 'GDBRead',
103 'GDBRecv',
104 'GDBSend',
105 'GDBWrite',
106 'HWPrefetch',
107 'IBE',
108 'IEW',
109 'IIC',
110 'IICMore',
111 'IPI',
112 'IPR',
113 'IQ',
114 'ISP',
115 'IdeCtrl',
116 'IdeDisk',
117 'InstExec',
118 'Interrupt',
119 'LLSC',
120 'LSQ',
121 'LSQUnit',
122 'Loader',
123 'MC146818',
124 'MMU',
125 'MSHR',
126 'Mbox',
127 'MemDepUnit',
128 'MemoryAccess',
129 'O3CPU',
130 'OzoneCPU',
131 'OzoneLSQ',
132 'PCEvent',
133 'PCIA',
134 'PCIDEV',
135 'PciConfigAll',
136 'Pipeline',
137 'Printf',
138 'Quiesce',
139 'ROB',
140 'Regs',
141 'Rename',
142 'RenameMap',
143 'SQL',
144 'Sampler',
145 'Scoreboard',
146 'ScsiCtrl',
147 'ScsiDisk',
148 'ScsiNone',
149 'Serialize',
150 'SimpleCPU',
151 'SimpleDisk',
152 'SimpleDiskData',
153 'Sparc',
154 'Split',
155 'Stack',
156 'StatEvents',
157 'Stats',
158 'StoreSet',
159 'Syscall',
160 'SyscallVerbose',
161 'TCPIP',
162 'TLB',
163 'Thread',
164 'Timer',
165 'Tsunami',
166 'Uart',
167 'VtoPhys',
168 'WriteBarrier',
169 'Writeback',
170 ]
171
172 #
173 # "Compound" flags correspond to a set of base flags. These exist
174 # solely for convenience in setting them via the command line: if a
175 # compound flag is specified, all of the corresponding base flags are
176 # set. Compound flags cannot be used directly in DPRINTFs etc.
177 # To define a new compound flag, add a new entry to this hash
178 # following the existing examples.
179 #
180 compoundFlagMap = {
181 'GDBAll' : [ 'GDBMisc', 'GDBAcc', 'GDBRead', 'GDBWrite', 'GDBSend', 'GDBRecv', 'GDBExtra' ],
182 'ScsiAll' : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ],
183 'DiskImageAll' : [ 'DiskImage', 'DiskImageRead', 'DiskImageWrite' ],
184 'EthernetAll' : [ 'Ethernet', 'EthernetPIO', 'EthernetDMA', 'EthernetData' , 'EthernetDesc', 'EthernetIntr', 'EthernetSM', 'EthernetCksum' ],
185 'EthernetNoData' : [ 'Ethernet', 'EthernetPIO', 'EthernetDesc', 'EthernetIntr', 'EthernetSM', 'EthernetCksum' ],
186 'IdeAll' : [ 'IdeCtrl', 'IdeDisk' ],
187 'O3CPUAll' : [ 'Fetch', 'Decode', 'Rename', 'IEW', 'Commit', 'IQ', 'ROB', 'FreeList', 'RenameMap', 'LSQ', 'LSQUnit', 'StoreSet', 'MemDepUnit', 'DynInst', 'FullCPU', 'O3CPU', 'Activity','Scoreboard','Writeback'],
188 'OzoneCPUAll' : [ 'BE', 'FE', 'IBE', 'OzoneLSQ', 'OzoneCPU'],
189 'All' : baseFlags
190 }
191
192 #############################################################
193 #
194 # Everything below this point generates the appropriate C++
195 # declarations and definitions for the trace flags. If you are simply
196 # adding or modifying flag definitions, you should not have to change
197 # anything below.
198 #
199
200 import sys
201
202 # extract just the compound flag names into a list
203 compoundFlags = []
204 compoundFlags.extend(compoundFlagMap.keys())
205 compoundFlags.sort()
206
207 #
208 # First generate the header file. This defines the Flag enum
209 # and some extern declarations for the .cc file.
210 #
211 try:
212 hhfile = file(hhfilename, 'w')
213 except IOError, e:
214 sys.exit("can't open %s: %s" % (hhfilename, e))
215
216 # file header boilerplate
217 print >>hhfile, '''
218 /*
219 * DO NOT EDIT THIS FILE!
220 *
221 * Automatically generated from traceflags.py
222 */
223
224 #ifndef __BASE_TRACE_FLAGS_HH__
225 #define __BASE_TRACE_FLAGS_HH__
226
227 namespace Trace {
228
229 enum Flags {
230 ''',
231
232 # Generate the enum. Base flags come first, then compound flags.
233 idx = 0
234 for flag in baseFlags:
235 print >>hhfile, ' %s = %d,' % (flag, idx)
236 idx += 1
237
238 numBaseFlags = idx
239 print >>hhfile, ' NumFlags = %d,' % idx
240
241 # put a comment in here to separate base from compound flags
242 print >>hhfile, '''
243 // The remaining enum values are *not* valid indices for Trace::flags.
244 // They are "compound" flags, which correspond to sets of base
245 // flags, and are used only by TraceParamContext::setFlags().
246 ''',
247
248 for flag in compoundFlags:
249 print >>hhfile, ' %s = %d,' % (flag, idx)
250 idx += 1
251
252 numCompoundFlags = idx - numBaseFlags
253 print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
254
255 # trailer boilerplate
256 print >>hhfile, '''\
257 }; // enum Flags
258
259 // Array of strings for SimpleEnumParam
260 extern const char *flagStrings[];
261 extern const int numFlagStrings;
262
263 // Array of arraay pointers: for each compound flag, gives the list of
264 // base flags to set. Inidividual flag arrays are terminated by -1.
265 extern const Flags *compoundFlags[];
266
267 /* namespace Trace */ }
268
269 #endif // __BASE_TRACE_FLAGS_HH__
270 ''',
271
272 hhfile.close()
273
274 #
275 #
276 # Print out .cc file with array definitions.
277 #
278 #
279 try:
280 ccfile = file(ccfilename, 'w')
281 except OSError, e:
282 sys.exit("can't open %s: %s" % (ccfilename, e))
283
284 # file header
285 print >>ccfile, '''
286 /*
287 * DO NOT EDIT THIS FILE!
288 *
289 * Automatically generated from traceflags.pl.
290 */
291
292 #include "base/traceflags.hh"
293
294 using namespace Trace;
295
296 const char *Trace::flagStrings[] =
297 {
298 ''',
299
300 # The string array is used by SimpleEnumParam to map the strings
301 # provided by the user to enum values.
302 for flag in baseFlags:
303 print >>ccfile, ' "%s",' % flag
304
305 for flag in compoundFlags:
306 print >>ccfile, ' "%s",' % flag
307
308 print >>ccfile, '};\n'
309
310 numFlagStrings = len(baseFlags) + len(compoundFlags);
311
312 print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
313 print >>ccfile
314
315 #
316 # Now define the individual compound flag arrays. There is an array
317 # for each compound flag listing the component base flags.
318 #
319
320 for flag in compoundFlags:
321 flags = compoundFlagMap[flag]
322 flags.append('(Flags)-1')
323 print >>ccfile, 'static const Flags %sMap[] =' % flag
324 print >>ccfile, '{ %s };' % (', '.join(flags))
325 print >>ccfile
326
327 #
328 # Finally the compoundFlags[] array maps the compound flags
329 # to their individual arrays/
330 #
331 print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
332 print >>ccfile, '{'
333
334 for flag in compoundFlags:
335 print >>ccfile, ' %sMap,' % flag
336
337 # file trailer
338 print >>ccfile, '};'
339
340 ccfile.close()
341