cleanup
[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 'All' : baseFlags,
182 'DiskImageAll' : [ 'DiskImage', 'DiskImageRead', 'DiskImageWrite' ],
183 'EthernetAll' : [ 'Ethernet', 'EthernetPIO', 'EthernetDMA',
184 'EthernetData' , 'EthernetDesc', 'EthernetIntr',
185 'EthernetSM', 'EthernetCksum' ],
186 'EthernetNoData' : [ 'Ethernet', 'EthernetPIO', 'EthernetDesc',
187 'EthernetIntr', 'EthernetSM', 'EthernetCksum' ],
188 'GDBAll' : [ 'GDBMisc', 'GDBAcc', 'GDBRead', 'GDBWrite', 'GDBSend',
189 'GDBRecv', 'GDBExtra' ],
190 'IdeAll' : [ 'IdeCtrl', 'IdeDisk' ],
191 'O3CPUAll' : [ 'Fetch', 'Decode', 'Rename', 'IEW', 'Commit', 'IQ',
192 'ROB', 'FreeList', 'RenameMap', 'LSQ', 'LSQUnit',
193 'StoreSet', 'MemDepUnit', 'DynInst', 'FullCPU',
194 'O3CPU', 'Activity','Scoreboard','Writeback' ],
195 'OzoneCPUAll' : [ 'BE', 'FE', 'IBE', 'OzoneLSQ', 'OzoneCPU' ],
196 'ScsiAll' : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ]
197 }
198
199 #############################################################
200 #
201 # Everything below this point generates the appropriate C++
202 # declarations and definitions for the trace flags. If you are simply
203 # adding or modifying flag definitions, you should not have to change
204 # anything below.
205 #
206
207 import sys
208
209 # extract just the compound flag names into a list
210 compoundFlags = []
211 compoundFlags.extend(compoundFlagMap.keys())
212 compoundFlags.sort()
213
214 #
215 # First generate the header file. This defines the Flag enum
216 # and some extern declarations for the .cc file.
217 #
218 try:
219 hhfile = file(hhfilename, 'w')
220 except IOError, e:
221 sys.exit("can't open %s: %s" % (hhfilename, e))
222
223 # file header boilerplate
224 print >>hhfile, '''
225 /*
226 * DO NOT EDIT THIS FILE!
227 *
228 * Automatically generated from traceflags.py
229 */
230
231 #ifndef __BASE_TRACE_FLAGS_HH__
232 #define __BASE_TRACE_FLAGS_HH__
233
234 namespace Trace {
235
236 enum Flags {
237 ''',
238
239 # Generate the enum. Base flags come first, then compound flags.
240 idx = 0
241 for flag in baseFlags:
242 print >>hhfile, ' %s = %d,' % (flag, idx)
243 idx += 1
244
245 numBaseFlags = idx
246 print >>hhfile, ' NumFlags = %d,' % idx
247
248 # put a comment in here to separate base from compound flags
249 print >>hhfile, '''
250 // The remaining enum values are *not* valid indices for Trace::flags.
251 // They are "compound" flags, which correspond to sets of base
252 // flags, and are used only by TraceParamContext::setFlags().
253 ''',
254
255 for flag in compoundFlags:
256 print >>hhfile, ' %s = %d,' % (flag, idx)
257 idx += 1
258
259 numCompoundFlags = idx - numBaseFlags
260 print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
261
262 # trailer boilerplate
263 print >>hhfile, '''\
264 }; // enum Flags
265
266 // Array of strings for SimpleEnumParam
267 extern const char *flagStrings[];
268 extern const int numFlagStrings;
269
270 // Array of arraay pointers: for each compound flag, gives the list of
271 // base flags to set. Inidividual flag arrays are terminated by -1.
272 extern const Flags *compoundFlags[];
273
274 /* namespace Trace */ }
275
276 #endif // __BASE_TRACE_FLAGS_HH__
277 ''',
278
279 hhfile.close()
280
281 #
282 #
283 # Print out .cc file with array definitions.
284 #
285 #
286 try:
287 ccfile = file(ccfilename, 'w')
288 except OSError, e:
289 sys.exit("can't open %s: %s" % (ccfilename, e))
290
291 # file header
292 print >>ccfile, '''
293 /*
294 * DO NOT EDIT THIS FILE!
295 *
296 * Automatically generated from traceflags.pl.
297 */
298
299 #include "base/traceflags.hh"
300
301 using namespace Trace;
302
303 const char *Trace::flagStrings[] =
304 {
305 ''',
306
307 # The string array is used by SimpleEnumParam to map the strings
308 # provided by the user to enum values.
309 for flag in baseFlags:
310 print >>ccfile, ' "%s",' % flag
311
312 for flag in compoundFlags:
313 print >>ccfile, ' "%s",' % flag
314
315 print >>ccfile, '};\n'
316
317 numFlagStrings = len(baseFlags) + len(compoundFlags);
318
319 print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
320 print >>ccfile
321
322 #
323 # Now define the individual compound flag arrays. There is an array
324 # for each compound flag listing the component base flags.
325 #
326
327 for flag in compoundFlags:
328 flags = compoundFlagMap[flag]
329 flags.append('(Flags)-1')
330 print >>ccfile, 'static const Flags %sMap[] =' % flag
331 print >>ccfile, '{ %s };' % (', '.join(flags))
332 print >>ccfile
333
334 #
335 # Finally the compoundFlags[] array maps the compound flags
336 # to their individual arrays/
337 #
338 print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
339 print >>ccfile, '{'
340
341 for flag in compoundFlags:
342 print >>ccfile, ' %sMap,' % flag
343
344 # file trailer
345 print >>ccfile, '};'
346
347 ccfile.close()
348