digraph Lattice {
compound = true;
// Define nodes
splines=false;
node [shape=circle, style=filled];
nodesep=0.6;
TOP [label=<⊤>, fillcolor=black, fontcolor=white];
BOT [label=<⊥>, fillcolor=black, fontcolor=white];
// ----------------------
// Control
CTRL [label="ctrl", fillcolor=yellow, shape=oval];
TOP -> CTRL;
CTRL -> BOT;
// ----------------------
// Integers
INT_TOP [label=<⊤:int>, fillcolor=lightblue, shape=oval];
INT_BOT [label=<⊥:int>, fillcolor=lightblue, shape=oval];
INT_MIN [label="-n" , fillcolor=lightblue];
INT_MINDOTS [label="...", fillcolor=lightblue shape=oval];
INT_MINUS [label="-1" , fillcolor=lightblue];
INT_ZERO [label="0" , fillcolor=lightblue];
INT_PLUS [label="1" , fillcolor=lightblue];
INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval];
INT_MAX [label="+n" , fillcolor=lightblue];
TOP -> INT_TOP;
INT_TOP -> INT_MIN;
INT_TOP -> INT_MINDOTS;
INT_TOP -> INT_MINUS;
INT_TOP -> INT_ZERO;
INT_TOP -> INT_PLUS;
INT_TOP -> INT_MAXDOTS;
INT_TOP -> INT_MAX;
INT_MIN -> INT_BOT;
INT_MINDOTS -> INT_BOT;
INT_MINUS -> INT_BOT;
INT_ZERO -> INT_BOT;
INT_PLUS -> INT_BOT;
INT_MAXDOTS -> INT_BOT;
INT_MAX -> INT_BOT;
INT_BOT -> BOT;
INT_MIN -> INT_MINDOTS -> INT_MINUS -> INT_ZERO -> INT_PLUS -> INT_MAXDOTS -> INT_MAX [style=invis];
// ----------------------
// Tuples
TUPLE_TOP [label=<⊤:tuple>, fillcolor=pink, shape=oval];
TUPLE_BOT [label=<⊥:tuple>, fillcolor=pink, shape=oval];
TUPLE1 [shape=none, fillcolor=none, label=<
>];
TUPLE2 [shape=none, fillcolor=none, label=<
>];
TUPLEN [shape=none, fillcolor=none, label=<
>];
TOP -> TUPLE_TOP;
TUPLE_TOP -> TUPLE1;
TUPLE_TOP -> TUPLE2;
TUPLE_TOP -> TUPLEN;
TUPLE1 -> TUPLE_BOT;
TUPLE2 -> TUPLE_BOT;
TUPLEN -> TUPLE_BOT;
TUPLE_BOT -> BOT;
// Additional customization
{rank=same; TOP}
{rank=same; INT_TOP; TUPLE_TOP}
{rank=same;
CTRL;
INT_MIN; INT_MINDOTS; INT_MINUS; INT_ZERO; INT_PLUS; INT_MAXDOTS; INT_MAX;
}
{rank=same; INT_BOT, TUPLE_BOT}
{rank=same; BOT;}
}