summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJosh Blum2012-11-03 13:02:44 -0700
committerJosh Blum2012-11-03 13:02:44 -0700
commit69a0c4fb988181de3ea8caef71b480f794882c0f (patch)
treef3d9f202ca7b49886167a7a708dfffc845488747 /python
parentdd3382aa8fa8d4b6d1de46621bbec189dd7e8965 (diff)
downloadsandhi-69a0c4fb988181de3ea8caef71b480f794882c0f.tar.gz
sandhi-69a0c4fb988181de3ea8caef71b480f794882c0f.tar.bz2
sandhi-69a0c4fb988181de3ea8caef71b480f794882c0f.zip
python hier/top block holds refs of connected blocks
Diffstat (limited to 'python')
-rw-r--r--python/gras/GRAS_HierBlock.i35
1 files changed, 24 insertions, 11 deletions
diff --git a/python/gras/GRAS_HierBlock.i b/python/gras/GRAS_HierBlock.i
index 8fb972a..16142e5 100644
--- a/python/gras/GRAS_HierBlock.i
+++ b/python/gras/GRAS_HierBlock.i
@@ -109,42 +109,55 @@ struct HierBlockPython : HierBlock
////////////////////////////////////////////////////////////////////////
%pythoncode %{
-def internal_connect__(fcn, obj, *args):
+def to_element(obj):
+ if isinstance(obj, Element): return obj
+ try: return obj.shared_to_element()
+ except: raise Exception('cant coerce obj %s to element'%(obj))
- def to_element(obj):
- if isinstance(obj, Element): return obj
- try: return obj.shared_to_element()
- except: raise Exception('cant coerce obj %s to element'%(obj))
+def internal_connect__(fcn, obj, refs, action, *args):
if len(args) == 1:
- fcn(obj, to_element(args[0]))
+ elem = (args[0])
+ fcn(obj, elem)
+ if elem != to_element(obj): action(refs, elem)
return
for src, sink in zip(args, args[1:]):
+
try: src, src_index = src
except: src_index = 0
+ src = to_element(src)
+
try: sink, sink_index = sink
except: sink_index = 0
- fcn(obj, to_element(src), src_index, to_element(sink), sink_index)
+ sink = to_element(sink)
+
+ fcn(obj, src, src_index, sink, sink_index)
+
+ #incr/decr the python obj ref counts
+ if src != to_element(obj): action(refs, src)
+ if sink != to_element(obj): action(refs, sink)
class TopBlock(TopBlockPython):
def __init__(self, *args, **kwargs):
TopBlockPython.__init__(self, *args, **kwargs)
+ self.__refs = list()
def connect(self, *args):
- return internal_connect__(TopBlockPython.connect, self, *args)
+ return internal_connect__(TopBlockPython.connect, self, self.__refs, list.append, *args)
def disconnect(self, *args):
- return internal_connect__(TopBlockPython.disconnect, self, *args)
+ return internal_connect__(TopBlockPython.disconnect, self, self.__refs, list.remove, *args)
class HierBlock(HierBlockPython):
def __init__(self, *args, **kwargs):
HierBlockPython.__init__(self, *args, **kwargs)
+ self.__refs = list()
def connect(self, *args):
- return internal_connect__(HierBlockPython.connect, self, *args)
+ return internal_connect__(HierBlockPython.connect, self, self.__refs, list.append, *args)
def disconnect(self, *args):
- return internal_connect__(HierBlockPython.disconnect, self, *args)
+ return internal_connect__(HierBlockPython.disconnect, self, self.__refs, list.remove, *args)
%}