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_HI [label="max < min" , fillcolor=lightblue, shape=oval]; INT_XBOOL [label="1...0", fillcolor=lightblue, shape=oval]; INT_CON [label="constants", fillcolor=lightblue, shape=oval]; INT_CON0 [label="0", fillcolor=lightblue]; INT_CON1 [label="1", fillcolor=lightblue]; INT_BOOL [label="0...1", fillcolor=lightblue,shape=oval]; INT_LO [label="max > min" , fillcolor=lightblue, shape=oval]; TOP -> INT_TOP; INT_TOP -> INT_HI; INT_HI -> INT_XBOOL; INT_XBOOL -> INT_CON0; INT_XBOOL -> INT_CON1; INT_HI -> INT_CON; INT_CON0 -> INT_BOOL; INT_CON1 -> INT_BOOL; INT_BOOL -> INT_LO; INT_CON -> INT_LO; INT_LO -> INT_BOT; INT_BOT -> BOT; INT_CON0 -> INT_CON1 -> INT_CON [style=invis]; // ---------------------- // Integers FLT_TOP [label=<⊤:flt>, fillcolor=aqua, shape=oval]; FLT_BOT [label=<⊥:flt>, fillcolor=aqua, shape=oval]; FLT_CON64 [label="64b consts\n[excludes\n32b consts]" , fillcolor=aqua, shape=oval]; FLT_CON32 [label="32b consts", fillcolor=aqua, shape=oval]; FLT_CONPI [label="3.14159...", fillcolor=aqua, shape=oval]; FLT_X32 [label="~f32", fillcolor=aqua]; FLT_CON0 [label="0." , fillcolor=aqua]; FLT_32 [label="f32" , fillcolor=aqua]; TOP -> FLT_TOP; FLT_TOP -> FLT_CON64 FLT_TOP -> FLT_CONPI FLT_CON64 -> FLT_BOT FLT_CONPI -> FLT_BOT FLT_TOP -> FLT_X32; FLT_X32 -> FLT_CON0; FLT_X32 -> FLT_CON32; FLT_CON0 -> FLT_32; FLT_CON32 -> FLT_32; FLT_32 -> FLT_BOT FLT_BOT -> BOT; FLT_CON0 -> FLT_CON32 -> FLT_CONPI -> FLT_CON64 [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; PTR; STRUCT_TOP; MEM_TOP; TUPLE_TOP} {rank=same; INT_CON; INT_CON0; INT_CON1; FLT_CON32; FLT_CON64; FLT_CON0; FLT_CONPI; STRUCT_S1; STRUCT_S2; STRUCT_SN; MEM_ALIAS1; MEM_ALIASDOTS; MEM_ALIASN; TUPLE1; TUPLE2; TUPLEN; } {rank=same; INT_BOT; FLT_BOT; CTRL; PTR0; STRUCT_BOT; MEM_BOT; TUPLE_BOT} {rank=same; BOT;} }