bdd reachable_states(bdd I, bdd T) { bdd C, by, bx = bddfalse; bdd tmp1; do { bdd_addref(bx); by = bx; #if 1 tmp1 = bdd_addref( bdd_apply(T, bx, bddop_and) ); C = bdd_addref( bdd_exist(tmp1, normvarset) ); bdd_delref(tmp1); #else C = bdd_addref( bdd_appex(bx, T, bddop_and, normvar, N*3) ); #endif tmp1 = bdd_addref( bdd_replace(C, pairs) ); bdd_delref(C); C = tmp1; tmp1 = bdd_apply(I, C, bddop_or); bdd_delref(C); bdd_delref(bx); bx = tmp1; /*printf("."); fflush(stdout);*/ } while(bx != by); printf("\n"); return bx; }
/* ML type: bdd -> bdd -> int -> varSet -> bdd */ EXTERNML value mlbdd_bdd_appex(value left, value right, value opr, value varset) /* ML */ { return mlbdd_make(bdd_appex(Bdd_val(left),Bdd_val(right), Int_val(opr), Bdd_val(varset))); }
BDD pre_exists(TransitionSystem *model, BDD p) { BDD pprime = bdd_addref(to_primed(model, p)); BDD res = bdd_appex(model->transitions_bdd, pprime, bddop_and, model->primed_vars); bdd_delref(pprime); return res; }
static BDD to_primed(TransitionSystem *model, BDD p) { //does not bdd_addref, the caller must add it BDD res = bdd_appex(model->unprimed2primed, p, bddop_and, model->unprimed_vars); return res; }