/* NAME {* bdd\_clear\_error *} SECTION {* kernel *} SHORT {* clears an error condition in the kernel *} PROTO {* void bdd_clear_error(void) *} DESCR {* The BuDDy kernel may at some point run out of new ROBDD nodes if a maximum limit is set with {\tt bdd\_setmaxnodenum}. In this case the current error handler is called and an internal error flag is set. Further calls to BuDDy will always return {\tt bddfalse}. From here BuDDy must either be restarted or {\tt bdd\_clear\_error} may be called after action is taken to let BuDDy continue. This may not be especially usefull since the default error handler exits the program - other needs may of course exist.*} ALSO {* bdd\_error\_hook, bdd\_setmaxnodenum *} */ void bdd_clear_error(void) { BUDDY_PROLOGUE; bdderrorcond = 0; bdd_operator_reset(); RETURN(); }
/* NAME {* bdd\_clear\_error *} SECTION {* kernel *} SHORT {* clears an error condition in the kernel *} PROTO {* void bdd_clear_error(void) *} DESCR {* The BuDDy kernel may at some point run out of new ROBDD nodes if a maximum limit is set with {\tt bdd\_setmaxnodenum}. In this case the current error handler is called and an internal error flag is set. Further calls to BuDDy will always return {\tt bddfalse}. From here BuDDy must either be restarted or {\tt bdd\_clear\_error} may be called after action is taken to let BuDDy continue. This may not be especially usefull since the default error handler exits the program - other needs may of course exist.*} ALSO {* bdd\_error\_hook, bdd\_setmaxnodenum *} */ void bdd_clear_error(void) { bdderrorcond = 0; bdd_operator_reset(); }
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 (bddnodes[n].refcou > 0) bdd_mark(n); bddnodes[n].hash = 0; } bddfreepos = 0; bddfreenum = 0; for (n=bddnodesize-1 ; n>=2 ; n--) { register BddNode *node = &bddnodes[n]; if ((LEVELp(node) & MARKON) && LOWp(node) != -1) { register unsigned int hash; LEVELp(node) &= MARKOFF; hash = NODEHASH(LEVELp(node), LOWp(node), HIGHp(node)); node->next = bddnodes[hash].hash; bddnodes[hash].hash = n; } else { LOWp(node) = -1; node->next = bddfreepos; 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); } }
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); } }