452c452,458
< all_params = {}
---
> # Find param types that need to be explicitly wrapped with swig.
> # These will be recognized because the ParamDesc will have a
> # swig_decl() method. Most param types are based on types that don't
> # need this, either because they're based on native types (like Int)
> # or because they're SimObjects (which get swigged independently).
> # For now the only things handled here are VectorParam types.
> params_to_swig = {}
464,465c470,471
< if pname not in all_params:
< all_params[pname] = param
---
> if pname not in params_to_swig:
> params_to_swig[pname] = param
526c532
< def createSimObjectParam(target, source, env):
---
> def createSimObjectParamStruct(target, source, env):
533c539
< obj.cxx_decl(code)
---
> obj.cxx_param_decl(code)
536c542
< def createSwigParam(target, source, env):
---
> def createParamSwigWrapper(target, source, env):
540c546
< param = all_params[name]
---
> param = params_to_swig[name]
543d548
< code('%module(package="m5.internal") $0_${name}', param.file_ext)
557c562
< def createEnumParam(target, source, env):
---
> def createEnumDecls(target, source, env):
567c572
< def createEnumSwig(target, source, env):
---
> def createEnumSwigWrapper(target, source, env):
574,575c579,580
< code('''\
< %module(package="m5.internal") enum_$name
---
> obj.swig_decl(code)
> code.write(target[0].abspath)
577,579c582,584
< %{
< #include "enums/$name.hh"
< %}
---
> def createSimObjectSwigWrapper(target, source, env):
> name = source[0].get_contents()
> obj = sim_objects[name]
581,582c586,587
< %include "enums/$name.hh"
< ''')
---
> code = code_formatter()
> obj.swig_decl(code)
585c590
< # Generate all of the SimObject param struct header files
---
> # Generate all of the SimObject param C++ struct header files
594c599
< MakeAction(createSimObjectParam, Transform("SO PARAM")))
---
> MakeAction(createSimObjectParamStruct, Transform("SO PARAM")))
597c602
< # Generate any parameter header files needed
---
> # Generate any needed param SWIG wrapper files
599,600c604,605
< for name,param in all_params.iteritems():
< i_file = File('python/m5/internal/%s_%s.i' % (param.file_ext, name))
---
> for name,param in params_to_swig.iteritems():
> i_file = File('python/m5/internal/%s.i' % (param.swig_module_name()))
603c608
< MakeAction(createSwigParam, Transform("SW PARAM")))
---
> MakeAction(createParamSwigWrapper, Transform("SW PARAM")))
620c625
< MakeAction(createEnumParam, Transform("EN PARAM")))
---
> MakeAction(createEnumDecls, Transform("ENUMDECL")))
625c630
< MakeAction(createEnumSwig, Transform("ENUMSWIG")))
---
> MakeAction(createEnumSwigWrapper, Transform("ENUMSWIG")))
629,661c634
< 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(package="m5.internal") param_$name')
< code()
< code('%{')
< code('#include "params/$obj.hh"')
< for param in params:
< param.cxx_predecls(code)
< code('%}')
< code()
<
< for param in params:
< param.swig_predecls(code)
<
< code()
< if obj._base:
< code('%import "python/m5/internal/param_${{obj._base}}.i"')
< code()
< obj.swig_objdecls(code)
< code()
<
< code('%include "params/$obj.hh"')
<
< code.write(target[0].abspath)
<
---
> # Generate SimObject SWIG wrapper files
663,667c636,640
< params_file = File('python/m5/internal/param_%s.i' % name)
< env.Command(params_file, Value(name),
< MakeAction(buildParam, Transform("BLDPARAM")))
< env.Depends(params_file, depends)
< SwigSource('m5.internal', params_file)
---
> i_file = File('python/m5/internal/param_%s.i' % name)
> env.Command(i_file, Value(name),
> MakeAction(createSimObjectSwigWrapper, Transform("SO SWIG")))
> env.Depends(i_file, depends)
> SwigSource('m5.internal', i_file)
690c663
< init_file = '%s/init_%s.cc' % (dirname(cc_file), basename(cc_file))
---
> init_file = '%s/%s_init.cc' % (dirname(cc_file), basename(cc_file))