1 /***** spin: pangen5.h *****/
4 * This file is part of the public release of Spin. It is subject to the
5 * terms in the LICENSE file that is included in this source directory.
6 * Tool documentation is available at http://spinroot.com
9 static const char *Xpt[] = {
10 "#if defined(MA) && (defined(W_XPT) || defined(R_XPT))",
11 "static Vertex **temptree;",
12 "static char wbuf[4096];",
13 "static int WCNT = 4096, wcnt=0;",
14 "static uchar stacker[MA+1];",
15 "static ulong stackcnt = 0;",
16 "extern double nstates, nlinks, truncs, truncs2;",
19 "xwrite(int fd, char *b, int n)",
21 " if (wcnt+n >= 4096)",
22 " { write(fd, wbuf, wcnt);",
25 " memcpy(&wbuf[wcnt], b, n);",
33 " write(fd, wbuf, wcnt);",
39 "w_vertex(int fd, Vertex *v)",
40 "{ char t[3]; int i; Edge *e;",
42 " xwrite(fd, (char *) &v, sizeof(Vertex *));",
44 " for (i = 0; i < 2; i++)",
46 " { t[1] = v->from[i], t[2] = v->to[i];",
48 " xwrite(fd, (char *) &(v->dst[i]), sizeof(Vertex *));",
50 " for (e = v->Succ; e; e = e->Nxt)",
51 " { t[1] = e->From, t[2] = e->To;",
53 " xwrite(fd, (char *) &(e->Dst), sizeof(Vertex *));",
56 " { t[1] = t[2] = e->S;",
58 " xwrite(fd, (char *) &(e->Dst), sizeof(Vertex *));",
63 "w_layer(int fd, Vertex *v)",
67 " xwrite(fd, (char *) &c, 1);",
69 " w_layer(fd, v->lnk);",
70 " w_layer(fd, v->left);",
71 " w_layer(fd, v->right);",
76 "{ int fd; char nm[64];",
77 " int i, j; uchar c;",
78 " static uchar xwarned = 0;",
80 " sprintf(nm, \"%%s.xpt\", PanSource);",
81 " if ((fd = creat(nm, 0666)) <= 0)",
84 " printf(\"cannot creat checkpoint file\\n\");",
87 " xwrite(fd, (char *) &nstates, sizeof(double));",
88 " xwrite(fd, (char *) &truncs, sizeof(double));",
89 " xwrite(fd, (char *) &truncs2, sizeof(double));",
90 " xwrite(fd, (char *) &nlinks, sizeof(double));",
91 " xwrite(fd, (char *) &dfa_depth, sizeof(int));",
92 " xwrite(fd, (char *) &R, sizeof(Vertex *));",
93 " xwrite(fd, (char *) &F, sizeof(Vertex *));",
94 " xwrite(fd, (char *) &NF, sizeof(Vertex *));",
96 " for (j = 0; j < TWIDTH; j++)",
97 " for (i = 0; i < dfa_depth+1; i++)",
98 " { w_layer(fd, layers[i*TWIDTH+j]);",
99 " c = 2; xwrite(fd, (char *) &c, 1);",
105 "xread(int fd, char *b, int n)",
106 "{ int m = wcnt; int delta = 0;",
108 " { if (m > 0) memcpy(b, &wbuf[WCNT-m], m);",
110 " WCNT = wcnt = read(fd, wbuf, 4096);",
112 " Uerror(\"xread failed -- insufficient data\");",
115 " memcpy(&b[delta], &wbuf[WCNT-wcnt], n);",
120 "x_cleanup(Vertex *c)",
121 "{ Edge *e; /* remove the tree and edges from c */",
123 " for (e = c->Succ; e; e = e->Nxt)",
124 " x_cleanup(e->Dst);",
130 "{ Vertex *tmp; int i, s;",
132 " /* double-check: */",
133 " stacker[dfa_depth-1] = 0; r = dfa_store(stacker);",
134 " stacker[dfa_depth-1] = 4; j = dfa_member(dfa_depth-1);",
135 " if (r != 1 || j != 0)",
136 " { printf(\"%%lu: \", stackcnt);",
137 " for (i = 0; i < dfa_depth; i++)",
138 " printf(\"%%d,\", stacker[i]);",
139 " printf(\" -- not a stackstate <o:%%d,4:%%d>\\n\", r, j);",
142 " stacker[dfa_depth-1] = 1;",
143 " s = dfa_member(dfa_depth-1);",
145 " { tmp = F; F = NF; NF = tmp; } /* complement */",
146 " if (s) dfa_store(stacker);",
147 " stacker[dfa_depth-1] = 0;",
148 " dfa_store(stacker);",
150 " { tmp = F; F = NF; NF = tmp; }",
154 "x_rm_stack(Vertex *t, int k)",
162 " for (e = t->Succ; e; e = e->Nxt)",
163 " { for (j = e->From; j <= (int) e->To; j++)",
164 " { stacker[k] = (uchar) j;",
165 " x_rm_stack(e->Dst, k-1);",
168 " { stacker[k] = e->S;",
169 " x_rm_stack(e->Dst, k-1);",
174 "insert_withkey(Vertex *v, int L)",
175 "{ Vertex *new, *t = temptree[L];",
177 " if (!t) { temptree[L] = v; return v; }",
178 " t = splay(v->key, t);",
179 " if (v->key < t->key)",
181 " new->left = t->left;",
183 " t->left = (Vertex *) 0;",
184 " } else if (v->key > t->key)",
186 " new->right = t->right;",
188 " t->right = (Vertex *) 0;",
190 " { if (t != R && t != F && t != NF)",
191 " Uerror(\"double insert, bad checkpoint data\");",
193 " { recyc_vertex(v);",
196 " temptree[L] = new;",
202 "find_withkey(Vertex *v, int L)",
203 "{ Vertex *t = temptree[L];",
205 " { temptree[L] = t = splay((ulong) v, t);",
206 " if (t->key == (ulong) v)",
209 " Uerror(\"not found error, bad checkpoint data\");",
210 " return (Vertex *) 0;",
214 "r_layer(int fd, int n)",
220 " { xread(fd, &c, 1);",
221 " if (c == 2) break;",
223 " { v = new_vertex();",
224 " xread(fd, (char *) &(v->key), sizeof(Vertex *));",
225 " v = insert_withkey(v, n);",
226 " } else /* c == 0 */",
227 " { e = new_edge((Vertex *) 0);",
231 " xread(fd, (char *) &(e->Dst), sizeof(Vertex *));",
232 " insert_edge(v, e);",
237 "v_fix(Vertex *t, int nr)",
242 " for (i = 0; i < 2; i++)",
244 " t->dst[i] = find_withkey(t->dst[i], nr);",
246 " for (e = t->Succ; e; e = e->Nxt)",
247 " e->Dst = find_withkey(e->Dst, nr);",
249 " v_fix(t->left, nr);",
250 " v_fix(t->right, nr);",
254 "v_insert(Vertex *t, int nr)",
258 " v_insert(t->left, nr);",
259 " v_insert(t->right, nr);",
261 " /* remove only leafs from temptree */",
262 " t->left = t->right = t->lnk = (Vertex *) 0;",
263 " insert_it(t, nr); /* into layers */",
264 " for (i = 0; i < 2; i++)",
266 " t->dst[i]->num += (t->to[i] - t->from[i] + 1);",
267 " for (e = t->Succ; e; e = e->Nxt)",
268 " e->Dst->num += (e->To - e->From + 1 + e->s);",
275 " for (i = 0; i < dfa_depth; i++)",
276 " v_fix(temptree[i], (i+1));",
278 " for (i = dfa_depth; i >= 0; i--)",
279 " v_insert(temptree[i], i);",
283 "x_tail(Vertex *t, ulong want)",
284 "{ int i, yes, no; Edge *e; Vertex *v = (Vertex *) 0;",
286 " if (!t) return v;",
289 " for (i = 0; i < 2; i++)",
290 " if ((ulong) t->dst[i] == want)",
291 " { /* was t->from[i] <= 0 && t->to[i] >= 0 */",
292 " /* but from and to are uchar */",
293 " if (t->from[i] == 0)",
296 " if (t->from[i] <= 4 && t->to[i] >= 4)",
300 " for (e = t->Succ; e; e = e->Nxt)",
301 " if ((ulong) e->Dst == want)",
302 " { /* was INRANGE(e,0) but From and To are uchar */",
303 " if ((e->From == 0) || (e->s==1 && e->S==0))",
305 " else if (INRANGE(e, 4))",
308 " if (yes && !no) return t;",
309 " v = x_tail(t->left, want); if (v) return v;",
310 " v = x_tail(t->right, want); if (v) return v;",
311 " return (Vertex *) 0;",
315 "x_anytail(Vertex *t, Vertex *c, int nr)",
316 "{ int i; Edge *e, *f; Vertex *v;",
320 " for (i = 0; i < 2; i++)",
321 " if ((ulong) t->dst[i] == c->key)",
322 " { v = new_vertex(); v->key = t->key;",
324 " f->From = t->from[i];",
325 " f->To = t->to[i];",
326 " f->Nxt = c->Succ;",
329 " x_anytail(temptree[nr-1], v, nr-1);",
332 " for (e = t->Succ; e; e = e->Nxt)",
333 " if ((ulong) e->Dst == c->key)",
334 " { v = new_vertex(); v->key = t->key;",
336 " f->From = e->From;",
340 " f->Nxt = c->Succ;",
342 " x_anytail(temptree[nr-1], v, nr-1);",
345 " x_anytail(t->left, c, nr);",
346 " x_anytail(t->right, c, nr);",
351 "{ Vertex *c, *v; /* find 0 and !4 predecessor of F */",
353 " v = x_tail(temptree[dfa_depth-1], F->key);",
354 " if (!v) return (Vertex *) 0;",
356 " c = new_vertex(); c->key = v->key;",
358 " /* every node on dfa_depth-2 that has v->key as succ */",
359 " /* make copy and let c point to these (reversing ptrs) */",
361 " x_anytail(temptree[dfa_depth-2], c, dfa_depth-2);",
368 "{ int fd; char nm[64]; Vertex *d;",
372 " sprintf(nm, \"%%s.xpt\", PanSource);",
373 " if ((fd = open(nm, 0)) < 0) /* O_RDONLY */",
374 " Uerror(\"cannot open checkpoint file\");",
376 " xread(fd, (char *) &nstates, sizeof(double));",
377 " xread(fd, (char *) &truncs, sizeof(double));",
378 " xread(fd, (char *) &truncs2, sizeof(double));",
379 " xread(fd, (char *) &nlinks, sizeof(double));",
380 " xread(fd, (char *) &dfa_depth, sizeof(int));",
382 " if (dfa_depth != MA+a_cycles)",
383 " Uerror(\"bad dfa_depth in checkpoint file\");",
385 " path = (Vertex **) emalloc((dfa_depth+1)*sizeof(Vertex *));",
386 " layers = (Vertex **) emalloc(TWIDTH*(dfa_depth+1)*sizeof(Vertex *));",
387 " temptree = (Vertex **) emalloc((dfa_depth+2)*sizeof(Vertex *));",
388 " lastword = (uchar *) emalloc((dfa_depth+1)*sizeof(uchar));",
389 " lastword[dfa_depth] = lastword[0] = 255; ",
391 " path[0] = R = new_vertex();",
392 " xread(fd, (char *) &R->key, sizeof(Vertex *));",
393 " R = insert_withkey(R, 0);",
395 " F = new_vertex();",
396 " xread(fd, (char *) &F->key, sizeof(Vertex *));",
397 " F = insert_withkey(F, dfa_depth);",
399 " NF = new_vertex();",
400 " xread(fd, (char *) &NF->key, sizeof(Vertex *));",
401 " NF = insert_withkey(NF, dfa_depth);",
403 " for (j = 0; j < TWIDTH; j++)",
404 " for (i = 0; i < dfa_depth+1; i++)",
407 " if (wcnt != 0) Uerror(\"bad count in checkpoint file\");",
411 " stacker[dfa_depth-1] = 0;",
412 " x_rm_stack(d, dfa_depth-2);",
416 " printf(\"pan: removed %%lu stackstates\\n\", stackcnt);",
417 " nstates -= (double) stackcnt;",