add formal verif
[lttv.git] / trunk / verif / examples / pan.t
1 #ifdef PEG
2 struct T_SRC {
3 char *fl; int ln;
4 } T_SRC[NTRANS];
5
6 void
7 tr_2_src(int m, char *file, int ln)
8 { T_SRC[m].fl = file;
9 T_SRC[m].ln = ln;
10 }
11
12 void
13 putpeg(int n, int m)
14 { printf("%5d trans %4d ", m, n);
15 printf("file %s line %3d\n",
16 T_SRC[n].fl, T_SRC[n].ln);
17 }
18 #endif
19
20 void
21 settable(void)
22 { Trans *T;
23 Trans *settr(int, int, int, int, int, char *, int, int, int);
24
25 trans = (Trans ***) emalloc(6*sizeof(Trans **));
26
27 /* proctype 4: :init: */
28
29 trans[4] = (Trans **) emalloc(59*sizeof(Trans *));
30
31 T = trans[ 4][42] = settr(161,2,0,0,0,"ATOMIC", 1, 2, 0);
32 T->nxt = settr(161,2,1,0,0,"ATOMIC", 1, 2, 0);
33 trans[4][1] = settr(120,2,8,3,3,"i = 0", 1, 2, 0);
34 trans[4][9] = settr(128,2,8,1,0,".(goto)", 1, 2, 0);
35 T = trans[4][8] = settr(127,2,0,0,0,"DO", 1, 2, 0);
36 T = T->nxt = settr(127,2,2,0,0,"DO", 1, 2, 0);
37 T->nxt = settr(127,2,6,0,0,"DO", 1, 2, 0);
38 trans[4][2] = settr(121,2,8,4,4,"((i<2))", 1, 2, 0); /* m: 3 -> 8,0 */
39 reached4[3] = 1;
40 trans[4][3] = settr(0,0,0,0,0,"commit_count[i] = 0",0,0,0);
41 trans[4][4] = settr(0,0,0,0,0,"retrieve_count[i] = 0",0,0,0);
42 trans[4][5] = settr(0,0,0,0,0,"i = (i+1)",0,0,0);
43 trans[4][6] = settr(125,2,17,5,5,"((i>=2))", 1, 2, 0); /* m: 11 -> 17,0 */
44 reached4[11] = 1;
45 trans[4][7] = settr(126,2,11,1,0,"goto :b6", 1, 2, 0); /* m: 11 -> 0,17 */
46 reached4[11] = 1;
47 trans[4][10] = settr(129,2,11,1,0,"break", 1, 2, 0);
48 trans[4][11] = settr(130,2,17,6,6,"i = 0", 1, 2, 0);
49 trans[4][18] = settr(137,2,17,1,0,".(goto)", 1, 2, 0);
50 T = trans[4][17] = settr(136,2,0,0,0,"DO", 1, 2, 0);
51 T = T->nxt = settr(136,2,12,0,0,"DO", 1, 2, 0);
52 T->nxt = settr(136,2,15,0,0,"DO", 1, 2, 0);
53 trans[4][12] = settr(131,2,17,7,7,"((i<4))", 1, 2, 0); /* m: 13 -> 17,0 */
54 reached4[13] = 1;
55 trans[4][13] = settr(0,0,0,0,0,"buffer_use[i] = 0",0,0,0);
56 trans[4][14] = settr(0,0,0,0,0,"i = (i+1)",0,0,0);
57 trans[4][15] = settr(134,2,20,8,8,"((i>=4))", 1, 2, 0);
58 trans[4][16] = settr(135,2,20,1,0,"goto :b7", 1, 2, 0);
59 trans[4][19] = settr(138,2,20,1,0,"break", 1, 2, 0);
60 trans[4][20] = settr(139,2,21,9,9,"(run reader())", 1, 2, 0);
61 trans[4][21] = settr(140,2,29,10,10,"(run cleaner())", 1, 2, 0); /* m: 22 -> 29,0 */
62 reached4[22] = 1;
63 trans[4][22] = settr(0,0,0,0,0,"i = 0",0,0,0);
64 trans[4][30] = settr(149,2,29,1,0,".(goto)", 1, 2, 0);
65 T = trans[4][29] = settr(148,2,0,0,0,"DO", 1, 2, 0);
66 T = T->nxt = settr(148,2,23,0,0,"DO", 1, 2, 0);
67 T->nxt = settr(148,2,27,0,0,"DO", 1, 2, 0);
68 trans[4][23] = settr(142,2,25,11,11,"((i<4))", 1, 2, 0); /* m: 24 -> 25,0 */
69 reached4[24] = 1;
70 trans[4][24] = settr(0,0,0,0,0,"refcount = (refcount+1)",0,0,0);
71 trans[4][25] = settr(144,2,29,12,12,"(run tracer())", 1, 2, 0); /* m: 26 -> 29,0 */
72 reached4[26] = 1;
73 trans[4][26] = settr(0,0,0,0,0,"i = (i+1)",0,0,0);
74 trans[4][27] = settr(146,2,39,13,13,"((i>=4))", 1, 2, 0); /* m: 32 -> 39,0 */
75 reached4[32] = 1;
76 trans[4][28] = settr(147,2,32,1,0,"goto :b8", 1, 2, 0); /* m: 32 -> 0,39 */
77 reached4[32] = 1;
78 trans[4][31] = settr(150,2,32,1,0,"break", 1, 2, 0);
79 trans[4][32] = settr(151,2,39,14,14,"i = 0", 1, 2, 0);
80 trans[4][40] = settr(159,2,39,1,0,".(goto)", 1, 2, 0);
81 T = trans[4][39] = settr(158,2,0,0,0,"DO", 1, 2, 0);
82 T = T->nxt = settr(158,2,33,0,0,"DO", 1, 2, 0);
83 T->nxt = settr(158,2,37,0,0,"DO", 1, 2, 0);
84 trans[4][33] = settr(152,2,35,15,15,"((i<1))", 1, 2, 0); /* m: 34 -> 35,0 */
85 reached4[34] = 1;
86 trans[4][34] = settr(0,0,0,0,0,"refcount = (refcount+1)",0,0,0);
87 trans[4][35] = settr(154,2,39,16,16,"(run switcher())", 1, 2, 0); /* m: 36 -> 39,0 */
88 reached4[36] = 1;
89 trans[4][36] = settr(0,0,0,0,0,"i = (i+1)",0,0,0);
90 trans[4][37] = settr(156,2,41,17,17,"((i>=1))", 1, 2, 0); /* m: 38 -> 41,0 */
91 reached4[38] = 1;
92 trans[4][38] = settr(157,2,41,1,0,"goto :b9", 1, 2, 0);
93 trans[4][41] = settr(160,0,57,1,0,"break", 1, 2, 0);
94 T = trans[ 4][57] = settr(176,2,0,0,0,"ATOMIC", 1, 2, 0);
95 T->nxt = settr(176,2,43,0,0,"ATOMIC", 1, 2, 0);
96 trans[4][43] = settr(162,2,52,18,18,"assert((((write_off-read_off)>=0)&&((write_off-read_off)<(255/2))))", 1, 2, 0); /* m: 44 -> 0,52 */
97 reached4[44] = 1;
98 trans[4][44] = settr(0,0,0,0,0,"j = 0",0,0,0);
99 trans[4][45] = settr(0,0,0,0,0,"commit_sum = 0",0,0,0);
100 trans[4][53] = settr(172,2,52,1,0,".(goto)", 1, 2, 0);
101 T = trans[4][52] = settr(171,2,0,0,0,"DO", 1, 2, 0);
102 T = T->nxt = settr(171,2,46,0,0,"DO", 1, 2, 0);
103 T->nxt = settr(171,2,50,0,0,"DO", 1, 2, 0);
104 trans[4][46] = settr(165,2,52,19,19,"((j<2))", 1, 2, 0); /* m: 47 -> 52,0 */
105 reached4[47] = 1;
106 trans[4][47] = settr(0,0,0,0,0,"commit_sum = (commit_sum+commit_count[j])",0,0,0);
107 trans[4][48] = settr(0,0,0,0,0,"assert((((commit_count[j]-retrieve_count[j])>=0)&&((commit_count[j]-retrieve_count[j])<(255/2))))",0,0,0);
108 trans[4][49] = settr(0,0,0,0,0,"j = (j+1)",0,0,0);
109 trans[4][50] = settr(169,4,58,20,20,"((j>=2))", 1, 2, 0); /* m: 55 -> 58,0 */
110 reached4[55] = 1;
111 trans[4][51] = settr(170,2,55,1,0,"goto :b10", 1, 2, 0); /* m: 55 -> 0,58 */
112 reached4[55] = 1;
113 trans[4][54] = settr(173,2,55,1,0,"break", 1, 2, 0);
114 trans[4][55] = settr(174,4,58,21,21,"assert((((write_off-commit_sum)>=0)&&((write_off-commit_sum)<(255/2))))", 1, 2, 0); /* m: 56 -> 0,58 */
115 reached4[56] = 1;
116 trans[4][56] = settr(0,0,0,0,0,"assert((((4+1)>4)||(events_lost==0)))",0,0,0);
117 trans[4][58] = settr(177,0,0,22,22,"-end-", 0, 3500, 0);
118
119 /* proctype 3: cleaner */
120
121 trans[3] = (Trans **) emalloc(10*sizeof(Trans *));
122
123 T = trans[ 3][8] = settr(118,2,0,0,0,"ATOMIC", 1, 2, 0);
124 T->nxt = settr(118,2,5,0,0,"ATOMIC", 1, 2, 0);
125 trans[3][6] = settr(116,2,5,1,0,".(goto)", 1, 2, 0);
126 T = trans[3][5] = settr(115,2,0,0,0,"DO", 1, 2, 0);
127 T->nxt = settr(115,2,1,0,0,"DO", 1, 2, 0);
128 trans[3][1] = settr(111,2,3,23,23,"((refcount==0))", 1, 2, 0); /* m: 2 -> 3,0 */
129 reached3[2] = 1;
130 trans[3][2] = settr(0,0,0,0,0,"refcount = (refcount+1)",0,0,0);
131 trans[3][3] = settr(113,2,7,24,24,"(run switcher())", 1, 2, 0); /* m: 4 -> 7,0 */
132 reached3[4] = 1;
133 trans[3][4] = settr(114,2,7,1,0,"goto :b5", 1, 2, 0);
134 trans[3][7] = settr(117,0,9,1,0,"break", 1, 2, 0);
135 trans[3][9] = settr(119,0,0,25,25,"-end-", 0, 3500, 0);
136
137 /* proctype 2: reader */
138
139 trans[2] = (Trans **) emalloc(32*sizeof(Trans *));
140
141 trans[2][29] = settr(108,0,28,1,0,".(goto)", 0, 2, 0);
142 T = trans[2][28] = settr(107,0,0,0,0,"DO", 0, 2, 0);
143 T = T->nxt = settr(107,0,1,0,0,"DO", 0, 2, 0);
144 T->nxt = settr(107,0,26,0,0,"DO", 0, 2, 0);
145 trans[2][1] = settr(80,0,12,26,0,"((((((write_off/(4/2))-(read_off/(4/2)))>0)&&(((write_off/(4/2))-(read_off/(4/2)))<(255/2)))&&((commit_count[((read_off%4)/(4/2))]-retrieve_count[((read_off%4)/(4/2))])==(4/2))))", 1, 2, 0);
146 T = trans[ 2][12] = settr(91,2,0,0,0,"ATOMIC", 1, 2, 0);
147 T->nxt = settr(91,2,2,0,0,"ATOMIC", 1, 2, 0);
148 trans[2][2] = settr(81,2,9,27,27,"i = 0", 1, 2, 0);
149 trans[2][10] = settr(89,2,9,1,0,".(goto)", 1, 2, 0);
150 T = trans[2][9] = settr(88,2,0,0,0,"DO", 1, 2, 0);
151 T = T->nxt = settr(88,2,3,0,0,"DO", 1, 2, 0);
152 T->nxt = settr(88,2,7,0,0,"DO", 1, 2, 0);
153 trans[2][3] = settr(82,2,9,28,28,"((i<(4/2)))", 1, 2, 0); /* m: 4 -> 9,0 */
154 reached2[4] = 1;
155 trans[2][4] = settr(0,0,0,0,0,"assert((buffer_use[((read_off+i)%4)]==0))",0,0,0);
156 trans[2][5] = settr(0,0,0,0,0,"buffer_use[((read_off+i)%4)] = 1",0,0,0);
157 trans[2][6] = settr(0,0,0,0,0,"i = (i+1)",0,0,0);
158 trans[2][7] = settr(86,2,11,29,29,"((i>=(4/2)))", 1, 2, 0); /* m: 8 -> 11,0 */
159 reached2[8] = 1;
160 trans[2][8] = settr(87,2,11,1,0,"goto :b3", 1, 2, 0);
161 trans[2][11] = settr(90,0,25,1,0,"break", 1, 2, 0);
162 T = trans[ 2][25] = settr(104,2,0,0,0,"ATOMIC", 1, 2, 0);
163 T->nxt = settr(104,2,13,0,0,"ATOMIC", 1, 2, 0);
164 trans[2][13] = /* c */ settr(92,2,19,27,27,"i = 0", 1, 2, 0);
165 trans[2][20] = settr(99,2,19,1,0,".(goto)", 1, 2, 0);
166 T = trans[2][19] = settr(98,2,0,0,0,"DO", 1, 2, 0);
167 T = T->nxt = settr(98,2,14,0,0,"DO", 1, 2, 0);
168 T->nxt = settr(98,2,17,0,0,"DO", 1, 2, 0);
169 trans[2][14] = settr(93,2,19,30,30,"((i<(4/2)))", 1, 2, 0); /* m: 15 -> 19,0 */
170 reached2[15] = 1;
171 trans[2][15] = settr(0,0,0,0,0,"buffer_use[((read_off+i)%4)] = 0",0,0,0);
172 trans[2][16] = settr(0,0,0,0,0,"i = (i+1)",0,0,0);
173 trans[2][17] = settr(96,0,28,31,31,"((i>=(4/2)))", 1, 2, 0); /* m: 22 -> 28,0 */
174 reached2[22] = 1;
175 trans[2][18] = settr(97,2,22,1,0,"goto :b4", 1, 2, 0); /* m: 22 -> 0,28 */
176 reached2[22] = 1;
177 trans[2][21] = settr(100,2,22,1,0,"break", 1, 2, 0);
178 trans[2][22] = settr(101,0,28,32,32,"tmp_retrieve = (retrieve_count[((read_off%4)/(4/2))]+(4/2))", 1, 2, 0); /* m: 23 -> 0,28 */
179 reached2[23] = 1;
180 trans[2][23] = settr(0,0,0,0,0,"retrieve_count[((read_off%4)/(4/2))] = tmp_retrieve",0,0,0);
181 trans[2][24] = settr(0,0,0,0,0,"read_off = (read_off+(4/2))",0,0,0);
182 trans[2][26] = settr(105,0,31,33,0,"((read_off>=(4-events_lost)))", 1, 2, 0);
183 trans[2][27] = settr(106,0,31,1,0,"goto :b2", 0, 2, 0);
184 trans[2][30] = settr(109,0,31,1,0,"break", 0, 2, 0);
185 trans[2][31] = settr(110,0,0,34,34,"-end-", 0, 3500, 0);
186
187 /* proctype 1: tracer */
188
189 trans[1] = (Trans **) emalloc(51*sizeof(Trans *));
190
191 T = trans[ 1][3] = settr(32,2,0,0,0,"ATOMIC", 1, 2, 0);
192 T->nxt = settr(32,2,1,0,0,"ATOMIC", 1, 2, 0);
193 trans[1][1] = settr(30,4,10,35,35,"prev_off = write_off", 1, 2, 0); /* m: 2 -> 0,10 */
194 reached1[2] = 1;
195 trans[1][2] = settr(0,0,0,0,0,"new_off = (prev_off+size)",0,0,0);
196 T = trans[ 1][10] = settr(39,2,0,0,0,"ATOMIC", 1, 2, 0);
197 T->nxt = settr(39,2,8,0,0,"ATOMIC", 1, 2, 0);
198 T = trans[1][8] = settr(37,2,0,0,0,"IF", 1, 2, 0);
199 T = T->nxt = settr(37,2,4,0,0,"IF", 1, 2, 0);
200 T->nxt = settr(37,2,6,0,0,"IF", 1, 2, 0);
201 trans[1][4] = settr(33,2,47,36,36,"((((new_off-read_off)>4)&&((new_off-read_off)<(255/2))))", 1, 2, 0);
202 trans[1][5] = settr(34,2,47,1,0,"goto lost", 1, 2, 0);
203 trans[1][9] = settr(38,0,27,1,0,".(goto)", 1, 2, 0);
204 trans[1][6] = settr(35,2,7,2,0,"else", 1, 2, 0);
205 trans[1][7] = settr(36,4,27,37,37,"(1)", 1, 2, 0); /* m: 9 -> 27,0 */
206 reached1[9] = 1;
207 T = trans[ 1][27] = settr(56,2,0,0,0,"ATOMIC", 1, 2, 0);
208 T->nxt = settr(56,2,15,0,0,"ATOMIC", 1, 2, 0);
209 T = trans[1][15] = settr(44,2,0,0,0,"IF", 1, 2, 0);
210 T = T->nxt = settr(44,2,11,0,0,"IF", 1, 2, 0);
211 T->nxt = settr(44,2,13,0,0,"IF", 1, 2, 0);
212 trans[1][11] = settr(40,4,3,38,38,"((prev_off!=write_off))", 1, 2, 0); /* m: 12 -> 3,0 */
213 reached1[12] = 1;
214 trans[1][12] = settr(41,0,3,1,0,"goto cmpxchg_loop", 1, 2, 0);
215 trans[1][16] = settr(45,2,17,1,0,".(goto)", 1, 2, 0); /* m: 17 -> 0,24 */
216 reached1[17] = 1;
217 trans[1][13] = settr(42,2,14,2,0,"else", 1, 2, 0);
218 trans[1][14] = settr(43,2,24,39,39,"write_off = new_off", 1, 2, 0); /* m: 17 -> 0,24 */
219 reached1[17] = 1;
220 trans[1][17] = settr(46,2,24,40,40,"i = 0", 1, 2, 0);
221 trans[1][25] = settr(54,2,24,1,0,".(goto)", 1, 2, 0);
222 T = trans[1][24] = settr(53,2,0,0,0,"DO", 1, 2, 0);
223 T = T->nxt = settr(53,2,18,0,0,"DO", 1, 2, 0);
224 T->nxt = settr(53,2,22,0,0,"DO", 1, 2, 0);
225 trans[1][18] = settr(47,2,24,41,41,"((i<size))", 1, 2, 0); /* m: 19 -> 24,0 */
226 reached1[19] = 1;
227 trans[1][19] = settr(0,0,0,0,0,"assert((buffer_use[((prev_off+i)%4)]==0))",0,0,0);
228 trans[1][20] = settr(0,0,0,0,0,"buffer_use[((prev_off+i)%4)] = 1",0,0,0);
229 trans[1][21] = settr(0,0,0,0,0,"i = (i+1)",0,0,0);
230 trans[1][22] = settr(51,2,26,42,42,"((i>=size))", 1, 2, 0); /* m: 23 -> 26,0 */
231 reached1[23] = 1;
232 trans[1][23] = settr(52,2,26,1,0,"goto :b0", 1, 2, 0);
233 trans[1][26] = settr(55,0,45,1,0,"break", 1, 2, 0);
234 T = trans[ 1][45] = settr(74,2,0,0,0,"ATOMIC", 1, 2, 0);
235 T->nxt = settr(74,2,28,0,0,"ATOMIC", 1, 2, 0);
236 trans[1][28] = settr(57,2,34,43,43,"i = 0", 1, 2, 0);
237 trans[1][35] = settr(64,2,34,1,0,".(goto)", 1, 2, 0);
238 T = trans[1][34] = settr(63,2,0,0,0,"DO", 1, 2, 0);
239 T = T->nxt = settr(63,2,29,0,0,"DO", 1, 2, 0);
240 T->nxt = settr(63,2,32,0,0,"DO", 1, 2, 0);
241 trans[1][29] = settr(58,2,34,44,44,"((i<size))", 1, 2, 0); /* m: 30 -> 34,0 */
242 reached1[30] = 1;
243 trans[1][30] = settr(0,0,0,0,0,"buffer_use[((prev_off+i)%4)] = 0",0,0,0);
244 trans[1][31] = settr(0,0,0,0,0,"i = (i+1)",0,0,0);
245 trans[1][32] = settr(61,2,43,45,45,"((i>=size))", 1, 2, 0); /* m: 37 -> 43,0 */
246 reached1[37] = 1;
247 trans[1][33] = settr(62,2,37,1,0,"goto :b1", 1, 2, 0); /* m: 37 -> 0,43 */
248 reached1[37] = 1;
249 trans[1][36] = settr(65,2,37,1,0,"break", 1, 2, 0);
250 trans[1][37] = settr(66,2,43,46,46,"tmp_commit = (commit_count[((prev_off%4)/(4/2))]+size)", 1, 2, 0); /* m: 38 -> 0,43 */
251 reached1[38] = 1;
252 trans[1][38] = settr(0,0,0,0,0,"commit_count[((prev_off%4)/(4/2))] = tmp_commit",0,0,0);
253 T = trans[1][43] = settr(72,2,0,0,0,"IF", 1, 2, 0);
254 T = T->nxt = settr(72,2,39,0,0,"IF", 1, 2, 0);
255 T->nxt = settr(72,2,41,0,0,"IF", 1, 2, 0);
256 trans[1][39] = settr(68,4,49,47,47,"(((tmp_commit%(4/2))==0))", 1, 2, 0); /* m: 40 -> 49,0 */
257 reached1[40] = 1;
258 trans[1][40] = settr(0,0,0,0,0,"deliver = 1",0,0,0);
259 trans[1][44] = settr(73,0,49,48,48,".(goto)", 1, 2, 0);
260 trans[1][41] = settr(70,2,42,2,0,"else", 1, 2, 0);
261 trans[1][42] = settr(71,4,49,49,49,"(1)", 1, 2, 0); /* m: 44 -> 49,0 */
262 reached1[44] = 1;
263 T = trans[ 1][49] = settr(78,2,0,0,0,"ATOMIC", 1, 2, 0);
264 T->nxt = settr(78,2,46,0,0,"ATOMIC", 1, 2, 0);
265 trans[1][46] = settr(75,2,48,1,0,"goto end", 1, 2, 0);
266 trans[1][47] = settr(76,2,48,50,50,"events_lost = (events_lost+1)", 1, 2, 0);
267 trans[1][48] = settr(77,0,50,51,51,"refcount = (refcount-1)", 1, 2, 0);
268 trans[1][50] = settr(79,0,0,52,52,"-end-", 0, 3500, 0);
269
270 /* proctype 0: switcher */
271
272 trans[0] = (Trans **) emalloc(31*sizeof(Trans *));
273
274 T = trans[ 0][11] = settr(10,2,0,0,0,"ATOMIC", 1, 2, 0);
275 T->nxt = settr(10,2,1,0,0,"ATOMIC", 1, 2, 0);
276 trans[0][1] = settr(0,2,9,53,53,"prev_off = write_off", 1, 2, 0); /* m: 2 -> 0,9 */
277 reached0[2] = 1;
278 trans[0][2] = settr(0,0,0,0,0,"size = ((4/2)-(prev_off%(4/2)))",0,0,0);
279 trans[0][3] = settr(0,0,0,0,0,"new_off = (prev_off+size)",0,0,0);
280 T = trans[0][9] = settr(8,2,0,0,0,"IF", 1, 2, 0);
281 T = T->nxt = settr(8,2,4,0,0,"IF", 1, 2, 0);
282 T->nxt = settr(8,2,7,0,0,"IF", 1, 2, 0);
283 trans[0][4] = settr(3,4,29,54,54,"(((((new_off-read_off)>4)&&((new_off-read_off)<(255/2)))||(size==(4/2))))", 1, 2, 0); /* m: 5 -> 29,0 */
284 reached0[5] = 1;
285 trans[0][5] = settr(0,0,0,0,0,"refcount = (refcount-1)",0,0,0);
286 trans[0][6] = settr(5,0,29,1,0,"goto not_needed", 1, 2, 0);
287 trans[0][10] = settr(9,0,18,1,0,".(goto)", 1, 2, 0);
288 trans[0][7] = settr(6,2,8,2,0,"else", 1, 2, 0);
289 trans[0][8] = settr(7,4,18,55,55,"(1)", 1, 2, 0); /* m: 10 -> 18,0 */
290 reached0[10] = 1;
291 T = trans[ 0][18] = settr(17,2,0,0,0,"ATOMIC", 1, 2, 0);
292 T->nxt = settr(17,2,16,0,0,"ATOMIC", 1, 2, 0);
293 T = trans[0][16] = settr(15,2,0,0,0,"IF", 1, 2, 0);
294 T = T->nxt = settr(15,2,12,0,0,"IF", 1, 2, 0);
295 T->nxt = settr(15,2,14,0,0,"IF", 1, 2, 0);
296 trans[0][12] = settr(11,4,11,56,56,"((prev_off!=write_off))", 1, 2, 0); /* m: 13 -> 11,0 */
297 reached0[13] = 1;
298 trans[0][13] = settr(12,0,11,1,0,"goto cmpxchg_loop", 1, 2, 0);
299 trans[0][17] = settr(16,0,28,57,57,".(goto)", 1, 2, 0);
300 trans[0][14] = settr(13,2,15,2,0,"else", 1, 2, 0);
301 trans[0][15] = settr(14,4,28,58,58,"write_off = new_off", 1, 2, 0); /* m: 17 -> 0,28 */
302 reached0[17] = 1;
303 T = trans[ 0][28] = settr(27,2,0,0,0,"ATOMIC", 1, 2, 0);
304 T->nxt = settr(27,2,19,0,0,"ATOMIC", 1, 2, 0);
305 trans[0][19] = settr(18,2,25,59,59,"tmp_commit = (commit_count[((prev_off%4)/(4/2))]+size)", 1, 2, 0); /* m: 20 -> 0,25 */
306 reached0[20] = 1;
307 trans[0][20] = settr(0,0,0,0,0,"commit_count[((prev_off%4)/(4/2))] = tmp_commit",0,0,0);
308 T = trans[0][25] = settr(24,2,0,0,0,"IF", 1, 2, 0);
309 T = T->nxt = settr(24,2,21,0,0,"IF", 1, 2, 0);
310 T->nxt = settr(24,2,23,0,0,"IF", 1, 2, 0);
311 trans[0][21] = settr(20,4,29,60,60,"(((tmp_commit%(4/2))==0))", 1, 2, 0); /* m: 22 -> 29,0 */
312 reached0[22] = 1;
313 trans[0][22] = settr(0,0,0,0,0,"deliver = 1",0,0,0);
314 trans[0][26] = settr(25,4,29,61,61,".(goto)", 1, 2, 0); /* m: 27 -> 0,29 */
315 reached0[27] = 1;
316 trans[0][23] = settr(22,2,24,2,0,"else", 1, 2, 0);
317 trans[0][24] = settr(23,4,29,62,62,"(1)", 1, 2, 0); /* m: 26 -> 29,0 */
318 reached0[26] = 1;
319 trans[0][27] = settr(0,0,0,0,0,"refcount = (refcount-1)",0,0,0);
320 trans[0][29] = settr(28,0,30,1,0,"(1)", 0, 2, 0);
321 trans[0][30] = settr(29,0,0,63,63,"-end-", 0, 3500, 0);
322 /* np_ demon: */
323 trans[_NP_] = (Trans **) emalloc(2*sizeof(Trans *));
324 T = trans[_NP_][0] = settr(9997,0,1,_T5,0,"(np_)", 1,2,0);
325 T->nxt = settr(9998,0,0,_T2,0,"(1)", 0,2,0);
326 T = trans[_NP_][1] = settr(9999,0,1,_T5,0,"(np_)", 1,2,0);
327 }
328
329 Trans *
330 settr( int t_id, int a, int b, int c, int d,
331 char *t, int g, int tpe0, int tpe1)
332 { Trans *tmp = (Trans *) emalloc(sizeof(Trans));
333
334 tmp->atom = a&(6|32); /* only (2|8|32) have meaning */
335 if (!g) tmp->atom |= 8; /* no global references */
336 tmp->st = b;
337 tmp->tpe[0] = tpe0;
338 tmp->tpe[1] = tpe1;
339 tmp->tp = t;
340 tmp->t_id = t_id;
341 tmp->forw = c;
342 tmp->back = d;
343 return tmp;
344 }
345
346 Trans *
347 cpytr(Trans *a)
348 { Trans *tmp = (Trans *) emalloc(sizeof(Trans));
349
350 int i;
351 tmp->atom = a->atom;
352 tmp->st = a->st;
353 #ifdef HAS_UNLESS
354 tmp->e_trans = a->e_trans;
355 for (i = 0; i < HAS_UNLESS; i++)
356 tmp->escp[i] = a->escp[i];
357 #endif
358 tmp->tpe[0] = a->tpe[0];
359 tmp->tpe[1] = a->tpe[1];
360 for (i = 0; i < 6; i++)
361 { tmp->qu[i] = a->qu[i];
362 tmp->ty[i] = a->ty[i];
363 }
364 tmp->tp = (char *) emalloc(strlen(a->tp)+1);
365 strcpy(tmp->tp, a->tp);
366 tmp->t_id = a->t_id;
367 tmp->forw = a->forw;
368 tmp->back = a->back;
369 return tmp;
370 }
371
372 #ifndef NOREDUCE
373 int
374 srinc_set(int n)
375 { if (n <= 2) return LOCAL;
376 if (n <= 2+ DELTA) return Q_FULL_F; /* 's' or nfull */
377 if (n <= 2+2*DELTA) return Q_EMPT_F; /* 'r' or nempty */
378 if (n <= 2+3*DELTA) return Q_EMPT_T; /* empty */
379 if (n <= 2+4*DELTA) return Q_FULL_T; /* full */
380 if (n == 5*DELTA) return GLOBAL;
381 if (n == 6*DELTA) return TIMEOUT_F;
382 if (n == 7*DELTA) return ALPHA_F;
383 Uerror("cannot happen srinc_class");
384 return BAD;
385 }
386 int
387 srunc(int n, int m)
388 { switch(m) {
389 case Q_FULL_F: return n-2;
390 case Q_EMPT_F: return n-2-DELTA;
391 case Q_EMPT_T: return n-2-2*DELTA;
392 case Q_FULL_T: return n-2-3*DELTA;
393 case ALPHA_F:
394 case TIMEOUT_F: return 257; /* non-zero, and > MAXQ */
395 }
396 Uerror("cannot happen srunc");
397 return 0;
398 }
399 #endif
400 int cnt;
401 #ifdef HAS_UNLESS
402 int
403 isthere(Trans *a, int b)
404 { Trans *t;
405 for (t = a; t; t = t->nxt)
406 if (t->t_id == b)
407 return 1;
408 return 0;
409 }
410 #endif
411 #ifndef NOREDUCE
412 int
413 mark_safety(Trans *t) /* for conditional safety */
414 { int g = 0, i, j, k;
415
416 if (!t) return 0;
417 if (t->qu[0])
418 return (t->qu[1])?2:1; /* marked */
419
420 for (i = 0; i < 2; i++)
421 { j = srinc_set(t->tpe[i]);
422 if (j >= GLOBAL && j != ALPHA_F)
423 return -1;
424 if (j != LOCAL)
425 { k = srunc(t->tpe[i], j);
426 if (g == 0
427 || t->qu[0] != k
428 || t->ty[0] != j)
429 { t->qu[g] = k;
430 t->ty[g] = j;
431 g++;
432 } } }
433 return g;
434 }
435 #endif
436 void
437 retrans(int n, int m, int is, short srcln[], uchar reach[], uchar lstate[])
438 /* process n, with m states, is=initial state */
439 { Trans *T0, *T1, *T2, *T3;
440 int i, k;
441 #ifndef NOREDUCE
442 int g, h, j, aa;
443 #endif
444 #ifdef HAS_UNLESS
445 int p;
446 #endif
447 if (state_tables >= 4)
448 { printf("STEP 1 proctype %s\n",
449 procname[n]);
450 for (i = 1; i < m; i++)
451 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
452 crack(n, i, T0, srcln);
453 return;
454 }
455 do {
456 for (i = 1, cnt = 0; i < m; i++)
457 { T2 = trans[n][i];
458 T1 = T2?T2->nxt:(Trans *)0;
459 /* prescan: */ for (T0 = T1; T0; T0 = T0->nxt)
460 /* choice in choice */ { if (T0->st && trans[n][T0->st]
461 && trans[n][T0->st]->nxt)
462 break;
463 }
464 #if 0
465 if (T0)
466 printf("\tstate %d / %d: choice in choice\n",
467 i, T0->st);
468 #endif
469 if (T0)
470 for (T0 = T1; T0; T0 = T0->nxt)
471 { T3 = trans[n][T0->st];
472 if (!T3->nxt)
473 { T2->nxt = cpytr(T0);
474 T2 = T2->nxt;
475 imed(T2, T0->st, n, i);
476 continue;
477 }
478 do { T3 = T3->nxt;
479 T2->nxt = cpytr(T3);
480 T2 = T2->nxt;
481 imed(T2, T0->st, n, i);
482 } while (T3->nxt);
483 cnt++;
484 }
485 }
486 } while (cnt);
487 if (state_tables >= 3)
488 { printf("STEP 2 proctype %s\n",
489 procname[n]);
490 for (i = 1; i < m; i++)
491 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
492 crack(n, i, T0, srcln);
493 return;
494 }
495 for (i = 1; i < m; i++)
496 { if (trans[n][i] && trans[n][i]->nxt) /* optimize */
497 { T1 = trans[n][i]->nxt;
498 #if 0
499 printf("\t\tpull %d (%d) to %d\n",
500 T1->st, T1->forw, i);
501 #endif
502 if (!trans[n][T1->st]) continue;
503 T0 = cpytr(trans[n][T1->st]);
504 trans[n][i] = T0;
505 reach[T1->st] = 1;
506 imed(T0, T1->st, n, i);
507 for (T1 = T1->nxt; T1; T1 = T1->nxt)
508 {
509 #if 0
510 printf("\t\tpull %d (%d) to %d\n",
511 T1->st, T1->forw, i);
512 #endif
513 if (!trans[n][T1->st]) continue;
514 T0->nxt = cpytr(trans[n][T1->st]);
515 T0 = T0->nxt;
516 reach[T1->st] = 1;
517 imed(T0, T1->st, n, i);
518 } } }
519 if (state_tables >= 2)
520 { printf("STEP 3 proctype %s\n",
521 procname[n]);
522 for (i = 1; i < m; i++)
523 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
524 crack(n, i, T0, srcln);
525 return;
526 }
527 #ifdef HAS_UNLESS
528 for (i = 1; i < m; i++)
529 { if (!trans[n][i]) continue;
530 /* check for each state i if an
531 * escape to some state p is defined
532 * if so, copy and mark p's transitions
533 * and prepend them to the transition-
534 * list of state i
535 */
536 if (!like_java) /* the default */
537 { for (T0 = trans[n][i]; T0; T0 = T0->nxt)
538 for (k = HAS_UNLESS-1; k >= 0; k--)
539 { if (p = T0->escp[k])
540 for (T1 = trans[n][p]; T1; T1 = T1->nxt)
541 { if (isthere(trans[n][i], T1->t_id))
542 continue;
543 T2 = cpytr(T1);
544 T2->e_trans = p;
545 T2->nxt = trans[n][i];
546 trans[n][i] = T2;
547 } }
548 } else /* outermost unless checked first */
549 { Trans *T4;
550 T4 = T3 = (Trans *) 0;
551 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
552 for (k = HAS_UNLESS-1; k >= 0; k--)
553 { if (p = T0->escp[k])
554 for (T1 = trans[n][p]; T1; T1 = T1->nxt)
555 { if (isthere(trans[n][i], T1->t_id))
556 continue;
557 T2 = cpytr(T1);
558 T2->nxt = (Trans *) 0;
559 T2->e_trans = p;
560 if (T3) T3->nxt = T2;
561 else T4 = T2;
562 T3 = T2;
563 } }
564 if (T4)
565 { T3->nxt = trans[n][i];
566 trans[n][i] = T4;
567 }
568 }
569 }
570 #endif
571 #ifndef NOREDUCE
572 for (i = 1; i < m; i++)
573 { if (a_cycles)
574 { /* moves through these states are visible */
575 #if PROG_LAB>0 && defined(HAS_NP)
576 if (progstate[n][i])
577 goto degrade;
578 for (T1 = trans[n][i]; T1; T1 = T1->nxt)
579 if (progstate[n][T1->st])
580 goto degrade;
581 #endif
582 if (accpstate[n][i] || visstate[n][i])
583 goto degrade;
584 for (T1 = trans[n][i]; T1; T1 = T1->nxt)
585 if (accpstate[n][T1->st])
586 goto degrade;
587 }
588 T1 = trans[n][i];
589 if (!T1) continue;
590 g = mark_safety(T1); /* V3.3.1 */
591 if (g < 0) goto degrade; /* global */
592 /* check if mixing of guards preserves reduction */
593 if (T1->nxt)
594 { k = 0;
595 for (T0 = T1; T0; T0 = T0->nxt)
596 { if (!(T0->atom&8))
597 goto degrade;
598 for (aa = 0; aa < 2; aa++)
599 { j = srinc_set(T0->tpe[aa]);
600 if (j >= GLOBAL && j != ALPHA_F)
601 goto degrade;
602 if (T0->tpe[aa]
603 && T0->tpe[aa]
604 != T1->tpe[0])
605 k = 1;
606 } }
607 /* g = 0; V3.3.1 */
608 if (k) /* non-uniform selection */
609 for (T0 = T1; T0; T0 = T0->nxt)
610 for (aa = 0; aa < 2; aa++)
611 { j = srinc_set(T0->tpe[aa]);
612 if (j != LOCAL)
613 { k = srunc(T0->tpe[aa], j);
614 for (h = 0; h < 6; h++)
615 if (T1->qu[h] == k
616 && T1->ty[h] == j)
617 break;
618 if (h >= 6)
619 { T1->qu[g%6] = k;
620 T1->ty[g%6] = j;
621 g++;
622 } } }
623 if (g > 6)
624 { T1->qu[0] = 0; /* turn it off */
625 printf("pan: warning, line %d, ",
626 srcln[i]);
627 printf("too many stmnt types (%d)",
628 g);
629 printf(" in selection\n");
630 goto degrade;
631 }
632 }
633 /* mark all options global if >=1 is global */
634 for (T1 = trans[n][i]; T1; T1 = T1->nxt)
635 if (!(T1->atom&8)) break;
636 if (T1)
637 degrade: for (T1 = trans[n][i]; T1; T1 = T1->nxt)
638 T1->atom &= ~8; /* mark as unsafe */
639 /* can only mix 'r's or 's's if on same chan */
640 /* and not mixed with other local operations */
641 T1 = trans[n][i];
642 if (!T1 || T1->qu[0]) continue;
643 j = T1->tpe[0];
644 if (T1->nxt && T1->atom&8)
645 { if (j == 5*DELTA)
646 { printf("warning: line %d ", srcln[i]);
647 printf("mixed condition ");
648 printf("(defeats reduction)\n");
649 goto degrade;
650 }
651 for (T0 = T1; T0; T0 = T0->nxt)
652 for (aa = 0; aa < 2; aa++)
653 if (T0->tpe[aa] && T0->tpe[aa] != j)
654 { printf("warning: line %d ", srcln[i]);
655 printf("[%d-%d] mixed %stion ",
656 T0->tpe[aa], j,
657 (j==5*DELTA)?"condi":"selec");
658 printf("(defeats reduction)\n");
659 printf(" '%s' <-> '%s'\n",
660 T1->tp, T0->tp);
661 goto degrade;
662 } }
663 }
664 #endif
665 for (i = 1; i < m; i++)
666 { T2 = trans[n][i];
667 if (!T2
668 || T2->nxt
669 || strncmp(T2->tp, ".(goto)", 7)
670 || !stopstate[n][i])
671 continue;
672 stopstate[n][T2->st] = 1;
673 }
674 if (state_tables)
675 { printf("proctype ");
676 if (!strcmp(procname[n], ":init:"))
677 printf("init\n");
678 else
679 printf("%s\n", procname[n]);
680 for (i = 1; i < m; i++)
681 reach[i] = 1;
682 tagtable(n, m, is, srcln, reach);
683 } else
684 for (i = 1; i < m; i++)
685 { int nrelse;
686 if (strcmp(procname[n], ":never:") != 0)
687 { for (T0 = trans[n][i]; T0; T0 = T0->nxt)
688 { if (T0->st == i
689 && strcmp(T0->tp, "(1)") == 0)
690 { printf("error: proctype '%s' ",
691 procname[n]);
692 printf("line %d, state %d: has un",
693 srcln[i], i);
694 printf("conditional self-loop\n");
695 pan_exit(1);
696 } } }
697 nrelse = 0;
698 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
699 { if (strcmp(T0->tp, "else") == 0)
700 nrelse++;
701 }
702 if (nrelse > 1)
703 { printf("error: proctype '%s' state",
704 procname[n]);
705 printf(" %d, inherits %d", i, nrelse);
706 printf(" 'else' stmnts\n");
707 pan_exit(1);
708 } }
709 if (!state_tables && strcmp(procname[n], ":never:") == 0)
710 { int h = 0;
711 for (i = 1; i < m; i++)
712 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
713 if (T0->forw > h) h = T0->forw;
714 h++;
715 frm_st0 = (short *) emalloc(h * sizeof(short));
716 for (i = 1; i < m; i++)
717 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
718 frm_st0[T0->forw] = i;
719 }
720 #ifndef LOOPSTATE
721 if (state_tables)
722 #endif
723 do_dfs(n, m, is, srcln, reach, lstate);
724 #ifdef T_REVERSE
725 /* process n, with m states, is=initial state -- reverse list */
726 if (!state_tables && strcmp(procname[n], ":never:") != 0)
727 { for (i = 1; i < m; i++)
728 { Trans *T4 = (Trans *) 0;
729 T1 = (Trans *) 0;
730 T2 = (Trans *) 0;
731 T3 = (Trans *) 0;
732 for (T0 = trans[n][i]; T0; T0 = T4)
733 { T4 = T0->nxt;
734 if (strcmp(T0->tp, "else") == 0)
735 { T3 = T0;
736 T0->nxt = (Trans *) 0;
737 } else
738 { T0->nxt = T1;
739 if (!T1) { T2 = T0; }
740 T1 = T0;
741 } }
742 if (T2 && T3) { T2->nxt = T3; }
743 trans[n][i] = T1; /* reversed -- else at end */
744 } }
745 #endif
746 }
747 void
748 imed(Trans *T, int v, int n, int j) /* set intermediate state */
749 { progstate[n][T->st] |= progstate[n][v];
750 accpstate[n][T->st] |= accpstate[n][v];
751 stopstate[n][T->st] |= stopstate[n][v];
752 mapstate[n][j] = T->st;
753 }
754 void
755 tagtable(int n, int m, int is, short srcln[], uchar reach[])
756 { Trans *z;
757
758 if (is >= m || !trans[n][is]
759 || is <= 0 || reach[is] == 0)
760 return;
761 reach[is] = 0;
762 if (state_tables)
763 for (z = trans[n][is]; z; z = z->nxt)
764 crack(n, is, z, srcln);
765 for (z = trans[n][is]; z; z = z->nxt)
766 {
767 #ifdef HAS_UNLESS
768 int i, j;
769 #endif
770 tagtable(n, m, z->st, srcln, reach);
771 #ifdef HAS_UNLESS
772 for (i = 0; i < HAS_UNLESS; i++)
773 { j = trans[n][is]->escp[i];
774 if (!j) break;
775 tagtable(n, m, j, srcln, reach);
776 }
777 #endif
778 }
779 }
780 void
781 dfs_table(int n, int m, int is, short srcln[], uchar reach[], uchar lstate[])
782 { Trans *z;
783
784 if (is >= m || is <= 0 || !trans[n][is])
785 return;
786 if ((reach[is] & (4|8|16)) != 0)
787 { if ((reach[is] & (8|16)) == 16) /* on stack, not yet recorded */
788 { lstate[is] = 1;
789 reach[is] |= 8; /* recorded */
790 if (state_tables)
791 { printf("state %d line %d is a loopstate\n", is, srcln[is]);
792 } }
793 return;
794 }
795 reach[is] |= (4|16); /* visited | onstack */
796 for (z = trans[n][is]; z; z = z->nxt)
797 {
798 #ifdef HAS_UNLESS
799 int i, j;
800 #endif
801 dfs_table(n, m, z->st, srcln, reach, lstate);
802 #ifdef HAS_UNLESS
803 for (i = 0; i < HAS_UNLESS; i++)
804 { j = trans[n][is]->escp[i];
805 if (!j) break;
806 dfs_table(n, m, j, srcln, reach, lstate);
807 }
808 #endif
809 }
810 reach[is] &= ~16; /* no longer on stack */
811 }
812 void
813 do_dfs(int n, int m, int is, short srcln[], uchar reach[], uchar lstate[])
814 { int i;
815 dfs_table(n, m, is, srcln, reach, lstate);
816 for (i = 0; i < m; i++)
817 reach[i] &= ~(4|8|16);
818 }
819 void
820 crack(int n, int j, Trans *z, short srcln[])
821 { int i;
822
823 if (!z) return;
824 printf(" state %3d -(tr %3d)-> state %3d ",
825 j, z->forw, z->st);
826 printf("[id %3d tp %3d", z->t_id, z->tpe[0]);
827 if (z->tpe[1]) printf(",%d", z->tpe[1]);
828 #ifdef HAS_UNLESS
829 if (z->e_trans)
830 printf(" org %3d", z->e_trans);
831 else if (state_tables >= 2)
832 for (i = 0; i < HAS_UNLESS; i++)
833 { if (!z->escp[i]) break;
834 printf(" esc %d", z->escp[i]);
835 }
836 #endif
837 printf("]");
838 printf(" [%s%s%s%s%s] line %d => ",
839 z->atom&6?"A":z->atom&32?"D":"-",
840 accpstate[n][j]?"a" :"-",
841 stopstate[n][j]?"e" : "-",
842 progstate[n][j]?"p" : "-",
843 z->atom & 8 ?"L":"G",
844 srcln[j]);
845 for (i = 0; z->tp[i]; i++)
846 if (z->tp[i] == '\n')
847 printf("\\n");
848 else
849 putchar(z->tp[i]);
850 if (z->qu[0])
851 { printf("\t[");
852 for (i = 0; i < 6; i++)
853 if (z->qu[i])
854 printf("(%d,%d)",
855 z->qu[i], z->ty[i]);
856 printf("]");
857 }
858 printf("\n");
859 fflush(stdout);
860 }
861
862 #ifdef VAR_RANGES
863 #define BYTESIZE 32 /* 2^8 : 2^3 = 256:8 = 32 */
864
865 typedef struct Vr_Ptr {
866 char *nm;
867 uchar vals[BYTESIZE];
868 struct Vr_Ptr *nxt;
869 } Vr_Ptr;
870 Vr_Ptr *ranges = (Vr_Ptr *) 0;
871
872 void
873 logval(char *s, int v)
874 { Vr_Ptr *tmp;
875
876 if (v<0 || v > 255) return;
877 for (tmp = ranges; tmp; tmp = tmp->nxt)
878 if (!strcmp(tmp->nm, s))
879 goto found;
880 tmp = (Vr_Ptr *) emalloc(sizeof(Vr_Ptr));
881 tmp->nxt = ranges;
882 ranges = tmp;
883 tmp->nm = s;
884 found:
885 tmp->vals[(v)/8] |= 1<<((v)%8);
886 }
887
888 void
889 dumpval(uchar X[], int range)
890 { int w, x, i, j = -1;
891
892 for (w = i = 0; w < range; w++)
893 for (x = 0; x < 8; x++, i++)
894 {
895 from: if ((X[w] & (1<<x)))
896 { printf("%d", i);
897 j = i;
898 goto upto;
899 } }
900 return;
901 for (w = 0; w < range; w++)
902 for (x = 0; x < 8; x++, i++)
903 {
904 upto: if (!(X[w] & (1<<x)))
905 { if (i-1 == j)
906 printf(", ");
907 else
908 printf("-%d, ", i-1);
909 goto from;
910 } }
911 if (j >= 0 && j != 255)
912 printf("-255");
913 }
914
915 void
916 dumpranges(void)
917 { Vr_Ptr *tmp;
918 printf("\nValues assigned within ");
919 printf("interval [0..255]:\n");
920 for (tmp = ranges; tmp; tmp = tmp->nxt)
921 { printf("\t%s\t: ", tmp->nm);
922 dumpval(tmp->vals, BYTESIZE);
923 printf("\n");
924 }
925 }
926 #endif
This page took 0.048332 seconds and 4 git commands to generate.