digraph Taskflow { newrank=true; #columns subgraph { p00[label="stage-0-a"]; p10[label="stage-0-b"]; p20[label="stage-0-c"]; p30[label="stage-0-d"]; } subgraph { p01[label="stage-1-a"]; p11[label="stage-1-b"]; p21[label="stage-1-c"]; p31[label="stage-1-d"]; } subgraph { p02[label="stage-2-a"]; p12[label="stage-2-b"]; p22[label="stage-2-c"]; p32[label="stage-2-d"]; } subgraph { p03[label="stage-3-a"]; p13[label="stage-3-b"]; p23[label="stage-3-c"]; p33[label="stage-3-d"]; } subgraph cluster0 { rank="same"; style="dashed"; p00; p01; p02; p03; } subgraph cluster1 { rank="same"; style="dashed"; p10; p11; p12; p13; } subgraph cluster2 { rank="same"; style="dashed"; p20; p21; p22; p23; } subgraph cluster3 { rank="same"; style="dashed"; p30; p31; p32; p33; } p00 -> p01; p01 -> p02; p02 -> p03; p10 -> p11; p11 -> p12; p12 -> p13; p20 -> p21; p21 -> p22; p22 -> p23; p30 -> p31; p31 -> p32; p32 -> p33; p00 -> p10; p01 -> p11; p02 -> p12; p03 -> p13; p10 -> p20; p11 -> p21; p12 -> p22; p13 -> p23; p20 -> p30; p21 -> p31; p22 -> p32; p23 -> p33; }