void bdd_fprinttable(FILE *ofile, BDD r) { BddNode *node; int n; fprintf(ofile, "ROOT: %d\n", r); if (r < 2) return; bdd_mark(r); for (n=0 ; n<bddnodesize ; n++) { if (MARKED(n)) { node = &bddnodes[n]; UNMARKp(node); fprintf(ofile, "[%5d] ", n); if (filehandler) filehandler(ofile, bddlevel2var[LEVELp(node)]); else fprintf(ofile, "%3d", bddlevel2var[LEVELp(node)]); fprintf(ofile, ": %3d", LOWp(node)); fprintf(ofile, " %3d", HIGHp(node)); fprintf(ofile, "\n"); } } }
void bdd_unmark(int i) { BddNode *node; if (i < 2) return; node = &bddnodes[i]; if (!MARKEDp(node) || LOWp(node) == -1) return; UNMARKp(node); bdd_unmark(LOWp(node)); bdd_unmark(HIGHp(node)); }
void bdd_unmark_upto(int i, int level) { BddNode *node = &bddnodes[i]; if (i < 2) return; if (!MARKEDp(node)) return; UNMARKp(node); if (LEVELp(node) > level) return; bdd_unmark_upto(LOWp(node), level); bdd_unmark_upto(HIGHp(node), level); }
void bdd_gbc(void) { int *r; int n; long int c2, c1 = clock(); if (gbc_handler != NULL) { bddGbcStat s; s.nodes = bddnodesize; s.freenodes = bddfreenum; s.time = 0; s.sumtime = gbcclock; s.num = gbcollectnum; gbc_handler(1, &s); } for (r=bddrefstack ; r<bddrefstacktop ; r++) bdd_mark(*r); for (n=0 ; n<bddnodesize ; n++) { if (HASREF(n)) bdd_mark(n); SETHASH(n, 0); } bddfreepos = 0; bddfreenum = 0; for (n=bddnodesize-1 ; n>=2 ; n--) { register BddNode *node = &bddnodes[n]; if (MARKEDp(node) && LOWp(node) != INVALID_BDD) { register unsigned int hash; UNMARKp(node); hash = NODEHASH(LEVELp(node), LOWp(node), HIGHp(node)); SETNEXTp(node, HASH(hash)); SETHASH(hash, n); } else { SETLOWpz(node, INVALID_BDD); // obliterates refcount SETNEXTpz(node, bddfreepos); // obliterates lev, mark bddfreepos = n; bddfreenum++; } } bdd_operator_reset(); c2 = clock(); gbcclock += c2-c1; gbcollectnum++; if (gbc_handler != NULL) { bddGbcStat s; s.nodes = bddnodesize; s.freenodes = bddfreenum; s.time = c2-c1; s.sumtime = gbcclock; s.num = gbcollectnum; gbc_handler(0, &s); } }