digraph Lattice { // Define nodes splines=false; node [shape=circle, style=filled, fillcolor=lightblue]; nodesep=0.6; TOP [label="⊤"]; BOT [label="⊥"]; XCTRL [label="~Ctrl"]; CTRL [label="Ctrl"]; INT_TOP [label="IntTop"]; INT_BOT [label="IntBot"]; INT_MIN [label="-n"]; INT_MINDOTS [label="..." shape=none style=none]; INT_ZERO [label="0"]; INT_MAXDOTS [label="..." shape=none style=none]; INT_MAX [label="+n"]; TUPLE [label="TUPLE"]; STRUCT_TOP [label="$TOP"]; STRUCT_S1 [label="S1"]; STRUCT_DOTS [label="..." shape=none style=none]; STRUCT_SN [label="Sn"]; STRUCT_BOT [label="$BOT"] PTR_TOP [label="*$TOP"]; PTR_NULL [label="null"]; PTR_VOIDPTR [label="*void"]; PTR_S1 [label="*S1"]; PTR_SDOTS [label="..." shape=none style=none]; PTR_SN [label="*SN"]; PTR_S1OPT [label="*S1?"]; PTR_SOPTDOTS [label="..." shape=none style=none]; PTR_SNOPT [label="*SN?"]; PTR_BOT [label="*$BOT?"]; MEM_TOP [label="MEM#TOP"]; MEM_ALIAS1 [label="#1"]; MEM_ALIAS2 [label="#2"]; MEM_ALIASDOTS [label="..." shape=none style=none]; MEM_ALIASN [label="#n"]; MEM_BOT [label="MEM#BOT"]; // Define edges edge [arrowhead=none]; TOP -> XCTRL; XCTRL -> CTRL; CTRL -> BOT; TOP -> INT_TOP; INT_TOP -> INT_MIN; INT_TOP -> INT_MINDOTS; INT_TOP -> INT_ZERO; INT_TOP -> INT_MAXDOTS; INT_TOP -> INT_MAX; INT_MIN -> INT_BOT; INT_MINDOTS -> INT_BOT; INT_ZERO -> INT_BOT; INT_MAXDOTS -> INT_BOT; INT_MAX -> INT_BOT; INT_BOT -> BOT; INT_MIN -> INT_MINDOTS -> INT_ZERO -> INT_MAXDOTS -> INT_MAX [style=invis]; TOP -> TUPLE; TUPLE -> BOT; TOP -> STRUCT_TOP; STRUCT_TOP -> STRUCT_S1; STRUCT_TOP -> STRUCT_DOTS; STRUCT_TOP -> STRUCT_SN; STRUCT_S1 -> STRUCT_BOT; STRUCT_DOTS -> STRUCT_BOT; STRUCT_SN -> STRUCT_BOT; STRUCT_BOT -> BOT; STRUCT_S1 -> STRUCT_DOTS -> STRUCT_SN [style=invis]; TOP -> PTR_TOP; PTR_TOP -> PTR_S1; PTR_TOP -> PTR_SDOTS; PTR_TOP -> PTR_SN; PTR_TOP -> PTR_NULL; PTR_TOP -> PTR_VOIDPTR; PTR_NULL -> PTR_BOT; PTR_NULL -> PTR_S1OPT; PTR_NULL -> PTR_SOPTDOTS; PTR_NULL -> PTR_SNOPT; PTR_S1 -> PTR_S1OPT; PTR_S1 -> PTR_VOIDPTR; PTR_SDOTS -> PTR_SOPTDOTS; PTR_SDOTS -> PTR_VOIDPTR; PTR_SN -> PTR_SNOPT; PTR_SN -> PTR_VOIDPTR; PTR_VOIDPTR -> PTR_BOT; PTR_S1OPT -> PTR_BOT; PTR_SOPTDOTS -> PTR_BOT; PTR_SNOPT -> PTR_BOT; PTR_BOT -> BOT; PTR_S1 -> PTR_SDOTS -> PTR_SN [style=invis]; PTR_S1OPT -> PTR_SOPTDOTS -> PTR_SNOPT [style=invis]; TOP -> MEM_TOP; MEM_TOP -> MEM_ALIAS1; MEM_TOP -> MEM_ALIAS2; MEM_TOP -> MEM_ALIASDOTS; MEM_TOP -> MEM_ALIASN; MEM_ALIAS1 -> MEM_BOT; MEM_ALIAS2 -> MEM_BOT; MEM_ALIASDOTS -> MEM_BOT; MEM_ALIASN -> MEM_BOT; MEM_BOT -> BOT; MEM_ALIAS1 -> MEM_ALIAS2 -> MEM_ALIASDOTS -> MEM_ALIASN [style=invis]; // Additional customization {rank=same; TOP;} {rank=same; INT_TOP; XCTRL; STRUCT_TOP; PTR_TOP; MEM_TOP;} {rank=same; PTR_S1; PTR_SDOTS; PTR_SN;} {rank=same; INT_MIN; INT_MINDOTS; INT_ZERO; INT_MAXDOTS; INT_MAX; TUPLE; STRUCT_S1; STRUCT_DOTS; STRUCT_SN; PTR_NULL; PTR_VOIDPTR; MEM_ALIAS1; MEM_ALIAS2; MEM_ALIASDOTS; MEM_ALIASN;} {rank=same; PTR_S1OPT; PTR_SOPTDOTS; PTR_SNOPT; } {rank=same; INT_BOT; CTRL; STRUCT_BOT; PTR_BOT; MEM_BOT;} {rank=same; BOT;} }