summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Binkert <nate@binkert.org>2008-10-06 09:31:51 -0700
committerNathan Binkert <nate@binkert.org>2008-10-06 09:31:51 -0700
commit6b2bb53fd6e59dee0c5524029c9422e2885d00d2 (patch)
tree92ba72ce2be4f57ff49bb46b8c54717772eef19b
parent6c046a28dc6624f57655e5106568721972cbae1e (diff)
downloadgem5-6b2bb53fd6e59dee0c5524029c9422e2885d00d2.tar.xz
python: cleanup options parsing stuff so that it properly deals with defaults.
While we're at it, make it possible to run main.py in a somewhat standalone mode again so that we can test things without compiling.
-rw-r--r--src/python/m5/main.py57
-rw-r--r--src/python/m5/options.py39
2 files changed, 52 insertions, 44 deletions
diff --git a/src/python/m5/main.py b/src/python/m5/main.py
index 1e217715c..66a422efa 100644
--- a/src/python/m5/main.py
+++ b/src/python/m5/main.py
@@ -34,9 +34,7 @@ import sys
from util import attrdict
import config
-import defines
from options import OptionParser
-import traceflags
__all__ = [ 'options', 'arguments', 'main' ]
@@ -132,7 +130,6 @@ add_option("--list-sim-objects", action='store_true', default=False,
help="List all built-in SimObjects, their parameters and default values")
def main():
- import defines
import event
import info
import internal
@@ -176,6 +173,8 @@ def main():
done = False
if options.build_info:
+ import defines
+
done = True
print 'Build information:'
print
@@ -217,6 +216,8 @@ def main():
print
if options.trace_help:
+ import traceflags
+
done = True
print "Base Flags:"
print_list(traceflags.baseFlags, indent=4)
@@ -297,27 +298,30 @@ 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)
+ if options.trace_flags:
+ import traceflags
+
+ 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)
- for flag in on_flags:
- internal.trace.set(flag)
+ if off:
+ off_flags.append(flag)
+ else:
+ on_flags.append(flag)
- for flag in off_flags:
- internal.trace.clear(flag)
+ for flag in on_flags:
+ internal.trace.set(flag)
+
+ for flag in off_flags:
+ internal.trace.clear(flag)
if options.trace_start:
def enable_trace():
@@ -358,7 +362,14 @@ def main():
if __name__ == '__main__':
from pprint import pprint
- parse_args()
+ # load the options.py config file to allow people to set their own
+ # default options
+ options_file = config.get('options.py')
+ if options_file:
+ scope = { 'options' : options }
+ execfile(options_file, scope)
+
+ arguments = options.parse_args()
print 'opts:'
pprint(options, indent=4)
diff --git a/src/python/m5/options.py b/src/python/m5/options.py
index 50eea429c..1f534a314 100644
--- a/src/python/m5/options.py
+++ b/src/python/m5/options.py
@@ -28,7 +28,6 @@
import optparse
import sys
-import util
from optparse import *
@@ -45,19 +44,20 @@ class splitter(object):
else:
dest.extend(values)
-class OptionParser(object):
+class OptionParser(dict):
def __init__(self, *args, **kwargs):
kwargs.setdefault('formatter', optparse.TitledHelpFormatter())
self._optparse = optparse.OptionParser(*args, **kwargs)
self._optparse.disable_interspersed_args()
self._allopts = {}
- self._defaults = {}
- self._options = util.attrdict()
# current option group
self._group = self._optparse
+ def set_defaults(self, *args, **kwargs):
+ return self._optparse.set_defaults(*args, **kwargs)
+
def set_group(self, *args, **kwargs):
'''set the current option group'''
if not args and not kwargs:
@@ -78,16 +78,11 @@ class OptionParser(object):
kwargs['action'] = 'callback'
kwargs['callback'] = splitter(split)
- default = kwargs.pop('default', nodefault)
option = self._group.add_option(*args, **kwargs)
dest = option.dest
if dest not in self._allopts:
self._allopts[dest] = option
- if default != nodefault:
- if dest not in self._options:
- self._options[dest] = default
-
return option
def bool_option(self, name, default, help):
@@ -113,28 +108,30 @@ class OptionParser(object):
def __getattr__(self, attr):
if attr.startswith('_'):
- return super(OptionParser, self).__getattr__(attr)
+ return super(OptionParser, self).__getattribute__(attr)
- if attr in self._options:
- return self._options[attr]
+ if attr in self:
+ return self[attr]
- raise AttributeError, "Option %s not found" % attr
+ return super(OptionParser, self).__getattribute__(attr)
def __setattr__(self, attr, value):
if attr.startswith('_'):
- return super(OptionParser, self).__setattr__(attr, value)
-
- if attr in self._options:
- self._options[attr] = value
-
- return super(OptionParser, self).__setattr__(attr, value)
+ super(OptionParser, self).__setattr__(attr, value)
+ elif attr in self._allopts:
+ defaults = { attr : value }
+ self.set_defaults(**defaults)
+ if attr in self:
+ self[attr] = value
+ else:
+ super(OptionParser, self).__setattr__(attr, value)
def parse_args(self):
opts,args = self._optparse.parse_args()
for key,val in opts.__dict__.iteritems():
- if val is not None or key not in self._options:
- self._options[key] = val
+ if val is not None or key not in self:
+ self[key] = val
return args