Skip to content

Commit

Permalink
Added CodeObject.owner and owner name to template keywords
Browse files Browse the repository at this point in the history
  • Loading branch information
thesamovar committed Sep 14, 2013
1 parent f1a4e1e commit 215fcb8
Show file tree
Hide file tree
Showing 8 changed files with 24 additions and 13 deletions.
15 changes: 11 additions & 4 deletions brian2/codegen/codeobject.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def prepare_namespace(namespace, variables):
return namespace


def create_codeobject(name, abstract_code, namespace, variables, template_name,
def create_codeobject(owner, name, abstract_code, namespace, variables, template_name,
indices, variable_indices, codeobj_class,
template_kwds=None):
'''
Expand Down Expand Up @@ -83,10 +83,12 @@ def create_codeobject(name, abstract_code, namespace, variables, template_name,

variables.update(indices)

code = template(snippet, variables=variables, codeobj_name=name, namespace=namespace, **template_kwds)
code = template(snippet,
owner=owner, variables=variables, codeobj_name=name, namespace=namespace,
**template_kwds)
logger.debug(name + " code:\n" + str(code))

codeobj = codeobj_class(code, namespace, variables, name=name)
codeobj = codeobj_class(owner, code, namespace, variables, name=name)
codeobj.compile()
return codeobj

Expand All @@ -108,8 +110,13 @@ class CodeObject(Nameable):
#: The `Language` used by this `CodeObject`
language = None

def __init__(self, code, namespace, variables, name='codeobject*'):
def __init__(self, owner, code, namespace, variables, name='codeobject*'):
Nameable.__init__(self, name=name)
try:
owner = weakref.proxy(owner)
except TypeError:
pass # if owner was already a weakproxy then this will be the error raised
self.owner = owner
self.code = code
self.compile_methods = self.get_compile_methods(variables)
self.namespace = namespace
Expand Down
4 changes: 2 additions & 2 deletions brian2/codegen/runtime/numpy_rt/numpy_rt.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ class NumpyCodeObject(CodeObject):
'templates'))
language = NumpyLanguage()

def __init__(self, code, namespace, variables, name='numpy_code_object*'):
def __init__(self, owner, code, namespace, variables, name='numpy_code_object*'):
# TODO: This should maybe go somewhere else
namespace['logical_not'] = np.logical_not
CodeObject.__init__(self, code, namespace, variables, name=name)
CodeObject.__init__(self, owner, code, namespace, variables, name=name)

def variables_to_namespace(self):
# Variables can refer to values that are either constant (e.g. dt)
Expand Down
4 changes: 2 additions & 2 deletions brian2/codegen/runtime/weave_rt/weave_rt.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ class WeaveCodeObject(CodeObject):
'templates'))
language = CPPLanguage(c_data_type=weave_data_type)

def __init__(self, code, namespace, variables, name='weave_code_object*'):
super(WeaveCodeObject, self).__init__(code, namespace, variables, name=name)
def __init__(self, owner, code, namespace, variables, name='weave_code_object*'):
super(WeaveCodeObject, self).__init__(owner, code, namespace, variables, name=name)
self.compiler = brian_prefs['codegen.runtime.weave.compiler']
self.extra_compile_args = brian_prefs['codegen.runtime.weave.extra_compile_args']

Expand Down
4 changes: 2 additions & 2 deletions brian2/devices/cpp_standalone/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ def code_object_class(self, codeobj_class=None):
raise ValueError("Cannot specify codeobj_class for C++ standalone device.")
return CPPStandaloneCodeObject

def code_object(self, name, abstract_code, namespace, variables, template_name,
def code_object(self, owner, name, abstract_code, namespace, variables, template_name,
indices, variable_indices, codeobj_class=None,
template_kwds=None):
codeobj = super(CPPStandaloneDevice, self).code_object(name, abstract_code, namespace, variables,
codeobj = super(CPPStandaloneDevice, self).code_object(owner, name, abstract_code, namespace, variables,
template_name, indices, variable_indices,
codeobj_class=codeobj_class,
template_kwds=template_kwds,
Expand Down
4 changes: 2 additions & 2 deletions brian2/devices/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ def code_object_class(self, codeobj_class=None):
codeobj_class = get_default_codeobject_class()
return codeobj_class

def code_object(self, name, abstract_code, namespace, variables, template_name,
def code_object(self, owner, name, abstract_code, namespace, variables, template_name,
indices, variable_indices, codeobj_class=None,
template_kwds=None):
codeobj_class = self.code_object_class(codeobj_class)
return create_codeobject(name, abstract_code, namespace, variables, template_name,
return create_codeobject(owner, name, abstract_code, namespace, variables, template_name,
indices, variable_indices, codeobj_class=codeobj_class,
template_kwds=template_kwds)

Expand Down
1 change: 1 addition & 0 deletions brian2/groups/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@ def create_runner_codeobj(group, code, template_name, indices=None,
variable_indices = group.variable_indices

return get_device().code_object(
group,
name,
code,
resolved_namespace,
Expand Down
1 change: 1 addition & 0 deletions brian2/monitors/ratemonitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ def reinit(self):

def pre_run(self, namespace):
self.codeobj = get_device().code_object(
self,
self.name+'_codeobject*',
'', # No model-specific code
{}, # no namespace
Expand Down
4 changes: 3 additions & 1 deletion brian2/monitors/spikemonitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,9 @@ def reinit(self):
self.count = get_device().array(self, '_count', len(self.source), 1, dtype=np.int32)

def pre_run(self, namespace):
self.codeobj = get_device().code_object(self.name+'_codeobject*',
self.codeobj = get_device().code_object(
self,
self.name+'_codeobject*',
'', # No model-specific code
{}, # no namespace
self.variables,
Expand Down

0 comments on commit 215fcb8

Please sign in to comment.