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];
// ----------------------
// Floats
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];
// ----------------------
// sub-Floats
FL8_TOP [label=<⊤:FP8>, fillcolor=aqua, shape=oval];
FL8_BOT [label=<⊥:FP8>, fillcolor=aqua, shape=oval];
FL8_MINDOTS [label="...", fillcolor=aqua, shape=oval];
FL8_ZERO [label="0" , fillcolor=aqua];
FL8_MAXDOTS [label="...", fillcolor=aqua, shape=oval];
TOP -> FL8_TOP;
FL8_TOP -> FL8_MINDOTS;
FL8_TOP -> FL8_ZERO;
FL8_TOP -> FL8_MAXDOTS;
FL8_MINDOTS -> FL8_BOT;
FL8_ZERO -> FL8_BOT;
FL8_MAXDOTS -> FL8_BOT;
FL8_BOT -> BOT;
FL8_MINDOTS -> FL8_ZERO -> FL8_MAXDOTS [style=invis];
// ----------------------
// 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];
// ----------------------
// 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;
// Additional customization
{rank=same; TOP}
{rank=same; INT_TOP; FLT_TOP; FL8_TOP; XCTRL }
{rank=same; INT_CON; INT_CON0; INT_CON1;
FLT_CON32; FLT_CON64; FLT_CON0; FLT_CONPI;
FL8_MINDOTS; FL8_ZERO; FL8_MAXDOTS;
STRUCT_S1; STRUCT_S2; STRUCT_SN;
}
{rank=same; INT_BOT; FLT_BOT; FL8_BOT; STRUCT_BOT; PTR0; CTRL; }
{rank=same; BOT;}
}