summaryrefslogtreecommitdiff
path: root/chapter10/docs/lattice.gv
blob: c074f1a4229bf4e30b7c0f0f07fb859042bc15e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
digraph Lattice {
    // Define nodes
    splines=false;
    node [shape=circle, style=filled, fillcolor=lightblue];
    nodesep=0.6;

    TOP [label="⊤"];
    BOT [label="⊥"];

    XCTRL [label="~Ctrl"];
    CTRL [label="Ctrl"];

    INT_TOP [label="IntTop"];
    INT_BOT [label="IntBot"];

    INT_MIN [label="-n"];
    INT_MINDOTS [label="..." shape=none style=none];
    INT_ZERO [label="0"];
    INT_MAXDOTS [label="..." shape=none style=none];
    INT_MAX [label="+n"];

    TUPLE [label="TUPLE"];

    STRUCT_TOP [label="$TOP"];
    STRUCT_S1  [label="S1"];
    STRUCT_DOTS  [label="..." shape=none style=none];
    STRUCT_SN  [label="Sn"];
    STRUCT_BOT [label="$BOT"]

    PTR_TOP      [label="*$TOP"];
    PTR_NULL     [label="null"];
    PTR_VOIDPTR  [label="*void"];
    PTR_S1       [label="*S1"];
    PTR_SDOTS    [label="..." shape=none style=none];
    PTR_SN       [label="*SN"];
    PTR_S1OPT    [label="*S1?"];
    PTR_SOPTDOTS    [label="..." shape=none style=none];
    PTR_SNOPT    [label="*SN?"];
    PTR_BOT      [label="*$BOT?"];

    MEM_TOP      [label="MEM#TOP"];
    MEM_ALIAS1   [label="#1"];
    MEM_ALIAS2   [label="#2"];
    MEM_ALIASDOTS  [label="..." shape=none style=none];
    MEM_ALIASN   [label="#n"];
    MEM_BOT      [label="MEM#BOT"];

    // Define edges
    edge [arrowhead=none];

    TOP -> XCTRL;
    XCTRL -> CTRL;
    CTRL -> BOT;

    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];

    TOP          -> TUPLE;
    TUPLE        -> BOT;

    TOP          -> STRUCT_TOP;
    STRUCT_TOP   -> STRUCT_S1;
    STRUCT_TOP   -> STRUCT_DOTS;
    STRUCT_TOP   -> STRUCT_SN;
    STRUCT_S1    -> STRUCT_BOT;
    STRUCT_DOTS  -> STRUCT_BOT;
    STRUCT_SN    -> STRUCT_BOT;
    STRUCT_BOT   -> BOT;

    STRUCT_S1 -> STRUCT_DOTS -> STRUCT_SN [style=invis];

    TOP          -> PTR_TOP;
    PTR_TOP      -> PTR_S1;
    PTR_TOP      -> PTR_SDOTS;
    PTR_TOP      -> PTR_SN;
    PTR_TOP      -> PTR_NULL;
    PTR_TOP      -> PTR_VOIDPTR;
    PTR_NULL     -> PTR_BOT;
    PTR_NULL     -> PTR_S1OPT;
    PTR_NULL     -> PTR_SOPTDOTS;
    PTR_NULL     -> PTR_SNOPT;
    PTR_S1       -> PTR_S1OPT;
    PTR_S1       -> PTR_VOIDPTR;
    PTR_SDOTS    -> PTR_SOPTDOTS;
    PTR_SDOTS    -> PTR_VOIDPTR;
    PTR_SN       -> PTR_SNOPT;
    PTR_SN       -> PTR_VOIDPTR;
    PTR_VOIDPTR  -> PTR_BOT;
    PTR_S1OPT    -> PTR_BOT;
    PTR_SOPTDOTS -> PTR_BOT;
    PTR_SNOPT    -> PTR_BOT;
    PTR_BOT      -> BOT;

    PTR_S1 -> PTR_SDOTS -> PTR_SN [style=invis];
    PTR_S1OPT -> PTR_SOPTDOTS -> PTR_SNOPT [style=invis];

    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; XCTRL; STRUCT_TOP; PTR_TOP; MEM_TOP;}
    {rank=same; PTR_S1; PTR_SDOTS; PTR_SN;}
    {rank=same; INT_MIN; INT_MINDOTS;
                INT_ZERO; INT_MAXDOTS;
                INT_MAX; TUPLE; STRUCT_S1; STRUCT_DOTS; STRUCT_SN;
                PTR_NULL; PTR_VOIDPTR;
                MEM_ALIAS1; MEM_ALIAS2;
                MEM_ALIASDOTS; MEM_ALIASN;}
    {rank=same; PTR_S1OPT; PTR_SOPTDOTS; PTR_SNOPT; }
    {rank=same; INT_BOT; CTRL; STRUCT_BOT; PTR_BOT; MEM_BOT;}
    {rank=same; BOT;}
}