digraph g {
// nodes g()
subgraph cluster_g {
    enter_g [label=<entry<br/>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=<entry<br/>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;
}
}