static int bdd_markwidth_rec(int bdd, int level, int seenTerminals[]) { BddNode *node; if (bdd < 2) { if(seenTerminals[bdd]) { return 0; } else { seenTerminals[bdd] = 1; return 1; } } node = &bddnodes[bdd]; if (MARKEDp(node) || LOWp(node) == -1) return 0; if(LEVELp(node) > level) { // this is a node we want to count SETMARKp(node); return 1; } else { SETMARKp(node); return bdd_markwidth_rec(LOWp(node), level, seenTerminals) + bdd_markwidth_rec(HIGHp(node), level, seenTerminals); } }
void bdd_mark(int i) { BddNode *node; if (i < 2) return; node = &bddnodes[i]; if (MARKEDp(node) || LOWp(node) == INVALID_BDD) return; SETMARKp(node); bdd_mark(LOWp(node)); bdd_mark(HIGHp(node)); }
void bdd_markcount(int i, int *cou) { BddNode *node; if (i < 2) return; node = &bddnodes[i]; if (MARKEDp(node) || LOWp(node) == -1) return; SETMARKp(node); *cou += 1; bdd_markcount(LOWp(node), cou); bdd_markcount(HIGHp(node), cou); }
void bdd_markshape(int i, int shape[]) { BddNode *node; if (i < 2) return; node = &bddnodes[i]; if (MARKEDp(node) || LOWp(node) == -1) return; shape[LEVELp(node)]++; SETMARKp(node); bdd_markshape(LOWp(node), shape); bdd_markshape(HIGHp(node), shape); }
void bdd_mark_upto(int i, int level) { BddNode *node = &bddnodes[i]; if (i < 2) return; if (MARKEDp(node) || LOWp(node) == INVALID_BDD) return; if (LEVELp(node) > level) return; SETMARKp(node); bdd_mark_upto(LOWp(node), level); bdd_mark_upto(HIGHp(node), level); }
static int bdd_save_rec(FILE *ofile, int root) { BddNode *node = &bddnodes[root]; int err; if (root < 2) return 0; if (MARKEDp(node)) return 0; SETMARKp(node); if ((err=bdd_save_rec(ofile, LOWp(node))) < 0) return err; if ((err=bdd_save_rec(ofile, HIGHp(node))) < 0) return err; fprintf(ofile, "%d %d %d %d\n", root, bddlevel2var[LEVELp(node) & MARKHIDE], LOWp(node), HIGHp(node)); return 0; }