digraph G { graph [rankdir=LR]; subgraph cluster_P1 { a; share_a[label="share"]; a1; b1; subgraph cluster_mul1 { "*1"[label="*"]; share1[label="share"]; recombine1[label="recombine"]; } output1; } subgraph cluster_P2 { b; share_b[label="share"]; a2; b2; subgraph cluster_mul2 { "*2"[label="*"]; share2[label="share"]; recombine2[label="recombine"]; } output2; } subgraph cluster_P3 { a3; b3; subgraph cluster_mul3 { "*3"[label="*"]; share3[label="share"]; recombine3[label="recombine"]; } output3; } a -> share_a; share_a -> a1; share_a -> a2; share_a -> a3; b -> share_b; share_b -> b1; share_b -> b2; share_b -> b3; a1 -> "*1"; b1 -> "*1"; a2 -> "*2"; b2 -> "*2"; a3 -> "*3"; b3 -> "*3"; "*1" -> share1; "*2" -> share2; "*3" -> share3; share1 -> recombine1; share1 -> recombine2; share1 -> recombine3; share2 -> recombine1; share2 -> recombine2; share2 -> recombine3; share3 -> recombine1; share3 -> recombine2; share3 -> recombine3; recombine1 -> output1; recombine2 -> output2; recombine3 -> output3; }