00001
00053 #include "cuPortInt.h"
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 #ifndef lint
00075 static char rcsid[] DD_UNUSED = "$Id: cuPort.c,v 1.132 2009/04/11 23:44:57 fabio Exp $";
00076 #endif
00077
00078
00079
00080
00081
00082
00085
00086
00087
00088
00089 static void InvalidType( FILE *file, const char *field, const char *expected);
00090
00091
00094
00095
00096
00097
00112 bdd_t *
00113 bdd_construct_bdd_t(bdd_manager *mgr, bdd_node *fn)
00114 {
00115 bdd_t *result;
00116
00117 result = ALLOC(bdd_t, 1);
00118 if (result == NULL) {
00119 Cudd_RecursiveDeref((DdManager *)mgr,(DdNode *)fn);
00120 return(NULL);
00121 }
00122 result->mgr = (DdManager *) mgr;
00123 result->node = (DdNode *) fn;
00124 result->free = FALSE;
00125 return(result);
00126
00127 }
00128
00129
00137 bdd_package_type_t
00138 bdd_get_package_name(void)
00139 {
00140 return(CUDD);
00141
00142 }
00143
00144
00152 void
00153 bdd_end(bdd_manager *mgr)
00154 {
00155 DdManager *manager;
00156
00157 manager = (DdManager *)mgr;
00158 if (manager->hooks != NULL) FREE(manager->hooks);
00159 Cudd_Quit(manager);
00160
00161 }
00162
00163
00171 bdd_manager *
00172 bdd_start(int nvariables)
00173 {
00174 DdManager *mgr;
00175 bdd_external_hooks *hooks;
00176
00177 mgr = Cudd_Init((unsigned int)nvariables, 0, CUDD_UNIQUE_SLOTS,
00178 CUDD_CACHE_SLOTS, getSoftDataLimit() / 10 * 9);
00179
00180 hooks = ALLOC(bdd_external_hooks,1);
00181 hooks->mdd = hooks->network = hooks->undef1 = (char *) 0;
00182 mgr->hooks = (char *) hooks;
00183
00184 return(bdd_manager *)mgr;
00185
00186 }
00187
00188
00198 bdd_t *
00199 bdd_create_variable(bdd_manager *mgr)
00200 {
00201 DdNode *var;
00202 DdManager *dd = (DdManager *) mgr;
00203 DdNode *one = DD_ONE(dd);
00204
00205 if (dd->size >= CUDD_MAXINDEX -1) return(NULL);
00206 do {
00207 dd->reordered = 0;
00208 var = cuddUniqueInter(dd,dd->size,one,Cudd_Not(one));
00209 } while (dd->reordered == 1);
00210
00211 if (var == NULL) return((bdd_t *)NULL);
00212 cuddRef(var);
00213 return(bdd_construct_bdd_t(dd,var));
00214
00215 }
00216
00217
00228 bdd_t *
00229 bdd_create_variable_after(bdd_manager *mgr, bdd_variableId after_id)
00230 {
00231 DdNode *var;
00232 DdManager *dd = (DdManager *) mgr;
00233 int level;
00234
00235 if (after_id >= (bdd_variableId) dd->size) return(NULL);
00236 level = 1 + dd->perm[after_id];
00237 var = Cudd_bddNewVarAtLevel(dd,level);
00238 if (var == NULL) return((bdd_t *)NULL);
00239 cuddRef(var);
00240 return(bdd_construct_bdd_t(dd,var));
00241
00242 }
00243
00244
00252 bdd_t *
00253 bdd_get_variable(bdd_manager *mgr, bdd_variableId variable_ID)
00254 {
00255 DdNode *var;
00256 DdManager *dd = (DdManager *) mgr;
00257 DdNode *one = DD_ONE(dd);
00258
00259 if (variable_ID >= CUDD_MAXINDEX -1) return(NULL);
00260 do {
00261 dd->reordered = 0;
00262 var = cuddUniqueInter(dd,(int)variable_ID,one,Cudd_Not(one));
00263 } while (dd->reordered == 1);
00264
00265 if (var == NULL) return((bdd_t *)NULL);
00266 cuddRef(var);
00267 return(bdd_construct_bdd_t(dd,var));
00268
00269 }
00270
00271
00279 bdd_t *
00280 bdd_dup(bdd_t *f)
00281 {
00282 cuddRef(f->node);
00283 return(bdd_construct_bdd_t(f->mgr,f->node));
00284
00285 }
00286
00287
00295 void
00296 bdd_free(bdd_t *f)
00297 {
00298 if (f == NULL) {
00299 fail("bdd_free: trying to free a NULL bdd_t");
00300 }
00301
00302 if (f->free == TRUE) {
00303 fail("bdd_free: trying to free a freed bdd_t");
00304 }
00305
00306 Cudd_RecursiveDeref(f->mgr,f->node);
00307
00308 f->node = NULL;
00309 f->mgr = NULL;
00310 f->free = TRUE;
00311 FREE(f);
00312 return;
00313
00314 }
00315
00316
00324 bdd_t *
00325 bdd_and(
00326 bdd_t *f,
00327 bdd_t *g,
00328 boolean f_phase,
00329 boolean g_phase)
00330 {
00331 DdManager *dd;
00332 DdNode *newf, *newg, *fandg;
00333
00334
00335 assert(f->mgr == g->mgr);
00336
00337
00338 newf = Cudd_NotCond(f->node,!f_phase);
00339 newg = Cudd_NotCond(g->node,!g_phase);
00340
00341
00342 dd = f->mgr;
00343 fandg = Cudd_bddAnd(f->mgr,newf,newg);
00344 if (fandg == NULL) return(NULL);
00345 cuddRef(fandg);
00346
00347 return(bdd_construct_bdd_t(dd,fandg));
00348
00349 }
00350
00351
00363 bdd_t *
00364 bdd_and_with_limit(
00365 bdd_t *f,
00366 bdd_t *g,
00367 boolean f_phase,
00368 boolean g_phase,
00369 unsigned int limit)
00370 {
00371 DdManager *dd;
00372 DdNode *newf, *newg, *fandg;
00373
00374
00375 assert(f->mgr == g->mgr);
00376
00377
00378 newf = Cudd_NotCond(f->node,!f_phase);
00379 newg = Cudd_NotCond(g->node,!g_phase);
00380
00381
00382 dd = f->mgr;
00383 fandg = Cudd_bddAndLimit(f->mgr,newf,newg,limit);
00384 if (fandg == NULL) return(NULL);
00385 cuddRef(fandg);
00386
00387 return(bdd_construct_bdd_t(dd,fandg));
00388
00389 }
00390
00391
00399 bdd_t *
00400 bdd_and_array(
00401 bdd_t *f,
00402 array_t *g_array,
00403 boolean f_phase,
00404 boolean g_phase)
00405 {
00406 bdd_t *g;
00407 DdNode *result, *temp;
00408 int i;
00409 DdNode *newf, *newg;
00410
00411
00412 newf = Cudd_NotCond(f->node,!f_phase);
00413
00414 Cudd_Ref(result = newf);
00415
00416 for (i = 0; i < array_n(g_array); i++) {
00417 g = array_fetch(bdd_t *, g_array, i);
00418
00419
00420 newg = Cudd_NotCond(g->node,!g_phase);
00421
00422 temp = Cudd_bddAnd(f->mgr, result, newg);
00423 if (temp == NULL) {
00424 Cudd_RecursiveDeref(f->mgr, result);
00425 return(NULL);
00426 }
00427 cuddRef(temp);
00428 Cudd_RecursiveDeref(f->mgr, result);
00429 result = temp;
00430 }
00431
00432 return(bdd_construct_bdd_t(f->mgr,result));
00433
00434 }
00435
00436
00444 bdd_t *
00445 bdd_multiway_and(bdd_manager *manager, array_t *bddArray)
00446 {
00447 DdManager *mgr;
00448 bdd_t *operand;
00449 DdNode *result, *temp;
00450 int i;
00451
00452 mgr = (DdManager *)manager;
00453
00454 Cudd_Ref(result = DD_ONE(mgr));
00455
00456 for (i = 0; i < array_n(bddArray); i++) {
00457 operand = array_fetch(bdd_t *, bddArray, i);
00458 temp = Cudd_bddAnd(mgr, result, operand->node);
00459 if (temp == NULL) {
00460 Cudd_RecursiveDeref(mgr, result);
00461 return(NULL);
00462 }
00463 cuddRef(temp);
00464 Cudd_RecursiveDeref(mgr, result);
00465 result = temp;
00466 }
00467
00468 return(bdd_construct_bdd_t(mgr,result));
00469
00470 }
00471
00472
00480 bdd_t *
00481 bdd_multiway_or(bdd_manager *manager, array_t *bddArray)
00482 {
00483 DdManager *mgr;
00484 bdd_t *operand;
00485 DdNode *result, *temp;
00486 int i;
00487
00488 mgr = (DdManager *)manager;
00489 Cudd_Ref(result = Cudd_Not(DD_ONE(mgr)));
00490
00491 for (i = 0; i < array_n(bddArray); i++) {
00492 operand = array_fetch(bdd_t *, bddArray, i);
00493 temp = Cudd_bddOr(mgr, result, operand->node);
00494 if (temp == NULL) {
00495 Cudd_RecursiveDeref(mgr, result);
00496 return(NULL);
00497 }
00498 cuddRef(temp);
00499 Cudd_RecursiveDeref(mgr, result);
00500 result = temp;
00501 }
00502
00503 return(bdd_construct_bdd_t(mgr,result));
00504
00505 }
00506
00507
00515 bdd_t *
00516 bdd_multiway_xor(bdd_manager *manager, array_t *bddArray)
00517 {
00518 DdManager *mgr;
00519 bdd_t *operand;
00520 DdNode *result, *temp;
00521 int i;
00522
00523 mgr = (DdManager *)manager;
00524
00525 Cudd_Ref(result = Cudd_Not(DD_ONE(mgr)));
00526
00527 for (i = 0; i < array_n(bddArray); i++) {
00528 operand = array_fetch(bdd_t *, bddArray, i);
00529 temp = Cudd_bddXor(mgr, result, operand->node);
00530 if (temp == NULL) {
00531 Cudd_RecursiveDeref(mgr, result);
00532 return(NULL);
00533 }
00534 cuddRef(temp);
00535 Cudd_RecursiveDeref(mgr, result);
00536 result = temp;
00537 }
00538
00539 return(bdd_construct_bdd_t(mgr,result));
00540
00541 }
00542
00543
00551 array_t *
00552 bdd_pairwise_or(bdd_manager *manager, array_t *bddArray1, array_t *bddArray2)
00553 {
00554 DdManager *mgr;
00555 bdd_t *op1, *op2;
00556 bdd_t *unit;
00557 DdNode *result;
00558 array_t *resultArray;
00559 int i;
00560
00561 mgr = (DdManager *)manager;
00562
00563 if (array_n(bddArray1) != array_n(bddArray2)) {
00564 (void) fprintf(stderr,
00565 "bdd_pairwise_or: Arrays of different lengths.\n");
00566 return(NULL);
00567 }
00568
00569 resultArray = array_alloc(bdd_t *, array_n(bddArray1));
00570 for (i = 0; i < array_n(bddArray1); i++) {
00571 op1 = array_fetch(bdd_t *, bddArray1, i);
00572 op2 = array_fetch(bdd_t *, bddArray2, i);
00573
00574 result = Cudd_bddOr(mgr, op1->node, op2->node);
00575 if (result == NULL) {
00576 int j;
00577 bdd_t *item;
00578 for (j = 0; j < array_n(resultArray); j++) {
00579 item = array_fetch(bdd_t *, resultArray, j);
00580 bdd_free(item);
00581 }
00582 array_free(resultArray);
00583 return((array_t *)NULL);
00584 }
00585 cuddRef(result);
00586
00587 unit = bdd_construct_bdd_t(mgr, result);
00588 array_insert(bdd_t *, resultArray, i, unit);
00589 }
00590
00591 return(resultArray);
00592
00593 }
00594
00595
00603 array_t *
00604 bdd_pairwise_and(bdd_manager *manager, array_t *bddArray1, array_t *bddArray2)
00605 {
00606 DdManager *mgr;
00607 bdd_t *op1, *op2;
00608 bdd_t *unit;
00609 DdNode *result;
00610 array_t *resultArray;
00611 int i;
00612
00613 mgr = (DdManager *)manager;
00614
00615 if (array_n(bddArray1) != array_n(bddArray2)) {
00616 (void) fprintf(stderr,
00617 "bdd_pairwise_or: Arrays of different lengths.\n");
00618 return(NULL);
00619 }
00620
00621 resultArray = array_alloc(bdd_t *, array_n(bddArray1));
00622 for (i = 0; i < array_n(bddArray1); i++) {
00623 op1 = array_fetch(bdd_t *, bddArray1, i);
00624 op2 = array_fetch(bdd_t *, bddArray2, i);
00625
00626 result = Cudd_bddAnd(mgr, op1->node, op2->node);
00627 if (result == NULL) {
00628 int j;
00629 bdd_t *item;
00630 for (j = 0; j < array_n(resultArray); j++) {
00631 item = array_fetch(bdd_t *, resultArray, j);
00632 bdd_free(item);
00633 }
00634 array_free(resultArray);
00635 return((array_t *)NULL);
00636 }
00637 cuddRef(result);
00638
00639 unit = bdd_construct_bdd_t(mgr, result);
00640 array_insert(bdd_t *, resultArray, i, unit);
00641 }
00642
00643 return(resultArray);
00644
00645 }
00646
00647
00655 array_t *
00656 bdd_pairwise_xor(bdd_manager *manager, array_t *bddArray1, array_t *bddArray2)
00657 {
00658 DdManager *mgr;
00659 bdd_t *op1, *op2;
00660 bdd_t *unit;
00661 DdNode *result;
00662 array_t *resultArray;
00663 int i;
00664
00665 mgr = (DdManager *)manager;
00666
00667 if (array_n(bddArray1) != array_n(bddArray2)) {
00668 (void) fprintf(stderr,
00669 "bdd_pairwise_or: Arrays of different lengths.\n");
00670 return(NULL);
00671 }
00672
00673 resultArray = array_alloc(bdd_t *, array_n(bddArray1));
00674 for (i = 0; i < array_n(bddArray1); i++) {
00675 op1 = array_fetch(bdd_t *, bddArray1, i);
00676 op2 = array_fetch(bdd_t *, bddArray2, i);
00677
00678 result = Cudd_bddXor(mgr, op1->node, op2->node);
00679 if (result == NULL) {
00680 int j;
00681 bdd_t *item;
00682 for (j = 0; j < array_n(resultArray); j++) {
00683 item = array_fetch(bdd_t *, resultArray, j);
00684 bdd_free(item);
00685 }
00686 array_free(resultArray);
00687 return((array_t *)NULL);
00688 }
00689 cuddRef(result);
00690
00691 unit = bdd_construct_bdd_t(mgr, result);
00692 array_insert(bdd_t *, resultArray, i, unit);
00693 }
00694
00695 return(resultArray);
00696
00697 }
00698
00699
00707 bdd_t *
00708 bdd_and_smooth(
00709 bdd_t *f,
00710 bdd_t *g,
00711 array_t *smoothing_vars )
00712 {
00713 int i;
00714 bdd_t *variable;
00715 DdNode *cube, *tmpDd, *result;
00716 DdManager *mgr;
00717
00718
00719 assert(f->mgr == g->mgr);
00720
00721
00722
00723
00724
00725 mgr = f->mgr;
00726 Cudd_Ref(cube = DD_ONE(mgr));
00727 for (i = 0; i < array_n(smoothing_vars); i++) {
00728 variable = array_fetch(bdd_t *,smoothing_vars,i);
00729
00730
00731 assert(mgr == variable->mgr);
00732
00733 tmpDd = Cudd_bddAnd(mgr,cube,variable->node);
00734 if (tmpDd == NULL) {
00735 Cudd_RecursiveDeref(mgr,cube);
00736 return(NULL);
00737 }
00738 cuddRef(tmpDd);
00739 Cudd_RecursiveDeref(mgr, cube);
00740 cube = tmpDd;
00741 }
00742
00743
00744 result = Cudd_bddAndAbstract(mgr,f->node,g->node,cube);
00745 if (result == NULL) {
00746 Cudd_RecursiveDeref(mgr, cube);
00747 return(NULL);
00748 }
00749 cuddRef(result);
00750
00751 Cudd_RecursiveDeref(mgr, cube);
00752
00753
00754 return(bdd_construct_bdd_t(mgr,result));
00755
00756 }
00757
00758
00771 bdd_t *
00772 bdd_and_smooth_with_limit(
00773 bdd_t *f,
00774 bdd_t *g,
00775 array_t *smoothing_vars ,
00776 unsigned int limit)
00777 {
00778 int i;
00779 bdd_t *variable;
00780 DdNode *cube, *tmpDd, *result;
00781 DdManager *mgr;
00782
00783
00784 assert(f->mgr == g->mgr);
00785
00786
00787
00788
00789
00790 mgr = f->mgr;
00791 Cudd_Ref(cube = DD_ONE(mgr));
00792 for (i = 0; i < array_n(smoothing_vars); i++) {
00793 variable = array_fetch(bdd_t *,smoothing_vars,i);
00794
00795
00796 assert(mgr == variable->mgr);
00797
00798 tmpDd = Cudd_bddAnd(mgr,cube,variable->node);
00799 if (tmpDd == NULL) {
00800 Cudd_RecursiveDeref(mgr,cube);
00801 return(NULL);
00802 }
00803 cuddRef(tmpDd);
00804 Cudd_RecursiveDeref(mgr, cube);
00805 cube = tmpDd;
00806 }
00807
00808
00809 result = Cudd_bddAndAbstractLimit(mgr,f->node,g->node,cube,limit);
00810 if (result == NULL) {
00811 Cudd_RecursiveDeref(mgr, cube);
00812 return(NULL);
00813 }
00814 cuddRef(result);
00815
00816 Cudd_RecursiveDeref(mgr, cube);
00817
00818
00819 return(bdd_construct_bdd_t(mgr,result));
00820
00821 }
00822
00823
00831 bdd_t *
00832 bdd_and_smooth_with_cube(bdd_t *f, bdd_t *g, bdd_t *cube)
00833 {
00834 DdNode *result;
00835 DdManager *mgr;
00836
00837
00838 assert(f->mgr == g->mgr);
00839
00840
00841
00842
00843
00844 mgr = f->mgr;
00845
00846
00847 result = Cudd_bddAndAbstract(mgr,f->node,g->node,cube->node);
00848 if (result == NULL)
00849 return(NULL);
00850 cuddRef(result);
00851
00852
00853 return(bdd_construct_bdd_t(mgr,result));
00854
00855 }
00856
00857
00873 bdd_t *
00874 bdd_clipping_and_smooth(
00875 bdd_t *f,
00876 bdd_t *g,
00877 array_t *smoothing_vars ,
00878 int maxDepth,
00879 int over)
00880 {
00881 int i;
00882 bdd_t *variable;
00883 DdNode *cube,*tmpDd,*result;
00884 DdManager *mgr;
00885
00886
00887 assert(f->mgr == g->mgr);
00888
00889
00890
00891
00892
00893 mgr = f->mgr;
00894 Cudd_Ref(cube = DD_ONE(mgr));
00895 for (i = 0; i < array_n(smoothing_vars); i++) {
00896 variable = array_fetch(bdd_t *,smoothing_vars,i);
00897
00898
00899 assert(mgr == variable->mgr);
00900
00901 tmpDd = Cudd_bddAnd(mgr,cube,variable->node);
00902 if (tmpDd == NULL) {
00903 Cudd_RecursiveDeref(mgr,cube);
00904 return(NULL);
00905 }
00906 cuddRef(tmpDd);
00907 Cudd_RecursiveDeref(mgr, cube);
00908 cube = tmpDd;
00909 }
00910
00911
00912 result = Cudd_bddClippingAndAbstract(mgr,f->node,g->node,cube, maxDepth, over);
00913 if (result == NULL) {
00914 Cudd_RecursiveDeref(mgr, cube);
00915 return(NULL);
00916 }
00917 cuddRef(result);
00918
00919 Cudd_RecursiveDeref(mgr, cube);
00920
00921
00922 return(bdd_construct_bdd_t(mgr,result));
00923
00924 }
00925
00926
00934 bdd_t *
00935 bdd_xor_smooth(
00936 bdd_t *f,
00937 bdd_t *g,
00938 array_t *smoothing_vars )
00939 {
00940 int i;
00941 bdd_t *variable;
00942 DdNode *cube,*tmpDd,*result;
00943 DdManager *mgr;
00944
00945
00946 assert(f->mgr == g->mgr);
00947
00948
00949
00950
00951
00952 mgr = f->mgr;
00953 Cudd_Ref(cube = DD_ONE(mgr));
00954 for (i = 0; i < array_n(smoothing_vars); i++) {
00955 variable = array_fetch(bdd_t *,smoothing_vars,i);
00956
00957
00958 assert(mgr == variable->mgr);
00959
00960 tmpDd = Cudd_bddAnd(mgr,cube,variable->node);
00961 if (tmpDd == NULL) {
00962 Cudd_RecursiveDeref(mgr,cube);
00963 return(NULL);
00964 }
00965 cuddRef(tmpDd);
00966 Cudd_RecursiveDeref(mgr, cube);
00967 cube = tmpDd;
00968 }
00969
00970
00971 result = Cudd_bddXorExistAbstract(mgr,f->node,g->node,cube);
00972 if (result == NULL) {
00973 Cudd_RecursiveDeref(mgr, cube);
00974 return(NULL);
00975 }
00976 cuddRef(result);
00977
00978 Cudd_RecursiveDeref(mgr, cube);
00979
00980
00981 return(bdd_construct_bdd_t(mgr,result));
00982
00983 }
00984
00985
00993 bdd_t *
00994 bdd_between(bdd_t *f_min, bdd_t *f_max)
00995 {
00996 bdd_t *care_set, *ret;
00997
00998 if (bdd_equal(f_min, f_max)) {
00999 return (bdd_dup(f_min));
01000 }
01001 care_set = bdd_or(f_min, f_max, 1, 0);
01002 ret = bdd_minimize(f_min, care_set);
01003 bdd_free(care_set);
01004
01005
01006 if (bdd_size(f_max) <= bdd_size(ret)) {
01007 bdd_free(ret);
01008 return(bdd_dup(f_max));
01009 } else {
01010 return(ret);
01011 }
01012
01013 }
01014
01015
01025 bdd_t *
01026 bdd_compute_cube(bdd_manager *mgr, array_t *vars)
01027 {
01028 DdNode *result;
01029 DdNode **nodeArray;
01030 int i, id;
01031
01032 if (vars == NIL(array_t)) return NIL(bdd_t);
01033 if (array_n(vars) == 0) return NIL(bdd_t);
01034
01035 nodeArray = ALLOC(DdNode *, array_n(vars));
01036 arrayForEachItem(int, vars, i, id) {
01037 assert(id < bdd_num_vars(mgr));
01038 nodeArray[i] = Cudd_bddIthVar((DdManager *)mgr, id);
01039 }
01040 result = Cudd_bddComputeCube((DdManager *)mgr, (DdNode **)nodeArray,
01041 NULL, array_n(vars));
01042 FREE(nodeArray);
01043 if (result == NULL) return(NULL);
01044 cuddRef(result);
01045 return(bdd_construct_bdd_t(mgr,result));
01046
01047 }
01048
01049
01059 bdd_t *
01060 bdd_compute_cube_with_phase(bdd_manager *mgr, array_t *vars, array_t *phase)
01061 {
01062 DdNode *result;
01063 DdNode **nodeArray;
01064 int *phaseArray;
01065 int i, id, ph;
01066
01067 if (vars == NIL(array_t)) return NIL(bdd_t);
01068 if (array_n(vars) == 0) return NIL(bdd_t);
01069 if (phase != NIL(array_t) && array_n(vars) != array_n(phase))
01070 return NIL(bdd_t);
01071
01072 nodeArray = ALLOC(DdNode *, array_n(vars));
01073 phaseArray = NIL(int);
01074 if (phase != NIL(array_t)) phaseArray = ALLOC(int, array_n(phase));
01075 arrayForEachItem(int, vars, i, id) {
01076 assert(id < bdd_num_vars(mgr));
01077 nodeArray[i] = Cudd_bddIthVar((DdManager *)mgr, id);
01078 }
01079 arrayForEachItem(int, phase, i, ph) {
01080 assert(ph == 0 || ph == 1);
01081 phaseArray[i] = ph;
01082 }
01083 result = Cudd_bddComputeCube((DdManager *)mgr, (DdNode **)nodeArray,
01084 phaseArray, array_n(vars));
01085 FREE(nodeArray);
01086 if (phaseArray != NIL(int)) FREE(phaseArray);
01087 if (result == NULL) return(NULL);
01088 cuddRef(result);
01089 return(bdd_construct_bdd_t(mgr,result));
01090
01091 }
01092
01093
01101 bdd_t *
01102 bdd_cofactor(bdd_t *f, bdd_t *g)
01103 {
01104 DdNode *result;
01105
01106
01107 assert(f->mgr == g->mgr);
01108
01109
01110 result = Cudd_bddConstrain(f->mgr,f->node,
01111 g->node);
01112 if (result == NULL) return(NULL);
01113 cuddRef(result);
01114 return(bdd_construct_bdd_t(f->mgr,result));
01115
01116 }
01117
01118
01126 bdd_t *
01127 bdd_cofactor_array(bdd_t *f, array_t *bddArray)
01128 {
01129 bdd_t *operand;
01130 DdNode *result, *temp;
01131 int i;
01132
01133 Cudd_Ref(result = f->node);
01134
01135 for (i = 0; i < array_n(bddArray); i++) {
01136 operand = array_fetch(bdd_t *, bddArray, i);
01137 temp = Cudd_bddConstrain(f->mgr, result, operand->node);
01138 if (temp == NULL) {
01139 Cudd_RecursiveDeref(f->mgr, result);
01140 return(NULL);
01141 }
01142 cuddRef(temp);
01143 Cudd_RecursiveDeref(f->mgr, result);
01144 result = temp;
01145 }
01146
01147 return(bdd_construct_bdd_t(f->mgr,result));
01148
01149 }
01150
01151
01159 bdd_t *
01160 bdd_var_cofactor(bdd_t *f, bdd_t *g)
01161 {
01162 DdNode *result;
01163
01164
01165 assert(f->mgr == g->mgr);
01166
01167 result = Cudd_Cofactor(f->mgr,f->node,
01168 g->node);
01169 if (result == NULL) return(NULL);
01170 cuddRef(result);
01171 return(bdd_construct_bdd_t(f->mgr,result));
01172
01173 }
01174
01175
01193 bdd_t *
01194 bdd_compact(bdd_t *f, bdd_t *g)
01195 {
01196 DdNode *result;
01197
01198
01199 assert(f->mgr == g->mgr);
01200
01201 result = Cudd_bddLICompaction(f->mgr,f->node,
01202 g->node);
01203 if (result == NULL) return(NULL);
01204 cuddRef(result);
01205 return(bdd_construct_bdd_t(f->mgr,result));
01206
01207 }
01208
01209
01217 bdd_t *
01218 bdd_squeeze(bdd_t *l, bdd_t *u)
01219 {
01220 DdNode *result;
01221
01222
01223 assert(l->mgr == u->mgr);
01224
01225 result = Cudd_bddSqueeze(l->mgr,l->node,
01226 u->node);
01227 if (result == NULL) return(NULL);
01228 cuddRef(result);
01229 return(bdd_construct_bdd_t(l->mgr,result));
01230
01231 }
01232
01233
01241 bdd_t *
01242 bdd_compose(bdd_t *f, bdd_t *v, bdd_t *g)
01243 {
01244 DdNode *result;
01245
01246
01247 assert(f->mgr == g->mgr);
01248 assert(f->mgr == v->mgr);
01249
01250 result = Cudd_bddCompose(f->mgr,f->node,
01251 g->node,
01252 (int)Cudd_Regular(v->node)->index);
01253 if (result == NULL) return(NULL);
01254 cuddRef(result);
01255 return(bdd_construct_bdd_t(f->mgr,result));
01256
01257 }
01258
01259
01269 bdd_t *
01270 bdd_vector_compose(bdd_t *f, array_t *varArray, array_t *funcArray)
01271 {
01272 int i, n, nVars, index;
01273 bdd_t *var, *func;
01274 DdNode *result;
01275 DdNode **vector;
01276
01277 assert(array_n(varArray) == array_n(funcArray));
01278 n = array_n(varArray);
01279 nVars = ((DdManager *)f->mgr)->size;
01280 vector = ALLOC(DdNode *, sizeof(DdNode *) * nVars);
01281 memset(vector, 0, sizeof(DdNode *) * nVars);
01282
01283 for (i = 0; i < n; i++) {
01284 var = array_fetch(bdd_t *, varArray, i);
01285 func = array_fetch(bdd_t *, funcArray, i);
01286 index = (int)bdd_top_var_id(var);
01287 vector[index] = (DdNode *)func->node;
01288 cuddRef(vector[index]);
01289 }
01290 for (i = 0; i < nVars; i++) {
01291 if (!vector[i]) {
01292 vector[i] = Cudd_bddIthVar((DdManager *)f->mgr, i);
01293 cuddRef(vector[i]);
01294 }
01295 }
01296
01297 result = Cudd_bddVectorCompose(f->mgr, f->node, vector);
01298
01299 for (i = 0; i < nVars; i++)
01300 Cudd_RecursiveDeref((DdManager *)f->mgr, vector[i]);
01301 FREE(vector);
01302 if (result == NULL) return(NULL);
01303 cuddRef(result);
01304 return(bdd_construct_bdd_t(f->mgr,result));
01305
01306 }
01307
01308
01316 bdd_t *
01317 bdd_consensus(
01318 bdd_t *f,
01319 array_t *quantifying_vars )
01320 {
01321 int i;
01322 bdd_t *variable;
01323 DdNode *cube,*tmpDd,*result;
01324 DdManager *mgr;
01325
01326
01327
01328
01329
01330 mgr = f->mgr;
01331 Cudd_Ref(cube = DD_ONE(mgr));
01332 for (i = 0; i < array_n(quantifying_vars); i++) {
01333 variable = array_fetch(bdd_t *,quantifying_vars,i);
01334
01335
01336 assert(mgr == variable->mgr);
01337
01338 tmpDd = Cudd_bddAnd(mgr,cube,variable->node);
01339 if (tmpDd == NULL) {
01340 Cudd_RecursiveDeref(mgr, cube);
01341 return(NULL);
01342 }
01343 cuddRef(tmpDd);
01344 Cudd_RecursiveDeref(mgr, cube);
01345 cube = tmpDd;
01346 }
01347
01348
01349 result = Cudd_bddUnivAbstract(mgr,f->node,cube);
01350 if (result == NULL) {
01351 Cudd_RecursiveDeref(mgr, cube);
01352 return(NULL);
01353 }
01354 cuddRef(result);
01355
01356 Cudd_RecursiveDeref(mgr, cube);
01357
01358
01359 return(bdd_construct_bdd_t(mgr,result));
01360
01361 }
01362
01363
01371 bdd_t *
01372 bdd_consensus_with_cube(
01373 bdd_t *f,
01374 bdd_t *cube)
01375 {
01376 DdNode *result;
01377 DdManager *mgr;
01378
01379 mgr = f->mgr;
01380
01381 result = Cudd_bddUnivAbstract(mgr,f->node,cube->node);
01382 if (result == NULL)
01383 return(NULL);
01384 cuddRef(result);
01385
01386
01387 return(bdd_construct_bdd_t(mgr,result));
01388
01389 }
01390
01391
01404 bdd_t *
01405 bdd_cproject(
01406 bdd_t *f,
01407 array_t *quantifying_vars )
01408 {
01409 DdManager *dd;
01410 DdNode *cube;
01411 DdNode *res;
01412 bdd_t *fi;
01413 int nvars, i;
01414
01415 if (f == NULL) {
01416 fail ("bdd_cproject: invalid BDD");
01417 }
01418
01419 nvars = array_n(quantifying_vars);
01420 if (nvars <= 0) {
01421 fail("bdd_cproject: no projection variables");
01422 }
01423 dd = f->mgr;
01424
01425 cube = DD_ONE(dd);
01426 cuddRef(cube);
01427 for (i = nvars - 1; i >= 0; i--) {
01428 DdNode *tmpp;
01429 fi = array_fetch(bdd_t *, quantifying_vars, i);
01430 tmpp = Cudd_bddAnd(dd,fi->node,cube);
01431 if (tmpp == NULL) {
01432 Cudd_RecursiveDeref(dd,cube);
01433 return(NULL);
01434 }
01435 cuddRef(tmpp);
01436 Cudd_RecursiveDeref(dd,cube);
01437 cube = tmpp;
01438 }
01439
01440 res = Cudd_CProjection(dd,f->node,cube);
01441 if (res == NULL) {
01442 Cudd_RecursiveDeref(dd,cube);
01443 return(NULL);
01444 }
01445 cuddRef(res);
01446 Cudd_RecursiveDeref(dd,cube);
01447
01448 return(bdd_construct_bdd_t(dd,res));
01449
01450 }
01451
01452
01460 bdd_t *
01461 bdd_else(bdd_t *f)
01462 {
01463 DdNode *result;
01464
01465 result = Cudd_E(f->node);
01466 result = Cudd_NotCond(result,Cudd_IsComplement(f->node));
01467 cuddRef(result);
01468 return(bdd_construct_bdd_t(f->mgr,result));
01469
01470 }
01471
01472
01480 bdd_t *
01481 bdd_ite(
01482 bdd_t *i,
01483 bdd_t *t,
01484 bdd_t *e,
01485 boolean i_phase,
01486 boolean t_phase,
01487 boolean e_phase)
01488 {
01489 DdNode *newi,*newt,*newe,*ite;
01490
01491
01492 assert(i->mgr == t->mgr);
01493 assert(i->mgr == e->mgr);
01494
01495
01496 if (!i_phase) {
01497 newi = Cudd_Not(i->node);
01498 } else {
01499 newi = i->node;
01500 }
01501 if (!t_phase) {
01502 newt = Cudd_Not(t->node);
01503 } else {
01504 newt = t->node;
01505 }
01506 if (!e_phase) {
01507 newe = Cudd_Not(e->node);
01508 } else {
01509 newe = e->node;
01510 }
01511
01512
01513 ite = Cudd_bddIte(i->mgr,newi,newt,newe);
01514 if (ite == NULL) return(NULL);
01515 cuddRef(ite);
01516 return(bdd_construct_bdd_t(i->mgr,ite));
01517
01518 }
01519
01520
01532 bdd_t *
01533 bdd_minimize(bdd_t *f, bdd_t *c)
01534 {
01535 DdNode *result;
01536 bdd_t *output;
01537
01538
01539 assert(f->mgr == c->mgr);
01540
01541 result = Cudd_bddRestrict(f->mgr, f->node, c->node);
01542 if (result == NULL) return(NULL);
01543 cuddRef(result);
01544
01545 output = bdd_construct_bdd_t(f->mgr,result);
01546 return(output);
01547
01548 }
01549
01550
01562 bdd_t *
01563 bdd_minimize_array(bdd_t *f, array_t *bddArray)
01564 {
01565 bdd_t *operand;
01566 DdNode *result, *temp;
01567 int i;
01568
01569 Cudd_Ref(result = f->node);
01570
01571 for (i = 0; i < array_n(bddArray); i++) {
01572 operand = array_fetch(bdd_t *, bddArray, i);
01573 temp = Cudd_bddRestrict(f->mgr, result, operand->node);
01574 if (temp == NULL) {
01575 Cudd_RecursiveDeref(f->mgr, result);
01576 return(NULL);
01577 }
01578 cuddRef(temp);
01579 Cudd_RecursiveDeref(f->mgr, result);
01580 result = temp;
01581 }
01582
01583 return(bdd_construct_bdd_t(f->mgr,result));
01584
01585 }
01586
01587
01604 bdd_t *
01605 bdd_approx_hb(
01606 bdd_t *f,
01607 bdd_approx_dir_t approxDir,
01608 int numVars,
01609 int threshold)
01610 {
01611 DdNode *result;
01612 bdd_t *output;
01613
01614 switch (approxDir) {
01615 case BDD_OVER_APPROX:
01616 result = Cudd_SupersetHeavyBranch(f->mgr, f->node, numVars, threshold);
01617 break;
01618 case BDD_UNDER_APPROX:
01619 result = Cudd_SubsetHeavyBranch(f->mgr, f->node, numVars, threshold);
01620 break;
01621 default:
01622 result = NULL;
01623 }
01624 if (result == NULL) return(NULL);
01625 cuddRef(result);
01626
01627 output = bdd_construct_bdd_t(f->mgr,result);
01628 return(output);
01629
01630 }
01631
01632
01650 bdd_t *
01651 bdd_approx_sp(
01652 bdd_t *f,
01653 bdd_approx_dir_t approxDir,
01654 int numVars,
01655 int threshold,
01656 int hardlimit)
01657 {
01658 DdNode *result;
01659 bdd_t *output;
01660
01661 switch (approxDir) {
01662 case BDD_OVER_APPROX:
01663 result = Cudd_SupersetShortPaths(f->mgr, f->node, numVars, threshold, hardlimit);
01664 break;
01665 case BDD_UNDER_APPROX:
01666 result = Cudd_SubsetShortPaths(f->mgr, f->node, numVars, threshold, hardlimit);
01667 break;
01668 default:
01669 result = NULL;
01670 }
01671
01672 if (result == NULL) return(NULL);
01673 cuddRef(result);
01674
01675 output = bdd_construct_bdd_t(f->mgr,result);
01676 return(output);
01677
01678 }
01679
01680
01701 bdd_t *
01702 bdd_approx_ua(
01703 bdd_t *f,
01704 bdd_approx_dir_t approxDir,
01705 int numVars,
01706 int threshold,
01707 int safe,
01708 double quality)
01709 {
01710 DdNode *result;
01711 bdd_t *output;
01712
01713 switch (approxDir) {
01714 case BDD_OVER_APPROX:
01715 result = Cudd_OverApprox(f->mgr, f->node, numVars, threshold, safe, quality);
01716 break;
01717 case BDD_UNDER_APPROX:
01718 result = Cudd_UnderApprox(f->mgr, f->node, numVars, threshold, safe, quality);
01719 break;
01720 default:
01721 result = NULL;
01722 }
01723 if (result == NULL) return(NULL);
01724 cuddRef(result);
01725
01726 output = bdd_construct_bdd_t(f->mgr,result);
01727 return(output);
01728
01729 }
01730
01731
01753 bdd_t *
01754 bdd_approx_remap_ua(
01755 bdd_t *f,
01756 bdd_approx_dir_t approxDir,
01757 int numVars,
01758 int threshold,
01759 double quality)
01760 {
01761 DdNode *result;
01762 bdd_t *output;
01763
01764 switch (approxDir) {
01765 case BDD_OVER_APPROX:
01766 result = Cudd_RemapOverApprox((DdManager *)f->mgr, (DdNode *)f->node, numVars, threshold, quality);
01767 break;
01768 case BDD_UNDER_APPROX:
01769 result = Cudd_RemapUnderApprox((DdManager *)f->mgr, (DdNode *)f->node, numVars, threshold, quality);
01770 break;
01771 default:
01772 result = NULL;
01773 }
01774
01775 if (result == NULL) return(NULL);
01776 cuddRef(result);
01777
01778 output = bdd_construct_bdd_t((DdManager *)f->mgr,result);
01779 return(output);
01780
01781 }
01782
01783
01807 bdd_t *
01808 bdd_approx_biased_rua(
01809 bdd_t *f,
01810 bdd_approx_dir_t approxDir,
01811 bdd_t *bias,
01812 int numVars,
01813 int threshold,
01814 double quality,
01815 double qualityBias)
01816 {
01817 DdNode *result;
01818 bdd_t *output;
01819
01820 assert(bias->mgr == f->mgr);
01821 switch (approxDir) {
01822 case BDD_OVER_APPROX:
01823 result = Cudd_BiasedOverApprox((DdManager *)f->mgr, (DdNode *)f->node, (DdNode *)bias->node, numVars, threshold, quality, qualityBias);
01824 break;
01825 case BDD_UNDER_APPROX:
01826 result = Cudd_BiasedUnderApprox((DdManager *)f->mgr, (DdNode *)f->node, (DdNode *)bias->node, numVars, threshold, quality, qualityBias);
01827 break;
01828 default:
01829 result = NULL;
01830 }
01831
01832 if (result == NULL) return(NULL);
01833 cuddRef(result);
01834
01835 output = bdd_construct_bdd_t((DdManager *)f->mgr,result);
01836 return(output);
01837
01838 }
01839
01840
01855 bdd_t *
01856 bdd_approx_compress(
01857 bdd_t *f,
01858 bdd_approx_dir_t approxDir,
01859 int numVars,
01860 int threshold)
01861 {
01862 DdNode *result;
01863 bdd_t *output;
01864
01865 switch (approxDir) {
01866 case BDD_OVER_APPROX:
01867 result = Cudd_SupersetCompress(f->mgr, f->node, numVars, threshold);
01868 break;
01869 case BDD_UNDER_APPROX:
01870 result = Cudd_SubsetCompress(f->mgr, f->node, numVars, threshold);
01871 break;
01872 default:
01873 result = NULL;
01874 }
01875
01876 if (result == NULL) return(NULL);
01877 cuddRef(result);
01878
01879 output = bdd_construct_bdd_t(f->mgr,result);
01880 return(output);
01881
01882 }
01883
01884
01902 bdd_t *
01903 bdd_shortest_path(
01904 bdd_t *f,
01905 int *weight,
01906 int *support,
01907 int *length)
01908 {
01909 DdNode *result;
01910 bdd_t *output;
01911
01912 result = Cudd_ShortestPath(f->mgr, f->node, weight, support, length);
01913 if (result == NULL) return(NULL);
01914 cuddRef(result);
01915
01916 output = bdd_construct_bdd_t(f->mgr,result);
01917 return(output);
01918
01919 }
01920
01921
01929 bdd_t *
01930 bdd_not(bdd_t *f)
01931 {
01932 DdNode *result;
01933
01934 Cudd_Ref(result = Cudd_Not(f->node));
01935 return(bdd_construct_bdd_t(f->mgr,result));
01936
01937 }
01938
01939
01947 bdd_t *
01948 bdd_one(bdd_manager *mgr)
01949 {
01950 DdNode *result;
01951
01952 Cudd_Ref(result = DD_ONE((DdManager *)mgr));
01953 return(bdd_construct_bdd_t((DdManager *)mgr,result));
01954
01955 }
01956
01957
01965 bdd_t *
01966 bdd_or(
01967 bdd_t *f,
01968 bdd_t *g,
01969 boolean f_phase,
01970 boolean g_phase)
01971 {
01972 DdNode *newf,*newg,*forg;
01973 bdd_t *result;
01974
01975
01976 assert(f->mgr == g->mgr);
01977
01978
01979 if (f_phase) {
01980 newf = Cudd_Not(f->node);
01981 } else {
01982 newf = f->node;
01983 }
01984 if (g_phase) {
01985 newg = Cudd_Not(g->node);
01986 } else {
01987 newg = g->node;
01988 }
01989
01990
01991 forg = Cudd_bddAnd(f->mgr,newf,newg);
01992 if (forg == NULL) return(NULL);
01993 forg = Cudd_Not(forg);
01994 cuddRef(forg);
01995 result = bdd_construct_bdd_t(f->mgr,forg);
01996
01997 return(result);
01998
01999 }
02000
02001
02009 bdd_t *
02010 bdd_smooth(
02011 bdd_t *f,
02012 array_t *smoothing_vars )
02013 {
02014 int i;
02015 bdd_t *variable;
02016 DdNode *cube,*tmpDd,*result;
02017 DdManager *mgr;
02018 DdNode **vars;
02019 int nVars, level;
02020
02021
02022
02023
02024
02025 mgr = f->mgr;
02026 nVars = mgr->size;
02027 vars = ALLOC(DdNode *, sizeof(DdNode *) * nVars);
02028 memset(vars, 0, sizeof(DdNode *) * nVars);
02029 for (i = 0; i < array_n(smoothing_vars); i++) {
02030 variable = array_fetch(bdd_t *,smoothing_vars,i);
02031
02032
02033 assert(mgr == variable->mgr);
02034
02035 level = Cudd_ReadPerm(mgr, Cudd_NodeReadIndex(variable->node));
02036 vars[level] = variable->node;
02037 }
02038 Cudd_Ref(cube = DD_ONE(mgr));
02039 for (i = nVars - 1; i >= 0; i--) {
02040 if (!vars[i])
02041 continue;
02042 tmpDd = Cudd_bddAnd(mgr,cube,vars[i]);
02043 if (tmpDd == NULL) {
02044 Cudd_RecursiveDeref(mgr, cube);
02045 return(NULL);
02046 }
02047 cuddRef(tmpDd);
02048 Cudd_RecursiveDeref(mgr, cube);
02049 cube = tmpDd;
02050 }
02051 FREE(vars);
02052
02053
02054 result = Cudd_bddExistAbstract(mgr,f->node,cube);
02055 if (result == NULL) {
02056 Cudd_RecursiveDeref(mgr, cube);
02057 return(NULL);
02058 }
02059 cuddRef(result);
02060
02061
02062 Cudd_RecursiveDeref(mgr, cube);
02063
02064
02065 return(bdd_construct_bdd_t(mgr,result));
02066
02067 }
02068
02069
02077 bdd_t *
02078 bdd_smooth_with_cube(bdd_t *f, bdd_t *cube)
02079 {
02080 DdNode *result;
02081 DdManager *mgr;
02082
02083 mgr = f->mgr;
02084
02085
02086 result = Cudd_bddExistAbstract(mgr,f->node,cube->node);
02087 if (result == NULL)
02088 return(NULL);
02089 cuddRef(result);
02090
02091
02092 return(bdd_construct_bdd_t(mgr,result));
02093
02094 }
02095
02096
02104 bdd_t *
02105 bdd_substitute(
02106 bdd_t *f,
02107 array_t *old_array ,
02108 array_t *new_array )
02109 {
02110 int i,from,to;
02111 int *permut;
02112 bdd_t *variable;
02113 DdNode *result;
02114
02115
02116 assert(array_n(old_array) == array_n(new_array));
02117
02118
02119 permut = ALLOC(int, Cudd_ReadSize((DdManager *)f->mgr));
02120 for (i = 0; i < Cudd_ReadSize((DdManager *)f->mgr); i++) permut[i] = i;
02121
02122
02123 for (i = 0; i < array_n(old_array); i++) {
02124 variable = array_fetch(bdd_t *, old_array, i);
02125 from = Cudd_Regular(variable->node)->index;
02126 variable = array_fetch(bdd_t *, new_array, i);
02127
02128 assert(f->mgr == variable->mgr);
02129
02130 to = Cudd_Regular(variable->node)->index;
02131 permut[from] = to;
02132 }
02133
02134 result = Cudd_bddPermute(f->mgr,f->node,permut);
02135 FREE(permut);
02136 if (result == NULL) return(NULL);
02137 cuddRef(result);
02138 return(bdd_construct_bdd_t(f->mgr,result));
02139
02140 }
02141
02142
02150 bdd_t *
02151 bdd_substitute_with_permut(
02152 bdd_t *f,
02153 int *permut)
02154 {
02155 DdNode *result;
02156
02157 result = Cudd_bddPermute(f->mgr,f->node,permut);
02158 if (result == NULL) return(NULL);
02159 cuddRef(result);
02160 return(bdd_construct_bdd_t(f->mgr,result));
02161
02162 }
02163
02164
02172 array_t *
02173 bdd_substitute_array(
02174 array_t *f_array,
02175 array_t *old_array,
02176 array_t *new_array)
02177 {
02178 int i;
02179 bdd_t *f, *new_;
02180 array_t *substitute_array = array_alloc(bdd_t *, 0);
02181
02182 arrayForEachItem(bdd_t *, f_array, i, f) {
02183 new_ = bdd_substitute(f, old_array, new_array);
02184 array_insert_last(bdd_t *, substitute_array, new_);
02185 }
02186 return(substitute_array);
02187
02188 }
02189
02190
02198 array_t *
02199 bdd_substitute_array_with_permut(
02200 array_t *f_array,
02201 int *permut)
02202 {
02203 int i;
02204 bdd_t *f, *new_;
02205 array_t *substitute_array = array_alloc(bdd_t *, 0);
02206
02207 arrayForEachItem(bdd_t *, f_array, i, f) {
02208 new_ = bdd_substitute_with_permut(f, permut);
02209 array_insert_last(bdd_t *, substitute_array, new_);
02210 }
02211 return(substitute_array);
02212
02213 }
02214
02215
02223 void *
02224 bdd_pointer(bdd_t *f)
02225 {
02226 return((void *)f->node);
02227
02228 }
02229
02230
02238 bdd_t *
02239 bdd_then(bdd_t *f)
02240 {
02241 DdNode *result;
02242
02243 result = Cudd_T(f->node);
02244 result = Cudd_NotCond(result,Cudd_IsComplement(f->node));
02245 cuddRef(result);
02246 return(bdd_construct_bdd_t(f->mgr,result));
02247
02248 }
02249
02250
02261 bdd_t *
02262 bdd_top_var(bdd_t *f)
02263 {
02264 DdNode *result;
02265
02266 if (Cudd_IsConstant(f->node)) {
02267 result = f->node;
02268 } else {
02269 result = f->mgr->vars[Cudd_Regular(f->node)->index];
02270 }
02271 cuddRef(result);
02272 return(bdd_construct_bdd_t(f->mgr,result));
02273
02274 }
02275
02276
02284 bdd_t *
02285 bdd_xnor(bdd_t *f, bdd_t *g)
02286 {
02287 DdNode *result;
02288
02289
02290 assert(f->mgr == g->mgr);
02291
02292 result = Cudd_bddXnor(f->mgr,f->node,g->node);
02293 if (result == NULL) return(NULL);
02294 cuddRef(result);
02295 return(bdd_construct_bdd_t(f->mgr,result));
02296
02297 }
02298
02299
02307 bdd_t *
02308 bdd_xor(bdd_t *f, bdd_t *g)
02309 {
02310 DdNode *result;
02311
02312
02313 assert(f->mgr == g->mgr);
02314
02315 result = Cudd_bddXor(f->mgr,f->node,g->node);
02316 if (result == NULL) return(NULL);
02317 cuddRef(result);
02318 return(bdd_construct_bdd_t(f->mgr,result));
02319
02320 }
02321
02322
02330 bdd_t *
02331 bdd_zero(bdd_manager *mgr)
02332 {
02333 DdManager *manager;
02334 DdNode *result;
02335
02336 manager = (DdManager *)mgr;
02337 Cudd_Ref(result = Cudd_Not(DD_ONE((manager))));
02338 return(bdd_construct_bdd_t(manager,result));
02339
02340 }
02341
02342
02350 boolean
02351 bdd_equal(bdd_t *f, bdd_t *g)
02352 {
02353 return(f->node == g->node);
02354
02355 }
02356
02357
02367 boolean
02368 bdd_equal_mod_care_set(
02369 bdd_t *f,
02370 bdd_t *g,
02371 bdd_t *careSet)
02372 {
02373
02374 assert(f->mgr == g->mgr && f->mgr == careSet->mgr);
02375 return(Cudd_EquivDC(f->mgr, f->node, g->node, Cudd_Not(careSet->node)));
02376
02377 }
02378
02379
02387 bdd_t *
02388 bdd_intersects(
02389 bdd_t *f,
02390 bdd_t *g)
02391 {
02392 DdNode *result;
02393
02394
02395 assert(f->mgr == g->mgr);
02396
02397 result = Cudd_bddIntersect(f->mgr,f->node,g->node);
02398 if (result == NULL) return(NULL);
02399 cuddRef(result);
02400 return(bdd_construct_bdd_t(f->mgr,result));
02401
02402 }
02403
02404
02412 bdd_t *
02413 bdd_closest_cube(
02414 bdd_t *f,
02415 bdd_t *g,
02416 int *dist)
02417 {
02418 DdNode *result;
02419
02420
02421 assert(f->mgr == g->mgr);
02422
02423 result = Cudd_bddClosestCube(f->mgr,f->node,g->node,dist);
02424 if (result == NULL) return(NULL);
02425 cuddRef(result);
02426 return(bdd_construct_bdd_t(f->mgr,result));
02427
02428 }
02429
02430
02438 boolean
02439 bdd_is_tautology(bdd_t *f, boolean phase)
02440 {
02441 if (phase) {
02442 return(f->node == DD_ONE(f->mgr));
02443 } else {
02444 return(f->node == Cudd_Not(DD_ONE(f->mgr)));
02445 }
02446
02447 }
02448
02449
02457 boolean
02458 bdd_leq(
02459 bdd_t *f,
02460 bdd_t *g,
02461 boolean f_phase,
02462 boolean g_phase)
02463 {
02464 DdNode *newf, *newg;
02465
02466
02467 assert(f->mgr == g->mgr);
02468 newf = Cudd_NotCond(f->node, !f_phase);
02469 newg = Cudd_NotCond(g->node, !g_phase);
02470
02471 return(Cudd_bddLeq(f->mgr,newf,newg));
02472
02473 }
02474
02475
02485 boolean
02486 bdd_lequal_mod_care_set(
02487 bdd_t *f,
02488 bdd_t *g,
02489 boolean f_phase,
02490 boolean g_phase,
02491 bdd_t *careSet)
02492 {
02493 DdNode *newf, *newg;
02494
02495
02496 assert(f->mgr == g->mgr && f->mgr == careSet->mgr);
02497 newf = Cudd_NotCond(f->node, !f_phase);
02498 newg = Cudd_NotCond(g->node, !g_phase);
02499
02500 return(Cudd_bddLeqUnless(f->mgr, newf, newg, Cudd_Not(careSet->node)));
02501
02502 }
02503
02504
02512 boolean
02513 bdd_leq_array(
02514 bdd_t *f,
02515 array_t *g_array,
02516 boolean f_phase,
02517 boolean g_phase)
02518 {
02519 int i;
02520 bdd_t *g;
02521 boolean result;
02522
02523 arrayForEachItem(bdd_t *, g_array, i, g) {
02524 result = bdd_leq(f, g, f_phase, g_phase);
02525 if (g_phase) {
02526 if (!result)
02527 return(0);
02528 } else {
02529 if (result)
02530 return(1);
02531 }
02532 }
02533 if (g_phase)
02534 return(1);
02535 else
02536 return(0);
02537
02538 }
02539
02540
02548 double
02549 bdd_count_onset(
02550 bdd_t *f,
02551 array_t *var_array )
02552 {
02553 return(Cudd_CountMinterm(f->mgr,f->node,array_n(var_array)));
02554
02555 }
02556
02557
02565 int
02566 bdd_epd_count_onset(
02567 bdd_t *f,
02568 array_t *var_array ,
02569 EpDouble *epd)
02570 {
02571 return(Cudd_EpdCountMinterm(f->mgr,f->node,array_n(var_array),epd));
02572
02573 }
02574
02575
02583 int
02584 bdd_get_free(bdd_t *f)
02585 {
02586 return(f->free);
02587
02588 }
02589
02590
02598 bdd_manager *
02599 bdd_get_manager(bdd_t *f)
02600 {
02601 return(f->mgr);
02602
02603 }
02604
02605
02613 bdd_node *
02614 bdd_get_node(
02615 bdd_t *f,
02616 boolean *is_complemented )
02617 {
02618 if (Cudd_IsComplement(f->node)) {
02619 *is_complemented = TRUE;
02620 return(Cudd_Regular(f->node));
02621 }
02622 *is_complemented = FALSE;
02623 return(f->node);
02624
02625 }
02626
02627
02635 var_set_t *
02636 bdd_get_support(bdd_t *f)
02637 {
02638 int i, size, *support;
02639 var_set_t *result;
02640
02641 size = (unsigned int)Cudd_ReadSize((DdManager *)f->mgr);
02642 support = Cudd_SupportIndex(f->mgr,f->node);
02643 if (support == NULL) return(NULL);
02644
02645 result = var_set_new((int) f->mgr->size);
02646 for (i = 0; i < size; i++) {
02647 if (support[i])
02648 var_set_set_elt(result, i);
02649 }
02650 FREE(support);
02651
02652 return(result);
02653
02654 }
02655
02656
02664 int
02665 bdd_is_support_var(bdd_t *f, bdd_t *var)
02666 {
02667 return(bdd_is_support_var_id(f, bdd_top_var_id(var)));
02668
02669 }
02670
02671
02679 int
02680 bdd_is_support_var_id(bdd_t *f, int index)
02681 {
02682 DdNode *support, *scan;
02683
02684 support = Cudd_Support(f->mgr,f->node);
02685 if (support == NULL) return(-1);
02686 cuddRef(support);
02687
02688 scan = support;
02689 while (!cuddIsConstant(scan)) {
02690 if (scan->index == index) {
02691 Cudd_RecursiveDeref(f->mgr,support);
02692 return(1);
02693 }
02694 scan = cuddT(scan);
02695 }
02696 Cudd_RecursiveDeref(f->mgr,support);
02697
02698 return(0);
02699
02700 }
02701
02702
02710 array_t *
02711 bdd_get_varids(array_t *var_array)
02712 {
02713 int i;
02714 int index;
02715 bdd_t *var;
02716 array_t *result = array_alloc(int,array_n(var_array));
02717
02718 for (i = 0; i < array_n(var_array); i++) {
02719 var = array_fetch(bdd_t *, var_array, i);
02720 index = Cudd_Regular(var->node)->index;
02721 (void) array_insert_last(int, result, index);
02722 }
02723 return(result);
02724
02725 }
02726
02727
02735 unsigned int
02736 bdd_num_vars(bdd_manager *mgr)
02737 {
02738 unsigned int size;
02739 size = (unsigned int)Cudd_ReadSize((DdManager *)mgr);
02740 return(size);
02741
02742 }
02743
02744
02752 void
02753 bdd_print(bdd_t *f)
02754 {
02755 (void) cuddP(f->mgr,f->node);
02756
02757 }
02758
02759
02767 void
02768 bdd_print_stats(bdd_manager *mgr, FILE *file)
02769 {
02770 Cudd_PrintInfo((DdManager *)mgr, file);
02771
02772
02773 (void) fprintf(file, "\nMore detailed information about the semantics ");
02774 (void) fprintf(file, "and values of these parameters\n");
02775 (void) fprintf(file, "can be found in the documentation about the CU ");
02776 (void) fprintf(file, "Decision Diagram Package.\n");
02777
02778 return;
02779
02780 }
02781
02782
02796 int
02797 bdd_set_parameters(
02798 bdd_manager *mgr,
02799 avl_tree *valueTable,
02800 FILE *file)
02801 {
02802 Cudd_ReorderingType reorderMethod;
02803 Cudd_ReorderingType zddReorderMethod;
02804 st_table *newValueTable;
02805 st_generator *stgen;
02806 avl_generator *avlgen;
02807 char *paramName;
02808 char *paramValue;
02809
02810
02811 reorderMethod = CUDD_REORDER_SAME;
02812 zddReorderMethod = CUDD_REORDER_SAME;
02813
02814
02815
02816 newValueTable = st_init_table(st_ptrcmp, st_ptrhash);
02817 avl_foreach_item(valueTable, avlgen, AVL_FORWARD, (char **)¶mName,
02818 (char **)¶mValue) {
02819 if (strncmp(paramName, "BDD.", 4) == 0) {
02820 st_insert(newValueTable, (char *)¶mName[4],
02821 (char *)paramValue);
02822 }
02823 }
02824
02825 st_foreach_item(newValueTable, stgen, ¶mName, ¶mValue) {
02826 int uvalue;
02827 char *invalidChar;
02828
02829 invalidChar = NIL(char);
02830
02831 if (strcmp(paramName, "Hard limit for cache size") == 0) {
02832
02833 uvalue = strtol(paramValue, &invalidChar, 10);
02834 if (*invalidChar || uvalue < 0) {
02835 InvalidType(file, "Hard limit for cache size",
02836 "unsigned integer");
02837 }
02838 else {
02839 Cudd_SetMaxCacheHard((DdManager *) mgr, (unsigned int) uvalue);
02840 }
02841 }
02842 else if (strcmp(paramName, "Cache hit threshold for resizing") == 0) {
02843
02844 uvalue = strtol(paramValue, &invalidChar, 10);
02845 if (*invalidChar || uvalue < 0) {
02846 InvalidType(file, "Cache hit threshold for resizing",
02847 "unsigned integer");
02848 }
02849 else {
02850 Cudd_SetMinHit((DdManager *) mgr, (unsigned int) uvalue);
02851 }
02852 }
02853 else if (strcmp(paramName, "Garbage collection enabled") == 0) {
02854 if (strcmp(paramValue, "yes") == 0) {
02855 Cudd_EnableGarbageCollection((DdManager *) mgr);
02856 }
02857 else if (strcmp(paramValue, "no") == 0) {
02858 Cudd_DisableGarbageCollection((DdManager *) mgr);
02859 }
02860 else {
02861 InvalidType(file, "Garbage collection enabled", "(yes,no)");
02862 }
02863 }
02864 else if (strcmp(paramName, "Limit for fast unique table growth")
02865 == 0) {
02866
02867 uvalue = strtol(paramValue, &invalidChar, 10);
02868 if (*invalidChar || uvalue < 0) {
02869 InvalidType(file, "Limit for fast unique table growth",
02870 "unsigned integer");
02871 }
02872 else {
02873 Cudd_SetLooseUpTo((DdManager *) mgr, (unsigned int) uvalue);
02874 }
02875 }
02876 else if (strcmp(paramName,
02877 "Maximum number of variables sifted per reordering")
02878 == 0) {
02879
02880 uvalue = strtol(paramValue, &invalidChar, 10);
02881 if (*invalidChar || uvalue < 0) {
02882 InvalidType(file, "Maximum number of variables sifted per reordering",
02883 "unsigned integer");
02884 }
02885 else {
02886 Cudd_SetSiftMaxVar((DdManager *) mgr, uvalue);
02887 }
02888 }
02889 else if (strcmp(paramName,
02890 "Maximum number of variable swaps per reordering")
02891 == 0) {
02892
02893 uvalue = strtol(paramValue, &invalidChar, 10);
02894 if (*invalidChar || uvalue < 0) {
02895 InvalidType(file, "Maximum number of variable swaps per reordering",
02896 "unsigned integer");
02897 }
02898 else {
02899 Cudd_SetSiftMaxSwap((DdManager *) mgr, uvalue);
02900 }
02901 }
02902 else if (strcmp(paramName,
02903 "Maximum growth while sifting a variable") == 0) {
02904 double value;
02905
02906 value = strtod(paramValue, &invalidChar);
02907 if (*invalidChar) {
02908 InvalidType(file, "Maximum growth while sifting a variable",
02909 "real");
02910 }
02911 else {
02912 Cudd_SetMaxGrowth((DdManager *) mgr, value);
02913 }
02914 }
02915 else if (strcmp(paramName, "Dynamic reordering of BDDs enabled")
02916 == 0) {
02917 if (strcmp(paramValue, "yes") == 0) {
02918 Cudd_AutodynEnable((DdManager *) mgr, reorderMethod);
02919 }
02920 else if (strcmp(paramValue, "no") == 0) {
02921 Cudd_AutodynDisable((DdManager *) mgr);
02922 }
02923 else {
02924 InvalidType(file, "Dynamic reordering of BDDs enabled",
02925 "(yes,no)");
02926 }
02927 }
02928 else if (strcmp(paramName, "Default BDD reordering method") == 0) {
02929 Cudd_ReorderingType reorderInt;
02930
02931 reorderMethod = (Cudd_ReorderingType) strtol(paramValue,
02932 &invalidChar, 10);
02933 if (*invalidChar || reorderMethod < 0) {
02934 InvalidType(file, "Default BDD reordering method", "integer");
02935 }
02936 else {
02937 if (Cudd_ReorderingStatus((DdManager *) mgr, &reorderInt)) {
02938 Cudd_AutodynEnable((DdManager *) mgr, reorderMethod);
02939 }
02940 }
02941 }
02942 else if (strcmp(paramName, "Dynamic reordering of ZDDs enabled")
02943 == 0) {
02944 if (strcmp(paramValue, "yes") == 0) {
02945 Cudd_AutodynEnableZdd((DdManager *) mgr, zddReorderMethod);
02946 }
02947 else if (strcmp(paramValue, "no") == 0) {
02948 Cudd_AutodynDisableZdd((DdManager *) mgr);
02949 }
02950 else {
02951 InvalidType(file, "Dynamic reordering of ZDDs enabled", "(yes,no)");
02952 }
02953 }
02954 else if (strcmp(paramName, "Default ZDD reordering method") == 0) {
02955 Cudd_ReorderingType reorderInt;
02956
02957 zddReorderMethod = (Cudd_ReorderingType) strtol(paramValue,
02958 &invalidChar, 10);
02959 if (*invalidChar || zddReorderMethod < 0) {
02960 InvalidType(file, "Default ZDD reordering method", "integer");
02961 }
02962 else {
02963 if (Cudd_ReorderingStatusZdd((DdManager *) mgr, &reorderInt)) {
02964 Cudd_AutodynEnableZdd((DdManager *) mgr, zddReorderMethod);
02965 }
02966 }
02967 }
02968 else if (strcmp(paramName, "Realignment of ZDDs to BDDs enabled")
02969 == 0) {
02970 if (strcmp(paramValue, "yes") == 0) {
02971 Cudd_zddRealignEnable((DdManager *) mgr);
02972 }
02973 else if (strcmp(paramValue, "no") == 0) {
02974 Cudd_zddRealignDisable((DdManager *) mgr);
02975 }
02976 else {
02977 InvalidType(file, "Realignment of ZDDs to BDDs enabled",
02978 "(yes,no)");
02979 }
02980 }
02981 else if (strcmp(paramName,
02982 "Dead node counted in triggering reordering") == 0) {
02983 if (strcmp(paramValue, "yes") == 0) {
02984 Cudd_TurnOnCountDead((DdManager *) mgr);
02985 }
02986 else if (strcmp(paramValue, "no") == 0) {
02987 Cudd_TurnOffCountDead((DdManager *) mgr);
02988 }
02989 else {
02990 InvalidType(file,
02991 "Dead node counted in triggering reordering",
02992 "(yes,no)");
02993 }
02994 }
02995 else if (strcmp(paramName, "Group checking criterion") == 0) {
02996
02997 uvalue = strtol(paramValue, &invalidChar, 10);
02998 if (*invalidChar || uvalue < 0) {
02999 InvalidType(file, "Group checking criterion", "integer");
03000 }
03001 else {
03002 Cudd_SetGroupcheck((DdManager *) mgr, (Cudd_AggregationType) uvalue);
03003 }
03004 }
03005 else if (strcmp(paramName, "Recombination threshold") == 0) {
03006
03007 uvalue = strtol(paramValue, &invalidChar, 10);
03008 if (*invalidChar || uvalue < 0) {
03009 InvalidType(file, "Recombination threshold", "integer");
03010 }
03011 else {
03012 Cudd_SetRecomb((DdManager *) mgr, uvalue);
03013 }
03014 }
03015 else if (strcmp(paramName, "Symmetry violation threshold") == 0) {
03016
03017 uvalue = strtol(paramValue, &invalidChar, 10);
03018 if (*invalidChar || uvalue < 0) {
03019 InvalidType(file, "Symmetry violation threshold", "integer");
03020 }
03021 else {
03022 Cudd_SetSymmviolation((DdManager *) mgr, uvalue);
03023 }
03024 }
03025 else if (strcmp(paramName, "Arc violation threshold") == 0) {
03026
03027 uvalue = strtol(paramValue, &invalidChar, 10);
03028 if (*invalidChar || uvalue < 0) {
03029 InvalidType(file, "Arc violation threshold", "integer");
03030 }
03031 else {
03032 Cudd_SetArcviolation((DdManager *) mgr, uvalue);
03033 }
03034 }
03035 else if (strcmp(paramName, "GA population size") == 0) {
03036
03037 uvalue = strtol(paramValue, &invalidChar, 10);
03038 if (*invalidChar || uvalue < 0) {
03039 InvalidType(file, "GA population size", "integer");
03040 }
03041 else {
03042 Cudd_SetPopulationSize((DdManager *) mgr, uvalue);
03043 }
03044 }
03045 else if (strcmp(paramName, "Number of crossovers for GA") == 0) {
03046
03047 uvalue = strtol(paramValue, &invalidChar, 10);
03048 if (*invalidChar || uvalue < 0) {
03049 InvalidType(file, "Number of crossovers for GA", "integer");
03050 }
03051 else {
03052 Cudd_SetNumberXovers((DdManager *) mgr, uvalue);
03053 }
03054 }
03055 else if (strcmp(paramName, "Next reordering threshold") == 0) {
03056
03057 uvalue = (unsigned int) strtol(paramValue, &invalidChar, 10);
03058 if (*invalidChar || uvalue < 0) {
03059 InvalidType(file, "Next reordering threshold", "integer");
03060 }
03061 else {
03062 Cudd_SetNextReordering((DdManager *) mgr, uvalue);
03063 }
03064 }
03065 else {
03066 (void) fprintf(file, "Warning: Parameter %s not recognized.",
03067 paramName);
03068 (void) fprintf(file, " Ignored.\n");
03069 }
03070 }
03071
03072
03073 st_free_table(newValueTable);
03074
03075 return(1);
03076
03077 }
03078
03079
03087 int
03088 bdd_size(bdd_t *f)
03089 {
03090 return(Cudd_DagSize(f->node));
03091
03092 }
03093
03094
03102 int
03103 bdd_node_size(bdd_node *f)
03104 {
03105 return(Cudd_DagSize((DdNode *) f));
03106
03107 }
03108
03109
03120 long
03121 bdd_size_multiple(array_t *bddArray)
03122 {
03123 DdNode **nodeArray;
03124 bdd_t *bddUnit;
03125 long result;
03126 int i;
03127
03128 nodeArray = ALLOC(DdNode *, array_n(bddArray));
03129 if (nodeArray == NULL) return(CUDD_OUT_OF_MEM);
03130 for (i = 0; i < array_n(bddArray); i++) {
03131 bddUnit = array_fetch(bdd_t *, bddArray, i);
03132 nodeArray[i] = bddUnit->node;
03133 }
03134
03135 result = Cudd_SharingSize(nodeArray,array_n(bddArray));
03136
03137
03138 FREE(nodeArray);
03139
03140 return(result);
03141
03142 }
03143
03144
03152 bdd_variableId
03153 bdd_top_var_id(bdd_t *f)
03154 {
03155 return(Cudd_Regular(f->node)->index);
03156
03157 }
03158
03159
03167 bdd_external_hooks *
03168 bdd_get_external_hooks(bdd_manager *mgr)
03169 {
03170 return((bdd_external_hooks *)(((DdManager *)mgr)->hooks));
03171
03172 }
03173
03174
03182 int
03183 bdd_add_hook(
03184 bdd_manager *mgr,
03185 int (*procedure)(bdd_manager *, char *, void *),
03186 bdd_hook_type_t whichHook)
03187 {
03188 int retval;
03189 Cudd_HookType hook;
03190 switch (whichHook) {
03191 case BDD_PRE_GC_HOOK: hook = CUDD_PRE_GC_HOOK; break;
03192 case BDD_POST_GC_HOOK: hook = CUDD_POST_GC_HOOK; break;
03193 case BDD_PRE_REORDERING_HOOK: hook = CUDD_PRE_REORDERING_HOOK; break;
03194 case BDD_POST_REORDERING_HOOK: hook = CUDD_POST_REORDERING_HOOK; break;
03195 default: fprintf(stderr, "Dont know which hook"); return 0;
03196 }
03197
03198 retval = Cudd_AddHook((DdManager *)mgr, (DD_HFP)procedure, hook);
03199 return retval;
03200
03201 }
03202
03203
03211 int
03212 bdd_remove_hook(
03213 bdd_manager *mgr,
03214 int (*procedure)(bdd_manager *, char *, void *),
03215 bdd_hook_type_t whichHook)
03216 {
03217 int retval;
03218 Cudd_HookType hook;
03219 switch (whichHook) {
03220 case BDD_PRE_GC_HOOK: hook = CUDD_PRE_GC_HOOK; break;
03221 case BDD_POST_GC_HOOK: hook = CUDD_POST_GC_HOOK; break;
03222 case BDD_PRE_REORDERING_HOOK: hook = CUDD_PRE_REORDERING_HOOK; break;
03223 case BDD_POST_REORDERING_HOOK: hook = CUDD_POST_REORDERING_HOOK; break;
03224 default: fprintf(stderr, "Dont know which hook"); return 0;
03225 }
03226 retval = Cudd_RemoveHook((DdManager *)mgr, (DD_HFP)procedure, hook);
03227 return retval;
03228
03229 }
03230
03231
03239 int
03240 bdd_enable_reordering_reporting(bdd_manager *mgr)
03241 {
03242 int retval;
03243 retval = Cudd_EnableReorderingReporting((DdManager *) mgr);
03244 return retval;
03245
03246 }
03247
03248
03256 int
03257 bdd_disable_reordering_reporting(bdd_manager *mgr)
03258 {
03259 int retval;
03260 retval = Cudd_DisableReorderingReporting((DdManager *) mgr);
03261 return retval;
03262
03263 }
03264
03265
03273 bdd_reorder_verbosity_t
03274 bdd_reordering_reporting(bdd_manager *mgr)
03275 {
03276 int retval;
03277 bdd_reorder_verbosity_t reorderVerbosity;
03278 retval = Cudd_ReorderingReporting((DdManager *) mgr);
03279 switch(retval) {
03280 case 0: reorderVerbosity = BDD_REORDER_NO_VERBOSITY; break;
03281 case 1: reorderVerbosity = BDD_REORDER_VERBOSITY; break;
03282 default: reorderVerbosity = BDD_REORDER_VERBOSITY_DEFAULT; break;
03283 }
03284 return reorderVerbosity;
03285
03286 }
03287
03288
03296 void
03297 bdd_set_gc_mode(bdd_manager *mgr, boolean no_gc)
03298 {
03299 if (no_gc) {
03300 Cudd_DisableGarbageCollection((DdManager *) mgr);
03301 } else {
03302 Cudd_EnableGarbageCollection((DdManager *) mgr);
03303 }
03304 return;
03305
03306 }
03307
03308
03316 void
03317 bdd_dynamic_reordering(
03318 bdd_manager *mgr_,
03319 bdd_reorder_type_t algorithm_type,
03320 bdd_reorder_verbosity_t verbosity)
03321 {
03322 DdManager *mgr;
03323
03324 mgr = (DdManager *)mgr_;
03325
03326 switch (algorithm_type) {
03327 case BDD_REORDER_SIFT:
03328 Cudd_AutodynEnable(mgr, CUDD_REORDER_SIFT);
03329 break;
03330 case BDD_REORDER_WINDOW:
03331 case BDD_REORDER_WINDOW3_CONV:
03332 Cudd_AutodynEnable(mgr, CUDD_REORDER_WINDOW3_CONV);
03333 break;
03334 case BDD_REORDER_NONE:
03335 Cudd_AutodynDisable(mgr);
03336 break;
03337 case BDD_REORDER_SAME:
03338 Cudd_AutodynEnable(mgr, CUDD_REORDER_SAME);
03339 break;
03340 case BDD_REORDER_RANDOM:
03341 Cudd_AutodynEnable(mgr, CUDD_REORDER_RANDOM);
03342 break;
03343 case BDD_REORDER_RANDOM_PIVOT:
03344 Cudd_AutodynEnable(mgr, CUDD_REORDER_RANDOM_PIVOT);
03345 break;
03346 case BDD_REORDER_SIFT_CONVERGE:
03347 Cudd_AutodynEnable(mgr,CUDD_REORDER_SIFT_CONVERGE);
03348 break;
03349 case BDD_REORDER_SYMM_SIFT:
03350 Cudd_AutodynEnable(mgr, CUDD_REORDER_SYMM_SIFT);
03351 break;
03352 case BDD_REORDER_SYMM_SIFT_CONV:
03353 Cudd_AutodynEnable(mgr, CUDD_REORDER_SYMM_SIFT_CONV);
03354 break;
03355 case BDD_REORDER_WINDOW2:
03356 Cudd_AutodynEnable(mgr, CUDD_REORDER_WINDOW2);
03357 break;
03358 case BDD_REORDER_WINDOW4:
03359 Cudd_AutodynEnable(mgr, CUDD_REORDER_WINDOW4);
03360 break;
03361 case BDD_REORDER_WINDOW2_CONV:
03362 Cudd_AutodynEnable(mgr, CUDD_REORDER_WINDOW2_CONV);
03363 break;
03364 case BDD_REORDER_WINDOW3:
03365 Cudd_AutodynEnable(mgr, CUDD_REORDER_WINDOW3);
03366 break;
03367 case BDD_REORDER_WINDOW4_CONV:
03368 Cudd_AutodynEnable(mgr, CUDD_REORDER_WINDOW4_CONV);
03369 break;
03370 case BDD_REORDER_GROUP_SIFT:
03371 Cudd_AutodynEnable(mgr, CUDD_REORDER_GROUP_SIFT);
03372 break;
03373 case BDD_REORDER_GROUP_SIFT_CONV:
03374 Cudd_AutodynEnable(mgr, CUDD_REORDER_GROUP_SIFT_CONV);
03375 break;
03376 case BDD_REORDER_ANNEALING:
03377 Cudd_AutodynEnable(mgr, CUDD_REORDER_ANNEALING);
03378 break;
03379 case BDD_REORDER_GENETIC:
03380 Cudd_AutodynEnable(mgr, CUDD_REORDER_GENETIC);
03381 break;
03382 case BDD_REORDER_EXACT:
03383 Cudd_AutodynEnable(mgr, CUDD_REORDER_EXACT);
03384 break;
03385 case BDD_REORDER_LAZY_SIFT:
03386 Cudd_AutodynEnable(mgr, CUDD_REORDER_LAZY_SIFT);
03387 break;
03388 default:
03389 fprintf(stderr,"CU DD Package: Reordering algorithm not considered\n");
03390 }
03391
03392 if (verbosity == BDD_REORDER_NO_VERBOSITY) {
03393 (void) bdd_disable_reordering_reporting((DdManager *)mgr);
03394 } else if (verbosity == BDD_REORDER_VERBOSITY) {
03395 (void) bdd_enable_reordering_reporting((DdManager *)mgr);
03396 }
03397
03398 }
03399
03400
03408 void
03409 bdd_dynamic_reordering_zdd(
03410 bdd_manager *mgr_,
03411 bdd_reorder_type_t algorithm_type,
03412 bdd_reorder_verbosity_t verbosity)
03413 {
03414 DdManager *mgr;
03415
03416 mgr = (DdManager *)mgr_;
03417
03418 switch (algorithm_type) {
03419 case BDD_REORDER_SIFT:
03420 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_SIFT);
03421 break;
03422 case BDD_REORDER_WINDOW:
03423 case BDD_REORDER_WINDOW3_CONV:
03424 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_WINDOW3_CONV);
03425 break;
03426 case BDD_REORDER_NONE:
03427 Cudd_AutodynDisable(mgr);
03428 break;
03429 case BDD_REORDER_SAME:
03430 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_SAME);
03431 break;
03432 case BDD_REORDER_RANDOM:
03433 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_RANDOM);
03434 break;
03435 case BDD_REORDER_RANDOM_PIVOT:
03436 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_RANDOM_PIVOT);
03437 break;
03438 case BDD_REORDER_SIFT_CONVERGE:
03439 Cudd_AutodynEnableZdd(mgr,CUDD_REORDER_SIFT_CONVERGE);
03440 break;
03441 case BDD_REORDER_SYMM_SIFT:
03442 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_SYMM_SIFT);
03443 break;
03444 case BDD_REORDER_SYMM_SIFT_CONV:
03445 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_SYMM_SIFT_CONV);
03446 break;
03447 case BDD_REORDER_WINDOW2:
03448 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_WINDOW2);
03449 break;
03450 case BDD_REORDER_WINDOW4:
03451 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_WINDOW4);
03452 break;
03453 case BDD_REORDER_WINDOW2_CONV:
03454 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_WINDOW2_CONV);
03455 break;
03456 case BDD_REORDER_WINDOW3:
03457 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_WINDOW3);
03458 break;
03459 case BDD_REORDER_WINDOW4_CONV:
03460 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_WINDOW4_CONV);
03461 break;
03462 case BDD_REORDER_GROUP_SIFT:
03463 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_GROUP_SIFT);
03464 break;
03465 case BDD_REORDER_GROUP_SIFT_CONV:
03466 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_GROUP_SIFT_CONV);
03467 break;
03468 case BDD_REORDER_ANNEALING:
03469 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_ANNEALING);
03470 break;
03471 case BDD_REORDER_GENETIC:
03472 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_GENETIC);
03473 break;
03474 case BDD_REORDER_EXACT:
03475 Cudd_AutodynEnableZdd(mgr, CUDD_REORDER_EXACT);
03476 break;
03477 default:
03478 fprintf(stderr,"CU DD Package: Reordering algorithm not considered\n");
03479 }
03480 if (verbosity == BDD_REORDER_NO_VERBOSITY) {
03481 (void) bdd_disable_reordering_reporting((DdManager *)mgr);
03482 } else if (verbosity == BDD_REORDER_VERBOSITY) {
03483 (void) bdd_enable_reordering_reporting((DdManager *)mgr);
03484 }
03485
03486 }
03487
03488
03496 void
03497 bdd_reorder(bdd_manager *mgr)
03498 {
03499
03500 (void) Cudd_ReduceHeap((DdManager *)mgr,((DdManager *)mgr)->autoMethod,10);
03501 return;
03502
03503 }
03504
03505
03513 bdd_variableId
03514 bdd_get_id_from_level(bdd_manager *mgr, long level)
03515 {
03516 int result;
03517 result = Cudd_ReadInvPerm((DdManager *) mgr, (int)level);
03518 return(result);
03519
03520 }
03521
03522
03530 long
03531 bdd_top_var_level(bdd_manager *mgr, bdd_t *fn)
03532 {
03533 return((long) cuddI((DdManager *)mgr,Cudd_Regular(fn->node)->index));
03534
03535 }
03536
03537
03546 boolean
03547 bdd_is_cube(bdd_t *f)
03548 {
03549 struct DdManager *manager;
03550
03551 if (f == NULL) {
03552 fail("bdd_is_cube: invalid BDD");
03553 }
03554 if (f->free) fail ("Freed BDD passed to bdd_is_cube");
03555 manager = f->mgr;
03556 return((boolean)cuddCheckCube(manager,f->node));
03557
03558 }
03559
03560
03576 bdd_block *
03577 bdd_new_var_block(bdd_t *f, long n)
03578 {
03579 DdManager *manager;
03580 DdNode *node;
03581 MtrNode *group;
03582 int index;
03583
03584 manager = (DdManager *) f->mgr;
03585 node = Cudd_Regular(f->node);
03586 index = node->index;
03587 if (index == CUDD_MAXINDEX)
03588 return(NULL);
03589 group = Cudd_MakeTreeNode(manager, index, n, MTR_DEFAULT);
03590
03591 return((bdd_block *) group);
03592
03593 }
03594
03595
03603 bdd_t *
03604 bdd_var_with_index(bdd_manager *manager, int index)
03605 {
03606 DdNode *var;
03607
03608 var = Cudd_bddIthVar((DdManager *) manager, index);
03609 cuddRef(var);
03610 return(bdd_construct_bdd_t(manager, var));
03611
03612 }
03613
03614
03623 int
03624 bdd_var_is_dependent(bdd_t *f, bdd_t *var)
03625 {
03626 return (Cudd_bddVarIsDependent((DdManager *)f->mgr, (DdNode *)f->node,
03627 (DdNode *)var->node));
03628
03629 }
03630
03631
03639 int
03640 bdd_reordering_status(bdd_manager *mgr, bdd_reorder_type_t *method)
03641 {
03642 int dyn;
03643
03644 dyn = Cudd_ReorderingStatus((DdManager *)mgr, (Cudd_ReorderingType *)method);
03645 switch (*method) {
03646 case CUDD_REORDER_SIFT:
03647 *method = BDD_REORDER_SIFT;
03648 break;
03649 case CUDD_REORDER_WINDOW3_CONV:
03650 *method = BDD_REORDER_WINDOW3_CONV;
03651 break;
03652 case CUDD_REORDER_NONE:
03653 *method = BDD_REORDER_NONE;
03654 break;
03655 case CUDD_REORDER_SAME:
03656 *method = BDD_REORDER_SAME;
03657 break;
03658 case CUDD_REORDER_RANDOM:
03659 *method = BDD_REORDER_RANDOM;
03660 break;
03661 case CUDD_REORDER_RANDOM_PIVOT:
03662 *method = BDD_REORDER_RANDOM_PIVOT;
03663 break;
03664 case CUDD_REORDER_SIFT_CONVERGE:
03665 *method = BDD_REORDER_SIFT_CONVERGE;
03666 break;
03667 case CUDD_REORDER_SYMM_SIFT:
03668 *method = BDD_REORDER_SYMM_SIFT;
03669 break;
03670 case CUDD_REORDER_SYMM_SIFT_CONV:
03671 *method = BDD_REORDER_SYMM_SIFT_CONV;
03672 break;
03673 case CUDD_REORDER_WINDOW2:
03674 *method = BDD_REORDER_WINDOW2;
03675 break;
03676 case CUDD_REORDER_WINDOW4:
03677 *method = BDD_REORDER_WINDOW4;
03678 break;
03679 case CUDD_REORDER_WINDOW2_CONV:
03680 *method = BDD_REORDER_WINDOW2_CONV;
03681 break;
03682 case CUDD_REORDER_WINDOW3:
03683 *method = BDD_REORDER_WINDOW3;
03684 break;
03685 case CUDD_REORDER_WINDOW4_CONV:
03686 *method = BDD_REORDER_WINDOW4_CONV;
03687 break;
03688 case CUDD_REORDER_GROUP_SIFT:
03689 *method = BDD_REORDER_GROUP_SIFT;
03690 break;
03691 case CUDD_REORDER_GROUP_SIFT_CONV:
03692 *method = BDD_REORDER_GROUP_SIFT_CONV;
03693 break;
03694 case CUDD_REORDER_ANNEALING:
03695 *method = BDD_REORDER_ANNEALING;
03696 break;
03697 case CUDD_REORDER_GENETIC:
03698 *method = BDD_REORDER_GENETIC;
03699 break;
03700 case CUDD_REORDER_EXACT:
03701 *method = BDD_REORDER_EXACT;
03702 break;
03703 default:
03704 break;
03705 }
03706 return(dyn);
03707
03708 }
03709
03710
03718 int
03719 bdd_reordering_zdd_status(bdd_manager *mgr, bdd_reorder_type_t *method)
03720 {
03721 int dyn;
03722 dyn = Cudd_ReorderingStatusZdd((DdManager *)mgr, (Cudd_ReorderingType *)method);
03723 switch (*method) {
03724 case CUDD_REORDER_SIFT:
03725 *method = BDD_REORDER_SIFT;
03726 break;
03727 case CUDD_REORDER_WINDOW3_CONV:
03728 *method = BDD_REORDER_WINDOW3_CONV;
03729 break;
03730 case CUDD_REORDER_NONE:
03731 *method = BDD_REORDER_NONE;
03732 break;
03733 case CUDD_REORDER_SAME:
03734 *method = BDD_REORDER_SAME;
03735 break;
03736 case CUDD_REORDER_RANDOM:
03737 *method = BDD_REORDER_RANDOM;
03738 break;
03739 case CUDD_REORDER_RANDOM_PIVOT:
03740 *method = BDD_REORDER_RANDOM_PIVOT;
03741 break;
03742 case CUDD_REORDER_SIFT_CONVERGE:
03743 *method = BDD_REORDER_SIFT_CONVERGE;
03744 break;
03745 case CUDD_REORDER_SYMM_SIFT:
03746 *method = BDD_REORDER_SYMM_SIFT;
03747 break;
03748 case CUDD_REORDER_SYMM_SIFT_CONV:
03749 *method = BDD_REORDER_SYMM_SIFT_CONV;
03750 break;
03751 case CUDD_REORDER_WINDOW2:
03752 *method = BDD_REORDER_WINDOW2;
03753 break;
03754 case CUDD_REORDER_WINDOW4:
03755 *method = BDD_REORDER_WINDOW4;
03756 break;
03757 case CUDD_REORDER_WINDOW2_CONV:
03758 *method = BDD_REORDER_WINDOW2_CONV;
03759 break;
03760 case CUDD_REORDER_WINDOW3:
03761 *method = BDD_REORDER_WINDOW3;
03762 break;
03763 case CUDD_REORDER_WINDOW4_CONV:
03764 *method = BDD_REORDER_WINDOW4_CONV;
03765 break;
03766 case CUDD_REORDER_GROUP_SIFT:
03767 *method = BDD_REORDER_GROUP_SIFT;
03768 break;
03769 case CUDD_REORDER_GROUP_SIFT_CONV:
03770 *method = BDD_REORDER_GROUP_SIFT_CONV;
03771 break;
03772 case CUDD_REORDER_ANNEALING:
03773 *method = BDD_REORDER_ANNEALING;
03774 break;
03775 case CUDD_REORDER_GENETIC:
03776 *method = BDD_REORDER_GENETIC;
03777 break;
03778 case CUDD_REORDER_EXACT:
03779 *method = BDD_REORDER_EXACT;
03780 break;
03781 default:
03782 break;
03783 }
03784 return(dyn);
03785
03786 }
03787
03788
03796 bdd_node *
03797 bdd_bdd_to_add(bdd_manager *mgr, bdd_node *fn)
03798 {
03799 DdNode *result;
03800 result = Cudd_BddToAdd((DdManager *)mgr,(DdNode *)fn);
03801 return((bdd_node *)result);
03802
03803 }
03804
03805
03813 bdd_node *
03814 bdd_add_permute(
03815 bdd_manager *mgr,
03816 bdd_node *fn,
03817 int *permut)
03818 {
03819 DdNode *result;
03820 result = Cudd_addPermute((DdManager *)mgr, (DdNode *)fn, permut);
03821 return(result);
03822
03823 }
03824
03825
03833 bdd_node *
03834 bdd_bdd_permute(
03835 bdd_manager *mgr,
03836 bdd_node *fn,
03837 int *permut)
03838 {
03839 DdNode *result;
03840 result = Cudd_bddPermute((DdManager *)mgr, (DdNode *)fn, permut);
03841 return(result);
03842
03843 }
03844
03845
03853 void
03854 bdd_ref(bdd_node *fn)
03855 {
03856 Cudd_Ref((DdNode *)fn);
03857 return;
03858
03859 }
03860
03861
03871 void
03872 bdd_recursive_deref(bdd_manager *mgr, bdd_node *f)
03873 {
03874 Cudd_RecursiveDeref((DdManager *)mgr, (DdNode *)f);
03875
03876 }
03877
03878
03886 bdd_node *
03887 bdd_add_exist_abstract(
03888 bdd_manager *mgr,
03889 bdd_node *fn,
03890 bdd_node *vars)
03891 {
03892 DdNode *result;
03893 result = Cudd_addExistAbstract((DdManager *)mgr, (DdNode *)fn,
03894 (DdNode *)vars);
03895 return(result);
03896
03897 }
03898
03899
03907 bdd_node *
03908 bdd_add_apply(
03909 bdd_manager *mgr,
03910 bdd_node *(*operation)(bdd_manager *, bdd_node **, bdd_node **),
03911 bdd_node *fn1,
03912 bdd_node *fn2)
03913 {
03914 DdNode *result;
03915 result = Cudd_addApply((DdManager *)mgr,
03916 (DdNode *(*)(DdManager *, DdNode **, DdNode **))
03917 operation, (DdNode *)fn1, (DdNode *)fn2);
03918 return(result);
03919
03920 }
03921
03922
03930 bdd_node *
03931 bdd_add_nonsim_compose(
03932 bdd_manager *mgr,
03933 bdd_node *fn,
03934 bdd_node **vector)
03935 {
03936 DdNode *result;
03937 result = Cudd_addNonSimCompose((DdManager *)mgr, (DdNode *)fn,
03938 (DdNode **)vector);
03939 return(result);
03940
03941 }
03942
03943
03951 bdd_node *
03952 bdd_add_residue(
03953 bdd_manager *mgr,
03954 int n,
03955 int m,
03956 int options,
03957 int top)
03958 {
03959 DdNode *result;
03960 result = Cudd_addResidue((DdManager *)mgr, n, m, options, top);
03961 return(result);
03962
03963 }
03964
03965
03973 bdd_node *
03974 bdd_add_vector_compose(
03975 bdd_manager *mgr,
03976 bdd_node *fn,
03977 bdd_node **vector)
03978 {
03979 DdNode *result;
03980 result = Cudd_addVectorCompose((DdManager *)mgr, (DdNode *)fn,
03981 (DdNode **)vector);
03982 return(result);
03983
03984 }
03985
03986
03994 bdd_node *
03995 bdd_add_times(
03996 bdd_manager *mgr,
03997 bdd_node **fn1,
03998 bdd_node **fn2)
03999 {
04000 DdNode *result;
04001 result = Cudd_addTimes((DdManager *)mgr, (DdNode **)fn1, (DdNode **)fn2);
04002 return(result);
04003
04004 }
04005
04006
04014 int
04015 bdd_check_zero_ref(bdd_manager *mgr)
04016 {
04017 int result;
04018 result = Cudd_CheckZeroRef((DdManager *)mgr);
04019 return(result);
04020
04021 }
04022
04023
04031 void
04032 bdd_dynamic_reordering_disable(bdd_manager *mgr)
04033 {
04034 Cudd_AutodynDisable((DdManager *)mgr);
04035 return;
04036
04037 }
04038
04039
04047 void
04048 bdd_dynamic_reordering_zdd_disable(bdd_manager *mgr)
04049 {
04050 Cudd_AutodynDisableZdd((DdManager *)mgr);
04051 return;
04052
04053 }
04054
04055
04063 bdd_node *
04064 bdd_add_xnor(bdd_manager *mgr, bdd_node **fn1, bdd_node **fn2)
04065 {
04066 DdNode *result;
04067 result = Cudd_addXnor((DdManager *)mgr, (DdNode **)fn1, (DdNode **)fn2);
04068 return(result);
04069
04070 }
04071
04072
04080 int
04081 bdd_shuffle_heap(bdd_manager *mgr, int *permut)
04082 {
04083 int result;
04084 result = Cudd_ShuffleHeap((DdManager *)mgr, permut);
04085 return(result);
04086
04087 }
04088
04089
04097 bdd_node *
04098 bdd_add_compose(
04099 bdd_manager *mgr,
04100 bdd_node *fn1,
04101 bdd_node *fn2,
04102 int var)
04103 {
04104 DdNode *result;
04105 result = Cudd_addCompose((DdManager *)mgr, (DdNode *)fn1,
04106 (DdNode *)fn2, var);
04107 return(result);
04108
04109 }
04110
04111
04119 bdd_node *
04120 bdd_add_ith_var(bdd_manager *mgr, int i)
04121 {
04122 DdNode *result;
04123 result = Cudd_addIthVar((DdManager *)mgr, i);
04124 return(result);
04125
04126 }
04127
04128
04136 int
04137 bdd_get_level_from_id(bdd_manager *mgr, int id)
04138 {
04139 int level;
04140 level = Cudd_ReadPerm((DdManager *)mgr, id);
04141 return(level);
04142
04143 }
04144
04145
04154 bdd_node *
04155 bdd_bdd_exist_abstract(bdd_manager *mgr, bdd_node *fn, bdd_node *cube)
04156 {
04157 DdNode *result;
04158 result = Cudd_bddExistAbstract((DdManager *)mgr, (DdNode *)fn,
04159 (DdNode *)cube);
04160 return(result);
04161
04162 }
04163
04164
04173 int
04174 bdd_equal_sup_norm(
04175 bdd_manager *mgr,
04176 bdd_node *fn,
04177 bdd_node *gn,
04178 BDD_VALUE_TYPE tolerance,
04179 int pr)
04180 {
04181 int result;
04182 result = Cudd_EqualSupNorm((DdManager *)mgr, (DdNode *)fn,
04183 (DdNode *)gn, (CUDD_VALUE_TYPE)tolerance, pr);
04184 return(result);
04185
04186 }
04187
04188
04197 bdd_node *
04198 bdd_read_logic_zero(bdd_manager *mgr)
04199 {
04200 DdNode *result;
04201 result = Cudd_ReadLogicZero((DdManager *)mgr);
04202
04203 return(result);
04204
04205 }
04206
04207
04216 bdd_node *
04217 bdd_bdd_ith_var(bdd_manager *mgr, int i)
04218 {
04219 DdNode *result;
04220 result = Cudd_bddIthVar((DdManager *)mgr, i);
04221
04222 return(result);
04223
04224 }
04225
04226
04234 bdd_node *
04235 bdd_add_divide(bdd_manager *mgr, bdd_node **fn1, bdd_node **fn2)
04236 {
04237 DdNode *result;
04238 result = Cudd_addDivide((DdManager *)mgr, (DdNode **)fn1, (DdNode **)fn2);
04239
04240 return(result);
04241
04242 }
04243
04244
04252 bdd_node *
04253 bdd_bdd_constrain(bdd_manager *mgr, bdd_node *f, bdd_node *c)
04254 {
04255 DdNode *result;
04256 result = Cudd_bddConstrain((DdManager *)mgr, (DdNode *)f, (DdNode *)c);
04257
04258 return(result);
04259
04260 }
04261
04262
04270 bdd_node *
04271 bdd_bdd_restrict(bdd_manager *mgr, bdd_node *f, bdd_node *c)
04272 {
04273 DdNode *result;
04274 result = Cudd_bddRestrict((DdManager *)mgr, (DdNode *)f, (DdNode *)c);
04275
04276 return(result);
04277
04278 }
04279
04280
04288 bdd_node *
04289 bdd_add_hamming(
04290 bdd_manager *mgr,
04291 bdd_node **xVars,
04292 bdd_node **yVars,
04293 int nVars)
04294 {
04295 DdNode *result;
04296 result = Cudd_addHamming((DdManager *)mgr, (DdNode **)xVars,
04297 (DdNode **)yVars, nVars);
04298
04299 return(result);
04300
04301 }
04302
04303
04311 bdd_node *
04312 bdd_add_ite(
04313 bdd_manager *mgr,
04314 bdd_node *f,
04315 bdd_node *g,
04316 bdd_node *h)
04317 {
04318 DdNode *result;
04319 result = Cudd_addIte((DdManager *)mgr, (DdNode *)f, (DdNode *)g,
04320 (DdNode *)h);
04321
04322 return(result);
04323
04324 }
04325
04326
04335 bdd_node *
04336 bdd_add_find_max(bdd_manager *mgr, bdd_node *f)
04337 {
04338 DdNode *result;
04339 result = Cudd_addFindMax((DdManager *)mgr, (DdNode *)f);
04340
04341 return(result);
04342
04343 }
04344
04345
04355 int
04356 bdd_bdd_pick_one_cube(bdd_manager *mgr, bdd_node *node, char *string)
04357 {
04358 return(Cudd_bddPickOneCube((DdManager *)mgr, (DdNode *)node, string));
04359
04360 }
04361
04362
04370 bdd_node *
04371 bdd_add_swap_variables(
04372 bdd_manager *mgr,
04373 bdd_node *f,
04374 bdd_node **x,
04375 bdd_node **y,
04376 int n)
04377 {
04378 DdNode *result;
04379 result = Cudd_addSwapVariables((DdManager *)mgr, (DdNode *)f,
04380 (DdNode **)x, (DdNode **)y, n);
04381
04382 return(result);
04383
04384 }
04385
04386
04394 bdd_node *
04395 bdd_bdd_or(bdd_manager *mgr, bdd_node *f, bdd_node *g)
04396 {
04397 DdNode *result;
04398 result = Cudd_bddOr((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
04399
04400 return(result);
04401
04402 }
04403
04404
04417 bdd_node *
04418 bdd_bdd_compute_cube(
04419 bdd_manager *mgr,
04420 bdd_node **vars,
04421 int *phase,
04422 int n)
04423 {
04424 DdNode *result;
04425 result = Cudd_bddComputeCube((DdManager *)mgr, (DdNode **)vars,
04426 phase, n);
04427
04428 return(result);
04429
04430 }
04431
04432
04445 bdd_node *
04446 bdd_indices_to_cube(bdd_manager *mgr, int *idArray, int n)
04447 {
04448 DdNode *result;
04449 result = Cudd_IndicesToCube((DdManager *)mgr, idArray, n);
04450
04451 return(result);
04452
04453 }
04454
04455
04463 bdd_node *
04464 bdd_bdd_and(bdd_manager *mgr, bdd_node *f, bdd_node *g)
04465 {
04466 DdNode *result;
04467 result = Cudd_bddAnd((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
04468
04469 return(result);
04470
04471 }
04472
04473
04484 bdd_node *
04485 bdd_add_matrix_multiply(
04486 bdd_manager *mgr,
04487 bdd_node *A,
04488 bdd_node *B,
04489 bdd_node **z,
04490 int nz)
04491 {
04492 DdNode *result;
04493 result = Cudd_addMatrixMultiply((DdManager *)mgr, (DdNode *)A,
04494 (DdNode *)B, (DdNode **)z, nz);
04495
04496 return(result);
04497
04498 }
04499
04500
04512 bdd_node *
04513 bdd_add_compute_cube(
04514 bdd_manager *mgr,
04515 bdd_node **vars,
04516 int *phase,
04517 int n)
04518 {
04519 DdNode *result;
04520 result = Cudd_addComputeCube((DdManager *)mgr, (DdNode **)vars, phase, n);
04521
04522 return(result);
04523
04524 }
04525
04526
04536 bdd_node *
04537 bdd_add_const(bdd_manager *mgr, BDD_VALUE_TYPE c)
04538 {
04539 DdNode *result;
04540 result = Cudd_addConst((DdManager *)mgr, (CUDD_VALUE_TYPE)c);
04541
04542 return(result);
04543
04544 }
04545
04546
04555 bdd_node *
04556 bdd_bdd_swap_variables(
04557 bdd_manager *mgr,
04558 bdd_node *f,
04559 bdd_node **x,
04560 bdd_node **y,
04561 int n)
04562 {
04563 DdNode *result;
04564 result = Cudd_bddSwapVariables((DdManager *)mgr, (DdNode *)f,
04565 (DdNode **)x, (DdNode **)y, n);
04566
04567 return(result);
04568
04569 }
04570
04571
04580 double
04581 bdd_count_minterm(bdd_manager *mgr, bdd_node *f, int n)
04582 {
04583 double result;
04584 result = Cudd_CountMinterm((DdManager *)mgr, (DdNode *)f, n);
04585
04586 return(result);
04587
04588 }
04589
04590
04601 bdd_node *
04602 bdd_add_bdd_threshold(
04603 bdd_manager *mgr,
04604 bdd_node *f,
04605 BDD_VALUE_TYPE value)
04606 {
04607 DdNode *result;
04608 result = Cudd_addBddThreshold((DdManager *) mgr, (DdNode *) f,
04609 (CUDD_VALUE_TYPE)value);
04610
04611 return(result);
04612
04613 }
04614
04615
04625 bdd_node *
04626 bdd_add_bdd_strict_threshold(
04627 bdd_manager *mgr,
04628 bdd_node *f,
04629 BDD_VALUE_TYPE value)
04630 {
04631 DdNode *result;
04632 result = Cudd_addBddStrictThreshold((DdManager *) mgr, (DdNode *) f,
04633 (CUDD_VALUE_TYPE)value);
04634
04635 return(result);
04636
04637 }
04638
04639
04647 BDD_VALUE_TYPE
04648 bdd_read_epsilon(bdd_manager *mgr)
04649 {
04650 return((DdManager *)mgr)->epsilon;
04651
04652 }
04653
04654
04662 bdd_node *
04663 bdd_read_one(bdd_manager *mgr)
04664 {
04665 return(DD_ONE((DdManager *)mgr));
04666
04667 }
04668
04669
04677 bdd_node *
04678 bdd_bdd_pick_one_minterm(
04679 bdd_manager *mgr,
04680 bdd_node *f,
04681 bdd_node **vars,
04682 int n)
04683 {
04684 DdNode *result;
04685 result = Cudd_bddPickOneMinterm((DdManager *)mgr, (DdNode *)f,
04686 (DdNode **)vars, n);
04687
04688 return(result);
04689
04690 }
04691
04692
04700 bdd_t *
04701 bdd_pick_one_minterm(bdd_t *f, array_t *varsArray )
04702 {
04703 DdNode **vars, *minterm;
04704 int i, n;
04705
04706 n = array_n(varsArray);
04707 vars = ALLOC(DdNode *, n);
04708 if (vars == NIL(DdNode *)) return NIL(bdd_t);
04709 for (i = 0; i < n; i++) {
04710 bdd_t *var = array_fetch(bdd_t *, varsArray, i);
04711 assert(f->mgr == var->mgr);
04712 vars[i] = var->node;
04713 }
04714 minterm = Cudd_bddPickOneMinterm(f->mgr, f->node, vars, n);
04715 cuddRef(minterm);
04716 FREE(vars);
04717 if (minterm == NIL(DdNode)) return NIL(bdd_t);
04718 return bdd_construct_bdd_t(f->mgr,minterm);
04719
04720 }
04721
04722
04731 array_t *
04732 bdd_bdd_pick_arbitrary_minterms(
04733 bdd_t *f,
04734 array_t *varsArray,
04735 int n,
04736 int k)
04737 {
04738 int i;
04739 DdNode **minterms, **vars;
04740 bdd_t *var;
04741 array_t *resultArray;
04742
04743 vars = ALLOC(DdNode *, n);
04744 if (vars == NULL)
04745 return((array_t *)NULL);
04746 for (i = 0; i < n; i++) {
04747 var = array_fetch(bdd_t *, varsArray, i);
04748 vars[i] = var->node;
04749 }
04750
04751 minterms = (DdNode **)Cudd_bddPickArbitraryMinterms((DdManager *)f->mgr,
04752 (DdNode *)f->node, (DdNode **)vars, n, k);
04753
04754 resultArray = array_alloc(bdd_t *, k);
04755 for (i = 0; i < k; i++) {
04756 cuddRef(minterms[i]);
04757 array_insert(bdd_t *, resultArray, i,
04758 bdd_construct_bdd_t(f->mgr,minterms[i]));
04759 }
04760
04761 FREE(vars);
04762 FREE(minterms);
04763 return(resultArray);
04764
04765 }
04766
04767
04790 bdd_t *
04791 bdd_subset_with_mask_vars(bdd_t *f, array_t *varsArray, array_t *maskVarsArray)
04792 {
04793 int i;
04794 DdNode *subset, **vars, **maskVars;
04795 bdd_t *var;
04796 int n = array_n(varsArray);
04797 int m = array_n(maskVarsArray);
04798
04799 vars = ALLOC(DdNode *, n);
04800 if (vars == NULL)
04801 return((bdd_t *)NULL);
04802 for (i = 0; i < n; i++) {
04803 var = array_fetch(bdd_t *, varsArray, i);
04804 vars[i] = var->node;
04805 }
04806
04807 maskVars = ALLOC(DdNode *, m);
04808 if (maskVars == NULL) {
04809 FREE(vars);
04810 return((bdd_t *)NULL);
04811 }
04812 for (i = 0; i < m; i++) {
04813 var = array_fetch(bdd_t *, maskVarsArray, i);
04814 maskVars[i] = var->node;
04815 }
04816
04817 subset = (DdNode *)Cudd_SubsetWithMaskVars((DdManager *)f->mgr,
04818 (DdNode *)f->node, (DdNode **)vars, n, (DdNode **)maskVars, m);
04819 if (subset == NULL) return((bdd_t *)NULL);
04820
04821 cuddRef(subset);
04822 FREE(vars);
04823 FREE(maskVars);
04824
04825 return(bdd_construct_bdd_t(f->mgr,subset));
04826
04827 }
04828
04829
04838 bdd_node *
04839 bdd_read_zero(bdd_manager *mgr)
04840 {
04841 return(DD_ZERO((DdManager *)mgr));
04842
04843 }
04844
04845
04853 bdd_node *
04854 bdd_bdd_new_var(bdd_manager *mgr)
04855 {
04856 DdNode *result;
04857 result = Cudd_bddNewVar((DdManager *)mgr);
04858
04859 return(result);
04860
04861 }
04862
04863
04872 bdd_node *
04873 bdd_bdd_and_abstract(
04874 bdd_manager *mgr,
04875 bdd_node *f,
04876 bdd_node *g,
04877 bdd_node *cube)
04878 {
04879 DdNode *result;
04880 result = Cudd_bddAndAbstract((DdManager *)mgr, (DdNode *)f,
04881 (DdNode *)g, (DdNode *)cube);
04882 return(result);
04883
04884 }
04885
04886
04894 void
04895 bdd_deref(bdd_node *f)
04896 {
04897 Cudd_Deref((DdNode *)f);
04898
04899 }
04900
04901
04910 bdd_node *
04911 bdd_add_plus(bdd_manager *mgr, bdd_node **fn1, bdd_node **fn2)
04912 {
04913 DdNode *result;
04914 result = Cudd_addPlus((DdManager *)mgr, (DdNode **)fn1, (DdNode **)fn2);
04915 return(result);
04916
04917 }
04918
04919
04927 int
04928 bdd_read_reorderings(bdd_manager *mgr)
04929 {
04930 return(Cudd_ReadReorderings((DdManager *)mgr));
04931
04932 }
04933
04934
04942 int
04943 bdd_read_next_reordering(bdd_manager *mgr)
04944 {
04945 return(Cudd_ReadNextReordering((DdManager *)mgr));
04946
04947 }
04948
04949
04957 void
04958 bdd_set_next_reordering(bdd_manager *mgr, int next)
04959 {
04960 Cudd_SetNextReordering((DdManager *)mgr, next);
04961
04962 }
04963
04964
04972 bdd_node *
04973 bdd_bdd_xnor(bdd_manager *mgr, bdd_node *f, bdd_node *g)
04974 {
04975 DdNode *result;
04976 result = Cudd_bddXnor((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
04977
04978 return(result);
04979
04980 }
04981
04982
04992 bdd_node *
04993 bdd_bdd_vector_compose(bdd_manager *mgr, bdd_node *f, bdd_node **vector)
04994 {
04995 DdNode *result;
04996 result = Cudd_bddVectorCompose((DdManager *)mgr, (DdNode *)f,
04997 (DdNode **)vector);
04998 return(result);
04999
05000 }
05001
05002
05011 bdd_node *
05012 bdd_extract_node_as_is(bdd_t *fn)
05013 {
05014 return((bdd_node *)fn->node);
05015
05016 }
05017
05018
05026 bdd_node *
05027 bdd_zdd_get_node(
05028 bdd_manager *mgr,
05029 int id,
05030 bdd_node *g,
05031 bdd_node *h)
05032 {
05033 DdNode *result;
05034 result = cuddZddGetNode((DdManager *)mgr, id, (DdNode *)g,
05035 (DdNode *)h);
05036
05037 return(result);
05038
05039 }
05040
05041
05052 bdd_node *
05053 bdd_zdd_product(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05054 {
05055 DdNode *result;
05056 result = Cudd_zddProduct((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
05057 return(result);
05058
05059 }
05060
05061
05075 bdd_node *
05076 bdd_zdd_product_recur(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05077 {
05078 DdNode *result;
05079 result = cuddZddProduct((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
05080 return(result);
05081
05082 }
05083
05084
05095 bdd_node *
05096 bdd_zdd_union(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05097 {
05098 DdNode *result;
05099 result = Cudd_zddUnion((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
05100 return(result);
05101
05102 }
05103
05104
05115 bdd_node *
05116 bdd_zdd_union_recur(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05117 {
05118 DdNode *result;
05119 result = cuddZddUnion((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
05120 return(result);
05121
05122 }
05123
05124
05136 bdd_node *
05137 bdd_zdd_weak_div(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05138 {
05139 DdNode *result;
05140 result = Cudd_zddWeakDiv((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
05141 return(result);
05142
05143 }
05144
05145
05160 bdd_node *
05161 bdd_zdd_weak_div_recur(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05162 {
05163 DdNode *result;
05164 result = cuddZddWeakDiv((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
05165
05166 return(result);
05167
05168 }
05169
05170
05182 bdd_node *
05183 bdd_zdd_isop_recur(
05184 bdd_manager *mgr,
05185 bdd_node *L,
05186 bdd_node *U,
05187 bdd_node **zdd_I)
05188 {
05189 DdNode *result;
05190 result = cuddZddIsop((DdManager *)mgr, (DdNode *)L, (DdNode *)U,
05191 (DdNode **)zdd_I);
05192
05193 return(result);
05194
05195 }
05196
05197
05209 bdd_node *
05210 bdd_zdd_isop(
05211 bdd_manager *mgr,
05212 bdd_node *L,
05213 bdd_node *U,
05214 bdd_node **zdd_I)
05215 {
05216 DdNode *result;
05217 result = Cudd_zddIsop((DdManager *)mgr, (DdNode *)L, (DdNode *)U,
05218 (DdNode **)zdd_I);
05219
05220 return(result);
05221
05222 }
05223
05224
05237 int
05238 bdd_zdd_get_cofactors3(
05239 bdd_manager *mgr,
05240 bdd_node *f,
05241 int v,
05242 bdd_node **f1,
05243 bdd_node **f0,
05244 bdd_node **fd)
05245 {
05246 int result;
05247 result = cuddZddGetCofactors3((DdManager *)mgr, (DdNode *)f, v,
05248 (DdNode **)f1, (DdNode **)f0,
05249 (DdNode **)fd);
05250
05251 return(result);
05252
05253 }
05254
05255
05268 bdd_node *
05269 bdd_bdd_and_recur(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05270 {
05271 DdNode *result;
05272 result = cuddBddAndRecur((DdManager *)mgr, (DdNode *)f,
05273 (DdNode *)g);
05274 return(result);
05275
05276 }
05277
05278
05292 bdd_node *
05293 bdd_unique_inter(
05294 bdd_manager *mgr,
05295 int v,
05296 bdd_node *f,
05297 bdd_node *g)
05298 {
05299 DdNode *result;
05300 result = cuddUniqueInter((DdManager *)mgr, v, (DdNode *)f,
05301 (DdNode *)g);
05302 return(result);
05303
05304 }
05305
05306
05320 bdd_node *
05321 bdd_unique_inter_ivo(
05322 bdd_manager *mgr,
05323 int v,
05324 bdd_node *f,
05325 bdd_node *g)
05326 {
05327 DdNode *result;
05328 DdNode *t;
05329
05330 t = cuddUniqueInter((DdManager *)mgr, v, (DdNode *)bdd_read_one(mgr),
05331 (DdNode *)bdd_not_bdd_node(bdd_read_one(mgr)));
05332 if (t == NULL)
05333 return(NULL);
05334 Cudd_Ref(t);
05335 result = cuddBddIteRecur((DdManager *)mgr, t, (DdNode *)f, (DdNode *)g);
05336 Cudd_RecursiveDeref((DdManager *)mgr,(DdNode *)t);
05337 return(result);
05338
05339 }
05340
05341
05354 bdd_node *
05355 bdd_zdd_diff(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05356 {
05357 DdNode *result;
05358 result = Cudd_zddDiff((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
05359 return(result);
05360
05361 }
05362
05363
05376 bdd_node *
05377 bdd_zdd_diff_recur(bdd_manager *mgr, bdd_node *f, bdd_node *g)
05378 {
05379 DdNode *result;
05380 result = cuddZddDiff((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
05381 return(result);
05382
05383 }
05384
05385
05395 int
05396 bdd_num_zdd_vars(bdd_manager *mgr)
05397 {
05398 return(((DdManager *)mgr)->sizeZ);
05399
05400 }
05401
05402
05412 bdd_node *
05413 bdd_regular(bdd_node *f)
05414 {
05415 return(Cudd_Regular((DdNode *)f));
05416
05417 }
05418
05419
05429 int
05430 bdd_is_constant(bdd_node *f)
05431 {
05432 return(Cudd_IsConstant((DdNode *)f));
05433
05434 }
05435
05436
05446 int
05447 bdd_is_complement(bdd_node *f)
05448 {
05449 return(Cudd_IsComplement((DdNode *)f));
05450
05451 }
05452
05453
05466 bdd_node *
05467 bdd_bdd_T(bdd_node *f)
05468 {
05469 return(Cudd_T((DdNode *)f));
05470
05471 }
05472
05473
05485 bdd_node *
05486 bdd_bdd_E(bdd_node *f)
05487 {
05488 return(Cudd_E((DdNode *)f));
05489
05490 }
05491
05492
05503 bdd_node *
05504 bdd_not_bdd_node(bdd_node *f)
05505 {
05506 return(Cudd_Not((DdNode *)f));
05507
05508 }
05509
05510
05521 void
05522 bdd_recursive_deref_zdd(bdd_manager *mgr, bdd_node *f)
05523 {
05524 Cudd_RecursiveDerefZdd((DdManager *)mgr, (DdNode *)f);
05525
05526 }
05527
05528
05538 int
05539 bdd_zdd_count(bdd_manager *mgr, bdd_node *f)
05540 {
05541 return(Cudd_zddCount((DdManager *)mgr, (DdNode *)f));
05542
05543 }
05544
05545
05555 int
05556 bdd_read_zdd_level(bdd_manager *mgr, int index)
05557 {
05558 return(Cudd_ReadPermZdd((DdManager *)mgr, index));
05559
05560 }
05561
05562
05582 int
05583 bdd_zdd_vars_from_bdd_vars(bdd_manager *mgr, int multiplicity)
05584 {
05585 return(Cudd_zddVarsFromBddVars((DdManager *)mgr, multiplicity));
05586
05587 }
05588
05589
05601 void
05602 bdd_zdd_realign_enable(bdd_manager *mgr)
05603 {
05604 Cudd_zddRealignEnable((DdManager *)mgr);
05605
05606 }
05607
05608
05620 void
05621 bdd_zdd_realign_disable(bdd_manager *mgr)
05622 {
05623 Cudd_zddRealignDisable((DdManager *)mgr);
05624
05625 }
05626
05627
05639 int
05640 bdd_zdd_realignment_enabled(bdd_manager *mgr)
05641 {
05642 return(Cudd_zddRealignmentEnabled((DdManager *)mgr));
05643
05644 }
05645
05646
05658 void
05659 bdd_realign_enable(bdd_manager *mgr)
05660 {
05661 Cudd_bddRealignEnable((DdManager *)mgr);
05662
05663 }
05664
05665
05677 void
05678 bdd_realign_disable(bdd_manager *mgr)
05679 {
05680 Cudd_bddRealignDisable((DdManager *)mgr);
05681
05682 }
05683
05684
05696 int
05697 bdd_realignment_enabled(bdd_manager *mgr)
05698 {
05699 return(Cudd_bddRealignmentEnabled((DdManager *)mgr));
05700
05701 }
05702
05703
05715 int
05716 bdd_node_read_index(bdd_node *f)
05717 {
05718 return(Cudd_NodeReadIndex((DdNode *)f));
05719
05720 }
05721
05722
05732 bdd_node *
05733 bdd_read_next(bdd_node *f)
05734 {
05735 return(((DdNode *)f)->next);
05736
05737 }
05738
05739
05753 void
05754 bdd_set_next(bdd_node *f, bdd_node *g)
05755 {
05756 ((DdNode *)f)->next = (DdNode *)g;
05757
05758 }
05759
05760
05770 int
05771 bdd_read_reordered_field(bdd_manager *mgr)
05772 {
05773 return(((DdManager *)mgr)->reordered);
05774
05775 }
05776
05777
05791 void
05792 bdd_set_reordered_field(bdd_manager *mgr, int n)
05793 {
05794 ((DdManager *)mgr)->reordered = n;
05795
05796 }
05797
05798
05812 bdd_node *
05813 bdd_add_apply_recur(
05814 bdd_manager *mgr,
05815 bdd_node *(*operation)(bdd_manager *, bdd_node **, bdd_node **),
05816 bdd_node *fn1,
05817 bdd_node *fn2)
05818 {
05819 DdNode *result;
05820 result = cuddAddApplyRecur((DdManager *)mgr,
05821 (DdNode *(*)(DdManager *, DdNode **, DdNode **))
05822 operation, (DdNode *)fn1, (DdNode *)fn2);
05823 return(result);
05824
05825 }
05826
05827
05837 BDD_VALUE_TYPE
05838 bdd_add_value(bdd_node *f)
05839 {
05840 return(Cudd_V((DdNode *)f));
05841
05842 }
05843
05844
05854 int
05855 bdd_print_minterm(bdd_t *f)
05856 {
05857 int result;
05858 result = Cudd_PrintMinterm((DdManager *)f->mgr, (DdNode *)f->node);
05859 return result;
05860
05861 }
05862
05863
05873 int
05874 bdd_print_cover(bdd_t *f)
05875 {
05876 int result;
05877 result = Cudd_bddPrintCover((DdManager *)f->mgr,
05878 (DdNode *)f->node, (DdNode *)f->node);
05879 return result;
05880
05881 }
05882
05883
05893 bdd_node *
05894 bdd_read_plus_infinity(bdd_manager *mgr)
05895 {
05896 DdNode *result;
05897 result = Cudd_ReadPlusInfinity((DdManager *)mgr);
05898 return (bdd_node *)result;
05899
05900 }
05901
05902
05931 bdd_node *
05932 bdd_priority_select(
05933 bdd_manager *mgr,
05934 bdd_node *R,
05935 bdd_node **x,
05936 bdd_node **y,
05937 bdd_node **z,
05938 bdd_node *Pi,
05939 int n,
05940 bdd_node *(*Pifunc)(bdd_manager *, int, bdd_node **, bdd_node **, bdd_node **))
05941 {
05942 DdNode *result;
05943 result = Cudd_PrioritySelect((DdManager *)mgr,(DdNode *)R,
05944 (DdNode **)x,(DdNode **)y,
05945 (DdNode **)z,(DdNode *)Pi,
05946 n,(DdNode *(*)(DdManager *, int, DdNode **,
05947 DdNode **, DdNode **))Pifunc);
05948 return (bdd_node *)result;
05949
05950 }
05951
05952
05962 void
05963 bdd_set_background(bdd_manager *mgr, bdd_node *f)
05964 {
05965 Cudd_SetBackground((DdManager *)mgr,(DdNode *)f);
05966
05967 }
05968
05969
05979 bdd_node *
05980 bdd_read_background(bdd_manager *mgr)
05981 {
05982 DdNode *result;
05983 result = Cudd_ReadBackground((DdManager *)mgr);
05984 return (bdd_node *)result;
05985
05986 }
05987
05988
05998 bdd_node *
05999 bdd_bdd_cofactor(bdd_manager *mgr, bdd_node *f, bdd_node *g)
06000 {
06001 DdNode *result;
06002 result = Cudd_Cofactor((DdManager *)mgr,(DdNode *)f,
06003 (DdNode *)g);
06004 return (bdd_node *)result;
06005
06006 }
06007
06008
06018 bdd_node *
06019 bdd_bdd_ite(bdd_manager *mgr, bdd_node *f, bdd_node *g, bdd_node *h)
06020 {
06021 DdNode *result;
06022 result = Cudd_bddIte((DdManager *)mgr,(DdNode *)f,
06023 (DdNode *)g,(DdNode *)h);
06024 return (bdd_node *)result;
06025
06026 }
06027
06028
06037 bdd_node *
06038 bdd_add_minus(bdd_manager *mgr, bdd_node **fn1, bdd_node **fn2)
06039 {
06040 DdNode *result;
06041 result = Cudd_addMinus((DdManager *)mgr, (DdNode **)fn1, (DdNode **)fn2);
06042 return((bdd_node *)result);
06043
06044 }
06045
06046
06067 bdd_node *
06068 bdd_dxygtdxz(
06069 bdd_manager *mgr,
06070 int N,
06071 bdd_node **x,
06072 bdd_node **y,
06073 bdd_node **z)
06074 {
06075 DdNode *result;
06076 result = Cudd_Dxygtdxz((DdManager *)mgr,N,(DdNode **)x,
06077 (DdNode **)y,(DdNode **)z);
06078 return((bdd_node *)result);
06079
06080 }
06081
06082
06090 bdd_node *
06091 bdd_bdd_univ_abstract(bdd_manager *mgr, bdd_node *fn, bdd_node *vars)
06092 {
06093 DdNode *result;
06094 result = Cudd_bddUnivAbstract((DdManager *)mgr, (DdNode *)fn,
06095 (DdNode *)vars);
06096 return((bdd_node *)result);
06097
06098 }
06099
06100
06111 bdd_node *
06112 bdd_bdd_cprojection(bdd_manager *mgr, bdd_node *R, bdd_node *Y)
06113 {
06114 DdNode *result;
06115 result = Cudd_CProjection((DdManager *)mgr,(DdNode *)R,
06116 (DdNode *)Y);
06117 return (bdd_node *)result;
06118
06119 }
06120
06121
06133 double
06134 bdd_correlation(bdd_t *f, bdd_t *g)
06135 {
06136 double result ;
06137 assert(f->mgr == g->mgr);
06138 result = Cudd_bddCorrelation(f->mgr, f->node, g->node);
06139 return (result);
06140
06141 }
06142
06143
06155 int
06156 bdd_gen_decomp(bdd_t *f, bdd_partition_type_t partType, bdd_t ***conjArray)
06157 {
06158 DdNode **ddArray = NULL;
06159 int i, num = 0;
06160 bdd_t *result;
06161
06162 switch (partType) {
06163 case BDD_CONJUNCTS:
06164 num = Cudd_bddGenConjDecomp(f->mgr, f->node, &ddArray);
06165 break;
06166 case BDD_DISJUNCTS:
06167 num = Cudd_bddGenDisjDecomp(f->mgr, f->node, &ddArray);
06168 break;
06169 }
06170 if ((ddArray == NULL) || (!num)) {
06171 return 0;
06172 }
06173
06174 *conjArray = ALLOC(bdd_t *, num);
06175 if ((*conjArray) == NULL) goto outOfMem;
06176 for (i = 0; i < num; i++) {
06177 result = ALLOC(bdd_t, 1);
06178 if (result == NULL) {
06179 FREE(*conjArray);
06180 goto outOfMem;
06181 }
06182 result->mgr = f->mgr;
06183 result->node = ddArray[i];
06184 result->free = FALSE;
06185 (*conjArray)[i] = result;
06186 }
06187 FREE(ddArray);
06188 return (num);
06189
06190 outOfMem:
06191 for (i = 0; i < num; i++) {
06192 Cudd_RecursiveDeref((DdManager *)f->mgr,(DdNode *)ddArray[i]);
06193 }
06194 FREE(ddArray);
06195 return(0);
06196
06197 }
06198
06199
06211 int
06212 bdd_var_decomp(bdd_t *f, bdd_partition_type_t partType, bdd_t ***conjArray)
06213 {
06214 DdNode **ddArray = NULL;
06215 int i, num = 0;
06216 bdd_t *result;
06217
06218 switch (partType) {
06219 case BDD_CONJUNCTS:
06220 num = Cudd_bddVarConjDecomp(f->mgr, f->node, &ddArray);
06221 break;
06222 case BDD_DISJUNCTS:
06223 num = Cudd_bddVarDisjDecomp(f->mgr, f->node, &ddArray);
06224 break;
06225 }
06226 if ((ddArray == NULL) || (!num)) {
06227 return 0;
06228 }
06229
06230 *conjArray = ALLOC(bdd_t *, num);
06231 if ((*conjArray) == NULL) goto outOfMem;
06232 for (i = 0; i < num; i++) {
06233 result = ALLOC(bdd_t, 1);
06234 if (result == NULL) {
06235 FREE(*conjArray);
06236 goto outOfMem;
06237 }
06238 result->mgr = f->mgr;
06239 result->node = (ddArray)[i];
06240 result->free = FALSE;
06241 (*conjArray)[i] = result;
06242 }
06243 FREE(ddArray);
06244 return (num);
06245
06246 outOfMem:
06247 for (i = 0; i < num; i++) {
06248 Cudd_RecursiveDeref((DdManager *)f->mgr,(DdNode *)ddArray[i]);
06249 }
06250 FREE(ddArray);
06251 return(0);
06252
06253 }
06254
06255
06267 int
06268 bdd_approx_decomp(bdd_t *f, bdd_partition_type_t partType, bdd_t ***conjArray)
06269 {
06270 DdNode **ddArray = NULL;
06271 int i, num = 0;
06272 bdd_t *result;
06273
06274 switch (partType) {
06275 case BDD_CONJUNCTS:
06276 num = Cudd_bddApproxConjDecomp(f->mgr, f->node, &ddArray);
06277 break;
06278 case BDD_DISJUNCTS:
06279 num = Cudd_bddApproxDisjDecomp(f->mgr, f->node, &ddArray);
06280 break;
06281 }
06282 if ((ddArray == NULL) || (!num)) {
06283 return 0;
06284 }
06285
06286 *conjArray = ALLOC(bdd_t *, num);
06287 if ((*conjArray) == NULL) goto outOfMem;
06288 for (i = 0; i < num; i++) {
06289 result = ALLOC(bdd_t, 1);
06290 if (result == NULL) {
06291 FREE(*conjArray);
06292 goto outOfMem;
06293 }
06294 result->mgr = f->mgr;
06295 result->node = ddArray[i];
06296 result->free = FALSE;
06297 (*conjArray)[i] = result;
06298 }
06299 FREE(ddArray);
06300 return (num);
06301
06302 outOfMem:
06303 for (i = 0; i < num; i++) {
06304 Cudd_RecursiveDeref((DdManager *)f->mgr,(DdNode *)ddArray[i]);
06305 }
06306 FREE(ddArray);
06307 return(0);
06308
06309 }
06310
06311
06323 int
06324 bdd_iter_decomp(bdd_t *f, bdd_partition_type_t partType, bdd_t ***conjArray)
06325 {
06326 DdNode **ddArray;
06327 int i, num = 0;
06328 bdd_t *result;
06329
06330 switch (partType) {
06331 case BDD_CONJUNCTS:
06332 num = Cudd_bddIterConjDecomp(f->mgr, f->node, &ddArray);
06333 break;
06334 case BDD_DISJUNCTS:
06335 num = Cudd_bddIterDisjDecomp(f->mgr, f->node, &ddArray);
06336 break;
06337 }
06338 if ((ddArray == NULL) || (!num)) {
06339 return 0;
06340 }
06341
06342 *conjArray = ALLOC(bdd_t *, num);
06343 if ((*conjArray) == NULL) goto outOfMem;
06344 for (i = 0; i < num; i++) {
06345 result = ALLOC(bdd_t, 1);
06346 if (result == NULL) {
06347 FREE(*conjArray);
06348 goto outOfMem;
06349 }
06350 result->mgr = f->mgr;
06351 result->node = ddArray[i];
06352 result->free = FALSE;
06353 (*conjArray)[i] = result;
06354 }
06355 FREE(ddArray);
06356 return (num);
06357
06358 outOfMem:
06359 for (i = 0; i < num; i++) {
06360 Cudd_RecursiveDeref((DdManager *)f->mgr,(DdNode *)ddArray[i]);
06361 }
06362 FREE(ddArray);
06363 return(0);
06364
06365 }
06366
06367
06375 bdd_t *
06376 bdd_solve_eqn(
06377 bdd_t *f,
06378 array_t *g ,
06379 array_t *unknowns )
06380 {
06381 int i;
06382 bdd_t *variable;
06383 DdNode *cube, *tmpDd, *result, **G;
06384 DdManager *mgr;
06385 int *yIndex = NIL(int);
06386
06387
06388
06389
06390
06391 mgr = f->mgr;
06392 Cudd_Ref(cube = DD_ONE(mgr));
06393 for (i = 0; i < array_n(unknowns); i++) {
06394 variable = array_fetch(bdd_t *,unknowns,i);
06395
06396
06397 assert(mgr == variable->mgr);
06398
06399 tmpDd = Cudd_bddAnd(mgr,cube,variable->node);
06400 if (tmpDd == NULL) {
06401 Cudd_RecursiveDeref(mgr,cube);
06402 return(NULL);
06403 }
06404 cuddRef(tmpDd);
06405 Cudd_RecursiveDeref(mgr, cube);
06406 cube = tmpDd;
06407 }
06408
06409
06410 G = ALLOC(DdNode *,array_n(unknowns));
06411 for (i = 0; i < array_n(unknowns); i++) {
06412 G[i] = NIL(DdNode);
06413 }
06414
06415
06416 result = Cudd_SolveEqn(mgr,f->node,cube,G,&yIndex,array_n(unknowns));
06417 if (result == NULL) {
06418 Cudd_RecursiveDeref(mgr, cube);
06419 return(NULL);
06420 }
06421 cuddRef(result);
06422
06423 Cudd_RecursiveDeref(mgr, cube);
06424
06425
06426 for (i = 0; i < array_n(unknowns); i++) {
06427 bdd_t *tmp = bdd_construct_bdd_t(mgr,G[i]);
06428 array_insert_last(bdd_t *, g, tmp);
06429 }
06430
06431 return(bdd_construct_bdd_t(mgr,result));
06432
06433 }
06434
06435
06443 int
06444 bdd_read_node_count(bdd_manager *mgr)
06445 {
06446 return(Cudd_ReadNodeCount((DdManager *)mgr));
06447
06448 }
06449
06450
06461 double *
06462 bdd_cof_minterm(bdd_t *f)
06463 {
06464 double *signatures;
06465 signatures = Cudd_CofMinterm((DdManager *)f->mgr, (DdNode *)f->node);
06466 return (signatures);
06467
06468 }
06469
06470
06480 int
06481 bdd_estimate_cofactor(bdd_t *f, bdd_t *var, int phase)
06482 {
06483 return (Cudd_EstimateCofactor((DdManager *)f->mgr, (DdNode *)f->node,
06484 (int)bdd_top_var_id(var), phase));
06485
06486 }
06487
06488
06497 int
06498 bdd_test_unate(bdd_t *f, int varId, int phase)
06499 {
06500 DdNode *result;
06501 DdNode *one = DD_ONE((DdManager *)f->mgr);
06502
06503 if (phase) {
06504 result = Cudd_Increasing((DdManager *)f->mgr, (DdNode *)f->node, varId);
06505 } else {
06506 result = Cudd_Decreasing((DdManager *)f->mgr, (DdNode *)f->node, varId);
06507 }
06508
06509 if (result == one) {
06510 return 1;
06511 } else {
06512 return 0;
06513 }
06514
06515 }
06516
06517
06527 array_t *
06528 bdd_find_essential(bdd_t *f)
06529 {
06530 DdNode *C, *result, *scan, *cube;
06531 array_t *varArray = NIL(array_t);
06532 bdd_t *var;
06533
06534 result = Cudd_FindEssential((DdManager *)f->mgr, (DdNode *)f->node);
06535 if (result == NULL) return NULL;
06536 cuddRef(result);
06537
06538 cube = result;
06539 C = Cudd_Regular(cube);
06540 varArray = array_alloc(bdd_t *, 0);
06541 while (!cuddIsConstant(C)) {
06542 var = bdd_var_with_index(f->mgr, C->index);
06543 scan = cuddT(C);
06544 if (Cudd_NotCond(scan, !Cudd_IsComplement(cube)) == DD_ONE(f->mgr)) {
06545 array_insert_last(bdd_t *, varArray, bdd_not(var));
06546 bdd_free(var);
06547 scan = cuddE(C);
06548 } else {
06549 array_insert_last(bdd_t *, varArray, var);
06550 }
06551 cube = Cudd_NotCond(scan, Cudd_IsComplement(cube));
06552 C = Cudd_Regular(cube);
06553 }
06554
06555 Cudd_RecursiveDeref((DdManager *)f->mgr,result);
06556 return varArray;
06557
06558 }
06559
06560
06569 bdd_t *
06570 bdd_find_essential_cube(bdd_t *f)
06571 {
06572 DdNode *cube;
06573 bdd_t *result;
06574
06575 cube = Cudd_FindEssential((DdManager *)f->mgr, (DdNode *)f->node);
06576 if (cube == NULL) return NULL;
06577 cuddRef(cube);
06578 result = bdd_construct_bdd_t(f->mgr,cube);
06579
06580 return(result);
06581
06582 }
06583
06584
06592 bdd_node *
06593 bdd_xeqy(
06594 bdd_manager *mgr,
06595 int N,
06596 bdd_node **x,
06597 bdd_node **y)
06598 {
06599 DdNode *result;
06600 result = Cudd_Xeqy((DdManager *)mgr,N,(DdNode **)x,
06601 (DdNode **)y);
06602 return((bdd_node *)result);
06603
06604 }
06605
06606
06614 bdd_node *
06615 bdd_add_roundoff(bdd_manager *mgr, bdd_node *f, int N)
06616 {
06617 DdNode *result;
06618 result = Cudd_addRoundOff((DdManager *)mgr,(DdNode *)f,N);
06619 return((bdd_node *)result);
06620
06621 }
06622
06623
06640 bdd_node *
06641 bdd_xgty(
06642 bdd_manager *mgr,
06643 int N,
06644 bdd_node **x,
06645 bdd_node **y)
06646 {
06647 DdNode *result;
06648 result = Cudd_Xgty((DdManager *)mgr,N, NIL(DdNode *),
06649 (DdNode **)x, (DdNode **)y);
06650 return((bdd_node *)result);
06651
06652 }
06653
06654
06662 bdd_node *
06663 bdd_add_cmpl(bdd_manager *mgr, bdd_node *f)
06664 {
06665 DdNode *result;
06666 result = Cudd_addCmpl((DdManager *)mgr,(DdNode *)f);
06667 return((bdd_node *)result);
06668
06669 }
06670
06671
06688 bdd_node *
06689 bdd_split_set(
06690 bdd_manager *mgr,
06691 bdd_node *f,
06692 bdd_node **x,
06693 int n,
06694 double m)
06695 {
06696 DdNode *result;
06697 result = Cudd_SplitSet((DdManager *)mgr,(DdNode *)f,
06698 (DdNode **)x, n, m);
06699 return((bdd_node *)result);
06700
06701 }
06702
06703
06715 int
06716 bdd_debug_check(bdd_manager *mgr)
06717 {
06718 return Cudd_DebugCheck((DdManager *)mgr);
06719
06720 }
06721
06722
06732 int
06733 bdd_print_apa_minterm(
06734 FILE *fp,
06735 bdd_t *f,
06736 int nvars,
06737 int precision)
06738 {
06739 int result;
06740 result = Cudd_ApaPrintMintermExp(fp, (DdManager *)f->mgr,(DdNode *)f->node, nvars, precision);
06741 return(result);
06742
06743 }
06744
06745
06756 int
06757 bdd_apa_compare_ratios(
06758 int nvars,
06759 bdd_t *f1,
06760 bdd_t *f2,
06761 int f1Num,
06762 int f2Num)
06763 {
06764 int result;
06765 DdApaNumber f1Min, f2Min;
06766 int digits1, digits2;
06767
06768 f1Min = Cudd_ApaCountMinterm((DdManager *)f1->mgr, (DdNode *)f1->node, nvars, &digits1);
06769 f2Min = Cudd_ApaCountMinterm((DdManager *)f2->mgr, (DdNode *)f2->node, nvars, &digits2);
06770
06771 result = Cudd_ApaCompareRatios(digits1, f1Min, f1Num, digits2, f2Min, f2Num);
06772 return(result);
06773
06774 }
06775
06776
06784 bdd_node *
06785 bdd_bdd_xor(bdd_manager *mgr, bdd_node *f, bdd_node *g)
06786 {
06787 DdNode *result;
06788 result = Cudd_bddXor((DdManager *)mgr, (DdNode *)f, (DdNode *)g);
06789
06790 return(result);
06791
06792 }
06793
06794
06806 void
06807 bdd_dump_blif(
06808 bdd_manager *mgr,
06809 int nBdds,
06810 bdd_node **bdds,
06811 char **inames,
06812 char **onames,
06813 char *model,
06814 FILE *fp)
06815 {
06816 Cudd_DumpBlif((DdManager *)mgr, nBdds, (DdNode **)bdds, inames, onames,
06817 model, fp, 0);
06818
06819 }
06820
06821
06833 void
06834 bdd_dump_blif_body(
06835 bdd_manager *mgr,
06836 int nBdds,
06837 bdd_node **bdds,
06838 char **inames,
06839 char **onames,
06840 FILE *fp)
06841 {
06842 Cudd_DumpBlifBody((DdManager *)mgr, nBdds, (DdNode **)bdds, inames, onames,
06843 fp, 0);
06844
06845 }
06846
06847
06858 void
06859 bdd_dump_dot(
06860 bdd_manager *mgr,
06861 int nBdds,
06862 bdd_node **bdds,
06863 char **inames,
06864 char **onames,
06865 FILE *fp)
06866 {
06867 Cudd_DumpDot((DdManager *)mgr, nBdds, (DdNode **)bdds, inames, onames, fp);
06868
06869 }
06870
06871
06879 bdd_node *
06880 bdd_make_bdd_from_zdd_cover(bdd_manager *mgr, bdd_node *node)
06881 {
06882 return((bdd_node *)Cudd_MakeBddFromZddCover((DdManager *)mgr, (DdNode *)node));
06883
06884 }
06885
06886
06894 bdd_node *
06895 bdd_zdd_complement(bdd_manager *mgr, bdd_node *node)
06896 {
06897 return((bdd_node *)Cudd_zddComplement((DdManager *)mgr, (DdNode *)node));
06898
06899 }
06900
06901
06909 bdd_node *
06910 bdd_bdd_vector_support(bdd_manager *mgr, bdd_node **F, int n)
06911 {
06912 return((bdd_node *)Cudd_VectorSupport((DdManager *)mgr,(DdNode **)F,n));
06913
06914 }
06915
06916
06924 int
06925 bdd_bdd_vector_support_size(bdd_manager *mgr, bdd_node **F, int n)
06926 {
06927 return(Cudd_VectorSupportSize((DdManager *)mgr,(DdNode **)F,n));
06928
06929 }
06930
06931
06939 int
06940 bdd_bdd_support_size(bdd_manager *mgr, bdd_node *F)
06941 {
06942 return(Cudd_SupportSize((DdManager *)mgr,(DdNode *)F));
06943
06944 }
06945
06946
06954 bdd_node *
06955 bdd_bdd_support(bdd_manager *mgr, bdd_node *F)
06956 {
06957 return((bdd_node *)Cudd_Support((DdManager *)mgr,(DdNode *)F));
06958
06959 }
06960
06961
06969 bdd_node *
06970 bdd_add_general_vector_compose(
06971 bdd_manager *mgr,
06972 bdd_node *f,
06973 bdd_node **vectorOn,
06974 bdd_node **vectorOff)
06975 {
06976 return((bdd_node *)Cudd_addGeneralVectorCompose((DdManager *)mgr,
06977 (DdNode *)f,
06978 (DdNode **)vectorOn,
06979 (DdNode **)vectorOff));
06980
06981 }
06982
06983
06991 bdd_node *
06992 bdd_bdd_boolean_diff(bdd_manager *mgr, bdd_node *f, int x)
06993 {
06994 return ((bdd_node *)Cudd_bddBooleanDiff((DdManager *)mgr,(DdNode *)f,x));
06995
06996 }
06997
06998
07006 int
07007 bdd_bdd_leq(bdd_manager *mgr, bdd_node *f, bdd_node *g)
07008 {
07009 return Cudd_bddLeq((DdManager *)mgr,(DdNode *)f,(DdNode *)g);
07010
07011 }
07012
07013
07021 int
07022 bdd_ptrcmp(bdd_t *f, bdd_t *g)
07023 {
07024 if (f->node == g->node)
07025 return(0);
07026 else
07027 return(1);
07028
07029 }
07030
07031
07039 int
07040 bdd_ptrhash(bdd_t *f, int size)
07041 {
07042 int hash;
07043
07044 hash = (int)((unsigned long)f->node >> 2) % size;
07045 return(hash);
07046
07047 }
07048
07049
07057 long
07058 bdd_read_peak_memory(bdd_manager *mgr)
07059 {
07060 return((long) Cudd_ReadMemoryInUse((DdManager *) mgr));
07061
07062 }
07063
07064
07072 int
07073 bdd_read_peak_live_node(bdd_manager *mgr)
07074 {
07075 return(Cudd_ReadPeakLiveNodeCount((DdManager *) mgr));
07076
07077 }
07078
07079
07087 int
07088 bdd_set_pi_var(bdd_manager *mgr, int index)
07089 {
07090 return Cudd_bddSetPiVar((DdManager *) mgr, index);
07091
07092 }
07093
07094
07102 int
07103 bdd_set_ps_var(bdd_manager *mgr, int index)
07104 {
07105 return Cudd_bddSetPsVar((DdManager *) mgr, index);
07106
07107 }
07108
07109
07117 int
07118 bdd_set_ns_var(bdd_manager *mgr, int index)
07119 {
07120 return Cudd_bddSetNsVar((DdManager *) mgr, index);
07121
07122 }
07123
07124
07132 int
07133 bdd_is_pi_var(bdd_manager *mgr, int index)
07134 {
07135 return Cudd_bddIsPiVar((DdManager *) mgr, index);
07136
07137 }
07138
07139
07147 int
07148 bdd_is_ps_var(bdd_manager *mgr, int index)
07149 {
07150 return Cudd_bddIsPsVar((DdManager *) mgr, index);
07151
07152 }
07153
07154
07162 int
07163 bdd_is_ns_var(bdd_manager *mgr, int index)
07164 {
07165 return Cudd_bddIsNsVar((DdManager *) mgr, index);
07166
07167 }
07168
07169
07180 int
07181 bdd_set_pair_index(bdd_manager *mgr, int index, int pairidx)
07182 {
07183 return Cudd_bddSetPairIndex((DdManager *) mgr, index, pairidx);
07184
07185 }
07186
07187
07198 int
07199 bdd_read_pair_index(bdd_manager *mgr, int index)
07200 {
07201 return Cudd_bddReadPairIndex((DdManager *) mgr, index);
07202
07203 }
07204
07205
07216 int
07217 bdd_set_var_to_be_grouped(bdd_manager *mgr, int index)
07218 {
07219 return Cudd_bddSetVarToBeGrouped((DdManager *) mgr, index);
07220
07221 }
07222
07223
07234 int
07235 bdd_set_var_hard_group(bdd_manager *mgr, int index)
07236 {
07237 return Cudd_bddSetVarHardGroup((DdManager *) mgr, index);
07238
07239 }
07240
07241
07252 int
07253 bdd_reset_var_to_be_grouped(bdd_manager *mgr, int index)
07254 {
07255 return Cudd_bddResetVarToBeGrouped((DdManager *) mgr, index);
07256
07257 }
07258
07259
07270 int
07271 bdd_is_var_to_be_grouped(bdd_manager *mgr, int index)
07272 {
07273 return Cudd_bddIsVarToBeGrouped((DdManager *) mgr, index);
07274
07275 }
07276
07277
07288 int
07289 bdd_is_var_hard_group(bdd_manager *mgr, int index)
07290 {
07291 return Cudd_bddIsVarHardGroup((DdManager *) mgr, index);
07292
07293 }
07294
07295
07306 int
07307 bdd_is_var_to_be_ungrouped(bdd_manager *mgr, int index)
07308 {
07309 return Cudd_bddIsVarToBeUngrouped((DdManager *) mgr, index);
07310
07311 }
07312
07313
07324 int
07325 bdd_set_var_to_be_ungrouped(bdd_manager *mgr, int index)
07326 {
07327 return Cudd_bddSetVarToBeUngrouped((DdManager *) mgr, index);
07328
07329 }
07330
07331
07343 int
07344 bdd_bind_var(bdd_manager *mgr, int index)
07345 {
07346 return Cudd_bddBindVar((DdManager *) mgr, index);
07347
07348 }
07349
07350
07365 int
07366 bdd_unbind_var(bdd_manager *mgr, int index)
07367 {
07368 return Cudd_bddUnbindVar((DdManager *) mgr, index);
07369
07370 }
07371
07372
07380 int
07381 bdd_is_lazy_sift(bdd_manager *mgr)
07382 {
07383 Cudd_ReorderingType method;
07384
07385 Cudd_ReorderingStatus((DdManager *) mgr, &method);
07386 if (method == CUDD_REORDER_LAZY_SIFT)
07387 return(1);
07388 return(0);
07389
07390 }
07391
07392
07400 void
07401 bdd_discard_all_var_groups(bdd_manager *mgr)
07402 {
07403 Cudd_FreeTree((DdManager *) mgr);
07404
07405 }
07406
07407
07408
07409
07410
07411
07412
07413
07414
07415
07416
07426 static void
07427 InvalidType(FILE *file, const char *field, const char *expected)
07428 {
07429 (void) fprintf(file, "Warning: In parameter \"%s\"\n", field);
07430 (void) fprintf(file, "Illegal type detected. %s expected\n", expected);
07431
07432 }