Rearrange traceflags.py so that the file generation only happens if
authorNathan Binkert <binkertn@umich.edu>
Tue, 13 Feb 2007 08:16:41 +0000 (00:16 -0800)
committerNathan Binkert <binkertn@umich.edu>
Tue, 13 Feb 2007 08:16:41 +0000 (00:16 -0800)
the script is invoked as main.  This allows us to import traceflags.py
if we just want the list of available flags.
Embed traceflags.py into the zipfile so it can be accessed from the
python side of things.  With this, print an error on invalid flags and
add --trace-help option that will print out the list of trace flags
that are compiled in.  If a flag is prefixed with a '-', now that flag
will be disabled.

--HG--
extra : convert_revision : 2260a596b07d127c582ff73474dbbdb0583db524

src/base/traceflags.py
src/python/SConscript
src/python/m5/main.py

index 800c24dee21856f4f2f317c7d0fd44d335887596..dd5ade5afb0da446f636c708910be24244ea0657 100644 (file)
 # Authors: Nathan Binkert
 #          Steve Reinhardt
 
-#
-# This file generates the header and source files for the flags
-# that control the tracing facility.
-#
-
-import sys
-
-if len(sys.argv) != 2:
-    print "%s: Need argument (basename of cc/hh files)" % sys.argv[0]
-    sys.exit(1)
-
-hhfilename = sys.argv[1] + '.hh'
-ccfilename = sys.argv[1] + '.cc'
+__all__ = [ 'allFlags', 'baseFlags', 'compoundFlagsMap', 'compoundFlags' ]
 
 #
 # The list of trace flags that can be used to condition DPRINTFs etc.
@@ -196,100 +184,98 @@ compoundFlagMap = {
     'ScsiAll'        : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ]
 }
 
-#############################################################
-#
-# Everything below this point generates the appropriate C++
-# declarations and definitions for the trace flags.  If you are simply
-# adding or modifying flag definitions, you should not have to change
-# anything below.
-#
-
-import sys
-
 # extract just the compound flag names into a list
 compoundFlags = []
 compoundFlags.extend(compoundFlagMap.keys())
 compoundFlags.sort()
 
-#
-# First generate the header file.  This defines the Flag enum
-# and some extern declarations for the .cc file.
-#
-try:
-    hhfile = file(hhfilename, 'w')
-except IOError, e:
-    sys.exit("can't open %s: %s" % (hhfilename, e))
-
-# file header boilerplate
-print >>hhfile, '''
-/*
- * DO NOT EDIT THIS FILE!
- *
- * Automatically generated from traceflags.py
- */
+allFlags = frozenset(baseFlags + compoundFlags)
 
-#ifndef __BASE_TRACE_FLAGS_HH__
-#define __BASE_TRACE_FLAGS_HH__
-
-namespace Trace {
-
-enum Flags {
-''',
-
-# Generate the enum.  Base flags come first, then compound flags.
-idx = 0
-for flag in baseFlags:
-    print >>hhfile, '    %s = %d,' % (flag, idx)
-    idx += 1
-
-numBaseFlags = idx
-print >>hhfile, '    NumFlags = %d,' % idx
-
-# put a comment in here to separate base from compound flags
-print >>hhfile, '''
-    // The remaining enum values are *not* valid indices for Trace::flags.
-    // They are "compound" flags, which correspond to sets of base
-    // flags, and are used only by TraceParamContext::setFlags().
-''',
-
-for flag in compoundFlags:
-    print >>hhfile, '    %s = %d,' % (flag, idx)
-    idx += 1
-
-numCompoundFlags = idx - numBaseFlags
-print >>hhfile, '    NumCompoundFlags = %d' % numCompoundFlags
-
-# trailer boilerplate
-print >>hhfile, '''\
-}; // enum Flags
-
-// Array of strings for SimpleEnumParam
-extern const char *flagStrings[];
-extern const int numFlagStrings;
-
-// Array of arraay pointers: for each compound flag, gives the list of
-// base flags to set.  Inidividual flag arrays are terminated by -1.
-extern const Flags *compoundFlags[];
-
-/* namespace Trace */ }
-
-#endif // __BASE_TRACE_FLAGS_HH__
-''',
-
-hhfile.close()
-
-#
-#
-# Print out .cc file with array definitions.
+#############################################################
 #
+# Everything below this point generates the appropriate C++
+# declarations and definitions for the trace flags.  If you are simply
+# adding or modifying flag definitions, you should not have to change
+# anything below.
 #
-try:
-    ccfile = file(ccfilename, 'w')
-except OSError, e:
-    sys.exit("can't open %s: %s" % (ccfilename, e))
-
-# file header
-print >>ccfile, '''
+def gen_hh(filename):
+    #
+    # First generate the header file.  This defines the Flag enum
+    # and some extern declarations for the .cc file.
+    #
+    try:
+        hhfile = file(filename, 'w')
+    except IOError, e:
+        sys.exit("can't open %s: %s" % (hhfilename, e))
+
+    # file header boilerplate
+    print >>hhfile, '''
+    /*
+     * DO NOT EDIT THIS FILE!
+     *
+     * Automatically generated from traceflags.py
+     */
+
+    #ifndef __BASE_TRACE_FLAGS_HH__
+    #define __BASE_TRACE_FLAGS_HH__
+
+    namespace Trace {
+
+    enum Flags {
+    ''',
+
+    # Generate the enum.  Base flags come first, then compound flags.
+    idx = 0
+    for flag in baseFlags:
+        print >>hhfile, '    %s = %d,' % (flag, idx)
+        idx += 1
+
+    numBaseFlags = idx
+    print >>hhfile, '    NumFlags = %d,' % idx
+
+    # put a comment in here to separate base from compound flags
+    print >>hhfile, '''
+        // The remaining enum values are *not* valid indices for Trace::flags.
+        // They are "compound" flags, which correspond to sets of base
+        // flags, and are used only by TraceParamContext::setFlags().
+    ''',
+
+    for flag in compoundFlags:
+        print >>hhfile, '    %s = %d,' % (flag, idx)
+        idx += 1
+
+    numCompoundFlags = idx - numBaseFlags
+    print >>hhfile, '    NumCompoundFlags = %d' % numCompoundFlags
+
+    # trailer boilerplate
+    print >>hhfile, '''\
+    }; // enum Flags
+
+    // Array of strings for SimpleEnumParam
+    extern const char *flagStrings[];
+    extern const int numFlagStrings;
+
+    // Array of arraay pointers: for each compound flag, gives the list of
+    // base flags to set.  Inidividual flag arrays are terminated by -1.
+    extern const Flags *compoundFlags[];
+
+    /* namespace Trace */ }
+
+    #endif // __BASE_TRACE_FLAGS_HH__
+    ''',
+
+    hhfile.close()
+
+def gen_cc(filename):
+    '''Print out .cc file with array definitions.'''
+
+    try:
+        ccfile = file(filename, 'w')
+    except OSError, e:
+        sys.exit("can't open %s: %s" % (ccfilename, e))
+
+    # file header
+    print >>ccfile, '''
 /*
  * DO NOT EDIT THIS FILE!
  *
@@ -304,45 +290,57 @@ const char *Trace::flagStrings[] =
 {
 ''',
 
-# The string array is used by SimpleEnumParam to map the strings
-# provided by the user to enum values.
-for flag in baseFlags:
-    print >>ccfile, '    "%s",' % flag
+    # The string array is used by SimpleEnumParam to map the strings
+    # provided by the user to enum values.
+    for flag in baseFlags:
+        print >>ccfile, '    "%s",' % flag
 
-for flag in compoundFlags:
-    print >>ccfile, '    "%s",' % flag
+    for flag in compoundFlags:
+        print >>ccfile, '    "%s",' % flag
 
-print >>ccfile, '};\n'
+    print >>ccfile, '};\n'
 
-numFlagStrings = len(baseFlags) + len(compoundFlags);
+    numFlagStrings = len(baseFlags) + len(compoundFlags);
 
-print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
-print >>ccfile
+    print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
+    print >>ccfile
 
-#
-# Now define the individual compound flag arrays.  There is an array
-# for each compound flag listing the component base flags.
-#
+    #
+    # Now define the individual compound flag arrays.  There is an array
+    # for each compound flag listing the component base flags.
+    #
 
-for flag in compoundFlags:
-    flags = compoundFlagMap[flag]
-    flags.append('(Flags)-1')
-    print >>ccfile, 'static const Flags %sMap[] =' % flag
-    print >>ccfile, '{ %s };' % (', '.join(flags))
-    print >>ccfile
+    for flag in compoundFlags:
+        flags = compoundFlagMap[flag]
+        flags.append('(Flags)-1')
+        print >>ccfile, 'static const Flags %sMap[] =' % flag
+        print >>ccfile, '{ %s };' % (', '.join(flags))
+        print >>ccfile
 
-#
-# Finally the compoundFlags[] array maps the compound flags
-# to their individual arrays/
-#
-print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
-print >>ccfile, '{'
+    #
+    # Finally the compoundFlags[] array maps the compound flags
+    # to their individual arrays/
+    #
+    print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
+    print >>ccfile, '{'
+
+    for flag in compoundFlags:
+        print >>ccfile, '    %sMap,' % flag
+
+    # file trailer
+    print >>ccfile, '};'
+
+    ccfile.close()
 
-for flag in compoundFlags:
-    print >>ccfile, '    %sMap,' % flag
+if __name__ == '__main__':
+    # This file generates the header and source files for the flags
+    # that control the tracing facility.
 
-# file trailer
-print >>ccfile, '};'
+    import sys
 
-ccfile.close()
+    if len(sys.argv) != 2:
+        print "%s: Need argument (basename of cc/hh files)" % sys.argv[0]
+        sys.exit(1)
 
+    gen_hh(sys.argv[1] + '.hh')
+    gen_cc(sys.argv[1] + '.cc')
index 61cab45f3d26830769e2d960a58dd5c2e2c5ae77..51271650f21ec3cc82f84855b119e5e06644d486 100644 (file)
@@ -97,6 +97,7 @@ addPkg('m5')
 pyzip_files.append('m5/defines.py')
 pyzip_files.append('m5/info.py')
 pyzip_files.append(join(env['ROOT'], 'util/pbs/jobfile.py'))
+pyzip_files.append(join(env['ROOT'], 'src/base/traceflags.py'))
 
 def swig_it(basename):
     env.Command(['swig/%s_wrap.cc' % basename, 'm5/internal/%s.py' % basename],
index d02bc466b9f234e60d34479af3b3b961590122e1..d42137264f642702bf8015fa21a1cef33bfc39a4 100644 (file)
@@ -29,6 +29,7 @@
 import code, optparse, os, socket, sys
 from datetime import datetime
 from attrdict import attrdict
+import traceflags
 
 __all__ = [ 'options', 'arguments', 'main' ]
 
@@ -40,6 +41,19 @@ The Regents of The University of Michigan
 All Rights Reserved
 '''
 
+def print_list(items, indent=4):
+    line = ' ' * indent
+    for i,item in enumerate(items):
+        if len(line) + len(item) > 76:
+            print line
+            line = ' ' * indent
+
+        if i < len(items) - 1:
+            line += '%s, ' % item
+        else:
+            line += item
+            print line
+
 # there's only one option parsing done, so make it global and add some
 # helper functions to make it work well.
 parser = optparse.OptionParser(usage=usage, version=version,
@@ -135,8 +149,10 @@ add_option("--debug-break", metavar="TIME[,TIME]", action='append', split=',',
 
 # Tracing options
 set_group("Trace Options")
+add_option("--trace-help", action='store_true',
+    help="Print help on trace flags")
 add_option("--trace-flags", metavar="FLAG[,FLAG]", action='append', split=',',
-    help="Sets the flags for tracing")
+    help="Sets the flags for tracing (-FLAG disables a flag)")
 add_option("--trace-start", metavar="TIME", type='int',
     help="Start tracing at TIME (must be in ticks)")
 add_option("--trace-file", metavar="FILE", default="cout",
@@ -231,6 +247,19 @@ def main():
         print info.RELEASE_NOTES
         print
 
+    if options.trace_help:
+        done = True
+        print "Base Flags:"
+        print_list(traceflags.baseFlags, indent=4)
+        print
+        print "Compound Flags:"
+        for flag in traceflags.compoundFlags:
+            if flag == 'All':
+                continue
+            print "    %s:" % flag
+            print_list(traceflags.compoundFlagMap[flag], indent=8)
+            print
+
     if done:
         sys.exit(0)
 
@@ -250,6 +279,7 @@ def main():
     if not arguments or not os.path.isfile(arguments[0]):
         if arguments and not os.path.isfile(arguments[0]):
             print "Script %s not found" % arguments[0]
+
         usage(2)
 
     # tell C++ about output directory
@@ -267,9 +297,28 @@ def main():
     for when in options.debug_break:
         internal.debug.schedBreakCycle(int(when))
 
+    on_flags = []
+    off_flags = []
     for flag in options.trace_flags:
+        off = False
+        if flag.startswith('-'):
+            flag = flag[1:]
+            off = True
+        if flag not in traceflags.allFlags:
+            print >>sys.stderr, "invalid trace flag '%s'" % flag
+            sys.exit(1)
+
+        if off:
+            off_flags.append(flag)
+        else:
+            on_flags.append(flag)
+
+    for flag in on_flags:
         internal.trace.set(flag)
 
+    for flag in off_flags:
+        internal.trace.clear(flag)
+
     if options.trace_start is not None:
         internal.trace.enabled = False
         def enable_trace():