00001
00054 #include "util.h"
00055 #include "cuddInt.h"
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 #ifndef lint
00078 static char rcsid[] DD_UNUSED = "$Id: cuddAddInv.c,v 1.9 2004/08/13 18:04:45 fabio Exp $";
00079 #endif
00080
00081
00082
00083
00084
00085
00086
00089
00090
00091
00092
00093
00097
00098
00099
00100
00101
00115 DdNode *
00116 Cudd_addScalarInverse(
00117 DdManager * dd,
00118 DdNode * f,
00119 DdNode * epsilon)
00120 {
00121 DdNode *res;
00122
00123 if (!cuddIsConstant(epsilon)) {
00124 (void) fprintf(dd->err,"Invalid epsilon\n");
00125 return(NULL);
00126 }
00127 do {
00128 dd->reordered = 0;
00129 res = cuddAddScalarInverseRecur(dd,f,epsilon);
00130 } while (dd->reordered == 1);
00131 return(res);
00132
00133 }
00134
00135
00136
00137
00138
00139
00151 DdNode *
00152 cuddAddScalarInverseRecur(
00153 DdManager * dd,
00154 DdNode * f,
00155 DdNode * epsilon)
00156 {
00157 DdNode *t, *e, *res;
00158 CUDD_VALUE_TYPE value;
00159
00160 statLine(dd);
00161 if (cuddIsConstant(f)) {
00162 if (ddAbs(cuddV(f)) < cuddV(epsilon)) return(NULL);
00163 value = 1.0 / cuddV(f);
00164 res = cuddUniqueConst(dd,value);
00165 return(res);
00166 }
00167
00168 res = cuddCacheLookup2(dd,Cudd_addScalarInverse,f,epsilon);
00169 if (res != NULL) return(res);
00170
00171 t = cuddAddScalarInverseRecur(dd,cuddT(f),epsilon);
00172 if (t == NULL) return(NULL);
00173 cuddRef(t);
00174
00175 e = cuddAddScalarInverseRecur(dd,cuddE(f),epsilon);
00176 if (e == NULL) {
00177 Cudd_RecursiveDeref(dd, t);
00178 return(NULL);
00179 }
00180 cuddRef(e);
00181
00182 res = (t == e) ? t : cuddUniqueInter(dd,(int)f->index,t,e);
00183 if (res == NULL) {
00184 Cudd_RecursiveDeref(dd, t);
00185 Cudd_RecursiveDeref(dd, e);
00186 return(NULL);
00187 }
00188 cuddDeref(t);
00189 cuddDeref(e);
00190
00191 cuddCacheInsert2(dd,Cudd_addScalarInverse,f,epsilon,res);
00192
00193 return(res);
00194
00195 }
00196
00197
00198
00199
00200
00201