00001
00055 #include "util.h"
00056 #include "cuddInt.h"
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #ifndef lint
00076 static char rcsid[] DD_UNUSED = "$Id: cuddLiteral.c,v 1.8 2004/08/13 18:04:50 fabio Exp $";
00077 #endif
00078
00079
00080
00081
00082
00085
00086
00087
00088
00089
00093
00094
00095
00096
00097
00113 DdNode *
00114 Cudd_bddLiteralSetIntersection(
00115 DdManager * dd,
00116 DdNode * f,
00117 DdNode * g)
00118 {
00119 DdNode *res;
00120
00121 do {
00122 dd->reordered = 0;
00123 res = cuddBddLiteralSetIntersectionRecur(dd,f,g);
00124 } while (dd->reordered == 1);
00125 return(res);
00126
00127 }
00128
00129
00130
00131
00132
00133
00134
00148 DdNode *
00149 cuddBddLiteralSetIntersectionRecur(
00150 DdManager * dd,
00151 DdNode * f,
00152 DdNode * g)
00153 {
00154 DdNode *res, *tmp;
00155 DdNode *F, *G;
00156 DdNode *fc, *gc;
00157 DdNode *one;
00158 DdNode *zero;
00159 unsigned int topf, topg, comple;
00160 int phasef, phaseg;
00161
00162 statLine(dd);
00163 if (f == g) return(f);
00164
00165 F = Cudd_Regular(f);
00166 G = Cudd_Regular(g);
00167 one = DD_ONE(dd);
00168
00169
00170
00171
00172
00173 if (F == G) return(one);
00174
00175 zero = Cudd_Not(one);
00176 topf = cuddI(dd,F->index);
00177 topg = cuddI(dd,G->index);
00178
00179
00180
00181 while (topf != topg) {
00182 if (topf < topg) {
00183 comple = f != F;
00184 f = cuddT(F);
00185 if (comple) f = Cudd_Not(f);
00186 if (f == zero) {
00187 f = cuddE(F);
00188 if (comple) f = Cudd_Not(f);
00189 }
00190 F = Cudd_Regular(f);
00191 topf = cuddI(dd,F->index);
00192 } else if (topg < topf) {
00193 comple = g != G;
00194 g = cuddT(G);
00195 if (comple) g = Cudd_Not(g);
00196 if (g == zero) {
00197 g = cuddE(G);
00198 if (comple) g = Cudd_Not(g);
00199 }
00200 G = Cudd_Regular(g);
00201 topg = cuddI(dd,G->index);
00202 }
00203 }
00204
00205
00206 if (f == one) return(one);
00207
00208 res = cuddCacheLookup2(dd,Cudd_bddLiteralSetIntersection,f,g);
00209 if (res != NULL) {
00210 return(res);
00211 }
00212
00213
00214 comple = f != F;
00215 fc = cuddT(F);
00216 phasef = 1;
00217 if (comple) fc = Cudd_Not(fc);
00218 if (fc == zero) {
00219 fc = cuddE(F);
00220 phasef = 0;
00221 if (comple) fc = Cudd_Not(fc);
00222 }
00223 comple = g != G;
00224 gc = cuddT(G);
00225 phaseg = 1;
00226 if (comple) gc = Cudd_Not(gc);
00227 if (gc == zero) {
00228 gc = cuddE(G);
00229 phaseg = 0;
00230 if (comple) gc = Cudd_Not(gc);
00231 }
00232
00233 tmp = cuddBddLiteralSetIntersectionRecur(dd,fc,gc);
00234 if (tmp == NULL) {
00235 return(NULL);
00236 }
00237
00238 if (phasef != phaseg) {
00239 res = tmp;
00240 } else {
00241 cuddRef(tmp);
00242 if (phasef == 0) {
00243 res = cuddBddAndRecur(dd,Cudd_Not(dd->vars[F->index]),tmp);
00244 } else {
00245 res = cuddBddAndRecur(dd,dd->vars[F->index],tmp);
00246 }
00247 if (res == NULL) {
00248 Cudd_RecursiveDeref(dd,tmp);
00249 return(NULL);
00250 }
00251 cuddDeref(tmp);
00252 }
00253
00254 cuddCacheInsert2(dd,Cudd_bddLiteralSetIntersection,f,g,res);
00255
00256 return(res);
00257
00258 }
00259
00260
00261
00262
00263
00264