Merge zizzer.eecs.umich.edu:/bk/newmem
[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 'IQ',
113 'ISP',
114 'IdeCtrl',
115 'IdeDisk',
116 'InstExec',
117 'Interrupt',
118 'LLSC',
119 'LSQ',
120 'LSQUnit',
121 'Loader',
122 'MC146818',
123 'MMU',
124 'MSHR',
125 'Mbox',
126 'MemDepUnit',
127 'MemoryAccess',
128 'O3CPU',
129 'OzoneCPU',
130 'OzoneLSQ',
131 'PCEvent',
132 'PCIA',
133 'PCIDEV',
134 'PciConfigAll',
135 'Pipeline',
136 'Printf',
137 'Quiesce',
138 'ROB',
139 'Regs',
140 'Rename',
141 'RenameMap',
142 'SQL',
143 'Sampler',
144 'Scoreboard',
145 'ScsiCtrl',
146 'ScsiDisk',
147 'ScsiNone',
148 'Serialize',
149 'SimpleCPU',
150 'SimpleDisk',
151 'SimpleDiskData',
152 'Sparc',
153 'Split',
154 'Stack',
155 'StatEvents',
156 'Stats',
157 'StoreSet',
158 'Syscall',
159 'SyscallVerbose',
160 'TCPIP',
161 'TLB',
162 'Thread',
163 'Timer',
164 'Tsunami',
165 'Uart',
166 'VtoPhys',
167 'WriteBarrier',
168 'Writeback',
169 ]
170
171 #
172 # "Compound" flags correspond to a set of base flags. These exist
173 # solely for convenience in setting them via the command line: if a
174 # compound flag is specified, all of the corresponding base flags are
175 # set. Compound flags cannot be used directly in DPRINTFs etc.
176 # To define a new compound flag, add a new entry to this hash
177 # following the existing examples.
178 #
179 compoundFlagMap = {
180 'GDBAll' : [ 'GDBMisc', 'GDBAcc', 'GDBRead', 'GDBWrite', 'GDBSend', 'GDBRecv', 'GDBExtra' ],
181 'ScsiAll' : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ],
182 'DiskImageAll' : [ 'DiskImage', 'DiskImageRead', 'DiskImageWrite' ],
183 'EthernetAll' : [ 'Ethernet', 'EthernetPIO', 'EthernetDMA', 'EthernetData' , 'EthernetDesc', 'EthernetIntr', 'EthernetSM', 'EthernetCksum' ],
184 'EthernetNoData' : [ 'Ethernet', 'EthernetPIO', 'EthernetDesc', 'EthernetIntr', 'EthernetSM', 'EthernetCksum' ],
185 'IdeAll' : [ 'IdeCtrl', 'IdeDisk' ],
186 'O3CPUAll' : [ 'Fetch', 'Decode', 'Rename', 'IEW', 'Commit', 'IQ', 'ROB', 'FreeList', 'RenameMap', 'LSQ', 'LSQUnit', 'StoreSet', 'MemDepUnit', 'DynInst', 'FullCPU', 'O3CPU', 'Activity','Scoreboard','Writeback'],
187 'OzoneCPUAll' : [ 'BE', 'FE', 'IBE', 'OzoneLSQ', 'OzoneCPU'],
188 'All' : baseFlags
189 }
190
191 #############################################################
192 #
193 # Everything below this point generates the appropriate C++
194 # declarations and definitions for the trace flags. If you are simply
195 # adding or modifying flag definitions, you should not have to change
196 # anything below.
197 #
198
199 import sys
200
201 # extract just the compound flag names into a list
202 compoundFlags = []
203 compoundFlags.extend(compoundFlagMap.keys())
204 compoundFlags.sort()
205
206 #
207 # First generate the header file. This defines the Flag enum
208 # and some extern declarations for the .cc file.
209 #
210 try:
211 hhfile = file(hhfilename, 'w')
212 except IOError, e:
213 sys.exit("can't open %s: %s" % (hhfilename, e))
214
215 # file header boilerplate
216 print >>hhfile, '''
217 /*
218 * DO NOT EDIT THIS FILE!
219 *
220 * Automatically generated from traceflags.py
221 */
222
223 #ifndef __BASE_TRACE_FLAGS_HH__
224 #define __BASE_TRACE_FLAGS_HH__
225
226 namespace Trace {
227
228 enum Flags {
229 ''',
230
231 # Generate the enum. Base flags come first, then compound flags.
232 idx = 0
233 for flag in baseFlags:
234 print >>hhfile, ' %s = %d,' % (flag, idx)
235 idx += 1
236
237 numBaseFlags = idx
238 print >>hhfile, ' NumFlags = %d,' % idx
239
240 # put a comment in here to separate base from compound flags
241 print >>hhfile, '''
242 // The remaining enum values are *not* valid indices for Trace::flags.
243 // They are "compound" flags, which correspond to sets of base
244 // flags, and are used only by TraceParamContext::setFlags().
245 ''',
246
247 for flag in compoundFlags:
248 print >>hhfile, ' %s = %d,' % (flag, idx)
249 idx += 1
250
251 numCompoundFlags = idx - numBaseFlags
252 print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
253
254 # trailer boilerplate
255 print >>hhfile, '''\
256 }; // enum Flags
257
258 // Array of strings for SimpleEnumParam
259 extern const char *flagStrings[];
260 extern const int numFlagStrings;
261
262 // Array of arraay pointers: for each compound flag, gives the list of
263 // base flags to set. Inidividual flag arrays are terminated by -1.
264 extern const Flags *compoundFlags[];
265
266 /* namespace Trace */ }
267
268 #endif // __BASE_TRACE_FLAGS_HH__
269 ''',
270
271 hhfile.close()
272
273 #
274 #
275 # Print out .cc file with array definitions.
276 #
277 #
278 try:
279 ccfile = file(ccfilename, 'w')
280 except OSError, e:
281 sys.exit("can't open %s: %s" % (ccfilename, e))
282
283 # file header
284 print >>ccfile, '''
285 /*
286 * DO NOT EDIT THIS FILE!
287 *
288 * Automatically generated from traceflags.pl.
289 */
290
291 #include "base/traceflags.hh"
292
293 using namespace Trace;
294
295 const char *Trace::flagStrings[] =
296 {
297 ''',
298
299 # The string array is used by SimpleEnumParam to map the strings
300 # provided by the user to enum values.
301 for flag in baseFlags:
302 print >>ccfile, ' "%s",' % flag
303
304 for flag in compoundFlags:
305 print >>ccfile, ' "%s",' % flag
306
307 print >>ccfile, '};\n'
308
309 numFlagStrings = len(baseFlags) + len(compoundFlags);
310
311 print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
312 print >>ccfile
313
314 #
315 # Now define the individual compound flag arrays. There is an array
316 # for each compound flag listing the component base flags.
317 #
318
319 for flag in compoundFlags:
320 flags = compoundFlagMap[flag]
321 flags.append('(Flags)-1')
322 print >>ccfile, 'static const Flags %sMap[] =' % flag
323 print >>ccfile, '{ %s };' % (', '.join(flags))
324 print >>ccfile
325
326 #
327 # Finally the compoundFlags[] array maps the compound flags
328 # to their individual arrays/
329 #
330 print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
331 print >>ccfile, '{'
332
333 for flag in compoundFlags:
334 print >>ccfile, ' %sMap,' % flag
335
336 # file trailer
337 print >>ccfile, '};'
338
339 ccfile.close()
340