7 tr_2_src(int m, char *file, int ln)
14 { printf("%5d trans %4d ", m, n);
15 printf("file %s line %3d\n",
16 T_SRC[n].fl, T_SRC[n].ln);
23 Trans *settr(int, int, int, int, int, char *, int, int, int);
25 trans = (Trans ***) emalloc(6*sizeof(Trans **));
27 /* proctype 4: :init: */
29 trans[4] = (Trans **) emalloc(59*sizeof(Trans *));
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 */
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 */
45 trans[4][7] = settr(126,2,11,1,0,"goto :b6", 1, 2, 0); /* m: 11 -> 0,17 */
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 */
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 */
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 */
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 */
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 */
76 trans[4][28] = settr(147,2,32,1,0,"goto :b8", 1, 2, 0); /* m: 32 -> 0,39 */
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 */
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 */
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 */
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 */
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 */
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 */
111 trans[4][51] = settr(170,2,55,1,0,"goto :b10", 1, 2, 0); /* m: 55 -> 0,58 */
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 */
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);
119 /* proctype 3: cleaner */
121 trans[3] = (Trans **) emalloc(10*sizeof(Trans *));
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 */
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 */
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);
137 /* proctype 2: reader */
139 trans[2] = (Trans **) emalloc(32*sizeof(Trans *));
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 */
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 */
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 */
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 */
175 trans[2][18] = settr(97,2,22,1,0,"goto :b4", 1, 2, 0); /* m: 22 -> 0,28 */
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 */
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);
187 /* proctype 1: tracer */
189 trans[1] = (Trans **) emalloc(51*sizeof(Trans *));
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
247 trans[1][33] = settr(62,2,37,1,0,"goto :b1", 1, 2, 0); /* m: 37 -> 0,43 */
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 */
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 */
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 */
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);
270 /* proctype 0: switcher */
272 trans[0] = (Trans **) emalloc(31*sizeof(Trans *));
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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);
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);
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));
334 tmp->atom = a&(6|32); /* only (2|8|32) have meaning */
335 if (!g) tmp->atom |= 8; /* no global references */
348 { Trans *tmp = (Trans *) emalloc(sizeof(Trans));
354 tmp->e_trans = a->e_trans;
355 for (i = 0; i < HAS_UNLESS; i++)
356 tmp->escp[i] = a->escp[i];
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];
364 tmp->tp = (char *) emalloc(strlen(a->tp)+1);
365 strcpy(tmp->tp, a->tp);
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");
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;
394 case TIMEOUT_F: return 257; /* non-zero, and > MAXQ */
396 Uerror("cannot happen srunc");
403 isthere(Trans *a, int b)
405 for (t = a; t; t = t->nxt)
413 mark_safety(Trans *t) /* for conditional safety */
414 { int g = 0, i, j, k;
418 return (t->qu[1])?2:1; /* marked */
420 for (i = 0; i < 2; i++)
421 { j = srinc_set(t->tpe[i]);
422 if (j >= GLOBAL && j != ALPHA_F)
425 { k = srunc(t->tpe[i], j);
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;
447 if (state_tables >= 4)
448 { printf("STEP 1 proctype %s\n",
450 for (i = 1; i < m; i++)
451 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
452 crack(n, i, T0, srcln);
456 for (i = 1, cnt = 0; i < m; 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)
466 printf("\tstate %d / %d: choice in choice\n",
470 for (T0 = T1; T0; T0 = T0->nxt)
471 { T3 = trans[n][T0->st];
473 { T2->nxt = cpytr(T0);
475 imed(T2, T0->st, n, i);
481 imed(T2, T0->st, n, i);
487 if (state_tables >= 3)
488 { printf("STEP 2 proctype %s\n",
490 for (i = 1; i < m; i++)
491 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
492 crack(n, i, T0, srcln);
495 for (i = 1; i < m; i++)
496 { if (trans[n][i] && trans[n][i]->nxt) /* optimize */
497 { T1 = trans[n][i]->nxt;
499 printf("\t\tpull %d (%d) to %d\n",
500 T1->st, T1->forw, i);
502 if (!trans[n][T1->st]) continue;
503 T0 = cpytr(trans[n][T1->st]);
506 imed(T0, T1->st, n, i);
507 for (T1 = T1->nxt; T1; T1 = T1->nxt)
510 printf("\t\tpull %d (%d) to %d\n",
511 T1->st, T1->forw, i);
513 if (!trans[n][T1->st]) continue;
514 T0->nxt = cpytr(trans[n][T1->st]);
517 imed(T0, T1->st, n, i);
519 if (state_tables >= 2)
520 { printf("STEP 3 proctype %s\n",
522 for (i = 1; i < m; i++)
523 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
524 crack(n, i, T0, srcln);
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-
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))
545 T2->nxt = trans[n][i];
548 } else /* outermost unless checked first */
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))
558 T2->nxt = (Trans *) 0;
560 if (T3) T3->nxt = T2;
565 { T3->nxt = trans[n][i];
572 for (i = 1; i < m; i++)
574 { /* moves through these states are visible */
575 #if PROG_LAB>0 && defined(HAS_NP)
578 for (T1 = trans[n][i]; T1; T1 = T1->nxt)
579 if (progstate[n][T1->st])
582 if (accpstate[n][i] || visstate[n][i])
584 for (T1 = trans[n][i]; T1; T1 = T1->nxt)
585 if (accpstate[n][T1->st])
590 g = mark_safety(T1); /* V3.3.1 */
591 if (g < 0) goto degrade; /* global */
592 /* check if mixing of guards preserves reduction */
595 for (T0 = T1; T0; T0 = T0->nxt)
598 for (aa = 0; aa < 2; aa++)
599 { j = srinc_set(T0->tpe[aa]);
600 if (j >= GLOBAL && j != ALPHA_F)
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]);
613 { k = srunc(T0->tpe[aa], j);
614 for (h = 0; h < 6; h++)
624 { T1->qu[0] = 0; /* turn it off */
625 printf("pan: warning, line %d, ",
627 printf("too many stmnt types (%d)",
629 printf(" in selection\n");
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;
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 */
642 if (!T1 || T1->qu[0]) continue;
644 if (T1->nxt && T1->atom&8)
646 { printf("warning: line %d ", srcln[i]);
647 printf("mixed condition ");
648 printf("(defeats reduction)\n");
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 ",
657 (j==5*DELTA)?"condi":"selec");
658 printf("(defeats reduction)\n");
659 printf(" '%s' <-> '%s'\n",
665 for (i = 1; i < m; i++)
669 || strncmp(T2->tp, ".(goto)", 7)
672 stopstate[n][T2->st] = 1;
675 { printf("proctype ");
676 if (!strcmp(procname[n], ":init:"))
679 printf("%s\n", procname[n]);
680 for (i = 1; i < m; i++)
682 tagtable(n, m, is, srcln, reach);
684 for (i = 1; i < m; i++)
686 if (strcmp(procname[n], ":never:") != 0)
687 { for (T0 = trans[n][i]; T0; T0 = T0->nxt)
689 && strcmp(T0->tp, "(1)") == 0)
690 { printf("error: proctype '%s' ",
692 printf("line %d, state %d: has un",
694 printf("conditional self-loop\n");
698 for (T0 = trans[n][i]; T0; T0 = T0->nxt)
699 { if (strcmp(T0->tp, "else") == 0)
703 { printf("error: proctype '%s' state",
705 printf(" %d, inherits %d", i, nrelse);
706 printf(" 'else' stmnts\n");
709 if (!state_tables && strcmp(procname[n], ":never:") == 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;
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;
723 do_dfs(n, m, is, srcln, reach, lstate);
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;
732 for (T0 = trans[n][i]; T0; T0 = T4)
734 if (strcmp(T0->tp, "else") == 0)
736 T0->nxt = (Trans *) 0;
739 if (!T1) { T2 = T0; }
742 if (T2 && T3) { T2->nxt = T3; }
743 trans[n][i] = T1; /* reversed -- else at end */
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;
755 tagtable(int n, int m, int is, short srcln[], uchar reach[])
758 if (is >= m || !trans[n][is]
759 || is <= 0 || reach[is] == 0)
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)
770 tagtable(n, m, z->st, srcln, reach);
772 for (i = 0; i < HAS_UNLESS; i++)
773 { j = trans[n][is]->escp[i];
775 tagtable(n, m, j, srcln, reach);
781 dfs_table(int n, int m, int is, short srcln[], uchar reach[], uchar lstate[])
784 if (is >= m || is <= 0 || !trans[n][is])
786 if ((reach[is] & (4|8|16)) != 0)
787 { if ((reach[is] & (8|16)) == 16) /* on stack, not yet recorded */
789 reach[is] |= 8; /* recorded */
791 { printf("state %d line %d is a loopstate\n", is, srcln[is]);
795 reach[is] |= (4|16); /* visited | onstack */
796 for (z = trans[n][is]; z; z = z->nxt)
801 dfs_table(n, m, z->st, srcln, reach, lstate);
803 for (i = 0; i < HAS_UNLESS; i++)
804 { j = trans[n][is]->escp[i];
806 dfs_table(n, m, j, srcln, reach, lstate);
810 reach[is] &= ~16; /* no longer on stack */
813 do_dfs(int n, int m, int is, short srcln[], uchar reach[], uchar lstate[])
815 dfs_table(n, m, is, srcln, reach, lstate);
816 for (i = 0; i < m; i++)
817 reach[i] &= ~(4|8|16);
820 crack(int n, int j, Trans *z, short srcln[])
824 printf(" state %3d -(tr %3d)-> state %3d ",
826 printf("[id %3d tp %3d", z->t_id, z->tpe[0]);
827 if (z->tpe[1]) printf(",%d", z->tpe[1]);
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]);
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",
845 for (i = 0; z->tp[i]; i++)
846 if (z->tp[i] == '\n')
852 for (i = 0; i < 6; i++)
863 #define BYTESIZE 32 /* 2^8 : 2^3 = 256:8 = 32 */
865 typedef struct Vr_Ptr {
867 uchar vals[BYTESIZE];
870 Vr_Ptr *ranges = (Vr_Ptr *) 0;
873 logval(char *s, int v)
876 if (v<0 || v > 255) return;
877 for (tmp = ranges; tmp; tmp = tmp->nxt)
878 if (!strcmp(tmp->nm, s))
880 tmp = (Vr_Ptr *) emalloc(sizeof(Vr_Ptr));
885 tmp->vals[(v)/8] |= 1<<((v)%8);
889 dumpval(uchar X[], int range)
890 { int w, x, i, j = -1;
892 for (w = i = 0; w < range; w++)
893 for (x = 0; x < 8; x++, i++)
895 from: if ((X[w] & (1<<x)))
901 for (w = 0; w < range; w++)
902 for (x = 0; x < 8; x++, i++)
904 upto: if (!(X[w] & (1<<x)))
908 printf("-%d, ", i-1);
911 if (j >= 0 && j != 255)
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);