ARM: Seperate the queues of L1 and L2 walker states.
[gem5.git] / src / SConscript
index 42e002310b049a0b8ec01a2f1124c8f001a2a270..5879fbc937dd0145eb90b0fe06a28535254a3fec 100644 (file)
@@ -49,7 +49,7 @@ Import('*')
 # Children need to see the environment
 Export('env')
 
-build_env = dict([(opt, env[opt]) for opt in export_vars])
+build_env = [(opt, env[opt]) for opt in export_vars]
 
 ########################################################################
 # Code for adding source files of various types
@@ -88,7 +88,7 @@ class SourceFile(object):
 
         for base in type(self).__mro__:
             if issubclass(base, SourceFile):
-                bisect.insort_right(base.all, self)       
+                base.all.append(self)
 
     def __lt__(self, other): return self.filename < other.filename
     def __le__(self, other): return self.filename <= other.filename
@@ -132,15 +132,15 @@ class PySource(SourceFile):
         modpath = '.'.join(modpath)
 
         arcpath = path + [ self.basename ]
-        debugname = self.snode.abspath
-        if not exists(debugname):
-            debugname = self.tnode.abspath
+        abspath = self.snode.abspath
+        if not exists(abspath):
+            abspath = self.tnode.abspath
 
         self.package = package
         self.modname = modname
         self.modpath = modpath
         self.arcname = joinpath(*arcpath)
-        self.debugname = debugname
+        self.abspath = abspath
         self.compiled = File(self.filename + 'c')
         self.assembly = File(self.filename + '.s')
         self.symname = "PyEMB_" + PySource.invalid_sym_char.sub('_', modpath)
@@ -228,9 +228,6 @@ env.Append(CPPPATH=Dir('.'))
 for extra_dir in extras_dir_list:
     env.Append(CPPPATH=Dir(extra_dir))
 
-# Add a flag defining what THE_ISA should be for all compilation
-env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
-
 # Workaround for bug in SCons version > 0.97d20071212
 # Scons bug id: 2006 M5 Bug id: 308 
 for root, dirs, files in os.walk(base_dir, topdown=True):
@@ -261,11 +258,38 @@ for extra_dir in extras_dir_list:
 for opt in export_vars:
     env.ConfigFile(opt)
 
+def makeTheISA(source, target, env):
+    f = file(str(target[0]), 'w')
+
+    isas = [ src.get_contents() for src in source ]
+    target = env['TARGET_ISA']
+    def define(isa):
+        return isa.upper() + '_ISA'
+    
+    def namespace(isa):
+        return isa[0].upper() + isa[1:].lower() + 'ISA' 
+
+
+    print >>f, '#ifndef __CONFIG_THE_ISA_HH__'
+    print >>f, '#define __CONFIG_THE_ISA_HH__'
+    print >>f
+    for i,isa in enumerate(isas):
+        print >>f, '#define %s %d' % (define(isa), i + 1)
+    print >>f
+    print >>f, '#define THE_ISA %s' % (define(target))
+    print >>f, '#define TheISA %s' % (namespace(target))
+    print >>f
+    print >>f, '#endif // __CONFIG_THE_ISA_HH__'  
+
+env.Command('config/the_isa.hh', map(Value, all_isa_list), makeTheISA)
+
 ########################################################################
 #
 # Prevent any SimObjects from being added after this point, they
 # should all have been added in the SConscripts above
 #
+SimObject.fixed = True
+
 class DictImporter(object):
     '''This importer takes a dictionary of arbitrary module names that
     map to arbitrary filenames.'''
@@ -283,7 +307,7 @@ class DictImporter(object):
         self.installed = set()
 
     def find_module(self, fullname, path):
-        if fullname == 'defines':
+        if fullname == 'm5.defines':
             return self
 
         if fullname == 'm5.objects':
@@ -293,7 +317,7 @@ class DictImporter(object):
             return None
 
         source = self.modules.get(fullname, None)
-        if source is not None and exists(source.snode.abspath):
+        if source is not None and fullname.startswith('m5.objects'):
             return self
 
         return None
@@ -308,28 +332,31 @@ class DictImporter(object):
             mod.__path__ = fullname.split('.')
             return mod
 
-        if fullname == 'defines':
-            mod.__dict__['buildEnv'] = build_env
+        if fullname == 'm5.defines':
+            mod.__dict__['buildEnv'] = m5.util.SmartDict(build_env)
             return mod
 
         source = self.modules[fullname]
         if source.modname == '__init__':
             mod.__path__ = source.modpath
-        mod.__file__ = source.snode.abspath
+        mod.__file__ = source.abspath
 
-        exec file(source.snode.abspath, 'r') in mod.__dict__
+        exec file(source.abspath, 'r') in mod.__dict__
 
         return mod
 
+import m5.SimObject
+import m5.params
+
+m5.SimObject.clear()
+m5.params.clear()
+
 # install the python importer so we can grab stuff from the source
 # tree itself.  We can't have SimObjects added after this point or
 # else we won't know about them for the rest of the stuff.
-SimObject.fixed = True
 importer = DictImporter(PySource.modules)
 sys.meta_path[0:0] = [ importer ]
 
-import m5
-
 # import all sim objects so we can populate the all_objects list
 # make sure that we're working with a list, then let's sort it
 for modname in SimObject.modnames:
@@ -346,6 +373,12 @@ all_enums = m5.params.allEnums
 all_params = {}
 for name,obj in sorted(sim_objects.iteritems()):
     for param in obj._params.local.values():
+        # load the ptype attribute now because it depends on the
+        # current version of SimObject.allClasses, but when scons
+        # actually uses the value, all versions of
+        # SimObject.allClasses will have been loaded
+        param.ptype
+
         if not hasattr(param, 'swig_decl'):
             continue
         pname = param.ptype_str
@@ -365,13 +398,27 @@ depends = [ PySource.modules[dep].tnode for dep in module_depends ]
 #
 
 # Generate Python file containing a dict specifying the current
-# build_env flags.
+# buildEnv flags.
 def makeDefinesPyFile(target, source, env):
-    f = file(str(target[0]), 'w')
     build_env, hg_info = [ x.get_contents() for x in source ]
-    print >>f, "buildEnv = %s" % build_env
-    print >>f, "hgRev = '%s'" % hg_info
-    f.close()
+
+    code = m5.util.code_formatter()
+    code("""
+import m5.internal
+import m5.util
+
+buildEnv = m5.util.SmartDict($build_env)
+hgRev = '$hg_info'
+
+compileDate = m5.internal.core.compileDate
+_globals = globals()
+for key,val in m5.internal.core.__dict__.iteritems():
+    if key.startswith('flag_'):
+        flag = key[5:]
+        _globals[flag] = val
+del _globals
+""")
+    code.write(str(target[0]))
 
 defines_info = [ Value(build_env), Value(env['HG_INFO']) ]
 # Generate a file with all of the compile options in it
@@ -467,12 +514,7 @@ for name,simobj in sorted(sim_objects.iteritems()):
 # Generate any parameter header files needed
 params_i_files = []
 for name,param in all_params.iteritems():
-    if isinstance(param, m5.params.VectorParamDesc):
-        ext = 'vptype'
-    else:
-        ext = 'ptype'
-
-    i_file = File('params/%s_%s.i' % (name, ext))
+    i_file = File('params/%s_%s.i' % (name, param.file_ext))
     params_i_files.append(i_file)
     env.Command(i_file, Value(name), createSwigParam)
     env.Depends(i_file, depends)
@@ -850,7 +892,7 @@ def objectifyPyFile(target, source, env):
     dst = file(str(target[0]), 'w')
 
     pysource = PySource.tnodes[source[0]]
-    compiled = compile(src, pysource.debugname, 'exec')
+    compiled = compile(src, pysource.abspath, 'exec')
     marshalled = marshal.dumps(compiled)
     compressed = zlib.compress(marshalled)
     data = compressed
@@ -887,12 +929,17 @@ def pythonInit(target, source, env):
     dst = file(str(target[0]), 'w')
 
     def dump_mod(sym, endchar=','):
+        def c_str(string):
+            if string is None:
+                return "0"
+            return '"%s"' % string
         pysource = PySource.symnames[sym]
-        print >>dst, '    { "%s",' % pysource.arcname
-        print >>dst, '      "%s",' % pysource.modpath
-        print >>dst, '       %s_beg, %s_end,' % (sym, sym)
-        print >>dst, '       %s_end - %s_beg,' % (sym, sym)
-        print >>dst, '       *(int *)%s_end }%s'  % (sym, endchar)
+        print >>dst, '    { %s,' % c_str(pysource.arcname)
+        print >>dst, '      %s,' % c_str(pysource.abspath)
+        print >>dst, '      %s,' % c_str(pysource.modpath)
+        print >>dst, '      %s_beg, %s_end,' % (sym, sym)
+        print >>dst, '      %s_end - %s_beg,' % (sym, sym)
+        print >>dst, '      *(int *)%s_end }%s'  % (sym, endchar)
     
     print >>dst, '#include "sim/init.hh"'
 
@@ -911,7 +958,7 @@ def pythonInit(target, source, env):
             # Skip the importer since we've already exported it
             continue
         dump_mod(sym)
-    print >>dst, "    { 0, 0, 0, 0, 0, 0 }"
+    print >>dst, "    { 0, 0, 0, 0, 0, 0, 0 }"
     print >>dst, "};"
 
 
@@ -984,7 +1031,7 @@ def makeEnv(label, objsfx, strip = False, **kwargs):
     static_objs.append(static_date)
     
     shared_date = make_obj(date_source, static=False, extra_deps=shared_objs)
-    shared_objs.append(static_date)
+    shared_objs.append(shared_date)
 
     # First make a library of everything but main() so other programs can
     # link against m5.