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
XCTRL [label=<⊤:ctrl>, fillcolor=yellow, shape=oval];
CTRL [label=<⊥:ctrl>, fillcolor=yellow, shape=oval];
TOP -> XCTRL;
XCTRL -> CTRL;
CTRL -> BOT;
// ----------------------
// Integers
INT_TOP [label=<⊤:int>, fillcolor=lightblue, shape=oval];
INT_BOT [label=<⊥:int>, fillcolor=lightblue, shape=oval];
INT_MINDOTS [label="...", fillcolor=lightblue, shape=oval];
INT_ZERO [label="0" , fillcolor=lightblue];
INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval];
TOP -> INT_TOP;
INT_TOP -> INT_MINDOTS;
INT_TOP -> INT_ZERO;
INT_TOP -> INT_MAXDOTS;
INT_MINDOTS -> INT_BOT;
INT_ZERO -> INT_BOT;
INT_MAXDOTS -> INT_BOT;
INT_BOT -> BOT;
INT_MINDOTS -> INT_ZERO -> INT_MAXDOTS [style=invis];
// ----------------------
// Pointers, just a boolean nil/not and a struct
PTR [shape=none, fillcolor=none, label=<
>];
PTR0 [shape=none, fillcolor=none, label=<
>];
TOP -> PTR;
PTR -> PTR0;
PTR0 -> BOT;
// ----------------------
// Structs
STRUCT_TOP [label=<⊤:struct>, fillcolor=lightgreen, shape=oval];
STRUCT_BOT [label=<⊥:struct>, fillcolor=lightgreen, shape=oval];
STRUCT_S1 [shape=none, fillcolor=none, label=<
>];
STRUCT_S2 [shape=none, fillcolor=none, label=<
| field | int/ptr |
| field | int/ptr |
>];
STRUCT_SN [shape=none, fillcolor=none, label=<
| field | int/ptr |
| ... | int/ptr |
| field | int/ptr |
>];
TOP -> STRUCT_TOP;
STRUCT_TOP -> STRUCT_S1;
STRUCT_TOP -> STRUCT_S2;
STRUCT_TOP -> STRUCT_SN;
STRUCT_S1 -> STRUCT_BOT;
STRUCT_S2 -> STRUCT_BOT;
STRUCT_SN -> STRUCT_BOT;
STRUCT_BOT -> BOT;
STRUCT_S1 -> STRUCT_S2 -> STRUCT_SN [style=invis];
// ----------------------
// Memory
MEM_TOP [label=<⊤:mem>, fillcolor=blue, fontcolor=white, shape=oval];
MEM_BOT [label=<⊥:mem>, fillcolor=blue, fontcolor=white, shape=oval];
TOP -> MEM_TOP;
MEM_TOP -> MEM_BOT;
MEM_BOT -> BOT;
// ----------------------
// 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; XCTRL; STRUCT_TOP; MEM_TOP; TUPLE_TOP}
{rank=same; INT_MINDOTS; INT_ZERO; INT_MAXDOTS;
STRUCT_S1; STRUCT_S2; STRUCT_SN;}
{rank=same; INT_BOT; CTRL; STRUCT_BOT; MEM_BOT; TUPLE_BOT}
{rank=same; BOT;}
}