00001
00030 #include "util_hack.h"
00031 #include "cuddInt.h"
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef lint
00053 static char rcsid[] DD_UNUSED = "$Id: cuddAddFind.c,v 1.1.1.1 2003/02/24 22:23:50 wjiang Exp $";
00054 #endif
00055
00056
00057
00058
00059
00060
00061
00064
00065
00066
00067
00068 static DdNode * addDoIthBit ARGS((DdManager *dd, DdNode *f, DdNode *index));
00069
00073
00074
00075
00076
00086 DdNode *
00087 Cudd_addFindMax(
00088 DdManager * dd,
00089 DdNode * f)
00090 {
00091 DdNode *t, *e, *res;
00092
00093 statLine(dd);
00094 if (cuddIsConstant(f)) {
00095 return(f);
00096 }
00097
00098 res = cuddCacheLookup1(dd,Cudd_addFindMax,f);
00099 if (res != NULL) {
00100 return(res);
00101 }
00102
00103 t = Cudd_addFindMax(dd,cuddT(f));
00104 if (t == DD_PLUS_INFINITY(dd)) return(t);
00105
00106 e = Cudd_addFindMax(dd,cuddE(f));
00107
00108 res = (cuddV(t) >= cuddV(e)) ? t : e;
00109
00110 cuddCacheInsert1(dd,Cudd_addFindMax,f,res);
00111
00112 return(res);
00113
00114 }
00115
00116
00126 DdNode *
00127 Cudd_addFindMin(
00128 DdManager * dd,
00129 DdNode * f)
00130 {
00131 DdNode *t, *e, *res;
00132
00133 statLine(dd);
00134 if (cuddIsConstant(f)) {
00135 return(f);
00136 }
00137
00138 res = cuddCacheLookup1(dd,Cudd_addFindMin,f);
00139 if (res != NULL) {
00140 return(res);
00141 }
00142
00143 t = Cudd_addFindMin(dd,cuddT(f));
00144 if (t == DD_MINUS_INFINITY(dd)) return(t);
00145
00146 e = Cudd_addFindMin(dd,cuddE(f));
00147
00148 res = (cuddV(t) <= cuddV(e)) ? t : e;
00149
00150 cuddCacheInsert1(dd,Cudd_addFindMin,f,res);
00151
00152 return(res);
00153
00154 }
00155
00156
00175 DdNode *
00176 Cudd_addIthBit(
00177 DdManager * dd,
00178 DdNode * f,
00179 int bit)
00180 {
00181 DdNode *res;
00182 DdNode *index;
00183
00184
00185
00186
00187 index = cuddUniqueConst(dd,(CUDD_VALUE_TYPE) bit);
00188 if (index == NULL) return(NULL);
00189 cuddRef(index);
00190
00191 do {
00192 dd->reordered = 0;
00193 res = addDoIthBit(dd, f, index);
00194 } while (dd->reordered == 1);
00195
00196 if (res == NULL) {
00197 Cudd_RecursiveDeref(dd, index);
00198 return(NULL);
00199 }
00200 cuddRef(res);
00201 Cudd_RecursiveDeref(dd, index);
00202 cuddDeref(res);
00203 return(res);
00204
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00230 static DdNode *
00231 addDoIthBit(
00232 DdManager * dd,
00233 DdNode * f,
00234 DdNode * index)
00235 {
00236 DdNode *res, *T, *E;
00237 DdNode *fv, *fvn;
00238 int mask, value;
00239 int v;
00240
00241 statLine(dd);
00242
00243 if (cuddIsConstant(f)) {
00244 mask = 1 << ((int) cuddV(index));
00245 value = (int) cuddV(f);
00246 return((value & mask) == 0 ? DD_ZERO(dd) : DD_ONE(dd));
00247 }
00248
00249
00250 res = cuddCacheLookup2(dd,addDoIthBit,f,index);
00251 if (res != NULL) return(res);
00252
00253
00254 v = f->index;
00255 fv = cuddT(f); fvn = cuddE(f);
00256
00257 T = addDoIthBit(dd,fv,index);
00258 if (T == NULL) return(NULL);
00259 cuddRef(T);
00260
00261 E = addDoIthBit(dd,fvn,index);
00262 if (E == NULL) {
00263 Cudd_RecursiveDeref(dd, T);
00264 return(NULL);
00265 }
00266 cuddRef(E);
00267
00268 res = (T == E) ? T : cuddUniqueInter(dd,v,T,E);
00269 if (res == NULL) {
00270 Cudd_RecursiveDeref(dd, T);
00271 Cudd_RecursiveDeref(dd, E);
00272 return(NULL);
00273 }
00274 cuddDeref(T);
00275 cuddDeref(E);
00276
00277
00278 cuddCacheInsert2(dd,addDoIthBit,f,index,res);
00279
00280 return(res);
00281
00282 }
00283