82 #define DD_BIGGY 100000000 102 static char rcsid[]
DD_UNUSED =
"$Id: cuddSat.c,v 1.39 2012/02/05 01:07:19 fabio Exp $";
111 #define WEIGHT(weight, col) ((weight) == NULL ? 1 : weight[col]) 171 if (inputs[ptr->
index] == 1) {
214 int complement, cost;
224 for (i = 0; i < manager->
size; i++) {
229 if (f ==
Cudd_Not(one) || f == zero) {
248 if (!
st_lookup(visited, F, &rootPair))
return(NULL);
251 cost = rootPair->
neg;
253 cost = rootPair->
pos;
257 sol =
getPath(manager,visited,f,weight,cost);
297 int complement, cost;
302 if (f ==
Cudd_Not(one) || f == zero) {
303 if (length != NULL) {
323 if (!
st_lookup(visited, F, &rootPair))
return(NULL);
326 cost = rootPair->
neg;
328 cost = rootPair->
pos;
332 sol =
getCube(manager,visited,f,cost);
339 if (length != NULL) {
372 int complement, cost;
377 if (f ==
Cudd_Not(one) || f == zero) {
429 unsigned int topf, level;
430 DdNode *F, *fv, *fvn, *res;
435 assert(0 <= i && i < dd->size);
444 level = (unsigned) dd->
perm[i];
465 if (topf == (
unsigned) level) {
535 DdNode *tmp, *One, *Gr, *Dr;
536 DdNode *Fv, *Fvn, *Gv, *Gvn, *Dv, *Dvn;
538 unsigned int flevel, glevel, dlevel, top;
544 if (D == One || F == G)
return(1);
564 if (tmp != NULL)
return(tmp == One);
570 top =
ddMin(flevel,glevel);
573 top =
ddMin(top,dlevel);
635 DdNode *tmp, *One, *F, *G;
636 DdNode *Ft, *Fe, *Gt, *Ge, *Dt, *De;
638 unsigned int flevel, glevel, dlevel, top;
645 if (f == g || g == One || f ==
Cudd_Not(One) || D == One ||
646 D == f || D ==
Cudd_Not(g))
return(1);
735 if (tmp != NULL)
return(tmp == One);
742 top =
ddMin(flevel,glevel);
744 top =
ddMin(top,dlevel);
810 DdNode *fv, *fvn, *gv, *gvn, *r;
811 unsigned int topf, topg;
815 if (f == g)
return(1);
821 (void) fprintf(dd->
out,
"Offending nodes:\n");
822 (void) fprintf(dd->
out,
823 "f: address = %p\t value = %40.30f\n",
824 (
void *) f,
cuddV(f));
825 (void) fprintf(dd->
out,
826 "g: address = %p\t value = %40.30f\n",
827 (
void *) g,
cuddV(g));
844 if (topf <= topg) {fv =
cuddT(f); fvn =
cuddE(f);}
else {fv = fvn = f;}
845 if (topg <= topf) {gv =
cuddT(g); gvn =
cuddE(g);}
else {gv = gvn = g;}
953 if (phases == NULL)
return(NULL);
1011 if (expanded == NULL) {
1025 }
else if (e == zero) {
1033 if (scan ==
DD_ONE(dd)) {
1105 if (
st_lookup(visited, my_root, &my_pair)) {
1107 res_pair.
pos = my_pair->
neg;
1108 res_pair.
neg = my_pair->
pos;
1110 res_pair.
pos = my_pair->
pos;
1111 res_pair.
neg = my_pair->
neg;
1122 if (my_root != zero) {
1140 if (support != NULL) {
1141 support[my_root->
index] = 1;
1146 if (my_pair == NULL) {
1148 int tmp = res_pair.
pos;
1149 res_pair.
pos = res_pair.
neg;
1154 my_pair->
pos = res_pair.
pos;
1155 my_pair->
neg = res_pair.
neg;
1157 st_insert(visited, (
char *)my_root, (
char *)my_pair);
1159 res_pair.
pos = my_pair->neg;
1160 res_pair.
neg = my_pair->pos;
1162 res_pair.
pos = my_pair->pos;
1163 res_pair.
neg = my_pair->neg;
1250 (void) fprintf(manager->
err,
"We shouldn't be here!!\n");
1291 if (
st_lookup(visited, my_root, &my_pair)) {
1293 res_pair.
pos = my_pair->
neg;
1294 res_pair.
neg = my_pair->
pos;
1296 res_pair.
pos = my_pair->
pos;
1297 res_pair.
neg = my_pair->
neg;
1308 if (my_root != zero) {
1326 if (my_pair == NULL) {
1328 int tmp = res_pair.
pos;
1329 res_pair.
pos = res_pair.
neg;
1334 my_pair->
pos = res_pair.
pos;
1335 my_pair->
neg = res_pair.
neg;
1338 st_insert(visited, (
char *)my_root, (
char *)my_pair);
1340 res_pair.
pos = my_pair->neg;
1341 res_pair.
neg = my_pair->pos;
1343 res_pair.
pos = my_pair->pos;
1344 res_pair.
neg = my_pair->neg;
1430 (void) fprintf(manager->
err,
"We shouldn't be here!\n");
1462 DdNode *
one, *
zero, *lbv, *lbvn, *lbnx, *ubv, *ubvn, *fv, *fvn, *res;
1463 DdNode *F, *UB, *LB, *t, *e;
1464 unsigned int top, toplb, topub, topf, index;
1470 assert(ub != zero && lb != zero);
1478 if (ub == f || f == one)
return(ub);
1479 if (lb == f)
return(lb);
1506 top =
ddMin(topf,toplb);
1522 lbnx = lbv = lbvn = lb;
1548 if (t == NULL)
return(NULL);
1550 assert(topub == toplb && topub == top && lbv == zero);
1560 if (ubv == ubvn && fv == fvn) {
1570 assert(topub == toplb && topub == top && lbvn == zero);
1604 }
else if (lbvn == zero) {
1671 int positive, l, lT, lE;
1681 }
else if (f == zero) {
1693 positive = phases[F->
index];
1694 l = positive ?
ddMin(lT+1, lE) :
ddMin(lT, lE+1);
1733 int Pcost, Ncost, Tcost;
1736 int index = rscan->
index;
1737 assert(phases[index] == 0 || phases[index] == 1);
1738 int positive = phases[index] == 1;
1739 Pcost = positive ? cost - 1 : cost;
1740 Ncost = positive ? cost : cost - 1;
1743 if (rscan != scan) {
1749 if (Tcost == Pcost) {
static char rcsid [] DD_UNUSED
void Cudd_IterDerefBdd(DdManager *table, DdNode *n)
DdNode * Cudd_LargestCube(DdManager *manager, DdNode *f, int *length)
int st_lookup(st_table *, void *, void *)
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
int st_lookup_int(st_table *, void *, int *)
int st_foreach(st_table *, ST_PFSR, char *)
void Cudd_Deref(DdNode *node)
DdNode * cuddCacheLookup2(DdManager *table, DdNode *(*)(DdManager *, DdNode *, DdNode *), DdNode *f, DdNode *g)
int Cudd_EquivDC(DdManager *dd, DdNode *F, DdNode *G, DdNode *D)
void st_free_table(st_table *)
#define Cudd_IsConstant(node)
#define Cudd_Regular(node)
DdNode * Cudd_bddExistAbstract(DdManager *manager, DdNode *f, DdNode *cube)
DdNode * Cudd_Eval(DdManager *dd, DdNode *f, int *inputs)
int Cudd_EqualSupNorm(DdManager *dd, DdNode *f, DdNode *g, CUDD_VALUE_TYPE tolerance, int pr)
#define DD_BDD_MAX_EXP_TAG
static enum st_retval freePathPair(char *key, char *value, char *arg)
DdNode * Cudd_ShortestPath(DdManager *manager, DdNode *f, int *weight, int *support, int *length)
int st_insert(st_table *, void *, void *)
DdNode * cuddBddMakePrime(DdManager *dd, DdNode *cube, DdNode *f)
static cuddPathPair getShortest(DdNode *root, int *cost, int *support, st_table *visited)
#define Cudd_IsComplement(node)
DdNode *(* DD_CTFP)(DdManager *, DdNode *, DdNode *)
DdNode * Cudd_bddLargestPrimeUnate(DdManager *dd, DdNode *f, DdNode *phaseBdd)
#define cuddIsConstant(node)
DdNode * Cudd_Increasing(DdManager *dd, DdNode *f, int i)
static DdNode * getPath(DdManager *manager, st_table *visited, DdNode *f, int *weight, int cost)
DdNode * Cudd_bddMaximallyExpand(DdManager *dd, DdNode *lb, DdNode *ub, DdNode *f)
int st_ptrcmp(const char *, const char *)
int Cudd_ShortestLength(DdManager *manager, DdNode *f, int *weight)
st_table * st_init_table(ST_PFICPCP, ST_PFICPI)
static DdNode * ddBddMaximallyExpand(DdManager *dd, DdNode *lb, DdNode *ub, DdNode *f)
#define WEIGHT(weight, col)
static DdNode * ddGetLargestCubeUnate(DdManager *dd, DdNode *f, int *phases, st_table *table)
#define DD_BDD_LEQ_UNLESS_TAG
#define ddEqualVal(x, y, e)
DdNode * cuddBddAndRecur(DdManager *manager, DdNode *f, DdNode *g)
static DdNode * getCube(DdManager *manager, st_table *visited, DdNode *f, int cost)
struct cuddPathPair cuddPathPair
int Cudd_bddLeq(DdManager *dd, DdNode *f, DdNode *g)
DdNode * cuddCacheLookup(DdManager *table, ptruint op, DdNode *f, DdNode *g, DdNode *h)
void cuddGetBranches(DdNode *g, DdNode **g1, DdNode **g0)
void cuddCacheInsert2(DdManager *table, DdNode *(*)(DdManager *, DdNode *, DdNode *), DdNode *f, DdNode *g, DdNode *data)
DdNode * Cudd_Decreasing(DdManager *dd, DdNode *f, int i)
DdNode * Cudd_bddMakePrime(DdManager *dd, DdNode *cube, DdNode *f)
static int ddBddShortestPathUnate(DdManager *dd, DdNode *f, int *phases, st_table *table)
#define Cudd_NotCond(node, c)
int st_ptrhash(char *, int)
void cuddCacheInsert(DdManager *table, ptruint op, DdNode *f, DdNode *g, DdNode *h, DdNode *data)
int Cudd_bddLeqUnless(DdManager *dd, DdNode *f, DdNode *g, DdNode *D)
DdNode * cuddUniqueInter(DdManager *unique, int index, DdNode *T, DdNode *E)
static cuddPathPair getLargest(DdNode *root, st_table *visited)
int Cudd_BddToCubeArray(DdManager *dd, DdNode *cube, int *array)