summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-11-27 11:29:33 -0800
committerCliff Click <cliffc@acm.org>2025-01-15 15:07:30 -0800
commit65454d77eba95d7f814336377f78d9f42c7455f9 (patch)
tree976efed369498c7e976fe5098f6a406fed81cb53
parent34766f1a2e9e60626eb1bd5a08140fc41a3770c8 (diff)
downloadSimple-65454d77eba95d7f814336377f78d9f42c7455f9.tar.gz
Simple-65454d77eba95d7f814336377f78d9f42c7455f9.zip
More lattice docs reworks
-rw-r--r--chapter02/README.md13
-rw-r--r--chapter02/docs/02-lattice.gv35
-rw-r--r--chapter02/docs/02-lattice.svg143
-rw-r--r--chapter02/docs/lattice.gv40
-rw-r--r--chapter02/docs/lattice.svg159
-rw-r--r--chapter04/README.md41
-rw-r--r--chapter04/docs/lattice.gv81
-rw-r--r--chapter04/docs/lattice.svg260
-rw-r--r--chapter06/docs/lattice.gv86
-rw-r--r--chapter06/docs/lattice.svg293
-rw-r--r--chapter10/README.md63
-rw-r--r--chapter10/docs/lattice.gv46
-rw-r--r--chapter10/docs/lattice.svg602
-rw-r--r--chapter12/README.md3
-rw-r--r--chapter12/docs/lattice.gv182
-rw-r--r--chapter12/docs/lattice.svg598
-rw-r--r--chapter14/README.md21
-rw-r--r--chapter14/docs/lattice.gv202
-rw-r--r--chapter14/docs/lattice.svg691
19 files changed, 2775 insertions, 784 deletions
diff --git a/chapter02/README.md b/chapter02/README.md
index db23796d..04e34eb9 100644
--- a/chapter02/README.md
+++ b/chapter02/README.md
@@ -93,17 +93,18 @@ Type
```
It turns out that the set of values associated with a Type at a specific Node
-can be conveniently represented as a "lattice"
-https://en.wikipedia.org/wiki/Lattice_(order)
-. Our lattice has the following structure:
+can be conveniently represented as a *lattice*
+[wiki/Lattice_(order)](https://en.wikipedia.org/wiki/Lattice_(order)). Our lattice has the following structure:
-![Lattice](./docs/02-lattice.svg)
+![Lattice](./docs/lattice.svg)
Our lattice elements can be one of three types:
-* The highest element is "top", denoted by T; assigning T means that the Node's value may or may not be a compile time constant.
+* The highest element is "top", denoted by ⊤; assigning ⊤ means that the Node's
+ value may or may not be a compile time constant.
* All elements in the middle are constants.
-* The lowest is "bottom", denoted by ⊥; assigning ⊥ means that we know that the Node's value is **not** a compile time constant.
+* The lowest is "bottom", denoted by ⊥; assigning ⊥ means that we know that the
+ Node's value is **not** a compile time constant.
An invariant of peephole optimizations is that the type of a Node always moves
*up* the lattice (towards "top"); peepholes are *pessmistic* assuming the worst
diff --git a/chapter02/docs/02-lattice.gv b/chapter02/docs/02-lattice.gv
deleted file mode 100644
index 4faa0e11..00000000
--- a/chapter02/docs/02-lattice.gv
+++ /dev/null
@@ -1,35 +0,0 @@
-digraph Lattice {
- // Define nodes
- node [shape=circle, style=filled, fillcolor=lightblue];
- Top [label="⊤"];
- Bottom [label="⊥"];
-
- A [label="MIN_INT"];
- B [label="..." shape=none style=none];
- C [label="-1"];
- D [label="0"];
- E [label="1"];
- F [label="..." shape=none style=none];
- G [label="MAX_INT"];
-
-
- // Define edges
- Top -> A [arrowhead=none];
- Top -> B [arrowhead=none];
- Top -> C [arrowhead=none];
- Top -> D [arrowhead=none];
- Top -> E [arrowhead=none];
- Top -> F [arrowhead=none];
- Top -> G [arrowhead=none];
- A -> Bottom [arrowhead=none];
- B -> Bottom [arrowhead=none];
- C -> Bottom [arrowhead=none];
- D -> Bottom [arrowhead=none];
- E -> Bottom [arrowhead=none];
- F -> Bottom [arrowhead=none];
- G -> Bottom [arrowhead=none];
-
- // Additional customization
- {rank=same; A; B; C; D; E; F; G; }
- {rank=same; Bottom;}
-}
diff --git a/chapter02/docs/02-lattice.svg b/chapter02/docs/02-lattice.svg
deleted file mode 100644
index 218acc6a..00000000
--- a/chapter02/docs/02-lattice.svg
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.43.0 (0)
- -->
-<!-- Title: Lattice Pages: 1 -->
-<svg width="548pt" height="266pt"
- viewBox="0.00 0.00 547.59 265.88" xmlns="http://www.w3.org/2000/svg">
- <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 261.88)">
- <title>Lattice</title>
- <polygon fill="white" stroke="transparent" points="-4,4 -4,-261.88 543.59,-261.88 543.59,4 -4,4"/>
- <!-- Top -->
- <g id="node1" class="node">
- <title>Top</title>
- <ellipse fill="lightblue" stroke="black" cx="269.65" cy="-238.39" rx="19.5" ry="19.5"/>
- <text text-anchor="middle" x="269.65" y="-234.69" font-family="Times,serif" font-size="14.00">⊤</text>
- </g>
- <!-- A -->
- <g id="node3" class="node">
- <title>A</title>
- <ellipse fill="lightblue" stroke="black" cx="52.65" cy="-128.94" rx="52.79" ry="52.79"/>
- <text text-anchor="middle" x="52.65" y="-125.24" font-family="Times,serif" font-size="14.00">MIN_INT</text>
- </g>
- <!-- Top&#45;&gt;A -->
- <g id="edge1" class="edge">
- <title>Top&#45;&gt;A</title>
- <path fill="none" stroke="black"
- d="M250.55,-233.09C220.3,-225.77 160.13,-209.08 114.65,-182.89 106.3,-178.08 98.02,-172.1 90.35,-165.89"/>
- </g>
- <!-- B -->
- <g id="node4" class="node">
- <title>B</title>
- <text text-anchor="middle" x="150.65" y="-125.24" font-family="Times,serif" font-size="14.00">...</text>
- </g>
- <!-- Top&#45;&gt;B -->
- <g id="edge2" class="edge">
- <title>Top&#45;&gt;B</title>
- <path fill="none" stroke="black"
- d="M252.34,-228.66C234.5,-219.09 206.55,-202.47 186.65,-182.89 175.87,-172.28 166.38,-158 159.86,-146.95"/>
- </g>
- <!-- C -->
- <g id="node5" class="node">
- <title>C</title>
- <ellipse fill="lightblue" stroke="black" cx="214.65" cy="-128.94" rx="19.5" ry="19.5"/>
- <text text-anchor="middle" x="214.65" y="-125.24" font-family="Times,serif" font-size="14.00">&#45;1</text>
- </g>
- <!-- Top&#45;&gt;C -->
- <g id="edge3" class="edge">
- <title>Top&#45;&gt;C</title>
- <path fill="none" stroke="black" d="M261.05,-220.6C250.72,-200.41 233.48,-166.74 223.18,-146.61"/>
- </g>
- <!-- D -->
- <g id="node6" class="node">
- <title>D</title>
- <ellipse fill="lightblue" stroke="black" cx="269.65" cy="-128.94" rx="18" ry="18"/>
- <text text-anchor="middle" x="269.65" y="-125.24" font-family="Times,serif" font-size="14.00">0</text>
- </g>
- <!-- Top&#45;&gt;D -->
- <g id="edge4" class="edge">
- <title>Top&#45;&gt;D</title>
- <path fill="none" stroke="black" d="M269.65,-218.67C269.65,-198.47 269.65,-166.57 269.65,-147.03"/>
- </g>
- <!-- E -->
- <g id="node7" class="node">
- <title>E</title>
- <ellipse fill="lightblue" stroke="black" cx="323.65" cy="-128.94" rx="18" ry="18"/>
- <text text-anchor="middle" x="323.65" y="-125.24" font-family="Times,serif" font-size="14.00">1</text>
- </g>
- <!-- Top&#45;&gt;E -->
- <g id="edge5" class="edge">
- <title>Top&#45;&gt;E</title>
- <path fill="none" stroke="black" d="M278.08,-220.6C288.46,-199.94 305.94,-165.16 315.97,-145.22"/>
- </g>
- <!-- F -->
- <g id="node8" class="node">
- <title>F</title>
- <text text-anchor="middle" x="386.65" y="-125.24" font-family="Times,serif" font-size="14.00">...</text>
- </g>
- <!-- Top&#45;&gt;F -->
- <g id="edge6" class="edge">
- <title>Top&#45;&gt;F</title>
- <path fill="none" stroke="black"
- d="M286.52,-228.57C303.92,-218.93 331.18,-202.25 350.65,-182.89 361.2,-172.38 370.57,-158.37 377.1,-147.4"/>
- </g>
- <!-- G -->
- <g id="node9" class="node">
- <title>G</title>
- <ellipse fill="lightblue" stroke="black" cx="485.65" cy="-128.94" rx="53.89" ry="53.89"/>
- <text text-anchor="middle" x="485.65" y="-125.24" font-family="Times,serif" font-size="14.00">MAX_INT</text>
- </g>
- <!-- Top&#45;&gt;G -->
- <g id="edge7" class="edge">
- <title>Top&#45;&gt;G</title>
- <path fill="none" stroke="black"
- d="M288.46,-233C318.29,-225.56 377.63,-208.69 422.65,-182.89 430.83,-178.2 438.98,-172.41 446.57,-166.39"/>
- </g>
- <!-- Bottom -->
- <g id="node2" class="node">
- <title>Bottom</title>
- <ellipse fill="lightblue" stroke="black" cx="269.65" cy="-19.5" rx="19.5" ry="19.5"/>
- <text text-anchor="middle" x="269.65" y="-15.8" font-family="Times,serif" font-size="14.00">⊥</text>
- </g>
- <!-- A&#45;&gt;Bottom -->
- <g id="edge8" class="edge">
- <title>A&#45;&gt;Bottom</title>
- <path fill="none" stroke="black"
- d="M90.35,-91.99C98.02,-85.79 106.3,-79.8 114.65,-75 160.13,-48.81 220.3,-32.11 250.55,-24.79"/>
- </g>
- <!-- B&#45;&gt;Bottom -->
- <g id="edge9" class="edge">
- <title>B&#45;&gt;Bottom</title>
- <path fill="none" stroke="black"
- d="M159.86,-110.94C166.38,-99.88 175.87,-85.6 186.65,-75 206.55,-55.41 234.5,-38.79 252.34,-29.22"/>
- </g>
- <!-- C&#45;&gt;Bottom -->
- <g id="edge10" class="edge">
- <title>C&#45;&gt;Bottom</title>
- <path fill="none" stroke="black" d="M223.24,-111.15C233.57,-90.97 250.81,-57.3 261.11,-37.17"/>
- </g>
- <!-- D&#45;&gt;Bottom -->
- <g id="edge11" class="edge">
- <title>D&#45;&gt;Bottom</title>
- <path fill="none" stroke="black" d="M269.65,-110.68C269.65,-91.1 269.65,-59.3 269.65,-39.16"/>
- </g>
- <!-- E&#45;&gt;Bottom -->
- <g id="edge12" class="edge">
- <title>E&#45;&gt;Bottom</title>
- <path fill="none" stroke="black" d="M315.91,-112.55C305.88,-92.59 288.44,-57.9 278.08,-37.28"/>
- </g>
- <!-- F&#45;&gt;Bottom -->
- <g id="edge13" class="edge">
- <title>F&#45;&gt;Bottom</title>
- <path fill="none" stroke="black"
- d="M377.1,-110.49C370.57,-99.52 361.2,-85.5 350.65,-75 331.18,-55.63 303.92,-38.95 286.52,-29.31"/>
- </g>
- <!-- G&#45;&gt;Bottom -->
- <g id="edge14" class="edge">
- <title>G&#45;&gt;Bottom</title>
- <path fill="none" stroke="black"
- d="M446.57,-91.49C438.98,-85.48 430.83,-79.69 422.65,-75 377.63,-49.19 318.29,-32.33 288.46,-24.88"/>
- </g>
- </g>
-</svg>
diff --git a/chapter02/docs/lattice.gv b/chapter02/docs/lattice.gv
new file mode 100644
index 00000000..fe8df136
--- /dev/null
+++ b/chapter02/docs/lattice.gv
@@ -0,0 +1,40 @@
+digraph Lattice {
+ compound = true;
+ // Define nodes
+ splines=false;
+ node [shape=circle, style=filled];
+ nodesep=0.6;
+
+ // ----------------------
+ // 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_MINUS [label="-1" , fillcolor=lightblue];
+ INT_ZERO [label="0" , fillcolor=lightblue];
+ INT_PLUS [label="1" , fillcolor=lightblue];
+ INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval];
+ INT_MAX [label="+n" , fillcolor=lightblue];
+
+ 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_MIN -> INT_MINDOTS -> INT_MINUS -> INT_ZERO -> INT_PLUS -> INT_MAXDOTS -> INT_MAX [style=invis];
+
+ // Additional customization
+ {rank=same; INT_MIN; INT_MINDOTS; INT_MINUS; INT_ZERO; INT_PLUS; INT_MAXDOTS; INT_MAX; }
+}
diff --git a/chapter02/docs/lattice.svg b/chapter02/docs/lattice.svg
new file mode 100644
index 00000000..b11d57aa
--- /dev/null
+++ b/chapter02/docs/lattice.svg
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
+ -->
+<!-- Title: Lattice Pages: 1 -->
+<svg width="564pt" height="194pt"
+ viewBox="0.00 0.00 563.75 194.31" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 190.31)">
+<title>Lattice</title>
+<polygon fill="white" stroke="none" points="-4,4 -4,-190.31 559.75,-190.31 559.75,4 -4,4"/>
+<!-- INT_TOP -->
+<g id="node1" class="node">
+<title>INT_TOP</title>
+<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-168.31" rx="33.95" ry="18"/>
+<text text-anchor="start" x="259.72" y="-164.26" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="275.47" y="-164.26" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+</g>
+<!-- INT_MIN -->
+<g id="node3" class="node">
+<title>INT_MIN</title>
+<ellipse fill="lightblue" stroke="black" cx="18.6" cy="-93.15" rx="18.6" ry="18.6"/>
+<text text-anchor="middle" x="18.6" y="-88.1" font-family="Times New Roman,serif" font-size="14.00">&#45;n</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MIN -->
+<g id="edge1" class="edge">
+<title>INT_TOP&#45;&gt;INT_MIN</title>
+<path fill="none" stroke="black" d="M247,-158.92C197.13,-144.78 96.96,-116.37 47.53,-102.36"/>
+<polygon fill="black" stroke="black" points="48.71,-99.06 38.13,-99.69 46.8,-105.79 48.71,-99.06"/>
+</g>
+<!-- INT_MINDOTS -->
+<g id="node4" class="node">
+<title>INT_MINDOTS</title>
+<ellipse fill="lightblue" stroke="black" cx="107.6" cy="-93.15" rx="27" ry="18"/>
+<text text-anchor="middle" x="107.6" y="-88.1" font-family="Times New Roman,serif" font-size="14.00">...</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MINDOTS -->
+<g id="edge2" class="edge">
+<title>INT_TOP&#45;&gt;INT_MINDOTS</title>
+<path fill="none" stroke="black" d="M250.93,-156.2C221.31,-143.38 172.55,-122.27 140.26,-108.29"/>
+<polygon fill="black" stroke="black" points="141.94,-105.21 131.38,-104.45 139.16,-111.63 141.94,-105.21"/>
+</g>
+<!-- INT_MINUS -->
+<g id="node5" class="node">
+<title>INT_MINUS</title>
+<ellipse fill="lightblue" stroke="black" cx="196.6" cy="-93.15" rx="18.6" ry="18.6"/>
+<text text-anchor="middle" x="196.6" y="-88.1" font-family="Times New Roman,serif" font-size="14.00">&#45;1</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MINUS -->
+<g id="edge3" class="edge">
+<title>INT_TOP&#45;&gt;INT_MINUS</title>
+<path fill="none" stroke="black" d="M260.02,-152.15C247.97,-141.13 231.55,-126.11 218.43,-114.12"/>
+<polygon fill="black" stroke="black" points="220.83,-111.57 211.09,-107.41 216.11,-116.74 220.83,-111.57"/>
+</g>
+<!-- INT_ZERO -->
+<g id="node6" class="node">
+<title>INT_ZERO</title>
+<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-93.15" rx="18" ry="18"/>
+<text text-anchor="middle" x="276.6" y="-88.1" font-family="Times New Roman,serif" font-size="14.00">0</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_ZERO -->
+<g id="edge4" class="edge">
+<title>INT_TOP&#45;&gt;INT_ZERO</title>
+<path fill="none" stroke="black" d="M276.6,-149.97C276.6,-141.92 276.6,-132.14 276.6,-123.02"/>
+<polygon fill="black" stroke="black" points="280.1,-123.13 276.6,-113.13 273.1,-123.13 280.1,-123.13"/>
+</g>
+<!-- INT_PLUS -->
+<g id="node7" class="node">
+<title>INT_PLUS</title>
+<ellipse fill="lightblue" stroke="black" cx="355.6" cy="-93.15" rx="18" ry="18"/>
+<text text-anchor="middle" x="355.6" y="-88.1" font-family="Times New Roman,serif" font-size="14.00">1</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_PLUS -->
+<g id="edge5" class="edge">
+<title>INT_TOP&#45;&gt;INT_PLUS</title>
+<path fill="none" stroke="black" d="M292.96,-152.15C305.01,-141 321.48,-125.74 334.51,-113.68"/>
+<polygon fill="black" stroke="black" points="336.82,-116.31 341.78,-106.95 332.06,-111.18 336.82,-116.31"/>
+</g>
+<!-- INT_MAXDOTS -->
+<g id="node8" class="node">
+<title>INT_MAXDOTS</title>
+<ellipse fill="lightblue" stroke="black" cx="443.6" cy="-93.15" rx="27" ry="18"/>
+<text text-anchor="middle" x="443.6" y="-88.1" font-family="Times New Roman,serif" font-size="14.00">...</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MAXDOTS -->
+<g id="edge6" class="edge">
+<title>INT_TOP&#45;&gt;INT_MAXDOTS</title>
+<path fill="none" stroke="black" d="M302.32,-156.04C331.46,-143.28 379,-122.45 410.79,-108.53"/>
+<polygon fill="black" stroke="black" points="412.17,-111.74 419.93,-104.52 409.36,-105.33 412.17,-111.74"/>
+</g>
+<!-- INT_MAX -->
+<g id="node9" class="node">
+<title>INT_MAX</title>
+<ellipse fill="lightblue" stroke="black" cx="534.6" cy="-93.15" rx="21.15" ry="21.15"/>
+<text text-anchor="middle" x="534.6" y="-88.1" font-family="Times New Roman,serif" font-size="14.00">+n</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MAX -->
+<g id="edge7" class="edge">
+<title>INT_TOP&#45;&gt;INT_MAX</title>
+<path fill="none" stroke="black" d="M306.19,-158.92C355.31,-144.99 453.21,-117.23 503.38,-103.01"/>
+<polygon fill="black" stroke="black" points="504.07,-106.45 512.73,-100.35 502.16,-99.71 504.07,-106.45"/>
+</g>
+<!-- INT_BOT -->
+<g id="node2" class="node">
+<title>INT_BOT</title>
+<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-18" rx="33.95" ry="18"/>
+<text text-anchor="start" x="259.72" y="-13.95" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="275.47" y="-13.95" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+</g>
+<!-- INT_MIN&#45;&gt;INT_BOT -->
+<g id="edge8" class="edge">
+<title>INT_MIN&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M36.33,-87.13C77.31,-75.51 179.45,-46.55 236.48,-30.38"/>
+<polygon fill="black" stroke="black" points="237.13,-33.83 245.79,-27.73 235.22,-27.09 237.13,-33.83"/>
+</g>
+<!-- INT_MIN&#45;&gt;INT_MINDOTS -->
+<!-- INT_MINDOTS&#45;&gt;INT_BOT -->
+<g id="edge9" class="edge">
+<title>INT_MINDOTS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M129.69,-82.59C157.87,-70.39 206.96,-49.14 240.58,-34.59"/>
+<polygon fill="black" stroke="black" points="241.73,-37.91 249.51,-30.72 238.95,-31.48 241.73,-37.91"/>
+</g>
+<!-- INT_MINDOTS&#45;&gt;INT_MINUS -->
+<!-- INT_MINUS&#45;&gt;INT_BOT -->
+<g id="edge10" class="edge">
+<title>INT_MINUS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M210.17,-79.75C221.61,-69.28 238.28,-54.04 252.06,-41.44"/>
+<polygon fill="black" stroke="black" points="254.05,-44.36 259.07,-35.03 249.33,-39.19 254.05,-44.36"/>
+</g>
+<!-- INT_MINUS&#45;&gt;INT_ZERO -->
+<!-- INT_ZERO&#45;&gt;INT_BOT -->
+<g id="edge11" class="edge">
+<title>INT_ZERO&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M276.6,-74.82C276.6,-66.77 276.6,-56.98 276.6,-47.86"/>
+<polygon fill="black" stroke="black" points="280.1,-47.98 276.6,-37.98 273.1,-47.98 280.1,-47.98"/>
+</g>
+<!-- INT_ZERO&#45;&gt;INT_PLUS -->
+<!-- INT_PLUS&#45;&gt;INT_BOT -->
+<g id="edge12" class="edge">
+<title>INT_PLUS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M342.55,-80.07C331.3,-69.66 314.75,-54.33 301.04,-41.64"/>
+<polygon fill="black" stroke="black" points="303.78,-39.4 294.06,-35.17 299.02,-44.53 303.78,-39.4"/>
+</g>
+<!-- INT_PLUS&#45;&gt;INT_MAXDOTS -->
+<!-- INT_MAXDOTS&#45;&gt;INT_BOT -->
+<g id="edge13" class="edge">
+<title>INT_MAXDOTS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M421.42,-82.44C393.56,-70.24 345.4,-49.14 312.32,-34.65"/>
+<polygon fill="black" stroke="black" points="314.1,-31.61 303.54,-30.8 311.29,-38.02 314.1,-31.61"/>
+</g>
+<!-- INT_MAXDOTS&#45;&gt;INT_MAX -->
+<!-- INT_MAX&#45;&gt;INT_BOT -->
+<g id="edge14" class="edge">
+<title>INT_MAX&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M514.35,-86.41C471.9,-74.38 372.87,-46.3 316.93,-30.44"/>
+<polygon fill="black" stroke="black" points="318.05,-27.12 307.47,-27.76 316.14,-33.85 318.05,-27.12"/>
+</g>
+</g>
+</svg>
diff --git a/chapter04/README.md b/chapter04/README.md
index 299d5da9..1b14bf0a 100644
--- a/chapter04/README.md
+++ b/chapter04/README.md
@@ -184,11 +184,9 @@ lattice.
In this chapter we extend the Type hierarchy as follows:
```
-Type
-+-- TypeControl (New - represents control token)
-+-- TypeInteger (Enhanced - now has Top and Bottom types)
-+-- TypeBot
-+-- TypeTuple (New - represents multi-valued result)
+Type (Enhanced - now has Control, and a global Top and Bottom)
++-- TypeInteger (Enhanced - now has Top and Bottom types)
++-- TypeTuple (New - represents multi-valued result)
```
Our enhanced Lattice looks like this:
@@ -197,14 +195,18 @@ Our enhanced Lattice looks like this:
In this chapter we introduce the possibility of a program input variable named
-`arg`; all we know about this variable is that it is some integer value, but we do not know whether it is a constant or not.
+`arg`; all we know about this variable is that it is some integer value, but we
+do not know whether it is a constant or not.
-To support the requirements for non-constant integer values, we enhance `TypeInteger` to
-allow it to represent `IntTop` and `IntBot` integer types in addition to the earlier constant value.
+To support the requirements for non-constant integer values, we enhance
+`TypeInteger` to allow it to represent `IntTop` and `IntBot` integer types in
+addition to the earlier constant value.
-Now that integer values may be constants or non-constants, we need to introduce the "meet" operator
-in our lattice. The `meet` operator describes rules that define the resulting type when we combine
-integer values.
+Now that integer values may be constants or non-constants, we need to introduce
+the *meet* operator over our lattice. The `meet` operator describes rules that
+define the resulting type when we combine integer values. In the lattice
+diagram you can start from the two elements being `meet` and follow the
+two arrows down the graph to the first point they meet.
| | IntBot | Con1 | Con2 | IntTop |
|--------|--------|--------|--------|--------|
@@ -223,13 +225,26 @@ Currently, all our integer valued nodes are either a constant or a `IntBot` inte
When we start optimizing loops, we will start seeing `IntTop` values.
+### Tuple Types
+
+Tuple types need a little more explaination: they are a fixed-size grouping of
+types; literally a `Type[]`. Tuples represent a collection of otherwise
+unrelated types, and come from `MultiNode`s. `ProjNode`s will take the
+appropriate `Type` array element out of a Tuple. The `StartNode` now produces
+a 2-element `TypeTuple` with control and the type of `arg`: `[ctrl, TypeInteger.INTBOT]`
+
+The lattice `meet` operator on Tuples is done element by element; each array
+element recursively calls `meet`. Tuples of mixed sizes are a internal
+compiler error, and the `meet` uses Bottom for them.
+
+
## `$ctrl` name binding
In previous chapters, we had a hard coded control input edge from Start to
Return. In this chapter we no longer have such a hard-wired edge. Instead, we
track the current in-scope control node via the name `$ctrl`. This means that
-when we need to create an edge to the predecessor control node, we simply
-look up this name in the current scope.
+when we need to create an edge to the predecessor control node, we simply look
+up this name in the current scope.
This introduces the idea that the control flow subgraph is a Petri net model.[^1]
The control token moves virtually from node to node as execution proceeds. The
diff --git a/chapter04/docs/lattice.gv b/chapter04/docs/lattice.gv
index 29a53b0a..6efef107 100644
--- a/chapter04/docs/lattice.gv
+++ b/chapter04/docs/lattice.gv
@@ -1,29 +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="⊤" , fillcolor=black, fontcolor=white];
- BOT [label="⊥", fillcolor=black, fontcolor=white];
+ TOP [label=<<B>⊤</B >>, fillcolor=black, fontcolor=white];
+ BOT [label=<<B>⊥</B>>, fillcolor=black, fontcolor=white];
- CTRL [label="Ctrl", fillcolor=yellow];
+ // ----------------------
+ // Control
+ CTRL [label="ctrl", fillcolor=yellow, shape=oval];
- INT_TOP [label="⊤ :Int"];
- INT_BOT [label="⊥ :Int"];
-
- 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"];
+ TOP -> CTRL;
+ CTRL -> BOT;
- TUPLE [label="TUPLE", fillcolor=pink];
+ // ----------------------
+ // Integers
+ INT_TOP [label=<<B>⊤</B >:int>, fillcolor=lightblue, shape=oval];
+ INT_BOT [label=<<B>⊥</B>:int>, fillcolor=lightblue, shape=oval];
- // Define edges
- edge [arrowhead=none];
+ INT_MIN [label="-n" , fillcolor=lightblue];
+ INT_MINDOTS [label="...", fillcolor=lightblue shape=oval];
+ INT_MINUS [label="-1" , fillcolor=lightblue];
+ INT_ZERO [label="0" , fillcolor=lightblue];
+ INT_PLUS [label="1" , fillcolor=lightblue];
+ INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval];
+ INT_MAX [label="+n" , fillcolor=lightblue];
TOP -> INT_TOP;
INT_TOP -> INT_MIN;
@@ -43,22 +46,52 @@ digraph Lattice {
INT_BOT -> BOT;
INT_MIN -> INT_MINDOTS -> INT_MINUS -> INT_ZERO -> INT_PLUS -> INT_MAXDOTS -> INT_MAX [style=invis];
+
+ // ----------------------
+ // Tuples
- TOP -> TUPLE;
- TUPLE -> BOT;
+ TUPLE_TOP [label=<<B>⊤</B >:tuple>, fillcolor=pink, shape=oval];
+ TUPLE_BOT [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>
+ >];
- TOP -> CTRL;
- CTRL -> BOT;
+ 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}
+ {rank=same; INT_TOP; TUPLE_TOP}
{rank=same;
CTRL;
INT_MIN; INT_MINDOTS; INT_MINUS; INT_ZERO; INT_PLUS; INT_MAXDOTS; INT_MAX;
- TUPLE
}
- {rank=same; INT_BOT}
+ {rank=same; INT_BOT, TUPLE_BOT}
{rank=same; BOT;}
}
diff --git a/chapter04/docs/lattice.svg b/chapter04/docs/lattice.svg
index 1cab7681..35cb9296 100644
--- a/chapter04/docs/lattice.svg
+++ b/chapter04/docs/lattice.svg
@@ -4,192 +4,302 @@
<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: Lattice Pages: 1 -->
-<svg width="780pt" height="468pt"
- viewBox="0.00 0.00 779.83 467.88" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 463.88)">
+<svg width="952pt" height="406pt"
+ viewBox="0.00 0.00 952.00 406.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 402.5)">
<title>Lattice</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-463.88 775.83,-463.88 775.83,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-402.5 948,-402.5 948,4 -4,4"/>
<!-- TOP -->
<g id="node1" class="node">
<title>TOP</title>
-<ellipse fill="black" stroke="black" cx="370.25" cy="-438.75" rx="21.12" ry="21.12"/>
-<text text-anchor="middle" x="370.25" y="-433.33" font-family="Times New Roman,serif" font-size="14.00" fill="white">⊤</text>
+<ellipse fill="black" stroke="black" cx="374" cy="-377.37" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="366.12" y="-372.95" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
</g>
<!-- CTRL -->
<g id="node3" class="node">
<title>CTRL</title>
-<ellipse fill="yellow" stroke="black" cx="25.25" cy="-229.94" rx="25.25" ry="25.25"/>
-<text text-anchor="middle" x="25.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">Ctrl</text>
+<ellipse fill="yellow" stroke="black" cx="27" cy="-199.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="27" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">ctrl</text>
</g>
<!-- TOP&#45;&gt;CTRL -->
-<g id="edge25" class="edge">
+<g id="edge1" class="edge">
<title>TOP&#45;&gt;CTRL</title>
-<path fill="none" stroke="black" d="M352.19,-427.82C293.82,-392.49 110.39,-281.47 47.03,-243.12"/>
+<path fill="none" stroke="black" d="M354.85,-367.54C297.95,-338.34 129.51,-251.87 58.81,-215.58"/>
+<polygon fill="black" stroke="black" points="60.56,-212.54 50.07,-211.09 57.36,-218.77 60.56,-212.54"/>
</g>
<!-- INT_TOP -->
<g id="node4" class="node">
<title>INT_TOP</title>
-<ellipse fill="lightblue" stroke="black" cx="370.25" cy="-343.57" rx="38.06" ry="38.06"/>
-<text text-anchor="middle" x="370.25" y="-338.9" font-family="Times New Roman,serif" font-size="14.00">⊤ :Int</text>
+<ellipse fill="lightblue" stroke="black" cx="374" cy="-302.25" rx="33.95" ry="18"/>
+<text text-anchor="start" x="357.12" y="-298.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="372.88" y="-298.2" font-family="Times New Roman,serif" font-size="14.00">:int</text>
</g>
<!-- TOP&#45;&gt;INT_TOP -->
-<g id="edge1" class="edge">
+<g id="edge3" class="edge">
<title>TOP&#45;&gt;INT_TOP</title>
-<path fill="none" stroke="black" d="M370.25,-417.53C370.25,-407.15 370.25,-394.16 370.25,-382.03"/>
+<path fill="none" stroke="black" d="M374,-356C374,-348.51 374,-339.87 374,-331.79"/>
+<polygon fill="black" stroke="black" points="377.5,-332.05 374,-322.05 370.5,-332.05 377.5,-332.05"/>
</g>
-<!-- TUPLE -->
+<!-- TUPLE_TOP -->
<g id="node13" class="node">
-<title>TUPLE</title>
-<ellipse fill="pink" stroke="black" cx="732.25" cy="-229.94" rx="39.58" ry="39.58"/>
-<text text-anchor="middle" x="732.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">TUPLE</text>
+<title>TUPLE_TOP</title>
+<ellipse fill="pink" stroke="black" cx="771" cy="-302.25" rx="42.65" ry="18"/>
+<text text-anchor="start" x="747.75" y="-298.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="763.5" y="-298.2" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
</g>
-<!-- TOP&#45;&gt;TUPLE -->
-<g id="edge23" class="edge">
-<title>TOP&#45;&gt;TUPLE</title>
-<path fill="none" stroke="black" d="M388.95,-427.97C446.64,-394.69 622.49,-293.25 697.62,-249.91"/>
+<!-- TOP&#45;&gt;TUPLE_TOP -->
+<g id="edge25" class="edge">
+<title>TOP&#45;&gt;TUPLE_TOP</title>
+<path fill="none" stroke="black" d="M395.06,-372.49C455.97,-361.27 633.5,-328.57 721.03,-312.45"/>
+<polygon fill="black" stroke="black" points="721.57,-315.91 730.77,-310.66 720.3,-309.03 721.57,-315.91"/>
</g>
<!-- BOT -->
<g id="node2" class="node">
<title>BOT</title>
-<ellipse fill="black" stroke="black" cx="370.25" cy="-21.12" rx="21.12" ry="21.12"/>
-<text text-anchor="middle" x="370.25" y="-15.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">⊥</text>
+<ellipse fill="black" stroke="black" cx="374" cy="-21.12" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="366.12" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
</g>
<!-- CTRL&#45;&gt;BOT -->
-<g id="edge26" class="edge">
+<g id="edge2" class="edge">
<title>CTRL&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M47.09,-216.72C110.49,-178.35 293.71,-67.45 352.13,-32.09"/>
+<path fill="none" stroke="black" d="M48.71,-188.11C108.7,-157.31 276.83,-71 344.87,-36.08"/>
+<polygon fill="black" stroke="black" points="346.26,-39.3 353.55,-31.62 343.06,-33.07 346.26,-39.3"/>
</g>
<!-- INT_MIN -->
<g id="node6" class="node">
<title>INT_MIN</title>
-<ellipse fill="lightblue" stroke="black" cx="112.25" cy="-229.94" rx="18.6" ry="18.6"/>
-<text text-anchor="middle" x="112.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">&#45;n</text>
+<ellipse fill="lightblue" stroke="black" cx="116" cy="-199.25" rx="18.6" ry="18.6"/>
+<text text-anchor="middle" x="116" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">&#45;n</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MIN -->
-<g id="edge2" class="edge">
+<g id="edge4" class="edge">
<title>INT_TOP&#45;&gt;INT_MIN</title>
-<path fill="none" stroke="black" d="M335.45,-327.52C279.34,-303.24 170.92,-256.32 129.19,-238.27"/>
+<path fill="none" stroke="black" d="M347.36,-290.82C298.27,-271.6 193.98,-230.78 143.94,-211.18"/>
+<polygon fill="black" stroke="black" points="145.28,-207.95 134.69,-207.56 142.73,-214.47 145.28,-207.95"/>
</g>
<!-- INT_MINDOTS -->
<g id="node7" class="node">
<title>INT_MINDOTS</title>
-<text text-anchor="middle" x="201.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<ellipse fill="lightblue" stroke="black" cx="205" cy="-199.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="205" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MINDOTS -->
-<g id="edge3" class="edge">
+<g id="edge5" class="edge">
<title>INT_TOP&#45;&gt;INT_MINDOTS</title>
-<path fill="none" stroke="black" d="M338.86,-321.84C306.59,-300.53 256.96,-267.74 226.95,-247.91"/>
+<path fill="none" stroke="black" d="M352.25,-288.25C322.2,-270.29 267.88,-237.83 234.28,-217.75"/>
+<polygon fill="black" stroke="black" points="236.25,-214.85 225.87,-212.72 232.66,-220.85 236.25,-214.85"/>
</g>
<!-- INT_MINUS -->
<g id="node8" class="node">
<title>INT_MINUS</title>
-<ellipse fill="lightblue" stroke="black" cx="290.25" cy="-229.94" rx="18.6" ry="18.6"/>
-<text text-anchor="middle" x="290.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">&#45;1</text>
+<ellipse fill="lightblue" stroke="black" cx="294" cy="-199.25" rx="18.6" ry="18.6"/>
+<text text-anchor="middle" x="294" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">&#45;1</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MINUS -->
-<g id="edge4" class="edge">
+<g id="edge6" class="edge">
<title>INT_TOP&#45;&gt;INT_MINUS</title>
-<path fill="none" stroke="black" d="M348.39,-312.07C332.94,-290.51 312.9,-262.55 300.84,-245.72"/>
+<path fill="none" stroke="black" d="M361.5,-285.47C348.27,-268.76 327.25,-242.23 312.18,-223.21"/>
+<polygon fill="black" stroke="black" points="315.02,-221.14 306.06,-215.48 309.53,-225.49 315.02,-221.14"/>
</g>
<!-- INT_ZERO -->
<g id="node9" class="node">
<title>INT_ZERO</title>
-<ellipse fill="lightblue" stroke="black" cx="370.25" cy="-229.94" rx="18" ry="18"/>
-<text text-anchor="middle" x="370.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">0</text>
+<ellipse fill="lightblue" stroke="black" cx="374" cy="-199.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="374" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
</g>
<!-- INT_TOP&#45;&gt;INT_ZERO -->
-<g id="edge5" class="edge">
+<g id="edge7" class="edge">
<title>INT_TOP&#45;&gt;INT_ZERO</title>
-<path fill="none" stroke="black" d="M370.25,-305.09C370.25,-285.83 370.25,-263.3 370.25,-248.18"/>
+<path fill="none" stroke="black" d="M374,-284.12C374,-269.02 374,-246.74 374,-228.93"/>
+<polygon fill="black" stroke="black" points="377.5,-228.98 374,-218.98 370.5,-228.98 377.5,-228.98"/>
</g>
<!-- INT_PLUS -->
<g id="node10" class="node">
<title>INT_PLUS</title>
-<ellipse fill="lightblue" stroke="black" cx="449.25" cy="-229.94" rx="18" ry="18"/>
-<text text-anchor="middle" x="449.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">1</text>
+<ellipse fill="lightblue" stroke="black" cx="453" cy="-199.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="453" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">1</text>
</g>
<!-- INT_TOP&#45;&gt;INT_PLUS -->
-<g id="edge6" class="edge">
+<g id="edge8" class="edge">
<title>INT_TOP&#45;&gt;INT_PLUS</title>
-<path fill="none" stroke="black" d="M392.05,-311.77C407.39,-290.09 427.23,-262.05 439.06,-245.34"/>
+<path fill="none" stroke="black" d="M386.34,-285.47C399.49,-268.67 420.4,-241.93 435.3,-222.88"/>
+<polygon fill="black" stroke="black" points="437.93,-225.2 441.33,-215.17 432.41,-220.89 437.93,-225.2"/>
</g>
<!-- INT_MAXDOTS -->
<g id="node11" class="node">
<title>INT_MAXDOTS</title>
-<text text-anchor="middle" x="537.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<ellipse fill="lightblue" stroke="black" cx="541" cy="-199.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="541" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MAXDOTS -->
-<g id="edge7" class="edge">
+<g id="edge9" class="edge">
<title>INT_TOP&#45;&gt;INT_MAXDOTS</title>
-<path fill="none" stroke="black" d="M401.66,-321.58C433.6,-300.23 482.46,-267.57 511.98,-247.83"/>
+<path fill="none" stroke="black" d="M395.83,-288.04C425.56,-270.07 478.84,-237.84 511.93,-217.83"/>
+<polygon fill="black" stroke="black" points="513.46,-221 520.2,-212.83 509.84,-215.01 513.46,-221"/>
</g>
<!-- INT_MAX -->
<g id="node12" class="node">
<title>INT_MAX</title>
-<ellipse fill="lightblue" stroke="black" cx="628.25" cy="-229.94" rx="21.15" ry="21.15"/>
-<text text-anchor="middle" x="628.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">+n</text>
+<ellipse fill="lightblue" stroke="black" cx="632" cy="-199.25" rx="21.15" ry="21.15"/>
+<text text-anchor="middle" x="632" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">+n</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MAX -->
-<g id="edge8" class="edge">
+<g id="edge10" class="edge">
<title>INT_TOP&#45;&gt;INT_MAX</title>
-<path fill="none" stroke="black" d="M405.04,-327.52C460.06,-303.71 565.35,-258.16 608.78,-239.36"/>
+<path fill="none" stroke="black" d="M400.64,-290.82C449,-271.89 550.91,-231.99 601.78,-212.08"/>
+<polygon fill="black" stroke="black" points="602.96,-215.38 610.99,-208.47 600.41,-208.86 602.96,-215.38"/>
</g>
<!-- INT_BOT -->
<g id="node5" class="node">
<title>INT_BOT</title>
-<ellipse fill="lightblue" stroke="black" cx="370.25" cy="-116.3" rx="38.06" ry="38.06"/>
-<text text-anchor="middle" x="370.25" y="-111.63" font-family="Times New Roman,serif" font-size="14.00">⊥ :Int</text>
+<ellipse fill="lightblue" stroke="black" cx="374" cy="-96.25" rx="33.95" ry="18"/>
+<text text-anchor="start" x="357.12" y="-92.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="372.88" y="-92.2" font-family="Times New Roman,serif" font-size="14.00">:int</text>
</g>
<!-- INT_BOT&#45;&gt;BOT -->
-<g id="edge16" class="edge">
+<g id="edge18" class="edge">
<title>INT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M370.25,-77.94C370.25,-65.89 370.25,-52.98 370.25,-42.62"/>
+<path fill="none" stroke="black" d="M374,-77.92C374,-70.74 374,-62.18 374,-53.95"/>
+<polygon fill="black" stroke="black" points="377.5,-54.22 374,-44.22 370.5,-54.22 377.5,-54.22"/>
</g>
<!-- INT_MIN&#45;&gt;INT_BOT -->
-<g id="edge9" class="edge">
+<g id="edge11" class="edge">
<title>INT_MIN&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M129.18,-221.61C170.88,-203.57 279.24,-156.68 335.39,-132.39"/>
+<path fill="none" stroke="black" d="M133.33,-191.46C174.74,-175.25 280.22,-133.96 336.8,-111.81"/>
+<polygon fill="black" stroke="black" points="337.98,-115.11 346.02,-108.2 335.43,-108.59 337.98,-115.11"/>
</g>
<!-- INT_MIN&#45;&gt;INT_MINDOTS -->
<!-- INT_MINDOTS&#45;&gt;INT_BOT -->
-<g id="edge10" class="edge">
+<g id="edge12" class="edge">
<title>INT_MINDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M226.92,-211.98C256.83,-192.22 306.29,-159.56 338.57,-138.23"/>
+<path fill="none" stroke="black" d="M224.72,-186.46C253.64,-169.18 307.88,-136.76 342.4,-116.13"/>
+<polygon fill="black" stroke="black" points="343.92,-119.3 350.71,-111.17 340.33,-113.29 343.92,-119.3"/>
</g>
<!-- INT_MINDOTS&#45;&gt;INT_MINUS -->
<!-- INT_MINUS&#45;&gt;INT_BOT -->
-<g id="edge11" class="edge">
+<g id="edge13" class="edge">
<title>INT_MINUS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M300.71,-214.34C312.74,-197.56 332.82,-169.54 348.32,-147.91"/>
+<path fill="none" stroke="black" d="M305.12,-184.2C317.82,-168.18 338.81,-141.67 354.29,-122.13"/>
+<polygon fill="black" stroke="black" points="356.98,-124.37 360.45,-114.35 351.5,-120.02 356.98,-124.37"/>
</g>
<!-- INT_MINUS&#45;&gt;INT_ZERO -->
<!-- INT_ZERO&#45;&gt;INT_BOT -->
-<g id="edge12" class="edge">
+<g id="edge14" class="edge">
<title>INT_ZERO&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M370.25,-211.5C370.25,-196.29 370.25,-173.71 370.25,-154.48"/>
+<path fill="none" stroke="black" d="M374,-181.12C374,-166.02 374,-143.74 374,-125.93"/>
+<polygon fill="black" stroke="black" points="377.5,-125.98 374,-115.98 370.5,-125.98 377.5,-125.98"/>
</g>
<!-- INT_ZERO&#45;&gt;INT_PLUS -->
<!-- INT_PLUS&#45;&gt;INT_BOT -->
-<g id="edge13" class="edge">
+<g id="edge15" class="edge">
<title>INT_PLUS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M439.24,-214.8C427.37,-198.02 407.23,-169.57 391.77,-147.71"/>
+<path fill="none" stroke="black" d="M442.35,-184.63C429.9,-168.71 409.04,-142.04 393.63,-122.35"/>
+<polygon fill="black" stroke="black" points="396.42,-120.23 387.5,-114.51 390.9,-124.54 396.42,-120.23"/>
</g>
<!-- INT_PLUS&#45;&gt;INT_MAXDOTS -->
<!-- INT_MAXDOTS&#45;&gt;INT_BOT -->
-<g id="edge14" class="edge">
+<g id="edge16" class="edge">
<title>INT_MAXDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M511.89,-211.98C482.32,-192.22 433.46,-159.56 401.56,-138.23"/>
+<path fill="none" stroke="black" d="M521.52,-186.46C492.93,-169.18 439.34,-136.76 405.22,-116.13"/>
+<polygon fill="black" stroke="black" points="407.39,-113.35 397.03,-111.17 403.77,-119.34 407.39,-113.35"/>
</g>
<!-- INT_MAXDOTS&#45;&gt;INT_MAX -->
<!-- INT_MAX&#45;&gt;INT_BOT -->
-<g id="edge15" class="edge">
+<g id="edge17" class="edge">
<title>INT_MAX&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M608.86,-220.55C565.5,-201.79 460.2,-156.22 405.12,-132.39"/>
-</g>
-<!-- TUPLE&#45;&gt;BOT -->
-<g id="edge24" class="edge">
-<title>TUPLE&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M697.54,-209.92C622.33,-166.53 446.47,-65.09 388.87,-31.87"/>
+<path fill="none" stroke="black" d="M612.61,-190.66C569.87,-173.93 466.96,-133.64 411.28,-111.84"/>
+<polygon fill="black" stroke="black" points="412.8,-108.68 402.21,-108.29 410.25,-115.2 412.8,-108.68"/>
+</g>
+<!-- TUPLE1 -->
+<g id="node15" class="node">
+<title>TUPLE1</title>
+<polygon fill="none" stroke="none" points="750,-225.75 696,-225.75 696,-172.75 750,-172.75 750,-225.75"/>
+<polygon fill="pink" stroke="none" points="706.5,-199.25 706.5,-221.75 739.5,-221.75 739.5,-199.25 706.5,-199.25"/>
+<polygon fill="none" stroke="black" points="706.5,-199.25 706.5,-221.75 739.5,-221.75 739.5,-199.25 706.5,-199.25"/>
+<text text-anchor="start" x="709.5" y="-205.45" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="706.5,-176.75 706.5,-199.25 739.5,-199.25 739.5,-176.75 706.5,-176.75"/>
+<polygon fill="none" stroke="black" points="706.5,-176.75 706.5,-199.25 739.5,-199.25 739.5,-176.75 706.5,-176.75"/>
+<text text-anchor="start" x="711.38" y="-182.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLE1 -->
+<g id="edge26" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLE1</title>
+<path fill="none" stroke="black" d="M762.86,-284.12C756.58,-270.91 747.69,-252.2 739.89,-235.8"/>
+<polygon fill="black" stroke="black" points="743.07,-234.33 735.62,-226.8 736.75,-237.34 743.07,-234.33"/>
+</g>
+<!-- TUPLE2 -->
+<g id="node16" class="node">
+<title>TUPLE2</title>
+<polygon fill="none" stroke="none" points="847,-237 793,-237 793,-161.5 847,-161.5 847,-237"/>
+<polygon fill="pink" stroke="none" points="803.5,-210.5 803.5,-233 836.5,-233 836.5,-210.5 803.5,-210.5"/>
+<polygon fill="none" stroke="black" points="803.5,-210.5 803.5,-233 836.5,-233 836.5,-210.5 803.5,-210.5"/>
+<text text-anchor="start" x="806.5" y="-216.7" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="803.5,-188 803.5,-210.5 836.5,-210.5 836.5,-188 803.5,-188"/>
+<polygon fill="none" stroke="black" points="803.5,-188 803.5,-210.5 836.5,-210.5 836.5,-188 803.5,-188"/>
+<text text-anchor="start" x="808.38" y="-194.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="803.5,-165.5 803.5,-188 836.5,-188 836.5,-165.5 803.5,-165.5"/>
+<polygon fill="none" stroke="black" points="803.5,-165.5 803.5,-188 836.5,-188 836.5,-165.5 803.5,-165.5"/>
+<text text-anchor="start" x="808.38" y="-171.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLE2 -->
+<g id="edge27" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLE2</title>
+<path fill="none" stroke="black" d="M779.31,-284.12C784.32,-273.8 790.95,-260.12 797.41,-246.81"/>
+<polygon fill="black" stroke="black" points="800.41,-248.65 801.62,-238.13 794.11,-245.6 800.41,-248.65"/>
+</g>
+<!-- TUPLEN -->
+<g id="node17" class="node">
+<title>TUPLEN</title>
+<polygon fill="none" stroke="none" points="944,-248.25 890,-248.25 890,-150.25 944,-150.25 944,-248.25"/>
+<polygon fill="pink" stroke="none" points="900.5,-221.75 900.5,-244.25 933.5,-244.25 933.5,-221.75 900.5,-221.75"/>
+<polygon fill="none" stroke="black" points="900.5,-221.75 900.5,-244.25 933.5,-244.25 933.5,-221.75 900.5,-221.75"/>
+<text text-anchor="start" x="903.5" y="-227.95" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="900.5,-199.25 900.5,-221.75 933.5,-221.75 933.5,-199.25 900.5,-199.25"/>
+<polygon fill="none" stroke="black" points="900.5,-199.25 900.5,-221.75 933.5,-221.75 933.5,-199.25 900.5,-199.25"/>
+<text text-anchor="start" x="905.38" y="-205.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="900.5,-176.75 900.5,-199.25 933.5,-199.25 933.5,-176.75 900.5,-176.75"/>
+<polygon fill="none" stroke="black" points="900.5,-176.75 900.5,-199.25 933.5,-199.25 933.5,-176.75 900.5,-176.75"/>
+<text text-anchor="start" x="911.38" y="-182.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+<polygon fill="black" stroke="none" points="900.5,-154.25 900.5,-176.75 933.5,-176.75 933.5,-154.25 900.5,-154.25"/>
+<polygon fill="none" stroke="black" points="900.5,-154.25 900.5,-176.75 933.5,-176.75 933.5,-154.25 900.5,-154.25"/>
+<text text-anchor="start" x="905.38" y="-160.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLEN -->
+<g id="edge28" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLEN</title>
+<path fill="none" stroke="black" d="M792.54,-286.35C815.75,-270.29 853.06,-244.48 880.79,-225.3"/>
+<polygon fill="black" stroke="black" points="882.68,-228.25 888.91,-219.68 878.7,-222.49 882.68,-228.25"/>
+</g>
+<!-- TUPLE_BOT -->
+<g id="node14" class="node">
+<title>TUPLE_BOT</title>
+<ellipse fill="pink" stroke="black" cx="771" cy="-96.25" rx="42.65" ry="18"/>
+<text text-anchor="start" x="747.75" y="-92.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="763.5" y="-92.2" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+</g>
+<!-- TUPLE_BOT&#45;&gt;BOT -->
+<g id="edge32" class="edge">
+<title>TUPLE_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M732.57,-88.17C654.42,-73.77 478.23,-41.32 405.9,-28"/>
+<polygon fill="black" stroke="black" points="406.78,-24.6 396.31,-26.23 405.51,-31.49 406.78,-24.6"/>
+</g>
+<!-- TUPLE1&#45;&gt;TUPLE_BOT -->
+<g id="edge29" class="edge">
+<title>TUPLE1&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M735.11,-172.76C742.13,-158 750.96,-139.41 758.11,-124.38"/>
+<polygon fill="black" stroke="black" points="761.18,-126.06 762.31,-115.53 754.86,-123.06 761.18,-126.06"/>
+</g>
+<!-- TUPLE2&#45;&gt;TUPLE_BOT -->
+<g id="edge30" class="edge">
+<title>TUPLE2&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M802.17,-161.5C796.24,-149.27 789.75,-135.89 784.23,-124.51"/>
+<polygon fill="black" stroke="black" points="787.46,-123.15 779.94,-115.69 781.16,-126.21 787.46,-123.15"/>
+</g>
+<!-- TUPLEN&#45;&gt;TUPLE_BOT -->
+<g id="edge31" class="edge">
+<title>TUPLEN&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M890.22,-179.72C865.26,-162.45 828.04,-136.71 801.84,-118.58"/>
+<polygon fill="black" stroke="black" points="803.85,-115.72 793.64,-112.91 799.87,-121.47 803.85,-115.72"/>
</g>
</g>
</svg>
diff --git a/chapter06/docs/lattice.gv b/chapter06/docs/lattice.gv
index 782c2253..e5cc59be 100644
--- a/chapter06/docs/lattice.gv
+++ b/chapter06/docs/lattice.gv
@@ -4,27 +4,30 @@ digraph Lattice {
node [shape=circle, style=filled, fillcolor=lightblue];
nodesep=0.6;
- TOP [label="⊤" , fillcolor=black, fontcolor=white];
- BOT [label="⊥", fillcolor=black, fontcolor=white];
+ TOP [label=<<B>⊤</B >>, fillcolor=black, fontcolor=white];
+ BOT [label=<<B>⊥</B>>, fillcolor=black, fontcolor=white];
- XCTRL [label="⊤ :Ctrl", fillcolor=yellow];
- CTRL [label="⊥ :Ctrl", fillcolor=yellow];
+ // ----------------------
+ // Control
+ XCTRL [label=<<B>⊤</B >:ctrl>, fillcolor=yellow, shape=oval];
+ CTRL [label=<<B>⊥</B>:ctrl>, fillcolor=yellow, shape=oval];
- INT_TOP [label="⊤ :Int"];
- INT_BOT [label="⊥ :Int"];
-
- INT_MIN [label="-n"];
- INT_MINUS [label="-1"];
- INT_MINDOTS [label="..." shape=none style=none];
- INT_ZERO [label="0"];
- INT_PLUS [label="1"];
- INT_MAXDOTS [label="..." shape=none style=none];
- INT_MAX [label="+n"];
+ TOP -> XCTRL;
+ XCTRL -> CTRL;
+ CTRL -> BOT;
- TUPLE [label="TUPLE", fillcolor=pink];
+ // ----------------------
+ // Integers
+ INT_TOP [label=<<B>⊤</B >:int>, fillcolor=lightblue, shape=oval];
+ INT_BOT [label=<<B>⊥</B>:int>, fillcolor=lightblue, shape=oval];
- // Define edges
- edge [arrowhead=none];
+ INT_MIN [label="-n" , fillcolor=lightblue];
+ INT_MINDOTS [label="...", fillcolor=lightblue shape=oval];
+ INT_MINUS [label="-1" , fillcolor=lightblue];
+ INT_ZERO [label="0" , fillcolor=lightblue];
+ INT_PLUS [label="1" , fillcolor=lightblue];
+ INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval];
+ INT_MAX [label="+n" , fillcolor=lightblue];
TOP -> INT_TOP;
INT_TOP -> INT_MIN;
@@ -44,18 +47,51 @@ digraph Lattice {
INT_BOT -> BOT;
INT_MIN -> INT_MINDOTS -> INT_MINUS -> INT_ZERO -> INT_PLUS -> INT_MAXDOTS -> INT_MAX [style=invis];
+
+ // ----------------------
+ // Tuples
- TOP -> TUPLE;
- TUPLE -> BOT;
+ TUPLE_TOP [label=<<B>⊤</B >:tuple>, fillcolor=pink, shape=oval];
+ TUPLE_BOT [label=<<B>⊥</B>:tuple>, fillcolor=pink, shape=oval];
- TOP -> XCTRL;
- XCTRL -> CTRL;
- CTRL -> BOT;
+ 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>
+ >];
+
+
+ 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}
- {rank=same; INT_MIN; INT_MINDOTS; INT_MINUS; INT_ZERO; INT_PLUS; INT_MAXDOTS; INT_MAX; TUPLE }
- {rank=same; INT_BOT; CTRL}
+ {rank=same; XCTRL; INT_TOP; TUPLE_TOP}
+ {rank=same;
+ INT_MIN; INT_MINDOTS; INT_MINUS; INT_ZERO; INT_PLUS; INT_MAXDOTS; INT_MAX;
+ }
+ {rank=same; CTRL; INT_BOT, TUPLE_BOT}
{rank=same; BOT;}
}
diff --git a/chapter06/docs/lattice.svg b/chapter06/docs/lattice.svg
index f4929b41..86371c93 100644
--- a/chapter06/docs/lattice.svg
+++ b/chapter06/docs/lattice.svg
@@ -4,203 +4,316 @@
<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: Lattice Pages: 1 -->
-<svg width="686pt" height="485pt"
- viewBox="0.00 0.00 686.18 484.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 480.71)">
+<svg width="855pt" height="406pt"
+ viewBox="0.00 0.00 854.60 406.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 402.5)">
<title>Lattice</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-480.71 682.18,-480.71 682.18,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-402.5 850.6,-402.5 850.6,4 -4,4"/>
<!-- TOP -->
<g id="node1" class="node">
<title>TOP</title>
-<ellipse fill="black" stroke="black" cx="276.6" cy="-455.59" rx="21.12" ry="21.12"/>
-<text text-anchor="middle" x="276.6" y="-450.16" font-family="Times New Roman,serif" font-size="14.00" fill="white">⊤</text>
+<ellipse fill="black" stroke="black" cx="276.6" cy="-377.37" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="268.72" y="-372.95" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
</g>
<!-- XCTRL -->
<g id="node3" class="node">
<title>XCTRL</title>
-<ellipse fill="yellow" stroke="black" cx="44.6" cy="-356.2" rx="42.26" ry="42.26"/>
-<text text-anchor="middle" x="44.6" y="-351.53" font-family="Times New Roman,serif" font-size="14.00">⊤ :Ctrl</text>
+<ellipse fill="yellow" stroke="black" cx="49.6" cy="-302.25" rx="36.51" ry="18"/>
+<text text-anchor="start" x="30.85" y="-298.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="46.6" y="-298.2" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
</g>
<!-- TOP&#45;&gt;XCTRL -->
-<g id="edge25" class="edge">
+<g id="edge1" class="edge">
<title>TOP&#45;&gt;XCTRL</title>
-<path fill="none" stroke="black" d="M257.21,-446.45C219.1,-430.45 133.74,-394.62 83.54,-373.55"/>
+<path fill="none" stroke="black" d="M256.45,-369.88C219.31,-357.92 139.36,-332.16 90.45,-316.41"/>
+<polygon fill="black" stroke="black" points="91.65,-313.12 81.06,-313.38 89.51,-319.78 91.65,-313.12"/>
</g>
<!-- INT_TOP -->
<g id="node5" class="node">
<title>INT_TOP</title>
-<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-356.2" rx="38.06" ry="38.06"/>
-<text text-anchor="middle" x="276.6" y="-351.53" font-family="Times New Roman,serif" font-size="14.00">⊤ :Int</text>
+<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-302.25" rx="33.95" ry="18"/>
+<text text-anchor="start" x="259.72" y="-298.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="275.47" y="-298.2" font-family="Times New Roman,serif" font-size="14.00">:int</text>
</g>
<!-- TOP&#45;&gt;INT_TOP -->
-<g id="edge1" class="edge">
+<g id="edge4" class="edge">
<title>TOP&#45;&gt;INT_TOP</title>
-<path fill="none" stroke="black" d="M276.6,-434.41C276.6,-422.93 276.6,-408.19 276.6,-394.67"/>
+<path fill="none" stroke="black" d="M276.6,-356C276.6,-348.51 276.6,-339.87 276.6,-331.79"/>
+<polygon fill="black" stroke="black" points="280.1,-332.05 276.6,-322.05 273.1,-332.05 280.1,-332.05"/>
</g>
-<!-- TUPLE -->
+<!-- TUPLE_TOP -->
<g id="node14" class="node">
-<title>TUPLE</title>
-<ellipse fill="pink" stroke="black" cx="638.6" cy="-238.36" rx="39.58" ry="39.58"/>
-<text text-anchor="middle" x="638.6" y="-233.31" font-family="Times New Roman,serif" font-size="14.00">TUPLE</text>
+<title>TUPLE_TOP</title>
+<ellipse fill="pink" stroke="black" cx="673.6" cy="-302.25" rx="42.65" ry="18"/>
+<text text-anchor="start" x="650.35" y="-298.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="666.1" y="-298.2" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
</g>
-<!-- TOP&#45;&gt;TUPLE -->
-<g id="edge23" class="edge">
-<title>TOP&#45;&gt;TUPLE</title>
-<path fill="none" stroke="black" d="M295.05,-444.52C352.6,-409.98 529.5,-303.82 604.46,-258.84"/>
+<!-- TOP&#45;&gt;TUPLE_TOP -->
+<g id="edge26" class="edge">
+<title>TOP&#45;&gt;TUPLE_TOP</title>
+<path fill="none" stroke="black" d="M297.66,-372.49C358.57,-361.27 536.1,-328.57 623.62,-312.45"/>
+<polygon fill="black" stroke="black" points="624.16,-315.91 633.36,-310.66 622.89,-309.03 624.16,-315.91"/>
</g>
<!-- BOT -->
<g id="node2" class="node">
<title>BOT</title>
<ellipse fill="black" stroke="black" cx="276.6" cy="-21.12" rx="21.12" ry="21.12"/>
-<text text-anchor="middle" x="276.6" y="-15.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">⊥</text>
+<text text-anchor="start" x="268.72" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
</g>
<!-- CTRL -->
<g id="node4" class="node">
<title>CTRL</title>
-<ellipse fill="yellow" stroke="black" cx="44.6" cy="-120.51" rx="42.26" ry="42.26"/>
-<text text-anchor="middle" x="44.6" y="-115.84" font-family="Times New Roman,serif" font-size="14.00">⊥ :Ctrl</text>
+<ellipse fill="yellow" stroke="black" cx="49.6" cy="-96.25" rx="36.51" ry="18"/>
+<text text-anchor="start" x="30.85" y="-92.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="46.6" y="-92.2" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
</g>
<!-- XCTRL&#45;&gt;CTRL -->
-<g id="edge26" class="edge">
+<g id="edge2" class="edge">
<title>XCTRL&#45;&gt;CTRL</title>
-<path fill="none" stroke="black" d="M44.6,-313.52C44.6,-270.94 44.6,-205.88 44.6,-163.27"/>
+<path fill="none" stroke="black" d="M49.6,-283.97C49.6,-248.31 49.6,-169.19 49.6,-125.93"/>
+<polygon fill="black" stroke="black" points="53.1,-126 49.6,-116 46.1,-126 53.1,-126"/>
</g>
<!-- CTRL&#45;&gt;BOT -->
-<g id="edge27" class="edge">
+<g id="edge3" class="edge">
<title>CTRL&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M83.43,-103.21C133.61,-82.15 219.04,-46.28 257.2,-30.27"/>
+<path fill="none" stroke="black" d="M79.74,-85.54C122.92,-71.63 201.96,-46.17 245.6,-32.11"/>
+<polygon fill="black" stroke="black" points="246.52,-35.49 254.96,-29.09 244.37,-28.83 246.52,-35.49"/>
</g>
<!-- INT_MIN -->
<g id="node7" class="node">
<title>INT_MIN</title>
-<ellipse fill="lightblue" stroke="black" cx="18.6" cy="-238.36" rx="18.6" ry="18.6"/>
-<text text-anchor="middle" x="18.6" y="-233.31" font-family="Times New Roman,serif" font-size="14.00">&#45;n</text>
+<ellipse fill="lightblue" stroke="black" cx="18.6" cy="-199.25" rx="18.6" ry="18.6"/>
+<text text-anchor="middle" x="18.6" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">&#45;n</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MIN -->
-<g id="edge2" class="edge">
+<g id="edge5" class="edge">
<title>INT_TOP&#45;&gt;INT_MIN</title>
-<path fill="none" stroke="black" d="M242.07,-339.7C186.05,-314.54 77.4,-265.76 35.58,-246.98"/>
-</g>
-<!-- INT_MINUS -->
-<g id="node8" class="node">
-<title>INT_MINUS</title>
-<ellipse fill="lightblue" stroke="black" cx="196.6" cy="-238.36" rx="18.6" ry="18.6"/>
-<text text-anchor="middle" x="196.6" y="-233.31" font-family="Times New Roman,serif" font-size="14.00">&#45;1</text>
-</g>
-<!-- INT_TOP&#45;&gt;INT_MINUS -->
-<g id="edge4" class="edge">
-<title>INT_TOP&#45;&gt;INT_MINUS</title>
-<path fill="none" stroke="black" d="M255.16,-324.16C239.51,-301.5 219,-271.8 206.87,-254.23"/>
+<path fill="none" stroke="black" d="M249.96,-290.82C200.87,-271.6 96.58,-230.78 46.53,-211.18"/>
+<polygon fill="black" stroke="black" points="47.87,-207.95 37.29,-207.56 45.32,-214.47 47.87,-207.95"/>
</g>
<!-- INT_MINDOTS -->
-<g id="node9" class="node">
+<g id="node8" class="node">
<title>INT_MINDOTS</title>
-<text text-anchor="middle" x="107.6" y="-233.31" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<ellipse fill="lightblue" stroke="black" cx="107.6" cy="-199.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="107.6" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MINDOTS -->
-<g id="edge3" class="edge">
+<g id="edge6" class="edge">
<title>INT_TOP&#45;&gt;INT_MINDOTS</title>
-<path fill="none" stroke="black" d="M245.6,-333.95C213.01,-311.61 162.38,-276.91 132.36,-256.33"/>
+<path fill="none" stroke="black" d="M254.85,-288.25C224.79,-270.29 170.48,-237.83 136.88,-217.75"/>
+<polygon fill="black" stroke="black" points="138.84,-214.85 128.46,-212.72 135.25,-220.85 138.84,-214.85"/>
+</g>
+<!-- INT_MINUS -->
+<g id="node9" class="node">
+<title>INT_MINUS</title>
+<ellipse fill="lightblue" stroke="black" cx="196.6" cy="-199.25" rx="18.6" ry="18.6"/>
+<text text-anchor="middle" x="196.6" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">&#45;1</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MINUS -->
+<g id="edge7" class="edge">
+<title>INT_TOP&#45;&gt;INT_MINUS</title>
+<path fill="none" stroke="black" d="M264.1,-285.47C250.86,-268.76 229.85,-242.23 214.78,-223.21"/>
+<polygon fill="black" stroke="black" points="217.61,-221.14 208.66,-215.48 212.12,-225.49 217.61,-221.14"/>
</g>
<!-- INT_ZERO -->
<g id="node10" class="node">
<title>INT_ZERO</title>
-<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-238.36" rx="18" ry="18"/>
-<text text-anchor="middle" x="276.6" y="-233.31" font-family="Times New Roman,serif" font-size="14.00">0</text>
+<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-199.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="276.6" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
</g>
<!-- INT_TOP&#45;&gt;INT_ZERO -->
-<g id="edge5" class="edge">
+<g id="edge8" class="edge">
<title>INT_TOP&#45;&gt;INT_ZERO</title>
-<path fill="none" stroke="black" d="M276.6,-317.91C276.6,-297.4 276.6,-272.93 276.6,-256.82"/>
+<path fill="none" stroke="black" d="M276.6,-284.12C276.6,-269.02 276.6,-246.74 276.6,-228.93"/>
+<polygon fill="black" stroke="black" points="280.1,-228.98 276.6,-218.98 273.1,-228.98 280.1,-228.98"/>
</g>
<!-- INT_PLUS -->
<g id="node11" class="node">
<title>INT_PLUS</title>
-<ellipse fill="lightblue" stroke="black" cx="355.6" cy="-238.36" rx="18" ry="18"/>
-<text text-anchor="middle" x="355.6" y="-233.31" font-family="Times New Roman,serif" font-size="14.00">1</text>
+<ellipse fill="lightblue" stroke="black" cx="355.6" cy="-199.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="355.6" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">1</text>
</g>
<!-- INT_TOP&#45;&gt;INT_PLUS -->
-<g id="edge6" class="edge">
+<g id="edge9" class="edge">
<title>INT_TOP&#45;&gt;INT_PLUS</title>
-<path fill="none" stroke="black" d="M297.77,-324.16C313.31,-301.37 333.71,-271.45 345.66,-253.92"/>
+<path fill="none" stroke="black" d="M288.94,-285.47C302.08,-268.67 323,-241.93 337.89,-222.88"/>
+<polygon fill="black" stroke="black" points="340.52,-225.2 343.93,-215.17 335.01,-220.89 340.52,-225.2"/>
</g>
<!-- INT_MAXDOTS -->
<g id="node12" class="node">
<title>INT_MAXDOTS</title>
-<text text-anchor="middle" x="443.6" y="-233.31" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<ellipse fill="lightblue" stroke="black" cx="443.6" cy="-199.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="443.6" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MAXDOTS -->
-<g id="edge7" class="edge">
+<g id="edge10" class="edge">
<title>INT_TOP&#45;&gt;INT_MAXDOTS</title>
-<path fill="none" stroke="black" d="M307.62,-333.68C339.88,-311.3 389.71,-276.74 419.25,-256.25"/>
+<path fill="none" stroke="black" d="M298.43,-288.04C328.15,-270.07 381.44,-237.84 414.52,-217.83"/>
+<polygon fill="black" stroke="black" points="416.05,-221 422.8,-212.83 412.43,-215.01 416.05,-221"/>
</g>
<!-- INT_MAX -->
<g id="node13" class="node">
<title>INT_MAX</title>
-<ellipse fill="lightblue" stroke="black" cx="534.6" cy="-238.36" rx="21.15" ry="21.15"/>
-<text text-anchor="middle" x="534.6" y="-233.31" font-family="Times New Roman,serif" font-size="14.00">+n</text>
+<ellipse fill="lightblue" stroke="black" cx="534.6" cy="-199.25" rx="21.15" ry="21.15"/>
+<text text-anchor="middle" x="534.6" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">+n</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MAX -->
-<g id="edge8" class="edge">
+<g id="edge11" class="edge">
<title>INT_TOP&#45;&gt;INT_MAX</title>
-<path fill="none" stroke="black" d="M311.12,-339.7C366.18,-314.97 472.08,-267.43 515.4,-247.97"/>
+<path fill="none" stroke="black" d="M303.23,-290.82C351.59,-271.89 453.51,-231.99 504.38,-212.08"/>
+<polygon fill="black" stroke="black" points="505.55,-215.38 513.59,-208.47 503,-208.86 505.55,-215.38"/>
</g>
<!-- INT_BOT -->
<g id="node6" class="node">
<title>INT_BOT</title>
-<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-120.51" rx="38.06" ry="38.06"/>
-<text text-anchor="middle" x="276.6" y="-115.84" font-family="Times New Roman,serif" font-size="14.00">⊥ :Int</text>
+<ellipse fill="lightblue" stroke="black" cx="276.6" cy="-96.25" rx="33.95" ry="18"/>
+<text text-anchor="start" x="259.72" y="-92.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="275.47" y="-92.2" font-family="Times New Roman,serif" font-size="14.00">:int</text>
</g>
<!-- INT_BOT&#45;&gt;BOT -->
-<g id="edge16" class="edge">
+<g id="edge19" class="edge">
<title>INT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M276.6,-82.14C276.6,-68.73 276.6,-54.11 276.6,-42.65"/>
+<path fill="none" stroke="black" d="M276.6,-77.92C276.6,-70.74 276.6,-62.18 276.6,-53.95"/>
+<polygon fill="black" stroke="black" points="280.1,-54.22 276.6,-44.22 273.1,-54.22 280.1,-54.22"/>
</g>
<!-- INT_MIN&#45;&gt;INT_BOT -->
-<g id="edge9" class="edge">
+<g id="edge12" class="edge">
<title>INT_MIN&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M35.52,-229.76C77.34,-210.98 186.17,-162.11 242.19,-136.96"/>
+<path fill="none" stroke="black" d="M35.92,-191.46C77.34,-175.25 182.81,-133.96 239.39,-111.81"/>
+<polygon fill="black" stroke="black" points="240.58,-115.11 248.62,-108.2 238.03,-108.59 240.58,-115.11"/>
</g>
<!-- INT_MIN&#45;&gt;INT_MINDOTS -->
-<!-- INT_MINUS&#45;&gt;INT_BOT -->
-<g id="edge11" class="edge">
-<title>INT_MINUS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M206.73,-222.68C218.92,-205.03 239.72,-174.92 255.46,-152.12"/>
-</g>
-<!-- INT_MINUS&#45;&gt;INT_ZERO -->
<!-- INT_MINDOTS&#45;&gt;INT_BOT -->
-<g id="edge10" class="edge">
+<g id="edge13" class="edge">
<title>INT_MINDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M132.17,-220.51C162.11,-199.99 212.71,-165.3 245.38,-142.91"/>
+<path fill="none" stroke="black" d="M127.31,-186.46C156.24,-169.18 210.48,-136.76 245,-116.13"/>
+<polygon fill="black" stroke="black" points="246.52,-119.3 253.3,-111.17 242.93,-113.29 246.52,-119.3"/>
</g>
<!-- INT_MINDOTS&#45;&gt;INT_MINUS -->
+<!-- INT_MINUS&#45;&gt;INT_BOT -->
+<g id="edge14" class="edge">
+<title>INT_MINUS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M207.72,-184.2C220.41,-168.18 241.41,-141.67 256.89,-122.13"/>
+<polygon fill="black" stroke="black" points="259.58,-124.37 263.05,-114.35 254.09,-120.02 259.58,-124.37"/>
+</g>
+<!-- INT_MINUS&#45;&gt;INT_ZERO -->
<!-- INT_ZERO&#45;&gt;INT_BOT -->
-<g id="edge12" class="edge">
+<g id="edge15" class="edge">
<title>INT_ZERO&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M276.6,-220.01C276.6,-203.86 276.6,-179.23 276.6,-158.64"/>
+<path fill="none" stroke="black" d="M276.6,-181.12C276.6,-166.02 276.6,-143.74 276.6,-125.93"/>
+<polygon fill="black" stroke="black" points="280.1,-125.98 276.6,-115.98 273.1,-125.98 280.1,-125.98"/>
</g>
<!-- INT_ZERO&#45;&gt;INT_PLUS -->
<!-- INT_PLUS&#45;&gt;INT_BOT -->
-<g id="edge13" class="edge">
+<g id="edge16" class="edge">
<title>INT_PLUS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M345.91,-223.15C333.96,-205.63 313.31,-175.35 297.65,-152.39"/>
+<path fill="none" stroke="black" d="M344.94,-184.63C332.49,-168.71 311.63,-142.04 296.23,-122.35"/>
+<polygon fill="black" stroke="black" points="299.01,-120.23 290.1,-114.51 293.5,-124.54 299.01,-120.23"/>
</g>
<!-- INT_PLUS&#45;&gt;INT_MAXDOTS -->
<!-- INT_MAXDOTS&#45;&gt;INT_BOT -->
-<g id="edge14" class="edge">
+<g id="edge17" class="edge">
<title>INT_MAXDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M419.31,-220.51C389.82,-200.05 340.03,-165.51 307.74,-143.12"/>
+<path fill="none" stroke="black" d="M424.11,-186.46C395.53,-169.18 341.93,-136.76 307.82,-116.13"/>
+<polygon fill="black" stroke="black" points="309.99,-113.35 299.62,-111.17 306.37,-119.34 309.99,-113.35"/>
</g>
<!-- INT_MAXDOTS&#45;&gt;INT_MAX -->
<!-- INT_MAX&#45;&gt;INT_BOT -->
-<g id="edge15" class="edge">
+<g id="edge18" class="edge">
<title>INT_MAX&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M515.62,-228.84C472.45,-209.45 366.34,-161.81 311.17,-137.04"/>
-</g>
-<!-- TUPLE&#45;&gt;BOT -->
-<g id="edge24" class="edge">
-<title>TUPLE&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M604.54,-217.92C529.56,-172.93 352.32,-66.57 294.9,-32.11"/>
+<path fill="none" stroke="black" d="M515.2,-190.66C472.47,-173.93 369.55,-133.64 313.87,-111.84"/>
+<polygon fill="black" stroke="black" points="315.4,-108.68 304.81,-108.29 312.84,-115.2 315.4,-108.68"/>
+</g>
+<!-- TUPLE1 -->
+<g id="node16" class="node">
+<title>TUPLE1</title>
+<polygon fill="none" stroke="none" points="652.6,-225.75 598.6,-225.75 598.6,-172.75 652.6,-172.75 652.6,-225.75"/>
+<polygon fill="pink" stroke="none" points="609.1,-199.25 609.1,-221.75 642.1,-221.75 642.1,-199.25 609.1,-199.25"/>
+<polygon fill="none" stroke="black" points="609.1,-199.25 609.1,-221.75 642.1,-221.75 642.1,-199.25 609.1,-199.25"/>
+<text text-anchor="start" x="612.1" y="-205.45" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="609.1,-176.75 609.1,-199.25 642.1,-199.25 642.1,-176.75 609.1,-176.75"/>
+<polygon fill="none" stroke="black" points="609.1,-176.75 609.1,-199.25 642.1,-199.25 642.1,-176.75 609.1,-176.75"/>
+<text text-anchor="start" x="613.97" y="-182.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLE1 -->
+<g id="edge27" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLE1</title>
+<path fill="none" stroke="black" d="M665.45,-284.12C659.18,-270.91 650.28,-252.2 642.49,-235.8"/>
+<polygon fill="black" stroke="black" points="645.67,-234.33 638.22,-226.8 639.35,-237.34 645.67,-234.33"/>
+</g>
+<!-- TUPLE2 -->
+<g id="node17" class="node">
+<title>TUPLE2</title>
+<polygon fill="none" stroke="none" points="749.6,-237 695.6,-237 695.6,-161.5 749.6,-161.5 749.6,-237"/>
+<polygon fill="pink" stroke="none" points="706.1,-210.5 706.1,-233 739.1,-233 739.1,-210.5 706.1,-210.5"/>
+<polygon fill="none" stroke="black" points="706.1,-210.5 706.1,-233 739.1,-233 739.1,-210.5 706.1,-210.5"/>
+<text text-anchor="start" x="709.1" y="-216.7" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="706.1,-188 706.1,-210.5 739.1,-210.5 739.1,-188 706.1,-188"/>
+<polygon fill="none" stroke="black" points="706.1,-188 706.1,-210.5 739.1,-210.5 739.1,-188 706.1,-188"/>
+<text text-anchor="start" x="710.97" y="-194.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="706.1,-165.5 706.1,-188 739.1,-188 739.1,-165.5 706.1,-165.5"/>
+<polygon fill="none" stroke="black" points="706.1,-165.5 706.1,-188 739.1,-188 739.1,-165.5 706.1,-165.5"/>
+<text text-anchor="start" x="710.97" y="-171.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLE2 -->
+<g id="edge28" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLE2</title>
+<path fill="none" stroke="black" d="M681.91,-284.12C686.91,-273.8 693.55,-260.12 700.01,-246.81"/>
+<polygon fill="black" stroke="black" points="703,-248.65 704.22,-238.13 696.7,-245.6 703,-248.65"/>
+</g>
+<!-- TUPLEN -->
+<g id="node18" class="node">
+<title>TUPLEN</title>
+<polygon fill="none" stroke="none" points="846.6,-248.25 792.6,-248.25 792.6,-150.25 846.6,-150.25 846.6,-248.25"/>
+<polygon fill="pink" stroke="none" points="803.1,-221.75 803.1,-244.25 836.1,-244.25 836.1,-221.75 803.1,-221.75"/>
+<polygon fill="none" stroke="black" points="803.1,-221.75 803.1,-244.25 836.1,-244.25 836.1,-221.75 803.1,-221.75"/>
+<text text-anchor="start" x="806.1" y="-227.95" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="803.1,-199.25 803.1,-221.75 836.1,-221.75 836.1,-199.25 803.1,-199.25"/>
+<polygon fill="none" stroke="black" points="803.1,-199.25 803.1,-221.75 836.1,-221.75 836.1,-199.25 803.1,-199.25"/>
+<text text-anchor="start" x="807.97" y="-205.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="803.1,-176.75 803.1,-199.25 836.1,-199.25 836.1,-176.75 803.1,-176.75"/>
+<polygon fill="none" stroke="black" points="803.1,-176.75 803.1,-199.25 836.1,-199.25 836.1,-176.75 803.1,-176.75"/>
+<text text-anchor="start" x="813.97" y="-182.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+<polygon fill="black" stroke="none" points="803.1,-154.25 803.1,-176.75 836.1,-176.75 836.1,-154.25 803.1,-154.25"/>
+<polygon fill="none" stroke="black" points="803.1,-154.25 803.1,-176.75 836.1,-176.75 836.1,-154.25 803.1,-154.25"/>
+<text text-anchor="start" x="807.97" y="-160.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLEN -->
+<g id="edge29" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLEN</title>
+<path fill="none" stroke="black" d="M695.14,-286.35C718.34,-270.29 755.65,-244.48 783.38,-225.3"/>
+<polygon fill="black" stroke="black" points="785.27,-228.25 791.51,-219.68 781.29,-222.49 785.27,-228.25"/>
+</g>
+<!-- TUPLE_BOT -->
+<g id="node15" class="node">
+<title>TUPLE_BOT</title>
+<ellipse fill="pink" stroke="black" cx="673.6" cy="-96.25" rx="42.65" ry="18"/>
+<text text-anchor="start" x="650.35" y="-92.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="666.1" y="-92.2" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+</g>
+<!-- TUPLE_BOT&#45;&gt;BOT -->
+<g id="edge33" class="edge">
+<title>TUPLE_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M635.17,-88.17C557.01,-73.77 380.82,-41.32 308.5,-28"/>
+<polygon fill="black" stroke="black" points="309.38,-24.6 298.91,-26.23 308.11,-31.49 309.38,-24.6"/>
+</g>
+<!-- TUPLE1&#45;&gt;TUPLE_BOT -->
+<g id="edge30" class="edge">
+<title>TUPLE1&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M637.71,-172.76C644.73,-158 653.56,-139.41 660.7,-124.38"/>
+<polygon fill="black" stroke="black" points="663.78,-126.06 664.91,-115.53 657.45,-123.06 663.78,-126.06"/>
+</g>
+<!-- TUPLE2&#45;&gt;TUPLE_BOT -->
+<g id="edge31" class="edge">
+<title>TUPLE2&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M704.77,-161.5C698.84,-149.27 692.34,-135.89 686.82,-124.51"/>
+<polygon fill="black" stroke="black" points="690.05,-123.15 682.54,-115.69 683.76,-126.21 690.05,-123.15"/>
+</g>
+<!-- TUPLEN&#45;&gt;TUPLE_BOT -->
+<g id="edge32" class="edge">
+<title>TUPLEN&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M792.82,-179.72C767.85,-162.45 730.64,-136.71 704.44,-118.58"/>
+<polygon fill="black" stroke="black" points="706.45,-115.72 696.23,-112.91 702.46,-121.47 706.45,-115.72"/>
</g>
</g>
</svg>
diff --git a/chapter10/README.md b/chapter10/README.md
index c27c4b74..957be607 100644
--- a/chapter10/README.md
+++ b/chapter10/README.md
@@ -118,6 +118,7 @@ Additionally, the following Node types will be enhanced:
| Start | Control | Start will produce the initial Memory projections, one per slice |
| Return | Control | Will merge all memory slices |
+
## Enhanced Type Lattice
The Type Lattice for Simple has a major revision in this chapter.
@@ -126,22 +127,38 @@ The Type Lattice for Simple has a major revision in this chapter.
Within the Type Lattice, we now have the following type domains:
-* Control type - this represents control flow
-* Integer type - Integer values
-* Tuple type - when a Node results in more than one value
-* Struct type (new) - Represents user defined struct types, a struct type is allowed to have members of Integer type only in this chapter
- * `$TOP` represents local Top for struct type; all we know about the type is that it is a struct but, we do not know if it is a specific struct, or all possible structs, etc.
- * `$BOT` represents local Bottom for struct type; we definitely know the value can take all possible struct types.
-* Pointer type (new) - Represents a pointer to a struct type
- * `null` is a pointer to non-existent memory object
- * We use the prefix `*` to mean pointer-to. Thus `*S1` means pointer to `S1`, `*$TOP` means pointer to `$TOP`.
- * `*void` is a synonym for `*$BOT` - i.e. it represents a Non-Null pointer to all possible struct types, akin to `void *` in C except not null.
+* <font style="background-color:yellow">Control type</font> - represents control flow
+* <font style="background-color:lightblue">Integer type</font> - Integer values, with a Top, Bottom and constants
+* <font style="background-color:green" color="white">Pointer type</font> (new) - Represents a pointer to a struct type
+ * We use the prefix `*` to mean pointer-to. Thus `*S1` means pointer to
+ `S1`, `*$TOP` means pointer to `$TOP`.
* `?` suffix represents the union of a pointer to some type and `null`.
- * `null` pointer evaluates to False and non-null pointers evaluate to True, as in C.
-* Memory (new) - Represents memory and memory slices
- * `MEM#TOP` - Nothing known about a slice
- * `#n` - refers to a memory slice
- * `MEM#BOT` - all of memory
+ * The pointer lattice has only 2 entries: null or not-null. In both cases a struct lattice element is
+ included, and can be any member of the struct lattice.
+ * `null` is a pointer to non-existent memory object, i.e. `*$TOP?`, and is a
+ nullable. Notice that the null part of the type is low in the lattice,
+ while the struct part is the highest struct.
+ * `*void` is a synonym for `*$BOT` - i.e. it represents a non-null pointer to
+ all possible struct types, akin to `void *` in C except not null. It is
+ the inverse or *dual* of `null`, and the null part is high in the pointer
+ lattice, while the struct part is the lowest struct.
+ * `null` pointer evaluates to False and non-null pointers evaluate to True, as in C.
+
+* <font style="background-color:lightgreen">Struct type</font> (new) -
+ Represents user defined struct types, a struct type is allowed to have
+ members of Integer type only in this chapter, later chapters will expand
+ this.
+ * `⊤:struct` represents local Top for struct type; all we know about the type
+ is that it is a struct but, we do not know if it is a specific struct, or
+ all possible structs. In the code, we use a struct with no fields named `$TOP`.
+ * `⊥:struct` represents local Bottom for struct type; we definitely know the
+ value can take all possible struct types. In the code, we uise a struct
+ with no fields named `$BOT`.
+* <font style="background-color:blue" color="white">Memory type</font> (new) - Represents memory and memory slices
+ * `⊤:mem` - Nothing known about a slice; in the code we use `MEM#TOP`.
+ * `#n` - refers to a memory slice, and `n` is the alias class.
+ * `⊥:mem` - all of memory; in the code we use `MEM#BOT`.
+* <font style="background-color:pink">Tuple type</font> - when a Node results in a collection of values
We make use of following operations on the lattice.
@@ -150,20 +167,22 @@ We make use of following operations on the lattice.
thought of as set union (ORing) of its input types (as sets).
* Example, meet of `*S1` and `*S2` results in `*void` - there is no lattice
element for exactly both `{*S1,*S2}`, so we drop down to the nearest
- element containing both (and maybe more), which is `*void*`.
- * Meet of `*S1` and struct `Null` results in `*S1?`
- * Meet of `*void` and `Null` results in `*$BOT?`; bear in mind that `*void` is a synonym for `*$BOT`.
+ element containing both (and maybe more), which is `*void`.
+ * Meet of `*S1` and pointer `null` results in `*S1?`
+ * Meet of `*void` and `null` results in `*$BOT?`; bear in mind that `*void` is a synonym for `*$BOT`.
* Meet of `1` and `2` results in `Int Bot`.
* Meet of `#1` and `#2` results in `MEM#BOT`.
* The `dual` operation is symmetric across the lattice centerline. Types directly on the centerline are their own dual.
* Find the corresponding node of the lattice after inverting the lattice.
* Thus, dual of `Top` is `Bot`.
* The dual of `*$TOP` is `*$BOT?`.
- * For structs, the dual is obtained by computing the dual of each struct member. Thus, dual of `*S1` is not `*S1?`.
+ * For structs, the dual is obtained by computing the dual of each struct
+ member. Thus, dual of `*S1` is not `*S1?`, it is some `*S1?` with dualed
+ fields.
* The `join` operation takes two types and computes the least upper bound type.
Similar to `meet` this can thought of as set intersection (ANDing) of its input types.
- Because our lattice structure is simple, we compute `join` with a well known identity:
+ Because our lattice structure is symmetric and complete, we compute `join` with a well known identity:
`JOIN(x,y) === MEET(x.dual,y.dual).dual`
* Example, join of `*S1` and `*S2` results in `*$TOP`.
* Join of `1` and `2` results in `Int Top`.
@@ -195,8 +214,8 @@ lattice described in the previous section.
## Null Pointer Analysis
The Simple language syntax allows a pointer variable to be specified as
-Null-able - and it prevents ever throwing a Null Pointer Exception. The
-compiler tries to decide in a null check is needed, and if needed and missing
+null-able - and it prevents ever throwing a Null Pointer Exception. The
+compiler decides if a null check is needed, and if needed and missing
the compiler rejects the program (asking the user to insert a null check).
When the Parser encounters conditions that test the truthiness of a pointer variable, it uses this knowledge to refine the type information in the branches that follow.
diff --git a/chapter10/docs/lattice.gv b/chapter10/docs/lattice.gv
index 5ac1bd5a..7723e2a2 100644
--- a/chapter10/docs/lattice.gv
+++ b/chapter10/docs/lattice.gv
@@ -5,12 +5,12 @@ digraph Lattice {
node [shape=circle, style=filled];
nodesep=0.6;
- TOP [label=<<B>⊤ </B>>, fillcolor=black, fontcolor=white];
+ 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];
+ XCTRL [label=<<B>⊤</B >:ctrl>, fillcolor=yellow, shape=oval];
CTRL [label=<<B>⊥</B>:ctrl>, fillcolor=yellow, shape=oval];
TOP -> XCTRL;
@@ -19,29 +19,23 @@ digraph Lattice {
// ----------------------
// Integers
- INT_TOP [label=<<B>⊤ </B>:int>, fillcolor=lightblue, shape=oval];
+ 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;
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];
+ INT_MINDOTS -> INT_ZERO -> INT_MAXDOTS [style=invis];
// ----------------------
// Pointers, just a boolean nil/not and a struct
@@ -64,28 +58,28 @@ digraph Lattice {
// ----------------------
// Structs
- STRUCT_TOP [label=<<B>⊤</B>:struct>, fillcolor=lightgreen, shape=oval];
+ STRUCT_TOP [label=<<B>⊤</B >:struct>, fillcolor=lightgreen, shape=oval];
+ STRUCT_BOT [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>
+ <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>
+ <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>
+ <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;
@@ -100,11 +94,11 @@ digraph Lattice {
// ----------------------
// Memory
- MEM_TOP [label=<<B>⊤</B>:mem>, fillcolor=blue, fontcolor=white, shape=oval];
+ MEM_TOP [label=<<B>⊤</B >:mem>, fillcolor=blue, fontcolor=white, shape=oval];
+ MEM_BOT [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;
@@ -120,7 +114,8 @@ digraph Lattice {
// ----------------------
// Tuples
- TUPLE_TOP [label=<<B>⊤</B>:tuple>, fillcolor=pink, shape=oval];
+ TUPLE_TOP [label=<<B>⊤</B >:tuple>, fillcolor=pink, shape=oval];
+ TUPLE_BOT [label=<<B>⊥</B>:tuple>, fillcolor=pink, shape=oval];
TUPLE1 [shape=none, fillcolor=none, label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
@@ -144,7 +139,6 @@ digraph Lattice {
</TABLE>
>];
- TUPLE_BOT [label=<<B>⊥</B>:tuple>, fillcolor=pink, shape=oval];
TOP -> TUPLE_TOP;
TUPLE_TOP -> TUPLE1;
@@ -159,11 +153,9 @@ digraph Lattice {
// Additional customization
{rank=same; TOP;}
{rank=same; INT_TOP; XCTRL; STRUCT_TOP; MEM_TOP; TUPLE_TOP}
- {rank=same; INT_MIN; INT_MINDOTS;
- INT_ZERO; INT_MAXDOTS;
- INT_MAX; STRUCT_S1; STRUCT_S2; STRUCT_SN;
- MEM_ALIAS1;
- MEM_ALIASDOTS; MEM_ALIASN;}
+ {rank=same; INT_MINDOTS; INT_ZERO; INT_MAXDOTS;
+ STRUCT_S1; STRUCT_S2; STRUCT_SN;
+ MEM_ALIAS1; MEM_ALIASDOTS; MEM_ALIASN;}
{rank=same; INT_BOT; CTRL; STRUCT_BOT; MEM_BOT; TUPLE_BOT}
{rank=same; BOT;}
}
diff --git a/chapter10/docs/lattice.svg b/chapter10/docs/lattice.svg
index 02f3ce69..9eb36bbe 100644
--- a/chapter10/docs/lattice.svg
+++ b/chapter10/docs/lattice.svg
@@ -4,551 +4,513 @@
<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: Lattice Pages: 1 -->
-<svg width="1465pt" height="447pt"
- viewBox="0.00 0.00 1465.07 446.70" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 442.7)">
+<svg width="1308pt" height="440pt"
+ viewBox="0.00 0.00 1307.51 440.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 436.5)">
<title>Lattice</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-442.7 1461.07,-442.7 1461.07,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-436.5 1303.51,-436.5 1303.51,4 -4,4"/>
<!-- TOP -->
<g id="node1" class="node">
<title>TOP</title>
-<ellipse fill="black" stroke="black" cx="581.07" cy="-414.47" rx="24.23" ry="24.23"/>
-<text text-anchor="start" x="571.32" y="-410.42" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤ </text>
+<ellipse fill="black" stroke="black" cx="478.51" cy="-411.37" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="470.63" y="-406.95" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
</g>
<!-- XCTRL -->
<g id="node3" class="node">
<title>XCTRL</title>
-<ellipse fill="yellow" stroke="black" cx="39.07" cy="-327.75" rx="39.07" ry="18"/>
-<text text-anchor="start" x="18.44" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤ </text>
-<text text-anchor="start" x="37.94" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+<ellipse fill="yellow" stroke="black" cx="36.51" cy="-327.75" rx="36.51" ry="18"/>
+<text text-anchor="start" x="17.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="33.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
</g>
<!-- TOP&#45;&gt;XCTRL -->
<g id="edge1" class="edge">
<title>TOP&#45;&gt;XCTRL</title>
-<path fill="none" stroke="black" d="M557.08,-409.72C474.17,-396.76 198.71,-353.7 86.88,-336.22"/>
-<polygon fill="black" stroke="black" points="87.55,-332.78 77.13,-334.7 86.47,-339.7 87.55,-332.78"/>
+<path fill="none" stroke="black" d="M457.49,-406.49C389.63,-393.96 175.41,-354.4 81.44,-337.04"/>
+<polygon fill="black" stroke="black" points="82.28,-333.64 71.81,-335.27 81.01,-340.53 82.28,-333.64"/>
</g>
<!-- INT_TOP -->
<g id="node5" class="node">
<title>INT_TOP</title>
-<ellipse fill="lightblue" stroke="black" cx="273.07" cy="-327.75" rx="36.51" ry="18"/>
-<text text-anchor="start" x="254.32" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤ </text>
-<text text-anchor="start" x="273.82" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+<ellipse fill="lightblue" stroke="black" cx="220.51" cy="-327.75" rx="33.95" ry="18"/>
+<text text-anchor="start" x="203.63" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="219.38" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
</g>
<!-- TOP&#45;&gt;INT_TOP -->
<g id="edge4" class="edge">
<title>TOP&#45;&gt;INT_TOP</title>
-<path fill="none" stroke="black" d="M557.67,-407.04C505.91,-392.8 381.13,-358.47 315.32,-340.37"/>
-<polygon fill="black" stroke="black" points="316.55,-337.08 305.98,-337.8 314.69,-343.83 316.55,-337.08"/>
+<path fill="none" stroke="black" d="M458.26,-403.97C415.59,-390.47 315.75,-358.88 259.97,-341.23"/>
+<polygon fill="black" stroke="black" points="261.14,-337.93 250.55,-338.25 259.03,-344.61 261.14,-337.93"/>
</g>
<!-- PTR -->
-<g id="node12" class="node">
+<g id="node10" class="node">
<title>PTR</title>
-<polygon fill="none" stroke="none" points="551.07,-354.25 497.07,-354.25 497.07,-301.25 551.07,-301.25 551.07,-354.25"/>
-<polygon fill="green" stroke="none" points="506.07,-327.75 506.07,-350.25 542.07,-350.25 542.07,-327.75 506.07,-327.75"/>
-<polygon fill="none" stroke="black" points="506.07,-327.75 506.07,-350.25 542.07,-350.25 542.07,-327.75 506.07,-327.75"/>
-<text text-anchor="start" x="513.19" y="-333.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr</text>
-<polygon fill="lightgreen" stroke="none" points="506.07,-305.25 506.07,-327.75 542.07,-327.75 542.07,-305.25 506.07,-305.25"/>
-<polygon fill="none" stroke="black" points="506.07,-305.25 506.07,-327.75 542.07,-327.75 542.07,-305.25 506.07,-305.25"/>
-<text text-anchor="start" x="509.07" y="-311.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
+<polygon fill="none" stroke="none" points="387.51,-354.25 333.51,-354.25 333.51,-301.25 387.51,-301.25 387.51,-354.25"/>
+<polygon fill="green" stroke="none" points="342.51,-327.75 342.51,-350.25 378.51,-350.25 378.51,-327.75 342.51,-327.75"/>
+<polygon fill="none" stroke="black" points="342.51,-327.75 342.51,-350.25 378.51,-350.25 378.51,-327.75 342.51,-327.75"/>
+<text text-anchor="start" x="349.63" y="-333.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr</text>
+<polygon fill="lightgreen" stroke="none" points="342.51,-305.25 342.51,-327.75 378.51,-327.75 378.51,-305.25 342.51,-305.25"/>
+<polygon fill="none" stroke="black" points="342.51,-305.25 342.51,-327.75 378.51,-327.75 378.51,-305.25 342.51,-305.25"/>
+<text text-anchor="start" x="345.51" y="-311.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
</g>
<!-- TOP&#45;&gt;PTR -->
-<g id="edge20" class="edge">
+<g id="edge14" class="edge">
<title>TOP&#45;&gt;PTR</title>
-<path fill="none" stroke="black" d="M567.85,-393.82C561.75,-384.77 554.34,-373.74 547.35,-363.36"/>
-<polygon fill="black" stroke="black" points="550.44,-361.68 541.96,-355.34 544.63,-365.59 550.44,-361.68"/>
+<path fill="none" stroke="black" d="M461.35,-398.5C444.42,-386.79 418.03,-368.54 396.49,-353.64"/>
+<polygon fill="black" stroke="black" points="398.75,-350.95 388.54,-348.14 394.77,-356.7 398.75,-350.95"/>
</g>
<!-- STRUCT_TOP -->
-<g id="node14" class="node">
+<g id="node12" class="node">
<title>STRUCT_TOP</title>
-<ellipse fill="lightgreen" stroke="black" cx="700.07" cy="-327.75" rx="44.7" ry="18"/>
-<text text-anchor="start" x="675.32" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="691.07" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+<ellipse fill="lightgreen" stroke="black" cx="514.51" cy="-327.75" rx="44.7" ry="18"/>
+<text text-anchor="start" x="489.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="505.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
</g>
<!-- TOP&#45;&gt;STRUCT_TOP -->
-<g id="edge23" class="edge">
+<g id="edge17" class="edge">
<title>TOP&#45;&gt;STRUCT_TOP</title>
-<path fill="none" stroke="black" d="M600.72,-399.48C619.46,-386.14 647.98,-365.83 669.66,-350.4"/>
-<polygon fill="black" stroke="black" points="671.43,-353.43 677.55,-344.78 667.37,-347.73 671.43,-353.43"/>
+<path fill="none" stroke="black" d="M486.86,-391.44C491.45,-381.02 497.24,-367.9 502.33,-356.35"/>
+<polygon fill="black" stroke="black" points="505.5,-357.86 506.33,-347.29 499.09,-355.03 505.5,-357.86"/>
</g>
<!-- MEM_TOP -->
-<g id="node19" class="node">
+<g id="node17" class="node">
<title>MEM_TOP</title>
-<ellipse fill="blue" stroke="black" cx="1011.07" cy="-327.75" rx="43.67" ry="18"/>
-<text text-anchor="start" x="987.07" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
-<text text-anchor="start" x="1002.82" y="-323.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+<ellipse fill="blue" stroke="black" cx="853.51" cy="-327.75" rx="43.67" ry="18"/>
+<text text-anchor="start" x="829.51" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
+<text text-anchor="start" x="845.26" y="-323.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
</g>
<!-- TOP&#45;&gt;MEM_TOP -->
-<g id="edge33" class="edge">
+<g id="edge27" class="edge">
<title>TOP&#45;&gt;MEM_TOP</title>
-<path fill="none" stroke="black" d="M605.11,-408.74C673.19,-395.32 868.38,-356.86 961.06,-338.6"/>
-<polygon fill="black" stroke="black" points="961.48,-342.09 970.62,-336.72 960.13,-335.22 961.48,-342.09"/>
+<path fill="none" stroke="black" d="M499.2,-405.87C556.98,-393.29 721.22,-357.54 804.21,-339.48"/>
+<polygon fill="black" stroke="black" points="804.86,-342.92 813.89,-337.37 803.37,-336.08 804.86,-342.92"/>
</g>
<!-- TUPLE_TOP -->
-<g id="node24" class="node">
+<g id="node22" class="node">
<title>TUPLE_TOP</title>
-<ellipse fill="pink" stroke="black" cx="1284.07" cy="-327.75" rx="42.65" ry="18"/>
-<text text-anchor="start" x="1260.82" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="1276.57" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+<ellipse fill="pink" stroke="black" cx="1126.51" cy="-327.75" rx="42.65" ry="18"/>
+<text text-anchor="start" x="1103.26" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="1119.01" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
</g>
<!-- TOP&#45;&gt;TUPLE_TOP -->
-<g id="edge43" class="edge">
+<g id="edge37" class="edge">
<title>TOP&#45;&gt;TUPLE_TOP</title>
-<path fill="none" stroke="black" d="M605.27,-410.56C705.78,-398.44 1091.6,-351.95 1232.32,-334.99"/>
-<polygon fill="black" stroke="black" points="1232.58,-338.48 1242.09,-333.81 1231.74,-331.53 1232.58,-338.48"/>
+<path fill="none" stroke="black" d="M499.7,-407.7C589.67,-396.37 941.49,-352.05 1074.87,-335.25"/>
+<polygon fill="black" stroke="black" points="1074.97,-338.77 1084.46,-334.05 1074.1,-331.82 1074.97,-338.77"/>
</g>
<!-- BOT -->
<g id="node2" class="node">
<title>BOT</title>
-<ellipse fill="black" stroke="black" cx="612.07" cy="-21.12" rx="21.12" ry="21.12"/>
-<text text-anchor="start" x="604.19" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
+<ellipse fill="black" stroke="black" cx="448.51" cy="-21.12" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="440.63" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
</g>
<!-- CTRL -->
<g id="node4" class="node">
<title>CTRL</title>
-<ellipse fill="yellow" stroke="black" cx="42.07" cy="-104.75" rx="36.51" ry="18"/>
-<text text-anchor="start" x="23.32" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="39.07" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+<ellipse fill="yellow" stroke="black" cx="36.51" cy="-104.75" rx="36.51" ry="18"/>
+<text text-anchor="start" x="17.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="33.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
</g>
<!-- XCTRL&#45;&gt;CTRL -->
<g id="edge2" class="edge">
<title>XCTRL&#45;&gt;CTRL</title>
-<path fill="none" stroke="black" d="M39.31,-309.5C39.83,-271.02 41.04,-181.25 41.67,-134.4"/>
-<polygon fill="black" stroke="black" points="45.17,-134.5 41.8,-124.45 38.17,-134.4 45.17,-134.5"/>
+<path fill="none" stroke="black" d="M36.51,-309.5C36.51,-271.02 36.51,-181.25 36.51,-134.4"/>
+<polygon fill="black" stroke="black" points="40.01,-134.45 36.51,-124.45 33.01,-134.45 40.01,-134.45"/>
</g>
<!-- CTRL&#45;&gt;BOT -->
<g id="edge3" class="edge">
<title>CTRL&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M76.87,-98.77C179.54,-84.06 480.24,-41 579.71,-26.76"/>
-<polygon fill="black" stroke="black" points="580.17,-30.23 589.57,-25.35 579.18,-23.3 580.17,-30.23"/>
-</g>
-<!-- INT_MIN -->
-<g id="node7" class="node">
-<title>INT_MIN</title>
-<ellipse fill="lightblue" stroke="black" cx="52.07" cy="-216.25" rx="18.6" ry="18.6"/>
-<text text-anchor="middle" x="52.07" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">&#45;n</text>
-</g>
-<!-- INT_TOP&#45;&gt;INT_MIN -->
-<g id="edge5" class="edge">
-<title>INT_TOP&#45;&gt;INT_MIN</title>
-<path fill="none" stroke="black" d="M248.15,-314.4C206.3,-293.66 122.25,-252.02 79.06,-230.62"/>
-<polygon fill="black" stroke="black" points="80.63,-227.49 70.12,-226.19 77.52,-233.77 80.63,-227.49"/>
+<path fill="none" stroke="black" d="M69.88,-97.14C147.7,-81.72 340.42,-43.54 416.69,-28.43"/>
+<polygon fill="black" stroke="black" points="417.29,-31.88 426.41,-26.5 415.93,-25.01 417.29,-31.88"/>
</g>
<!-- INT_MINDOTS -->
-<g id="node8" class="node">
+<g id="node7" class="node">
<title>INT_MINDOTS</title>
-<ellipse fill="lightblue" stroke="black" cx="141.07" cy="-216.25" rx="27" ry="18"/>
-<text text-anchor="middle" x="141.07" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<ellipse fill="lightblue" stroke="black" cx="68.51" cy="-216.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="68.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MINDOTS -->
-<g id="edge6" class="edge">
+<g id="edge5" class="edge">
<title>INT_TOP&#45;&gt;INT_MINDOTS</title>
-<path fill="none" stroke="black" d="M254.99,-311.75C231.87,-292.58 191.74,-259.28 165.8,-237.77"/>
-<polygon fill="black" stroke="black" points="168.37,-235.35 158.44,-231.66 163.9,-240.73 168.37,-235.35"/>
+<path fill="none" stroke="black" d="M200.95,-312.66C174.03,-293.27 125.48,-258.29 95.24,-236.5"/>
+<polygon fill="black" stroke="black" points="97.5,-233.82 87.34,-230.81 93.41,-239.5 97.5,-233.82"/>
</g>
<!-- INT_ZERO -->
-<g id="node9" class="node">
+<g id="node8" class="node">
<title>INT_ZERO</title>
-<ellipse fill="lightblue" stroke="black" cx="229.07" cy="-216.25" rx="18" ry="18"/>
-<text text-anchor="middle" x="229.07" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
+<ellipse fill="lightblue" stroke="black" cx="156.51" cy="-216.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="156.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
</g>
<!-- INT_TOP&#45;&gt;INT_ZERO -->
-<g id="edge7" class="edge">
+<g id="edge6" class="edge">
<title>INT_TOP&#45;&gt;INT_ZERO</title>
-<path fill="none" stroke="black" d="M266.19,-309.64C259.14,-292.08 248.06,-264.51 239.84,-244.05"/>
-<polygon fill="black" stroke="black" points="243.15,-242.9 236.17,-234.93 236.65,-245.51 243.15,-242.9"/>
+<path fill="none" stroke="black" d="M210.79,-310.12C200.2,-292 183.15,-262.82 170.98,-242.01"/>
+<polygon fill="black" stroke="black" points="174.12,-240.45 166.05,-233.58 168.08,-243.98 174.12,-240.45"/>
</g>
<!-- INT_MAXDOTS -->
-<g id="node10" class="node">
+<g id="node9" class="node">
<title>INT_MAXDOTS</title>
-<ellipse fill="lightblue" stroke="black" cx="317.07" cy="-216.25" rx="27" ry="18"/>
-<text text-anchor="middle" x="317.07" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<ellipse fill="lightblue" stroke="black" cx="244.51" cy="-216.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="244.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
</g>
<!-- INT_TOP&#45;&gt;INT_MAXDOTS -->
-<g id="edge8" class="edge">
+<g id="edge7" class="edge">
<title>INT_TOP&#45;&gt;INT_MAXDOTS</title>
-<path fill="none" stroke="black" d="M279.94,-309.64C286.96,-292.18 297.95,-264.82 306.16,-244.4"/>
-<polygon fill="black" stroke="black" points="309.34,-245.87 309.82,-235.28 302.84,-243.26 309.34,-245.87"/>
-</g>
-<!-- INT_MAX -->
-<g id="node11" class="node">
-<title>INT_MAX</title>
-<ellipse fill="lightblue" stroke="black" cx="408.07" cy="-216.25" rx="21.15" ry="21.15"/>
-<text text-anchor="middle" x="408.07" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">+n</text>
-</g>
-<!-- INT_TOP&#45;&gt;INT_MAX -->
-<g id="edge9" class="edge">
-<title>INT_TOP&#45;&gt;INT_MAX</title>
-<path fill="none" stroke="black" d="M291.56,-311.75C315.33,-292.47 356.7,-258.92 383.21,-237.41"/>
-<polygon fill="black" stroke="black" points="385.17,-240.33 390.73,-231.31 380.76,-234.89 385.17,-240.33"/>
+<path fill="none" stroke="black" d="M224.26,-309.64C228.03,-292.44 233.9,-265.64 238.35,-245.33"/>
+<polygon fill="black" stroke="black" points="241.74,-246.23 240.46,-235.72 234.9,-244.73 241.74,-246.23"/>
</g>
<!-- INT_BOT -->
<g id="node6" class="node">
<title>INT_BOT</title>
-<ellipse fill="lightblue" stroke="black" cx="273.07" cy="-104.75" rx="33.95" ry="18"/>
-<text text-anchor="start" x="256.19" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="271.94" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+<ellipse fill="lightblue" stroke="black" cx="220.51" cy="-104.75" rx="33.95" ry="18"/>
+<text text-anchor="start" x="203.63" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="219.38" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
</g>
<!-- INT_BOT&#45;&gt;BOT -->
-<g id="edge15" class="edge">
+<g id="edge11" class="edge">
<title>INT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M303.75,-96.36C367.89,-80.92 515.56,-45.36 580.48,-29.73"/>
-<polygon fill="black" stroke="black" points="581.22,-33.15 590.12,-27.41 579.58,-26.35 581.22,-33.15"/>
-</g>
-<!-- INT_MIN&#45;&gt;INT_BOT -->
-<g id="edge10" class="edge">
-<title>INT_MIN&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M68.68,-207.02C104.61,-189.22 190.19,-146.81 238.44,-122.9"/>
-<polygon fill="black" stroke="black" points="239.95,-126.06 247.36,-118.49 236.84,-119.79 239.95,-126.06"/>
+<path fill="none" stroke="black" d="M248.01,-93.9C290.83,-78.57 373.15,-49.1 417.83,-33.11"/>
+<polygon fill="black" stroke="black" points="418.93,-36.43 427.17,-29.76 416.57,-29.84 418.93,-36.43"/>
</g>
-<!-- INT_MIN&#45;&gt;INT_MINDOTS -->
<!-- INT_MINDOTS&#45;&gt;INT_BOT -->
-<g id="edge11" class="edge">
+<g id="edge8" class="edge">
<title>INT_MINDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M157.52,-201.6C179.9,-183.04 220.19,-149.61 246.78,-127.55"/>
-<polygon fill="black" stroke="black" points="248.94,-130.31 254.4,-121.23 244.47,-124.92 248.94,-130.31"/>
+<path fill="none" stroke="black" d="M86.24,-202.47C112.22,-183.76 160.89,-148.7 191.95,-126.33"/>
+<polygon fill="black" stroke="black" points="193.68,-129.39 199.75,-120.71 189.59,-123.71 193.68,-129.39"/>
</g>
<!-- INT_MINDOTS&#45;&gt;INT_ZERO -->
<!-- INT_ZERO&#45;&gt;INT_BOT -->
-<g id="edge12" class="edge">
+<g id="edge9" class="edge">
<title>INT_ZERO&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M235.56,-199.09C242.53,-181.74 253.73,-153.88 262.08,-133.1"/>
-<polygon fill="black" stroke="black" points="265.21,-134.68 265.7,-124.1 258.72,-132.07 265.21,-134.68"/>
+<path fill="none" stroke="black" d="M165.14,-200.48C175.34,-183.02 192.52,-153.64 205.04,-132.22"/>
+<polygon fill="black" stroke="black" points="207.97,-134.13 210,-123.73 201.93,-130.6 207.97,-134.13"/>
</g>
<!-- INT_ZERO&#45;&gt;INT_MAXDOTS -->
<!-- INT_MAXDOTS&#45;&gt;INT_BOT -->
-<g id="edge13" class="edge">
+<g id="edge10" class="edge">
<title>INT_MAXDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M310.39,-198.62C303.41,-181.25 292.35,-153.73 284.08,-133.15"/>
-<polygon fill="black" stroke="black" points="287.35,-131.91 280.38,-123.94 280.86,-134.52 287.35,-131.91"/>
-</g>
-<!-- INT_MAXDOTS&#45;&gt;INT_MAX -->
-<!-- INT_MAX&#45;&gt;INT_BOT -->
-<g id="edge14" class="edge">
-<title>INT_MAX&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M391.78,-202.04C368.98,-183.54 327.24,-149.69 299.83,-127.45"/>
-<polygon fill="black" stroke="black" points="302.28,-124.93 292.3,-121.35 297.87,-130.37 302.28,-124.93"/>
+<path fill="none" stroke="black" d="M240.76,-198.14C237.01,-181.04 231.18,-154.46 226.74,-134.19"/>
+<polygon fill="black" stroke="black" points="230.2,-133.6 224.64,-124.58 223.36,-135.09 230.2,-133.6"/>
</g>
<!-- PTR0 -->
-<g id="node13" class="node">
+<g id="node11" class="node">
<title>PTR0</title>
-<polygon fill="none" stroke="none" points="551.07,-131.25 497.07,-131.25 497.07,-78.25 551.07,-78.25 551.07,-131.25"/>
-<polygon fill="green" stroke="none" points="506.07,-104.75 506.07,-127.25 542.07,-127.25 542.07,-104.75 506.07,-104.75"/>
-<polygon fill="none" stroke="black" points="506.07,-104.75 506.07,-127.25 542.07,-127.25 542.07,-104.75 506.07,-104.75"/>
-<text text-anchor="start" x="510.19" y="-110.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr?</text>
-<polygon fill="lightgreen" stroke="none" points="506.07,-82.25 506.07,-104.75 542.07,-104.75 542.07,-82.25 506.07,-82.25"/>
-<polygon fill="none" stroke="black" points="506.07,-82.25 506.07,-104.75 542.07,-104.75 542.07,-82.25 506.07,-82.25"/>
-<text text-anchor="start" x="509.07" y="-88.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
+<polygon fill="none" stroke="none" points="387.51,-131.25 333.51,-131.25 333.51,-78.25 387.51,-78.25 387.51,-131.25"/>
+<polygon fill="green" stroke="none" points="342.51,-104.75 342.51,-127.25 378.51,-127.25 378.51,-104.75 342.51,-104.75"/>
+<polygon fill="none" stroke="black" points="342.51,-104.75 342.51,-127.25 378.51,-127.25 378.51,-104.75 342.51,-104.75"/>
+<text text-anchor="start" x="346.63" y="-110.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr?</text>
+<polygon fill="lightgreen" stroke="none" points="342.51,-82.25 342.51,-104.75 378.51,-104.75 378.51,-82.25 342.51,-82.25"/>
+<polygon fill="none" stroke="black" points="342.51,-82.25 342.51,-104.75 378.51,-104.75 378.51,-82.25 342.51,-82.25"/>
+<text text-anchor="start" x="345.51" y="-88.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
</g>
<!-- PTR&#45;&gt;PTR0 -->
-<g id="edge21" class="edge">
+<g id="edge15" class="edge">
<title>PTR&#45;&gt;PTR0</title>
-<path fill="none" stroke="black" d="M524.07,-301.29C524.07,-261.89 524.07,-187.62 524.07,-142.52"/>
-<polygon fill="black" stroke="black" points="527.57,-142.68 524.07,-132.68 520.57,-142.68 527.57,-142.68"/>
+<path fill="none" stroke="black" d="M360.51,-301.29C360.51,-261.89 360.51,-187.62 360.51,-142.52"/>
+<polygon fill="black" stroke="black" points="364.01,-142.68 360.51,-132.68 357.01,-142.68 364.01,-142.68"/>
</g>
<!-- PTR0&#45;&gt;BOT -->
-<g id="edge22" class="edge">
+<g id="edge16" class="edge">
<title>PTR0&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M550.95,-78.81C562.95,-67.68 576.97,-54.68 588.55,-43.94"/>
-<polygon fill="black" stroke="black" points="590.79,-46.63 595.75,-37.26 586.03,-41.5 590.79,-46.63"/>
+<path fill="none" stroke="black" d="M387.39,-78.81C399.39,-67.68 413.41,-54.68 424.99,-43.94"/>
+<polygon fill="black" stroke="black" points="427.24,-46.63 432.19,-37.26 422.48,-41.5 427.24,-46.63"/>
</g>
<!-- STRUCT_S1 -->
-<g id="node15" class="node">
+<g id="node14" class="node">
<title>STRUCT_S1</title>
-<polygon fill="none" stroke="none" points="644.94,-234.25 559.19,-234.25 559.19,-198.25 644.94,-198.25 644.94,-234.25"/>
-<polygon fill="lightgreen" stroke="none" points="567.19,-205 567.19,-227.5 597.94,-227.5 597.94,-205 567.19,-205"/>
-<polygon fill="none" stroke="black" points="567.19,-205 567.19,-227.5 597.94,-227.5 597.94,-205 567.19,-205"/>
-<text text-anchor="start" x="570.19" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<polygon fill="none" stroke="none" points="487.38,-234.25 401.63,-234.25 401.63,-198.25 487.38,-198.25 487.38,-234.25"/>
+<polygon fill="lightgreen" stroke="none" points="409.63,-205 409.63,-227.5 440.38,-227.5 440.38,-205 409.63,-205"/>
+<polygon fill="none" stroke="black" points="409.63,-205 409.63,-227.5 440.38,-227.5 440.38,-205 409.63,-205"/>
+<text text-anchor="start" x="412.63" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">field</text>
<defs>
-<linearGradient id="l_0" gradientUnits="userSpaceOnUse" x1="603.65" y1="-224.2" x2="631.23" y2="-208.29" >
+<linearGradient id="l_0" gradientUnits="userSpaceOnUse" x1="446.1" y1="-224.2" x2="473.67" y2="-208.29" >
<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
</linearGradient>
</defs>
-<polygon fill="url(#l_0)" stroke="none" points="597.94,-205 597.94,-227.5 636.94,-227.5 636.94,-205 597.94,-205"/>
-<polygon fill="none" stroke="black" points="597.94,-205 597.94,-227.5 636.94,-227.5 636.94,-205 597.94,-205"/>
-<text text-anchor="start" x="600.94" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int:ptr</text>
+<polygon fill="url(#l_0)" stroke="none" points="440.38,-205 440.38,-227.5 479.38,-227.5 479.38,-205 440.38,-205"/>
+<polygon fill="none" stroke="black" points="440.38,-205 440.38,-227.5 479.38,-227.5 479.38,-205 440.38,-205"/>
+<text text-anchor="start" x="443.38" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
</g>
<!-- STRUCT_TOP&#45;&gt;STRUCT_S1 -->
-<g id="edge24" class="edge">
+<g id="edge18" class="edge">
<title>STRUCT_TOP&#45;&gt;STRUCT_S1</title>
-<path fill="none" stroke="black" d="M685.61,-310.59C669.58,-292.68 643.53,-263.57 624.77,-242.62"/>
-<polygon fill="black" stroke="black" points="627.52,-240.44 618.24,-235.32 622.3,-245.11 627.52,-240.44"/>
+<path fill="none" stroke="black" d="M503.88,-310.12C492.57,-292.43 474.53,-264.21 461.3,-243.51"/>
+<polygon fill="black" stroke="black" points="464.39,-241.85 456.06,-235.31 458.49,-245.62 464.39,-241.85"/>
</g>
<!-- STRUCT_S2 -->
-<g id="node16" class="node">
+<g id="node15" class="node">
<title>STRUCT_S2</title>
-<polygon fill="none" stroke="none" points="773.94,-242.75 688.19,-242.75 688.19,-189.75 773.94,-189.75 773.94,-242.75"/>
-<polygon fill="lightgreen" stroke="none" points="696.19,-216.25 696.19,-238.75 726.94,-238.75 726.94,-216.25 696.19,-216.25"/>
-<polygon fill="none" stroke="black" points="696.19,-216.25 696.19,-238.75 726.94,-238.75 726.94,-216.25 696.19,-216.25"/>
-<text text-anchor="start" x="699.19" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<polygon fill="none" stroke="none" points="616.38,-242.75 530.63,-242.75 530.63,-189.75 616.38,-189.75 616.38,-242.75"/>
+<polygon fill="lightgreen" stroke="none" points="538.63,-216.25 538.63,-238.75 569.38,-238.75 569.38,-216.25 538.63,-216.25"/>
+<polygon fill="none" stroke="black" points="538.63,-216.25 538.63,-238.75 569.38,-238.75 569.38,-216.25 538.63,-216.25"/>
+<text text-anchor="start" x="541.63" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">field</text>
<defs>
-<linearGradient id="l_1" gradientUnits="userSpaceOnUse" x1="732.65" y1="-235.45" x2="760.23" y2="-219.54" >
+<linearGradient id="l_1" gradientUnits="userSpaceOnUse" x1="575.1" y1="-235.45" x2="602.67" y2="-219.54" >
<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
</linearGradient>
</defs>
-<polygon fill="url(#l_1)" stroke="none" points="726.94,-216.25 726.94,-238.75 765.94,-238.75 765.94,-216.25 726.94,-216.25"/>
-<polygon fill="none" stroke="black" points="726.94,-216.25 726.94,-238.75 765.94,-238.75 765.94,-216.25 726.94,-216.25"/>
-<text text-anchor="start" x="729.94" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">int:ptr</text>
-<polygon fill="lightgreen" stroke="none" points="696.19,-193.75 696.19,-216.25 726.94,-216.25 726.94,-193.75 696.19,-193.75"/>
-<polygon fill="none" stroke="black" points="696.19,-193.75 696.19,-216.25 726.94,-216.25 726.94,-193.75 696.19,-193.75"/>
-<text text-anchor="start" x="699.19" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<polygon fill="url(#l_1)" stroke="none" points="569.38,-216.25 569.38,-238.75 608.38,-238.75 608.38,-216.25 569.38,-216.25"/>
+<polygon fill="none" stroke="black" points="569.38,-216.25 569.38,-238.75 608.38,-238.75 608.38,-216.25 569.38,-216.25"/>
+<text text-anchor="start" x="572.38" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="538.63,-193.75 538.63,-216.25 569.38,-216.25 569.38,-193.75 538.63,-193.75"/>
+<polygon fill="none" stroke="black" points="538.63,-193.75 538.63,-216.25 569.38,-216.25 569.38,-193.75 538.63,-193.75"/>
+<text text-anchor="start" x="541.63" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">field</text>
<defs>
-<linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="732.65" y1="-212.95" x2="760.23" y2="-197.04" >
+<linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="575.1" y1="-212.95" x2="602.67" y2="-197.04" >
<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
</linearGradient>
</defs>
-<polygon fill="url(#l_2)" stroke="none" points="726.94,-193.75 726.94,-216.25 765.94,-216.25 765.94,-193.75 726.94,-193.75"/>
-<polygon fill="none" stroke="black" points="726.94,-193.75 726.94,-216.25 765.94,-216.25 765.94,-193.75 726.94,-193.75"/>
-<text text-anchor="start" x="729.94" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">int:ptr</text>
+<polygon fill="url(#l_2)" stroke="none" points="569.38,-193.75 569.38,-216.25 608.38,-216.25 608.38,-193.75 569.38,-193.75"/>
+<polygon fill="none" stroke="black" points="569.38,-193.75 569.38,-216.25 608.38,-216.25 608.38,-193.75 569.38,-193.75"/>
+<text text-anchor="start" x="572.38" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
</g>
<!-- STRUCT_TOP&#45;&gt;STRUCT_S2 -->
-<g id="edge25" class="edge">
+<g id="edge19" class="edge">
<title>STRUCT_TOP&#45;&gt;STRUCT_S2</title>
-<path fill="none" stroke="black" d="M704.91,-309.64C709.16,-294.62 715.49,-272.29 720.85,-253.34"/>
-<polygon fill="black" stroke="black" points="724.19,-254.4 723.54,-243.83 717.45,-252.49 724.19,-254.4"/>
+<path fill="none" stroke="black" d="M523.73,-309.64C531.97,-294.34 544.3,-271.45 554.63,-252.28"/>
+<polygon fill="black" stroke="black" points="557.59,-254.17 559.26,-243.7 551.43,-250.85 557.59,-254.17"/>
</g>
<!-- STRUCT_SN -->
-<g id="node17" class="node">
+<g id="node16" class="node">
<title>STRUCT_SN</title>
-<polygon fill="none" stroke="none" points="902.94,-254 817.19,-254 817.19,-178.5 902.94,-178.5 902.94,-254"/>
-<polygon fill="lightgreen" stroke="none" points="825.19,-227.5 825.19,-250 855.94,-250 855.94,-227.5 825.19,-227.5"/>
-<polygon fill="none" stroke="black" points="825.19,-227.5 825.19,-250 855.94,-250 855.94,-227.5 825.19,-227.5"/>
-<text text-anchor="start" x="828.19" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<polygon fill="none" stroke="none" points="745.38,-254 659.63,-254 659.63,-178.5 745.38,-178.5 745.38,-254"/>
+<polygon fill="lightgreen" stroke="none" points="667.63,-227.5 667.63,-250 698.38,-250 698.38,-227.5 667.63,-227.5"/>
+<polygon fill="none" stroke="black" points="667.63,-227.5 667.63,-250 698.38,-250 698.38,-227.5 667.63,-227.5"/>
+<text text-anchor="start" x="670.63" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
<defs>
-<linearGradient id="l_3" gradientUnits="userSpaceOnUse" x1="861.65" y1="-246.7" x2="889.23" y2="-230.79" >
+<linearGradient id="l_3" gradientUnits="userSpaceOnUse" x1="704.1" y1="-246.7" x2="731.67" y2="-230.79" >
<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
</linearGradient>
</defs>
-<polygon fill="url(#l_3)" stroke="none" points="855.94,-227.5 855.94,-250 894.94,-250 894.94,-227.5 855.94,-227.5"/>
-<polygon fill="none" stroke="black" points="855.94,-227.5 855.94,-250 894.94,-250 894.94,-227.5 855.94,-227.5"/>
-<text text-anchor="start" x="858.94" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">int:ptr</text>
-<polygon fill="lightgreen" stroke="none" points="825.19,-205 825.19,-227.5 855.94,-227.5 855.94,-205 825.19,-205"/>
-<polygon fill="none" stroke="black" points="825.19,-205 825.19,-227.5 855.94,-227.5 855.94,-205 825.19,-205"/>
-<text text-anchor="start" x="831.19" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">... &#160;</text>
+<polygon fill="url(#l_3)" stroke="none" points="698.38,-227.5 698.38,-250 737.38,-250 737.38,-227.5 698.38,-227.5"/>
+<polygon fill="none" stroke="black" points="698.38,-227.5 698.38,-250 737.38,-250 737.38,-227.5 698.38,-227.5"/>
+<text text-anchor="start" x="701.38" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="667.63,-205 667.63,-227.5 698.38,-227.5 698.38,-205 667.63,-205"/>
+<polygon fill="none" stroke="black" points="667.63,-205 667.63,-227.5 698.38,-227.5 698.38,-205 667.63,-205"/>
+<text text-anchor="start" x="673.63" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">... &#160;</text>
<defs>
-<linearGradient id="l_4" gradientUnits="userSpaceOnUse" x1="861.65" y1="-224.2" x2="889.23" y2="-208.29" >
+<linearGradient id="l_4" gradientUnits="userSpaceOnUse" x1="704.1" y1="-224.2" x2="731.67" y2="-208.29" >
<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
</linearGradient>
</defs>
-<polygon fill="url(#l_4)" stroke="none" points="855.94,-205 855.94,-227.5 894.94,-227.5 894.94,-205 855.94,-205"/>
-<polygon fill="none" stroke="black" points="855.94,-205 855.94,-227.5 894.94,-227.5 894.94,-205 855.94,-205"/>
-<text text-anchor="start" x="858.94" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int:ptr</text>
-<polygon fill="lightgreen" stroke="none" points="825.19,-182.5 825.19,-205 855.94,-205 855.94,-182.5 825.19,-182.5"/>
-<polygon fill="none" stroke="black" points="825.19,-182.5 825.19,-205 855.94,-205 855.94,-182.5 825.19,-182.5"/>
-<text text-anchor="start" x="828.19" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<polygon fill="url(#l_4)" stroke="none" points="698.38,-205 698.38,-227.5 737.38,-227.5 737.38,-205 698.38,-205"/>
+<polygon fill="none" stroke="black" points="698.38,-205 698.38,-227.5 737.38,-227.5 737.38,-205 698.38,-205"/>
+<text text-anchor="start" x="701.38" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="667.63,-182.5 667.63,-205 698.38,-205 698.38,-182.5 667.63,-182.5"/>
+<polygon fill="none" stroke="black" points="667.63,-182.5 667.63,-205 698.38,-205 698.38,-182.5 667.63,-182.5"/>
+<text text-anchor="start" x="670.63" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
<defs>
-<linearGradient id="l_5" gradientUnits="userSpaceOnUse" x1="861.65" y1="-201.7" x2="889.23" y2="-185.79" >
+<linearGradient id="l_5" gradientUnits="userSpaceOnUse" x1="704.1" y1="-201.7" x2="731.67" y2="-185.79" >
<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
</linearGradient>
</defs>
-<polygon fill="url(#l_5)" stroke="none" points="855.94,-182.5 855.94,-205 894.94,-205 894.94,-182.5 855.94,-182.5"/>
-<polygon fill="none" stroke="black" points="855.94,-182.5 855.94,-205 894.94,-205 894.94,-182.5 855.94,-182.5"/>
-<text text-anchor="start" x="858.94" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">int:ptr</text>
+<polygon fill="url(#l_5)" stroke="none" points="698.38,-182.5 698.38,-205 737.38,-205 737.38,-182.5 698.38,-182.5"/>
+<polygon fill="none" stroke="black" points="698.38,-182.5 698.38,-205 737.38,-205 737.38,-182.5 698.38,-182.5"/>
+<text text-anchor="start" x="701.38" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
</g>
<!-- STRUCT_TOP&#45;&gt;STRUCT_SN -->
-<g id="edge26" class="edge">
+<g id="edge20" class="edge">
<title>STRUCT_TOP&#45;&gt;STRUCT_SN</title>
-<path fill="none" stroke="black" d="M721.98,-311.75C744.07,-296.64 778.97,-272.75 808.16,-252.77"/>
-<polygon fill="black" stroke="black" points="809.89,-255.83 816.16,-247.3 805.93,-250.05 809.89,-255.83"/>
+<path fill="none" stroke="black" d="M539.09,-312.43C567.11,-296.11 613.72,-268.96 650.01,-247.82"/>
+<polygon fill="black" stroke="black" points="651.76,-250.85 658.64,-242.8 648.24,-244.81 651.76,-250.85"/>
</g>
-<!-- STRUCT_S1&#45;&gt;STRUCT_S2 -->
<!-- STRUCT_BOT -->
-<g id="node18" class="node">
+<g id="node13" class="node">
<title>STRUCT_BOT</title>
-<ellipse fill="lightgreen" stroke="black" cx="700.07" cy="-104.75" rx="44.7" ry="18"/>
-<text text-anchor="start" x="675.32" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="691.07" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+<ellipse fill="lightgreen" stroke="black" cx="512.51" cy="-104.75" rx="44.7" ry="18"/>
+<text text-anchor="start" x="487.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="503.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+</g>
+<!-- STRUCT_BOT&#45;&gt;BOT -->
+<g id="edge24" class="edge">
+<title>STRUCT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M499.56,-87.23C490.56,-75.76 478.41,-60.26 468.22,-47.27"/>
+<polygon fill="black" stroke="black" points="471.08,-45.24 462.16,-39.53 465.57,-49.56 471.08,-45.24"/>
</g>
<!-- STRUCT_S1&#45;&gt;STRUCT_BOT -->
-<g id="edge27" class="edge">
+<g id="edge21" class="edge">
<title>STRUCT_S1&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M616.95,-198.62C633.16,-180.5 659.26,-151.34 677.89,-130.53"/>
-<polygon fill="black" stroke="black" points="680.29,-133.09 684.36,-123.3 675.08,-128.42 680.29,-133.09"/>
+<path fill="none" stroke="black" d="M454.84,-198.62C465.77,-181.01 483.19,-152.96 496.02,-132.29"/>
+<polygon fill="black" stroke="black" points="498.98,-134.16 501.29,-123.82 493.04,-130.47 498.98,-134.16"/>
</g>
-<!-- STRUCT_S2&#45;&gt;STRUCT_SN -->
+<!-- STRUCT_S1&#45;&gt;STRUCT_S2 -->
<!-- STRUCT_S2&#45;&gt;STRUCT_BOT -->
-<g id="edge28" class="edge">
+<g id="edge22" class="edge">
<title>STRUCT_S2&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M723.88,-189.85C719.09,-172.96 712.81,-150.77 707.9,-133.42"/>
-<polygon fill="black" stroke="black" points="711.41,-132.95 705.32,-124.28 704.67,-134.86 711.41,-132.95"/>
+<path fill="none" stroke="black" d="M559.36,-189.85C549.77,-172.63 537.12,-149.92 527.38,-132.44"/>
+<polygon fill="black" stroke="black" points="530.68,-131.18 522.76,-124.15 524.57,-134.59 530.68,-131.18"/>
</g>
+<!-- STRUCT_S2&#45;&gt;STRUCT_SN -->
<!-- STRUCT_SN&#45;&gt;STRUCT_BOT -->
-<g id="edge29" class="edge">
+<g id="edge23" class="edge">
<title>STRUCT_SN&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M817.61,-186.19C790.48,-167.62 755.89,-143.95 731.27,-127.11"/>
-<polygon fill="black" stroke="black" points="733.52,-124.4 723.29,-121.64 729.56,-130.18 733.52,-124.4"/>
-</g>
-<!-- STRUCT_BOT&#45;&gt;BOT -->
-<g id="edge30" class="edge">
-<title>STRUCT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M683.1,-88.01C669.57,-75.46 650.48,-57.75 635.5,-43.85"/>
-<polygon fill="black" stroke="black" points="638.04,-41.44 628.33,-37.21 633.28,-46.57 638.04,-41.44"/>
+<path fill="none" stroke="black" d="M659.87,-190.67C625.81,-171.04 578.69,-143.89 546.98,-125.62"/>
+<polygon fill="black" stroke="black" points="548.99,-122.73 538.58,-120.77 545.49,-128.8 548.99,-122.73"/>
</g>
<!-- MEM_ALIAS1 -->
-<g id="node20" class="node">
+<g id="node19" class="node">
<title>MEM_ALIAS1</title>
-<ellipse fill="blue" stroke="black" cx="966.07" cy="-216.25" rx="20.13" ry="20.13"/>
-<text text-anchor="middle" x="966.07" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">#1</text>
+<ellipse fill="blue" stroke="black" cx="808.51" cy="-216.25" rx="20.13" ry="20.13"/>
+<text text-anchor="middle" x="808.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">#1</text>
</g>
<!-- MEM_TOP&#45;&gt;MEM_ALIAS1 -->
-<g id="edge34" class="edge">
+<g id="edge28" class="edge">
<title>MEM_TOP&#45;&gt;MEM_ALIAS1</title>
-<path fill="none" stroke="black" d="M1004.04,-309.64C997.03,-292.59 986.14,-266.09 977.82,-245.84"/>
-<polygon fill="black" stroke="black" points="981.11,-244.65 974.07,-236.73 974.64,-247.31 981.11,-244.65"/>
+<path fill="none" stroke="black" d="M846.48,-309.64C839.47,-292.59 828.58,-266.09 820.26,-245.84"/>
+<polygon fill="black" stroke="black" points="823.55,-244.65 816.52,-236.73 817.08,-247.31 823.55,-244.65"/>
</g>
<!-- MEM_ALIASDOTS -->
-<g id="node21" class="node">
+<g id="node20" class="node">
<title>MEM_ALIASDOTS</title>
-<ellipse fill="blue" stroke="black" cx="1056.07" cy="-216.25" rx="27" ry="18"/>
-<text text-anchor="middle" x="1056.07" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+<ellipse fill="blue" stroke="black" cx="898.51" cy="-216.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="898.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
</g>
<!-- MEM_TOP&#45;&gt;MEM_ALIASDOTS -->
-<g id="edge35" class="edge">
+<g id="edge29" class="edge">
<title>MEM_TOP&#45;&gt;MEM_ALIASDOTS</title>
-<path fill="none" stroke="black" d="M1018.1,-309.64C1025.27,-292.18 1036.52,-264.82 1044.91,-244.4"/>
-<polygon fill="black" stroke="black" points="1048.09,-245.86 1048.66,-235.28 1041.62,-243.2 1048.09,-245.86"/>
+<path fill="none" stroke="black" d="M860.54,-309.64C867.71,-292.18 878.96,-264.82 887.35,-244.4"/>
+<polygon fill="black" stroke="black" points="890.54,-245.86 891.1,-235.28 884.06,-243.2 890.54,-245.86"/>
</g>
<!-- MEM_ALIASN -->
-<g id="node22" class="node">
+<g id="node21" class="node">
<title>MEM_ALIASN</title>
-<ellipse fill="blue" stroke="black" cx="1146.07" cy="-216.25" rx="20.13" ry="20.13"/>
-<text text-anchor="middle" x="1146.07" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">#n</text>
+<ellipse fill="blue" stroke="black" cx="988.51" cy="-216.25" rx="20.13" ry="20.13"/>
+<text text-anchor="middle" x="988.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">#n</text>
</g>
<!-- MEM_TOP&#45;&gt;MEM_ALIASN -->
-<g id="edge36" class="edge">
+<g id="edge30" class="edge">
<title>MEM_TOP&#45;&gt;MEM_ALIASN</title>
-<path fill="none" stroke="black" d="M1030.12,-311.29C1054.2,-291.76 1095.67,-258.13 1121.94,-236.82"/>
-<polygon fill="black" stroke="black" points="1124.13,-239.55 1129.69,-230.53 1119.72,-234.11 1124.13,-239.55"/>
+<path fill="none" stroke="black" d="M872.56,-311.29C896.65,-291.76 938.11,-258.13 964.38,-236.82"/>
+<polygon fill="black" stroke="black" points="966.57,-239.55 972.13,-230.53 962.16,-234.11 966.57,-239.55"/>
</g>
-<!-- MEM_ALIAS1&#45;&gt;MEM_ALIASDOTS -->
<!-- MEM_BOT -->
-<g id="node23" class="node">
+<g id="node18" class="node">
<title>MEM_BOT</title>
-<ellipse fill="blue" stroke="black" cx="1011.07" cy="-104.75" rx="43.67" ry="18"/>
-<text text-anchor="start" x="987.07" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
-<text text-anchor="start" x="1002.82" y="-100.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+<ellipse fill="blue" stroke="black" cx="853.51" cy="-104.75" rx="43.67" ry="18"/>
+<text text-anchor="start" x="829.51" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
+<text text-anchor="start" x="845.26" y="-100.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+</g>
+<!-- MEM_BOT&#45;&gt;BOT -->
+<g id="edge34" class="edge">
+<title>MEM_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M815.04,-96C735.55,-79.97 554.45,-43.48 480.68,-28.61"/>
+<polygon fill="black" stroke="black" points="481.37,-25.18 470.88,-26.63 479.99,-32.04 481.37,-25.18"/>
</g>
<!-- MEM_ALIAS1&#45;&gt;MEM_BOT -->
-<g id="edge37" class="edge">
+<g id="edge31" class="edge">
<title>MEM_ALIAS1&#45;&gt;MEM_BOT</title>
-<path fill="none" stroke="black" d="M973.5,-197.17C980.63,-179.82 991.49,-153.39 999.7,-133.4"/>
-<polygon fill="black" stroke="black" points="1002.93,-134.75 1003.5,-124.17 996.46,-132.09 1002.93,-134.75"/>
+<path fill="none" stroke="black" d="M815.94,-197.17C823.07,-179.82 833.93,-153.39 842.15,-133.4"/>
+<polygon fill="black" stroke="black" points="845.37,-134.75 845.94,-124.17 838.9,-132.09 845.37,-134.75"/>
</g>
-<!-- MEM_ALIASDOTS&#45;&gt;MEM_ALIASN -->
+<!-- MEM_ALIAS1&#45;&gt;MEM_ALIASDOTS -->
<!-- MEM_ALIASDOTS&#45;&gt;MEM_BOT -->
-<g id="edge38" class="edge">
+<g id="edge32" class="edge">
<title>MEM_ALIASDOTS&#45;&gt;MEM_BOT</title>
-<path fill="none" stroke="black" d="M1049.23,-198.62C1042.14,-181.35 1030.92,-154.05 1022.48,-133.51"/>
-<polygon fill="black" stroke="black" points="1025.73,-132.22 1018.69,-124.3 1019.25,-134.88 1025.73,-132.22"/>
+<path fill="none" stroke="black" d="M891.67,-198.62C884.58,-181.35 873.36,-154.05 864.92,-133.51"/>
+<polygon fill="black" stroke="black" points="868.17,-132.22 861.13,-124.3 861.7,-134.88 868.17,-132.22"/>
</g>
+<!-- MEM_ALIASDOTS&#45;&gt;MEM_ALIASN -->
<!-- MEM_ALIASN&#45;&gt;MEM_BOT -->
-<g id="edge39" class="edge">
+<g id="edge33" class="edge">
<title>MEM_ALIASN&#45;&gt;MEM_BOT</title>
-<path fill="none" stroke="black" d="M1130.58,-202.69C1108.31,-184.62 1066.85,-151 1039.11,-128.49"/>
-<polygon fill="black" stroke="black" points="1041.42,-125.86 1031.45,-122.28 1037.01,-131.3 1041.42,-125.86"/>
-</g>
-<!-- MEM_BOT&#45;&gt;BOT -->
-<g id="edge40" class="edge">
-<title>MEM_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M972.45,-95.85C893.9,-79.78 716.82,-43.55 644.13,-28.68"/>
-<polygon fill="black" stroke="black" points="644.98,-25.28 634.48,-26.71 643.58,-32.14 644.98,-25.28"/>
+<path fill="none" stroke="black" d="M973.02,-202.69C950.75,-184.62 909.29,-151 881.55,-128.49"/>
+<polygon fill="black" stroke="black" points="883.86,-125.86 873.89,-122.28 879.45,-131.3 883.86,-125.86"/>
</g>
<!-- TUPLE1 -->
-<g id="node25" class="node">
+<g id="node24" class="node">
<title>TUPLE1</title>
-<polygon fill="none" stroke="none" points="1263.07,-242.75 1209.07,-242.75 1209.07,-189.75 1263.07,-189.75 1263.07,-242.75"/>
-<polygon fill="pink" stroke="none" points="1217.32,-216.25 1217.32,-238.75 1254.82,-238.75 1254.82,-216.25 1217.32,-216.25"/>
-<polygon fill="none" stroke="black" points="1217.32,-216.25 1217.32,-238.75 1254.82,-238.75 1254.82,-216.25 1217.32,-216.25"/>
-<text text-anchor="start" x="1220.32" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="1217.32,-193.75 1217.32,-216.25 1254.82,-216.25 1254.82,-193.75 1217.32,-193.75"/>
-<polygon fill="none" stroke="black" points="1217.32,-193.75 1217.32,-216.25 1254.82,-216.25 1254.82,-193.75 1217.32,-193.75"/>
-<text text-anchor="start" x="1224.44" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="none" stroke="none" points="1105.51,-242.75 1051.51,-242.75 1051.51,-189.75 1105.51,-189.75 1105.51,-242.75"/>
+<polygon fill="pink" stroke="none" points="1059.76,-216.25 1059.76,-238.75 1097.26,-238.75 1097.26,-216.25 1059.76,-216.25"/>
+<polygon fill="none" stroke="black" points="1059.76,-216.25 1059.76,-238.75 1097.26,-238.75 1097.26,-216.25 1059.76,-216.25"/>
+<text text-anchor="start" x="1062.76" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1059.76,-193.75 1059.76,-216.25 1097.26,-216.25 1097.26,-193.75 1059.76,-193.75"/>
+<polygon fill="none" stroke="black" points="1059.76,-193.75 1059.76,-216.25 1097.26,-216.25 1097.26,-193.75 1059.76,-193.75"/>
+<text text-anchor="start" x="1066.88" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLE1 -->
-<g id="edge44" class="edge">
+<g id="edge38" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLE1</title>
-<path fill="none" stroke="black" d="M1276.57,-309.64C1269.92,-294.48 1260.01,-271.87 1251.66,-252.81"/>
-<polygon fill="black" stroke="black" points="1254.91,-251.51 1247.69,-243.76 1248.5,-254.32 1254.91,-251.51"/>
+<path fill="none" stroke="black" d="M1119.01,-309.64C1112.37,-294.48 1102.45,-271.87 1094.1,-252.81"/>
+<polygon fill="black" stroke="black" points="1097.35,-251.51 1090.13,-243.76 1090.94,-254.32 1097.35,-251.51"/>
</g>
<!-- TUPLE2 -->
-<g id="node26" class="node">
+<g id="node25" class="node">
<title>TUPLE2</title>
-<polygon fill="none" stroke="none" points="1360.07,-254 1306.07,-254 1306.07,-178.5 1360.07,-178.5 1360.07,-254"/>
-<polygon fill="pink" stroke="none" points="1314.32,-227.5 1314.32,-250 1351.82,-250 1351.82,-227.5 1314.32,-227.5"/>
-<polygon fill="none" stroke="black" points="1314.32,-227.5 1314.32,-250 1351.82,-250 1351.82,-227.5 1314.32,-227.5"/>
-<text text-anchor="start" x="1317.32" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="1314.32,-205 1314.32,-227.5 1351.82,-227.5 1351.82,-205 1314.32,-205"/>
-<polygon fill="none" stroke="black" points="1314.32,-205 1314.32,-227.5 1351.82,-227.5 1351.82,-205 1314.32,-205"/>
-<text text-anchor="start" x="1321.44" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
-<polygon fill="black" stroke="none" points="1314.32,-182.5 1314.32,-205 1351.82,-205 1351.82,-182.5 1314.32,-182.5"/>
-<polygon fill="none" stroke="black" points="1314.32,-182.5 1314.32,-205 1351.82,-205 1351.82,-182.5 1314.32,-182.5"/>
-<text text-anchor="start" x="1321.44" y="-188.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="none" stroke="none" points="1202.51,-254 1148.51,-254 1148.51,-178.5 1202.51,-178.5 1202.51,-254"/>
+<polygon fill="pink" stroke="none" points="1156.76,-227.5 1156.76,-250 1194.26,-250 1194.26,-227.5 1156.76,-227.5"/>
+<polygon fill="none" stroke="black" points="1156.76,-227.5 1156.76,-250 1194.26,-250 1194.26,-227.5 1156.76,-227.5"/>
+<text text-anchor="start" x="1159.76" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1156.76,-205 1156.76,-227.5 1194.26,-227.5 1194.26,-205 1156.76,-205"/>
+<polygon fill="none" stroke="black" points="1156.76,-205 1156.76,-227.5 1194.26,-227.5 1194.26,-205 1156.76,-205"/>
+<text text-anchor="start" x="1163.88" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="1156.76,-182.5 1156.76,-205 1194.26,-205 1194.26,-182.5 1156.76,-182.5"/>
+<polygon fill="none" stroke="black" points="1156.76,-182.5 1156.76,-205 1194.26,-205 1194.26,-182.5 1156.76,-182.5"/>
+<text text-anchor="start" x="1163.88" y="-188.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLE2 -->
-<g id="edge45" class="edge">
+<g id="edge39" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLE2</title>
-<path fill="none" stroke="black" d="M1291.72,-309.64C1297.2,-297.4 1304.85,-280.3 1312.09,-264.14"/>
-<polygon fill="black" stroke="black" points="1315.24,-265.65 1316.13,-255.09 1308.85,-262.79 1315.24,-265.65"/>
+<path fill="none" stroke="black" d="M1134.17,-309.64C1139.64,-297.4 1147.29,-280.3 1154.53,-264.14"/>
+<polygon fill="black" stroke="black" points="1157.68,-265.65 1158.57,-255.09 1151.3,-262.79 1157.68,-265.65"/>
</g>
<!-- TUPLEN -->
-<g id="node27" class="node">
+<g id="node26" class="node">
<title>TUPLEN</title>
-<polygon fill="none" stroke="none" points="1457.07,-265.25 1403.07,-265.25 1403.07,-167.25 1457.07,-167.25 1457.07,-265.25"/>
-<polygon fill="pink" stroke="none" points="1411.32,-238.75 1411.32,-261.25 1448.82,-261.25 1448.82,-238.75 1411.32,-238.75"/>
-<polygon fill="none" stroke="black" points="1411.32,-238.75 1411.32,-261.25 1448.82,-261.25 1448.82,-238.75 1411.32,-238.75"/>
-<text text-anchor="start" x="1414.32" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="1411.32,-216.25 1411.32,-238.75 1448.82,-238.75 1448.82,-216.25 1411.32,-216.25"/>
-<polygon fill="none" stroke="black" points="1411.32,-216.25 1411.32,-238.75 1448.82,-238.75 1448.82,-216.25 1411.32,-216.25"/>
-<text text-anchor="start" x="1418.44" y="-222.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
-<polygon fill="black" stroke="none" points="1411.32,-193.75 1411.32,-216.25 1448.82,-216.25 1448.82,-193.75 1411.32,-193.75"/>
-<polygon fill="none" stroke="black" points="1411.32,-193.75 1411.32,-216.25 1448.82,-216.25 1448.82,-193.75 1411.32,-193.75"/>
-<text text-anchor="start" x="1424.44" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
-<polygon fill="black" stroke="none" points="1411.32,-171.25 1411.32,-193.75 1448.82,-193.75 1448.82,-171.25 1411.32,-171.25"/>
-<polygon fill="none" stroke="black" points="1411.32,-171.25 1411.32,-193.75 1448.82,-193.75 1448.82,-171.25 1411.32,-171.25"/>
-<text text-anchor="start" x="1418.44" y="-177.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="none" stroke="none" points="1299.51,-265.25 1245.51,-265.25 1245.51,-167.25 1299.51,-167.25 1299.51,-265.25"/>
+<polygon fill="pink" stroke="none" points="1253.76,-238.75 1253.76,-261.25 1291.26,-261.25 1291.26,-238.75 1253.76,-238.75"/>
+<polygon fill="none" stroke="black" points="1253.76,-238.75 1253.76,-261.25 1291.26,-261.25 1291.26,-238.75 1253.76,-238.75"/>
+<text text-anchor="start" x="1256.76" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1253.76,-216.25 1253.76,-238.75 1291.26,-238.75 1291.26,-216.25 1253.76,-216.25"/>
+<polygon fill="none" stroke="black" points="1253.76,-216.25 1253.76,-238.75 1291.26,-238.75 1291.26,-216.25 1253.76,-216.25"/>
+<text text-anchor="start" x="1260.88" y="-222.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="1253.76,-193.75 1253.76,-216.25 1291.26,-216.25 1291.26,-193.75 1253.76,-193.75"/>
+<polygon fill="none" stroke="black" points="1253.76,-193.75 1253.76,-216.25 1291.26,-216.25 1291.26,-193.75 1253.76,-193.75"/>
+<text text-anchor="start" x="1266.88" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+<polygon fill="black" stroke="none" points="1253.76,-171.25 1253.76,-193.75 1291.26,-193.75 1291.26,-171.25 1253.76,-171.25"/>
+<polygon fill="none" stroke="black" points="1253.76,-171.25 1253.76,-193.75 1291.26,-193.75 1291.26,-171.25 1253.76,-171.25"/>
+<text text-anchor="start" x="1260.88" y="-177.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLEN -->
-<g id="edge46" class="edge">
+<g id="edge40" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLEN</title>
-<path fill="none" stroke="black" d="M1304.37,-311.52C1327.53,-294.15 1365.84,-265.42 1394.09,-244.23"/>
-<polygon fill="black" stroke="black" points="1396.14,-247.07 1402.04,-238.27 1391.94,-241.47 1396.14,-247.07"/>
+<path fill="none" stroke="black" d="M1146.81,-311.52C1169.97,-294.15 1208.28,-265.42 1236.53,-244.23"/>
+<polygon fill="black" stroke="black" points="1238.58,-247.07 1244.48,-238.27 1234.38,-241.47 1238.58,-247.07"/>
</g>
<!-- TUPLE_BOT -->
-<g id="node28" class="node">
+<g id="node23" class="node">
<title>TUPLE_BOT</title>
-<ellipse fill="pink" stroke="black" cx="1284.07" cy="-104.75" rx="42.65" ry="18"/>
-<text text-anchor="start" x="1260.82" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="1276.57" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+<ellipse fill="pink" stroke="black" cx="1126.51" cy="-104.75" rx="42.65" ry="18"/>
+<text text-anchor="start" x="1103.26" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="1119.01" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+</g>
+<!-- TUPLE_BOT&#45;&gt;BOT -->
+<g id="edge44" class="edge">
+<title>TUPLE_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M1085.88,-98.86C962.25,-83.97 592.31,-39.44 480.72,-26"/>
+<polygon fill="black" stroke="black" points="481.43,-22.56 471.08,-24.84 480.59,-29.51 481.43,-22.56"/>
</g>
<!-- TUPLE1&#45;&gt;TUPLE_BOT -->
-<g id="edge47" class="edge">
+<g id="edge41" class="edge">
<title>TUPLE1&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M1247.2,-189.85C1254.68,-172.8 1264.52,-150.34 1272.15,-132.93"/>
-<polygon fill="black" stroke="black" points="1275.16,-134.78 1275.97,-124.21 1268.75,-131.97 1275.16,-134.78"/>
+<path fill="none" stroke="black" d="M1089.64,-189.85C1097.12,-172.8 1106.96,-150.34 1114.59,-132.93"/>
+<polygon fill="black" stroke="black" points="1117.61,-134.78 1118.41,-124.21 1111.19,-131.97 1117.61,-134.78"/>
</g>
<!-- TUPLE2&#45;&gt;TUPLE_BOT -->
-<g id="edge48" class="edge">
+<g id="edge42" class="edge">
<title>TUPLE2&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M1316.75,-178.79C1310.07,-163.86 1302.48,-146.89 1296.29,-133.07"/>
-<polygon fill="black" stroke="black" points="1299.57,-131.83 1292.3,-124.13 1293.19,-134.69 1299.57,-131.83"/>
+<path fill="none" stroke="black" d="M1159.19,-178.79C1152.51,-163.86 1144.92,-146.89 1138.73,-133.07"/>
+<polygon fill="black" stroke="black" points="1142.02,-131.83 1134.74,-124.13 1135.63,-134.69 1142.02,-131.83"/>
</g>
<!-- TUPLEN&#45;&gt;TUPLE_BOT -->
-<g id="edge49" class="edge">
+<g id="edge43" class="edge">
<title>TUPLEN&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M1403.29,-195.16C1377.77,-176.03 1339.46,-147.29 1313.2,-127.59"/>
-<polygon fill="black" stroke="black" points="1315.42,-124.89 1305.32,-121.69 1311.22,-130.49 1315.42,-124.89"/>
-</g>
-<!-- TUPLE_BOT&#45;&gt;BOT -->
-<g id="edge50" class="edge">
-<title>TUPLE_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M1243.29,-98.8C1120.5,-83.88 755.84,-39.59 644.63,-26.08"/>
-<polygon fill="black" stroke="black" points="645.07,-22.61 634.72,-24.88 644.23,-29.56 645.07,-22.61"/>
+<path fill="none" stroke="black" d="M1245.73,-195.16C1220.22,-176.03 1181.9,-147.29 1155.64,-127.59"/>
+<polygon fill="black" stroke="black" points="1157.86,-124.89 1147.76,-121.69 1153.66,-130.49 1157.86,-124.89"/>
</g>
</g>
</svg>
diff --git a/chapter12/README.md b/chapter12/README.md
index 0a32298a..53866440 100644
--- a/chapter12/README.md
+++ b/chapter12/README.md
@@ -47,7 +47,8 @@ And their own section in the Type lattice:
Within the Type Lattice, we now add the following domain:
-* Float type - Float values. The same shape as the Integer values, but floats
+* <font style="background-color:aqua">Float type</font> - Float values. The same shape as the Integer values, but floats
with a TOP, BOT and constants
+![Graph1](./docs/lattice.svg)
diff --git a/chapter12/docs/lattice.gv b/chapter12/docs/lattice.gv
new file mode 100644
index 00000000..eec7cc1d
--- /dev/null
+++ b/chapter12/docs/lattice.gv
@@ -0,0 +1,182 @@
+digraph Lattice {
+ compound = true;
+ // Define nodes
+ splines=false;
+ node [shape=circle, style=filled];
+ nodesep=0.6;
+
+ 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;
+
+ // ----------------------
+ // Integers
+ INT_TOP [label=<<B>⊤</B >:int>, fillcolor=lightblue, shape=oval];
+ INT_BOT [label=<<B>⊥</B>:int>, fillcolor=lightblue, shape=oval];
+
+ INT_MINDOTS [label="...", fillcolor=lightblue, shape=oval];
+ INT_ZERO [label="0" , fillcolor=lightblue];
+ INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval];
+
+ TOP -> INT_TOP;
+ INT_TOP -> INT_MINDOTS;
+ INT_TOP -> INT_ZERO;
+ INT_TOP -> INT_MAXDOTS;
+ INT_MINDOTS -> INT_BOT;
+ INT_ZERO -> INT_BOT;
+ INT_MAXDOTS -> INT_BOT;
+ INT_BOT -> BOT;
+
+ INT_MINDOTS -> INT_ZERO -> INT_MAXDOTS [style=invis];
+
+ // ----------------------
+ // Integers
+ FLT_TOP [label=<<B>⊤</B >:flt>, fillcolor=aqua, shape=oval];
+ FLT_BOT [label=<<B>⊥</B>:flt>, fillcolor=aqua, shape=oval];
+
+ FLT_MINDOTS [label="...", fillcolor=aqua, shape=oval];
+ FLT_ZERO [label="0" , fillcolor=aqua];
+ FLT_MAXDOTS [label="...", fillcolor=aqua, shape=oval];
+
+ TOP -> FLT_TOP;
+ FLT_TOP -> FLT_MINDOTS;
+ FLT_TOP -> FLT_ZERO;
+ FLT_TOP -> FLT_MAXDOTS;
+ FLT_MINDOTS -> FLT_BOT;
+ FLT_ZERO -> FLT_BOT;
+ FLT_MAXDOTS -> FLT_BOT;
+ FLT_BOT -> BOT;
+
+ FLT_MINDOTS -> FLT_ZERO -> FLT_MAXDOTS [style=invis];
+
+ // ----------------------
+ // 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_BOT [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>
+ >];
+
+
+ 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];
+
+ // ----------------------
+ // Memory
+ MEM_TOP [label=<<B>⊤</B >:mem>, fillcolor=blue, fontcolor=white, shape=oval];
+ MEM_BOT [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];
+
+ TOP -> MEM_TOP;
+ MEM_TOP -> MEM_ALIAS1;
+ MEM_TOP -> MEM_ALIASDOTS;
+ MEM_TOP -> MEM_ALIASN;
+ MEM_ALIAS1 -> MEM_BOT;
+ MEM_ALIASDOTS -> MEM_BOT;
+ MEM_ALIASN -> MEM_BOT;
+ MEM_BOT -> BOT;
+
+ MEM_ALIAS1 -> MEM_ALIASDOTS -> MEM_ALIASN [style=invis];
+
+ // ----------------------
+ // Tuples
+
+ TUPLE_TOP [label=<<B>⊤</B >:tuple>, fillcolor=pink, shape=oval];
+ TUPLE_BOT [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>
+ >];
+
+
+ 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; FLT_TOP; XCTRL; STRUCT_TOP; MEM_TOP; TUPLE_TOP}
+ {rank=same; INT_MINDOTS; INT_ZERO; INT_MAXDOTS;
+ FLT_MINDOTS; FLT_ZERO; FLT_MAXDOTS;
+ STRUCT_S1; STRUCT_S2; STRUCT_SN;
+ MEM_ALIAS1; MEM_ALIASDOTS; MEM_ALIASN;}
+ {rank=same; INT_BOT; FLT_BOT; CTRL; STRUCT_BOT; MEM_BOT; TUPLE_BOT}
+ {rank=same; BOT;}
+}
diff --git a/chapter12/docs/lattice.svg b/chapter12/docs/lattice.svg
new file mode 100644
index 00000000..1bb4f692
--- /dev/null
+++ b/chapter12/docs/lattice.svg
@@ -0,0 +1,598 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
+ -->
+<!-- Title: Lattice Pages: 1 -->
+<svg width="1602pt" height="440pt"
+ viewBox="0.00 0.00 1601.51 440.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 436.5)">
+<title>Lattice</title>
+<polygon fill="white" stroke="none" points="-4,4 -4,-436.5 1597.51,-436.5 1597.51,4 -4,4"/>
+<!-- TOP -->
+<g id="node1" class="node">
+<title>TOP</title>
+<ellipse fill="black" stroke="black" cx="630.51" cy="-411.37" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="622.63" y="-406.95" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
+</g>
+<!-- XCTRL -->
+<g id="node3" class="node">
+<title>XCTRL</title>
+<ellipse fill="yellow" stroke="black" cx="36.51" cy="-327.75" rx="36.51" ry="18"/>
+<text text-anchor="start" x="17.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="33.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+</g>
+<!-- TOP&#45;&gt;XCTRL -->
+<g id="edge1" class="edge">
+<title>TOP&#45;&gt;XCTRL</title>
+<path fill="none" stroke="black" d="M609.37,-407.47C523.96,-395.73 203.25,-351.66 82.7,-335.1"/>
+<polygon fill="black" stroke="black" points="83.22,-331.63 72.84,-333.74 82.27,-338.57 83.22,-331.63"/>
+</g>
+<!-- INT_TOP -->
+<g id="node5" class="node">
+<title>INT_TOP</title>
+<ellipse fill="lightblue" stroke="black" cx="226.51" cy="-327.75" rx="33.95" ry="18"/>
+<text text-anchor="start" x="209.63" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="225.38" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+</g>
+<!-- TOP&#45;&gt;INT_TOP -->
+<g id="edge4" class="edge">
+<title>TOP&#45;&gt;INT_TOP</title>
+<path fill="none" stroke="black" d="M609.64,-406.16C546.23,-393.34 354.92,-354.69 269.04,-337.34"/>
+<polygon fill="black" stroke="black" points="269.87,-333.94 259.37,-335.39 268.48,-340.8 269.87,-333.94"/>
+</g>
+<!-- FLT_TOP -->
+<g id="node10" class="node">
+<title>FLT_TOP</title>
+<ellipse fill="aqua" stroke="black" cx="489.51" cy="-327.75" rx="32.41" ry="18"/>
+<text text-anchor="start" x="473.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="489.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:flt</text>
+</g>
+<!-- TOP&#45;&gt;FLT_TOP -->
+<g id="edge14" class="edge">
+<title>TOP&#45;&gt;FLT_TOP</title>
+<path fill="none" stroke="black" d="M612.36,-399.87C589.31,-386.52 549.15,-363.27 521.04,-347"/>
+<polygon fill="black" stroke="black" points="523,-344.09 512.59,-342.11 519.49,-350.15 523,-344.09"/>
+</g>
+<!-- PTR -->
+<g id="node15" class="node">
+<title>PTR</title>
+<polygon fill="none" stroke="none" points="657.51,-354.25 603.51,-354.25 603.51,-301.25 657.51,-301.25 657.51,-354.25"/>
+<polygon fill="green" stroke="none" points="612.51,-327.75 612.51,-350.25 648.51,-350.25 648.51,-327.75 612.51,-327.75"/>
+<polygon fill="none" stroke="black" points="612.51,-327.75 612.51,-350.25 648.51,-350.25 648.51,-327.75 612.51,-327.75"/>
+<text text-anchor="start" x="619.63" y="-333.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr</text>
+<polygon fill="lightgreen" stroke="none" points="612.51,-305.25 612.51,-327.75 648.51,-327.75 648.51,-305.25 612.51,-305.25"/>
+<polygon fill="none" stroke="black" points="612.51,-305.25 612.51,-327.75 648.51,-327.75 648.51,-305.25 612.51,-305.25"/>
+<text text-anchor="start" x="615.51" y="-311.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
+</g>
+<!-- TOP&#45;&gt;PTR -->
+<g id="edge24" class="edge">
+<title>TOP&#45;&gt;PTR</title>
+<path fill="none" stroke="black" d="M630.51,-389.78C630.51,-382.39 630.51,-373.83 630.51,-365.49"/>
+<polygon fill="black" stroke="black" points="634.01,-365.52 630.51,-355.52 627.01,-365.52 634.01,-365.52"/>
+</g>
+<!-- STRUCT_TOP -->
+<g id="node17" class="node">
+<title>STRUCT_TOP</title>
+<ellipse fill="lightgreen" stroke="black" cx="806.51" cy="-327.75" rx="44.7" ry="18"/>
+<text text-anchor="start" x="781.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="797.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+</g>
+<!-- TOP&#45;&gt;STRUCT_TOP -->
+<g id="edge27" class="edge">
+<title>TOP&#45;&gt;STRUCT_TOP</title>
+<path fill="none" stroke="black" d="M649.68,-401.48C677.9,-388.39 731.22,-363.66 767.79,-346.71"/>
+<polygon fill="black" stroke="black" points="769.12,-349.95 776.71,-342.57 766.17,-343.6 769.12,-349.95"/>
+</g>
+<!-- MEM_TOP -->
+<g id="node22" class="node">
+<title>MEM_TOP</title>
+<ellipse fill="blue" stroke="black" cx="1147.51" cy="-327.75" rx="43.67" ry="18"/>
+<text text-anchor="start" x="1123.51" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
+<text text-anchor="start" x="1139.26" y="-323.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+</g>
+<!-- TOP&#45;&gt;MEM_TOP -->
+<g id="edge37" class="edge">
+<title>TOP&#45;&gt;MEM_TOP</title>
+<path fill="none" stroke="black" d="M651.42,-407.07C726.59,-395.2 984.56,-354.47 1095.79,-336.91"/>
+<polygon fill="black" stroke="black" points="1096.21,-340.39 1105.54,-335.37 1095.12,-333.48 1096.21,-340.39"/>
+</g>
+<!-- TUPLE_TOP -->
+<g id="node27" class="node">
+<title>TUPLE_TOP</title>
+<ellipse fill="pink" stroke="black" cx="1420.51" cy="-327.75" rx="42.65" ry="18"/>
+<text text-anchor="start" x="1397.26" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="1413.01" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+</g>
+<!-- TOP&#45;&gt;TUPLE_TOP -->
+<g id="edge47" class="edge">
+<title>TOP&#45;&gt;TUPLE_TOP</title>
+<path fill="none" stroke="black" d="M651.64,-408.19C755.41,-397.47 1212.34,-350.26 1368.21,-334.15"/>
+<polygon fill="black" stroke="black" points="1368.24,-337.67 1377.83,-333.16 1367.52,-330.7 1368.24,-337.67"/>
+</g>
+<!-- BOT -->
+<g id="node2" class="node">
+<title>BOT</title>
+<ellipse fill="black" stroke="black" cx="630.51" cy="-21.12" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="622.63" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
+</g>
+<!-- CTRL -->
+<g id="node4" class="node">
+<title>CTRL</title>
+<ellipse fill="yellow" stroke="black" cx="36.51" cy="-104.75" rx="36.51" ry="18"/>
+<text text-anchor="start" x="17.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="33.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+</g>
+<!-- XCTRL&#45;&gt;CTRL -->
+<g id="edge2" class="edge">
+<title>XCTRL&#45;&gt;CTRL</title>
+<path fill="none" stroke="black" d="M36.51,-309.5C36.51,-271.02 36.51,-181.25 36.51,-134.4"/>
+<polygon fill="black" stroke="black" points="40.01,-134.45 36.51,-124.45 33.01,-134.45 40.01,-134.45"/>
+</g>
+<!-- CTRL&#45;&gt;BOT -->
+<g id="edge3" class="edge">
+<title>CTRL&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M71.45,-98.95C177.66,-84.35 495.68,-40.65 598.24,-26.56"/>
+<polygon fill="black" stroke="black" points="598.46,-30.06 607.89,-25.23 597.5,-23.13 598.46,-30.06"/>
+</g>
+<!-- INT_MINDOTS -->
+<g id="node7" class="node">
+<title>INT_MINDOTS</title>
+<ellipse fill="lightblue" stroke="black" cx="89.51" cy="-216.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="89.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MINDOTS -->
+<g id="edge5" class="edge">
+<title>INT_TOP&#45;&gt;INT_MINDOTS</title>
+<path fill="none" stroke="black" d="M208.32,-312.21C184.36,-293.06 142.09,-259.28 114.97,-237.6"/>
+<polygon fill="black" stroke="black" points="117.24,-234.93 107.24,-231.42 112.87,-240.4 117.24,-234.93"/>
+</g>
+<!-- INT_ZERO -->
+<g id="node8" class="node">
+<title>INT_ZERO</title>
+<ellipse fill="lightblue" stroke="black" cx="177.51" cy="-216.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="177.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_ZERO -->
+<g id="edge6" class="edge">
+<title>INT_TOP&#45;&gt;INT_ZERO</title>
+<path fill="none" stroke="black" d="M219.07,-310.12C211.12,-292.37 198.43,-264.01 189.16,-243.29"/>
+<polygon fill="black" stroke="black" points="192.44,-242.05 185.16,-234.35 186.05,-244.91 192.44,-242.05"/>
+</g>
+<!-- INT_MAXDOTS -->
+<g id="node9" class="node">
+<title>INT_MAXDOTS</title>
+<ellipse fill="lightblue" stroke="black" cx="265.51" cy="-216.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="265.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MAXDOTS -->
+<g id="edge7" class="edge">
+<title>INT_TOP&#45;&gt;INT_MAXDOTS</title>
+<path fill="none" stroke="black" d="M232.6,-309.64C238.76,-292.36 248.36,-265.39 255.61,-245.04"/>
+<polygon fill="black" stroke="black" points="258.89,-246.26 258.95,-235.66 252.3,-243.91 258.89,-246.26"/>
+</g>
+<!-- INT_BOT -->
+<g id="node6" class="node">
+<title>INT_BOT</title>
+<ellipse fill="lightblue" stroke="black" cx="226.51" cy="-104.75" rx="33.95" ry="18"/>
+<text text-anchor="start" x="209.63" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="225.38" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+</g>
+<!-- INT_BOT&#45;&gt;BOT -->
+<g id="edge11" class="edge">
+<title>INT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M257.87,-97.41C333.02,-82.23 522.71,-43.9 598.5,-28.59"/>
+<polygon fill="black" stroke="black" points="599.06,-32.05 608.17,-26.64 597.68,-25.19 599.06,-32.05"/>
+</g>
+<!-- INT_MINDOTS&#45;&gt;INT_BOT -->
+<g id="edge8" class="edge">
+<title>INT_MINDOTS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M106.31,-201.82C129.55,-183.25 171.76,-149.5 199.47,-127.36"/>
+<polygon fill="black" stroke="black" points="201.45,-130.25 207.08,-121.28 197.08,-124.79 201.45,-130.25"/>
+</g>
+<!-- INT_MINDOTS&#45;&gt;INT_ZERO -->
+<!-- INT_ZERO&#45;&gt;INT_BOT -->
+<g id="edge9" class="edge">
+<title>INT_ZERO&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M184.53,-199.56C192.29,-182.22 204.94,-153.96 214.32,-132.98"/>
+<polygon fill="black" stroke="black" points="217.51,-134.42 218.4,-123.87 211.12,-131.56 217.51,-134.42"/>
+</g>
+<!-- INT_ZERO&#45;&gt;INT_MAXDOTS -->
+<!-- INT_MAXDOTS&#45;&gt;INT_BOT -->
+<g id="edge10" class="edge">
+<title>INT_MAXDOTS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M259.59,-198.62C253.44,-181.35 243.71,-154.05 236.4,-133.51"/>
+<polygon fill="black" stroke="black" points="239.78,-132.57 233.12,-124.32 233.18,-134.92 239.78,-132.57"/>
+</g>
+<!-- FLT_MINDOTS -->
+<g id="node12" class="node">
+<title>FLT_MINDOTS</title>
+<ellipse fill="aqua" stroke="black" cx="362.51" cy="-216.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="362.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+</g>
+<!-- FLT_TOP&#45;&gt;FLT_MINDOTS -->
+<g id="edge15" class="edge">
+<title>FLT_TOP&#45;&gt;FLT_MINDOTS</title>
+<path fill="none" stroke="black" d="M472.38,-311.98C450.43,-293.06 412.23,-260.12 387.15,-238.5"/>
+<polygon fill="black" stroke="black" points="389.57,-235.96 379.71,-232.08 385,-241.26 389.57,-235.96"/>
+</g>
+<!-- FLT_ZERO -->
+<g id="node13" class="node">
+<title>FLT_ZERO</title>
+<ellipse fill="aqua" stroke="black" cx="450.51" cy="-216.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="450.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
+</g>
+<!-- FLT_TOP&#45;&gt;FLT_ZERO -->
+<g id="edge16" class="edge">
+<title>FLT_TOP&#45;&gt;FLT_ZERO</title>
+<path fill="none" stroke="black" d="M483.42,-309.64C477.19,-292.16 467.43,-264.76 460.16,-244.33"/>
+<polygon fill="black" stroke="black" points="463.47,-243.2 456.81,-234.95 456.87,-245.54 463.47,-243.2"/>
+</g>
+<!-- FLT_MAXDOTS -->
+<g id="node14" class="node">
+<title>FLT_MAXDOTS</title>
+<ellipse fill="aqua" stroke="black" cx="538.51" cy="-216.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="538.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+</g>
+<!-- FLT_TOP&#45;&gt;FLT_MAXDOTS -->
+<g id="edge17" class="edge">
+<title>FLT_TOP&#45;&gt;FLT_MAXDOTS</title>
+<path fill="none" stroke="black" d="M496.95,-310.12C504.76,-292.67 517.15,-264.98 526.38,-244.36"/>
+<polygon fill="black" stroke="black" points="529.49,-245.97 530.38,-235.42 523.1,-243.12 529.49,-245.97"/>
+</g>
+<!-- FLT_BOT -->
+<g id="node11" class="node">
+<title>FLT_BOT</title>
+<ellipse fill="aqua" stroke="black" cx="489.51" cy="-104.75" rx="32.41" ry="18"/>
+<text text-anchor="start" x="473.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="489.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:flt</text>
+</g>
+<!-- FLT_BOT&#45;&gt;BOT -->
+<g id="edge21" class="edge">
+<title>FLT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M511.23,-91.17C535.78,-76.96 575.81,-53.79 602.65,-38.25"/>
+<polygon fill="black" stroke="black" points="604.36,-41.31 611.26,-33.27 600.85,-35.25 604.36,-41.31"/>
+</g>
+<!-- FLT_MINDOTS&#45;&gt;FLT_BOT -->
+<g id="edge18" class="edge">
+<title>FLT_MINDOTS&#45;&gt;FLT_BOT</title>
+<path fill="none" stroke="black" d="M378.59,-201.38C400.21,-182.74 438.85,-149.43 464.33,-127.46"/>
+<polygon fill="black" stroke="black" points="466.31,-130.37 471.6,-121.19 461.74,-125.07 466.31,-130.37"/>
+</g>
+<!-- FLT_MINDOTS&#45;&gt;FLT_ZERO -->
+<!-- FLT_ZERO&#45;&gt;FLT_BOT -->
+<g id="edge19" class="edge">
+<title>FLT_ZERO&#45;&gt;FLT_BOT</title>
+<path fill="none" stroke="black" d="M456.26,-199.09C462.41,-181.82 472.27,-154.14 479.66,-133.39"/>
+<polygon fill="black" stroke="black" points="482.91,-134.71 482.97,-124.12 476.31,-132.36 482.91,-134.71"/>
+</g>
+<!-- FLT_ZERO&#45;&gt;FLT_MAXDOTS -->
+<!-- FLT_MAXDOTS&#45;&gt;FLT_BOT -->
+<g id="edge20" class="edge">
+<title>FLT_MAXDOTS&#45;&gt;FLT_BOT</title>
+<path fill="none" stroke="black" d="M531.07,-198.62C523.26,-181.17 510.87,-153.48 501.64,-132.86"/>
+<polygon fill="black" stroke="black" points="504.92,-131.62 497.64,-123.92 498.53,-134.47 504.92,-131.62"/>
+</g>
+<!-- PTR0 -->
+<g id="node16" class="node">
+<title>PTR0</title>
+<polygon fill="none" stroke="none" points="657.51,-131.25 603.51,-131.25 603.51,-78.25 657.51,-78.25 657.51,-131.25"/>
+<polygon fill="green" stroke="none" points="612.51,-104.75 612.51,-127.25 648.51,-127.25 648.51,-104.75 612.51,-104.75"/>
+<polygon fill="none" stroke="black" points="612.51,-104.75 612.51,-127.25 648.51,-127.25 648.51,-104.75 612.51,-104.75"/>
+<text text-anchor="start" x="616.63" y="-110.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr?</text>
+<polygon fill="lightgreen" stroke="none" points="612.51,-82.25 612.51,-104.75 648.51,-104.75 648.51,-82.25 612.51,-82.25"/>
+<polygon fill="none" stroke="black" points="612.51,-82.25 612.51,-104.75 648.51,-104.75 648.51,-82.25 612.51,-82.25"/>
+<text text-anchor="start" x="615.51" y="-88.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
+</g>
+<!-- PTR&#45;&gt;PTR0 -->
+<g id="edge25" class="edge">
+<title>PTR&#45;&gt;PTR0</title>
+<path fill="none" stroke="black" d="M630.51,-301.29C630.51,-261.89 630.51,-187.62 630.51,-142.52"/>
+<polygon fill="black" stroke="black" points="634.01,-142.68 630.51,-132.68 627.01,-142.68 634.01,-142.68"/>
+</g>
+<!-- PTR0&#45;&gt;BOT -->
+<g id="edge26" class="edge">
+<title>PTR0&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M630.51,-78.37C630.51,-70.63 630.51,-62.03 630.51,-53.93"/>
+<polygon fill="black" stroke="black" points="634.01,-54.09 630.51,-44.09 627.01,-54.09 634.01,-54.09"/>
+</g>
+<!-- STRUCT_S1 -->
+<g id="node19" class="node">
+<title>STRUCT_S1</title>
+<polygon fill="none" stroke="none" points="781.38,-234.25 695.63,-234.25 695.63,-198.25 781.38,-198.25 781.38,-234.25"/>
+<polygon fill="lightgreen" stroke="none" points="703.63,-205 703.63,-227.5 734.38,-227.5 734.38,-205 703.63,-205"/>
+<polygon fill="none" stroke="black" points="703.63,-205 703.63,-227.5 734.38,-227.5 734.38,-205 703.63,-205"/>
+<text text-anchor="start" x="706.63" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_0" gradientUnits="userSpaceOnUse" x1="740.1" y1="-224.2" x2="767.67" y2="-208.29" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_0)" stroke="none" points="734.38,-205 734.38,-227.5 773.38,-227.5 773.38,-205 734.38,-205"/>
+<polygon fill="none" stroke="black" points="734.38,-205 734.38,-227.5 773.38,-227.5 773.38,-205 734.38,-205"/>
+<text text-anchor="start" x="737.38" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_S1 -->
+<g id="edge28" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_S1</title>
+<path fill="none" stroke="black" d="M796.18,-310.12C785.25,-292.51 767.83,-264.46 754.99,-243.79"/>
+<polygon fill="black" stroke="black" points="757.98,-241.97 749.73,-235.32 752.03,-245.66 757.98,-241.97"/>
+</g>
+<!-- STRUCT_S2 -->
+<g id="node20" class="node">
+<title>STRUCT_S2</title>
+<polygon fill="none" stroke="none" points="910.38,-242.75 824.63,-242.75 824.63,-189.75 910.38,-189.75 910.38,-242.75"/>
+<polygon fill="lightgreen" stroke="none" points="832.63,-216.25 832.63,-238.75 863.38,-238.75 863.38,-216.25 832.63,-216.25"/>
+<polygon fill="none" stroke="black" points="832.63,-216.25 832.63,-238.75 863.38,-238.75 863.38,-216.25 832.63,-216.25"/>
+<text text-anchor="start" x="835.63" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_1" gradientUnits="userSpaceOnUse" x1="869.1" y1="-235.45" x2="896.67" y2="-219.54" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_1)" stroke="none" points="863.38,-216.25 863.38,-238.75 902.38,-238.75 902.38,-216.25 863.38,-216.25"/>
+<polygon fill="none" stroke="black" points="863.38,-216.25 863.38,-238.75 902.38,-238.75 902.38,-216.25 863.38,-216.25"/>
+<text text-anchor="start" x="866.38" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="832.63,-193.75 832.63,-216.25 863.38,-216.25 863.38,-193.75 832.63,-193.75"/>
+<polygon fill="none" stroke="black" points="832.63,-193.75 832.63,-216.25 863.38,-216.25 863.38,-193.75 832.63,-193.75"/>
+<text text-anchor="start" x="835.63" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="869.1" y1="-212.95" x2="896.67" y2="-197.04" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_2)" stroke="none" points="863.38,-193.75 863.38,-216.25 902.38,-216.25 902.38,-193.75 863.38,-193.75"/>
+<polygon fill="none" stroke="black" points="863.38,-193.75 863.38,-216.25 902.38,-216.25 902.38,-193.75 863.38,-193.75"/>
+<text text-anchor="start" x="866.38" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_S2 -->
+<g id="edge29" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_S2</title>
+<path fill="none" stroke="black" d="M815.77,-310.12C824.25,-294.9 837.07,-271.89 847.82,-252.58"/>
+<polygon fill="black" stroke="black" points="850.84,-254.36 852.65,-243.92 844.73,-250.95 850.84,-254.36"/>
+</g>
+<!-- STRUCT_SN -->
+<g id="node21" class="node">
+<title>STRUCT_SN</title>
+<polygon fill="none" stroke="none" points="1039.38,-254 953.63,-254 953.63,-178.5 1039.38,-178.5 1039.38,-254"/>
+<polygon fill="lightgreen" stroke="none" points="961.63,-227.5 961.63,-250 992.38,-250 992.38,-227.5 961.63,-227.5"/>
+<polygon fill="none" stroke="black" points="961.63,-227.5 961.63,-250 992.38,-250 992.38,-227.5 961.63,-227.5"/>
+<text text-anchor="start" x="964.63" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_3" gradientUnits="userSpaceOnUse" x1="998.1" y1="-246.7" x2="1025.67" y2="-230.79" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_3)" stroke="none" points="992.38,-227.5 992.38,-250 1031.38,-250 1031.38,-227.5 992.38,-227.5"/>
+<polygon fill="none" stroke="black" points="992.38,-227.5 992.38,-250 1031.38,-250 1031.38,-227.5 992.38,-227.5"/>
+<text text-anchor="start" x="995.38" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="961.63,-205 961.63,-227.5 992.38,-227.5 992.38,-205 961.63,-205"/>
+<polygon fill="none" stroke="black" points="961.63,-205 961.63,-227.5 992.38,-227.5 992.38,-205 961.63,-205"/>
+<text text-anchor="start" x="967.63" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">... &#160;</text>
+<defs>
+<linearGradient id="l_4" gradientUnits="userSpaceOnUse" x1="998.1" y1="-224.2" x2="1025.67" y2="-208.29" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_4)" stroke="none" points="992.38,-205 992.38,-227.5 1031.38,-227.5 1031.38,-205 992.38,-205"/>
+<polygon fill="none" stroke="black" points="992.38,-205 992.38,-227.5 1031.38,-227.5 1031.38,-205 992.38,-205"/>
+<text text-anchor="start" x="995.38" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="961.63,-182.5 961.63,-205 992.38,-205 992.38,-182.5 961.63,-182.5"/>
+<polygon fill="none" stroke="black" points="961.63,-182.5 961.63,-205 992.38,-205 992.38,-182.5 961.63,-182.5"/>
+<text text-anchor="start" x="964.63" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_5" gradientUnits="userSpaceOnUse" x1="998.1" y1="-201.7" x2="1025.67" y2="-185.79" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_5)" stroke="none" points="992.38,-182.5 992.38,-205 1031.38,-205 1031.38,-182.5 992.38,-182.5"/>
+<polygon fill="none" stroke="black" points="992.38,-182.5 992.38,-205 1031.38,-205 1031.38,-182.5 992.38,-182.5"/>
+<text text-anchor="start" x="995.38" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_SN -->
+<g id="edge30" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_SN</title>
+<path fill="none" stroke="black" d="M831.35,-312.43C859.88,-295.99 907.49,-268.55 944.28,-247.35"/>
+<polygon fill="black" stroke="black" points="945.64,-250.61 952.55,-242.58 942.14,-244.54 945.64,-250.61"/>
+</g>
+<!-- STRUCT_BOT -->
+<g id="node18" class="node">
+<title>STRUCT_BOT</title>
+<ellipse fill="lightgreen" stroke="black" cx="806.51" cy="-104.75" rx="44.7" ry="18"/>
+<text text-anchor="start" x="781.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="797.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+</g>
+<!-- STRUCT_BOT&#45;&gt;BOT -->
+<g id="edge34" class="edge">
+<title>STRUCT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M777.84,-90.45C745.37,-75.39 692.74,-50.98 659.95,-35.78"/>
+<polygon fill="black" stroke="black" points="661.57,-32.67 651.03,-31.64 658.63,-39.02 661.57,-32.67"/>
+</g>
+<!-- STRUCT_S1&#45;&gt;STRUCT_BOT -->
+<g id="edge31" class="edge">
+<title>STRUCT_S1&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="black" d="M748.84,-198.62C759.77,-181.01 777.19,-152.96 790.02,-132.29"/>
+<polygon fill="black" stroke="black" points="792.98,-134.16 795.29,-123.82 787.04,-130.47 792.98,-134.16"/>
+</g>
+<!-- STRUCT_S1&#45;&gt;STRUCT_S2 -->
+<!-- STRUCT_S2&#45;&gt;STRUCT_BOT -->
+<g id="edge32" class="edge">
+<title>STRUCT_S2&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="black" d="M853.36,-189.85C843.77,-172.63 831.12,-149.92 821.38,-132.44"/>
+<polygon fill="black" stroke="black" points="824.68,-131.18 816.76,-124.15 818.57,-134.59 824.68,-131.18"/>
+</g>
+<!-- STRUCT_S2&#45;&gt;STRUCT_SN -->
+<!-- STRUCT_SN&#45;&gt;STRUCT_BOT -->
+<g id="edge33" class="edge">
+<title>STRUCT_SN&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="black" d="M953.87,-190.67C919.81,-171.04 872.69,-143.89 840.98,-125.62"/>
+<polygon fill="black" stroke="black" points="842.99,-122.73 832.58,-120.77 839.49,-128.8 842.99,-122.73"/>
+</g>
+<!-- MEM_ALIAS1 -->
+<g id="node24" class="node">
+<title>MEM_ALIAS1</title>
+<ellipse fill="blue" stroke="black" cx="1102.51" cy="-216.25" rx="20.13" ry="20.13"/>
+<text text-anchor="middle" x="1102.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">#1</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIAS1 -->
+<g id="edge38" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIAS1</title>
+<path fill="none" stroke="black" d="M1140.48,-309.64C1133.47,-292.59 1122.58,-266.09 1114.26,-245.84"/>
+<polygon fill="black" stroke="black" points="1117.55,-244.65 1110.52,-236.73 1111.08,-247.31 1117.55,-244.65"/>
+</g>
+<!-- MEM_ALIASDOTS -->
+<g id="node25" class="node">
+<title>MEM_ALIASDOTS</title>
+<ellipse fill="blue" stroke="black" cx="1192.51" cy="-216.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="1192.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIASDOTS -->
+<g id="edge39" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIASDOTS</title>
+<path fill="none" stroke="black" d="M1154.54,-309.64C1161.71,-292.18 1172.96,-264.82 1181.35,-244.4"/>
+<polygon fill="black" stroke="black" points="1184.54,-245.86 1185.1,-235.28 1178.06,-243.2 1184.54,-245.86"/>
+</g>
+<!-- MEM_ALIASN -->
+<g id="node26" class="node">
+<title>MEM_ALIASN</title>
+<ellipse fill="blue" stroke="black" cx="1282.51" cy="-216.25" rx="20.13" ry="20.13"/>
+<text text-anchor="middle" x="1282.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">#n</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIASN -->
+<g id="edge40" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIASN</title>
+<path fill="none" stroke="black" d="M1166.56,-311.29C1190.65,-291.76 1232.11,-258.13 1258.38,-236.82"/>
+<polygon fill="black" stroke="black" points="1260.57,-239.55 1266.13,-230.53 1256.16,-234.11 1260.57,-239.55"/>
+</g>
+<!-- MEM_BOT -->
+<g id="node23" class="node">
+<title>MEM_BOT</title>
+<ellipse fill="blue" stroke="black" cx="1147.51" cy="-104.75" rx="43.67" ry="18"/>
+<text text-anchor="start" x="1123.51" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
+<text text-anchor="start" x="1139.26" y="-100.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+</g>
+<!-- MEM_BOT&#45;&gt;BOT -->
+<g id="edge44" class="edge">
+<title>MEM_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M1107.37,-97.41C1008.15,-81.75 752.85,-41.44 662.66,-27.2"/>
+<polygon fill="black" stroke="black" points="663.45,-23.78 653.03,-25.68 662.36,-30.7 663.45,-23.78"/>
+</g>
+<!-- MEM_ALIAS1&#45;&gt;MEM_BOT -->
+<g id="edge41" class="edge">
+<title>MEM_ALIAS1&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1109.94,-197.17C1117.07,-179.82 1127.93,-153.39 1136.15,-133.4"/>
+<polygon fill="black" stroke="black" points="1139.37,-134.75 1139.94,-124.17 1132.9,-132.09 1139.37,-134.75"/>
+</g>
+<!-- MEM_ALIAS1&#45;&gt;MEM_ALIASDOTS -->
+<!-- MEM_ALIASDOTS&#45;&gt;MEM_BOT -->
+<g id="edge42" class="edge">
+<title>MEM_ALIASDOTS&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1185.67,-198.62C1178.58,-181.35 1167.36,-154.05 1158.92,-133.51"/>
+<polygon fill="black" stroke="black" points="1162.17,-132.22 1155.13,-124.3 1155.7,-134.88 1162.17,-132.22"/>
+</g>
+<!-- MEM_ALIASDOTS&#45;&gt;MEM_ALIASN -->
+<!-- MEM_ALIASN&#45;&gt;MEM_BOT -->
+<g id="edge43" class="edge">
+<title>MEM_ALIASN&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1267.02,-202.69C1244.75,-184.62 1203.29,-151 1175.55,-128.49"/>
+<polygon fill="black" stroke="black" points="1177.86,-125.86 1167.89,-122.28 1173.45,-131.3 1177.86,-125.86"/>
+</g>
+<!-- TUPLE1 -->
+<g id="node29" class="node">
+<title>TUPLE1</title>
+<polygon fill="none" stroke="none" points="1399.51,-242.75 1345.51,-242.75 1345.51,-189.75 1399.51,-189.75 1399.51,-242.75"/>
+<polygon fill="pink" stroke="none" points="1353.76,-216.25 1353.76,-238.75 1391.26,-238.75 1391.26,-216.25 1353.76,-216.25"/>
+<polygon fill="none" stroke="black" points="1353.76,-216.25 1353.76,-238.75 1391.26,-238.75 1391.26,-216.25 1353.76,-216.25"/>
+<text text-anchor="start" x="1356.76" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1353.76,-193.75 1353.76,-216.25 1391.26,-216.25 1391.26,-193.75 1353.76,-193.75"/>
+<polygon fill="none" stroke="black" points="1353.76,-193.75 1353.76,-216.25 1391.26,-216.25 1391.26,-193.75 1353.76,-193.75"/>
+<text text-anchor="start" x="1360.88" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLE1 -->
+<g id="edge48" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLE1</title>
+<path fill="none" stroke="black" d="M1413.01,-309.64C1406.37,-294.48 1396.45,-271.87 1388.1,-252.81"/>
+<polygon fill="black" stroke="black" points="1391.35,-251.51 1384.13,-243.76 1384.94,-254.32 1391.35,-251.51"/>
+</g>
+<!-- TUPLE2 -->
+<g id="node30" class="node">
+<title>TUPLE2</title>
+<polygon fill="none" stroke="none" points="1496.51,-254 1442.51,-254 1442.51,-178.5 1496.51,-178.5 1496.51,-254"/>
+<polygon fill="pink" stroke="none" points="1450.76,-227.5 1450.76,-250 1488.26,-250 1488.26,-227.5 1450.76,-227.5"/>
+<polygon fill="none" stroke="black" points="1450.76,-227.5 1450.76,-250 1488.26,-250 1488.26,-227.5 1450.76,-227.5"/>
+<text text-anchor="start" x="1453.76" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1450.76,-205 1450.76,-227.5 1488.26,-227.5 1488.26,-205 1450.76,-205"/>
+<polygon fill="none" stroke="black" points="1450.76,-205 1450.76,-227.5 1488.26,-227.5 1488.26,-205 1450.76,-205"/>
+<text text-anchor="start" x="1457.88" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="1450.76,-182.5 1450.76,-205 1488.26,-205 1488.26,-182.5 1450.76,-182.5"/>
+<polygon fill="none" stroke="black" points="1450.76,-182.5 1450.76,-205 1488.26,-205 1488.26,-182.5 1450.76,-182.5"/>
+<text text-anchor="start" x="1457.88" y="-188.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLE2 -->
+<g id="edge49" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLE2</title>
+<path fill="none" stroke="black" d="M1428.17,-309.64C1433.64,-297.4 1441.29,-280.3 1448.53,-264.14"/>
+<polygon fill="black" stroke="black" points="1451.68,-265.65 1452.57,-255.09 1445.3,-262.79 1451.68,-265.65"/>
+</g>
+<!-- TUPLEN -->
+<g id="node31" class="node">
+<title>TUPLEN</title>
+<polygon fill="none" stroke="none" points="1593.51,-265.25 1539.51,-265.25 1539.51,-167.25 1593.51,-167.25 1593.51,-265.25"/>
+<polygon fill="pink" stroke="none" points="1547.76,-238.75 1547.76,-261.25 1585.26,-261.25 1585.26,-238.75 1547.76,-238.75"/>
+<polygon fill="none" stroke="black" points="1547.76,-238.75 1547.76,-261.25 1585.26,-261.25 1585.26,-238.75 1547.76,-238.75"/>
+<text text-anchor="start" x="1550.76" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1547.76,-216.25 1547.76,-238.75 1585.26,-238.75 1585.26,-216.25 1547.76,-216.25"/>
+<polygon fill="none" stroke="black" points="1547.76,-216.25 1547.76,-238.75 1585.26,-238.75 1585.26,-216.25 1547.76,-216.25"/>
+<text text-anchor="start" x="1554.88" y="-222.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="1547.76,-193.75 1547.76,-216.25 1585.26,-216.25 1585.26,-193.75 1547.76,-193.75"/>
+<polygon fill="none" stroke="black" points="1547.76,-193.75 1547.76,-216.25 1585.26,-216.25 1585.26,-193.75 1547.76,-193.75"/>
+<text text-anchor="start" x="1560.88" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+<polygon fill="black" stroke="none" points="1547.76,-171.25 1547.76,-193.75 1585.26,-193.75 1585.26,-171.25 1547.76,-171.25"/>
+<polygon fill="none" stroke="black" points="1547.76,-171.25 1547.76,-193.75 1585.26,-193.75 1585.26,-171.25 1547.76,-171.25"/>
+<text text-anchor="start" x="1554.88" y="-177.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLEN -->
+<g id="edge50" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLEN</title>
+<path fill="none" stroke="black" d="M1440.81,-311.52C1463.97,-294.15 1502.28,-265.42 1530.53,-244.23"/>
+<polygon fill="black" stroke="black" points="1532.58,-247.07 1538.48,-238.27 1528.38,-241.47 1532.58,-247.07"/>
+</g>
+<!-- TUPLE_BOT -->
+<g id="node28" class="node">
+<title>TUPLE_BOT</title>
+<ellipse fill="pink" stroke="black" cx="1420.51" cy="-104.75" rx="42.65" ry="18"/>
+<text text-anchor="start" x="1397.26" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="1413.01" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+</g>
+<!-- TUPLE_BOT&#45;&gt;BOT -->
+<g id="edge54" class="edge">
+<title>TUPLE_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M1379.42,-99.5C1240.27,-85.13 788.44,-38.44 663.04,-25.49"/>
+<polygon fill="black" stroke="black" points="663.44,-22.01 653.13,-24.46 662.72,-28.97 663.44,-22.01"/>
+</g>
+<!-- TUPLE1&#45;&gt;TUPLE_BOT -->
+<g id="edge51" class="edge">
+<title>TUPLE1&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M1383.64,-189.85C1391.12,-172.8 1400.96,-150.34 1408.59,-132.93"/>
+<polygon fill="black" stroke="black" points="1411.61,-134.78 1412.41,-124.21 1405.19,-131.97 1411.61,-134.78"/>
+</g>
+<!-- TUPLE2&#45;&gt;TUPLE_BOT -->
+<g id="edge52" class="edge">
+<title>TUPLE2&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M1453.19,-178.79C1446.51,-163.86 1438.92,-146.89 1432.73,-133.07"/>
+<polygon fill="black" stroke="black" points="1436.02,-131.83 1428.74,-124.13 1429.63,-134.69 1436.02,-131.83"/>
+</g>
+<!-- TUPLEN&#45;&gt;TUPLE_BOT -->
+<g id="edge53" class="edge">
+<title>TUPLEN&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M1539.73,-195.16C1514.22,-176.03 1475.9,-147.29 1449.64,-127.59"/>
+<polygon fill="black" stroke="black" points="1451.86,-124.89 1441.76,-121.69 1447.66,-130.49 1451.86,-124.89"/>
+</g>
+</g>
+</svg>
diff --git a/chapter14/README.md b/chapter14/README.md
index 8451c4f5..fccb2aa5 100644
--- a/chapter14/README.md
+++ b/chapter14/README.md
@@ -65,12 +65,27 @@ f32 // IEEE 754 32-bit float
## Type Implementation
-The TypeInteger class is reworked to support a full range of min/max values.
-At this time, only some power-of-2 sized ranges are exposed but the optimizer
+The <font style="background-color:lightblue">TypeInteger type</font> class is
+reworked to support a full range of min/max values. At this time, only some
+power-of-2 sized ranges are exposed to the programmer but the optimizer
internally supports all ranges. The MEET operation takes the min-of-mins and
max-of-maxes. The DUAL operation inverts the min and max.
-The TypeFloat class is also reworked to support 32-bit and 64-bit sizes.
+Example: the constant `0` has `[0...0]`.
+
+Example: the `bool` the range `[0...1]`.
+
+Example: the `u8` the range `[0...255]`.
+
+Example: the `i8` the range `[-128...127]`.
+
+Example: the `dual` of `bool` is `[1...0]` (just swap min and max).
+
+The <font style="background-color:aqua">TypeFloat</font> class is also reworked to support 32-bit and 64-bit sizes.
+
+![Graph1](./docs/lattice.svg)
+
+
## Nodes
diff --git a/chapter14/docs/lattice.gv b/chapter14/docs/lattice.gv
new file mode 100644
index 00000000..4a8b1d4c
--- /dev/null
+++ b/chapter14/docs/lattice.gv
@@ -0,0 +1,202 @@
+digraph Lattice {
+ compound = true;
+ // Define nodes
+ splines=false;
+ node [shape=circle, style=filled];
+ nodesep=0.6;
+
+ 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;
+
+ // ----------------------
+ // Integers
+ INT_TOP [label=<<B>⊤</B >:int>, fillcolor=lightblue, shape=oval];
+ INT_BOT [label=<<B>⊥</B>: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];
+
+ // ----------------------
+ // Integers
+ FLT_TOP [label=<<B>⊤</B >:flt>, fillcolor=aqua, shape=oval];
+ FLT_BOT [label=<<B>⊥</B>: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];
+
+
+ // ----------------------
+ // 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_BOT [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>
+ >];
+
+
+ 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];
+
+ // ----------------------
+ // Memory
+ MEM_TOP [label=<<B>⊤</B >:mem>, fillcolor=blue, fontcolor=white, shape=oval];
+ MEM_BOT [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];
+
+ TOP -> MEM_TOP;
+ MEM_TOP -> MEM_ALIAS1;
+ MEM_TOP -> MEM_ALIASDOTS;
+ MEM_TOP -> MEM_ALIASN;
+ MEM_ALIAS1 -> MEM_BOT;
+ MEM_ALIASDOTS -> MEM_BOT;
+ MEM_ALIASN -> MEM_BOT;
+ MEM_BOT -> BOT;
+
+ MEM_ALIAS1 -> MEM_ALIASDOTS -> MEM_ALIASN [style=invis];
+
+ // ----------------------
+ // Tuples
+
+ TUPLE_TOP [label=<<B>⊤</B >:tuple>, fillcolor=pink, shape=oval];
+ TUPLE_BOT [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>
+ >];
+
+
+ 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; FLT_TOP; XCTRL; PTR; STRUCT_TOP; MEM_TOP; TUPLE_TOP}
+ {rank=same; INT_CON; INT_CON0; INT_CON1;
+ FLT_CON32; FLT_CON64; FLT_CON0; FLT_CONPI;
+ STRUCT_S1; STRUCT_S2; STRUCT_SN;
+ MEM_ALIAS1; MEM_ALIASDOTS; MEM_ALIASN;
+ TUPLE1; TUPLE2; TUPLEN;
+ }
+ {rank=same; INT_BOT; FLT_BOT; CTRL; PTR0; STRUCT_BOT; MEM_BOT; TUPLE_BOT}
+ {rank=same; BOT;}
+}
diff --git a/chapter14/docs/lattice.svg b/chapter14/docs/lattice.svg
new file mode 100644
index 00000000..99f74ed0
--- /dev/null
+++ b/chapter14/docs/lattice.svg
@@ -0,0 +1,691 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
+ -->
+<!-- Title: Lattice Pages: 1 -->
+<svg width="1800pt" height="760pt"
+ viewBox="0.00 0.00 1800.00 759.54" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 755.54)">
+<title>Lattice</title>
+<polygon fill="white" stroke="none" points="-4,4 -4,-755.54 1796,-755.54 1796,4 -4,4"/>
+<!-- TOP -->
+<g id="node1" class="node">
+<title>TOP</title>
+<ellipse fill="black" stroke="black" cx="829" cy="-730.42" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="821.12" y="-725.99" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
+</g>
+<!-- XCTRL -->
+<g id="node3" class="node">
+<title>XCTRL</title>
+<ellipse fill="yellow" stroke="black" cx="45" cy="-646.79" rx="36.51" ry="18"/>
+<text text-anchor="start" x="26.25" y="-642.74" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="42" y="-642.74" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+</g>
+<!-- TOP&#45;&gt;XCTRL -->
+<g id="edge1" class="edge">
+<title>TOP&#45;&gt;XCTRL</title>
+<path fill="none" stroke="black" d="M807.62,-727.19C702.73,-716.27 241.49,-668.25 91.97,-652.68"/>
+<polygon fill="black" stroke="black" points="92.33,-649.2 82.02,-651.65 91.61,-656.16 92.33,-649.2"/>
+</g>
+<!-- INT_TOP -->
+<g id="node5" class="node">
+<title>INT_TOP</title>
+<ellipse fill="lightblue" stroke="black" cx="404" cy="-646.79" rx="33.95" ry="18"/>
+<text text-anchor="start" x="387.12" y="-642.74" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="402.88" y="-642.74" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+</g>
+<!-- TOP&#45;&gt;INT_TOP -->
+<g id="edge4" class="edge">
+<title>TOP&#45;&gt;INT_TOP</title>
+<path fill="none" stroke="black" d="M808.21,-725.42C742.28,-712.76 536.86,-673.31 446.91,-656.03"/>
+<polygon fill="black" stroke="black" points="447.74,-652.63 437.26,-654.18 446.42,-659.5 447.74,-652.63"/>
+</g>
+<!-- FLT_TOP -->
+<g id="node14" class="node">
+<title>FLT_TOP</title>
+<ellipse fill="aqua" stroke="black" cx="636" cy="-646.79" rx="32.41" ry="18"/>
+<text text-anchor="start" x="620.25" y="-642.74" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="636" y="-642.74" font-family="Times New Roman,serif" font-size="14.00">:flt</text>
+</g>
+<!-- TOP&#45;&gt;FLT_TOP -->
+<g id="edge18" class="edge">
+<title>TOP&#45;&gt;FLT_TOP</title>
+<path fill="none" stroke="black" d="M809.79,-721.29C777.65,-707.7 712.5,-680.14 671.73,-662.91"/>
+<polygon fill="black" stroke="black" points="673.15,-659.7 662.58,-659.03 670.42,-666.15 673.15,-659.7"/>
+</g>
+<!-- PTR -->
+<g id="node22" class="node">
+<title>PTR</title>
+<polygon fill="none" stroke="none" points="856,-673.29 802,-673.29 802,-620.29 856,-620.29 856,-673.29"/>
+<polygon fill="green" stroke="none" points="811,-646.79 811,-669.29 847,-669.29 847,-646.79 811,-646.79"/>
+<polygon fill="none" stroke="black" points="811,-646.79 811,-669.29 847,-669.29 847,-646.79 811,-646.79"/>
+<text text-anchor="start" x="818.12" y="-652.99" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr</text>
+<polygon fill="lightgreen" stroke="none" points="811,-624.29 811,-646.79 847,-646.79 847,-624.29 811,-624.29"/>
+<polygon fill="none" stroke="black" points="811,-624.29 811,-646.79 847,-646.79 847,-624.29 811,-624.29"/>
+<text text-anchor="start" x="814" y="-630.49" font-family="Times New Roman,serif" font-size="14.00">struct</text>
+</g>
+<!-- TOP&#45;&gt;PTR -->
+<g id="edge33" class="edge">
+<title>TOP&#45;&gt;PTR</title>
+<path fill="none" stroke="black" d="M829,-708.82C829,-701.44 829,-692.87 829,-684.54"/>
+<polygon fill="black" stroke="black" points="832.5,-684.57 829,-674.57 825.5,-684.57 832.5,-684.57"/>
+</g>
+<!-- STRUCT_TOP -->
+<g id="node24" class="node">
+<title>STRUCT_TOP</title>
+<ellipse fill="lightgreen" stroke="black" cx="997" cy="-646.79" rx="44.7" ry="18"/>
+<text text-anchor="start" x="972.25" y="-642.74" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="988" y="-642.74" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+</g>
+<!-- TOP&#45;&gt;STRUCT_TOP -->
+<g id="edge36" class="edge">
+<title>TOP&#45;&gt;STRUCT_TOP</title>
+<path fill="none" stroke="black" d="M847.95,-720.21C874.78,-707.18 924.42,-683.06 959.01,-666.25"/>
+<polygon fill="black" stroke="black" points="960.39,-669.47 967.86,-661.95 957.34,-663.17 960.39,-669.47"/>
+</g>
+<!-- MEM_TOP -->
+<g id="node29" class="node">
+<title>MEM_TOP</title>
+<ellipse fill="blue" stroke="black" cx="1346" cy="-646.79" rx="43.67" ry="18"/>
+<text text-anchor="start" x="1322" y="-642.74" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
+<text text-anchor="start" x="1337.75" y="-642.74" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+</g>
+<!-- TOP&#45;&gt;MEM_TOP -->
+<g id="edge46" class="edge">
+<title>TOP&#45;&gt;MEM_TOP</title>
+<path fill="none" stroke="black" d="M849.91,-726.12C925.08,-714.25 1183.05,-673.52 1294.28,-655.96"/>
+<polygon fill="black" stroke="black" points="1294.7,-659.44 1304.03,-654.42 1293.61,-652.52 1294.7,-659.44"/>
+</g>
+<!-- TUPLE_TOP -->
+<g id="node34" class="node">
+<title>TUPLE_TOP</title>
+<ellipse fill="pink" stroke="black" cx="1619" cy="-646.79" rx="42.65" ry="18"/>
+<text text-anchor="start" x="1595.75" y="-642.74" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="1611.5" y="-642.74" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+</g>
+<!-- TOP&#45;&gt;TUPLE_TOP -->
+<g id="edge56" class="edge">
+<title>TOP&#45;&gt;TUPLE_TOP</title>
+<path fill="none" stroke="black" d="M850.13,-727.23C953.9,-716.51 1410.83,-669.3 1566.7,-653.2"/>
+<polygon fill="black" stroke="black" points="1566.73,-656.71 1576.32,-652.2 1566.01,-649.75 1566.73,-656.71"/>
+</g>
+<!-- BOT -->
+<g id="node2" class="node">
+<title>BOT</title>
+<ellipse fill="black" stroke="black" cx="829" cy="-21.12" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="821.12" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
+</g>
+<!-- CTRL -->
+<g id="node4" class="node">
+<title>CTRL</title>
+<ellipse fill="yellow" stroke="black" cx="44" cy="-104.75" rx="36.51" ry="18"/>
+<text text-anchor="start" x="25.25" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="41" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+</g>
+<!-- XCTRL&#45;&gt;CTRL -->
+<g id="edge2" class="edge">
+<title>XCTRL&#45;&gt;CTRL</title>
+<path fill="none" stroke="black" d="M44.97,-628.45C44.82,-548.91 44.24,-233.44 44.05,-134.55"/>
+<polygon fill="black" stroke="black" points="47.56,-134.6 44.04,-124.6 40.56,-134.61 47.56,-134.6"/>
+</g>
+<!-- CTRL&#45;&gt;BOT -->
+<g id="edge3" class="edge">
+<title>CTRL&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M79.77,-100.03C211.83,-86.3 670.83,-38.57 796.8,-25.47"/>
+<polygon fill="black" stroke="black" points="796.84,-28.99 806.43,-24.47 796.12,-22.02 796.84,-28.99"/>
+</g>
+<!-- INT_HI -->
+<g id="node7" class="node">
+<title>INT_HI</title>
+<ellipse fill="lightblue" stroke="black" cx="203" cy="-566.29" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="203" y="-561.24" font-family="Times New Roman,serif" font-size="14.00">max &lt; min</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_HI -->
+<g id="edge5" class="edge">
+<title>INT_TOP&#45;&gt;INT_HI</title>
+<path fill="none" stroke="black" d="M377.31,-635.37C344.15,-622.42 287.09,-600.13 247.33,-584.6"/>
+<polygon fill="black" stroke="black" points="248.85,-581.44 238.26,-581.06 246.31,-587.96 248.85,-581.44"/>
+</g>
+<!-- INT_BOT -->
+<g id="node6" class="node">
+<title>INT_BOT</title>
+<ellipse fill="lightblue" stroke="black" cx="404" cy="-104.75" rx="33.95" ry="18"/>
+<text text-anchor="start" x="387.12" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="402.88" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+</g>
+<!-- INT_BOT&#45;&gt;BOT -->
+<g id="edge15" class="edge">
+<title>INT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M435.6,-97.68C514.28,-82.57 718.3,-43.39 797.2,-28.23"/>
+<polygon fill="black" stroke="black" points="797.68,-31.7 806.84,-26.38 796.36,-24.83 797.68,-31.7"/>
+</g>
+<!-- INT_XBOOL -->
+<g id="node8" class="node">
+<title>INT_XBOOL</title>
+<ellipse fill="lightblue" stroke="black" cx="97" cy="-483.97" rx="27.81" ry="18"/>
+<text text-anchor="middle" x="97" y="-478.92" font-family="Times New Roman,serif" font-size="14.00">1...0</text>
+</g>
+<!-- INT_HI&#45;&gt;INT_XBOOL -->
+<g id="edge6" class="edge">
+<title>INT_HI&#45;&gt;INT_XBOOL</title>
+<path fill="none" stroke="black" d="M182.06,-549.42C165.21,-536.65 141.43,-518.64 123.29,-504.9"/>
+<polygon fill="black" stroke="black" points="125.68,-502.32 115.6,-499.07 121.46,-507.89 125.68,-502.32"/>
+</g>
+<!-- INT_CON -->
+<g id="node9" class="node">
+<title>INT_CON</title>
+<ellipse fill="lightblue" stroke="black" cx="203" cy="-370.65" rx="45.21" ry="18"/>
+<text text-anchor="middle" x="203" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">constants</text>
+</g>
+<!-- INT_HI&#45;&gt;INT_CON -->
+<g id="edge9" class="edge">
+<title>INT_HI&#45;&gt;INT_CON</title>
+<path fill="none" stroke="black" d="M203,-547.89C203,-514.02 203,-441.56 203,-400.55"/>
+<polygon fill="black" stroke="black" points="206.5,-400.66 203,-390.66 199.5,-400.66 206.5,-400.66"/>
+</g>
+<!-- INT_CON0 -->
+<g id="node10" class="node">
+<title>INT_CON0</title>
+<ellipse fill="lightblue" stroke="black" cx="18" cy="-370.65" rx="18" ry="18"/>
+<text text-anchor="middle" x="18" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">0</text>
+</g>
+<!-- INT_XBOOL&#45;&gt;INT_CON0 -->
+<g id="edge7" class="edge">
+<title>INT_XBOOL&#45;&gt;INT_CON0</title>
+<path fill="none" stroke="black" d="M85.68,-467.02C72.29,-448.15 49.88,-416.57 34.54,-394.96"/>
+<polygon fill="black" stroke="black" points="37.56,-393.17 28.92,-387.04 31.86,-397.22 37.56,-393.17"/>
+</g>
+<!-- INT_CON1 -->
+<g id="node11" class="node">
+<title>INT_CON1</title>
+<ellipse fill="lightblue" stroke="black" cx="97" cy="-370.65" rx="18" ry="18"/>
+<text text-anchor="middle" x="97" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">1</text>
+</g>
+<!-- INT_XBOOL&#45;&gt;INT_CON1 -->
+<g id="edge8" class="edge">
+<title>INT_XBOOL&#45;&gt;INT_CON1</title>
+<path fill="none" stroke="black" d="M97,-465.58C97,-448.1 97,-420.85 97,-400.2"/>
+<polygon fill="black" stroke="black" points="100.5,-400.44 97,-390.44 93.5,-400.44 100.5,-400.44"/>
+</g>
+<!-- INT_LO -->
+<g id="node13" class="node">
+<title>INT_LO</title>
+<ellipse fill="lightblue" stroke="black" cx="203" cy="-185.25" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="203" y="-180.2" font-family="Times New Roman,serif" font-size="14.00">max &gt; min</text>
+</g>
+<!-- INT_CON&#45;&gt;INT_LO -->
+<g id="edge13" class="edge">
+<title>INT_CON&#45;&gt;INT_LO</title>
+<path fill="none" stroke="black" d="M203,-352.2C203,-320.06 203,-253.57 203,-214.9"/>
+<polygon fill="black" stroke="black" points="206.5,-215.14 203,-205.14 199.5,-215.14 206.5,-215.14"/>
+</g>
+<!-- INT_CON0&#45;&gt;INT_CON1 -->
+<!-- INT_BOOL -->
+<g id="node12" class="node">
+<title>INT_BOOL</title>
+<ellipse fill="lightblue" stroke="black" cx="97" cy="-262.45" rx="27.81" ry="18"/>
+<text text-anchor="middle" x="97" y="-257.4" font-family="Times New Roman,serif" font-size="14.00">0...1</text>
+</g>
+<!-- INT_CON0&#45;&gt;INT_BOOL -->
+<g id="edge10" class="edge">
+<title>INT_CON0&#45;&gt;INT_BOOL</title>
+<path fill="none" stroke="black" d="M28.33,-355.77C41.09,-338.61 63.05,-309.09 78.7,-288.06"/>
+<polygon fill="black" stroke="black" points="81.32,-290.39 84.48,-280.28 75.71,-286.21 81.32,-290.39"/>
+</g>
+<!-- INT_CON1&#45;&gt;INT_CON -->
+<!-- INT_CON1&#45;&gt;INT_BOOL -->
+<g id="edge11" class="edge">
+<title>INT_CON1&#45;&gt;INT_BOOL</title>
+<path fill="none" stroke="black" d="M97,-352.59C97,-336.35 97,-311.6 97,-292.3"/>
+<polygon fill="black" stroke="black" points="100.5,-292.34 97,-282.34 93.5,-292.34 100.5,-292.34"/>
+</g>
+<!-- INT_BOOL&#45;&gt;INT_LO -->
+<g id="edge12" class="edge">
+<title>INT_BOOL&#45;&gt;INT_LO</title>
+<path fill="none" stroke="black" d="M114.98,-248.69C130.47,-237.7 153.19,-221.59 171.67,-208.48"/>
+<polygon fill="black" stroke="black" points="173.51,-211.46 179.65,-202.82 169.46,-205.75 173.51,-211.46"/>
+</g>
+<!-- INT_LO&#45;&gt;INT_BOT -->
+<g id="edge14" class="edge">
+<title>INT_LO&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M236.64,-171.11C272.65,-157.05 329.61,-134.8 366.9,-120.24"/>
+<polygon fill="black" stroke="black" points="367.88,-123.61 375.92,-116.72 365.33,-117.09 367.88,-123.61"/>
+</g>
+<!-- FLT_CON64 -->
+<g id="node16" class="node">
+<title>FLT_CON64</title>
+<ellipse fill="aqua" stroke="black" cx="709" cy="-370.65" rx="55.33" ry="40.66"/>
+<text text-anchor="middle" x="709" y="-382.1" font-family="Times New Roman,serif" font-size="14.00">64b consts</text>
+<text text-anchor="middle" x="709" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">[excludes</text>
+<text text-anchor="middle" x="709" y="-349.1" font-family="Times New Roman,serif" font-size="14.00">32b consts]</text>
+</g>
+<!-- FLT_TOP&#45;&gt;FLT_CON64 -->
+<g id="edge19" class="edge">
+<title>FLT_TOP&#45;&gt;FLT_CON64</title>
+<path fill="none" stroke="black" d="M640.79,-628.67C651.74,-587.25 678.94,-484.36 695.5,-421.74"/>
+<polygon fill="black" stroke="black" points="698.8,-422.94 697.97,-412.38 692.03,-421.15 698.8,-422.94"/>
+</g>
+<!-- FLT_CONPI -->
+<g id="node18" class="node">
+<title>FLT_CONPI</title>
+<ellipse fill="aqua" stroke="black" cx="562" cy="-370.65" rx="48.79" ry="18"/>
+<text text-anchor="middle" x="562" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">3.14159...</text>
+</g>
+<!-- FLT_TOP&#45;&gt;FLT_CONPI -->
+<g id="edge20" class="edge">
+<title>FLT_TOP&#45;&gt;FLT_CONPI</title>
+<path fill="none" stroke="black" d="M631.14,-628.67C618.63,-581.96 585.17,-457.11 569.85,-399.95"/>
+<polygon fill="black" stroke="black" points="573.23,-399.05 567.27,-390.3 566.47,-400.86 573.23,-399.05"/>
+</g>
+<!-- FLT_X32 -->
+<g id="node19" class="node">
+<title>FLT_X32</title>
+<ellipse fill="aqua" stroke="black" cx="420" cy="-483.97" rx="28.32" ry="28.32"/>
+<text text-anchor="middle" x="420" y="-478.92" font-family="Times New Roman,serif" font-size="14.00">~f32</text>
+</g>
+<!-- FLT_TOP&#45;&gt;FLT_X32 -->
+<g id="edge23" class="edge">
+<title>FLT_TOP&#45;&gt;FLT_X32</title>
+<path fill="none" stroke="black" d="M616.45,-632.06C579.12,-603.92 497.39,-542.31 451.99,-508.09"/>
+<polygon fill="black" stroke="black" points="454.19,-505.36 444.09,-502.13 449.97,-510.95 454.19,-505.36"/>
+</g>
+<!-- FLT_BOT -->
+<g id="node15" class="node">
+<title>FLT_BOT</title>
+<ellipse fill="aqua" stroke="black" cx="636" cy="-104.75" rx="32.41" ry="18"/>
+<text text-anchor="start" x="620.25" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="636" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:flt</text>
+</g>
+<!-- FLT_BOT&#45;&gt;BOT -->
+<g id="edge29" class="edge">
+<title>FLT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M661.23,-93.08C696.76,-78.05 761.4,-50.72 799.23,-34.72"/>
+<polygon fill="black" stroke="black" points="800.35,-38.04 808.2,-30.92 797.63,-31.59 800.35,-38.04"/>
+</g>
+<!-- FLT_CON64&#45;&gt;FLT_BOT -->
+<g id="edge21" class="edge">
+<title>FLT_CON64&#45;&gt;FLT_BOT</title>
+<path fill="none" stroke="black" d="M697.99,-330.56C683.16,-276.52 657.1,-181.62 644,-133.89"/>
+<polygon fill="black" stroke="black" points="647.39,-133 641.36,-124.29 640.64,-134.86 647.39,-133"/>
+</g>
+<!-- FLT_CON32 -->
+<g id="node17" class="node">
+<title>FLT_CON32</title>
+<ellipse fill="aqua" stroke="black" cx="420" cy="-370.65" rx="50.33" ry="18"/>
+<text text-anchor="middle" x="420" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">32b consts</text>
+</g>
+<!-- FLT_CON32&#45;&gt;FLT_CONPI -->
+<!-- FLT_32 -->
+<g id="node21" class="node">
+<title>FLT_32</title>
+<ellipse fill="aqua" stroke="black" cx="420" cy="-262.45" rx="23.2" ry="23.2"/>
+<text text-anchor="middle" x="420" y="-257.4" font-family="Times New Roman,serif" font-size="14.00">f32</text>
+</g>
+<!-- FLT_CON32&#45;&gt;FLT_32 -->
+<g id="edge27" class="edge">
+<title>FLT_CON32&#45;&gt;FLT_32</title>
+<path fill="none" stroke="black" d="M420,-352.59C420,-337.77 420,-315.87 420,-297.49"/>
+<polygon fill="black" stroke="black" points="423.5,-297.54 420,-287.54 416.5,-297.54 423.5,-297.54"/>
+</g>
+<!-- FLT_CONPI&#45;&gt;FLT_BOT -->
+<g id="edge22" class="edge">
+<title>FLT_CONPI&#45;&gt;FLT_BOT</title>
+<path fill="none" stroke="black" d="M567.09,-352.38C579.71,-307.01 612.57,-188.95 627.9,-133.86"/>
+<polygon fill="black" stroke="black" points="631.26,-134.83 630.57,-124.26 624.52,-132.95 631.26,-134.83"/>
+</g>
+<!-- FLT_CONPI&#45;&gt;FLT_CON64 -->
+<!-- FLT_X32&#45;&gt;FLT_CON32 -->
+<g id="edge25" class="edge">
+<title>FLT_X32&#45;&gt;FLT_CON32</title>
+<path fill="none" stroke="black" d="M420,-455.17C420,-438.48 420,-417.3 420,-400.44"/>
+<polygon fill="black" stroke="black" points="423.5,-400.57 420,-390.57 416.5,-400.57 423.5,-400.57"/>
+</g>
+<!-- FLT_CON0 -->
+<g id="node20" class="node">
+<title>FLT_CON0</title>
+<ellipse fill="aqua" stroke="black" cx="309" cy="-370.65" rx="18.08" ry="18.08"/>
+<text text-anchor="middle" x="309" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">0.</text>
+</g>
+<!-- FLT_X32&#45;&gt;FLT_CON0 -->
+<g id="edge24" class="edge">
+<title>FLT_X32&#45;&gt;FLT_CON0</title>
+<path fill="none" stroke="black" d="M400.41,-463.33C380.48,-443.34 349.72,-412.49 329.47,-392.18"/>
+<polygon fill="black" stroke="black" points="332.11,-389.87 322.57,-385.26 327.15,-394.82 332.11,-389.87"/>
+</g>
+<!-- FLT_CON0&#45;&gt;FLT_CON32 -->
+<!-- FLT_CON0&#45;&gt;FLT_32 -->
+<g id="edge26" class="edge">
+<title>FLT_CON0&#45;&gt;FLT_32</title>
+<path fill="none" stroke="black" d="M321.73,-357.47C339.61,-340.37 372.5,-308.9 395.28,-287.1"/>
+<polygon fill="black" stroke="black" points="397.56,-289.76 402.37,-280.32 392.72,-284.71 397.56,-289.76"/>
+</g>
+<!-- FLT_32&#45;&gt;FLT_BOT -->
+<g id="edge28" class="edge">
+<title>FLT_32&#45;&gt;FLT_BOT</title>
+<path fill="none" stroke="black" d="M438.79,-248.73C476.56,-221.15 561.91,-158.84 606.94,-125.97"/>
+<polygon fill="black" stroke="black" points="608.93,-128.85 614.94,-120.12 604.8,-123.19 608.93,-128.85"/>
+</g>
+<!-- PTR0 -->
+<g id="node23" class="node">
+<title>PTR0</title>
+<polygon fill="none" stroke="none" points="856,-131.25 802,-131.25 802,-78.25 856,-78.25 856,-131.25"/>
+<polygon fill="green" stroke="none" points="811,-104.75 811,-127.25 847,-127.25 847,-104.75 811,-104.75"/>
+<polygon fill="none" stroke="black" points="811,-104.75 811,-127.25 847,-127.25 847,-104.75 811,-104.75"/>
+<text text-anchor="start" x="815.12" y="-110.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr?</text>
+<polygon fill="lightgreen" stroke="none" points="811,-82.25 811,-104.75 847,-104.75 847,-82.25 811,-82.25"/>
+<polygon fill="none" stroke="black" points="811,-82.25 811,-104.75 847,-104.75 847,-82.25 811,-82.25"/>
+<text text-anchor="start" x="814" y="-88.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
+</g>
+<!-- PTR&#45;&gt;PTR0 -->
+<g id="edge34" class="edge">
+<title>PTR&#45;&gt;PTR0</title>
+<path fill="none" stroke="black" d="M829,-620.65C829,-532.47 829,-245.72 829,-142.34"/>
+<polygon fill="black" stroke="black" points="832.5,-142.46 829,-132.46 825.5,-142.46 832.5,-142.46"/>
+</g>
+<!-- PTR0&#45;&gt;BOT -->
+<g id="edge35" class="edge">
+<title>PTR0&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M829,-78.37C829,-70.63 829,-62.03 829,-53.93"/>
+<polygon fill="black" stroke="black" points="832.5,-54.09 829,-44.09 825.5,-54.09 832.5,-54.09"/>
+</g>
+<!-- STRUCT_S1 -->
+<g id="node26" class="node">
+<title>STRUCT_S1</title>
+<polygon fill="none" stroke="none" points="979.88,-388.65 894.12,-388.65 894.12,-352.65 979.88,-352.65 979.88,-388.65"/>
+<polygon fill="lightgreen" stroke="none" points="902.12,-359.4 902.12,-381.9 932.88,-381.9 932.88,-359.4 902.12,-359.4"/>
+<polygon fill="none" stroke="black" points="902.12,-359.4 902.12,-381.9 932.88,-381.9 932.88,-359.4 902.12,-359.4"/>
+<text text-anchor="start" x="905.12" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_0" gradientUnits="userSpaceOnUse" x1="938.59" y1="-378.61" x2="966.16" y2="-362.7" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_0)" stroke="none" points="932.88,-359.4 932.88,-381.9 971.88,-381.9 971.88,-359.4 932.88,-359.4"/>
+<polygon fill="none" stroke="black" points="932.88,-359.4 932.88,-381.9 971.88,-381.9 971.88,-359.4 932.88,-359.4"/>
+<text text-anchor="start" x="935.88" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_S1 -->
+<g id="edge37" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_S1</title>
+<path fill="none" stroke="black" d="M993.06,-628.67C982.89,-581.85 955.66,-456.51 943.28,-399.54"/>
+<polygon fill="black" stroke="black" points="946.74,-398.99 941.19,-389.96 939.9,-400.47 946.74,-398.99"/>
+</g>
+<!-- STRUCT_S2 -->
+<g id="node27" class="node">
+<title>STRUCT_S2</title>
+<polygon fill="none" stroke="none" points="1108.88,-397.15 1023.12,-397.15 1023.12,-344.15 1108.88,-344.15 1108.88,-397.15"/>
+<polygon fill="lightgreen" stroke="none" points="1031.12,-370.65 1031.12,-393.15 1061.88,-393.15 1061.88,-370.65 1031.12,-370.65"/>
+<polygon fill="none" stroke="black" points="1031.12,-370.65 1031.12,-393.15 1061.88,-393.15 1061.88,-370.65 1031.12,-370.65"/>
+<text text-anchor="start" x="1034.12" y="-376.85" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_1" gradientUnits="userSpaceOnUse" x1="1067.59" y1="-389.86" x2="1095.16" y2="-373.95" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_1)" stroke="none" points="1061.88,-370.65 1061.88,-393.15 1100.88,-393.15 1100.88,-370.65 1061.88,-370.65"/>
+<polygon fill="none" stroke="black" points="1061.88,-370.65 1061.88,-393.15 1100.88,-393.15 1100.88,-370.65 1061.88,-370.65"/>
+<text text-anchor="start" x="1064.88" y="-376.85" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="1031.12,-348.15 1031.12,-370.65 1061.88,-370.65 1061.88,-348.15 1031.12,-348.15"/>
+<polygon fill="none" stroke="black" points="1031.12,-348.15 1031.12,-370.65 1061.88,-370.65 1061.88,-348.15 1031.12,-348.15"/>
+<text text-anchor="start" x="1034.12" y="-354.35" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="1067.59" y1="-367.36" x2="1095.16" y2="-351.45" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_2)" stroke="none" points="1061.88,-348.15 1061.88,-370.65 1100.88,-370.65 1100.88,-348.15 1061.88,-348.15"/>
+<polygon fill="none" stroke="black" points="1061.88,-348.15 1061.88,-370.65 1100.88,-370.65 1100.88,-348.15 1061.88,-348.15"/>
+<text text-anchor="start" x="1064.88" y="-354.35" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_S2 -->
+<g id="edge38" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_S2</title>
+<path fill="none" stroke="black" d="M1001.53,-628.67C1012.68,-584.04 1041.67,-468.04 1056.68,-407.95"/>
+<polygon fill="black" stroke="black" points="1060,-409.09 1059.03,-398.54 1053.21,-407.39 1060,-409.09"/>
+</g>
+<!-- STRUCT_SN -->
+<g id="node28" class="node">
+<title>STRUCT_SN</title>
+<polygon fill="none" stroke="none" points="1237.88,-408.4 1152.12,-408.4 1152.12,-332.9 1237.88,-332.9 1237.88,-408.4"/>
+<polygon fill="lightgreen" stroke="none" points="1160.12,-381.9 1160.12,-404.4 1190.88,-404.4 1190.88,-381.9 1160.12,-381.9"/>
+<polygon fill="none" stroke="black" points="1160.12,-381.9 1160.12,-404.4 1190.88,-404.4 1190.88,-381.9 1160.12,-381.9"/>
+<text text-anchor="start" x="1163.12" y="-388.1" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_3" gradientUnits="userSpaceOnUse" x1="1196.59" y1="-401.11" x2="1224.16" y2="-385.2" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_3)" stroke="none" points="1190.88,-381.9 1190.88,-404.4 1229.88,-404.4 1229.88,-381.9 1190.88,-381.9"/>
+<polygon fill="none" stroke="black" points="1190.88,-381.9 1190.88,-404.4 1229.88,-404.4 1229.88,-381.9 1190.88,-381.9"/>
+<text text-anchor="start" x="1193.88" y="-388.1" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="1160.12,-359.4 1160.12,-381.9 1190.88,-381.9 1190.88,-359.4 1160.12,-359.4"/>
+<polygon fill="none" stroke="black" points="1160.12,-359.4 1160.12,-381.9 1190.88,-381.9 1190.88,-359.4 1160.12,-359.4"/>
+<text text-anchor="start" x="1166.12" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">... &#160;</text>
+<defs>
+<linearGradient id="l_4" gradientUnits="userSpaceOnUse" x1="1196.59" y1="-378.61" x2="1224.16" y2="-362.7" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_4)" stroke="none" points="1190.88,-359.4 1190.88,-381.9 1229.88,-381.9 1229.88,-359.4 1190.88,-359.4"/>
+<polygon fill="none" stroke="black" points="1190.88,-359.4 1190.88,-381.9 1229.88,-381.9 1229.88,-359.4 1190.88,-359.4"/>
+<text text-anchor="start" x="1193.88" y="-365.6" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="lightgreen" stroke="none" points="1160.12,-336.9 1160.12,-359.4 1190.88,-359.4 1190.88,-336.9 1160.12,-336.9"/>
+<polygon fill="none" stroke="black" points="1160.12,-336.9 1160.12,-359.4 1190.88,-359.4 1190.88,-336.9 1160.12,-336.9"/>
+<text text-anchor="start" x="1163.12" y="-343.1" font-family="Times New Roman,serif" font-size="14.00">field</text>
+<defs>
+<linearGradient id="l_5" gradientUnits="userSpaceOnUse" x1="1196.59" y1="-356.11" x2="1224.16" y2="-340.2" >
+<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
+<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
+</linearGradient>
+</defs>
+<polygon fill="url(#l_5)" stroke="none" points="1190.88,-336.9 1190.88,-359.4 1229.88,-359.4 1229.88,-336.9 1190.88,-336.9"/>
+<polygon fill="none" stroke="black" points="1190.88,-336.9 1190.88,-359.4 1229.88,-359.4 1229.88,-336.9 1190.88,-336.9"/>
+<text text-anchor="start" x="1193.88" y="-343.1" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_SN -->
+<g id="edge39" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_SN</title>
+<path fill="none" stroke="black" d="M1009.69,-629.1C1039.89,-586.98 1116.85,-479.64 1161.52,-417.35"/>
+<polygon fill="black" stroke="black" points="1164.27,-419.52 1167.25,-409.35 1158.58,-415.44 1164.27,-419.52"/>
+</g>
+<!-- STRUCT_BOT -->
+<g id="node25" class="node">
+<title>STRUCT_BOT</title>
+<ellipse fill="lightgreen" stroke="black" cx="995" cy="-104.75" rx="44.7" ry="18"/>
+<text text-anchor="start" x="970.25" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="986" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+</g>
+<!-- STRUCT_BOT&#45;&gt;BOT -->
+<g id="edge43" class="edge">
+<title>STRUCT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M967.59,-90.27C937.27,-75.36 888.65,-51.46 857.79,-36.28"/>
+<polygon fill="black" stroke="black" points="859.56,-33.25 849.04,-31.98 856.47,-39.53 859.56,-33.25"/>
+</g>
+<!-- STRUCT_S1&#45;&gt;STRUCT_BOT -->
+<g id="edge40" class="edge">
+<title>STRUCT_S1&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="black" d="M940.9,-352.79C950.72,-307.77 976.56,-189.3 988.62,-133.98"/>
+<polygon fill="black" stroke="black" points="992.01,-134.88 990.72,-124.36 985.17,-133.38 992.01,-134.88"/>
+</g>
+<!-- STRUCT_S1&#45;&gt;STRUCT_S2 -->
+<!-- STRUCT_S2&#45;&gt;STRUCT_BOT -->
+<g id="edge41" class="edge">
+<title>STRUCT_S2&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="black" d="M1058.93,-344.18C1045.59,-294.22 1016.79,-186.34 1002.86,-134.18"/>
+<polygon fill="black" stroke="black" points="1006.24,-133.28 1000.28,-124.52 999.48,-135.08 1006.24,-133.28"/>
+</g>
+<!-- STRUCT_S2&#45;&gt;STRUCT_SN -->
+<!-- STRUCT_SN&#45;&gt;STRUCT_BOT -->
+<g id="edge42" class="edge">
+<title>STRUCT_SN&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="black" d="M1166.77,-333.12C1125.77,-278.61 1050.75,-178.87 1014.99,-131.32"/>
+<polygon fill="black" stroke="black" points="1017.9,-129.37 1009.09,-123.48 1012.3,-133.58 1017.9,-129.37"/>
+</g>
+<!-- MEM_ALIAS1 -->
+<g id="node31" class="node">
+<title>MEM_ALIAS1</title>
+<ellipse fill="blue" stroke="black" cx="1301" cy="-370.65" rx="20.13" ry="20.13"/>
+<text text-anchor="middle" x="1301" y="-365.6" font-family="Times New Roman,serif" font-size="14.00" fill="white">#1</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIAS1 -->
+<g id="edge47" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIAS1</title>
+<path fill="none" stroke="black" d="M1343.05,-628.67C1335.53,-582.52 1315.58,-460.09 1306.11,-402.04"/>
+<polygon fill="black" stroke="black" points="1309.57,-401.48 1304.51,-392.17 1302.66,-402.6 1309.57,-401.48"/>
+</g>
+<!-- MEM_ALIASDOTS -->
+<g id="node32" class="node">
+<title>MEM_ALIASDOTS</title>
+<ellipse fill="blue" stroke="black" cx="1391" cy="-370.65" rx="27" ry="18"/>
+<text text-anchor="middle" x="1391" y="-365.6" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIASDOTS -->
+<g id="edge48" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIASDOTS</title>
+<path fill="none" stroke="black" d="M1348.95,-628.67C1356.56,-581.96 1376.91,-457.11 1386.23,-399.95"/>
+<polygon fill="black" stroke="black" points="1389.64,-400.76 1387.79,-390.33 1382.73,-399.64 1389.64,-400.76"/>
+</g>
+<!-- MEM_ALIASN -->
+<g id="node33" class="node">
+<title>MEM_ALIASN</title>
+<ellipse fill="blue" stroke="black" cx="1481" cy="-370.65" rx="20.13" ry="20.13"/>
+<text text-anchor="middle" x="1481" y="-365.6" font-family="Times New Roman,serif" font-size="14.00" fill="white">#n</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIASN -->
+<g id="edge49" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIASN</title>
+<path fill="none" stroke="black" d="M1354.86,-628.67C1377.84,-581.67 1439.5,-455.54 1467.2,-398.89"/>
+<polygon fill="black" stroke="black" points="1470.2,-400.72 1471.44,-390.2 1463.91,-397.64 1470.2,-400.72"/>
+</g>
+<!-- MEM_BOT -->
+<g id="node30" class="node">
+<title>MEM_BOT</title>
+<ellipse fill="blue" stroke="black" cx="1346" cy="-104.75" rx="43.67" ry="18"/>
+<text text-anchor="start" x="1322" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
+<text text-anchor="start" x="1337.75" y="-100.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+</g>
+<!-- MEM_BOT&#45;&gt;BOT -->
+<g id="edge53" class="edge">
+<title>MEM_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M1305.86,-97.41C1206.64,-81.75 951.34,-41.44 861.15,-27.2"/>
+<polygon fill="black" stroke="black" points="861.94,-23.78 851.52,-25.68 860.85,-30.7 861.94,-23.78"/>
+</g>
+<!-- MEM_ALIAS1&#45;&gt;MEM_BOT -->
+<g id="edge50" class="edge">
+<title>MEM_ALIAS1&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1304.38,-350.67C1312.23,-304.29 1331.71,-189.17 1340.97,-134.49"/>
+<polygon fill="black" stroke="black" points="1344.41,-135.12 1342.63,-124.67 1337.51,-133.95 1344.41,-135.12"/>
+</g>
+<!-- MEM_ALIAS1&#45;&gt;MEM_ALIASDOTS -->
+<!-- MEM_ALIASDOTS&#45;&gt;MEM_BOT -->
+<g id="edge51" class="edge">
+<title>MEM_ALIASDOTS&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1387.91,-352.38C1380.25,-307.12 1360.35,-189.52 1350.99,-134.26"/>
+<polygon fill="black" stroke="black" points="1354.49,-133.92 1349.37,-124.65 1347.58,-135.09 1354.49,-133.92"/>
+</g>
+<!-- MEM_ALIASDOTS&#45;&gt;MEM_ALIASN -->
+<!-- MEM_ALIASN&#45;&gt;MEM_BOT -->
+<g id="edge52" class="edge">
+<title>MEM_ALIASN&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1471.72,-352.38C1448.54,-306.73 1388,-187.47 1360.26,-132.83"/>
+<polygon fill="black" stroke="black" points="1363.5,-131.48 1355.85,-124.15 1357.26,-134.65 1363.5,-131.48"/>
+</g>
+<!-- TUPLE1 -->
+<g id="node36" class="node">
+<title>TUPLE1</title>
+<polygon fill="none" stroke="none" points="1598,-397.15 1544,-397.15 1544,-344.15 1598,-344.15 1598,-397.15"/>
+<polygon fill="pink" stroke="none" points="1552.25,-370.65 1552.25,-393.15 1589.75,-393.15 1589.75,-370.65 1552.25,-370.65"/>
+<polygon fill="none" stroke="black" points="1552.25,-370.65 1552.25,-393.15 1589.75,-393.15 1589.75,-370.65 1552.25,-370.65"/>
+<text text-anchor="start" x="1555.25" y="-376.85" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1552.25,-348.15 1552.25,-370.65 1589.75,-370.65 1589.75,-348.15 1552.25,-348.15"/>
+<polygon fill="none" stroke="black" points="1552.25,-348.15 1552.25,-370.65 1589.75,-370.65 1589.75,-348.15 1552.25,-348.15"/>
+<text text-anchor="start" x="1559.38" y="-354.35" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLE1 -->
+<g id="edge57" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLE1</title>
+<path fill="none" stroke="black" d="M1615.85,-628.67C1608.11,-584.13 1588.01,-468.52 1577.55,-408.33"/>
+<polygon fill="black" stroke="black" points="1581.01,-407.81 1575.85,-398.56 1574.12,-409.01 1581.01,-407.81"/>
+</g>
+<!-- TUPLE2 -->
+<g id="node37" class="node">
+<title>TUPLE2</title>
+<polygon fill="none" stroke="none" points="1695,-408.4 1641,-408.4 1641,-332.9 1695,-332.9 1695,-408.4"/>
+<polygon fill="pink" stroke="none" points="1649.25,-381.9 1649.25,-404.4 1686.75,-404.4 1686.75,-381.9 1649.25,-381.9"/>
+<polygon fill="none" stroke="black" points="1649.25,-381.9 1649.25,-404.4 1686.75,-404.4 1686.75,-381.9 1649.25,-381.9"/>
+<text text-anchor="start" x="1652.25" y="-388.1" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1649.25,-359.4 1649.25,-381.9 1686.75,-381.9 1686.75,-359.4 1649.25,-359.4"/>
+<polygon fill="none" stroke="black" points="1649.25,-359.4 1649.25,-381.9 1686.75,-381.9 1686.75,-359.4 1649.25,-359.4"/>
+<text text-anchor="start" x="1656.38" y="-365.6" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="1649.25,-336.9 1649.25,-359.4 1686.75,-359.4 1686.75,-336.9 1649.25,-336.9"/>
+<polygon fill="none" stroke="black" points="1649.25,-336.9 1649.25,-359.4 1686.75,-359.4 1686.75,-336.9 1649.25,-336.9"/>
+<text text-anchor="start" x="1656.38" y="-343.1" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLE2 -->
+<g id="edge58" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLE2</title>
+<path fill="none" stroke="black" d="M1622.22,-628.67C1629.67,-586.65 1648.35,-481.4 1659.41,-419.08"/>
+<polygon fill="black" stroke="black" points="1662.81,-419.91 1661.11,-409.46 1655.92,-418.69 1662.81,-419.91"/>
+</g>
+<!-- TUPLEN -->
+<g id="node38" class="node">
+<title>TUPLEN</title>
+<polygon fill="none" stroke="none" points="1792,-419.65 1738,-419.65 1738,-321.65 1792,-321.65 1792,-419.65"/>
+<polygon fill="pink" stroke="none" points="1746.25,-393.15 1746.25,-415.65 1783.75,-415.65 1783.75,-393.15 1746.25,-393.15"/>
+<polygon fill="none" stroke="black" points="1746.25,-393.15 1746.25,-415.65 1783.75,-415.65 1783.75,-393.15 1746.25,-393.15"/>
+<text text-anchor="start" x="1749.25" y="-399.35" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
+<polygon fill="black" stroke="none" points="1746.25,-370.65 1746.25,-393.15 1783.75,-393.15 1783.75,-370.65 1746.25,-370.65"/>
+<polygon fill="none" stroke="black" points="1746.25,-370.65 1746.25,-393.15 1783.75,-393.15 1783.75,-370.65 1746.25,-370.65"/>
+<text text-anchor="start" x="1753.38" y="-376.85" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="1746.25,-348.15 1746.25,-370.65 1783.75,-370.65 1783.75,-348.15 1746.25,-348.15"/>
+<polygon fill="none" stroke="black" points="1746.25,-348.15 1746.25,-370.65 1783.75,-370.65 1783.75,-348.15 1746.25,-348.15"/>
+<text text-anchor="start" x="1759.38" y="-354.35" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+<polygon fill="black" stroke="none" points="1746.25,-325.65 1746.25,-348.15 1783.75,-348.15 1783.75,-325.65 1746.25,-325.65"/>
+<polygon fill="none" stroke="black" points="1746.25,-325.65 1746.25,-348.15 1783.75,-348.15 1783.75,-325.65 1746.25,-325.65"/>
+<text text-anchor="start" x="1753.38" y="-331.85" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP&#45;&gt;TUPLEN -->
+<g id="edge59" class="edge">
+<title>TUPLE_TOP&#45;&gt;TUPLEN</title>
+<path fill="none" stroke="black" d="M1628.36,-629.1C1649.26,-589.55 1700.57,-492.51 1734.02,-429.24"/>
+<polygon fill="black" stroke="black" points="1736.95,-431.2 1738.53,-420.73 1730.76,-427.93 1736.95,-431.2"/>
+</g>
+<!-- TUPLE_BOT -->
+<g id="node35" class="node">
+<title>TUPLE_BOT</title>
+<ellipse fill="pink" stroke="black" cx="1619" cy="-104.75" rx="42.65" ry="18"/>
+<text text-anchor="start" x="1595.75" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="1611.5" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+</g>
+<!-- TUPLE_BOT&#45;&gt;BOT -->
+<g id="edge63" class="edge">
+<title>TUPLE_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M1577.91,-99.5C1438.76,-85.13 986.93,-38.44 861.54,-25.49"/>
+<polygon fill="black" stroke="black" points="861.93,-22.01 851.62,-24.46 861.21,-28.97 861.93,-22.01"/>
+</g>
+<!-- TUPLE1&#45;&gt;TUPLE_BOT -->
+<g id="edge60" class="edge">
+<title>TUPLE1&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M1575.78,-344.18C1584.8,-294.22 1604.27,-186.34 1613.69,-134.18"/>
+<polygon fill="black" stroke="black" points="1617.09,-135.01 1615.43,-124.55 1610.21,-133.77 1617.09,-135.01"/>
+</g>
+<!-- TUPLE2&#45;&gt;TUPLE_BOT -->
+<g id="edge61" class="edge">
+<title>TUPLE2&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M1661.08,-333.12C1651.23,-279.67 1633.37,-182.73 1624.42,-134.16"/>
+<polygon fill="black" stroke="black" points="1627.87,-133.59 1622.62,-124.39 1620.99,-134.86 1627.87,-133.59"/>
+</g>
+<!-- TUPLEN&#45;&gt;TUPLE_BOT -->
+<g id="edge62" class="edge">
+<title>TUPLEN&#45;&gt;TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M1738.22,-321.88C1707.66,-266.22 1658.74,-177.12 1634.15,-132.34"/>
+<polygon fill="black" stroke="black" points="1637.34,-130.87 1629.45,-123.79 1631.2,-134.24 1637.34,-130.87"/>
+</g>
+</g>
+</svg>