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