diff options
| author | Cliff Click <cliffc@acm.org> | 2024-11-26 17:00:45 -0800 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-01-15 15:07:30 -0800 |
| commit | 34766f1a2e9e60626eb1bd5a08140fc41a3770c8 (patch) | |
| tree | f05f4657d2cfc046c14608f3e6617cdf8c604ace /chapter10/docs/lattice.gv | |
| parent | 69249d4c8d043e6348ecf797a2afa391726ab6d7 (diff) | |
| download | Simple-34766f1a2e9e60626eb1bd5a08140fc41a3770c8.tar.gz Simple-34766f1a2e9e60626eb1bd5a08140fc41a3770c8.zip | |
Upgrades to the Type lattice diagrams
Diffstat (limited to 'chapter10/docs/lattice.gv')
| -rw-r--r-- | chapter10/docs/lattice.gv | 210 |
1 files changed, 122 insertions, 88 deletions
diff --git a/chapter10/docs/lattice.gv b/chapter10/docs/lattice.gv index c074f1a4..5ac1bd5a 100644 --- a/chapter10/docs/lattice.gv +++ b/chapter10/docs/lattice.gv @@ -1,56 +1,32 @@ digraph Lattice { + compound = true; // Define nodes splines=false; - node [shape=circle, style=filled, fillcolor=lightblue]; + node [shape=circle, style=filled]; 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; + TOP [label=<<B>⊤ </B>>, fillcolor=black, fontcolor=white]; + BOT [label=<<B>⊥</B>>, fillcolor=black, fontcolor=white]; + + // ---------------------- + // Control + XCTRL [label=<<B>⊤ </B>:ctrl>, fillcolor=yellow, shape=oval]; + CTRL [label=<<B>⊥</B>:ctrl>, fillcolor=yellow, shape=oval]; + + TOP -> XCTRL; XCTRL -> CTRL; - CTRL -> BOT; + CTRL -> BOT; + + // ---------------------- + // Integers + INT_TOP [label=<<B>⊤ </B>:int>, fillcolor=lightblue, shape=oval]; + INT_BOT [label=<<B>⊥</B>:int>, fillcolor=lightblue, shape=oval]; + + INT_MIN [label="-n" , fillcolor=lightblue]; + INT_MINDOTS [label="...", fillcolor=lightblue, shape=oval]; + INT_ZERO [label="0" , fillcolor=lightblue]; + INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval]; + INT_MAX [label="+n" , fillcolor=lightblue]; TOP -> INT_TOP; INT_TOP -> INT_MIN; @@ -67,69 +43,127 @@ digraph Lattice { INT_MIN -> INT_MINDOTS -> INT_ZERO -> INT_MAXDOTS -> INT_MAX [style=invis]; - TOP -> TUPLE; - TUPLE -> BOT; + // ---------------------- + // Pointers, just a boolean nil/not and a struct + PTR [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TR><TD BGCOLOR="green"><FONT color="white">*ptr</FONT></TD></TR> + <TR><TD BGCOLOR="lightgreen">struct</TD></TR> + </TABLE> + >]; + PTR0 [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TR><TD BGCOLOR="green"><FONT color="white">*ptr?</FONT></TD></TR> + <TR><TD BGCOLOR="lightgreen">struct</TD></TR> + </TABLE> + >]; + + TOP -> PTR; + PTR -> PTR0; + PTR0 -> BOT; + + // ---------------------- + // Structs + STRUCT_TOP [label=<<B>⊤</B>:struct>, fillcolor=lightgreen, shape=oval]; + + STRUCT_S1 [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int:ptr</TD></TR> + </TABLE> + >]; + STRUCT_S2 [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int:ptr</TD></TR> + <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int:ptr</TD></TR> + </TABLE> + >]; + STRUCT_SN [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int:ptr</TD></TR> + <TR><TD BGCOLOR="lightgreen">... </TD><TD BGCOLOR="lightblue:green" gradientangle="315">int:ptr</TD></TR> + <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int:ptr</TD></TR> + </TABLE> + >]; + + STRUCT_BOT [label=<<B>⊥</B>:struct>, fillcolor=lightgreen, shape=oval] TOP -> STRUCT_TOP; STRUCT_TOP -> STRUCT_S1; - STRUCT_TOP -> STRUCT_DOTS; + STRUCT_TOP -> STRUCT_S2; STRUCT_TOP -> STRUCT_SN; STRUCT_S1 -> STRUCT_BOT; - STRUCT_DOTS -> STRUCT_BOT; + STRUCT_S2 -> 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]; + STRUCT_S1 -> STRUCT_S2 -> STRUCT_SN [style=invis]; + + // ---------------------- + // Memory + MEM_TOP [label=<<B>⊤</B>: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]; + MEM_BOT [label=<<B>⊥</B>:mem>, fillcolor=blue, fontcolor=white, shape=oval]; 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]; - + MEM_ALIAS1 -> MEM_ALIASDOTS -> MEM_ALIASN [style=invis]; + + // ---------------------- + // Tuples + + TUPLE_TOP [label=<<B>⊤</B>:tuple>, fillcolor=pink, shape=oval]; + + TUPLE1 [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TH><TD BGCOLOR="pink">Tuple</TD></TH> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + </TABLE> + >]; + TUPLE2 [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TH><TD BGCOLOR="pink">Tuple</TD></TH> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + </TABLE> + >]; + TUPLEN [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TH><TD BGCOLOR="pink">Tuple</TD></TH> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + <TR><TD BGCOLOR="black" ><FONT color="white">...</FONT></TD></TR> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + </TABLE> + >]; + + TUPLE_BOT [label=<<B>⊥</B>:tuple>, fillcolor=pink, shape=oval]; + + 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; XCTRL; STRUCT_TOP; PTR_TOP; MEM_TOP;} - {rank=same; PTR_S1; PTR_SDOTS; PTR_SN;} + {rank=same; INT_TOP; XCTRL; STRUCT_TOP; MEM_TOP; TUPLE_TOP} {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; + INT_MAX; STRUCT_S1; STRUCT_S2; STRUCT_SN; + MEM_ALIAS1; 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; INT_BOT; CTRL; STRUCT_BOT; MEM_BOT; TUPLE_BOT} {rank=same; BOT;} } |
