Graph clause
The graph clause of a composite operator describes a stream data flow subgraph, which can then be expanded in different contexts when the operator is invoked.
Here is an example of the graph
clause:
composite M (output K, L; input G, H) {
graph stream<int32 x> I = Functor(G) { /*..O..*/ }
stream<int32 x> J = Functor(H) { /*..P..*/ }
stream<int32 x> K = Custom(I; J) { /*..Q..*/ }
stream<int32 x> L = Functor(J) { /*..R..*/ }
}
composite Main {
graph stream<int32 x> A = Beacon() {}
stream<int32 x> B = Beacon() {}
(stream<int32 x> C; stream<int32 x> D) = M(A; B) { }
(stream<int32 x> E; stream<int32 x> F) = M(A; B) { }
}

The figure illustrates the graph topology in this example. The
original graph contains two invocations using composite operator M:
once
to transform A
and B
into C
and D
,
and the other time to transform A
and B
into E
and F
.
The head of the composite operator definition (output K, L;
input G, H
) defines input and output ports. When the composite
operator gets used, actual input and output streams are bound to these
ports; for example, for the first invocation, the bindings are G=A
, H=B
, K=C
,
and L=D
. In the expanded graph, intermediate streams
such as I
and J
in the example are
duplicated and renamed C.I
, C.J
, E.I
,
and E.J
.