00001
00057 #include "util.h"
00058 #include "cuddInt.h"
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 #ifndef lint
00080 static char rcsid[] DD_UNUSED = "$Id: cuddAddFind.c,v 1.8 2004/08/13 18:04:45 fabio Exp $";
00081 #endif
00082
00083
00084
00085
00086
00087
00088 #ifdef __cplusplus
00089 extern "C" {
00090 #endif
00091
00094
00095
00096
00097
00098 static DdNode * addDoIthBit (DdManager *dd, DdNode *f, DdNode *index);
00099
00102 #ifdef __cplusplus
00103 }
00104 #endif
00105
00106
00107
00108
00109
00119 DdNode *
00120 Cudd_addFindMax(
00121 DdManager * dd,
00122 DdNode * f)
00123 {
00124 DdNode *t, *e, *res;
00125
00126 statLine(dd);
00127 if (cuddIsConstant(f)) {
00128 return(f);
00129 }
00130
00131 res = cuddCacheLookup1(dd,Cudd_addFindMax,f);
00132 if (res != NULL) {
00133 return(res);
00134 }
00135
00136 t = Cudd_addFindMax(dd,cuddT(f));
00137 if (t == DD_PLUS_INFINITY(dd)) return(t);
00138
00139 e = Cudd_addFindMax(dd,cuddE(f));
00140
00141 res = (cuddV(t) >= cuddV(e)) ? t : e;
00142
00143 cuddCacheInsert1(dd,Cudd_addFindMax,f,res);
00144
00145 return(res);
00146
00147 }
00148
00149
00159 DdNode *
00160 Cudd_addFindMin(
00161 DdManager * dd,
00162 DdNode * f)
00163 {
00164 DdNode *t, *e, *res;
00165
00166 statLine(dd);
00167 if (cuddIsConstant(f)) {
00168 return(f);
00169 }
00170
00171 res = cuddCacheLookup1(dd,Cudd_addFindMin,f);
00172 if (res != NULL) {
00173 return(res);
00174 }
00175
00176 t = Cudd_addFindMin(dd,cuddT(f));
00177 if (t == DD_MINUS_INFINITY(dd)) return(t);
00178
00179 e = Cudd_addFindMin(dd,cuddE(f));
00180
00181 res = (cuddV(t) <= cuddV(e)) ? t : e;
00182
00183 cuddCacheInsert1(dd,Cudd_addFindMin,f,res);
00184
00185 return(res);
00186
00187 }
00188
00189
00208 DdNode *
00209 Cudd_addIthBit(
00210 DdManager * dd,
00211 DdNode * f,
00212 int bit)
00213 {
00214 DdNode *res;
00215 DdNode *index;
00216
00217
00218
00219
00220 index = cuddUniqueConst(dd,(CUDD_VALUE_TYPE) bit);
00221 if (index == NULL) return(NULL);
00222 cuddRef(index);
00223
00224 do {
00225 dd->reordered = 0;
00226 res = addDoIthBit(dd, f, index);
00227 } while (dd->reordered == 1);
00228
00229 if (res == NULL) {
00230 Cudd_RecursiveDeref(dd, index);
00231 return(NULL);
00232 }
00233 cuddRef(res);
00234 Cudd_RecursiveDeref(dd, index);
00235 cuddDeref(res);
00236 return(res);
00237
00238 }
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00263 static DdNode *
00264 addDoIthBit(
00265 DdManager * dd,
00266 DdNode * f,
00267 DdNode * index)
00268 {
00269 DdNode *res, *T, *E;
00270 DdNode *fv, *fvn;
00271 int mask, value;
00272 int v;
00273
00274 statLine(dd);
00275
00276 if (cuddIsConstant(f)) {
00277 mask = 1 << ((int) cuddV(index));
00278 value = (int) cuddV(f);
00279 return((value & mask) == 0 ? DD_ZERO(dd) : DD_ONE(dd));
00280 }
00281
00282
00283 res = cuddCacheLookup2(dd,addDoIthBit,f,index);
00284 if (res != NULL) return(res);
00285
00286
00287 v = f->index;
00288 fv = cuddT(f); fvn = cuddE(f);
00289
00290 T = addDoIthBit(dd,fv,index);
00291 if (T == NULL) return(NULL);
00292 cuddRef(T);
00293
00294 E = addDoIthBit(dd,fvn,index);
00295 if (E == NULL) {
00296 Cudd_RecursiveDeref(dd, T);
00297 return(NULL);
00298 }
00299 cuddRef(E);
00300
00301 res = (T == E) ? T : cuddUniqueInter(dd,v,T,E);
00302 if (res == NULL) {
00303 Cudd_RecursiveDeref(dd, T);
00304 Cudd_RecursiveDeref(dd, E);
00305 return(NULL);
00306 }
00307 cuddDeref(T);
00308 cuddDeref(E);
00309
00310
00311 cuddCacheInsert2(dd,addDoIthBit,f,index,res);
00312
00313 return(res);
00314
00315 }
00316