|
@@ -60,12 +60,15 @@ list_output(X) ->
|
|
|
%%% Simplification
|
|
|
%%%-----------------------------------------------------------------------------
|
|
|
|
|
|
-simpl(Op = #pipe{ops=Inside}) ->
|
|
|
- flatten(Op#pipe{ops=simpl_pipe([ simpl(O) || O <- Inside ])});
|
|
|
-simpl(Op = #par{ops=Inside}) ->
|
|
|
- flatten(Op#par{ops=simpl_par([ simpl(O) || O <- Inside ])});
|
|
|
+simpl(#pipe{ops=Inside}) ->
|
|
|
+ flatten(ebb_prim:pipe(simpl_pipe([ simpl(O) || O <- Inside ])));
|
|
|
+simpl(#par{ops=Inside}) ->
|
|
|
+ flatten(ebb_prim:par(simpl_par([ simpl(O) || O <- Inside ])));
|
|
|
simpl(Op) ->
|
|
|
- Op.
|
|
|
+ case ebb_prim:is_operation(Op) of
|
|
|
+ true -> Op;
|
|
|
+ false -> erlang:error(badarg, [Op])
|
|
|
+ end.
|
|
|
|
|
|
simpl_pipe(Ops) ->
|
|
|
lists:reverse(lists:foldl(fun simpl_pipe/2, [], Ops)).
|
|
@@ -88,17 +91,22 @@ simpl_pipe(#merge{size=N}, [#split{size=N} | Acc]) ->
|
|
|
simpl_pipe(Op, Acc) ->
|
|
|
[Op | Acc].
|
|
|
|
|
|
-simpl_pipe_par(Par1 = #par{in=In, ops=Ops1}, Par2 = #par{out=Out, ops=Ops2}) ->
|
|
|
- ZOps = lists:zip(Ops1, Ops2),
|
|
|
- Match = lists:all(fun({O1,O2}) -> ebb_prim:can_connect(O1, O2) end, ZOps),
|
|
|
- case Match of
|
|
|
- true -> [#par{in=In, out=Out,
|
|
|
- ops=[ ebb_prim:pipe([O1,O2]) || {O1, O2} <- ZOps ]}];
|
|
|
- false -> [Par1, Par2]
|
|
|
+simpl_pipe_par(Par1 = #par{ops=Ops1}, Par2 = #par{ops=Ops2}) ->
|
|
|
+ try
|
|
|
+ ZOps = lists:zip(Ops1, Ops2),
|
|
|
+ {lists:all(fun({O1,O2}) -> ebb_prim:can_connect(O1, O2) end, ZOps),
|
|
|
+ ZOps}
|
|
|
+ of
|
|
|
+ {true, Ops} ->
|
|
|
+ [ebb_prim:par([ ebb_prim:pipe([O1,O2]) || {O1, O2} <- Ops ])];
|
|
|
+ {false, _} ->
|
|
|
+ [Par2, Par1]
|
|
|
+ catch
|
|
|
+ error:function_clause -> [Par2, Par1]
|
|
|
end.
|
|
|
|
|
|
-simpl_pipe_route(#route{in=In, map=M1}, #route{out=Out, map=M2}) ->
|
|
|
- #route{in=In, out=Out, map=[ lists:nth(I, M1) || I <- M2 ]}.
|
|
|
+simpl_pipe_route(#route{in=In, map=M1}, #route{map=M2}) ->
|
|
|
+ ebb_prim:route(In, [ lists:nth(I, M1) || I <- M2 ]).
|
|
|
|
|
|
simpl_par(Ops) ->
|
|
|
lists:reverse(lists:foldl(fun simpl_par/2, [], Ops)).
|
|
@@ -112,10 +120,9 @@ simpl_par(R2 = #route{}, [R1 = #route{} | Acc]) ->
|
|
|
simpl_par(Op, Acc) ->
|
|
|
[Op | Acc].
|
|
|
|
|
|
-simpl_par_route(#route{in=In1, out=Out1, map=M1},
|
|
|
- #route{in=In2, out=Out2, map=M2}) ->
|
|
|
- #route{in=In1+In2, out=Out1+Out2,
|
|
|
- map=lists:append(M1, [ S2+In1 || S2 <- M2 ])}.
|
|
|
+simpl_par_route(#route{in=In1, map=M1}, #route{in=In2, map=M2}) ->
|
|
|
+ ebb_prim:route(In1+In2,
|
|
|
+ lists:append(M1, [ S2+In1 || S2 <- M2 ])).
|
|
|
|
|
|
flatten(#pipe{in=N, out=N, ops=[]}) ->
|
|
|
ebb_flow:id(N);
|