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]; // ---------------------- // Floats FLT_TOP [label=<⊤:flt>, fillcolor=aqua, shape=oval]; FLT_BOT [label=<⊥:flt>, fillcolor=aqua, shape=oval]; FLT_MINDOTS [label="...", fillcolor=aqua, shape=oval]; FLT_ZERO [label="0" , fillcolor=aqua]; FLT_MAXDOTS [label="...", fillcolor=aqua, shape=oval]; TOP -> FLT_TOP; FLT_TOP -> FLT_MINDOTS; FLT_TOP -> FLT_ZERO; FLT_TOP -> FLT_MAXDOTS; FLT_MINDOTS -> FLT_BOT; FLT_ZERO -> FLT_BOT; FLT_MAXDOTS -> FLT_BOT; FLT_BOT -> BOT; FLT_MINDOTS -> FLT_ZERO -> FLT_MAXDOTS [style=invis]; // ---------------------- // Pointers, just a boolean nil/not and a struct PTR [shape=none, fillcolor=none, label=<
*ptr
struct
>]; PTR0 [shape=none, fillcolor=none, label=<
*ptr?
struct
>]; 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=<
fieldint/ptr
>]; STRUCT_S2 [shape=none, fillcolor=none, label=<
fieldint/ptr
fieldint/ptr
>]; STRUCT_SN [shape=none, fillcolor=none, label=<
fieldint/ptr
... int/ptr
fieldint/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]; MEM_ALIAS1 [label="#1" , fillcolor=blue, fontcolor=white]; MEM_ALIASDOTS [label="..." , fillcolor=blue, fontcolor=white, shape=oval]; MEM_ALIASN [label="#n" , fillcolor=blue, fontcolor=white]; TOP -> MEM_TOP; MEM_TOP -> MEM_ALIAS1; MEM_TOP -> MEM_ALIASDOTS; MEM_TOP -> MEM_ALIASN; MEM_ALIAS1 -> MEM_BOT; MEM_ALIASDOTS -> MEM_BOT; MEM_ALIASN -> MEM_BOT; MEM_BOT -> BOT; MEM_ALIAS1 -> MEM_ALIASDOTS -> MEM_ALIASN [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=<
Tuple
type
>]; TUPLE2 [shape=none, fillcolor=none, label=<
Tuple
type
type
>]; TUPLEN [shape=none, fillcolor=none, label=<
Tuple
type
...
type
>]; 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; FLT_TOP; XCTRL; STRUCT_TOP; MEM_TOP; TUPLE_TOP} {rank=same; INT_MINDOTS; INT_ZERO; INT_MAXDOTS; FLT_MINDOTS; FLT_ZERO; FLT_MAXDOTS; STRUCT_S1; STRUCT_S2; STRUCT_SN; MEM_ALIAS1; MEM_ALIASDOTS; MEM_ALIASN;} {rank=same; INT_BOT; FLT_BOT; CTRL; STRUCT_BOT; MEM_BOT; TUPLE_BOT} {rank=same; BOT;} }