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 (LEVEL(n) & MARKON) { node = &bddnodes[n]; LEVELp(node) &= MARKOFF; 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_mark(int i) { BddNode *node; if (i < 2) return; node = &bddnodes[i]; if (LEVELp(node) & MARKON || LOWp(node) == -1) return; LEVELp(node) |= MARKON; bdd_mark(LOWp(node)); bdd_mark(HIGHp(node)); }
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 bddReverseMarks(bdd_manager *bddm, bdd_ptr p) { if ((signed) bdd_mark(bddm, p) < 0) { bdd_set_mark(bddm, p, ~bdd_mark(bddm, p)); if (!bdd_is_leaf(bddm, p)) { bddReverseMarks(bddm, bdd_else(bddm, p)); bddReverseMarks(bddm, bdd_then(bddm, p)); } } }
void bddDumpNode(bdd_manager *bddm, bdd_ptr p) { if ((signed) bdd_mark(bddm, p) >= 0) { bdd_set_mark(bddm, p, ~bdd_mark(bddm, p)); if (!bdd_is_leaf(bddm, p)) { printf("%-3u: idx=%-3u lo=%-3u hi=%-3u\n", p, bdd_ifindex(bddm, p), bdd_else(bddm, p), bdd_then(bddm, p)); bddDumpNode(bddm, bdd_else(bddm, p)); bddDumpNode(bddm, bdd_then(bddm, p)); } else printf("%-3u: state=%-3u\n", p, bdd_leaf_value(bddm, p)); } }
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); } }
int dfaExport(DFA *a, char *filename, int num, char *vars[], char orders[]) { Table *table = tableInit(); int i; FILE *file; if (filename) { if ((file = fopen(filename, "w")) == 0) return 0; } else file = stdout; /* remove all marks in a->bddm */ bdd_prepare_apply1(a->bddm); /* build table of tuples (idx,lo,hi) */ for (i = 0; i < a->ns; i++) export(a->bddm, a->q[i], table); /* renumber lo/hi pointers to new table ordering */ for (i = 0; i < table->noelems; i++) { if (table->elms[i].idx != -1) { table->elms[i].lo = bdd_mark(a->bddm, table->elms[i].lo) - 1; table->elms[i].hi = bdd_mark(a->bddm, table->elms[i].hi) - 1; } } /* write to file */ fprintf(file, "MONA DFA\n" "number of variables: %u\n" "variables:", num); for (i = 0; i < num; i++) fprintf(file, " %s", vars[i]); fprintf(file, "\n" "orders:"); for (i = 0; i < num; i++) fprintf(file, " %u", (unsigned) orders[i]); fprintf(file, "\n" "states: %u\n" "initial: %u\n" "bdd nodes: %u\n" "final:", a->ns, a->s, table->noelems); for (i = 0; i < a->ns; i++) fprintf(file, " %d", a->f[i]); fprintf(file, "\nbehaviour:"); for (i = 0; i < a->ns; i++) fprintf(file, " %u", bdd_mark(a->bddm, a->q[i]) - 1); fprintf(file, "\nbdd:\n"); for (i = 0; i < table->noelems; i++) fprintf(file, " %i %u %u\n", table->elms[i].idx, table->elms[i].lo, table->elms[i].hi); fprintf(file, "end\n"); tableFree(table); if (filename) fclose(file); return 1; }
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); } }