digraph Lattice { // Define nodes splines=false; node [shape=circle, style=filled, fillcolor=lightblue]; nodesep=0.6; TOP [label="⊤"]; BOT [label="⊥"]; CTRL [label="Ctrl"]; XCTRL [label="~Ctrl"]; INT_TOP [label="IntTop"]; INT_BOT [label="IntBot"]; INT_MIN [label="-n"]; INT_MINDOTS [label="..." shape=none style=none]; INT_MINUS [label="-1"]; INT_ZERO [label="0"]; INT_PLUS [label="1"]; INT_MAXDOTS [label="..." shape=none style=none]; INT_MAX [label="+n"]; STRUCT_TOP [label="$TOP"]; STRUCT_S1 [label="S1"]; STRUCT_S2 [label="S2"]; STRUCT_BOT [label="$BOT"] PTR_TOP [label="*$TOP"]; PTR_NULL [label="null"]; PTR_VOIDPTR [label="*void"]; PTR_S1 [label="*S1"]; PTR_S2 [label="*S2"]; PTR_S1OPT [label="*S1?"]; PTR_S2OPT [label="*S2?"]; 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 -> CTRL; CTRL -> XCTRL; XCTRL -> BOT; TOP -> INT_TOP; INT_TOP -> INT_MIN; INT_TOP -> INT_MINDOTS; INT_TOP -> INT_MINUS; INT_TOP -> INT_ZERO; INT_TOP -> INT_PLUS; INT_TOP -> INT_MAXDOTS; INT_TOP -> INT_MAX; INT_MIN -> INT_BOT; INT_MINDOTS -> INT_BOT; INT_MINUS -> INT_BOT; INT_ZERO -> INT_BOT; INT_PLUS -> INT_BOT; INT_MAXDOTS -> INT_BOT; INT_MAX -> INT_BOT; INT_BOT -> BOT; INT_MIN -> INT_MINDOTS -> INT_MINUS -> INT_ZERO -> INT_PLUS -> INT_MAXDOTS -> INT_MAX [style=invis]; TOP -> STRUCT_TOP; STRUCT_TOP -> STRUCT_S1; STRUCT_TOP -> STRUCT_S2; STRUCT_S1 -> STRUCT_BOT; STRUCT_S2 -> STRUCT_BOT; STRUCT_BOT -> BOT; TOP -> PTR_TOP; PTR_TOP -> PTR_S1; PTR_TOP -> PTR_S2; PTR_TOP -> PTR_NULL; PTR_TOP -> PTR_VOIDPTR; PTR_NULL -> PTR_BOT; PTR_NULL -> PTR_S1OPT; PTR_NULL -> PTR_S2OPT; PTR_S1 -> PTR_S1OPT; PTR_S1 -> PTR_VOIDPTR; PTR_S2 -> PTR_S2OPT; PTR_S2 -> PTR_VOIDPTR; PTR_VOIDPTR -> PTR_BOT; PTR_S1OPT -> PTR_BOT; PTR_S2OPT -> PTR_BOT; PTR_BOT -> BOT; 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; CTRL; STRUCT_TOP; PTR_TOP; MEM_TOP;} {rank=same; PTR_S1; PTR_S2;} {rank=same; INT_MIN; INT_MINDOTS; INT_MINUS; INT_ZERO; INT_PLUS; INT_MAXDOTS; INT_MAX; STRUCT_S1; STRUCT_S2; PTR_NULL; PTR_VOIDPTR; MEM_ALIAS1; MEM_ALIAS2; MEM_ALIASDOTS; MEM_ALIASN;} {rank=same; PTR_S1OPT; PTR_S2OPT;} {rank=same; INT_BOT; XCTRL; STRUCT_BOT; PTR_BOT; MEM_BOT;} {rank=same; BOT;} }