Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange edge placement in Graphviz Dot

I have a module that automatically outputs (in dot format) functions written in some kind of assembly language (the IR of my compiler). The nodes are the basic blocks printed using the 'record' shape. The problem is that the edges take a strange route, for example:

digraph {
node [shape = record];
n0[label="{<name> entry | <body> store i, 0\nstore sum, 0\ngoto test | {<target> target}}"];
n1[label="{<name> test | <body> t2 = load i\nif t4, body,   done | {<true> true | <false> false}}"]
n2[label="{<name> body | <body> t5 = load sum\ngoto test | {<target> target}}"];
n3[color=firebrick3, label="{<name> done | <body> t9 = load sum\nret t9}}"];
n0:target:s -> n1:name:n
n1:true:s -> n2:name:n
n1:false:s -> n3:name:n
n2:target:s -> n1:name:n
}

And an image:

What can I do so that the edge from 'target' to 'test' is placed on the left side?

like image 317
Gratian Lup Avatar asked Nov 05 '10 14:11

Gratian Lup


1 Answers

The simplest non-guru way is force that wayward link to attach on the "west" sides.

n2:target:w -> n1:name:w

This might work okay for this case. A more general way, but takes more thinking and coding, but would allow the edge to attach to the :s and :n if you desire that, is add an invisible node of size zero (color=white, or there might be a visibility attribute) and get from n2 to n1 using two edges. Have the arrowhead on only one of them. The invisible node would have to sit to the left of n1 or n2. Alas, my graphvis-fu is not strong enough to create a working example; maybe someone else can create one.

alt text

like image 183
DarenW Avatar answered Oct 22 '22 13:10

DarenW