00001
00028 #include "util_hack.h"
00029 #include "cuddInt.h"
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #ifndef lint
00048 static char rcsid[] DD_UNUSED = "$Id: cuddEssent.c,v 1.1.1.1 2003/02/24 22:23:51 wjiang Exp $";
00049 #endif
00050
00051
00052
00053
00054
00057
00058
00059
00060
00061 static DdNode * ddFindEssentialRecur ARGS((DdManager *dd, DdNode *f));
00062
00066
00067
00068
00069
00070
00086 DdNode *
00087 Cudd_FindEssential(
00088 DdManager * dd,
00089 DdNode * f)
00090 {
00091 DdNode *res;
00092
00093 do {
00094 dd->reordered = 0;
00095 res = ddFindEssentialRecur(dd,f);
00096 } while (dd->reordered == 1);
00097 return(res);
00098
00099 }
00100
00101
00116 int
00117 Cudd_bddIsVarEssential(
00118 DdManager * manager,
00119 DdNode * f,
00120 int id,
00121 int phase)
00122 {
00123 DdNode *var;
00124 int res;
00125 DdNode *one, *zero;
00126
00127 one = DD_ONE(manager);
00128 zero = Cudd_Not(one);
00129
00130 var = cuddUniqueInter(manager, id, one, zero);
00131
00132 var = Cudd_NotCond(var,phase == 0);
00133
00134 res = Cudd_bddIteConstant(manager, Cudd_Not(f), one, var) == one;
00135
00136 return(res);
00137
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00161 static DdNode *
00162 ddFindEssentialRecur(
00163 DdManager * dd,
00164 DdNode * f)
00165 {
00166 DdNode *T, *E, *F;
00167 DdNode *essT, *essE, *res;
00168 int index;
00169 DdNode *one, *lzero, *azero;
00170
00171 one = DD_ONE(dd);
00172 F = Cudd_Regular(f);
00173
00174 if (cuddIsConstant(F)) return(one);
00175
00176 res = cuddCacheLookup1(dd,Cudd_FindEssential,f);
00177 if (res != NULL) {
00178 return(res);
00179 }
00180
00181 lzero = Cudd_Not(one);
00182 azero = DD_ZERO(dd);
00183
00184 T = cuddT(F);
00185 E = cuddE(F);
00186 if (Cudd_IsComplement(f)) {
00187 T = Cudd_Not(T); E = Cudd_Not(E);
00188 }
00189
00190 index = F->index;
00191 if (Cudd_IsConstant(T) && T != lzero && T != azero) {
00192
00193
00194
00195
00196
00197 if (E == lzero || E == azero) {
00198 res = dd->vars[index];
00199 } else {
00200 res = one;
00201 }
00202 } else if (T == lzero || T == azero) {
00203 if (Cudd_IsConstant(E)) {
00204 res = Cudd_Not(dd->vars[index]);
00205 } else {
00206
00207 essE = ddFindEssentialRecur(dd,E);
00208 if (essE == NULL) {
00209 return(NULL);
00210 }
00211 cuddRef(essE);
00212
00213
00214 res = cuddUniqueInter(dd,index,one,Cudd_Not(essE));
00215 if (res == NULL) {
00216 Cudd_RecursiveDeref(dd,essE);
00217 return(NULL);
00218 }
00219 res = Cudd_Not(res);
00220 cuddDeref(essE);
00221 }
00222 } else {
00223 if (E == lzero || E == azero) {
00224
00225 essT = ddFindEssentialRecur(dd,T);
00226 if (essT == NULL) {
00227 return(NULL);
00228 }
00229 cuddRef(essT);
00230
00231
00232
00233 res = cuddBddAndRecur(dd,dd->vars[index],essT);
00234 if (res == NULL) {
00235 Cudd_RecursiveDeref(dd,essT);
00236 return(NULL);
00237 }
00238 cuddDeref(essT);
00239 } else if (!Cudd_IsConstant(E)) {
00240
00241
00242
00243 essT = ddFindEssentialRecur(dd,T);
00244 if (essT == NULL) {
00245 return(NULL);
00246 }
00247 if (essT == one) {
00248 res = one;
00249 } else {
00250 cuddRef(essT);
00251 essE = ddFindEssentialRecur(dd,E);
00252 if (essE == NULL) {
00253 Cudd_RecursiveDeref(dd,essT);
00254 return(NULL);
00255 }
00256 cuddRef(essE);
00257
00258
00259 res = cuddBddLiteralSetIntersectionRecur(dd,essT,essE);
00260 if (res == NULL) {
00261 Cudd_RecursiveDeref(dd,essT);
00262 Cudd_RecursiveDeref(dd,essE);
00263 return(NULL);
00264 }
00265 cuddRef(res);
00266 Cudd_RecursiveDeref(dd,essT);
00267 Cudd_RecursiveDeref(dd,essE);
00268 cuddDeref(res);
00269 }
00270 } else {
00271 res = one;
00272 }
00273 }
00274
00275 cuddCacheInsert1(dd,Cudd_FindEssential, f, res);
00276 return(res);
00277
00278 }
00279