diff Port.py @ 0:45b12307c695

Initial revision
author drewp
date Wed, 03 Jul 2002 09:37:57 +0000
parents
children 022e35e17182
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Port.py	Wed Jul 03 09:37:57 2002 +0000
@@ -0,0 +1,77 @@
+from nodetypes import DiscoType
+
+ANY = -1
+
+class Port:
+    def __setattr__(self, key, value):
+        '''Alias for __setitem___'''
+        self[key] = value
+    def __setitem__(self, key, value):
+        pass
+    def __getattr__(self, key):
+        '''Alias for __getitem___'''
+        return self[key]
+    def __getitem__(self, key):
+        pass
+
+class InputPort(Port):
+    def __init__(self, allowedtype, required=1, maxpins=ANY):
+        self.pins = []
+
+class OutputPort(Port):
+    def __init__(self):
+        self.pins = []
+
+class Pin:
+    def __init__(self, connection, value=DiscoType):
+        pass
+
+'''
+Snippet Pi=3: RFC 2: New port semantics
+
+# an example of the max node's op
+def changed(self, inputs):
+    # note how this function does not use stateaccess, as it doesn't use state
+    return max(inputs.values())
+
+# so, how the heck does this work?
+# we check the function to get the names of kw args in the function.
+# we always pass self, but everything else is optional
+# the node asked for inputs, which looks like this:
+# inputs = {'portname' : PortObj, 'portname2', PortObj}
+# somehow, the PortObjs are max'ible.
+# the node has only one output so it can just return the value to set the 
+# output.  (maybe)
+# alteratively, if we decide that you always return a new dict of outputs:
+# return {'outputportname' : max(inputs.values())}
+# which isn't horrible, but not great
+
+# another example: an adder.  the node has ports A and B, and an output C:
+# C also gets capped at stateaccess[min].
+def changed(self, a, b, c, stateaccess):
+    c.set(max(stateaccess['min'], a + b))
+    return {}
+
+# or:
+def changed(self, a, b, stateaccess):
+    c = max(stateaccess['min'], a + b)
+    return {'c' : c}
+
+# which i think is clearer.  doing all port changes at the end has some
+# book-keeping advantages (we can detect easily which ports are changed)
+# the counter node could work this way:
+
+def changed(self, someoutput):
+    return {'someoutput' : someoutput + 1}
+'''
+
+'''
+type 1: a, b, d, e
+type 2: b, c, d, f
+
+conversion maps:
+a -> [ ]
+b -> b
+d -> d
+e -> f
+'''