summaryrefslogtreecommitdiff
path: root/chapter10/docs
diff options
context:
space:
mode:
Diffstat (limited to 'chapter10/docs')
-rw-r--r--chapter10/docs/10-grammar.md128
-rw-r--r--chapter10/docs/build-graphs.sh3
-rw-r--r--chapter10/docs/example1.drawio234
-rw-r--r--chapter10/docs/example1.gv84
-rw-r--r--chapter10/docs/example1.svg321
-rw-r--r--chapter10/docs/lattice.drawio379
-rw-r--r--chapter10/docs/lattice.gv122
-rw-r--r--chapter10/docs/lattice.svg460
8 files changed, 1731 insertions, 0 deletions
diff --git a/chapter10/docs/10-grammar.md b/chapter10/docs/10-grammar.md
new file mode 100644
index 00000000..cb68df3d
--- /dev/null
+++ b/chapter10/docs/10-grammar.md
@@ -0,0 +1,128 @@
+# Grammar for Chapter 10
+
+```antlrv4
+grammar SimpleLanguage;
+
+program
+ : statement+ EOF
+ ;
+
+statement
+ : returnStatement
+ | structDeclaration
+ | declStatement
+ | blockStatment
+ | expressionStatement
+ | ifStatement
+ | whileStatement
+ | breakStatement
+ | continueStatment
+ | metaStatement
+ ;
+
+field
+ : 'int' IDENTIFIER ';'
+ ;
+
+fields
+ : field+
+ ;
+
+structDeclaration
+ : 'struct' IDENTIFIER '{' fields '}'
+ ;
+
+whileStatement
+ : 'while' '(' expression ')' statement
+ ;
+
+breakStatement
+ : 'break' ';'
+ ;
+
+continueStatement
+ : 'continue' ';'
+ ;
+
+ifStatement
+ : 'if' '(' expression ')' statement ('else' statement)?
+ ;
+
+metaStatement
+ : '#showGraph' ';'
+ ;
+
+expressionStatement
+ : IDENTIFIER '=' expression ';'
+ | fieldExpression '=' expression ';'
+ ;
+
+blockStatement
+ : '{' statement+ '}'
+ ;
+
+structName
+ : IDENTIFIER
+ ;
+
+declStatement
+ : 'int' IDENTIFIER '=' expression ';'
+ | structName IDENTIFIER ('?')? '=' expression ';'
+ ;
+
+returnStatement
+ : 'return' expression ';'
+ ;
+
+expression
+ : comparisonExpression
+ ;
+
+comparisonExpression
+ : additiveExpression (('==' | '!='| '>'| '<'| '>='| '<=') additiveExpression)*
+ ;
+
+additiveExpression
+ : multiplicativeExpression (('+' | '-') multiplicativeExpression)*
+ ;
+
+multiplicativeExpression
+ : unaryExpression (('*' | '/') unaryExpression)*
+ ;
+
+unaryExpression
+ : ('-') unaryExpression
+ | primaryExpression
+ ;
+
+newExpression
+ : 'new' IDENTIFIER
+ ;
+
+fieldExpression
+ : primaryExpresson '.' IDENTIFIER
+ ;
+
+primaryExpression
+ : IDENTIFIER
+ | INTEGER_LITERAL
+ | 'true'
+ | 'false'
+ | 'null'
+ | newExpression
+ | '(' expression ')'
+ | fieldExpression
+ ;
+
+INTEGER_LITERAL
+ : [1-9][0-9]*
+ | [0]
+ ;
+
+IDENTIFIER
+ : NON_DIGIT (NON_DIGIT | DIGIT)*
+ ;
+
+NON_DIGIT: [a-zA-Z_];
+DEC_DIGIT: [0-9];
+``` \ No newline at end of file
diff --git a/chapter10/docs/build-graphs.sh b/chapter10/docs/build-graphs.sh
new file mode 100644
index 00000000..853f50f7
--- /dev/null
+++ b/chapter10/docs/build-graphs.sh
@@ -0,0 +1,3 @@
+dot -Tsvg example1.gv > example1.svg
+dot -Tsvg lattice.gv > lattice.svg
+
diff --git a/chapter10/docs/example1.drawio b/chapter10/docs/example1.drawio
new file mode 100644
index 00000000..b3b408c5
--- /dev/null
+++ b/chapter10/docs/example1.drawio
@@ -0,0 +1,234 @@
+<mxfile host="65bd71144e">
+ <diagram id="pVfa21MziEbxiRWqA5Sa" name="Page-1">
+ <mxGraphModel dx="1780" dy="907" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
+ <root>
+ <mxCell id="0"/>
+ <mxCell id="1" parent="0"/>
+ <mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="280" y="20" width="160" height="90" as="geometry"/>
+ </mxCell>
+ <mxCell id="3" value="Start" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" vertex="1" parent="1">
+ <mxGeometry x="280" y="20" width="160" height="40" as="geometry"/>
+ </mxCell>
+ <mxCell id="4" value="$ctrl" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" vertex="1" parent="1">
+ <mxGeometry x="290" y="70" width="40" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="5" value="arg" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="340" y="70" width="40" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="6" value="Mem" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="390" y="70" width="40" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="8" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="7" target="6">
+ <mxGeometry relative="1" as="geometry"/>
+ </mxCell>
+ <mxCell id="7" value="new Vec2D" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="360" y="210" width="100" height="40" as="geometry"/>
+ </mxCell>
+ <mxCell id="9" value="#1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
+ <mxGeometry x="720" y="200" width="80" height="80" as="geometry"/>
+ </mxCell>
+ <mxCell id="12" style="edgeStyle=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="10" target="51">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="385" y="270" as="targetPoint"/>
+ <Array as="points">
+ <mxPoint x="550" y="360"/>
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="13" style="edgeStyle=none;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="10" target="9">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="550" y="230" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="10" value="Store .x" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="650" y="350" width="120" height="60" as="geometry"/>
+ </mxCell>
+ <mxCell id="11" value="alias 1" style="endArrow=classic;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="10" target="52">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="420" y="290" as="sourcePoint"/>
+ <mxPoint x="470" y="240" as="targetPoint"/>
+ <Array as="points">
+ <mxPoint x="610" y="290"/>
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="14" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="275" y="410" width="90" height="80" as="geometry"/>
+ </mxCell>
+ <mxCell id="15" value="" style="curved=1;endArrow=classic;html=1;" edge="1" parent="1" source="39" target="5">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="170" y="200" as="sourcePoint"/>
+ <mxPoint x="450" y="370" as="targetPoint"/>
+ <Array as="points"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="16" value="If" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" vertex="1" parent="1">
+ <mxGeometry x="275" y="410" width="90" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="17" value="T" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" vertex="1" parent="1">
+ <mxGeometry x="285" y="450" width="30" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="18" value="F" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" vertex="1" parent="1">
+ <mxGeometry x="325" y="450" width="30" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="19" value="Store .y" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="110" y="430" width="120" height="60" as="geometry"/>
+ </mxCell>
+ <mxCell id="20" value="" style="endArrow=classic;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="19" target="52">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="170" y="480" as="sourcePoint"/>
+ <mxPoint x="220" y="430" as="targetPoint"/>
+ <Array as="points">
+ <mxPoint x="290" y="360"/>
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="21" value="alias 2" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="20">
+ <mxGeometry x="-0.2147" y="-1" relative="1" as="geometry">
+ <mxPoint x="-15" y="30" as="offset"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="22" value="#2" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
+ <mxGeometry x="60" y="295" width="80" height="80" as="geometry"/>
+ </mxCell>
+ <mxCell id="23" value="" style="endArrow=classic;html=1;" edge="1" parent="1" source="19" target="22">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="140" y="430" as="sourcePoint"/>
+ <mxPoint x="190" y="380" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="24" value="" style="endArrow=classic;html=1;" edge="1" parent="1" source="19" target="51">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="200" y="430" as="sourcePoint"/>
+ <mxPoint x="380" y="280" as="targetPoint"/>
+ <Array as="points">
+ <mxPoint x="270" y="290"/>
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="29" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="25" target="27">
+ <mxGeometry relative="1" as="geometry"/>
+ </mxCell>
+ <mxCell id="25" value="Store .y" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="440" y="490" width="90" height="60" as="geometry"/>
+ </mxCell>
+ <mxCell id="26" value="" style="endArrow=classic;html=1;" edge="1" parent="1" source="25" target="51">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="400" y="420" as="sourcePoint"/>
+ <mxPoint x="430" y="300" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="27" value="#3" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
+ <mxGeometry x="540" y="420" width="80" height="80" as="geometry"/>
+ </mxCell>
+ <mxCell id="28" value="alias 2" style="endArrow=classic;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="25" target="52">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="320" y="520" as="sourcePoint"/>
+ <mxPoint x="350" y="450" as="targetPoint"/>
+ <Array as="points">
+ <mxPoint x="480" y="350"/>
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="30" value="Region" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" vertex="1" parent="1">
+ <mxGeometry x="250" y="600" width="120" height="60" as="geometry"/>
+ </mxCell>
+ <mxCell id="31" value="" style="endArrow=classic;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.392;exitY=-0.064;exitDx=0;exitDy=0;exitPerimeter=0;fillColor=#a20025;strokeColor=#6F0000;" edge="1" parent="1" source="30" target="17">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="265" y="570" as="sourcePoint"/>
+ <mxPoint x="315" y="520" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="32" value="" style="endArrow=classic;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;fillColor=#a20025;strokeColor=#6F0000;" edge="1" parent="1" source="30" target="18">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="310" y="570" as="sourcePoint"/>
+ <mxPoint x="360" y="520" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="35" style="edgeStyle=none;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="33" target="30">
+ <mxGeometry relative="1" as="geometry"/>
+ </mxCell>
+ <mxCell id="33" value="phi" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fad7ac;strokeColor=#b46504;fontColor=#0e0101;" vertex="1" parent="1">
+ <mxGeometry x="90" y="540" width="120" height="80" as="geometry"/>
+ </mxCell>
+ <mxCell id="36" value="" style="endArrow=classic;html=1;" edge="1" parent="1" source="33" target="19">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="170" y="560" as="sourcePoint"/>
+ <mxPoint x="220" y="510" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="37" value="" style="endArrow=classic;html=1;" edge="1" parent="1" source="33" target="25">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="170" y="560" as="sourcePoint"/>
+ <mxPoint x="220" y="510" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="38" value="" style="curved=1;endArrow=classic;html=1;startArrow=none;fillColor=#a20025;strokeColor=#6F0000;" edge="1" parent="1" source="16" target="4">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="295" y="330" as="sourcePoint"/>
+ <mxPoint x="307.14285714285734" y="80" as="targetPoint"/>
+ <Array as="points"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="39" value="==" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
+ <mxGeometry x="130" y="180" width="80" height="80" as="geometry"/>
+ </mxCell>
+ <mxCell id="41" value="#1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
+ <mxGeometry x="50" y="60" width="80" height="80" as="geometry"/>
+ </mxCell>
+ <mxCell id="42" value="" style="endArrow=classic;html=1;" edge="1" parent="1" source="39" target="41">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="140" y="150" as="sourcePoint"/>
+ <mxPoint x="190" y="100" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="49" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;fontColor=default;fillColor=#e51400;strokeColor=#B20000;" edge="1" parent="1" source="43" target="30">
+ <mxGeometry relative="1" as="geometry"/>
+ </mxCell>
+ <mxCell id="43" value="Return" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" vertex="1" parent="1">
+ <mxGeometry x="250" y="850" width="120" height="60" as="geometry"/>
+ </mxCell>
+ <mxCell id="44" value="Merge Mem" style="rounded=0;whiteSpace=wrap;html=1;fontColor=default;" vertex="1" parent="1">
+ <mxGeometry x="365" y="730" width="120" height="60" as="geometry"/>
+ </mxCell>
+ <mxCell id="45" value="" style="endArrow=classic;html=1;fontColor=default;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" target="51">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="410" y="730" as="sourcePoint"/>
+ <mxPoint x="400" y="300" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="46" value="" style="endArrow=classic;html=1;fontColor=default;" edge="1" parent="1" source="44" target="10">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="600" y="680" as="sourcePoint"/>
+ <mxPoint x="650" y="630" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="47" value="" style="endArrow=classic;html=1;fontColor=default;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="44" target="33">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="160" y="800" as="sourcePoint"/>
+ <mxPoint x="210" y="750" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="50" value="" style="endArrow=classic;html=1;fontColor=default;" edge="1" parent="1" source="43" target="44">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="305" y="860" as="sourcePoint"/>
+ <mxPoint x="355" y="810" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="51" value="ptr" style="rounded=0;whiteSpace=wrap;html=1;fontColor=default;" vertex="1" parent="1">
+ <mxGeometry x="365" y="250" width="40" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="52" value="mem" style="rounded=0;whiteSpace=wrap;html=1;fontColor=default;" vertex="1" parent="1">
+ <mxGeometry x="405" y="250" width="40" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="55" value="" style="endArrow=classic;html=1;fontColor=default;" edge="1" parent="1" source="16" target="39">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="400" y="490" as="sourcePoint"/>
+ <mxPoint x="450" y="440" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile> \ No newline at end of file
diff --git a/chapter10/docs/example1.gv b/chapter10/docs/example1.gv
new file mode 100644
index 00000000..fcc24154
--- /dev/null
+++ b/chapter10/docs/example1.gv
@@ -0,0 +1,84 @@
+digraph chapter10 {
+/*
+struct Vec2D { int x; int y; }
+
+Vec2D v = new Vec2D;
+v.x = 1;
+if (arg)
+ v.y = 2;
+else
+ v.y = 3;
+return v;
+
+*/
+ rankdir=BT;
+ ordering="in";
+ concentrate="true";
+ compound="true";
+ subgraph cluster_Nodes {
+ Start2 [ shape=plaintext label=<
+ <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
+ <TR><TD BGCOLOR="yellow">Start</TD></TR>
+ <TR><TD>
+ <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
+ <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">arg</TD><TD PORT="p2">$Vec2D_x</TD><TD PORT="p3">$Vec2D_y</TD></TR>
+ </TABLE>
+ </TD></TR>
+ </TABLE>>
+ ];
+ Stop3 [ shape=box style=filled fillcolor=yellow label="Stop" ];
+ New8 [ label="new Vec2D" ];
+ Con_9 [ label="#0" ];
+ Store10 [ label="Store" ];
+ Store11 [ label="Store" ];
+ Con_12 [ label="#1" ];
+ Store13 [ label="Store" ];
+ If14 [ shape=plaintext label=<
+ <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
+ <TR><TD BGCOLOR="yellow">If</TD></TR>
+ <TR><TD>
+ <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
+ <TR><TD PORT="p0" BGCOLOR="yellow">True</TD><TD PORT="p1" BGCOLOR="yellow">False</TD></TR>
+ </TABLE>
+ </TD></TR>
+ </TABLE>>
+ ];
+ Con_18 [ label="#2" ];
+ Store19 [ label="Store" ];
+ Con_20 [ label="#3" ];
+ Store21 [ label="Store" ];
+ Region22 [ shape=box style=filled fillcolor=yellow label="Region" ];
+ Phi_Vec2D_y23 [ style=filled fillcolor=lightyellow label="&phi;_$Vec2D_y" ];
+ Return24 [ shape=box style=filled fillcolor=yellow label="Return" ];
+ { rank=same; Region22;Phi_Vec2D_y23;}
+ }
+ edge [ fontname=Helvetica, fontsize=8 ];
+ Stop3 -> Return24[taillabel=0 color=red];
+ New8 -> Start2:p0[taillabel=0 color=green];
+ Store10 -> Start2:p2[taillabel=1];
+ Store10 -> New8[taillabel=2];
+ Store10 -> Con_9[taillabel=3];
+ Store11 -> Start2:p3[taillabel=1];
+ Store11 -> New8[taillabel=2];
+ Store11 -> Con_9[taillabel=3];
+ Store13 -> Store10[taillabel=1];
+ Store13 -> New8[taillabel=2];
+ Store13 -> Con_12[taillabel=3];
+ If14 -> Start2:p0[taillabel=0 color=red];
+ If14 -> Start2:p1[taillabel=1];
+ Store19 -> Store11[taillabel=1];
+ Store19 -> New8[taillabel=2];
+ Store19 -> Con_18[taillabel=3];
+ Store21 -> Store11[taillabel=1];
+ Store21 -> New8[taillabel=2];
+ Store21 -> Con_20[taillabel=3];
+ Region22 -> If14:p0[taillabel=1 color=red];
+ Region22 -> If14:p1[taillabel=2 color=red];
+ Phi_Vec2D_y23 -> Region22 [style=dotted taillabel=0];
+ Phi_Vec2D_y23 -> Store19[taillabel=1];
+ Phi_Vec2D_y23 -> Store21[taillabel=2 constraint=false];
+ Return24 -> Region22[taillabel=0 color=red];
+ Return24 -> New8[taillabel=1];
+ Return24 -> Store13[taillabel=2];
+ Return24 -> Phi_Vec2D_y23[taillabel=3];
+}
diff --git a/chapter10/docs/example1.svg b/chapter10/docs/example1.svg
new file mode 100644
index 00000000..0c2dfa4d
--- /dev/null
+++ b/chapter10/docs/example1.svg
@@ -0,0 +1,321 @@
+<?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: chapter10 Pages: 1 -->
+<svg width="518pt" height="564pt"
+ viewBox="0.00 0.00 518.00 564.00" 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 560)">
+<title>chapter10</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-560 514,-560 514,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>cluster_Nodes</title>
+<polygon fill="none" stroke="black" points="8,-8 8,-548 502,-548 502,-8 8,-8"/>
+</g>
+<!-- Start2 -->
+<g id="node1" class="node">
+<title>Start2</title>
+<polygon fill="yellow" stroke="transparent" points="212,-511 212,-536 487,-536 487,-511 212,-511"/>
+<polygon fill="none" stroke="black" points="212,-511 212,-536 487,-536 487,-511 212,-511"/>
+<text text-anchor="start" x="331" y="-519.8" font-family="Times,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="212,-480 212,-511 487,-511 487,-480 212,-480"/>
+<polygon fill="yellow" stroke="transparent" points="217,-485 217,-506 257,-506 257,-485 217,-485"/>
+<polygon fill="none" stroke="black" points="217,-485 217,-506 257,-506 257,-485 217,-485"/>
+<text text-anchor="start" x="220" y="-491.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="257,-485 257,-506 288,-506 288,-485 257,-485"/>
+<text text-anchor="start" x="260" y="-491.8" font-family="Times,serif" font-size="14.00">arg</text>
+<polygon fill="none" stroke="black" points="288,-485 288,-506 385,-506 385,-485 288,-485"/>
+<text text-anchor="start" x="291" y="-491.8" font-family="Times,serif" font-size="14.00">$Vector2D_x</text>
+<polygon fill="none" stroke="black" points="385,-485 385,-506 482,-506 482,-485 385,-485"/>
+<text text-anchor="start" x="388" y="-491.8" font-family="Times,serif" font-size="14.00">$Vector2D_y</text>
+</g>
+<!-- Stop3 -->
+<g id="node2" class="node">
+<title>Stop3</title>
+<polygon fill="yellow" stroke="black" points="386,-52 332,-52 332,-16 386,-16 386,-52"/>
+<text text-anchor="middle" x="359" y="-30.3" font-family="Times,serif" font-size="14.00">Stop</text>
+</g>
+<!-- Return24 -->
+<g id="node16" class="node">
+<title>Return24</title>
+<polygon fill="yellow" stroke="black" points="392,-124 326,-124 326,-88 392,-88 392,-124"/>
+<text text-anchor="middle" x="359" y="-102.3" font-family="Times,serif" font-size="14.00">Return</text>
+</g>
+<!-- Stop3&#45;&gt;Return24 -->
+<g id="edge1" class="edge">
+<title>Stop3&#45;&gt;Return24</title>
+<path fill="none" stroke="red" d="M359,-52.3C359,-60.02 359,-69.29 359,-77.89"/>
+<polygon fill="red" stroke="red" points="355.5,-77.9 359,-87.9 362.5,-77.9 355.5,-77.9"/>
+<text text-anchor="middle" x="356" y="-54.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- New8 -->
+<g id="node3" class="node">
+<title>New8</title>
+<ellipse fill="none" stroke="black" cx="247" cy="-408" rx="98.58" ry="18"/>
+<text text-anchor="middle" x="247" y="-404.3" font-family="Times,serif" font-size="14.00">New Ptr(Vector2D)</text>
+</g>
+<!-- New8&#45;&gt;Start2 -->
+<g id="edge2" class="edge">
+<title>New8&#45;&gt;Start2:p0</title>
+<path fill="none" stroke="green" d="M243.39,-426.19C241,-438.85 238.14,-456.79 237.27,-474"/>
+<polygon fill="green" stroke="green" points="233.77,-473.91 237,-484 240.76,-474.1 233.77,-473.91"/>
+<text text-anchor="middle" x="240.39" y="-428.79" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Con_9 -->
+<g id="node4" class="node">
+<title>Con_9</title>
+<ellipse fill="none" stroke="black" cx="103" cy="-408" rx="27" ry="18"/>
+<text text-anchor="middle" x="103" y="-404.3" font-family="Times,serif" font-size="14.00">#0</text>
+</g>
+<!-- Store10 -->
+<g id="node5" class="node">
+<title>Store10</title>
+<ellipse fill="none" stroke="black" cx="124" cy="-322" rx="36.29" ry="18"/>
+<text text-anchor="middle" x="124" y="-318.3" font-family="Times,serif" font-size="14.00">Store</text>
+</g>
+<!-- Store10&#45;&gt;Start2 -->
+<g id="edge3" class="edge">
+<title>Store10&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M102.14,-336.54C89.28,-345.86 74.18,-359.52 67,-376 55.64,-402.08 48.58,-418.32 67,-440 103.77,-483.27 308.02,-430.84 333.41,-474.03"/>
+<polygon fill="black" stroke="black" points="330.1,-475.2 336,-484 336.87,-473.44 330.1,-475.2"/>
+<text text-anchor="middle" x="99.14" y="-339.14" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Store10&#45;&gt;New8 -->
+<g id="edge4" class="edge">
+<title>Store10&#45;&gt;New8</title>
+<path fill="none" stroke="black" d="M144.59,-337.06C163.55,-350.01 191.99,-369.44 214.1,-384.53"/>
+<polygon fill="black" stroke="black" points="212.3,-387.54 222.53,-390.29 216.25,-381.76 212.3,-387.54"/>
+<text text-anchor="middle" x="141.59" y="-339.66" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Store10&#45;&gt;Con_9 -->
+<g id="edge5" class="edge">
+<title>Store10&#45;&gt;Con_9</title>
+<path fill="none" stroke="black" d="M119.75,-340C116.88,-351.5 113.02,-366.93 109.73,-380.08"/>
+<polygon fill="black" stroke="black" points="106.27,-379.48 107.24,-390.03 113.06,-381.17 106.27,-379.48"/>
+<text text-anchor="middle" x="116.75" y="-342.6" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+</g>
+<!-- Store11 -->
+<g id="node6" class="node">
+<title>Store11</title>
+<ellipse fill="none" stroke="black" cx="326" cy="-322" rx="36.29" ry="18"/>
+<text text-anchor="middle" x="326" y="-318.3" font-family="Times,serif" font-size="14.00">Store</text>
+</g>
+<!-- Store11&#45;&gt;Start2 -->
+<g id="edge6" class="edge">
+<title>Store11&#45;&gt;Start2:p3</title>
+<path fill="none" stroke="black" d="M336.29,-339.76C342.27,-349.98 349.67,-363.45 355,-376 366.65,-403.43 357.77,-415.68 375,-440 391.62,-463.46 424.6,-454.4 432.35,-474.07"/>
+<polygon fill="black" stroke="black" points="428.9,-474.71 434,-484 435.81,-473.56 428.9,-474.71"/>
+<text text-anchor="middle" x="333.29" y="-342.36" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Store11&#45;&gt;New8 -->
+<g id="edge7" class="edge">
+<title>Store11&#45;&gt;New8</title>
+<path fill="none" stroke="black" d="M311.14,-338.8C299.53,-351.15 283.18,-368.53 269.89,-382.66"/>
+<polygon fill="black" stroke="black" points="267.18,-380.44 262.88,-390.12 272.28,-385.23 267.18,-380.44"/>
+<text text-anchor="middle" x="308.14" y="-341.4" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Store11&#45;&gt;Con_9 -->
+<g id="edge8" class="edge">
+<title>Store11&#45;&gt;Con_9</title>
+<path fill="none" stroke="black" d="M294.91,-331.44C243.56,-345.42 145.98,-372.24 139,-376 134.01,-378.69 129.1,-382.17 124.59,-385.82"/>
+<polygon fill="black" stroke="black" points="122.22,-383.24 116.98,-392.45 126.82,-388.52 122.22,-383.24"/>
+<text text-anchor="middle" x="291.91" y="-334.04" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+</g>
+<!-- Con_12 -->
+<g id="node7" class="node">
+<title>Con_12</title>
+<ellipse fill="none" stroke="black" cx="43" cy="-322" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-318.3" font-family="Times,serif" font-size="14.00">#1</text>
+</g>
+<!-- Store13 -->
+<g id="node8" class="node">
+<title>Store13</title>
+<ellipse fill="none" stroke="black" cx="146" cy="-250" rx="36.29" ry="18"/>
+<text text-anchor="middle" x="146" y="-246.3" font-family="Times,serif" font-size="14.00">Store</text>
+</g>
+<!-- Store13&#45;&gt;New8 -->
+<g id="edge10" class="edge">
+<title>Store13&#45;&gt;New8</title>
+<path fill="none" stroke="black" d="M153.54,-267.95C163.49,-290.05 180.7,-327.38 189,-340 198.92,-355.08 211.92,-370.41 223.11,-382.59"/>
+<polygon fill="black" stroke="black" points="220.75,-385.2 230.14,-390.11 225.86,-380.41 220.75,-385.2"/>
+<text text-anchor="middle" x="150.54" y="-270.55" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Store13&#45;&gt;Store10 -->
+<g id="edge9" class="edge">
+<title>Store13&#45;&gt;Store10</title>
+<path fill="none" stroke="black" d="M140.67,-267.95C138.22,-275.74 135.26,-285.18 132.51,-293.92"/>
+<polygon fill="black" stroke="black" points="129.09,-293.14 129.43,-303.72 135.77,-295.23 129.09,-293.14"/>
+<text text-anchor="middle" x="137.67" y="-270.55" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Store13&#45;&gt;Con_12 -->
+<g id="edge11" class="edge">
+<title>Store13&#45;&gt;Con_12</title>
+<path fill="none" stroke="black" d="M125.16,-265.17C109.24,-275.98 87.18,-290.98 69.92,-302.7"/>
+<polygon fill="black" stroke="black" points="67.7,-299.98 61.4,-308.5 71.63,-305.77 67.7,-299.98"/>
+<text text-anchor="middle" x="122.16" y="-267.77" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+</g>
+<!-- If14 -->
+<g id="node9" class="node">
+<title>If14</title>
+<polygon fill="yellow" stroke="transparent" points="392,-411 392,-436 486,-436 486,-411 392,-411"/>
+<polygon fill="none" stroke="black" points="392,-411 392,-436 486,-436 486,-411 392,-411"/>
+<text text-anchor="start" x="433.5" y="-419.8" font-family="Times,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="392,-380 392,-411 486,-411 486,-380 392,-380"/>
+<polygon fill="yellow" stroke="transparent" points="397,-385 397,-406 437,-406 437,-385 397,-385"/>
+<polygon fill="none" stroke="black" points="397,-385 397,-406 437,-406 437,-385 397,-385"/>
+<text text-anchor="start" x="400" y="-391.8" font-family="Times,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="transparent" points="437,-385 437,-406 481,-406 481,-385 437,-385"/>
+<polygon fill="none" stroke="black" points="437,-385 437,-406 481,-406 481,-385 437,-385"/>
+<text text-anchor="start" x="440" y="-391.8" font-family="Times,serif" font-size="14.00">False</text>
+</g>
+<!-- If14&#45;&gt;Start2 -->
+<g id="edge12" class="edge">
+<title>If14&#45;&gt;Start2:p0</title>
+<path fill="none" stroke="red" d="M383.85,-434.38C379.19,-436.34 374.53,-438.24 370,-440 315.48,-461.2 246.02,-426.45 237.8,-473.79"/>
+<polygon fill="red" stroke="red" points="234.3,-473.76 237,-484 241.27,-474.31 234.3,-473.76"/>
+<text text-anchor="middle" x="380.85" y="-427.98" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- If14&#45;&gt;Start2 -->
+<g id="edge13" class="edge">
+<title>If14&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="black" d="M383.86,-433.77C346.61,-450.49 300.83,-471.05 281.42,-479.77"/>
+<polygon fill="black" stroke="black" points="279.69,-476.71 272,-484 282.56,-483.1 279.69,-476.71"/>
+<text text-anchor="middle" x="380.86" y="-436.37" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Con_18 -->
+<g id="node10" class="node">
+<title>Con_18</title>
+<ellipse fill="none" stroke="black" cx="225" cy="-322" rx="27" ry="18"/>
+<text text-anchor="middle" x="225" y="-318.3" font-family="Times,serif" font-size="14.00">#2</text>
+</g>
+<!-- Store19 -->
+<g id="node11" class="node">
+<title>Store19</title>
+<ellipse fill="none" stroke="black" cx="281" cy="-250" rx="36.29" ry="18"/>
+<text text-anchor="middle" x="281" y="-246.3" font-family="Times,serif" font-size="14.00">Store</text>
+</g>
+<!-- Store19&#45;&gt;New8 -->
+<g id="edge15" class="edge">
+<title>Store19&#45;&gt;New8</title>
+<path fill="none" stroke="black" d="M277.3,-267.99C271.45,-294.81 260.03,-347.21 253,-379.46"/>
+<polygon fill="black" stroke="black" points="249.51,-379.04 250.8,-389.55 256.35,-380.53 249.51,-379.04"/>
+<text text-anchor="middle" x="274.3" y="-270.59" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Store19&#45;&gt;Store11 -->
+<g id="edge14" class="edge">
+<title>Store19&#45;&gt;Store11</title>
+<path fill="none" stroke="black" d="M291.66,-267.59C297.1,-276.05 303.83,-286.51 309.88,-295.92"/>
+<polygon fill="black" stroke="black" points="307.06,-298.01 315.41,-304.53 312.95,-294.23 307.06,-298.01"/>
+<text text-anchor="middle" x="288.66" y="-270.19" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Store19&#45;&gt;Con_18 -->
+<g id="edge16" class="edge">
+<title>Store19&#45;&gt;Con_18</title>
+<path fill="none" stroke="black" d="M268.29,-266.88C261.03,-275.96 251.79,-287.51 243.71,-297.61"/>
+<polygon fill="black" stroke="black" points="240.79,-295.66 237.27,-305.66 246.25,-300.04 240.79,-295.66"/>
+<text text-anchor="middle" x="265.29" y="-269.48" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+</g>
+<!-- Con_20 -->
+<g id="node12" class="node">
+<title>Con_20</title>
+<ellipse fill="none" stroke="black" cx="427" cy="-322" rx="27" ry="18"/>
+<text text-anchor="middle" x="427" y="-318.3" font-family="Times,serif" font-size="14.00">#3</text>
+</g>
+<!-- Store21 -->
+<g id="node13" class="node">
+<title>Store21</title>
+<ellipse fill="none" stroke="black" cx="381" cy="-250" rx="36.29" ry="18"/>
+<text text-anchor="middle" x="381" y="-246.3" font-family="Times,serif" font-size="14.00">Store</text>
+</g>
+<!-- Store21&#45;&gt;New8 -->
+<g id="edge18" class="edge">
+<title>Store21&#45;&gt;New8</title>
+<path fill="none" stroke="black" d="M383.48,-267.99C385.36,-287.16 385.53,-318.48 371,-340 355.77,-362.56 330.37,-378.17 306.51,-388.6"/>
+<polygon fill="black" stroke="black" points="305.01,-385.43 297.11,-392.49 307.69,-391.9 305.01,-385.43"/>
+<text text-anchor="middle" x="380.48" y="-270.59" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Store21&#45;&gt;Store11 -->
+<g id="edge17" class="edge">
+<title>Store21&#45;&gt;Store11</title>
+<path fill="none" stroke="black" d="M368.24,-267.24C361.3,-276.07 352.58,-287.17 344.87,-296.99"/>
+<polygon fill="black" stroke="black" points="342.11,-294.83 338.69,-304.85 347.62,-299.15 342.11,-294.83"/>
+<text text-anchor="middle" x="365.24" y="-269.84" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Store21&#45;&gt;Con_20 -->
+<g id="edge19" class="edge">
+<title>Store21&#45;&gt;Con_20</title>
+<path fill="none" stroke="black" d="M391.67,-267.24C397.44,-276.02 404.68,-287.04 411.1,-296.81"/>
+<polygon fill="black" stroke="black" points="408.29,-298.9 416.71,-305.33 414.14,-295.06 408.29,-298.9"/>
+<text text-anchor="middle" x="388.67" y="-269.84" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+</g>
+<!-- Region22 -->
+<g id="node14" class="node">
+<title>Region22</title>
+<polygon fill="yellow" stroke="black" points="494,-196 428,-196 428,-160 494,-160 494,-196"/>
+<text text-anchor="middle" x="461" y="-174.3" font-family="Times,serif" font-size="14.00">Region</text>
+</g>
+<!-- Region22&#45;&gt;If14 -->
+<g id="edge20" class="edge">
+<title>Region22&#45;&gt;If14:p0</title>
+<path fill="none" stroke="red" d="M468.66,-196.11C481.18,-226.8 502.33,-292.46 478,-340 464.62,-366.15 427.64,-354.5 418.88,-373.99"/>
+<polygon fill="red" stroke="red" points="415.4,-373.53 417,-384 422.28,-374.82 415.4,-373.53"/>
+<text text-anchor="middle" x="465.66" y="-198.71" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Phi_Vector2D_y23 -->
+<g id="node15" class="node">
+<title>Phi_Vector2D_y23</title>
+<ellipse fill="lightyellow" stroke="black" cx="310" cy="-178" rx="79.89" ry="18"/>
+<text text-anchor="middle" x="310" y="-174.3" font-family="Times,serif" font-size="14.00">φ_$Vector2D_y</text>
+</g>
+<!-- Phi_Vector2D_y23&#45;&gt;Store19 -->
+<g id="edge23" class="edge">
+<title>Phi_Vector2D_y23&#45;&gt;Store19</title>
+<path fill="none" stroke="black" d="M302.98,-195.95C299.63,-204.03 295.55,-213.88 291.82,-222.89"/>
+<polygon fill="black" stroke="black" points="288.55,-221.63 287.96,-232.21 295.02,-224.31 288.55,-221.63"/>
+<text text-anchor="middle" x="299.98" y="-198.55" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Phi_Vector2D_y23&#45;&gt;Store21 -->
+<g id="edge24" class="edge">
+<title>Phi_Vector2D_y23&#45;&gt;Store21</title>
+<path fill="none" stroke="black" d="M327.19,-195.95C336.48,-205.1 348.07,-216.53 358.11,-226.43"/>
+<polygon fill="black" stroke="black" points="355.85,-229.12 365.42,-233.64 360.76,-224.13 355.85,-229.12"/>
+<text text-anchor="middle" x="324.19" y="-198.55" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Phi_Vector2D_y23&#45;&gt;Region22 -->
+<g id="edge22" class="edge">
+<title>Phi_Vector2D_y23&#45;&gt;Region22</title>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M390.22,-178C399.33,-178 408.43,-178 417.54,-178"/>
+<polygon fill="black" stroke="black" points="417.82,-181.5 427.82,-178 417.82,-174.5 417.82,-181.5"/>
+<text text-anchor="middle" x="393.22" y="-171.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Return24&#45;&gt;New8 -->
+<g id="edge26" class="edge">
+<title>Return24&#45;&gt;New8</title>
+<path fill="none" stroke="black" d="M373.77,-124.44C381.82,-134.45 391.63,-147.49 399,-160 416.77,-190.17 455.73,-269.74 463,-304 466.32,-319.65 472.49,-327.12 463,-340 453.78,-352.52 373.24,-375.2 313.19,-390.68"/>
+<polygon fill="black" stroke="black" points="312.19,-387.32 303.37,-393.19 313.93,-394.1 312.19,-387.32"/>
+<text text-anchor="middle" x="370.77" y="-127.04" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Return24&#45;&gt;Store13 -->
+<g id="edge27" class="edge">
+<title>Return24&#45;&gt;Store13</title>
+<path fill="none" stroke="black" d="M325.78,-114.7C296.32,-122.65 253.09,-137.15 221,-160 196.73,-177.27 175.54,-204.17 161.93,-223.87"/>
+<polygon fill="black" stroke="black" points="158.9,-222.11 156.23,-232.36 164.71,-226.01 158.9,-222.11"/>
+<text text-anchor="middle" x="322.78" y="-108.3" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Return24&#45;&gt;Region22 -->
+<g id="edge25" class="edge">
+<title>Return24&#45;&gt;Region22</title>
+<path fill="none" stroke="red" d="M383.95,-124.12C397.04,-133.11 413.26,-144.24 427.44,-153.97"/>
+<polygon fill="red" stroke="red" points="425.73,-157.04 435.95,-159.81 429.69,-151.27 425.73,-157.04"/>
+<text text-anchor="middle" x="380.95" y="-126.72" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Return24&#45;&gt;Phi_Vector2D_y23 -->
+<g id="edge28" class="edge">
+<title>Return24&#45;&gt;Phi_Vector2D_y23</title>
+<path fill="none" stroke="black" d="M346.89,-124.3C341.13,-132.53 334.14,-142.52 327.79,-151.58"/>
+<polygon fill="black" stroke="black" points="324.84,-149.7 321.97,-159.9 330.58,-153.71 324.84,-149.7"/>
+<text text-anchor="middle" x="343.89" y="-126.9" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+</g>
+</g>
+</svg>
diff --git a/chapter10/docs/lattice.drawio b/chapter10/docs/lattice.drawio
new file mode 100644
index 00000000..cf20e9f3
--- /dev/null
+++ b/chapter10/docs/lattice.drawio
@@ -0,0 +1,379 @@
+<mxfile host="65bd71144e">
+ <diagram id="N4dXkE2PwwjNiNYLmPMg" name="Page-1">
+ <mxGraphModel dx="1868" dy="907" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
+ <root>
+ <mxCell id="0"/>
+ <mxCell id="1" parent="0"/>
+ <mxCell id="2" value="Top" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="527.5" y="40" width="40" height="40" as="geometry"/>
+ </mxCell>
+ <mxCell id="3" value="Int Top" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="140" y="195" width="50" height="50" as="geometry"/>
+ </mxCell>
+ <mxCell id="4" value="Int Bot" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="140" y="350" width="50" height="50" as="geometry"/>
+ </mxCell>
+ <mxCell id="5" value="Bot" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="524" y="710" width="47" height="47" as="geometry"/>
+ </mxCell>
+ <mxCell id="7" value="1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="100" y="280" width="30" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="8" value="2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="130" y="278.85" width="30" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="9" value="3" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="170" y="278.85" width="30" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="10" value="n" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="220" y="278.85" width="20" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="11" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="7" target="3" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="400" y="490" as="sourcePoint"/>
+ <mxPoint x="450" y="440" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="12" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="4" target="7" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="110" y="360" as="sourcePoint"/>
+ <mxPoint x="160" y="310" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="14" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="8" target="3" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="300" y="640" as="sourcePoint"/>
+ <mxPoint x="350" y="590" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="15" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="4" target="8" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="210" y="510" as="sourcePoint"/>
+ <mxPoint x="260" y="460" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="16" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="9" target="3" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="110" y="590" as="sourcePoint"/>
+ <mxPoint x="160" y="540" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="17" value="" style="endArrow=none;html=1;" parent="1" source="4" target="9" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="140" y="410" as="sourcePoint"/>
+ <mxPoint x="190" y="360" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="18" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="10" target="3" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="350" y="280" as="sourcePoint"/>
+ <mxPoint x="400" y="230" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="19" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="4" target="10" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="280" y="380" as="sourcePoint"/>
+ <mxPoint x="330" y="330" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="20" value="" style="endArrow=none;html=1;" parent="1" source="3" target="2" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="280" y="200" as="sourcePoint"/>
+ <mxPoint x="330" y="150" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="21" value="" style="endArrow=none;html=1;" parent="1" source="5" target="4" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="180" y="540" as="sourcePoint"/>
+ <mxPoint x="230" y="490" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="22" value="*$TOP" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="580" y="115" width="50" height="50" as="geometry"/>
+ </mxCell>
+ <mxCell id="23" value="*$BOT?" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="562.5" y="540" width="75" height="75" as="geometry"/>
+ </mxCell>
+ <mxCell id="24" value="" style="endArrow=none;html=1;" parent="1" source="5" target="23" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="400" y="490" as="sourcePoint"/>
+ <mxPoint x="450" y="440" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="31" value="" style="endArrow=none;html=1;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="1" source="79" target="22" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="550" y="280" as="sourcePoint"/>
+ <mxPoint x="520" y="200" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="33" value="" style="endArrow=none;html=1;" parent="1" source="22" target="87" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="715" y="240" as="sourcePoint"/>
+ <mxPoint x="690" y="200" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="34" value="" style="endArrow=none;html=1;" parent="1" source="2" target="22" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="600" y="120" as="sourcePoint"/>
+ <mxPoint x="650" y="70" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="41" value="Struct&lt;br&gt;S1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="295" y="270" width="50" height="50" as="geometry"/>
+ </mxCell>
+ <mxCell id="42" value="Struct&lt;br&gt;S2" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="370" y="270" width="50" height="50" as="geometry"/>
+ </mxCell>
+ <mxCell id="43" value="" style="endArrow=none;html=1;" parent="1" source="41" target="56" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="343" y="240" as="sourcePoint"/>
+ <mxPoint x="333" y="210" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="44" value="" style="endArrow=none;html=1;" parent="1" source="57" target="41" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="343" y="360" as="sourcePoint"/>
+ <mxPoint x="383" y="400" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="45" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" parent="1" source="42" target="56" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="393" y="230" as="sourcePoint"/>
+ <mxPoint x="353" y="220" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="46" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="57" target="42" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="373" y="360" as="sourcePoint"/>
+ <mxPoint x="463" y="360" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="47" value="Ctrl" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="30" y="200" width="40" height="40" as="geometry"/>
+ </mxCell>
+ <mxCell id="48" value="~Ctrl" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="30" y="360" width="40" height="40" as="geometry"/>
+ </mxCell>
+ <mxCell id="49" value="" style="endArrow=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="47" target="2" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="400" y="470" as="sourcePoint"/>
+ <mxPoint x="450" y="420" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="50" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="48" target="47" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="82" y="330" as="sourcePoint"/>
+ <mxPoint x="132" y="280" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="51" value="" style="endArrow=none;html=1;entryX=1;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="5" target="48" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="120" y="500" as="sourcePoint"/>
+ <mxPoint x="170" y="450" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="55" value="" style="endArrow=none;html=1;" parent="1" source="23" target="89" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="680" y="390" as="sourcePoint"/>
+ <mxPoint x="660" y="310" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="56" value="$TOP" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="340" y="200" width="40" height="40" as="geometry"/>
+ </mxCell>
+ <mxCell id="57" value="$BOT" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="340" y="348.07" width="45" height="45" as="geometry"/>
+ </mxCell>
+ <mxCell id="58" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="56" target="2" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="400" y="490" as="sourcePoint"/>
+ <mxPoint x="450" y="440" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="59" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="5" target="57" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="540" y="710" as="sourcePoint"/>
+ <mxPoint x="590" y="660" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="61" value="MEM#TOP" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="870" y="145" width="70" height="70" as="geometry"/>
+ </mxCell>
+ <mxCell id="62" value="#3" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="870" y="303.85" width="40" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="63" value="#4" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="910" y="303.85" width="40" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="64" value="#n" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="960" y="303.85" width="50" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="65" value="" style="endArrow=none;html=1;" parent="1" source="73" target="61" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="850" y="303.85" as="sourcePoint"/>
+ <mxPoint x="895.9153428657555" y="264.99855603666845" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="66" value="" style="endArrow=none;html=1;" parent="1" source="74" target="73" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="897.322330470336" y="381.1723304703361" as="sourcePoint"/>
+ <mxPoint x="850" y="333.85" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="67" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="62" target="61" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="990" y="663.85" as="sourcePoint"/>
+ <mxPoint x="901.5781126951365" y="269.941537193357" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="68" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="74" target="62" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="903.1475044241415" y="376.8382225019774" as="sourcePoint"/>
+ <mxPoint x="950" y="483.85" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="69" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="63" target="61" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="800" y="613.85" as="sourcePoint"/>
+ <mxPoint x="912.7366063488612" y="273.7473301625265" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="70" value="" style="endArrow=none;html=1;" parent="1" source="74" target="63" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="910" y="430" as="sourcePoint"/>
+ <mxPoint x="880" y="383.85" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="71" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="64" target="61" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="1040" y="303.85" as="sourcePoint"/>
+ <mxPoint x="934.0846571342449" y="264.9985560366689" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="72" value="" style="endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="1" source="74" target="64" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="932.677669529664" y="381.1723304703361" as="sourcePoint"/>
+ <mxPoint x="1020" y="353.85" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="73" value="#2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="820" y="303.85" width="40" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="74" value="MEM#BOT" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="870" y="425" width="70" height="70" as="geometry"/>
+ </mxCell>
+ <mxCell id="75" value="" style="endArrow=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" parent="1" source="61" target="2" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="1030" y="130" as="sourcePoint"/>
+ <mxPoint x="1080" y="80" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="76" value="" style="endArrow=none;html=1;entryX=0.219;entryY=0.957;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="5" target="74" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="610" y="640" as="sourcePoint"/>
+ <mxPoint x="660" y="590" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="79" value="Null" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="450" y="296.15" width="51.92" height="51.92" as="geometry"/>
+ </mxCell>
+ <mxCell id="81" value="*void" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="700" y="295.19" width="53.85" height="53.85" as="geometry"/>
+ </mxCell>
+ <mxCell id="82" value="" style="endArrow=none;html=1;" parent="1" source="23" target="81" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="540" y="550" as="sourcePoint"/>
+ <mxPoint x="760" y="310" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="85" value="" style="endArrow=none;html=1;" parent="1" source="23" target="79" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="555" y="340" as="sourcePoint"/>
+ <mxPoint x="690" y="230" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="87" value="*S1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="630" y="240" width="38.85" height="38.85" as="geometry"/>
+ </mxCell>
+ <mxCell id="88" value="" style="endArrow=none;html=1;" parent="1" source="79" target="89" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="620" y="290" as="sourcePoint"/>
+ <mxPoint x="650" y="290" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="89" value="*S1?" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="700" y="430" width="50" height="50" as="geometry"/>
+ </mxCell>
+ <mxCell id="90" value="" style="endArrow=none;html=1;" parent="1" source="89" target="87" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="640" y="240" as="sourcePoint"/>
+ <mxPoint x="690" y="190" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="92" value="*S2" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="540" y="240" width="40" height="40" as="geometry"/>
+ </mxCell>
+ <mxCell id="93" value="" style="endArrow=none;html=1;" parent="1" source="22" target="92" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="650" y="70" as="sourcePoint"/>
+ <mxPoint x="700" y="20" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="94" value="" style="endArrow=none;html=1;" parent="1" source="81" target="92" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="680" y="640" as="sourcePoint"/>
+ <mxPoint x="730" y="590" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="95" value="" style="endArrow=none;html=1;" parent="1" source="81" target="87" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="650" y="640" as="sourcePoint"/>
+ <mxPoint x="700" y="590" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="96" value="*S2?" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
+ <mxGeometry x="598.85" y="430" width="50" height="50" as="geometry"/>
+ </mxCell>
+ <mxCell id="101" value="" style="endArrow=none;html=1;exitX=0;exitY=0;exitDx=0;exitDy=0;" parent="1" source="96" target="79" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="800" y="760" as="sourcePoint"/>
+ <mxPoint x="850" y="710" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="102" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="96" target="92" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="730" y="670" as="sourcePoint"/>
+ <mxPoint x="600" y="240" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="103" value="" style="endArrow=none;html=1;" parent="1" source="23" target="96" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="700" y="530" as="sourcePoint"/>
+ <mxPoint x="750" y="480" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="104" value="" style="endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="81" target="22" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="210" y="720" as="sourcePoint"/>
+ <mxPoint x="610" y="160" as="targetPoint"/>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="105" value="Control" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="20" y="165" width="60" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="106" value="Integer" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="140" y="165" width="60" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="107" value="Struct" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="330" y="165" width="60" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="108" value="MemPtr" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="580" y="85" width="60" height="30" as="geometry"/>
+ </mxCell>
+ <mxCell id="109" value="Mem" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="875" y="115" width="60" height="30" as="geometry"/>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile> \ No newline at end of file
diff --git a/chapter10/docs/lattice.gv b/chapter10/docs/lattice.gv
new file mode 100644
index 00000000..406a62c3
--- /dev/null
+++ b/chapter10/docs/lattice.gv
@@ -0,0 +1,122 @@
+digraph Lattice {
+ // Define nodes
+ splines=false;
+ node [shape=circle, style=filled, fillcolor=lightblue];
+ nodesep=0.6;
+
+ TOP [label="⊤"];
+ BOT [label="⊥"];
+
+ CTRL [label="Ctrl"];
+ XCTRL [label="~Ctrl"];
+
+ INT_TOP [label="IntTop"];
+ INT_BOT [label="IntBot"];
+
+ INT_MIN [label="-n"];
+ INT_MINDOTS [label="..." shape=none style=none];
+ INT_MINUS [label="-1"];
+ INT_ZERO [label="0"];
+ INT_PLUS [label="1"];
+ INT_MAXDOTS [label="..." shape=none style=none];
+ INT_MAX [label="+n"];
+
+ STRUCT_TOP [label="$TOP"];
+ STRUCT_S1 [label="S1"];
+ STRUCT_S2 [label="S2"];
+ STRUCT_BOT [label="$BOT"]
+
+ PTR_TOP [label="*$TOP"];
+ PTR_NULL [label="null"];
+ PTR_VOIDPTR [label="*void"];
+ PTR_S1 [label="*S1"];
+ PTR_S2 [label="*S2"];
+ PTR_S1OPT [label="*S1?"];
+ PTR_S2OPT [label="*S2?"];
+ PTR_BOT [label="*$BOT?"];
+
+ MEM_TOP [label="MEM#TOP"];
+ MEM_ALIAS1 [label="#1"];
+ MEM_ALIAS2 [label="#2"];
+ MEM_ALIASDOTS [label="..." shape=none style=none];
+ MEM_ALIASN [label="#n"];
+ MEM_BOT [label="MEM#BOT"];
+
+ // Define edges
+ edge [arrowhead=none];
+
+ TOP -> CTRL;
+ CTRL -> XCTRL;
+ XCTRL -> BOT;
+
+ TOP -> INT_TOP;
+ INT_TOP -> INT_MIN;
+ INT_TOP -> INT_MINDOTS;
+ INT_TOP -> INT_MINUS;
+ INT_TOP -> INT_ZERO;
+ INT_TOP -> INT_PLUS;
+ INT_TOP -> INT_MAXDOTS;
+ INT_TOP -> INT_MAX;
+ INT_MIN -> INT_BOT;
+ INT_MINDOTS -> INT_BOT;
+ INT_MINUS -> INT_BOT;
+ INT_ZERO -> INT_BOT;
+ INT_PLUS -> INT_BOT;
+ INT_MAXDOTS -> INT_BOT;
+ INT_MAX -> INT_BOT;
+ INT_BOT -> BOT;
+
+ INT_MIN -> INT_MINDOTS -> INT_MINUS -> INT_ZERO -> INT_PLUS -> INT_MAXDOTS -> INT_MAX [style=invis];
+
+ TOP -> STRUCT_TOP;
+ STRUCT_TOP -> STRUCT_S1;
+ STRUCT_TOP -> STRUCT_S2;
+ STRUCT_S1 -> STRUCT_BOT;
+ STRUCT_S2 -> STRUCT_BOT;
+ STRUCT_BOT -> BOT;
+
+ TOP -> PTR_TOP;
+ PTR_TOP -> PTR_S1;
+ PTR_TOP -> PTR_S2;
+ PTR_TOP -> PTR_NULL;
+ PTR_TOP -> PTR_VOIDPTR;
+ PTR_NULL -> PTR_BOT;
+ PTR_NULL -> PTR_S1OPT;
+ PTR_NULL -> PTR_S2OPT;
+ PTR_S1 -> PTR_S1OPT;
+ PTR_S1 -> PTR_VOIDPTR;
+ PTR_S2 -> PTR_S2OPT;
+ PTR_S2 -> PTR_VOIDPTR;
+ PTR_VOIDPTR -> PTR_BOT;
+ PTR_S1OPT -> PTR_BOT;
+ PTR_S2OPT -> PTR_BOT;
+ PTR_BOT -> BOT;
+
+ TOP -> MEM_TOP;
+ MEM_TOP -> MEM_ALIAS1;
+ MEM_TOP -> MEM_ALIAS2;
+ MEM_TOP -> MEM_ALIASDOTS;
+ MEM_TOP -> MEM_ALIASN;
+ MEM_ALIAS1 -> MEM_BOT;
+ MEM_ALIAS2 -> MEM_BOT;
+ MEM_ALIASDOTS -> MEM_BOT;
+ MEM_ALIASN -> MEM_BOT;
+ MEM_BOT -> BOT;
+
+ MEM_ALIAS1 -> MEM_ALIAS2 -> MEM_ALIASDOTS -> MEM_ALIASN [style=invis];
+
+ // Additional customization
+ {rank=same; TOP}
+ {rank=same; INT_TOP; CTRL; STRUCT_TOP; PTR_TOP; MEM_TOP;}
+ {rank=same; PTR_S1; PTR_S2;}
+ {rank=same; INT_MIN; INT_MINDOTS;
+ INT_MINUS; INT_ZERO;
+ INT_PLUS; INT_MAXDOTS;
+ INT_MAX; STRUCT_S1; STRUCT_S2;
+ PTR_NULL; PTR_VOIDPTR;
+ MEM_ALIAS1; MEM_ALIAS2;
+ MEM_ALIASDOTS; MEM_ALIASN;}
+ {rank=same; PTR_S1OPT; PTR_S2OPT;}
+ {rank=same; INT_BOT; XCTRL; STRUCT_BOT; PTR_BOT; MEM_BOT;}
+ {rank=same; BOT;}
+} \ No newline at end of file
diff --git a/chapter10/docs/lattice.svg b/chapter10/docs/lattice.svg
new file mode 100644
index 00000000..5ec4bc16
--- /dev/null
+++ b/chapter10/docs/lattice.svg
@@ -0,0 +1,460 @@
+<?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="1512pt" height="745pt"
+ viewBox="0.00 0.00 1512.20 745.25" 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 741.25)">
+<title>Lattice</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-741.25 1508.2,-741.25 1508.2,4 -4,4"/>
+<!-- TOP -->
+<g id="node1" class="node">
+<title>TOP</title>
+<ellipse fill="lightblue" stroke="black" cx="677.5" cy="-717.76" rx="19.5" ry="19.5"/>
+<text text-anchor="middle" x="677.5" y="-714.06" font-family="Times,serif" font-size="14.00">⊤</text>
+</g>
+<!-- CTRL -->
+<g id="node3" class="node">
+<title>CTRL</title>
+<ellipse fill="lightblue" stroke="black" cx="53.5" cy="-598.56" rx="28.7" ry="28.7"/>
+<text text-anchor="middle" x="53.5" y="-594.86" font-family="Times,serif" font-size="14.00">Ctrl</text>
+</g>
+<!-- TOP&#45;&gt;CTRL -->
+<g id="edge1" class="edge">
+<title>TOP&#45;&gt;CTRL</title>
+<path fill="none" stroke="black" d="M658.48,-713.18C568.82,-696.34 188.15,-624.85 81.42,-604.81"/>
+</g>
+<!-- INT_TOP -->
+<g id="node5" class="node">
+<title>INT_TOP</title>
+<ellipse fill="lightblue" stroke="black" cx="326.5" cy="-598.56" rx="40.09" ry="40.09"/>
+<text text-anchor="middle" x="326.5" y="-594.86" font-family="Times,serif" font-size="14.00">IntTop</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="M659.12,-710.62C604.04,-692.23 439.49,-637.29 364.5,-612.25"/>
+</g>
+<!-- STRUCT_TOP -->
+<g id="node14" class="node">
+<title>STRUCT_TOP</title>
+<ellipse fill="lightblue" stroke="black" cx="677.5" cy="-598.56" rx="36.29" ry="36.29"/>
+<text text-anchor="middle" x="677.5" y="-594.86" font-family="Times,serif" font-size="14.00">$TOP</text>
+</g>
+<!-- TOP&#45;&gt;STRUCT_TOP -->
+<g id="edge26" class="edge">
+<title>TOP&#45;&gt;STRUCT_TOP</title>
+<path fill="none" stroke="black" d="M677.5,-698.19C677.5,-681.28 677.5,-655.85 677.5,-635.05"/>
+</g>
+<!-- PTR_TOP -->
+<g id="node18" class="node">
+<title>PTR_TOP</title>
+<ellipse fill="lightblue" stroke="black" cx="909.5" cy="-598.56" rx="40.09" ry="40.09"/>
+<text text-anchor="middle" x="909.5" y="-594.86" font-family="Times,serif" font-size="14.00">*$TOP</text>
+</g>
+<!-- TOP&#45;&gt;PTR_TOP -->
+<g id="edge32" class="edge">
+<title>TOP&#45;&gt;PTR_TOP</title>
+<path fill="none" stroke="black" d="M694.56,-708.14C732.23,-689.11 823.19,-643.16 873.88,-617.56"/>
+</g>
+<!-- MEM_TOP -->
+<g id="node26" class="node">
+<title>MEM_TOP</title>
+<ellipse fill="lightblue" stroke="black" cx="1289.5" cy="-598.56" rx="63.89" ry="63.89"/>
+<text text-anchor="middle" x="1289.5" y="-594.86" font-family="Times,serif" font-size="14.00">MEM#TOP</text>
+</g>
+<!-- TOP&#45;&gt;MEM_TOP -->
+<g id="edge48" class="edge">
+<title>TOP&#45;&gt;MEM_TOP</title>
+<path fill="none" stroke="black" d="M696.49,-713.12C776.94,-697.71 1091.76,-637.43 1227.1,-611.51"/>
+</g>
+<!-- BOT -->
+<g id="node2" class="node">
+<title>BOT</title>
+<ellipse fill="lightblue" stroke="black" cx="676.5" cy="-19.5" rx="19.5" ry="19.5"/>
+<text text-anchor="middle" x="676.5" y="-15.8" font-family="Times,serif" font-size="14.00">⊥</text>
+</g>
+<!-- XCTRL -->
+<g id="node4" class="node">
+<title>XCTRL</title>
+<ellipse fill="lightblue" stroke="black" cx="49.5" cy="-138.69" rx="36.29" ry="36.29"/>
+<text text-anchor="middle" x="49.5" y="-134.99" font-family="Times,serif" font-size="14.00">~Ctrl</text>
+</g>
+<!-- CTRL&#45;&gt;XCTRL -->
+<g id="edge2" class="edge">
+<title>CTRL&#45;&gt;XCTRL</title>
+<path fill="none" stroke="black" d="M53.25,-569.8C52.55,-489.67 50.59,-264 49.82,-175.22"/>
+</g>
+<!-- XCTRL&#45;&gt;BOT -->
+<g id="edge3" class="edge">
+<title>XCTRL&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M85.46,-130.97C202.43,-109.11 569.57,-40.49 657.46,-24.06"/>
+</g>
+<!-- INT_MIN -->
+<g id="node7" class="node">
+<title>INT_MIN</title>
+<ellipse fill="lightblue" stroke="black" cx="19.5" cy="-373.83" rx="19.5" ry="19.5"/>
+<text text-anchor="middle" x="19.5" y="-370.13" font-family="Times,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="M293.93,-574.72C228.5,-526.83 83.24,-420.49 35.23,-385.35"/>
+</g>
+<!-- INT_MINDOTS -->
+<g id="node8" class="node">
+<title>INT_MINDOTS</title>
+<text text-anchor="middle" x="108.5" y="-370.13" font-family="Times,serif" font-size="14.00">...</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MINDOTS -->
+<g id="edge6" class="edge">
+<title>INT_TOP&#45;&gt;INT_MINDOTS</title>
+<path fill="none" stroke="black" d="M298,-569.18C252.29,-522.07 163.93,-430.97 126.23,-392.11"/>
+</g>
+<!-- INT_MINUS -->
+<g id="node9" class="node">
+<title>INT_MINUS</title>
+<ellipse fill="lightblue" stroke="black" cx="197.5" cy="-373.83" rx="19.5" ry="19.5"/>
+<text text-anchor="middle" x="197.5" y="-370.13" font-family="Times,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="M306.34,-563.45C278.21,-514.44 228.26,-427.43 207.25,-390.81"/>
+</g>
+<!-- INT_ZERO -->
+<g id="node10" class="node">
+<title>INT_ZERO</title>
+<ellipse fill="lightblue" stroke="black" cx="281.5" cy="-373.83" rx="18" ry="18"/>
+<text text-anchor="middle" x="281.5" y="-370.13" font-family="Times,serif" font-size="14.00">0</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_ZERO -->
+<g id="edge8" class="edge">
+<title>INT_TOP&#45;&gt;INT_ZERO</title>
+<path fill="none" stroke="black" d="M318.56,-558.9C308.69,-509.63 292.28,-427.68 285.08,-391.7"/>
+</g>
+<!-- INT_PLUS -->
+<g id="node11" class="node">
+<title>INT_PLUS</title>
+<ellipse fill="lightblue" stroke="black" cx="360.5" cy="-373.83" rx="18" ry="18"/>
+<text text-anchor="middle" x="360.5" y="-370.13" font-family="Times,serif" font-size="14.00">1</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_PLUS -->
+<g id="edge9" class="edge">
+<title>INT_TOP&#45;&gt;INT_PLUS</title>
+<path fill="none" stroke="black" d="M332.54,-558.64C340,-509.33 352.37,-427.55 357.8,-391.65"/>
+</g>
+<!-- INT_MAXDOTS -->
+<g id="node12" class="node">
+<title>INT_MAXDOTS</title>
+<text text-anchor="middle" x="448.5" y="-370.13" font-family="Times,serif" font-size="14.00">...</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MAXDOTS -->
+<g id="edge10" class="edge">
+<title>INT_TOP&#45;&gt;INT_MAXDOTS</title>
+<path fill="none" stroke="black" d="M345.83,-562.95C372.23,-514.31 418.59,-428.91 438.72,-391.84"/>
+</g>
+<!-- INT_MAX -->
+<g id="node13" class="node">
+<title>INT_MAX</title>
+<ellipse fill="lightblue" stroke="black" cx="543.5" cy="-373.83" rx="24.9" ry="24.9"/>
+<text text-anchor="middle" x="543.5" y="-370.13" font-family="Times,serif" font-size="14.00">+n</text>
+</g>
+<!-- INT_TOP&#45;&gt;INT_MAX -->
+<g id="edge11" class="edge">
+<title>INT_TOP&#45;&gt;INT_MAX</title>
+<path fill="none" stroke="black" d="M354.87,-569.18C400.48,-521.95 488.77,-430.51 526.13,-391.82"/>
+</g>
+<!-- INT_BOT -->
+<g id="node6" class="node">
+<title>INT_BOT</title>
+<ellipse fill="lightblue" stroke="black" cx="326.5" cy="-138.69" rx="40.09" ry="40.09"/>
+<text text-anchor="middle" x="326.5" y="-134.99" font-family="Times,serif" font-size="14.00">IntBot</text>
+</g>
+<!-- INT_BOT&#45;&gt;BOT -->
+<g id="edge19" class="edge">
+<title>INT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M364.62,-124.93C439.56,-99.83 603.55,-44.92 658.3,-26.59"/>
+</g>
+<!-- INT_MIN&#45;&gt;INT_BOT -->
+<g id="edge12" class="edge">
+<title>INT_MIN&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M35.14,-361.84C83.16,-325.06 229.13,-213.27 294.38,-163.29"/>
+</g>
+<!-- INT_MIN&#45;&gt;INT_MINDOTS -->
+<!-- INT_MINDOTS&#45;&gt;INT_BOT -->
+<g id="edge13" class="edge">
+<title>INT_MINDOTS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M125.24,-355.77C162.63,-315.44 253.21,-217.74 299.01,-168.34"/>
+</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="M206.98,-356.54C227.99,-318.25 278.79,-225.65 306.93,-174.37"/>
+</g>
+<!-- INT_MINUS&#45;&gt;INT_ZERO -->
+<!-- INT_ZERO&#45;&gt;INT_BOT -->
+<g id="edge15" class="edge">
+<title>INT_ZERO&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M284.95,-355.77C292.18,-318.02 309.02,-230.01 318.9,-178.39"/>
+</g>
+<!-- INT_ZERO&#45;&gt;INT_PLUS -->
+<!-- INT_PLUS&#45;&gt;INT_BOT -->
+<g id="edge16" class="edge">
+<title>INT_PLUS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M357.89,-355.77C352.44,-318.13 339.77,-230.51 332.3,-178.83"/>
+</g>
+<!-- INT_PLUS&#45;&gt;INT_MAXDOTS -->
+<!-- INT_MAXDOTS&#45;&gt;INT_BOT -->
+<g id="edge17" class="edge">
+<title>INT_MAXDOTS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M439.13,-355.77C419.04,-317.05 371.52,-225.46 345.07,-174.49"/>
+</g>
+<!-- INT_MAXDOTS&#45;&gt;INT_MAX -->
+<!-- INT_MAX&#45;&gt;INT_BOT -->
+<g id="edge18" class="edge">
+<title>INT_MAX&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="black" d="M526.47,-355.38C489.1,-314.89 399.62,-217.93 354.11,-168.61"/>
+</g>
+<!-- STRUCT_S1 -->
+<g id="node15" class="node">
+<title>STRUCT_S1</title>
+<ellipse fill="lightblue" stroke="black" cx="633.5" cy="-373.83" rx="23" ry="23"/>
+<text text-anchor="middle" x="633.5" y="-370.13" font-family="Times,serif" font-size="14.00">S1</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_S1 -->
+<g id="edge27" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_S1</title>
+<path fill="none" stroke="black" d="M670.43,-562.46C661.25,-515.55 645.49,-435.09 637.88,-396.19"/>
+</g>
+<!-- STRUCT_S2 -->
+<g id="node16" class="node">
+<title>STRUCT_S2</title>
+<ellipse fill="lightblue" stroke="black" cx="721.5" cy="-373.83" rx="23" ry="23"/>
+<text text-anchor="middle" x="721.5" y="-370.13" font-family="Times,serif" font-size="14.00">S2</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_S2 -->
+<g id="edge28" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_S2</title>
+<path fill="none" stroke="black" d="M684.57,-562.46C693.75,-515.55 709.5,-435.09 717.12,-396.19"/>
+</g>
+<!-- STRUCT_BOT -->
+<g id="node17" class="node">
+<title>STRUCT_BOT</title>
+<ellipse fill="lightblue" stroke="black" cx="676.5" cy="-138.69" rx="36.29" ry="36.29"/>
+<text text-anchor="middle" x="676.5" y="-134.99" font-family="Times,serif" font-size="14.00">$BOT</text>
+</g>
+<!-- STRUCT_S1&#45;&gt;STRUCT_BOT -->
+<g id="edge29" class="edge">
+<title>STRUCT_S1&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="black" d="M637.62,-351.28C645.08,-310.47 660.89,-224.05 669.88,-174.89"/>
+</g>
+<!-- STRUCT_S2&#45;&gt;STRUCT_BOT -->
+<g id="edge30" class="edge">
+<title>STRUCT_S2&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="black" d="M717.18,-351.28C709.35,-310.36 692.74,-223.57 683.35,-174.47"/>
+</g>
+<!-- STRUCT_BOT&#45;&gt;BOT -->
+<g id="edge31" class="edge">
+<title>STRUCT_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M676.5,-102.21C676.5,-81.46 676.5,-56.11 676.5,-39.2"/>
+</g>
+<!-- PTR_NULL -->
+<g id="node19" class="node">
+<title>PTR_NULL</title>
+<ellipse fill="lightblue" stroke="black" cx="815.5" cy="-373.83" rx="28.7" ry="28.7"/>
+<text text-anchor="middle" x="815.5" y="-370.13" font-family="Times,serif" font-size="14.00">null</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_NULL -->
+<g id="edge35" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_NULL</title>
+<path fill="none" stroke="black" d="M893.87,-561.2C874.87,-515.77 843.27,-440.23 826.59,-400.36"/>
+</g>
+<!-- PTR_VOIDPTR -->
+<g id="node20" class="node">
+<title>PTR_VOIDPTR</title>
+<ellipse fill="lightblue" stroke="black" cx="1008.5" cy="-373.83" rx="34.39" ry="34.39"/>
+<text text-anchor="middle" x="1008.5" y="-370.13" font-family="Times,serif" font-size="14.00">*void</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_VOIDPTR -->
+<g id="edge36" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_VOIDPTR</title>
+<path fill="none" stroke="black" d="M925.85,-561.45C945.01,-517.94 976.45,-446.57 994.53,-405.54"/>
+</g>
+<!-- PTR_S1 -->
+<g id="node21" class="node">
+<title>PTR_S1</title>
+<ellipse fill="lightblue" stroke="black" cx="909.5" cy="-471.57" rx="27.1" ry="27.1"/>
+<text text-anchor="middle" x="909.5" y="-467.87" font-family="Times,serif" font-size="14.00">*S1</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_S1 -->
+<g id="edge33" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_S1</title>
+<path fill="none" stroke="black" d="M909.5,-558.01C909.5,-538.85 909.5,-516.34 909.5,-499.23"/>
+</g>
+<!-- PTR_S2 -->
+<g id="node22" class="node">
+<title>PTR_S2</title>
+<ellipse fill="lightblue" stroke="black" cx="1093.5" cy="-471.57" rx="27.1" ry="27.1"/>
+<text text-anchor="middle" x="1093.5" y="-467.87" font-family="Times,serif" font-size="14.00">*S2</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_S2 -->
+<g id="edge34" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_S2</title>
+<path fill="none" stroke="black" d="M942.39,-575.22C979.61,-549.94 1039.19,-509.46 1071.29,-487.66"/>
+</g>
+<!-- PTR_S1OPT -->
+<g id="node23" class="node">
+<title>PTR_S1OPT</title>
+<ellipse fill="lightblue" stroke="black" cx="904.5" cy="-270.88" rx="32.49" ry="32.49"/>
+<text text-anchor="middle" x="904.5" y="-267.18" font-family="Times,serif" font-size="14.00">*S1?</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_S1OPT -->
+<g id="edge38" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_S1OPT</title>
+<path fill="none" stroke="black" d="M833.94,-351.91C848.3,-335.63 868.24,-313 883.27,-295.96"/>
+</g>
+<!-- PTR_S2OPT -->
+<g id="node24" class="node">
+<title>PTR_S2OPT</title>
+<ellipse fill="lightblue" stroke="black" cx="1012.5" cy="-270.88" rx="32.49" ry="32.49"/>
+<text text-anchor="middle" x="1012.5" y="-267.18" font-family="Times,serif" font-size="14.00">*S2?</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_S2OPT -->
+<g id="edge39" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_S2OPT</title>
+<path fill="none" stroke="black" d="M840.85,-359.84C877.53,-341.04 945.23,-306.35 983.73,-286.62"/>
+</g>
+<!-- PTR_BOT -->
+<g id="node25" class="node">
+<title>PTR_BOT</title>
+<ellipse fill="lightblue" stroke="black" cx="904.5" cy="-138.69" rx="46.29" ry="46.29"/>
+<text text-anchor="middle" x="904.5" y="-134.99" font-family="Times,serif" font-size="14.00">*$BOT?</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_BOT -->
+<g id="edge37" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="black" d="M825.71,-346.85C840.96,-306.56 869.84,-230.25 888.08,-182.07"/>
+</g>
+<!-- PTR_VOIDPTR&#45;&gt;PTR_BOT -->
+<g id="edge44" class="edge">
+<title>PTR_VOIDPTR&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="black" d="M994.47,-342.11C976.06,-300.5 943.7,-227.32 923.22,-181.01"/>
+</g>
+<!-- PTR_S1&#45;&gt;PTR_VOIDPTR -->
+<g id="edge41" class="edge">
+<title>PTR_S1&#45;&gt;PTR_VOIDPTR</title>
+<path fill="none" stroke="black" d="M929.06,-451.65C944.84,-436.4 967.12,-414.85 984.07,-398.46"/>
+</g>
+<!-- PTR_S1&#45;&gt;PTR_S1OPT -->
+<g id="edge40" class="edge">
+<title>PTR_S1&#45;&gt;PTR_S1OPT</title>
+<path fill="none" stroke="black" d="M908.81,-444.09C907.9,-407.48 906.29,-342.81 905.32,-303.69"/>
+</g>
+<!-- PTR_S2&#45;&gt;PTR_VOIDPTR -->
+<g id="edge43" class="edge">
+<title>PTR_S2&#45;&gt;PTR_VOIDPTR</title>
+<path fill="none" stroke="black" d="M1075.47,-450.27C1062.51,-435.66 1044.94,-415.87 1031.05,-400.22"/>
+</g>
+<!-- PTR_S2&#45;&gt;PTR_S2OPT -->
+<g id="edge42" class="edge">
+<title>PTR_S2&#45;&gt;PTR_S2OPT</title>
+<path fill="none" stroke="black" d="M1083.24,-446.15C1068.34,-409.24 1040.75,-340.89 1024.79,-301.33"/>
+</g>
+<!-- PTR_S1OPT&#45;&gt;PTR_BOT -->
+<g id="edge45" class="edge">
+<title>PTR_S1OPT&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="black" d="M904.5,-238.37C904.5,-222.41 904.5,-202.75 904.5,-185.19"/>
+</g>
+<!-- PTR_S2OPT&#45;&gt;PTR_BOT -->
+<g id="edge46" class="edge">
+<title>PTR_S2OPT&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="black" d="M992.18,-245.39C975.69,-225.51 952.2,-197.2 933.69,-174.88"/>
+</g>
+<!-- PTR_BOT&#45;&gt;BOT -->
+<g id="edge47" class="edge">
+<title>PTR_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M863.74,-116.74C813.14,-90.73 729.17,-47.57 693.44,-29.2"/>
+</g>
+<!-- MEM_ALIAS1 -->
+<g id="node27" class="node">
+<title>MEM_ALIAS1</title>
+<ellipse fill="lightblue" stroke="black" cx="1197.5" cy="-373.83" rx="24.9" ry="24.9"/>
+<text text-anchor="middle" x="1197.5" y="-370.13" font-family="Times,serif" font-size="14.00">#1</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIAS1 -->
+<g id="edge49" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIAS1</title>
+<path fill="none" stroke="black" d="M1265.33,-539.52C1246.21,-492.83 1220.56,-430.15 1206.93,-396.86"/>
+</g>
+<!-- MEM_ALIAS2 -->
+<g id="node28" class="node">
+<title>MEM_ALIAS2</title>
+<ellipse fill="lightblue" stroke="black" cx="1289.5" cy="-373.83" rx="24.9" ry="24.9"/>
+<text text-anchor="middle" x="1289.5" y="-370.13" font-family="Times,serif" font-size="14.00">#2</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIAS2 -->
+<g id="edge50" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIAS2</title>
+<path fill="none" stroke="black" d="M1289.5,-534.76C1289.5,-489.47 1289.5,-431.15 1289.5,-398.6"/>
+</g>
+<!-- MEM_ALIASDOTS -->
+<g id="node29" class="node">
+<title>MEM_ALIASDOTS</title>
+<text text-anchor="middle" x="1384.5" y="-370.13" font-family="Times,serif" font-size="14.00">...</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIASDOTS -->
+<g id="edge51" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIASDOTS</title>
+<path fill="none" stroke="black" d="M1314.33,-539.81C1335.12,-490.65 1363.46,-423.61 1376.87,-391.88"/>
+</g>
+<!-- MEM_ALIASN -->
+<g id="node30" class="node">
+<title>MEM_ALIASN</title>
+<ellipse fill="lightblue" stroke="black" cx="1479.5" cy="-373.83" rx="24.9" ry="24.9"/>
+<text text-anchor="middle" x="1479.5" y="-370.13" font-family="Times,serif" font-size="14.00">#n</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIASN -->
+<g id="edge52" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIASN</title>
+<path fill="none" stroke="black" d="M1330.73,-549.8C1372.31,-500.61 1434.39,-427.19 1463.43,-392.83"/>
+</g>
+<!-- MEM_ALIAS1&#45;&gt;MEM_ALIAS2 -->
+<!-- MEM_BOT -->
+<g id="node31" class="node">
+<title>MEM_BOT</title>
+<ellipse fill="lightblue" stroke="black" cx="1289.5" cy="-138.69" rx="63.89" ry="63.89"/>
+<text text-anchor="middle" x="1289.5" y="-134.99" font-family="Times,serif" font-size="14.00">MEM#BOT</text>
+</g>
+<!-- MEM_ALIAS1&#45;&gt;MEM_BOT -->
+<g id="edge53" class="edge">
+<title>MEM_ALIAS1&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1206.66,-350.42C1220.43,-315.22 1246.91,-247.53 1266.24,-198.13"/>
+</g>
+<!-- MEM_ALIAS2&#45;&gt;MEM_ALIASDOTS -->
+<!-- MEM_ALIAS2&#45;&gt;MEM_BOT -->
+<g id="edge54" class="edge">
+<title>MEM_ALIAS2&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1289.5,-349.11C1289.5,-314.68 1289.5,-251.08 1289.5,-202.78"/>
+</g>
+<!-- MEM_ALIASDOTS&#45;&gt;MEM_ALIASN -->
+<!-- MEM_ALIASDOTS&#45;&gt;MEM_BOT -->
+<g id="edge55" class="edge">
+<title>MEM_ALIASDOTS&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1377.2,-355.77C1363.73,-322.43 1334.42,-249.88 1313.39,-197.83"/>
+</g>
+<!-- MEM_ALIASN&#45;&gt;MEM_BOT -->
+<g id="edge56" class="edge">
+<title>MEM_ALIASN&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="black" d="M1463.95,-354.58C1434.88,-318.61 1371.46,-240.12 1329.63,-188.36"/>
+</g>
+<!-- MEM_BOT&#45;&gt;BOT -->
+<g id="edge57" class="edge">
+<title>MEM_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="black" d="M1227.06,-125.75C1091.6,-99.86 776.38,-39.59 695.62,-24.15"/>
+</g>
+</g>
+</svg>