00001
00053 #include "util.h"
00054 #include "cuddInt.h"
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 #ifndef lint
00077 static char rcsid[] DD_UNUSED = "$Id: cuddRead.c,v 1.6 2004/08/13 18:04:50 fabio Exp $";
00078 #endif
00079
00080
00081
00082
00083
00084
00087
00088
00089
00090
00091
00095
00096
00097
00098
00099
00141 int
00142 Cudd_addRead(
00143 FILE * fp ,
00144 DdManager * dd ,
00145 DdNode ** E ,
00146 DdNode *** x ,
00147 DdNode *** y ,
00148 DdNode *** xn ,
00149 DdNode *** yn_ ,
00150 int * nx ,
00151 int * ny ,
00152 int * m ,
00153 int * n ,
00154 int bx ,
00155 int sx ,
00156 int by ,
00157 int sy )
00158 {
00159 DdNode *one, *zero;
00160 DdNode *w, *neW;
00161 DdNode *minterm1;
00162 int u, v, err, i, nv;
00163 int lnx, lny;
00164 CUDD_VALUE_TYPE val;
00165 DdNode **lx, **ly, **lxn, **lyn;
00166
00167 one = DD_ONE(dd);
00168 zero = DD_ZERO(dd);
00169
00170 err = fscanf(fp, "%d %d", &u, &v);
00171 if (err == EOF) {
00172 return(0);
00173 } else if (err != 2) {
00174 return(0);
00175 }
00176
00177 *m = u;
00178
00179 lx = *x; lxn = *xn;
00180 u--;
00181 for (lnx=0; u > 0; lnx++) {
00182 u >>= 1;
00183 }
00184
00185
00186
00187 if (lnx > *nx) {
00188 *x = lx = REALLOC(DdNode *, *x, lnx);
00189 if (lx == NULL) {
00190 dd->errorCode = CUDD_MEMORY_OUT;
00191 return(0);
00192 }
00193 *xn = lxn = REALLOC(DdNode *, *xn, lnx);
00194 if (lxn == NULL) {
00195 dd->errorCode = CUDD_MEMORY_OUT;
00196 return(0);
00197 }
00198 }
00199
00200 *n = v;
00201
00202 ly = *y; lyn = *yn_;
00203 v--;
00204 for (lny=0; v > 0; lny++) {
00205 v >>= 1;
00206 }
00207
00208
00209
00210 if (lny > *ny) {
00211 *y = ly = REALLOC(DdNode *, *y, lny);
00212 if (ly == NULL) {
00213 dd->errorCode = CUDD_MEMORY_OUT;
00214 return(0);
00215 }
00216 *yn_ = lyn = REALLOC(DdNode *, *yn_, lny);
00217 if (lyn == NULL) {
00218 dd->errorCode = CUDD_MEMORY_OUT;
00219 return(0);
00220 }
00221 }
00222
00223
00224 for (i = *nx, nv = bx + (*nx) * sx; i < lnx; i++, nv += sx) {
00225 do {
00226 dd->reordered = 0;
00227 lx[i] = cuddUniqueInter(dd, nv, one, zero);
00228 } while (dd->reordered == 1);
00229 if (lx[i] == NULL) return(0);
00230 cuddRef(lx[i]);
00231 do {
00232 dd->reordered = 0;
00233 lxn[i] = cuddUniqueInter(dd, nv, zero, one);
00234 } while (dd->reordered == 1);
00235 if (lxn[i] == NULL) return(0);
00236 cuddRef(lxn[i]);
00237 }
00238 for (i = *ny, nv = by + (*ny) * sy; i < lny; i++, nv += sy) {
00239 do {
00240 dd->reordered = 0;
00241 ly[i] = cuddUniqueInter(dd, nv, one, zero);
00242 } while (dd->reordered == 1);
00243 if (ly[i] == NULL) return(0);
00244 cuddRef(ly[i]);
00245 do {
00246 dd->reordered = 0;
00247 lyn[i] = cuddUniqueInter(dd, nv, zero, one);
00248 } while (dd->reordered == 1);
00249 if (lyn[i] == NULL) return(0);
00250 cuddRef(lyn[i]);
00251 }
00252 *nx = lnx;
00253 *ny = lny;
00254
00255 *E = dd->background;
00256 cuddRef(*E);
00257
00258 while (! feof(fp)) {
00259 err = fscanf(fp, "%d %d %lf", &u, &v, &val);
00260 if (err == EOF) {
00261 break;
00262 } else if (err != 3) {
00263 return(0);
00264 } else if (u >= *m || v >= *n || u < 0 || v < 0) {
00265 return(0);
00266 }
00267
00268 minterm1 = one; cuddRef(minterm1);
00269
00270
00271 for (i = lnx - 1; i>=0; i--) {
00272 if (u & 1) {
00273 w = Cudd_addApply(dd, Cudd_addTimes, minterm1, lx[i]);
00274 } else {
00275 w = Cudd_addApply(dd, Cudd_addTimes, minterm1, lxn[i]);
00276 }
00277 if (w == NULL) {
00278 Cudd_RecursiveDeref(dd, minterm1);
00279 return(0);
00280 }
00281 cuddRef(w);
00282 Cudd_RecursiveDeref(dd, minterm1);
00283 minterm1 = w;
00284 u >>= 1;
00285 }
00286 for (i = lny - 1; i>=0; i--) {
00287 if (v & 1) {
00288 w = Cudd_addApply(dd, Cudd_addTimes, minterm1, ly[i]);
00289 } else {
00290 w = Cudd_addApply(dd, Cudd_addTimes, minterm1, lyn[i]);
00291 }
00292 if (w == NULL) {
00293 Cudd_RecursiveDeref(dd, minterm1);
00294 return(0);
00295 }
00296 cuddRef(w);
00297 Cudd_RecursiveDeref(dd, minterm1);
00298 minterm1 = w;
00299 v >>= 1;
00300 }
00301
00302
00303
00304 neW = cuddUniqueConst(dd, val);
00305 if (neW == NULL) {
00306 Cudd_RecursiveDeref(dd, minterm1);
00307 return(0);
00308 }
00309 cuddRef(neW);
00310
00311 w = Cudd_addIte(dd, minterm1, neW, *E);
00312 if (w == NULL) {
00313 Cudd_RecursiveDeref(dd, minterm1);
00314 Cudd_RecursiveDeref(dd, neW);
00315 return(0);
00316 }
00317 cuddRef(w);
00318 Cudd_RecursiveDeref(dd, minterm1);
00319 Cudd_RecursiveDeref(dd, neW);
00320 Cudd_RecursiveDeref(dd, *E);
00321 *E = w;
00322 }
00323 return(1);
00324
00325 }
00326
00327
00364 int
00365 Cudd_bddRead(
00366 FILE * fp ,
00367 DdManager * dd ,
00368 DdNode ** E ,
00369 DdNode *** x ,
00370 DdNode *** y ,
00371 int * nx ,
00372 int * ny ,
00373 int * m ,
00374 int * n ,
00375 int bx ,
00376 int sx ,
00377 int by ,
00378 int sy )
00379 {
00380 DdNode *one, *zero;
00381 DdNode *w;
00382 DdNode *minterm1;
00383 int u, v, err, i, nv;
00384 int lnx, lny;
00385 DdNode **lx, **ly;
00386
00387 one = DD_ONE(dd);
00388 zero = Cudd_Not(one);
00389
00390 err = fscanf(fp, "%d %d", &u, &v);
00391 if (err == EOF) {
00392 return(0);
00393 } else if (err != 2) {
00394 return(0);
00395 }
00396
00397 *m = u;
00398
00399 lx = *x;
00400 u--;
00401 for (lnx=0; u > 0; lnx++) {
00402 u >>= 1;
00403 }
00404 if (lnx > *nx) {
00405 *x = lx = REALLOC(DdNode *, *x, lnx);
00406 if (lx == NULL) {
00407 dd->errorCode = CUDD_MEMORY_OUT;
00408 return(0);
00409 }
00410 }
00411
00412 *n = v;
00413
00414 ly = *y;
00415 v--;
00416 for (lny=0; v > 0; lny++) {
00417 v >>= 1;
00418 }
00419 if (lny > *ny) {
00420 *y = ly = REALLOC(DdNode *, *y, lny);
00421 if (ly == NULL) {
00422 dd->errorCode = CUDD_MEMORY_OUT;
00423 return(0);
00424 }
00425 }
00426
00427
00428 for (i = *nx, nv = bx + (*nx) * sx; i < lnx; i++, nv += sx) {
00429 do {
00430 dd->reordered = 0;
00431 lx[i] = cuddUniqueInter(dd, nv, one, zero);
00432 } while (dd->reordered == 1);
00433 if (lx[i] == NULL) return(0);
00434 cuddRef(lx[i]);
00435 }
00436 for (i = *ny, nv = by + (*ny) * sy; i < lny; i++, nv += sy) {
00437 do {
00438 dd->reordered = 0;
00439 ly[i] = cuddUniqueInter(dd, nv, one, zero);
00440 } while (dd->reordered == 1);
00441 if (ly[i] == NULL) return(0);
00442 cuddRef(ly[i]);
00443 }
00444 *nx = lnx;
00445 *ny = lny;
00446
00447 *E = zero;
00448 cuddRef(*E);
00449
00450 while (! feof(fp)) {
00451 err = fscanf(fp, "%d %d", &u, &v);
00452 if (err == EOF) {
00453 break;
00454 } else if (err != 2) {
00455 return(0);
00456 } else if (u >= *m || v >= *n || u < 0 || v < 0) {
00457 return(0);
00458 }
00459
00460 minterm1 = one; cuddRef(minterm1);
00461
00462
00463 for (i = lnx - 1; i>=0; i--) {
00464 if (u & 1) {
00465 w = Cudd_bddAnd(dd, minterm1, lx[i]);
00466 } else {
00467 w = Cudd_bddAnd(dd, minterm1, Cudd_Not(lx[i]));
00468 }
00469 if (w == NULL) {
00470 Cudd_RecursiveDeref(dd, minterm1);
00471 return(0);
00472 }
00473 cuddRef(w);
00474 Cudd_RecursiveDeref(dd,minterm1);
00475 minterm1 = w;
00476 u >>= 1;
00477 }
00478 for (i = lny - 1; i>=0; i--) {
00479 if (v & 1) {
00480 w = Cudd_bddAnd(dd, minterm1, ly[i]);
00481 } else {
00482 w = Cudd_bddAnd(dd, minterm1, Cudd_Not(ly[i]));
00483 }
00484 if (w == NULL) {
00485 Cudd_RecursiveDeref(dd, minterm1);
00486 return(0);
00487 }
00488 cuddRef(w);
00489 Cudd_RecursiveDeref(dd, minterm1);
00490 minterm1 = w;
00491 v >>= 1;
00492 }
00493
00494 w = Cudd_bddAnd(dd, Cudd_Not(minterm1), Cudd_Not(*E));
00495 if (w == NULL) {
00496 Cudd_RecursiveDeref(dd, minterm1);
00497 return(0);
00498 }
00499 w = Cudd_Not(w);
00500 cuddRef(w);
00501 Cudd_RecursiveDeref(dd, minterm1);
00502 Cudd_RecursiveDeref(dd, *E);
00503 *E = w;
00504 }
00505 return(1);
00506
00507 }
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517