3 # Copyright (c) 2004-2005 The Regents of The University of Michigan
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.
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.
29 # Authors: Nathan Binkert
32 __all__
= [ 'allFlags', 'baseFlags', 'compoundFlagsMap', 'compoundFlags' ]
35 # The list of trace flags that can be used to condition DPRINTFs etc.
36 # To define a new flag, simply add it to this list.
174 # "Compound" flags correspond to a set of base flags. These exist
175 # solely for convenience in setting them via the command line: if a
176 # compound flag is specified, all of the corresponding base flags are
177 # set. Compound flags cannot be used directly in DPRINTFs etc.
178 # To define a new compound flag, add a new entry to this hash
179 # following the existing examples.
183 'DiskImageAll' : [ 'DiskImage', 'DiskImageRead', 'DiskImageWrite' ],
184 'EthernetAll' : [ 'Ethernet', 'EthernetPIO', 'EthernetDMA',
185 'EthernetData' , 'EthernetDesc', 'EthernetIntr',
186 'EthernetSM', 'EthernetCksum' ],
187 'EthernetNoData' : [ 'Ethernet', 'EthernetPIO', 'EthernetDesc',
188 'EthernetIntr', 'EthernetSM', 'EthernetCksum' ],
189 'Exec' : [ 'ExecEnable', 'ExecTicks', 'ExecOpClass',
190 'ExecThread', 'ExecEffAddr', 'ExecResult',
192 'GDBAll' : [ 'GDBMisc', 'GDBAcc', 'GDBRead', 'GDBWrite', 'GDBSend',
193 'GDBRecv', 'GDBExtra' ],
194 'IdeAll' : [ 'IdeCtrl', 'IdeDisk' ],
195 'O3CPUAll' : [ 'Fetch', 'Decode', 'Rename', 'IEW', 'Commit', 'IQ',
196 'ROB', 'FreeList', 'RenameMap', 'LSQ', 'LSQUnit',
197 'StoreSet', 'MemDepUnit', 'DynInst', 'FullCPU',
198 'O3CPU', 'Activity','Scoreboard','Writeback' ],
199 'OzoneCPUAll' : [ 'BE', 'FE', 'IBE', 'OzoneLSQ', 'OzoneCPU' ],
200 'ScsiAll' : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ]
203 # extract just the compound flag names into a list
205 compoundFlags
.extend(compoundFlagMap
.keys())
208 allFlags
= frozenset(baseFlags
+ compoundFlags
)
210 #############################################################
212 # Everything below this point generates the appropriate C++
213 # declarations and definitions for the trace flags. If you are simply
214 # adding or modifying flag definitions, you should not have to change
217 def gen_hh(filename
):
219 # First generate the header file. This defines the Flag enum
220 # and some extern declarations for the .cc file.
223 hhfile
= file(filename
, 'w')
225 sys
.exit("can't open %s: %s" % (hhfilename
, e
))
227 # file header boilerplate
230 * DO NOT EDIT THIS FILE!
232 * Automatically generated from traceflags.py
235 #ifndef __BASE_TRACE_FLAGS_HH__
236 #define __BASE_TRACE_FLAGS_HH__
243 # Generate the enum. Base flags come first, then compound flags.
245 for flag
in baseFlags
:
246 print >>hhfile
, ' %s = %d,' % (flag
, idx
)
250 print >>hhfile
, ' NumFlags = %d,' % idx
252 # put a comment in here to separate base from compound flags
254 // The remaining enum values are *not* valid indices for Trace::flags.
255 // They are "compound" flags, which correspond to sets of base
256 // flags, and are used only by TraceParamContext::setFlags().
259 for flag
in compoundFlags
:
260 print >>hhfile
, ' %s = %d,' % (flag
, idx
)
263 numCompoundFlags
= idx
- numBaseFlags
264 print >>hhfile
, ' NumCompoundFlags = %d' % numCompoundFlags
266 # trailer boilerplate
270 // Array of strings for SimpleEnumParam
271 extern const char *flagStrings[];
272 extern const int numFlagStrings;
274 // Array of arraay pointers: for each compound flag, gives the list of
275 // base flags to set. Inidividual flag arrays are terminated by -1.
276 extern const Flags *compoundFlags[];
278 /* namespace Trace */ }
280 #endif // __BASE_TRACE_FLAGS_HH__
285 def gen_cc(filename
):
286 '''Print out .cc file with array definitions.'''
289 ccfile
= file(filename
, 'w')
291 sys
.exit("can't open %s: %s" % (ccfilename
, e
))
296 * DO NOT EDIT THIS FILE!
298 * Automatically generated from traceflags.pl.
301 #include "base/traceflags.hh"
303 using namespace Trace;
305 const char *Trace::flagStrings[] =
309 # The string array is used by SimpleEnumParam to map the strings
310 # provided by the user to enum values.
311 for flag
in baseFlags
:
312 print >>ccfile
, ' "%s",' % flag
314 for flag
in compoundFlags
:
315 print >>ccfile
, ' "%s",' % flag
317 print >>ccfile
, '};\n'
319 numFlagStrings
= len(baseFlags
) + len(compoundFlags
);
321 print >>ccfile
, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
325 # Now define the individual compound flag arrays. There is an array
326 # for each compound flag listing the component base flags.
329 for flag
in compoundFlags
:
330 flags
= compoundFlagMap
[flag
]
331 flags
.append('(Flags)-1')
332 print >>ccfile
, 'static const Flags %sMap[] =' % flag
333 print >>ccfile
, '{ %s };' % (', '.join(flags
))
337 # Finally the compoundFlags[] array maps the compound flags
338 # to their individual arrays/
340 print >>ccfile
, 'const Flags *Trace::compoundFlags[] ='
343 for flag
in compoundFlags
:
344 print >>ccfile
, ' %sMap,' % flag
351 if __name__
== '__main__':
352 # This file generates the header and source files for the flags
353 # that control the tracing facility.
357 if len(sys
.argv
) != 2:
358 print "%s: Need argument (basename of cc/hh files)" % sys
.argv
[0]
361 gen_hh(sys
.argv
[1] + '.hh')
362 gen_cc(sys
.argv
[1] + '.cc')