Link in Python interpreter.
Use embedded zip archive to carry Python code instead
of homegrown embedded string/file mechanism.
Do argument parsing in Python instead of C++.
SConstruct:
Add Python interpreter include path & library.
Define two new simple builders which copy &
concatenate files, respectively, for use by
the Python embedded zipfile code.
src/SConscript:
Encapsulate environment creation in a function.
Add code to append Python zip archive to final executable.
Eliminate references to obsolete files.
src/python/SConscript:
Rewrite to generate embedded zip archive of Python code
(replacing old "embedded string" mechanism).
src/python/m5/__init__.py:
Move main arg-parsing loop here (out of C++ main()).
src/python/m5/config.py:
Minor fix (version incompatibility?).
src/sim/main.cc:
Invoke embedded Python interpreter to parse args
and generate config.ini, replacing C++ arg parsing code.
--HG--
extra : convert_revision : 72d21236b2bee139ff39ba4cf031a4a1f8560029
This commit is contained in:
@@ -24,7 +24,53 @@
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import sys, os
|
||||
import sys, os, time
|
||||
|
||||
import __main__
|
||||
|
||||
briefCopyright = '''
|
||||
Copyright (c) 2001-2006
|
||||
The Regents of The University of Michigan
|
||||
All Rights Reserved
|
||||
'''
|
||||
|
||||
fullCopyright = '''
|
||||
Copyright (c) 2001-2006
|
||||
The Regents of The University of Michigan
|
||||
All Rights Reserved
|
||||
|
||||
Permission is granted to use, copy, create derivative works and
|
||||
redistribute this software and such derivative works for any purpose,
|
||||
so long as the copyright notice above, this grant of permission, and
|
||||
the disclaimer below appear in all copies made; and so long as the
|
||||
name of The University of Michigan is not used in any advertising or
|
||||
publicity pertaining to the use or distribution of this software
|
||||
without specific, written prior authorization.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE
|
||||
UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND WITHOUT
|
||||
WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER EXPRESS OR
|
||||
IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE REGENTS OF
|
||||
THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE FOR ANY DAMAGES,
|
||||
INCLUDING DIRECT, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR IN CONNECTION
|
||||
WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS HEREAFTER
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
'''
|
||||
|
||||
def sayHello(f):
|
||||
print >> f, "M5 Simulator System"
|
||||
print >> f, briefCopyright
|
||||
print >> f, "M5 compiled on", __main__.compileDate
|
||||
hostname = os.environ.get('HOSTNAME')
|
||||
if not hostname:
|
||||
hostname = os.environ.get('HOST')
|
||||
if hostname:
|
||||
print >> f, "M5 executing on", hostname
|
||||
print >> f, "M5 simulation started", time.ctime()
|
||||
|
||||
sayHello(sys.stderr)
|
||||
|
||||
# define this here so we can use it right away if necessary
|
||||
def panic(string):
|
||||
@@ -72,3 +118,63 @@ from config import *
|
||||
# import the built-in object definitions
|
||||
from objects import *
|
||||
|
||||
|
||||
args_left = sys.argv[1:]
|
||||
configfile_found = False
|
||||
|
||||
while args_left:
|
||||
arg = args_left.pop(0)
|
||||
if arg.startswith('--'):
|
||||
# if arg starts with '--', parse as a special python option
|
||||
# of the format --<python var>=<string value>
|
||||
try:
|
||||
(var, val) = arg.split('=', 1)
|
||||
except ValueError:
|
||||
panic("Could not parse configuration argument '%s'\n"
|
||||
"Expecting --<variable>=<value>\n" % arg);
|
||||
eval("%s = %s" % (var, repr(val)))
|
||||
elif arg.startswith('-'):
|
||||
# if the arg starts with '-', it should be a simulator option
|
||||
# with a format similar to getopt.
|
||||
optchar = arg[1]
|
||||
if len(arg) > 2:
|
||||
args_left.insert(0, arg[2:])
|
||||
if optchar == 'd':
|
||||
outdir = args_left.pop(0)
|
||||
elif optchar == 'h':
|
||||
showBriefHelp(sys.stderr)
|
||||
sys.exit(1)
|
||||
elif optchar == 'E':
|
||||
env_str = args_left.pop(0)
|
||||
split_result = env_str.split('=', 1)
|
||||
var = split_result[0]
|
||||
if len(split_result == 2):
|
||||
val = split_result[1]
|
||||
else:
|
||||
val = True
|
||||
env[var] = val
|
||||
elif optchar == 'I':
|
||||
AddToPath(args_left.pop(0))
|
||||
elif optchar == 'P':
|
||||
eval(args_left.pop(0))
|
||||
else:
|
||||
showBriefHelp(sys.stderr)
|
||||
panic("invalid argument '%s'\n" % arg_str)
|
||||
else:
|
||||
# In any other case, treat the option as a configuration file
|
||||
# name and load it.
|
||||
if not arg.endswith('.py'):
|
||||
panic("Config file '%s' must end in '.py'\n" % arg)
|
||||
configfile_found = True
|
||||
m5execfile(arg, globals())
|
||||
|
||||
|
||||
if not configfile_found:
|
||||
panic("no configuration file specified!")
|
||||
|
||||
if globals().has_key('root') and isinstance(root, Root):
|
||||
sys.stdout = file('config.ini', 'w')
|
||||
instantiate(root)
|
||||
else:
|
||||
print 'Instantiation skipped: no root object found.'
|
||||
|
||||
|
||||
@@ -794,7 +794,7 @@ class ParamFactory(object):
|
||||
|
||||
# E.g., Param.Int(5, "number of widgets")
|
||||
def __call__(self, *args, **kwargs):
|
||||
caller_frame = inspect.stack()[1][0]
|
||||
caller_frame = inspect.currentframe().f_back
|
||||
ptype = None
|
||||
try:
|
||||
ptype = eval(self.ptype_str,
|
||||
|
||||
Reference in New Issue
Block a user