17dd7cddfSDavid du Colombier /***** spin: pangen5.h *****/ 27dd7cddfSDavid du Colombier 3*de2caf28SDavid du Colombier /* 4*de2caf28SDavid du Colombier * This file is part of the public release of Spin. It is subject to the 5*de2caf28SDavid du Colombier * terms in the LICENSE file that is included in this source directory. 6*de2caf28SDavid du Colombier * Tool documentation is available at http://spinroot.com 7*de2caf28SDavid du Colombier */ 87dd7cddfSDavid du Colombier 9*de2caf28SDavid du Colombier static const char *Xpt[] = { 10312a1df1SDavid du Colombier "#if defined(MA) && (defined(W_XPT) || defined(R_XPT))", 117dd7cddfSDavid du Colombier "static Vertex **temptree;", 127dd7cddfSDavid du Colombier "static char wbuf[4096];", 137dd7cddfSDavid du Colombier "static int WCNT = 4096, wcnt=0;", 147dd7cddfSDavid du Colombier "static uchar stacker[MA+1];", 157dd7cddfSDavid du Colombier "static ulong stackcnt = 0;", 167dd7cddfSDavid du Colombier "extern double nstates, nlinks, truncs, truncs2;", 177dd7cddfSDavid du Colombier "", 187dd7cddfSDavid du Colombier "static void", 197dd7cddfSDavid du Colombier "xwrite(int fd, char *b, int n)", 207dd7cddfSDavid du Colombier "{", 217dd7cddfSDavid du Colombier " if (wcnt+n >= 4096)", 227dd7cddfSDavid du Colombier " { write(fd, wbuf, wcnt);", 237dd7cddfSDavid du Colombier " wcnt = 0;", 247dd7cddfSDavid du Colombier " }", 257dd7cddfSDavid du Colombier " memcpy(&wbuf[wcnt], b, n);", 267dd7cddfSDavid du Colombier " wcnt += n;", 277dd7cddfSDavid du Colombier "}", 287dd7cddfSDavid du Colombier "", 297dd7cddfSDavid du Colombier "static void", 30*de2caf28SDavid du Colombier "wclose(int fd)", 317dd7cddfSDavid du Colombier "{", 327dd7cddfSDavid du Colombier " if (wcnt > 0)", 337dd7cddfSDavid du Colombier " write(fd, wbuf, wcnt);", 347dd7cddfSDavid du Colombier " wcnt = 0;", 357dd7cddfSDavid du Colombier " close(fd);", 367dd7cddfSDavid du Colombier "}", 377dd7cddfSDavid du Colombier "", 387dd7cddfSDavid du Colombier "static void", 397dd7cddfSDavid du Colombier "w_vertex(int fd, Vertex *v)", 407dd7cddfSDavid du Colombier "{ char t[3]; int i; Edge *e;", 417dd7cddfSDavid du Colombier "", 427dd7cddfSDavid du Colombier " xwrite(fd, (char *) &v, sizeof(Vertex *));", 437dd7cddfSDavid du Colombier " t[0] = 0;", 447dd7cddfSDavid du Colombier " for (i = 0; i < 2; i++)", 457dd7cddfSDavid du Colombier " if (v->dst[i])", 467dd7cddfSDavid du Colombier " { t[1] = v->from[i], t[2] = v->to[i];", 477dd7cddfSDavid du Colombier " xwrite(fd, t, 3);", 487dd7cddfSDavid du Colombier " xwrite(fd, (char *) &(v->dst[i]), sizeof(Vertex *));", 497dd7cddfSDavid du Colombier " }", 507dd7cddfSDavid du Colombier " for (e = v->Succ; e; e = e->Nxt)", 517dd7cddfSDavid du Colombier " { t[1] = e->From, t[2] = e->To;", 527dd7cddfSDavid du Colombier " xwrite(fd, t, 3);", 537dd7cddfSDavid du Colombier " xwrite(fd, (char *) &(e->Dst), sizeof(Vertex *));", 547dd7cddfSDavid du Colombier "", 557dd7cddfSDavid du Colombier " if (e->s)", 567dd7cddfSDavid du Colombier " { t[1] = t[2] = e->S;", 577dd7cddfSDavid du Colombier " xwrite(fd, t, 3);", 587dd7cddfSDavid du Colombier " xwrite(fd, (char *) &(e->Dst), sizeof(Vertex *));", 597dd7cddfSDavid du Colombier " } }", 607dd7cddfSDavid du Colombier "}", 617dd7cddfSDavid du Colombier "", 627dd7cddfSDavid du Colombier "static void", 637dd7cddfSDavid du Colombier "w_layer(int fd, Vertex *v)", 647dd7cddfSDavid du Colombier "{ uchar c=1;", 657dd7cddfSDavid du Colombier "", 667dd7cddfSDavid du Colombier " if (!v) return;", 677dd7cddfSDavid du Colombier " xwrite(fd, (char *) &c, 1);", 687dd7cddfSDavid du Colombier " w_vertex(fd, v);", 697dd7cddfSDavid du Colombier " w_layer(fd, v->lnk);", 707dd7cddfSDavid du Colombier " w_layer(fd, v->left);", 717dd7cddfSDavid du Colombier " w_layer(fd, v->right);", 727dd7cddfSDavid du Colombier "}", 737dd7cddfSDavid du Colombier "", 747dd7cddfSDavid du Colombier "void", 757dd7cddfSDavid du Colombier "w_xpoint(void)", 767dd7cddfSDavid du Colombier "{ int fd; char nm[64];", 777dd7cddfSDavid du Colombier " int i, j; uchar c;", 787dd7cddfSDavid du Colombier " static uchar xwarned = 0;", 797dd7cddfSDavid du Colombier "", 8000d97012SDavid du Colombier " sprintf(nm, \"%%s.xpt\", PanSource);", 817dd7cddfSDavid du Colombier " if ((fd = creat(nm, 0666)) <= 0)", 827dd7cddfSDavid du Colombier " if (!xwarned)", 837dd7cddfSDavid du Colombier " { xwarned = 1;", 847dd7cddfSDavid du Colombier " printf(\"cannot creat checkpoint file\\n\");", 857dd7cddfSDavid du Colombier " return;", 867dd7cddfSDavid du Colombier " }", 877dd7cddfSDavid du Colombier " xwrite(fd, (char *) &nstates, sizeof(double));", 887dd7cddfSDavid du Colombier " xwrite(fd, (char *) &truncs, sizeof(double));", 897dd7cddfSDavid du Colombier " xwrite(fd, (char *) &truncs2, sizeof(double));", 907dd7cddfSDavid du Colombier " xwrite(fd, (char *) &nlinks, sizeof(double));", 917dd7cddfSDavid du Colombier " xwrite(fd, (char *) &dfa_depth, sizeof(int));", 927dd7cddfSDavid du Colombier " xwrite(fd, (char *) &R, sizeof(Vertex *));", 937dd7cddfSDavid du Colombier " xwrite(fd, (char *) &F, sizeof(Vertex *));", 947dd7cddfSDavid du Colombier " xwrite(fd, (char *) &NF, sizeof(Vertex *));", 957dd7cddfSDavid du Colombier "", 967dd7cddfSDavid du Colombier " for (j = 0; j < TWIDTH; j++)", 977dd7cddfSDavid du Colombier " for (i = 0; i < dfa_depth+1; i++)", 987dd7cddfSDavid du Colombier " { w_layer(fd, layers[i*TWIDTH+j]);", 997dd7cddfSDavid du Colombier " c = 2; xwrite(fd, (char *) &c, 1);", 1007dd7cddfSDavid du Colombier " }", 1017dd7cddfSDavid du Colombier " wclose(fd);", 1027dd7cddfSDavid du Colombier "}", 1037dd7cddfSDavid du Colombier "", 1047dd7cddfSDavid du Colombier "static void", 1057dd7cddfSDavid du Colombier "xread(int fd, char *b, int n)", 1067dd7cddfSDavid du Colombier "{ int m = wcnt; int delta = 0;", 1077dd7cddfSDavid du Colombier " if (m < n)", 1087dd7cddfSDavid du Colombier " { if (m > 0) memcpy(b, &wbuf[WCNT-m], m);", 1097dd7cddfSDavid du Colombier " delta = m;", 1107dd7cddfSDavid du Colombier " WCNT = wcnt = read(fd, wbuf, 4096);", 1117dd7cddfSDavid du Colombier " if (wcnt < n-m)", 1127dd7cddfSDavid du Colombier " Uerror(\"xread failed -- insufficient data\");", 1137dd7cddfSDavid du Colombier " n -= m;", 1147dd7cddfSDavid du Colombier " }", 1157dd7cddfSDavid du Colombier " memcpy(&b[delta], &wbuf[WCNT-wcnt], n);", 1167dd7cddfSDavid du Colombier " wcnt -= n;", 1177dd7cddfSDavid du Colombier "}", 1187dd7cddfSDavid du Colombier "", 1197dd7cddfSDavid du Colombier "static void", 1207dd7cddfSDavid du Colombier "x_cleanup(Vertex *c)", 1217dd7cddfSDavid du Colombier "{ Edge *e; /* remove the tree and edges from c */", 1227dd7cddfSDavid du Colombier " if (!c) return;", 1237dd7cddfSDavid du Colombier " for (e = c->Succ; e; e = e->Nxt)", 1247dd7cddfSDavid du Colombier " x_cleanup(e->Dst);", 1257dd7cddfSDavid du Colombier " recyc_vertex(c);", 1267dd7cddfSDavid du Colombier "}", 1277dd7cddfSDavid du Colombier "", 1287dd7cddfSDavid du Colombier "static void", 1297dd7cddfSDavid du Colombier "x_remove(void)", 1307dd7cddfSDavid du Colombier "{ Vertex *tmp; int i, s;", 1317dd7cddfSDavid du Colombier " int r, j;", 1327dd7cddfSDavid du Colombier " /* double-check: */", 1337dd7cddfSDavid du Colombier " stacker[dfa_depth-1] = 0; r = dfa_store(stacker);", 1347dd7cddfSDavid du Colombier " stacker[dfa_depth-1] = 4; j = dfa_member(dfa_depth-1);", 1357dd7cddfSDavid du Colombier " if (r != 1 || j != 0)", 136*de2caf28SDavid du Colombier " { printf(\"%%lu: \", stackcnt);", 1377dd7cddfSDavid du Colombier " for (i = 0; i < dfa_depth; i++)", 1387dd7cddfSDavid du Colombier " printf(\"%%d,\", stacker[i]);", 1397dd7cddfSDavid du Colombier " printf(\" -- not a stackstate <o:%%d,4:%%d>\\n\", r, j);", 1407dd7cddfSDavid du Colombier " return;", 1417dd7cddfSDavid du Colombier " }", 1427dd7cddfSDavid du Colombier " stacker[dfa_depth-1] = 1;", 1437dd7cddfSDavid du Colombier " s = dfa_member(dfa_depth-1);", 1447dd7cddfSDavid du Colombier "", 1457dd7cddfSDavid du Colombier " { tmp = F; F = NF; NF = tmp; } /* complement */", 1467dd7cddfSDavid du Colombier " if (s) dfa_store(stacker);", 1477dd7cddfSDavid du Colombier " stacker[dfa_depth-1] = 0;", 1487dd7cddfSDavid du Colombier " dfa_store(stacker);", 1497dd7cddfSDavid du Colombier " stackcnt++;", 1507dd7cddfSDavid du Colombier " { tmp = F; F = NF; NF = tmp; }", 1517dd7cddfSDavid du Colombier "}", 1527dd7cddfSDavid du Colombier "", 1537dd7cddfSDavid du Colombier "static void", 1547dd7cddfSDavid du Colombier "x_rm_stack(Vertex *t, int k)", 1557dd7cddfSDavid du Colombier "{ int j; Edge *e;", 1567dd7cddfSDavid du Colombier "", 1577dd7cddfSDavid du Colombier " if (k == 0)", 1587dd7cddfSDavid du Colombier " { x_remove();", 1597dd7cddfSDavid du Colombier " return;", 1607dd7cddfSDavid du Colombier " }", 1617dd7cddfSDavid du Colombier " if (t)", 1627dd7cddfSDavid du Colombier " for (e = t->Succ; e; e = e->Nxt)", 1637dd7cddfSDavid du Colombier " { for (j = e->From; j <= (int) e->To; j++)", 1647dd7cddfSDavid du Colombier " { stacker[k] = (uchar) j;", 1657dd7cddfSDavid du Colombier " x_rm_stack(e->Dst, k-1);", 1667dd7cddfSDavid du Colombier " }", 1677dd7cddfSDavid du Colombier " if (e->s)", 1687dd7cddfSDavid du Colombier " { stacker[k] = e->S;", 1697dd7cddfSDavid du Colombier " x_rm_stack(e->Dst, k-1);", 1707dd7cddfSDavid du Colombier " } }", 1717dd7cddfSDavid du Colombier "}", 1727dd7cddfSDavid du Colombier "", 1737dd7cddfSDavid du Colombier "static Vertex *", 1747dd7cddfSDavid du Colombier "insert_withkey(Vertex *v, int L)", 1757dd7cddfSDavid du Colombier "{ Vertex *new, *t = temptree[L];", 1767dd7cddfSDavid du Colombier "", 1777dd7cddfSDavid du Colombier " if (!t) { temptree[L] = v; return v; }", 1787dd7cddfSDavid du Colombier " t = splay(v->key, t);", 1797dd7cddfSDavid du Colombier " if (v->key < t->key)", 1807dd7cddfSDavid du Colombier " { new = v;", 1817dd7cddfSDavid du Colombier " new->left = t->left;", 1827dd7cddfSDavid du Colombier " new->right = t;", 1837dd7cddfSDavid du Colombier " t->left = (Vertex *) 0;", 1847dd7cddfSDavid du Colombier " } else if (v->key > t->key)", 1857dd7cddfSDavid du Colombier " { new = v;", 1867dd7cddfSDavid du Colombier " new->right = t->right;", 1877dd7cddfSDavid du Colombier " new->left = t;", 1887dd7cddfSDavid du Colombier " t->right = (Vertex *) 0;", 1897dd7cddfSDavid du Colombier " } else", 1907dd7cddfSDavid du Colombier " { if (t != R && t != F && t != NF)", 1917dd7cddfSDavid du Colombier " Uerror(\"double insert, bad checkpoint data\");", 1927dd7cddfSDavid du Colombier " else", 1937dd7cddfSDavid du Colombier " { recyc_vertex(v);", 1947dd7cddfSDavid du Colombier " new = t;", 1957dd7cddfSDavid du Colombier " } }", 1967dd7cddfSDavid du Colombier " temptree[L] = new;", 1977dd7cddfSDavid du Colombier "", 1987dd7cddfSDavid du Colombier " return new;", 1997dd7cddfSDavid du Colombier "}", 2007dd7cddfSDavid du Colombier "", 2017dd7cddfSDavid du Colombier "static Vertex *", 2027dd7cddfSDavid du Colombier "find_withkey(Vertex *v, int L)", 2037dd7cddfSDavid du Colombier "{ Vertex *t = temptree[L];", 2047dd7cddfSDavid du Colombier " if (t)", 2057dd7cddfSDavid du Colombier " { temptree[L] = t = splay((ulong) v, t);", 2067dd7cddfSDavid du Colombier " if (t->key == (ulong) v)", 2077dd7cddfSDavid du Colombier " return t;", 2087dd7cddfSDavid du Colombier " }", 2097dd7cddfSDavid du Colombier " Uerror(\"not found error, bad checkpoint data\");", 2107dd7cddfSDavid du Colombier " return (Vertex *) 0;", 2117dd7cddfSDavid du Colombier "}", 2127dd7cddfSDavid du Colombier "", 2137dd7cddfSDavid du Colombier "void", 2147dd7cddfSDavid du Colombier "r_layer(int fd, int n)", 2157dd7cddfSDavid du Colombier "{ Vertex *v;", 2167dd7cddfSDavid du Colombier " Edge *e;", 2177dd7cddfSDavid du Colombier " char c, t[2];", 2187dd7cddfSDavid du Colombier "", 2197dd7cddfSDavid du Colombier " for (;;)", 2207dd7cddfSDavid du Colombier " { xread(fd, &c, 1);", 2217dd7cddfSDavid du Colombier " if (c == 2) break;", 2227dd7cddfSDavid du Colombier " if (c == 1)", 2237dd7cddfSDavid du Colombier " { v = new_vertex();", 2247dd7cddfSDavid du Colombier " xread(fd, (char *) &(v->key), sizeof(Vertex *));", 2257dd7cddfSDavid du Colombier " v = insert_withkey(v, n);", 2267dd7cddfSDavid du Colombier " } else /* c == 0 */", 2277dd7cddfSDavid du Colombier " { e = new_edge((Vertex *) 0);", 2287dd7cddfSDavid du Colombier " xread(fd, t, 2);", 2297dd7cddfSDavid du Colombier " e->From = t[0];", 2307dd7cddfSDavid du Colombier " e->To = t[1];", 2317dd7cddfSDavid du Colombier " xread(fd, (char *) &(e->Dst), sizeof(Vertex *));", 2327dd7cddfSDavid du Colombier " insert_edge(v, e);", 2337dd7cddfSDavid du Colombier " } }", 2347dd7cddfSDavid du Colombier "}", 2357dd7cddfSDavid du Colombier "", 2367dd7cddfSDavid du Colombier "static void", 2377dd7cddfSDavid du Colombier "v_fix(Vertex *t, int nr)", 2387dd7cddfSDavid du Colombier "{ int i; Edge *e;", 2397dd7cddfSDavid du Colombier "", 2407dd7cddfSDavid du Colombier " if (!t) return;", 2417dd7cddfSDavid du Colombier "", 2427dd7cddfSDavid du Colombier " for (i = 0; i < 2; i++)", 2437dd7cddfSDavid du Colombier " if (t->dst[i])", 2447dd7cddfSDavid du Colombier " t->dst[i] = find_withkey(t->dst[i], nr);", 2457dd7cddfSDavid du Colombier "", 2467dd7cddfSDavid du Colombier " for (e = t->Succ; e; e = e->Nxt)", 2477dd7cddfSDavid du Colombier " e->Dst = find_withkey(e->Dst, nr);", 2487dd7cddfSDavid du Colombier " ", 2497dd7cddfSDavid du Colombier " v_fix(t->left, nr);", 2507dd7cddfSDavid du Colombier " v_fix(t->right, nr);", 2517dd7cddfSDavid du Colombier "}", 2527dd7cddfSDavid du Colombier "", 2537dd7cddfSDavid du Colombier "static void", 2547dd7cddfSDavid du Colombier "v_insert(Vertex *t, int nr)", 2557dd7cddfSDavid du Colombier "{ Edge *e; int i;", 2567dd7cddfSDavid du Colombier "", 2577dd7cddfSDavid du Colombier " if (!t) return;", 2587dd7cddfSDavid du Colombier " v_insert(t->left, nr);", 2597dd7cddfSDavid du Colombier " v_insert(t->right, nr);", 2607dd7cddfSDavid du Colombier "", 2617dd7cddfSDavid du Colombier " /* remove only leafs from temptree */", 2627dd7cddfSDavid du Colombier " t->left = t->right = t->lnk = (Vertex *) 0;", 2637dd7cddfSDavid du Colombier " insert_it(t, nr); /* into layers */", 2647dd7cddfSDavid du Colombier " for (i = 0; i < 2; i++)", 2657dd7cddfSDavid du Colombier " if (t->dst[i])", 2667dd7cddfSDavid du Colombier " t->dst[i]->num += (t->to[i] - t->from[i] + 1);", 2677dd7cddfSDavid du Colombier " for (e = t->Succ; e; e = e->Nxt)", 2687dd7cddfSDavid du Colombier " e->Dst->num += (e->To - e->From + 1 + e->s);", 2697dd7cddfSDavid du Colombier "}", 2707dd7cddfSDavid du Colombier "", 2717dd7cddfSDavid du Colombier "static void", 2727dd7cddfSDavid du Colombier "x_fixup(void)", 2737dd7cddfSDavid du Colombier "{ int i;", 2747dd7cddfSDavid du Colombier "", 2757dd7cddfSDavid du Colombier " for (i = 0; i < dfa_depth; i++)", 2767dd7cddfSDavid du Colombier " v_fix(temptree[i], (i+1));", 2777dd7cddfSDavid du Colombier "", 2787dd7cddfSDavid du Colombier " for (i = dfa_depth; i >= 0; i--)", 2797dd7cddfSDavid du Colombier " v_insert(temptree[i], i);", 2807dd7cddfSDavid du Colombier "}", 2817dd7cddfSDavid du Colombier "", 2827dd7cddfSDavid du Colombier "static Vertex *", 2837dd7cddfSDavid du Colombier "x_tail(Vertex *t, ulong want)", 2847dd7cddfSDavid du Colombier "{ int i, yes, no; Edge *e; Vertex *v = (Vertex *) 0;", 2857dd7cddfSDavid du Colombier "", 2867dd7cddfSDavid du Colombier " if (!t) return v;", 2877dd7cddfSDavid du Colombier "", 2887dd7cddfSDavid du Colombier " yes = no = 0;", 2897dd7cddfSDavid du Colombier " for (i = 0; i < 2; i++)", 2907dd7cddfSDavid du Colombier " if ((ulong) t->dst[i] == want)", 291312a1df1SDavid du Colombier " { /* was t->from[i] <= 0 && t->to[i] >= 0 */", 292312a1df1SDavid du Colombier " /* but from and to are uchar */", 293312a1df1SDavid du Colombier " if (t->from[i] == 0)", 2947dd7cddfSDavid du Colombier " yes = 1;", 2957dd7cddfSDavid du Colombier " else", 2967dd7cddfSDavid du Colombier " if (t->from[i] <= 4 && t->to[i] >= 4)", 2977dd7cddfSDavid du Colombier " no = 1;", 2987dd7cddfSDavid du Colombier " }", 2997dd7cddfSDavid du Colombier "", 3007dd7cddfSDavid du Colombier " for (e = t->Succ; e; e = e->Nxt)", 3017dd7cddfSDavid du Colombier " if ((ulong) e->Dst == want)", 302312a1df1SDavid du Colombier " { /* was INRANGE(e,0) but From and To are uchar */", 303312a1df1SDavid du Colombier " if ((e->From == 0) || (e->s==1 && e->S==0))", 3047dd7cddfSDavid du Colombier " yes = 1;", 3057dd7cddfSDavid du Colombier " else if (INRANGE(e, 4))", 3067dd7cddfSDavid du Colombier " no = 1;", 3077dd7cddfSDavid du Colombier " }", 3087dd7cddfSDavid du Colombier " if (yes && !no) return t;", 3097dd7cddfSDavid du Colombier " v = x_tail(t->left, want); if (v) return v;", 3107dd7cddfSDavid du Colombier " v = x_tail(t->right, want); if (v) return v;", 3117dd7cddfSDavid du Colombier " return (Vertex *) 0;", 3127dd7cddfSDavid du Colombier "}", 3137dd7cddfSDavid du Colombier "", 3147dd7cddfSDavid du Colombier "static void", 3157dd7cddfSDavid du Colombier "x_anytail(Vertex *t, Vertex *c, int nr)", 3167dd7cddfSDavid du Colombier "{ int i; Edge *e, *f; Vertex *v;", 3177dd7cddfSDavid du Colombier "", 3187dd7cddfSDavid du Colombier " if (!t) return;", 3197dd7cddfSDavid du Colombier "", 3207dd7cddfSDavid du Colombier " for (i = 0; i < 2; i++)", 3217dd7cddfSDavid du Colombier " if ((ulong) t->dst[i] == c->key)", 3227dd7cddfSDavid du Colombier " { v = new_vertex(); v->key = t->key;", 3237dd7cddfSDavid du Colombier " f = new_edge(v);", 3247dd7cddfSDavid du Colombier " f->From = t->from[i];", 3257dd7cddfSDavid du Colombier " f->To = t->to[i];", 3267dd7cddfSDavid du Colombier " f->Nxt = c->Succ;", 3277dd7cddfSDavid du Colombier " c->Succ = f;", 3287dd7cddfSDavid du Colombier " if (nr > 0)", 3297dd7cddfSDavid du Colombier " x_anytail(temptree[nr-1], v, nr-1);", 3307dd7cddfSDavid du Colombier " }", 3317dd7cddfSDavid du Colombier "", 3327dd7cddfSDavid du Colombier " for (e = t->Succ; e; e = e->Nxt)", 3337dd7cddfSDavid du Colombier " if ((ulong) e->Dst == c->key)", 3347dd7cddfSDavid du Colombier " { v = new_vertex(); v->key = t->key;", 3357dd7cddfSDavid du Colombier " f = new_edge(v);", 3367dd7cddfSDavid du Colombier " f->From = e->From;", 3377dd7cddfSDavid du Colombier " f->To = e->To;", 3387dd7cddfSDavid du Colombier " f->s = e->s;", 3397dd7cddfSDavid du Colombier " f->S = e->S;", 3407dd7cddfSDavid du Colombier " f->Nxt = c->Succ;", 3417dd7cddfSDavid du Colombier " c->Succ = f;", 3427dd7cddfSDavid du Colombier " x_anytail(temptree[nr-1], v, nr-1);", 3437dd7cddfSDavid du Colombier " }", 3447dd7cddfSDavid du Colombier "", 3457dd7cddfSDavid du Colombier " x_anytail(t->left, c, nr);", 3467dd7cddfSDavid du Colombier " x_anytail(t->right, c, nr);", 3477dd7cddfSDavid du Colombier "}", 3487dd7cddfSDavid du Colombier "", 3497dd7cddfSDavid du Colombier "static Vertex *", 3507dd7cddfSDavid du Colombier "x_cpy_rev(void)", 351312a1df1SDavid du Colombier "{ Vertex *c, *v; /* find 0 and !4 predecessor of F */", 3527dd7cddfSDavid du Colombier "", 3537dd7cddfSDavid du Colombier " v = x_tail(temptree[dfa_depth-1], F->key);", 3547dd7cddfSDavid du Colombier " if (!v) return (Vertex *) 0;", 3557dd7cddfSDavid du Colombier "", 3567dd7cddfSDavid du Colombier " c = new_vertex(); c->key = v->key;", 3577dd7cddfSDavid du Colombier "", 3587dd7cddfSDavid du Colombier " /* every node on dfa_depth-2 that has v->key as succ */", 3597dd7cddfSDavid du Colombier " /* make copy and let c point to these (reversing ptrs) */", 3607dd7cddfSDavid du Colombier "", 3617dd7cddfSDavid du Colombier " x_anytail(temptree[dfa_depth-2], c, dfa_depth-2);", 3627dd7cddfSDavid du Colombier " ", 3637dd7cddfSDavid du Colombier " return c;", 3647dd7cddfSDavid du Colombier "}", 3657dd7cddfSDavid du Colombier "", 3667dd7cddfSDavid du Colombier "void", 3677dd7cddfSDavid du Colombier "r_xpoint(void)", 3687dd7cddfSDavid du Colombier "{ int fd; char nm[64]; Vertex *d;", 3697dd7cddfSDavid du Colombier " int i, j;", 3707dd7cddfSDavid du Colombier "", 3717dd7cddfSDavid du Colombier " wcnt = 0;", 37200d97012SDavid du Colombier " sprintf(nm, \"%%s.xpt\", PanSource);", 3737dd7cddfSDavid du Colombier " if ((fd = open(nm, 0)) < 0) /* O_RDONLY */", 3747dd7cddfSDavid du Colombier " Uerror(\"cannot open checkpoint file\");", 3757dd7cddfSDavid du Colombier "", 3767dd7cddfSDavid du Colombier " xread(fd, (char *) &nstates, sizeof(double));", 3777dd7cddfSDavid du Colombier " xread(fd, (char *) &truncs, sizeof(double));", 3787dd7cddfSDavid du Colombier " xread(fd, (char *) &truncs2, sizeof(double));", 3797dd7cddfSDavid du Colombier " xread(fd, (char *) &nlinks, sizeof(double));", 3807dd7cddfSDavid du Colombier " xread(fd, (char *) &dfa_depth, sizeof(int));", 3817dd7cddfSDavid du Colombier "", 3827dd7cddfSDavid du Colombier " if (dfa_depth != MA+a_cycles)", 3837dd7cddfSDavid du Colombier " Uerror(\"bad dfa_depth in checkpoint file\");", 3847dd7cddfSDavid du Colombier "", 3857dd7cddfSDavid du Colombier " path = (Vertex **) emalloc((dfa_depth+1)*sizeof(Vertex *));", 3867dd7cddfSDavid du Colombier " layers = (Vertex **) emalloc(TWIDTH*(dfa_depth+1)*sizeof(Vertex *));", 3877dd7cddfSDavid du Colombier " temptree = (Vertex **) emalloc((dfa_depth+2)*sizeof(Vertex *));", 3887dd7cddfSDavid du Colombier " lastword = (uchar *) emalloc((dfa_depth+1)*sizeof(uchar));", 3897dd7cddfSDavid du Colombier " lastword[dfa_depth] = lastword[0] = 255; ", 3907dd7cddfSDavid du Colombier "", 3917dd7cddfSDavid du Colombier " path[0] = R = new_vertex();", 3927dd7cddfSDavid du Colombier " xread(fd, (char *) &R->key, sizeof(Vertex *));", 3937dd7cddfSDavid du Colombier " R = insert_withkey(R, 0);", 3947dd7cddfSDavid du Colombier "", 3957dd7cddfSDavid du Colombier " F = new_vertex();", 3967dd7cddfSDavid du Colombier " xread(fd, (char *) &F->key, sizeof(Vertex *));", 3977dd7cddfSDavid du Colombier " F = insert_withkey(F, dfa_depth);", 3987dd7cddfSDavid du Colombier "", 3997dd7cddfSDavid du Colombier " NF = new_vertex();", 4007dd7cddfSDavid du Colombier " xread(fd, (char *) &NF->key, sizeof(Vertex *));", 4017dd7cddfSDavid du Colombier " NF = insert_withkey(NF, dfa_depth);", 4027dd7cddfSDavid du Colombier "", 4037dd7cddfSDavid du Colombier " for (j = 0; j < TWIDTH; j++)", 4047dd7cddfSDavid du Colombier " for (i = 0; i < dfa_depth+1; i++)", 4057dd7cddfSDavid du Colombier " r_layer(fd, i);", 4067dd7cddfSDavid du Colombier "", 4077dd7cddfSDavid du Colombier " if (wcnt != 0) Uerror(\"bad count in checkpoint file\");", 4087dd7cddfSDavid du Colombier "", 4097dd7cddfSDavid du Colombier " d = x_cpy_rev();", 4107dd7cddfSDavid du Colombier " x_fixup();", 4117dd7cddfSDavid du Colombier " stacker[dfa_depth-1] = 0;", 4127dd7cddfSDavid du Colombier " x_rm_stack(d, dfa_depth-2);", 4137dd7cddfSDavid du Colombier " x_cleanup(d);", 4147dd7cddfSDavid du Colombier " close(fd);", 4157dd7cddfSDavid du Colombier "", 416*de2caf28SDavid du Colombier " printf(\"pan: removed %%lu stackstates\\n\", stackcnt);", 4177dd7cddfSDavid du Colombier " nstates -= (double) stackcnt;", 4187dd7cddfSDavid du Colombier "}", 4197dd7cddfSDavid du Colombier "#endif", 4207dd7cddfSDavid du Colombier 0, 4217dd7cddfSDavid du Colombier }; 422