summaryrefslogtreecommitdiff
path: root/chapter10/docs/lattice.gv
blob: 406a62c3459a72647ec10c83fa35fac73994984e (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
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;}
}