digraph g { graph [splines = ortho]; // nodes g() subgraph cluster_g { enter_g [label=g()>,shape=rect,style=filled]; a_in [label="a = a_in",style="dashed,filled"]; l14 [label="if (a == 0)",style=filled] l15 [label="throw new Exception()",style=filled]; l17 [label="System.out.println(a)",style="filled,bold"]; gee [label="error exit",style="dashed"]; gne [label="normal exit",style="dashed"]; } // nodes f() subgraph cluster_f { enter_f [label=f()>,shape=rect,style=filled]; fee [label="error exit",style="dashed"] x_in [label="x = x_in",style="dashed,filled"]; l3 [label="g(x)",style=filled]; l3_in [label="a_in = x",style="dashed,filled"]; nr3 [label="normal return",style="dashed"]; nr10 [label="normal return",style="dashed"]; l4 [label="catch (Exception e)"]; l5 [label="System.err.println(\"Error\")"]; l8 [label="System.out.println(\"g() was ok\")"]; l10 [label="g(x + 1)",style=filled]; l10_in [label="a_in = x + 1",style="dashed,filled"]; try [style=filled]; //{rank=same; l3_in nr3} //{rank=same; l10_in nr10 fee} //{rank=same; x_in try} } // control g() enter_g -> a_in; enter_g -> l14 -> l15 -> gee; {l14 l15} -> l17; l14 -> gne; // control f() enter_f -> {x_in l10}; enter_f -> try -> l3 -> {nr3; l4}; nr3 -> l8; l4 -> l5; l10 -> {nr10; fee}; l3 -> l3_in; l10 -> l10_in; { // data edge [color=red,constraint=false]; a_in -> l14 [constraint=true]; a_in -> l17; x_in -> {l3_in l10_in}; } { // order edge [style=invis]; //a_in -> gne -> gee; //x_in -> try; //l3_in -> nr3 -> l4; //l10_in -> nr10 -> fee; } { edge [constraint = false, style = dashed]; {l3 l10} -> enter_g [style = bold]; {l3_in l10_in} -> a_in; //gee -> {fee l4}; //gne -> {nr10 nr3}; } }