summaryrefslogtreecommitdiff
path: root/chapter10/docs/lattice.gv
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-11-26 17:00:45 -0800
committerCliff Click <cliffc@acm.org>2025-01-15 15:07:30 -0800
commit34766f1a2e9e60626eb1bd5a08140fc41a3770c8 (patch)
treef05f4657d2cfc046c14608f3e6617cdf8c604ace /chapter10/docs/lattice.gv
parent69249d4c8d043e6348ecf797a2afa391726ab6d7 (diff)
downloadSimple-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.gv210
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;}
}