100,130d99
< def default_cxx_predecls(cls, code):
< code('#include "params/$cls.hh"')
<
< def default_swig_predecls(cls, code):
< code('%import "python/m5/internal/param_$cls.i"')
<
< def default_swig_objdecls(cls, code):
< class_path = cls.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()
< code('// stop swig from creating/wrapping default ctor/dtor')
< code('%nodefault $classname;')
< code('class $classname')
< if cls._base:
< code(' : public ${{cls._base.cxx_class}}')
< code('{};')
<
< for ns in reversed(namespaces):
< code('} // namespace $ns')
<
145,147d113
< 'cxx_predecls' : MethodType,
< 'swig_objdecls' : MethodType,
< 'swig_predecls' : MethodType,
226,229d191
<
< if 'cxx_predecls' not in cls.__dict__:
< m = MethodType(default_cxx_predecls, cls, MetaSimObject)
< setattr(cls, 'cxx_predecls', m)
231,238d192
< if 'swig_predecls' not in cls.__dict__:
< 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)
< setattr(cls, 'swig_objdecls', m)
<
381,382c335,351
< def cxx_decl(cls, code):
< # The 'dict' attribute restricts us to the params declared in
---
> # See ParamValue.cxx_predecls for description.
> def cxx_predecls(cls, code):
> code('#include "params/$cls.hh"')
>
> # See ParamValue.swig_predecls for description.
> def swig_predecls(cls, code):
> code('%import "python/m5/internal/param_$cls.i"')
>
> # Generate the declaration for this object for wrapping with SWIG.
> # Generates code that goes into a SWIG .i file. Called from
> # src/SConscript.
> def swig_decl(cls, code):
> class_path = cls.cxx_class.split('::')
> classname = class_path[-1]
> namespaces = class_path[:-1]
>
> # The 'local' attribute restricts us to the params declared in
386a356,408
>
> code('%module(package="m5.internal") param_$cls')
> code()
> code('%{')
> code('#include "params/$cls.hh"')
> for param in params:
> param.cxx_predecls(code)
> code('%}')
> code()
>
> for param in params:
> param.swig_predecls(code)
>
> code()
> if cls._base:
> code('%import "python/m5/internal/param_${{cls._base}}.i"')
> code()
>
> 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;')
>
> if cls == SimObject:
> code('%include "python/swig/sim_object.i"')
> else:
> code()
> code('// stop swig from creating/wrapping default ctor/dtor')
> code('%nodefault $classname;')
> code('class $classname')
> if cls._base:
> code(' : public ${{cls._base.cxx_class}}')
> code('{};')
>
> for ns in reversed(namespaces):
> code('} // namespace $ns')
>
> code()
> code('%include "params/$cls.hh"')
>
>
> # Generate the C++ declaration (.hh file) for this SimObject's
> # param struct. Called from src/SConscript.
> def cxx_param_decl(cls, code):
> # 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()
424,430c446
< cls.cxx_struct(code, cls._base, params)
<
< code()
< code('#endif // __PARAMS__${cls}__')
< return code
<
< def cxx_struct(cls, code, base, params):
---
> # now generate the actual param struct
433c449,456
< return
---
> else:
> code("struct ${cls}Params")
> if cls._base:
> code(" : public ${{cls._base.type}}Params")
> code("{")
> if not hasattr(cls, 'abstract') or not cls.abstract:
> if 'type' in cls.__dict__:
> code(" ${{cls.cxx_type}} create();")
435,442c458,462
< # now generate the actual param struct
< code("struct ${cls}Params")
< if base:
< code(" : public ${{base.type}}Params")
< code("{")
< if not hasattr(cls, 'abstract') or not cls.abstract:
< if 'type' in cls.__dict__:
< code(" ${{cls.cxx_type}} create();")
---
> code.indent()
> for param in params:
> param.cxx_decl(code)
> code.dedent()
> code('};')
444,469d463
< code.indent()
< for param in params:
< param.cxx_decl(code)
< code.dedent()
< code('};')
<
< def swig_decl(cls, code):
< code('''\
< %module $cls
<
< %{
< #include "params/$cls.hh"
< %}
<
< ''')
<
< # 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
< # here).
< params = cls._params.local.values()
< ptypes = [p.ptype for p in params]
<
< # get all predeclarations
< for param in params:
< param.swig_predecls(code)
470a465,466
> code('#endif // __PARAMS__${cls}__')
> return code
472,474d467
< if cls._base:
< code('%import "python/m5/internal/param_${{cls._base.type}}.i"')
< code()
476,479d468
< for ptype in ptypes:
< if issubclass(ptype, Enum):
< code('%import "enums/${{ptype.__name__}}.hh"')
< code()
481,483d469
< code('%import "params/${cls}_type.hh"')
< code('%include "params/${cls}.hh"')
<
494,497d479
< @classmethod
< def swig_objdecls(cls, code):
< code('%include "python/swig/sim_object.i"')
<