changeset 2221ec64132f in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=2221ec64132f
description:
scons: Stop building the big monolithic swigged params module
kill params.i and create a separate .i for each object (param, enums,
etc.)
diffstat:
src/SConscript | 130 ++++++++++++------------------
src/python/SConscript | 5 +
src/python/m5/SimObject.py | 49 +++++++----
src/python/m5/internal/enums/__init__.py | 36 ++++++++
src/python/m5/internal/params/__init__.py | 36 ++++++++
src/python/m5/internal/swig/__init__.py | 27 ++++++
src/python/m5/objects/params.py | 29 ++++++
src/python/m5/params.py | 62 ++++++++++---
src/python/swig/inet.i | 3 +
src/python/swig/range.i | 12 ++-
src/python/swig/sim_object.i | 3 +-
src/python/swig/system.i | 7 +-
12 files changed, 281 insertions(+), 118 deletions(-)
diffs (truncated from 623 to 300 lines):
diff -r 8e3734851770 -r 2221ec64132f src/SConscript
--- a/src/SConscript Thu Sep 09 14:15:42 2010 -0700
+++ b/src/SConscript Thu Sep 09 14:26:29 2010 -0700
@@ -399,7 +399,7 @@
# calculate extra dependencies
#
module_depends = ["m5", "m5.SimObject", "m5.params"]
-depends = [ PySource.modules[dep].tnode for dep in module_depends ]
+depends = [ PySource.modules[dep].snode for dep in module_depends ]
########################################################################
#
@@ -470,6 +470,7 @@
param = all_params[name]
code = code_formatter()
+ code('%module(package="m5.internal.swig") ${name}_$0', param.file_ext)
param.swig_decl(code)
code.write(target[0].abspath)
@@ -493,6 +494,24 @@
obj.cxx_decl(code)
code.write(target[0].abspath)
+def createEnumSwig(target, source, env):
+ assert len(target) == 1 and len(source) == 1
+
+ name = str(source[0].get_contents())
+ obj = all_enums[name]
+
+ code = code_formatter()
+ code('''\
+%module(package="m5.internal.enums") $name
+
+%{
+#include "enums/$name.hh"
+%}
+
+%include "enums/$name.hh"
+''')
+ code.write(target[0].abspath)
+
# Generate all of the SimObject param struct header files
params_hh_files = []
for name,simobj in sorted(sim_objects.iteritems()):
@@ -511,6 +530,7 @@
params_i_files.append(i_file)
env.Command(i_file, Value(name), createSwigParam)
env.Depends(i_file, depends)
+ SwigSource('m5.internal.swig', i_file)
# Generate all enum header files
for name,enum in sorted(all_enums.iteritems()):
@@ -526,95 +546,49 @@
env.Command(hh_file, Value(name), createEnumParam)
env.Depends(hh_file, depends + extra_deps)
-# Build the big monolithic swigged params module (wraps all SimObject
-# param structs and enum structs)
-def buildParams(target, source, env):
- names = [ s.get_contents() for s in source ]
- objs = [ sim_objects[name] for name in names ]
+ i_file = File('enums/%s.i' % name)
+ env.Command(i_file, Value(name), createEnumSwig)
+ env.Depends(i_file, depends + extra_deps)
+ SwigSource('m5.internal.enums', i_file)
- ordered_objs = []
- obj_seen = set()
- def order_obj(obj):
- name = str(obj)
- if name in obj_seen:
- return
-
- obj_seen.add(name)
- if str(obj) != 'SimObject':
- order_obj(obj.__bases__[0])
-
- ordered_objs.append(obj)
-
- for obj in objs:
- order_obj(obj)
+def buildParam(target, source, env):
+ name = source[0].get_contents()
+ obj = sim_objects[name]
+ class_path = obj.cxx_class.split('::')
+ classname = class_path[-1]
+ namespaces = class_path[:-1]
+ params = obj._params.local.values()
code = code_formatter()
- code('%module params')
+ code('%module(package="m5.internal.params") $name')
+ code()
code('%{')
- for obj in ordered_objs:
- code('#include "params/$obj.hh"')
+ code('#include "params/$obj.hh"')
+ for param in params:
+ param.cxx_predecls(code)
code('%}')
+ code()
- for obj in ordered_objs:
- params = obj._params.local.values()
- for param in params:
- param.swig_predecls(code)
+ for param in params:
+ param.swig_predecls(code)
- enums = set()
- for obj in ordered_objs:
- params = obj._params.local.values()
- for param in params:
- ptype = param.ptype
- if issubclass(ptype, m5.params.Enum) and ptype not in enums:
- enums.add(ptype)
- code('%include "enums/$0.hh"', ptype.__name__)
-
- for obj in ordered_objs:
- obj.swig_objdecls(code)
- code()
+ code()
+ if obj._base:
+ code('%import "params/${{obj._base}}.i"')
+ code()
+ obj.swig_objdecls(code)
+ code()
- for obj in ordered_objs:
- continue
- if obj.swig_objdecls:
- obj.swig_objdecls(code)
- continue
-
- class_path = obj.cxx_class.split('::')
- classname = class_path[-1]
- namespaces = class_path[:-1]
-
- for ns in namespaces:
- code('namespace $ns {')
-
- if namespaces:
- code('// avoid name conflicts')
- sep_string = '_COLONS_'
- flat_name = sep_string.join(class_path)
- code('%rename($flat_name) $classname;')
-
- code('// stop swig from creating/wrapping default ctor/dtor')
- code('%nodefault $classname;')
- if obj._base:
- code('class $classname : public ${{obj._base.cxx_class}} {};')
- else:
- code('class $classname {};')
-
- for ns in reversed(namespaces):
- code('/* namespace $ns */ }')
- code()
-
- code('%include "src/sim/sim_object_params.hh"')
- for obj in ordered_objs:
- code('%include "params/$obj.hh"')
+ code('%include "params/$obj.hh"')
code.write(target[0].abspath)
-params_file = File('params/params.i')
-names = sorted(sim_objects.keys())
-env.Command(params_file, map(Value, names), buildParams)
-env.Depends(params_file, params_hh_files + params_i_files + depends)
-SwigSource('m5.objects', params_file)
+for name in sim_objects.iterkeys():
+ params_file = File('params/%s.i' % name)
+ env.Command(params_file, Value(name), buildParam)
+ env.Depends(params_file, depends)
+ SwigSource('m5.internal.params', params_file)
# Generate the main swig init file
def makeEmbeddedSwigInit(target, source, env):
diff -r 8e3734851770 -r 2221ec64132f src/python/SConscript
--- a/src/python/SConscript Thu Sep 09 14:15:42 2010 -0700
+++ b/src/python/SConscript Thu Sep 09 14:26:29 2010 -0700
@@ -50,6 +50,7 @@
PySource('m5', 'm5/ticks.py')
PySource('m5', 'm5/trace.py')
PySource('m5.objects', 'm5/objects/__init__.py')
+PySource('m5.objects', 'm5/objects/params.py')
PySource('m5.util', 'm5/util/__init__.py')
PySource('m5.util', 'm5/util/attrdict.py')
PySource('m5.util', 'm5/util/code_formatter.py')
@@ -65,6 +66,10 @@
SwigSource('m5.internal', 'swig/debug.i')
SwigSource('m5.internal', 'swig/event.i')
SwigSource('m5.internal', 'swig/random.i')
+SwigSource('m5.internal', 'swig/range.i')
SwigSource('m5.internal', 'swig/stats.i')
SwigSource('m5.internal', 'swig/trace.i')
PySource('m5.internal', 'm5/internal/__init__.py')
+PySource('m5.internal.enums', 'm5/internal/enums/__init__.py')
+PySource('m5.internal.params', 'm5/internal/params/__init__.py')
+PySource('m5.internal.swig', 'm5/internal/swig/__init__.py')
diff -r 8e3734851770 -r 2221ec64132f src/python/m5/SimObject.py
--- a/src/python/m5/SimObject.py Thu Sep 09 14:15:42 2010 -0700
+++ b/src/python/m5/SimObject.py Thu Sep 09 14:26:29 2010 -0700
@@ -98,15 +98,10 @@
instanceDict = {}
def default_cxx_predecls(cls, code):
- '''A forward class declaration is sufficient since we are
- just declaring a pointer.'''
+ code('#include "params/$cls.hh"')
- class_path = cls._value_dict['cxx_class'].split('::')
- for ns in class_path[:-1]:
- code('namespace $ns {')
- code('class $0;', class_path[-1])
- for ns in reversed(class_path[:-1]):
- code('/* namespace $ns */ }')
+def default_swig_predecls(cls, code):
+ code('%import "params/$cls.i"')
def default_swig_objdecls(cls, code):
class_path = cls.cxx_class.split('::')
@@ -233,7 +228,8 @@
setattr(cls, 'cxx_predecls', m)
if 'swig_predecls' not in cls.__dict__:
- setattr(cls, 'swig_predecls', getattr(cls, 'cxx_predecls'))
+ m = MethodType(default_swig_predecls, cls, MetaSimObject)
+ setattr(cls, 'swig_predecls', m)
if 'swig_objdecls' not in cls.__dict__:
m = MethodType(default_swig_objdecls, cls, MetaSimObject)
@@ -346,6 +342,15 @@
"Class %s has no parameter \'%s\'" % (cls.__name__, attr)
def __getattr__(cls, attr):
+ if attr == 'cxx_class_path':
+ return cls.cxx_class.split('::')
+
+ if attr == 'cxx_class_name':
+ return cls.cxx_class_path[-1]
+
+ if attr == 'cxx_namespaces':
+ return cls.cxx_class_path[:-1]
+
if cls._values.has_key(attr):
return cls._values[attr]
@@ -359,12 +364,6 @@
return cls.__name__
def cxx_decl(cls, code):
- code('''\
-#ifndef __PARAMS__${cls}__
-#define __PARAMS__${cls}__
-
-''')
-
# The 'dict' 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
@@ -377,8 +376,23 @@
print params
raise
- # get all predeclarations
- cls.cxx_predecls(code)
+ class_path = cls._value_dict['cxx_class'].split('::')
+
+ code('''\
+#ifndef __PARAMS__${cls}__
+#define __PARAMS__${cls}__
+
+''')
+
+ # A forward class declaration is sufficient since we are just
+ # declaring a pointer.
+ for ns in class_path[:-1]:
+ code('namespace $ns {')
+ code('class $0;', class_path[-1])
+ for ns in reversed(class_path[:-1]):
+ code('/* namespace $ns */ }')
+ code()
+
for param in params:
param.cxx_predecls(code)
code()
@@ -394,7 +408,6 @@
cls.cxx_struct(code, cls._base, params)
- # close #ifndef __PARAMS__* guard
code()
code('#endif // __PARAMS__${cls}__')
return code
diff -r 8e3734851770 -r 2221ec64132f src/python/m5/internal/enums/__init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/python/m5/internal/enums/__init__.py Thu Sep 09 14:26:29 2010 -0700
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev