From: Andreas Hansson Date: Tue, 2 Dec 2014 11:08:22 +0000 (-0500) Subject: scons: Ensure dictionary iteration is sorted by key X-Git-Tag: stable_2015_04_15~83 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=966c3f4bc5581347a411c25db1440afb97f12dab;p=gem5.git scons: Ensure dictionary iteration is sorted by key This patch adds sorting based on the SimObject name or parameter name for all situations where we iterate over dictionaries. This should ensure a deterministic and consistent order across the host systems and hopefully avoid regression results differing across python versions. --- diff --git a/SConstruct b/SConstruct index 8fb649143..c811598e3 100755 --- a/SConstruct +++ b/SConstruct @@ -216,7 +216,7 @@ use_prefixes = [ ] use_env = {} -for key,val in os.environ.iteritems(): +for key,val in sorted(os.environ.iteritems()): if key in use_vars or \ any([key.startswith(prefix) for prefix in use_prefixes]): use_env[key] = val diff --git a/src/SConscript b/src/SConscript index 85bebc3ca..f85ed7a62 100755 --- a/src/SConscript +++ b/src/SConscript @@ -528,6 +528,7 @@ for name,obj in sorted(sim_objects.iteritems()): # module_depends = ["m5", "m5.SimObject", "m5.params"] depends = [ PySource.modules[dep].snode for dep in module_depends ] +depends.sort(key = lambda x: x.name) ######################################################################## # @@ -717,7 +718,7 @@ if GetOption('with_cxx_config'): env.Command(cxx_config_init_cc_file, Value(name), MakeAction(createCxxConfigInitCC, Transform("CXXCINIT"))) cxx_param_hh_files = ["cxx_config/%s.hh" % simobj - for simobj in sorted(sim_objects.itervalues()) + for name,simobj in sorted(sim_objects.iteritems()) if not hasattr(simobj, 'abstract') or not simobj.abstract] Depends(cxx_config_init_cc_file, cxx_param_hh_files + [File('sim/cxx_config.hh')]) @@ -725,7 +726,7 @@ if GetOption('with_cxx_config'): # Generate any needed param SWIG wrapper files params_i_files = [] -for name,param in params_to_swig.iteritems(): +for name,param in sorted(params_to_swig.iteritems()): i_file = File('python/m5/internal/%s.i' % (param.swig_module_name())) params_i_files.append(i_file) env.Command(i_file, Value(name), @@ -760,10 +761,9 @@ for name,enum in sorted(all_enums.iteritems()): SwigSource('m5.internal', i_file) # Generate SimObject SWIG wrapper files -for name,simobj in sim_objects.iteritems(): +for name,simobj in sorted(sim_objects.iteritems()): py_source = PySource.modules[simobj.__module__] extra_deps = [ py_source.tnode ] - i_file = File('python/m5/internal/param_%s.i' % name) env.Command(i_file, Value(name), MakeAction(createSimObjectSwigWrapper, Transform("SO SWIG"))) diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py index 71091ce6c..240b449df 100644 --- a/src/python/m5/SimObject.py +++ b/src/python/m5/SimObject.py @@ -691,8 +691,8 @@ class MetaSimObject(type): # The 'local' attribute restricts us to the params declared in # the object itself, not including inherited params (which # will also be inherited from the base class's param struct - # here). - params = cls._params.local.values() + # here). Sort the params based on their key + params = map(lambda (k, v): v, sorted(cls._params.local.items())) ports = cls._ports.local code('%module(package="m5.internal") param_$cls') @@ -772,8 +772,8 @@ using std::ptrdiff_t; # The 'local' attribute restricts us to the params declared in # the object itself, not including inherited params (which # will also be inherited from the base class's param struct - # here). - params = cls._params.local.values() + # here). Sort the params based on their key + params = map(lambda (k, v): v, sorted(cls._params.local.items())) ports = cls._ports.local try: ptypes = [p.ptype for p in params]