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