1 /**CFile***********************************************************************
7 Synopsis [Functions for the C++ object-oriented encapsulation of CUDD.]
13 Author [Fabio Somenzi]
15 Copyright [Copyright (c) 1995-2004, Regents of the University of Colorado
19 Redistribution and use in source and binary forms, with or without
20 modification, are permitted provided that the following conditions
23 Redistributions of source code must retain the above copyright
24 notice, this list of conditions and the following disclaimer.
26 Redistributions in binary form must reproduce the above copyright
27 notice, this list of conditions and the following disclaimer in the
28 documentation and/or other materials provided with the distribution.
30 Neither the name of the University of Colorado nor the names of its
31 contributors may be used to endorse or promote products derived from
32 this software without specific prior written permission.
34 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
37 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
38 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
39 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
40 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
41 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
42 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
43 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
44 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
45 POSSIBILITY OF SUCH DAMAGE.]
47 ******************************************************************************/
51 // ---------------------------------------------------------------------------
52 // Variable declarations
53 // ---------------------------------------------------------------------------
56 static char rcsid
[] UTIL_UNUSED
= "$Id: cuddObj.cc,v 1.13 2009/02/21 19:41:38 fabio Exp fabio $";
59 // ---------------------------------------------------------------------------
60 // Members of class DD
61 // ---------------------------------------------------------------------------
64 DD::DD(Cudd
*ddManager
, DdNode
*ddNode
) {
67 if (node
!= 0) Cudd_Ref(node
);
68 if (ddMgr
->isVerbose()) {
69 cout
<< "Standard DD constructor for node " << hex
<< long(node
) <<
70 " ref = " << Cudd_Regular(node
)->ref
<< "\n";
83 DD::DD(const DD
&from
) {
88 if (ddMgr
->isVerbose()) {
89 cout
<< "Copy DD constructor for node " << hex
<< long(node
) <<
90 " ref = " << Cudd_Regular(node
)->ref
<< "\n";
101 DD::checkSameManager(
102 const DD
&other
) const
104 DdManager
*mgr
= ddMgr
->p
->manager
;
105 if (mgr
!= other
.ddMgr
->p
->manager
) {
106 ddMgr
->p
->errorHandler("Operands come from different manager.");
110 } // DD::checkSameManager
114 DD::checkReturnValue(
115 const DdNode
*result
) const
118 DdManager
*mgr
= ddMgr
->p
->manager
;
119 Cudd_ErrorType errType
= Cudd_ReadErrorCode(mgr
);
121 case CUDD_MEMORY_OUT
:
122 ddMgr
->p
->errorHandler("Out of memory.");
124 case CUDD_TOO_MANY_NODES
:
126 case CUDD_MAX_MEM_EXCEEDED
:
127 ddMgr
->p
->errorHandler("Maximum memory exceeded.");
129 case CUDD_INVALID_ARG
:
130 ddMgr
->p
->errorHandler("Invalid argument.");
132 case CUDD_INTERNAL_ERROR
:
133 ddMgr
->p
->errorHandler("Internal error.");
137 ddMgr
->p
->errorHandler("Unexpected error.");
142 } // DD::checkReturnValue
146 DD::checkReturnValue(
148 const int expected
) const
150 if (result
!= expected
) {
151 DdManager
*mgr
= ddMgr
->p
->manager
;
152 Cudd_ErrorType errType
= Cudd_ReadErrorCode(mgr
);
154 case CUDD_MEMORY_OUT
:
155 ddMgr
->p
->errorHandler("Out of memory.");
157 case CUDD_TOO_MANY_NODES
:
159 case CUDD_MAX_MEM_EXCEEDED
:
160 ddMgr
->p
->errorHandler("Maximum memory exceeded.");
162 case CUDD_INVALID_ARG
:
163 ddMgr
->p
->errorHandler("Invalid argument.");
165 case CUDD_INTERNAL_ERROR
:
166 ddMgr
->p
->errorHandler("Internal error.");
170 ddMgr
->p
->errorHandler("Unexpected error.");
175 } // DD::checkReturnValue
195 DD::nodeCount() const
197 return Cudd_DagSize(node
);
202 // ---------------------------------------------------------------------------
203 // Members of class ABDD
204 // ---------------------------------------------------------------------------
207 ABDD::ABDD(Cudd
*bddManager
, DdNode
*bddNode
) : DD(bddManager
,bddNode
) {}
208 ABDD::ABDD() : DD() {}
209 ABDD::ABDD(const ABDD
&from
) : DD(from
) {}
214 Cudd_RecursiveDeref(ddMgr
->p
->manager
,node
);
215 if (ddMgr
->isVerbose()) {
216 cout
<< "ADD/BDD destructor called for node " << hex
<<
217 long(node
) << " ref = " << Cudd_Regular(node
)->ref
<< "\n";
226 const ABDD
& other
) const
228 this->checkSameManager(other
);
229 return node
== other
.node
;
231 } // ABDD::operator==
236 const ABDD
& other
) const
238 this->checkSameManager(other
);
239 return node
!= other
.node
;
241 } // ABDD::operator!=
250 int retval
= Cudd_PrintDebug(ddMgr
->p
->manager
,node
,nvars
,verbosity
);
251 if (retval
== 0) ddMgr
->p
->errorHandler("print failed");
256 // ---------------------------------------------------------------------------
257 // Members of class BDD
258 // ---------------------------------------------------------------------------
260 BDD::BDD(Cudd
*bddManager
, DdNode
*bddNode
) : ABDD(bddManager
,bddNode
) {}
261 BDD::BDD() : ABDD() {}
262 BDD::BDD(const BDD
&from
) : ABDD(from
) {}
267 const BDD
& other
) const
269 this->checkSameManager(other
);
270 return node
== other
.node
;
277 const BDD
& other
) const
279 this->checkSameManager(other
);
280 return node
!= other
.node
;
289 if (this == &right
) return *this;
290 if (right
.node
!= 0) Cudd_Ref(right
.node
);
292 Cudd_RecursiveDeref(ddMgr
->p
->manager
,node
);
293 if (ddMgr
->isVerbose()) {
294 cout
<< "BDD dereferencing for node " << hex
<< long(node
) <<
295 " ref = " << Cudd_Regular(node
)->ref
<< "\n";
300 if (node
!= 0 && ddMgr
->isVerbose()) {
301 cout
<< "BDD assignment for node " << hex
<< long(node
) <<
302 " ref = " << Cudd_Regular(node
)->ref
<< "\n";
311 const BDD
& other
) const
313 DdManager
*mgr
= this->checkSameManager(other
);
314 return Cudd_bddLeq(mgr
,node
,other
.node
);
321 const BDD
& other
) const
323 DdManager
*mgr
= this->checkSameManager(other
);
324 return Cudd_bddLeq(mgr
,other
.node
,node
);
331 const BDD
& other
) const
333 DdManager
*mgr
= this->checkSameManager(other
);
334 return node
!= other
.node
&& Cudd_bddLeq(mgr
,node
,other
.node
);
341 const BDD
& other
) const
343 DdManager
*mgr
= this->checkSameManager(other
);
344 return node
!= other
.node
&& Cudd_bddLeq(mgr
,other
.node
,node
);
350 BDD::operator!() const
352 return BDD(ddMgr
, Cudd_Not(node
));
358 BDD::operator~() const
360 return BDD(ddMgr
, Cudd_Not(node
));
367 const BDD
& other
) const
369 DdManager
*mgr
= this->checkSameManager(other
);
370 DdNode
*result
= Cudd_bddAnd(mgr
,node
,other
.node
);
371 this->checkReturnValue(result
);
372 return BDD(ddMgr
, result
);
381 DdManager
*mgr
= this->checkSameManager(other
);
382 DdNode
*result
= Cudd_bddAnd(mgr
,node
,other
.node
);
383 this->checkReturnValue(result
);
385 Cudd_RecursiveDeref(mgr
,node
);
394 const BDD
& other
) const
396 DdManager
*mgr
= this->checkSameManager(other
);
397 DdNode
*result
= Cudd_bddAnd(mgr
,node
,other
.node
);
398 this->checkReturnValue(result
);
399 return BDD(ddMgr
, result
);
408 DdManager
*mgr
= this->checkSameManager(other
);
409 DdNode
*result
= Cudd_bddAnd(mgr
,node
,other
.node
);
410 this->checkReturnValue(result
);
412 Cudd_RecursiveDeref(mgr
,node
);
421 const BDD
& other
) const
423 DdManager
*mgr
= this->checkSameManager(other
);
424 DdNode
*result
= Cudd_bddOr(mgr
,node
,other
.node
);
425 this->checkReturnValue(result
);
426 return BDD(ddMgr
, result
);
435 DdManager
*mgr
= this->checkSameManager(other
);
436 DdNode
*result
= Cudd_bddOr(mgr
,node
,other
.node
);
437 this->checkReturnValue(result
);
439 Cudd_RecursiveDeref(mgr
,node
);
448 const BDD
& other
) const
450 DdManager
*mgr
= this->checkSameManager(other
);
451 DdNode
*result
= Cudd_bddOr(mgr
,node
,other
.node
);
452 this->checkReturnValue(result
);
453 return BDD(ddMgr
, result
);
462 DdManager
*mgr
= this->checkSameManager(other
);
463 DdNode
*result
= Cudd_bddOr(mgr
,node
,other
.node
);
464 this->checkReturnValue(result
);
466 Cudd_RecursiveDeref(mgr
,node
);
475 const BDD
& other
) const
477 DdManager
*mgr
= this->checkSameManager(other
);
478 DdNode
*result
= Cudd_bddXor(mgr
,node
,other
.node
);
479 this->checkReturnValue(result
);
480 return BDD(ddMgr
, result
);
489 DdManager
*mgr
= this->checkSameManager(other
);
490 DdNode
*result
= Cudd_bddXor(mgr
,node
,other
.node
);
491 this->checkReturnValue(result
);
493 Cudd_RecursiveDeref(mgr
,node
);
502 const BDD
& other
) const
504 DdManager
*mgr
= this->checkSameManager(other
);
505 DdNode
*result
= Cudd_bddAnd(mgr
,node
,Cudd_Not(other
.node
));
506 this->checkReturnValue(result
);
507 return BDD(ddMgr
, result
);
516 DdManager
*mgr
= this->checkSameManager(other
);
517 DdNode
*result
= Cudd_bddAnd(mgr
,node
,Cudd_Not(other
.node
));
518 this->checkReturnValue(result
);
520 Cudd_RecursiveDeref(mgr
,node
);
527 // ---------------------------------------------------------------------------
528 // Members of class ADD
529 // ---------------------------------------------------------------------------
532 ADD::ADD(Cudd
*bddManager
, DdNode
*bddNode
) : ABDD(bddManager
,bddNode
) {}
533 ADD::ADD() : ABDD() {}
534 ADD::ADD(const ADD
&from
) : ABDD(from
) {}
539 const ADD
& other
) const
541 this->checkSameManager(other
);
542 return node
== other
.node
;
549 const ADD
& other
) const
551 this->checkSameManager(other
);
552 return node
!= other
.node
;
561 if (this == &right
) return *this;
562 if (right
.node
!= 0) Cudd_Ref(right
.node
);
564 Cudd_RecursiveDeref(ddMgr
->p
->manager
,node
);
575 const ADD
& other
) const
577 DdManager
*mgr
= this->checkSameManager(other
);
578 return Cudd_addLeq(mgr
,node
,other
.node
);
585 const ADD
& other
) const
587 DdManager
*mgr
= this->checkSameManager(other
);
588 return Cudd_addLeq(mgr
,other
.node
,node
);
595 const ADD
& other
) const
597 DdManager
*mgr
= this->checkSameManager(other
);
598 return node
!= other
.node
&& Cudd_addLeq(mgr
,node
,other
.node
);
605 const ADD
& other
) const
607 DdManager
*mgr
= this->checkSameManager(other
);
608 return node
!= other
.node
&& Cudd_addLeq(mgr
,other
.node
,node
);
614 ADD::operator-() const
616 return ADD(ddMgr
, Cudd_addNegate(ddMgr
->p
->manager
,node
));
623 const ADD
& other
) const
625 DdManager
*mgr
= this->checkSameManager(other
);
626 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addTimes
,node
,other
.node
);
627 this->checkReturnValue(result
);
628 return ADD(ddMgr
, result
);
637 DdManager
*mgr
= this->checkSameManager(other
);
638 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addTimes
,node
,other
.node
);
639 this->checkReturnValue(result
);
641 Cudd_RecursiveDeref(mgr
,node
);
650 const ADD
& other
) const
652 DdManager
*mgr
= this->checkSameManager(other
);
653 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addPlus
,node
,other
.node
);
654 this->checkReturnValue(result
);
655 return ADD(ddMgr
, result
);
664 DdManager
*mgr
= this->checkSameManager(other
);
665 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addPlus
,node
,other
.node
);
666 this->checkReturnValue(result
);
668 Cudd_RecursiveDeref(mgr
,node
);
677 const ADD
& other
) const
679 DdManager
*mgr
= this->checkSameManager(other
);
680 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addMinus
,node
,other
.node
);
681 this->checkReturnValue(result
);
682 return ADD(ddMgr
, result
);
691 DdManager
*mgr
= this->checkSameManager(other
);
692 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addMinus
,node
,other
.node
);
693 this->checkReturnValue(result
);
695 Cudd_RecursiveDeref(mgr
,node
);
703 ADD::operator~() const
705 return ADD(ddMgr
, Cudd_addCmpl(ddMgr
->p
->manager
,node
));
712 const ADD
& other
) const
714 DdManager
*mgr
= this->checkSameManager(other
);
715 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addTimes
,node
,other
.node
);
716 this->checkReturnValue(result
);
717 return ADD(ddMgr
, result
);
726 DdManager
*mgr
= this->checkSameManager(other
);
727 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addTimes
,node
,other
.node
);
728 this->checkReturnValue(result
);
730 Cudd_RecursiveDeref(mgr
,node
);
739 const ADD
& other
) const
741 DdManager
*mgr
= this->checkSameManager(other
);
742 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addOr
,node
,other
.node
);
743 this->checkReturnValue(result
);
744 return ADD(ddMgr
, result
);
753 DdManager
*mgr
= this->checkSameManager(other
);
754 DdNode
*result
= Cudd_addApply(mgr
,Cudd_addOr
,node
,other
.node
);
755 this->checkReturnValue(result
);
757 Cudd_RecursiveDeref(mgr
,node
);
764 // ---------------------------------------------------------------------------
765 // Members of class ZDD
766 // ---------------------------------------------------------------------------
769 ZDD::ZDD(Cudd
*bddManager
, DdNode
*bddNode
) : DD(bddManager
,bddNode
) {}
771 ZDD::ZDD(const ZDD
&from
) : DD(from
) {}
776 Cudd_RecursiveDerefZdd(ddMgr
->p
->manager
,node
);
777 if (ddMgr
->isVerbose()) {
778 cout
<< "ZDD destructor called for node " << hex
<< long(node
) <<
779 " ref = " << Cudd_Regular(node
)->ref
<< "\n";
790 if (this == &right
) return *this;
791 if (right
.node
!= 0) Cudd_Ref(right
.node
);
793 Cudd_RecursiveDerefZdd(ddMgr
->p
->manager
,node
);
794 if (ddMgr
->isVerbose()) {
795 cout
<< "ZDD dereferencing for node " << hex
<< long(node
) <<
796 " ref = " << node
->ref
<< "\n";
801 if (node
!= 0 && ddMgr
->isVerbose()) {
802 cout
<< "ZDD assignment for node " << hex
<< long(node
) <<
803 " ref = " << node
->ref
<< "\n";
812 const ZDD
& other
) const
814 this->checkSameManager(other
);
815 return node
== other
.node
;
822 const ZDD
& other
) const
824 this->checkSameManager(other
);
825 return node
!= other
.node
;
832 const ZDD
& other
) const
834 DdManager
*mgr
= this->checkSameManager(other
);
835 return Cudd_zddDiffConst(mgr
,node
,other
.node
) == Cudd_ReadZero(mgr
);
842 const ZDD
& other
) const
844 DdManager
*mgr
= this->checkSameManager(other
);
845 return Cudd_zddDiffConst(mgr
,other
.node
,node
) == Cudd_ReadZero(mgr
);
852 const ZDD
& other
) const
854 DdManager
*mgr
= this->checkSameManager(other
);
855 return node
!= other
.node
&&
856 Cudd_zddDiffConst(mgr
,node
,other
.node
) == Cudd_ReadZero(mgr
);
863 const ZDD
& other
) const
865 DdManager
*mgr
= this->checkSameManager(other
);
866 return node
!= other
.node
&&
867 Cudd_zddDiffConst(mgr
,other
.node
,node
) == Cudd_ReadZero(mgr
);
878 int retval
= Cudd_zddPrintDebug(ddMgr
->p
->manager
,node
,nvars
,verbosity
);
879 if (retval
== 0) ddMgr
->p
->errorHandler("print failed");
886 const ZDD
& other
) const
888 DdManager
*mgr
= this->checkSameManager(other
);
889 DdNode
*result
= Cudd_zddIntersect(mgr
,node
,other
.node
);
890 this->checkReturnValue(result
);
891 return ZDD(ddMgr
, result
);
900 DdManager
*mgr
= this->checkSameManager(other
);
901 DdNode
*result
= Cudd_zddIntersect(mgr
,node
,other
.node
);
902 this->checkReturnValue(result
);
904 Cudd_RecursiveDerefZdd(mgr
,node
);
913 const ZDD
& other
) const
915 DdManager
*mgr
= this->checkSameManager(other
);
916 DdNode
*result
= Cudd_zddIntersect(mgr
,node
,other
.node
);
917 this->checkReturnValue(result
);
918 return ZDD(ddMgr
, result
);
927 DdManager
*mgr
= this->checkSameManager(other
);
928 DdNode
*result
= Cudd_zddIntersect(mgr
,node
,other
.node
);
929 this->checkReturnValue(result
);
931 Cudd_RecursiveDerefZdd(mgr
,node
);
940 const ZDD
& other
) const
942 DdManager
*mgr
= this->checkSameManager(other
);
943 DdNode
*result
= Cudd_zddUnion(mgr
,node
,other
.node
);
944 this->checkReturnValue(result
);
945 return ZDD(ddMgr
, result
);
954 DdManager
*mgr
= this->checkSameManager(other
);
955 DdNode
*result
= Cudd_zddUnion(mgr
,node
,other
.node
);
956 this->checkReturnValue(result
);
958 Cudd_RecursiveDerefZdd(mgr
,node
);
967 const ZDD
& other
) const
969 DdManager
*mgr
= this->checkSameManager(other
);
970 DdNode
*result
= Cudd_zddUnion(mgr
,node
,other
.node
);
971 this->checkReturnValue(result
);
972 return ZDD(ddMgr
, result
);
981 DdManager
*mgr
= this->checkSameManager(other
);
982 DdNode
*result
= Cudd_zddUnion(mgr
,node
,other
.node
);
983 this->checkReturnValue(result
);
985 Cudd_RecursiveDerefZdd(mgr
,node
);
994 const ZDD
& other
) const
996 DdManager
*mgr
= this->checkSameManager(other
);
997 DdNode
*result
= Cudd_zddDiff(mgr
,node
,other
.node
);
998 this->checkReturnValue(result
);
999 return ZDD(ddMgr
, result
);
1008 DdManager
*mgr
= this->checkSameManager(other
);
1009 DdNode
*result
= Cudd_zddDiff(mgr
,node
,other
.node
);
1010 this->checkReturnValue(result
);
1012 Cudd_RecursiveDerefZdd(mgr
,node
);
1016 } // ZDD::operator-=
1019 // ---------------------------------------------------------------------------
1020 // Members of class Cudd
1021 // ---------------------------------------------------------------------------
1025 unsigned int numVars
,
1026 unsigned int numVarsZ
,
1027 unsigned int numSlots
,
1028 unsigned int cacheSize
,
1029 unsigned long maxMemory
)
1032 p
->manager
= Cudd_Init(numVars
,numVarsZ
,numSlots
,cacheSize
,maxMemory
);
1033 p
->errorHandler
= defaultError
;
1034 p
->verbose
= 0; // initially terse
1051 if (--p
->ref
== 0) {
1052 int retval
= Cudd_CheckZeroRef(p
->manager
);
1054 cerr
<< retval
<< " unexpected non-zero reference counts\n";
1055 } else if (p
->verbose
) {
1056 cerr
<< "All went well\n";
1058 Cudd_Quit(p
->manager
);
1070 if (--p
->ref
== 0) { // disconnect self
1071 int retval
= Cudd_CheckZeroRef(p
->manager
);
1073 cerr
<< retval
<< " unexpected non-zero reference counts\n";
1075 Cudd_Quit(p
->manager
);
1081 } // Cudd::operator=
1088 PFC oldHandler
= p
->errorHandler
;
1089 p
->errorHandler
= newHandler
;
1092 } // Cudd::setHandler
1096 Cudd::getHandler() const
1098 return p
->errorHandler
;
1100 } // Cudd::getHandler
1104 Cudd::checkReturnValue(
1105 const DdNode
*result
) const
1108 if (Cudd_ReadErrorCode(p
->manager
) == CUDD_MEMORY_OUT
) {
1109 p
->errorHandler("Out of memory.");
1111 p
->errorHandler("Internal error.");
1115 } // Cudd::checkReturnValue
1119 Cudd::checkReturnValue(
1120 const int result
) const
1123 if (Cudd_ReadErrorCode(p
->manager
) == CUDD_MEMORY_OUT
) {
1124 p
->errorHandler("Out of memory.");
1126 p
->errorHandler("Internal error.");
1130 } // Cudd::checkReturnValue
1137 int retval
= Cudd_PrintInfo(p
->manager
,stdout
);
1138 this->checkReturnValue(retval
);
1146 DdNode
*result
= Cudd_bddNewVar(p
->manager
);
1147 this->checkReturnValue(result
);
1148 return BDD(this, result
);
1157 DdNode
*result
= Cudd_bddIthVar(p
->manager
,index
);
1158 this->checkReturnValue(result
);
1159 return BDD(this, result
);
1167 DdNode
*result
= Cudd_ReadOne(p
->manager
);
1168 this->checkReturnValue(result
);
1169 return BDD(this, result
);
1177 DdNode
*result
= Cudd_ReadLogicZero(p
->manager
);
1178 this->checkReturnValue(result
);
1179 return BDD(this, result
);
1187 DdNode
*result
= Cudd_addNewVar(p
->manager
);
1188 this->checkReturnValue(result
);
1189 return ADD(this, result
);
1198 DdNode
*result
= Cudd_addIthVar(p
->manager
,index
);
1199 this->checkReturnValue(result
);
1200 return ADD(this, result
);
1208 DdNode
*result
= Cudd_ReadOne(p
->manager
);
1209 this->checkReturnValue(result
);
1210 return ADD(this, result
);
1218 DdNode
*result
= Cudd_ReadZero(p
->manager
);
1219 this->checkReturnValue(result
);
1220 return ADD(this, result
);
1229 DdNode
*result
= Cudd_addConst(p
->manager
, c
);
1230 this->checkReturnValue(result
);
1231 return ADD(this, result
);
1237 Cudd::plusInfinity()
1239 DdNode
*result
= Cudd_ReadPlusInfinity(p
->manager
);
1240 this->checkReturnValue(result
);
1241 return ADD(this, result
);
1243 } // Cudd::plusInfinity
1247 Cudd::minusInfinity()
1249 DdNode
*result
= Cudd_ReadMinusInfinity(p
->manager
);
1250 this->checkReturnValue(result
);
1251 return ADD(this, result
);
1253 } // Cudd::minusInfinity
1260 DdNode
*result
= Cudd_zddIthVar(p
->manager
,index
);
1261 this->checkReturnValue(result
);
1262 return ZDD(this, result
);
1271 DdNode
*result
= Cudd_ReadZddOne(p
->manager
,i
);
1272 this->checkReturnValue(result
);
1273 return ZDD(this, result
);
1281 DdNode
*result
= Cudd_ReadZero(p
->manager
);
1282 this->checkReturnValue(result
);
1283 return ZDD(this, result
);
1292 cerr
<< message
<< "\n";
1298 // ---------------------------------------------------------------------------
1299 // Members of class BDDvector
1300 // ---------------------------------------------------------------------------
1303 BDDvector::BDDvector(int size
, Cudd
*manager
, DdNode
**nodes
)
1305 if (manager
== 0 && nodes
!= 0) defaultError("Nodes with no manager");
1308 p
->manager
= manager
;
1309 p
->vect
= new BDD
[size
];
1311 for (int i
= 0; i
< size
; i
++) {
1315 p
->vect
[i
] = BDD(manager
, nodes
[i
]);
1318 if (manager
!= 0 && manager
->isVerbose()) {
1319 cout
<< "Standard BDDvector constructor for vector " << hex
<< long(p
)
1323 } // BDDvector::BDDvector
1326 BDDvector::BDDvector(const BDDvector
&from
)
1330 if (p
->manager
!= 0 && p
->manager
->isVerbose()) {
1331 cout
<< "Copy BDDvector constructor for vector " << hex
<< long(p
)
1335 } // BDDvector::BDDvector
1338 BDDvector::~BDDvector()
1340 if (p
->manager
!= 0 && p
->manager
->isVerbose()) {
1341 cout
<< "BDDvector destructor for vector " << hex
<< long(p
) <<
1342 " ref = " << p
->ref
<< "\n";
1344 if (--p
->ref
== 0) {
1349 } // BDDvector::~BDDvector
1353 BDDvector::operator=(
1354 const BDDvector
& right
)
1357 if (--p
->ref
== 0) { // disconnect self
1358 for (int i
= 1; i
< p
->size
; i
++) {
1359 delete &(p
->vect
[i
]);
1367 } // BDDvector::operator=
1371 BDDvector::operator[](int i
) const
1374 (p
->manager
->getHandler())("Out-of-bounds access attempted");
1377 } // BDDvector::operator[]
1380 // ---------------------------------------------------------------------------
1381 // Members of class ADDvector
1382 // ---------------------------------------------------------------------------
1385 ADDvector::ADDvector(int size
, Cudd
*manager
, DdNode
**nodes
)
1387 if (manager
== 0 && nodes
!= 0) defaultError("Nodes with no manager");
1390 p
->manager
= manager
;
1391 p
->vect
= new ADD
[size
];
1393 for (int i
= 0; i
< size
; i
++) {
1397 p
->vect
[i
] = ADD(manager
, nodes
[i
]);
1400 if (manager
!= 0 && manager
->isVerbose()) {
1401 cout
<< "Standard ADDvector constructor for vector " << hex
<< long(p
)
1405 } // ADDvector::ADDvector
1408 ADDvector::ADDvector(const ADDvector
&from
)
1412 if (p
->manager
!= 0 && p
->manager
->isVerbose()) {
1413 cout
<< "Copy ADDvector constructor for vector " << hex
<< long(p
)
1417 } // ADDvector::ADDvector
1420 ADDvector::~ADDvector()
1422 if (p
->manager
!= 0 && p
->manager
->isVerbose()) {
1423 cout
<< "ADDvector destructor for vector " << hex
<< long(p
) <<
1424 " ref = " << p
->ref
<< "\n";
1426 if (--p
->ref
== 0) {
1431 } // ADDvector::~ADDvector
1435 ADDvector::operator=(
1436 const ADDvector
& right
)
1439 if (--p
->ref
== 0) { // disconnect self
1440 for (int i
= 1; i
< p
->size
; i
++) {
1441 delete &(p
->vect
[i
]);
1449 } // ADDvector::operator=
1453 ADDvector::operator[](int i
) const
1456 (p
->manager
->getHandler())("Out-of-bounds access attempted");
1459 } // ADDvector::operator[]
1462 // ---------------------------------------------------------------------------
1463 // Members of class ZDDvector
1464 // ---------------------------------------------------------------------------
1467 ZDDvector::ZDDvector(int size
, Cudd
*manager
, DdNode
**nodes
)
1469 if (manager
== 0 && nodes
!= 0) defaultError("Nodes with no manager");
1472 p
->manager
= manager
;
1473 p
->vect
= new ZDD
[size
];
1475 for (int i
= 0; i
< size
; i
++) {
1479 p
->vect
[i
] = ZDD(manager
, nodes
[i
]);
1482 if (manager
!= 0 && manager
->isVerbose()) {
1483 cout
<< "Standard ZDDvector constructor for vector " << hex
<< long(p
)
1487 } // ZDDvector::ZDDvector
1490 ZDDvector::ZDDvector(const ZDDvector
&from
)
1494 if (p
->manager
!= 0 && p
->manager
->isVerbose()) {
1495 cout
<< "Copy ZDDvector constructor for vector " << hex
<< long(p
)
1499 } // ZDDvector::ZDDvector
1502 ZDDvector::~ZDDvector()
1504 if (p
->manager
!= 0 && p
->manager
->isVerbose()) {
1505 cout
<< "ZDDvector destructor for vector " << hex
<< long(p
) <<
1506 " ref = " << p
->ref
<< "\n";
1508 if (--p
->ref
== 0) {
1513 } // ZDDvector::~ZDDvector
1517 ZDDvector::operator=(
1518 const ZDDvector
& right
)
1521 if (--p
->ref
== 0) { // disconnect self
1522 for (int i
= 1; i
< p
->size
; i
++) {
1523 delete &(p
->vect
[i
]);
1531 } // ZDDvector::operator=
1535 ZDDvector::operator[](int i
) const
1538 (p
->manager
->getHandler())("Out-of-bounds access attempted");
1541 } // ZDDvector::operator[]
1544 // ---------------------------------------------------------------------------
1546 // ---------------------------------------------------------------------------
1550 Cudd::addNewVarAtLevel(
1553 DdNode
*result
= Cudd_addNewVarAtLevel(p
->manager
, level
);
1554 this->checkReturnValue(result
);
1555 return ADD(this, result
);
1557 } // Cudd::addNewVarAtLevel
1561 Cudd::bddNewVarAtLevel(
1564 DdNode
*result
= Cudd_bddNewVarAtLevel(p
->manager
, level
);
1565 this->checkReturnValue(result
);
1566 return BDD(this, result
);
1568 } // Cudd::bddNewVarAtLevel
1572 Cudd::zddVarsFromBddVars(
1575 int result
= Cudd_zddVarsFromBddVars(p
->manager
, multiplicity
);
1576 this->checkReturnValue(result
);
1578 } // Cudd::zddVarsFromBddVars
1582 Cudd::AutodynEnable(
1583 Cudd_ReorderingType method
)
1585 Cudd_AutodynEnable(p
->manager
, method
);
1587 } // Cudd::AutodynEnable
1591 Cudd::AutodynDisable()
1593 Cudd_AutodynDisable(p
->manager
);
1595 } // Cudd::AutodynDisable
1599 Cudd::ReorderingStatus(
1600 Cudd_ReorderingType
* method
) const
1602 return Cudd_ReorderingStatus(p
->manager
, method
);
1604 } // Cudd::ReorderingStatus
1608 Cudd::AutodynEnableZdd(
1609 Cudd_ReorderingType method
)
1611 Cudd_AutodynEnableZdd(p
->manager
, method
);
1613 } // Cudd::AutodynEnableZdd
1617 Cudd::AutodynDisableZdd()
1619 Cudd_AutodynDisableZdd(p
->manager
);
1621 } // Cudd::AutodynDisableZdd
1625 Cudd::ReorderingStatusZdd(
1626 Cudd_ReorderingType
* method
) const
1628 return Cudd_ReorderingStatusZdd(p
->manager
, method
);
1630 } // Cudd::ReorderingStatusZdd
1634 Cudd::zddRealignmentEnabled() const
1636 return Cudd_zddRealignmentEnabled(p
->manager
);
1638 } // Cudd::zddRealignmentEnabled
1642 Cudd::zddRealignEnable()
1644 Cudd_zddRealignEnable(p
->manager
);
1646 } // Cudd::zddRealignEnable
1650 Cudd::zddRealignDisable()
1652 Cudd_zddRealignDisable(p
->manager
);
1654 } // Cudd::zddRealignDisable
1658 Cudd::bddRealignmentEnabled() const
1660 return Cudd_bddRealignmentEnabled(p
->manager
);
1662 } // Cudd::bddRealignmentEnabled
1666 Cudd::bddRealignEnable()
1668 Cudd_bddRealignEnable(p
->manager
);
1670 } // Cudd::bddRealignEnable
1674 Cudd::bddRealignDisable()
1676 Cudd_bddRealignDisable(p
->manager
);
1678 } // Cudd::bddRealignDisable
1684 DdNode
*result
= Cudd_ReadBackground(p
->manager
);
1685 this->checkReturnValue(result
);
1686 return ADD(this, result
);
1688 } // Cudd::background
1692 Cudd::SetBackground(
1695 DdManager
*mgr
= p
->manager
;
1696 if (mgr
!= bg
.manager()->p
->manager
) {
1697 p
->errorHandler("Background comes from different manager.");
1699 Cudd_SetBackground(mgr
, bg
.getNode());
1701 } // Cudd::SetBackground
1705 Cudd::ReadCacheSlots() const
1707 return Cudd_ReadCacheSlots(p
->manager
);
1709 } // Cudd::ReadCacheSlots
1713 Cudd::ReadCacheLookUps() const
1715 return Cudd_ReadCacheLookUps(p
->manager
);
1717 } // Cudd::ReadCacheLookUps
1721 Cudd::ReadCacheUsedSlots() const
1723 return Cudd_ReadCacheUsedSlots(p
->manager
);
1725 } // Cudd::ReadCacheUsedSlots
1729 Cudd::ReadCacheHits() const
1731 return Cudd_ReadCacheHits(p
->manager
);
1733 } // Cudd::ReadCacheHits
1737 Cudd::ReadMinHit() const
1739 return Cudd_ReadMinHit(p
->manager
);
1741 } // Cudd::ReadMinHit
1748 Cudd_SetMinHit(p
->manager
, hr
);
1750 } // Cudd::SetMinHit
1754 Cudd::ReadLooseUpTo() const
1756 return Cudd_ReadLooseUpTo(p
->manager
);
1758 } // Cudd::ReadLooseUpTo
1765 Cudd_SetLooseUpTo(p
->manager
, lut
);
1767 } // Cudd::SetLooseUpTo
1771 Cudd::ReadMaxCache() const
1773 return Cudd_ReadMaxCache(p
->manager
);
1775 } // Cudd::ReadMaxCache
1779 Cudd::ReadMaxCacheHard() const
1781 return Cudd_ReadMaxCacheHard(p
->manager
);
1783 } // Cudd::ReadMaxCacheHard
1787 Cudd::SetMaxCacheHard(
1790 Cudd_SetMaxCacheHard(p
->manager
, mc
);
1792 } // Cudd::SetMaxCacheHard
1796 Cudd::ReadSize() const
1798 return Cudd_ReadSize(p
->manager
);
1804 Cudd::ReadZddSize() const
1806 return Cudd_ReadZddSize(p
->manager
);
1808 } // Cudd::ReadZddSize
1812 Cudd::ReadSlots() const
1814 return Cudd_ReadSlots(p
->manager
);
1816 } // Cudd::ReadSlots
1820 Cudd::ReadKeys() const
1822 return Cudd_ReadKeys(p
->manager
);
1828 Cudd::ReadDead() const
1830 return Cudd_ReadDead(p
->manager
);
1836 Cudd::ReadMinDead() const
1838 return Cudd_ReadMinDead(p
->manager
);
1840 } // Cudd::ReadMinDead
1844 Cudd::ReadReorderings() const
1846 return Cudd_ReadReorderings(p
->manager
);
1848 } // Cudd::ReadReorderings
1852 Cudd::ReadReorderingTime() const
1854 return Cudd_ReadReorderingTime(p
->manager
);
1856 } // Cudd::ReadReorderingTime
1860 Cudd::ReadGarbageCollections() const
1862 return Cudd_ReadGarbageCollections(p
->manager
);
1864 } // Cudd::ReadGarbageCollections
1868 Cudd::ReadGarbageCollectionTime() const
1870 return Cudd_ReadGarbageCollectionTime(p
->manager
);
1872 } // Cudd::ReadGarbageCollectionTime
1876 Cudd::ReadSiftMaxVar() const
1878 return Cudd_ReadSiftMaxVar(p
->manager
);
1880 } // Cudd::ReadSiftMaxVar
1884 Cudd::SetSiftMaxVar(
1887 Cudd_SetSiftMaxVar(p
->manager
, smv
);
1889 } // Cudd::SetSiftMaxVar
1893 Cudd::ReadSiftMaxSwap() const
1895 return Cudd_ReadSiftMaxSwap(p
->manager
);
1897 } // Cudd::ReadSiftMaxSwap
1901 Cudd::SetSiftMaxSwap(
1904 Cudd_SetSiftMaxSwap(p
->manager
, sms
);
1906 } // Cudd::SetSiftMaxSwap
1910 Cudd::ReadMaxGrowth() const
1912 return Cudd_ReadMaxGrowth(p
->manager
);
1914 } // Cudd::ReadMaxGrowth
1921 Cudd_SetMaxGrowth(p
->manager
, mg
);
1923 } // Cudd::SetMaxGrowth
1927 Cudd::ReadTree() const
1929 return Cudd_ReadTree(p
->manager
);
1938 Cudd_SetTree(p
->manager
, tree
);
1946 Cudd_FreeTree(p
->manager
);
1952 Cudd::ReadZddTree() const
1954 return Cudd_ReadZddTree(p
->manager
);
1956 } // Cudd::ReadZddTree
1963 Cudd_SetZddTree(p
->manager
, tree
);
1965 } // Cudd::SetZddTree
1971 Cudd_FreeZddTree(p
->manager
);
1973 } // Cudd::FreeZddTree
1977 DD::NodeReadIndex() const
1979 return Cudd_NodeReadIndex(node
);
1981 } // DD::NodeReadIndex
1988 return Cudd_ReadPerm(p
->manager
, i
);
1997 return Cudd_ReadPermZdd(p
->manager
, i
);
1999 } // Cudd::ReadPermZdd
2006 return Cudd_ReadInvPerm(p
->manager
, i
);
2008 } // Cudd::ReadInvPerm
2012 Cudd::ReadInvPermZdd(
2015 return Cudd_ReadInvPermZdd(p
->manager
, i
);
2017 } // Cudd::ReadInvPermZdd
2024 DdNode
*result
= Cudd_ReadVars(p
->manager
, i
);
2025 this->checkReturnValue(result
);
2026 return BDD(this, result
);
2032 Cudd::ReadEpsilon() const
2034 return Cudd_ReadEpsilon(p
->manager
);
2036 } // Cudd::ReadEpsilon
2043 Cudd_SetEpsilon(p
->manager
, ep
);
2045 } // Cudd::SetEpsilon
2048 Cudd_AggregationType
2049 Cudd::ReadGroupcheck() const
2051 return Cudd_ReadGroupcheck(p
->manager
);
2053 } // Cudd::ReadGroupcheck
2057 Cudd::SetGroupcheck(
2058 Cudd_AggregationType gc
)
2060 Cudd_SetGroupcheck(p
->manager
, gc
);
2062 } // Cudd::SetGroupcheck
2066 Cudd::GarbageCollectionEnabled() const
2068 return Cudd_GarbageCollectionEnabled(p
->manager
);
2070 } // Cudd::GarbageCollectionEnabled
2074 Cudd::EnableGarbageCollection()
2076 Cudd_EnableGarbageCollection(p
->manager
);
2078 } // Cudd::EnableGarbageCollection
2082 Cudd::DisableGarbageCollection()
2084 Cudd_DisableGarbageCollection(p
->manager
);
2086 } // Cudd::DisableGarbageCollection
2090 Cudd::DeadAreCounted() const
2092 return Cudd_DeadAreCounted(p
->manager
);
2094 } // Cudd::DeadAreCounted
2098 Cudd::TurnOnCountDead()
2100 Cudd_TurnOnCountDead(p
->manager
);
2102 } // Cudd::TurnOnCountDead
2106 Cudd::TurnOffCountDead()
2108 Cudd_TurnOffCountDead(p
->manager
);
2110 } // Cudd::TurnOffCountDead
2114 Cudd::ReadRecomb() const
2116 return Cudd_ReadRecomb(p
->manager
);
2118 } // Cudd::ReadRecomb
2125 Cudd_SetRecomb(p
->manager
, recomb
);
2127 } // Cudd::SetRecomb
2131 Cudd::ReadSymmviolation() const
2133 return Cudd_ReadSymmviolation(p
->manager
);
2135 } // Cudd::ReadSymmviolation
2139 Cudd::SetSymmviolation(
2142 Cudd_SetSymmviolation(p
->manager
, symmviolation
);
2144 } // Cudd::SetSymmviolation
2148 Cudd::ReadArcviolation() const
2150 return Cudd_ReadArcviolation(p
->manager
);
2152 } // Cudd::ReadArcviolation
2156 Cudd::SetArcviolation(
2159 Cudd_SetArcviolation(p
->manager
, arcviolation
);
2161 } // Cudd::SetArcviolation
2165 Cudd::ReadPopulationSize() const
2167 return Cudd_ReadPopulationSize(p
->manager
);
2169 } // Cudd::ReadPopulationSize
2173 Cudd::SetPopulationSize(
2176 Cudd_SetPopulationSize(p
->manager
, populationSize
);
2178 } // Cudd::SetPopulationSize
2182 Cudd::ReadNumberXovers() const
2184 return Cudd_ReadNumberXovers(p
->manager
);
2186 } // Cudd::ReadNumberXovers
2190 Cudd::SetNumberXovers(
2193 Cudd_SetNumberXovers(p
->manager
, numberXovers
);
2195 } // Cudd::SetNumberXovers
2199 Cudd::ReadMemoryInUse() const
2201 return Cudd_ReadMemoryInUse(p
->manager
);
2203 } // Cudd::ReadMemoryInUse
2207 Cudd::ReadPeakNodeCount() const
2209 return Cudd_ReadPeakNodeCount(p
->manager
);
2211 } // Cudd::ReadPeakNodeCount
2215 Cudd::ReadNodeCount() const
2217 return Cudd_ReadNodeCount(p
->manager
);
2219 } // Cudd::ReadNodeCount
2223 Cudd::zddReadNodeCount() const
2225 return Cudd_zddReadNodeCount(p
->manager
);
2227 } // Cudd::zddReadNodeCount
2233 Cudd_HookType where
)
2235 int result
= Cudd_AddHook(p
->manager
, f
, where
);
2236 this->checkReturnValue(result
);
2244 Cudd_HookType where
)
2246 int result
= Cudd_RemoveHook(p
->manager
, f
, where
);
2247 this->checkReturnValue(result
);
2249 } // Cudd::RemoveHook
2255 Cudd_HookType where
) const
2257 return Cudd_IsInHook(p
->manager
, f
, where
);
2263 Cudd::EnableReorderingReporting()
2265 int result
= Cudd_EnableReorderingReporting(p
->manager
);
2266 this->checkReturnValue(result
);
2268 } // Cudd::EnableReorderingReporting
2272 Cudd::DisableReorderingReporting()
2274 int result
= Cudd_DisableReorderingReporting(p
->manager
);
2275 this->checkReturnValue(result
);
2277 } // Cudd::DisableReorderingReporting
2281 Cudd::ReorderingReporting()
2283 return Cudd_ReorderingReporting(p
->manager
);
2285 } // Cudd::ReorderingReporting
2289 Cudd::ReadErrorCode() const
2291 return Cudd_ReadErrorCode(p
->manager
);
2293 } // Cudd::ReadErrorCode
2297 Cudd::ClearErrorCode()
2299 Cudd_ClearErrorCode(p
->manager
);
2301 } // Cudd::ClearErrorCode
2305 Cudd::ReadStdout() const
2307 return Cudd_ReadStdout(p
->manager
);
2309 } // Cudd::ReadStdout
2313 Cudd::SetStdout(FILE *fp
)
2315 Cudd_SetStdout(p
->manager
, fp
);
2317 } // Cudd::SetStdout
2321 Cudd::ReadStderr() const
2323 return Cudd_ReadStderr(p
->manager
);
2325 } // Cudd::ReadStderr
2329 Cudd::SetStderr(FILE *fp
)
2331 Cudd_SetStderr(p
->manager
, fp
);
2333 } // Cudd::SetStderr
2337 Cudd::ReadNextReordering() const
2339 return Cudd_ReadNextReordering(p
->manager
);
2341 } // Cudd::ReadNextReordering
2345 Cudd::ReadSwapSteps() const
2347 return Cudd_ReadSwapSteps(p
->manager
);
2349 } // Cudd::ReadSwapSteps
2353 Cudd::ReadMaxLive() const
2355 return Cudd_ReadMaxLive(p
->manager
);
2357 } // Cudd::ReadMaxLive
2361 Cudd::SetMaxLive(unsigned int maxLive
)
2363 Cudd_SetMaxLive(p
->manager
, maxLive
);
2365 } // Cudd::SetMaxLive
2369 Cudd::ReadMaxMemory() const
2371 return Cudd_ReadMaxMemory(p
->manager
);
2373 } // Cudd::ReadMaxMemory
2377 Cudd::SetMaxMemory(unsigned long maxMem
)
2379 Cudd_SetMaxMemory(p
->manager
, maxMem
);
2381 } // Cudd::SetMaxMemory
2385 Cudd::bddBindVar(int index
)
2387 return Cudd_bddBindVar(p
->manager
, index
);
2389 } // Cudd::bddBindVar
2393 Cudd::bddUnbindVar(int index
)
2395 return Cudd_bddUnbindVar(p
->manager
, index
);
2397 } // Cudd::bddUnbindVar
2401 Cudd::bddVarIsBound(int index
) const
2403 return Cudd_bddVarIsBound(p
->manager
, index
);
2405 } // Cudd::bddVarIsBound
2410 const ADD
& cube
) const
2412 DdManager
*mgr
= this->checkSameManager(cube
);
2413 DdNode
*result
= Cudd_addExistAbstract(mgr
, node
, cube
.node
);
2414 this->checkReturnValue(result
);
2415 return ADD(ddMgr
, result
);
2417 } // ADD::ExistAbstract
2422 const ADD
& cube
) const
2424 DdManager
*mgr
= this->checkSameManager(cube
);
2425 DdNode
*result
= Cudd_addUnivAbstract(mgr
, node
, cube
.node
);
2426 this->checkReturnValue(result
);
2427 return ADD(ddMgr
, result
);
2429 } // ADD::UnivAbstract
2434 const ADD
& cube
) const
2436 DdManager
*mgr
= this->checkSameManager(cube
);
2437 DdNode
*result
= Cudd_addOrAbstract(mgr
, node
, cube
.node
);
2438 this->checkReturnValue(result
);
2439 return ADD(ddMgr
, result
);
2441 } // ADD::OrAbstract
2448 DdManager
*mgr
= this->checkSameManager(g
);
2449 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addPlus
, node
, g
.node
);
2450 this->checkReturnValue(result
);
2451 return ADD(ddMgr
, result
);
2460 DdManager
*mgr
= this->checkSameManager(g
);
2461 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addTimes
, node
, g
.node
);
2462 this->checkReturnValue(result
);
2463 return ADD(ddMgr
, result
);
2472 DdManager
*mgr
= this->checkSameManager(g
);
2473 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addThreshold
, node
, g
.node
);
2474 this->checkReturnValue(result
);
2475 return ADD(ddMgr
, result
);
2484 DdManager
*mgr
= this->checkSameManager(g
);
2485 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addSetNZ
, node
, g
.node
);
2486 this->checkReturnValue(result
);
2487 return ADD(ddMgr
, result
);
2496 DdManager
*mgr
= this->checkSameManager(g
);
2497 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addDivide
, node
, g
.node
);
2498 this->checkReturnValue(result
);
2499 return ADD(ddMgr
, result
);
2508 DdManager
*mgr
= this->checkSameManager(g
);
2509 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addMinus
, node
, g
.node
);
2510 this->checkReturnValue(result
);
2511 return ADD(ddMgr
, result
);
2520 DdManager
*mgr
= this->checkSameManager(g
);
2521 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addMinimum
, node
, g
.node
);
2522 this->checkReturnValue(result
);
2523 return ADD(ddMgr
, result
);
2532 DdManager
*mgr
= this->checkSameManager(g
);
2533 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addMaximum
, node
, g
.node
);
2534 this->checkReturnValue(result
);
2535 return ADD(ddMgr
, result
);
2541 ADD::OneZeroMaximum(
2544 DdManager
*mgr
= this->checkSameManager(g
);
2545 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addOneZeroMaximum
, node
, g
.node
);
2546 this->checkReturnValue(result
);
2547 return ADD(ddMgr
, result
);
2549 } // ADD::OneZeroMaximum
2556 DdManager
*mgr
= this->checkSameManager(g
);
2557 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addDiff
, node
, g
.node
);
2558 this->checkReturnValue(result
);
2559 return ADD(ddMgr
, result
);
2568 DdManager
*mgr
= this->checkSameManager(g
);
2569 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addAgreement
, node
, g
.node
);
2570 this->checkReturnValue(result
);
2571 return ADD(ddMgr
, result
);
2580 DdManager
*mgr
= this->checkSameManager(g
);
2581 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addOr
, node
, g
.node
);
2582 this->checkReturnValue(result
);
2583 return ADD(ddMgr
, result
);
2592 DdManager
*mgr
= this->checkSameManager(g
);
2593 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addNand
, node
, g
.node
);
2594 this->checkReturnValue(result
);
2595 return ADD(ddMgr
, result
);
2604 DdManager
*mgr
= this->checkSameManager(g
);
2605 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addNor
, node
, g
.node
);
2606 this->checkReturnValue(result
);
2607 return ADD(ddMgr
, result
);
2616 DdManager
*mgr
= this->checkSameManager(g
);
2617 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addXor
, node
, g
.node
);
2618 this->checkReturnValue(result
);
2619 return ADD(ddMgr
, result
);
2628 DdManager
*mgr
= this->checkSameManager(g
);
2629 DdNode
*result
= Cudd_addApply(mgr
, Cudd_addXnor
, node
, g
.node
);
2630 this->checkReturnValue(result
);
2631 return ADD(ddMgr
, result
);
2639 DdManager
*mgr
= ddMgr
->p
->manager
;
2640 DdNode
*result
= Cudd_addMonadicApply(mgr
, Cudd_addLog
, node
);
2641 this->checkReturnValue(result
);
2642 return ADD(ddMgr
, result
);
2648 ADD::FindMax() const
2650 DdManager
*mgr
= ddMgr
->p
->manager
;
2651 DdNode
*result
= Cudd_addFindMax(mgr
, node
);
2652 this->checkReturnValue(result
);
2653 return ADD(ddMgr
, result
);
2659 ADD::FindMin() const
2661 DdManager
*mgr
= ddMgr
->p
->manager
;
2662 DdNode
*result
= Cudd_addFindMin(mgr
, node
);
2663 this->checkReturnValue(result
);
2664 return ADD(ddMgr
, result
);
2673 DdManager
*mgr
= ddMgr
->p
->manager
;
2674 DdNode
*result
= Cudd_addIthBit(mgr
, node
, bit
);
2675 this->checkReturnValue(result
);
2676 return ADD(ddMgr
, result
);
2683 const ADD
& epsilon
) const
2685 DdManager
*mgr
= this->checkSameManager(epsilon
);
2686 DdNode
*result
= Cudd_addScalarInverse(mgr
, node
, epsilon
.node
);
2687 this->checkReturnValue(result
);
2688 return ADD(ddMgr
, result
);
2690 } // ADD::ScalarInverse
2698 DdManager
*mgr
= this->checkSameManager(g
);
2699 this->checkSameManager(h
);
2700 DdNode
*result
= Cudd_addIte(mgr
, node
, g
.node
, h
.node
);
2701 this->checkReturnValue(result
);
2702 return ADD(ddMgr
, result
);
2712 DdManager
*mgr
= this->checkSameManager(g
);
2713 this->checkSameManager(h
);
2714 DdNode
*result
= Cudd_addIteConstant(mgr
, node
, g
.node
, h
.node
);
2715 this->checkReturnValue(result
);
2716 return ADD(ddMgr
, result
);
2718 } // ADD::IteConstant
2725 DdManager
*mgr
= this->checkSameManager(g
);
2726 DdNode
*result
= Cudd_addEvalConst(mgr
, node
, g
.node
);
2727 this->checkReturnValue(result
);
2728 return ADD(ddMgr
, result
);
2737 DdManager
*mgr
= this->checkSameManager(g
);
2738 return Cudd_addLeq(mgr
, node
, g
.node
);
2746 DdManager
*mgr
= ddMgr
->p
->manager
;
2747 DdNode
*result
= Cudd_addCmpl(mgr
, node
);
2748 this->checkReturnValue(result
);
2749 return ADD(ddMgr
, result
);
2757 DdManager
*mgr
= ddMgr
->p
->manager
;
2758 DdNode
*result
= Cudd_addNegate(mgr
, node
);
2759 this->checkReturnValue(result
);
2760 return ADD(ddMgr
, result
);
2769 DdManager
*mgr
= ddMgr
->p
->manager
;
2770 DdNode
*result
= Cudd_addRoundOff(mgr
, node
, N
);
2771 this->checkReturnValue(result
);
2772 return ADD(ddMgr
, result
);
2783 DdNode
**X
= ALLOC(DdNode
*,n
);
2784 DdNode
**Y
= ALLOC(DdNode
*,n
);
2785 for (int i
= 0; i
< n
; i
++) {
2786 X
[i
] = x
[i
].getNode();
2787 Y
[i
] = y
[i
].getNode();
2789 DdNode
*result
= Cudd_addWalsh(p
->manager
, X
, Y
, n
);
2792 this->checkReturnValue(result
);
2793 return ADD(this, result
);
2805 DdNode
*result
= Cudd_addResidue(p
->manager
, n
, m
, options
, top
);
2806 this->checkReturnValue(result
);
2807 return ADD(this, result
);
2809 } // Cudd::addResidue
2815 const BDD
& cube
) const
2817 DdManager
*mgr
= this->checkSameManager(g
);
2818 this->checkSameManager(cube
);
2819 DdNode
*result
= Cudd_bddAndAbstract(mgr
, node
, g
.node
, cube
.node
);
2820 this->checkReturnValue(result
);
2821 return BDD(ddMgr
, result
);
2823 } // BDD::AndAbstract
2827 BDD::AndAbstractLimit(
2830 unsigned int limit
) const
2832 DdManager
*mgr
= this->checkSameManager(g
);
2833 this->checkSameManager(cube
);
2834 DdNode
*result
= Cudd_bddAndAbstractLimit(mgr
, node
, g
.node
,
2836 this->checkReturnValue(result
);
2837 return BDD(ddMgr
, result
);
2839 } // BDD::AndAbstractLimit
2843 Cudd::ApaNumberOfDigits(
2844 int binaryDigits
) const
2846 return Cudd_ApaNumberOfDigits(binaryDigits
);
2848 } // Cudd::ApaNumberOfDigits
2855 return Cudd_NewApaNumber(digits
);
2857 } // Cudd::NewApaNumber
2864 DdApaNumber dest
) const
2866 Cudd_ApaCopy(digits
, source
, dest
);
2876 DdApaNumber sum
) const
2878 return Cudd_ApaAdd(digits
, a
, b
, sum
);
2888 DdApaNumber diff
) const
2890 return Cudd_ApaSubtract(digits
, a
, b
, diff
);
2892 } // Cudd::ApaSubtract
2896 Cudd::ApaShortDivision(
2898 DdApaNumber dividend
,
2900 DdApaNumber quotient
) const
2902 return Cudd_ApaShortDivision(digits
, dividend
, divisor
, quotient
);
2904 } // Cudd::ApaShortDivision
2908 Cudd::ApaShiftRight(
2912 DdApaNumber b
) const
2914 Cudd_ApaShiftRight(digits
, in
, a
, b
);
2916 } // Cudd::ApaShiftRight
2920 Cudd::ApaSetToLiteral(
2923 DdApaDigit literal
) const
2925 Cudd_ApaSetToLiteral(digits
, number
, literal
);
2927 } // Cudd::ApaSetToLiteral
2931 Cudd::ApaPowerOfTwo(
2936 Cudd_ApaPowerOfTwo(digits
, number
, power
);
2938 } // Cudd::ApaPowerOfTwo
2945 DdApaNumber number
) const
2948 int result
= Cudd_ApaPrintHex(fp
, digits
, number
);
2949 this->checkReturnValue(result
);
2951 } // Cudd::ApaPrintHex
2955 Cudd::ApaPrintDecimal(
2958 DdApaNumber number
) const
2961 int result
= Cudd_ApaPrintDecimal(fp
, digits
, number
);
2962 this->checkReturnValue(result
);
2964 } // Cudd::ApaPrintDecimal
2968 ABDD::ApaCountMinterm(
2972 DdManager
*mgr
= ddMgr
->p
->manager
;
2973 return Cudd_ApaCountMinterm(mgr
, node
, nvars
, digits
);
2975 } // ABDD::ApaCountMinterm
2979 ABDD::ApaPrintMinterm(
2984 DdManager
*mgr
= ddMgr
->p
->manager
;
2985 int result
= Cudd_ApaPrintMinterm(fp
, mgr
, node
, nvars
);
2986 this->checkReturnValue(result
);
2988 } // ABDD::ApaPrintMinterm
2992 ABDD::EpdPrintMinterm(
2999 DdManager
*mgr
= ddMgr
->p
->manager
;
3000 int result
= Cudd_EpdCountMinterm(mgr
, node
, nvars
, &count
);
3001 this->checkReturnValue(result
,0);
3002 EpdGetString(&count
, str
);
3003 fprintf(fp
, "%s\n", str
);
3005 } // ABDD::ApaPrintMinterm
3013 double quality
) const
3015 DdManager
*mgr
= ddMgr
->p
->manager
;
3016 DdNode
*result
= Cudd_UnderApprox(mgr
, node
, numVars
, threshold
, safe
, quality
);
3017 this->checkReturnValue(result
);
3018 return BDD(ddMgr
, result
);
3020 } // BDD::UnderApprox
3028 double quality
) const
3030 DdManager
*mgr
= ddMgr
->p
->manager
;
3031 DdNode
*result
= Cudd_OverApprox(mgr
, node
, numVars
, threshold
, safe
, quality
);
3032 this->checkReturnValue(result
);
3033 return BDD(ddMgr
, result
);
3035 } // BDD::OverApprox
3039 BDD::RemapUnderApprox(
3042 double quality
) const
3044 DdManager
*mgr
= ddMgr
->p
->manager
;
3045 DdNode
*result
= Cudd_RemapUnderApprox(mgr
, node
, numVars
, threshold
, quality
);
3046 this->checkReturnValue(result
);
3047 return BDD(ddMgr
, result
);
3049 } // BDD::RemapUnderApprox
3053 BDD::RemapOverApprox(
3056 double quality
) const
3058 DdManager
*mgr
= ddMgr
->p
->manager
;
3059 DdNode
*result
= Cudd_RemapOverApprox(mgr
, node
, numVars
, threshold
, quality
);
3060 this->checkReturnValue(result
);
3061 return BDD(ddMgr
, result
);
3063 } // BDD::RemapOverApprox
3068 const BDD
& cube
) const
3070 DdManager
*mgr
= this->checkSameManager(cube
);
3071 DdNode
*result
= Cudd_bddExistAbstract(mgr
, node
, cube
.node
);
3072 this->checkReturnValue(result
);
3073 return BDD(ddMgr
, result
);
3075 } // BDD::ExistAbstract
3079 BDD::XorExistAbstract(
3081 const BDD
& cube
) const
3083 DdManager
*mgr
= this->checkSameManager(g
);
3084 this->checkSameManager(cube
);
3085 DdNode
*result
= Cudd_bddXorExistAbstract(mgr
, node
, g
.node
, cube
.node
);
3086 this->checkReturnValue(result
);
3087 return BDD(ddMgr
, result
);
3089 } // BDD::XorExistAbstract
3094 const BDD
& cube
) const
3096 DdManager
*mgr
= this->checkSameManager(cube
);
3097 DdNode
*result
= Cudd_bddUnivAbstract(mgr
, node
, cube
.node
);
3098 this->checkReturnValue(result
);
3099 return BDD(ddMgr
, result
);
3101 } // BDD::UnivAbstract
3108 DdManager
*mgr
= ddMgr
->p
->manager
;
3109 DdNode
*result
= Cudd_bddBooleanDiff(mgr
, node
, x
);
3110 this->checkReturnValue(result
);
3111 return BDD(ddMgr
, result
);
3113 } // BDD::BooleanDiff
3117 BDD::VarIsDependent(
3118 const BDD
& var
) const
3120 DdManager
*mgr
= ddMgr
->p
->manager
;
3121 return Cudd_bddVarIsDependent(mgr
, node
, var
.node
);
3123 } // BDD::VarIsDependent
3130 DdManager
*mgr
= this->checkSameManager(g
);
3131 return Cudd_bddCorrelation(mgr
, node
, g
.node
);
3133 } // BDD::Correlation
3137 BDD::CorrelationWeights(
3139 double * prob
) const
3141 DdManager
*mgr
= this->checkSameManager(g
);
3142 return Cudd_bddCorrelationWeights(mgr
, node
, g
.node
, prob
);
3144 } // BDD::CorrelationWeights
3152 DdManager
*mgr
= this->checkSameManager(g
);
3153 this->checkSameManager(h
);
3154 DdNode
*result
= Cudd_bddIte(mgr
, node
, g
.node
, h
.node
);
3155 this->checkReturnValue(result
);
3156 return BDD(ddMgr
, result
);
3166 DdManager
*mgr
= this->checkSameManager(g
);
3167 this->checkSameManager(h
);
3168 DdNode
*result
= Cudd_bddIteConstant(mgr
, node
, g
.node
, h
.node
);
3169 this->checkReturnValue(result
);
3170 return BDD(ddMgr
, result
);
3172 } // BDD::IteConstant
3179 DdManager
*mgr
= this->checkSameManager(g
);
3180 DdNode
*result
= Cudd_bddIntersect(mgr
, node
, g
.node
);
3181 this->checkReturnValue(result
);
3182 return BDD(ddMgr
, result
);
3191 DdManager
*mgr
= this->checkSameManager(g
);
3192 DdNode
*result
= Cudd_bddAnd(mgr
, node
, g
.node
);
3193 this->checkReturnValue(result
);
3194 return BDD(ddMgr
, result
);
3202 unsigned int limit
) const
3204 DdManager
*mgr
= this->checkSameManager(g
);
3205 DdNode
*result
= Cudd_bddAndLimit(mgr
, node
, g
.node
, limit
);
3206 this->checkReturnValue(result
);
3207 return BDD(ddMgr
, result
);
3216 DdManager
*mgr
= this->checkSameManager(g
);
3217 DdNode
*result
= Cudd_bddOr(mgr
, node
, g
.node
);
3218 this->checkReturnValue(result
);
3219 return BDD(ddMgr
, result
);
3228 DdManager
*mgr
= this->checkSameManager(g
);
3229 DdNode
*result
= Cudd_bddNand(mgr
, node
, g
.node
);
3230 this->checkReturnValue(result
);
3231 return BDD(ddMgr
, result
);
3240 DdManager
*mgr
= this->checkSameManager(g
);
3241 DdNode
*result
= Cudd_bddNor(mgr
, node
, g
.node
);
3242 this->checkReturnValue(result
);
3243 return BDD(ddMgr
, result
);
3252 DdManager
*mgr
= this->checkSameManager(g
);
3253 DdNode
*result
= Cudd_bddXor(mgr
, node
, g
.node
);
3254 this->checkReturnValue(result
);
3255 return BDD(ddMgr
, result
);
3264 DdManager
*mgr
= this->checkSameManager(g
);
3265 DdNode
*result
= Cudd_bddXnor(mgr
, node
, g
.node
);
3266 this->checkReturnValue(result
);
3267 return BDD(ddMgr
, result
);
3276 DdManager
*mgr
= this->checkSameManager(g
);
3277 return Cudd_bddLeq(mgr
, node
, g
.node
);
3284 CUDD_VALUE_TYPE value
) const
3286 DdManager
*mgr
= ddMgr
->p
->manager
;
3287 DdNode
*result
= Cudd_addBddThreshold(mgr
, node
, value
);
3288 this->checkReturnValue(result
);
3289 return BDD(ddMgr
, result
);
3291 } // ADD::BddThreshold
3295 ADD::BddStrictThreshold(
3296 CUDD_VALUE_TYPE value
) const
3298 DdManager
*mgr
= ddMgr
->p
->manager
;
3299 DdNode
*result
= Cudd_addBddStrictThreshold(mgr
, node
, value
);
3300 this->checkReturnValue(result
);
3301 return BDD(ddMgr
, result
);
3303 } // ADD::BddStrictThreshold
3308 CUDD_VALUE_TYPE lower
,
3309 CUDD_VALUE_TYPE upper
) const
3311 DdManager
*mgr
= ddMgr
->p
->manager
;
3312 DdNode
*result
= Cudd_addBddInterval(mgr
, node
, lower
, upper
);
3313 this->checkReturnValue(result
);
3314 return BDD(ddMgr
, result
);
3316 } // ADD::BddInterval
3323 DdManager
*mgr
= ddMgr
->p
->manager
;
3324 DdNode
*result
= Cudd_addBddIthBit(mgr
, node
, bit
);
3325 this->checkReturnValue(result
);
3326 return BDD(ddMgr
, result
);
3334 DdManager
*mgr
= ddMgr
->p
->manager
;
3335 DdNode
*result
= Cudd_BddToAdd(mgr
, node
);
3336 this->checkReturnValue(result
);
3337 return ADD(ddMgr
, result
);
3343 ADD::BddPattern() const
3345 DdManager
*mgr
= ddMgr
->p
->manager
;
3346 DdNode
*result
= Cudd_addBddPattern(mgr
, node
);
3347 this->checkReturnValue(result
);
3348 return BDD(ddMgr
, result
);
3350 } // ADD::BddPattern
3355 Cudd
& destination
) const
3357 DdManager
*mgr
= ddMgr
->p
->manager
;
3358 DdNode
*result
= Cudd_bddTransfer(mgr
, destination
.p
->manager
, node
);
3359 this->checkReturnValue(result
);
3360 return BDD(&destination
, result
);
3368 int result
= Cudd_DebugCheck(p
->manager
);
3369 this->checkReturnValue(result
== 0);
3371 } // Cudd::DebugCheck
3377 int result
= Cudd_CheckKeys(p
->manager
);
3378 this->checkReturnValue(result
== 0);
3380 } // Cudd::CheckKeys
3387 int direction
) const
3389 DdManager
*mgr
= this->checkSameManager(g
);
3390 DdNode
*result
= Cudd_bddClippingAnd(mgr
, node
, g
.node
, maxDepth
,
3392 this->checkReturnValue(result
);
3393 return BDD(ddMgr
, result
);
3395 } // BDD::ClippingAnd
3399 BDD::ClippingAndAbstract(
3403 int direction
) const
3405 DdManager
*mgr
= this->checkSameManager(g
);
3406 this->checkSameManager(cube
);
3407 DdNode
*result
= Cudd_bddClippingAndAbstract(mgr
, node
, g
.node
, cube
.node
,
3408 maxDepth
, direction
);
3409 this->checkReturnValue(result
);
3410 return BDD(ddMgr
, result
);
3412 } // BDD::ClippingAndAbstract
3419 DdManager
*mgr
= this->checkSameManager(g
);
3420 DdNode
*result
= Cudd_Cofactor(mgr
, node
, g
.node
);
3421 this->checkReturnValue(result
);
3422 return ADD(ddMgr
, result
);
3431 DdManager
*mgr
= this->checkSameManager(g
);
3432 DdNode
*result
= Cudd_Cofactor(mgr
, node
, g
.node
);
3433 this->checkReturnValue(result
);
3434 return BDD(ddMgr
, result
);
3444 DdManager
*mgr
= this->checkSameManager(g
);
3445 DdNode
*result
= Cudd_bddCompose(mgr
, node
, g
.node
, v
);
3446 this->checkReturnValue(result
);
3447 return BDD(ddMgr
, result
);
3457 DdManager
*mgr
= this->checkSameManager(g
);
3458 DdNode
*result
= Cudd_addCompose(mgr
, node
, g
.node
, v
);
3459 this->checkReturnValue(result
);
3460 return ADD(ddMgr
, result
);
3469 DdManager
*mgr
= ddMgr
->p
->manager
;
3470 DdNode
*result
= Cudd_addPermute(mgr
, node
, permut
);
3471 this->checkReturnValue(result
);
3472 return ADD(ddMgr
, result
);
3483 DdManager
*mgr
= ddMgr
->p
->manager
;
3484 DdNode
**X
= ALLOC(DdNode
*,n
);
3485 DdNode
**Y
= ALLOC(DdNode
*,n
);
3486 for (int i
= 0; i
< n
; i
++) {
3490 DdNode
*result
= Cudd_addSwapVariables(mgr
, node
, X
, Y
, n
);
3493 this->checkReturnValue(result
);
3494 return ADD(ddMgr
, result
);
3496 } // ADD::SwapVariables
3503 DdManager
*mgr
= ddMgr
->p
->manager
;
3504 DdNode
*result
= Cudd_bddPermute(mgr
, node
, permut
);
3505 this->checkReturnValue(result
);
3506 return BDD(ddMgr
, result
);
3517 DdManager
*mgr
= ddMgr
->p
->manager
;
3518 DdNode
**X
= ALLOC(DdNode
*,n
);
3519 DdNode
**Y
= ALLOC(DdNode
*,n
);
3520 for (int i
= 0; i
< n
; i
++) {
3524 DdNode
*result
= Cudd_bddSwapVariables(mgr
, node
, X
, Y
, n
);
3527 this->checkReturnValue(result
);
3528 return BDD(ddMgr
, result
);
3530 } // BDD::SwapVariables
3538 DdManager
*mgr
= ddMgr
->p
->manager
;
3539 DdNode
**X
= ALLOC(DdNode
*,n
);
3540 for (int i
= 0; i
< n
; i
++) {
3543 DdNode
*result
= Cudd_bddAdjPermuteX(mgr
, node
, X
, n
);
3545 this->checkReturnValue(result
);
3546 return BDD(ddMgr
, result
);
3548 } // BDD::AdjPermuteX
3553 ADDvector vector
) const
3555 DdManager
*mgr
= ddMgr
->p
->manager
;
3556 int n
= Cudd_ReadSize(mgr
);
3557 DdNode
**X
= ALLOC(DdNode
*,n
);
3558 for (int i
= 0; i
< n
; i
++) {
3559 X
[i
] = vector
[i
].node
;
3561 DdNode
*result
= Cudd_addVectorCompose(mgr
, node
, X
);
3563 this->checkReturnValue(result
);
3564 return ADD(ddMgr
, result
);
3566 } // ADD::VectorCompose
3571 ADDvector vector
) const
3573 DdManager
*mgr
= ddMgr
->p
->manager
;
3574 int n
= Cudd_ReadSize(mgr
);
3575 DdNode
**X
= ALLOC(DdNode
*,n
);
3576 for (int i
= 0; i
< n
; i
++) {
3577 X
[i
] = vector
[i
].node
;
3579 DdNode
*result
= Cudd_addNonSimCompose(mgr
, node
, X
);
3581 this->checkReturnValue(result
);
3582 return ADD(ddMgr
, result
);
3584 } // ADD::NonSimCompose
3589 BDDvector vector
) const
3591 DdManager
*mgr
= ddMgr
->p
->manager
;
3592 int n
= Cudd_ReadSize(mgr
);
3593 DdNode
**X
= ALLOC(DdNode
*,n
);
3594 for (int i
= 0; i
< n
; i
++) {
3595 X
[i
] = vector
[i
].node
;
3597 DdNode
*result
= Cudd_bddVectorCompose(mgr
, node
, X
);
3599 this->checkReturnValue(result
);
3600 return BDD(ddMgr
, result
);
3602 } // BDD::VectorCompose
3606 BDD::ApproxConjDecomp(
3610 DdManager
*mgr
= ddMgr
->p
->manager
;
3612 int result
= Cudd_bddApproxConjDecomp(mgr
, node
, &pieces
);
3613 this->checkReturnValue(result
== 2);
3614 *g
= BDD(ddMgr
, pieces
[0]);
3615 *h
= BDD(ddMgr
, pieces
[1]);
3616 Cudd_RecursiveDeref(mgr
,pieces
[0]);
3617 Cudd_RecursiveDeref(mgr
,pieces
[1]);
3620 } // BDD::ApproxConjDecomp
3624 BDD::ApproxDisjDecomp(
3628 DdManager
*mgr
= ddMgr
->p
->manager
;
3630 int result
= Cudd_bddApproxDisjDecomp(mgr
, node
, &pieces
);
3631 this->checkReturnValue(result
== 2);
3632 *g
= BDD(ddMgr
, pieces
[0]);
3633 *h
= BDD(ddMgr
, pieces
[1]);
3634 Cudd_RecursiveDeref(mgr
,pieces
[0]);
3635 Cudd_RecursiveDeref(mgr
,pieces
[1]);
3638 } // BDD::ApproxDisjDecomp
3642 BDD::IterConjDecomp(
3646 DdManager
*mgr
= ddMgr
->p
->manager
;
3648 int result
= Cudd_bddIterConjDecomp(mgr
, node
, &pieces
);
3649 this->checkReturnValue(result
== 2);
3650 *g
= BDD(ddMgr
, pieces
[0]);
3651 *h
= BDD(ddMgr
, pieces
[1]);
3652 Cudd_RecursiveDeref(mgr
,pieces
[0]);
3653 Cudd_RecursiveDeref(mgr
,pieces
[1]);
3656 } // BDD::IterConjDecomp
3660 BDD::IterDisjDecomp(
3664 DdManager
*mgr
= ddMgr
->p
->manager
;
3666 int result
= Cudd_bddIterDisjDecomp(mgr
, node
, &pieces
);
3667 this->checkReturnValue(result
== 2);
3668 *g
= BDD(ddMgr
, pieces
[0]);
3669 *h
= BDD(ddMgr
, pieces
[1]);
3670 Cudd_RecursiveDeref(mgr
,pieces
[0]);
3671 Cudd_RecursiveDeref(mgr
,pieces
[1]);
3674 } // BDD::IterDisjDecomp
3682 DdManager
*mgr
= ddMgr
->p
->manager
;
3684 int result
= Cudd_bddGenConjDecomp(mgr
, node
, &pieces
);
3685 this->checkReturnValue(result
== 2);
3686 *g
= BDD(ddMgr
, pieces
[0]);
3687 *h
= BDD(ddMgr
, pieces
[1]);
3688 Cudd_RecursiveDeref(mgr
,pieces
[0]);
3689 Cudd_RecursiveDeref(mgr
,pieces
[1]);
3692 } // BDD::GenConjDecomp
3700 DdManager
*mgr
= ddMgr
->p
->manager
;
3702 int result
= Cudd_bddGenDisjDecomp(mgr
, node
, &pieces
);
3703 this->checkReturnValue(result
== 2);
3704 *g
= BDD(ddMgr
, pieces
[0]);
3705 *h
= BDD(ddMgr
, pieces
[1]);
3706 Cudd_RecursiveDeref(mgr
,pieces
[0]);
3707 Cudd_RecursiveDeref(mgr
,pieces
[1]);
3710 } // BDD::GenDisjDecomp
3718 DdManager
*mgr
= ddMgr
->p
->manager
;
3720 int result
= Cudd_bddVarConjDecomp(mgr
, node
, &pieces
);
3721 this->checkReturnValue(result
== 2);
3722 *g
= BDD(ddMgr
, pieces
[0]);
3723 *h
= BDD(ddMgr
, pieces
[1]);
3724 Cudd_RecursiveDeref(mgr
,pieces
[0]);
3725 Cudd_RecursiveDeref(mgr
,pieces
[1]);
3728 } // BDD::VarConjDecomp
3736 DdManager
*mgr
= ddMgr
->p
->manager
;
3738 int result
= Cudd_bddVarDisjDecomp(mgr
, node
, &pieces
);
3739 this->checkReturnValue(result
== 2);
3740 *g
= BDD(ddMgr
, pieces
[0]);
3741 *h
= BDD(ddMgr
, pieces
[1]);
3742 Cudd_RecursiveDeref(mgr
,pieces
[0]);
3743 Cudd_RecursiveDeref(mgr
,pieces
[1]);
3746 } // BDD::VarDisjDecomp
3750 ABDD::FindEssential() const
3752 DdManager
*mgr
= ddMgr
->p
->manager
;
3753 DdNode
*result
= Cudd_FindEssential(mgr
, node
);
3754 this->checkReturnValue(result
);
3755 return BDD(ddMgr
, result
);
3757 } // ABDD::FindEssential
3761 BDD::IsVarEssential(
3765 DdManager
*mgr
= ddMgr
->p
->manager
;
3766 return Cudd_bddIsVarEssential(mgr
, node
, id
, phase
);
3768 } // BDD::IsVarEssential
3772 ABDD::PrintTwoLiteralClauses(
3776 DdManager
*mgr
= ddMgr
->p
->manager
;
3777 int result
= Cudd_PrintTwoLiteralClauses(mgr
, node
, names
, fp
);
3778 this->checkReturnValue(result
);
3780 } // ABDD::PrintTwoLiteralClauses
3784 BDDvector::DumpBlif(
3791 DdManager
*mgr
= p
->manager
->getManager();
3793 DdNode
**F
= ALLOC(DdNode
*,n
);
3794 for (int i
= 0; i
< n
; i
++) {
3795 F
[i
] = p
->vect
[i
].getNode();
3797 int result
= Cudd_DumpBlif(mgr
, n
, F
, inames
, onames
, mname
, fp
, mv
);
3799 p
->manager
->checkReturnValue(result
);
3801 } // BDDvector::DumpBlif
3810 DdManager
*mgr
= p
->manager
->getManager();
3812 DdNode
**F
= ALLOC(DdNode
*,n
);
3813 for (int i
= 0; i
< n
; i
++) {
3814 F
[i
] = p
->vect
[i
].getNode();
3816 int result
= Cudd_DumpDot(mgr
, n
, F
, inames
, onames
, fp
);
3818 p
->manager
->checkReturnValue(result
);
3820 } // BDDvector::DumpDot
3829 DdManager
*mgr
= p
->manager
->getManager();
3831 DdNode
**F
= ALLOC(DdNode
*,n
);
3832 for (int i
= 0; i
< n
; i
++) {
3833 F
[i
] = p
->vect
[i
].getNode();
3835 int result
= Cudd_DumpDot(mgr
, n
, F
, inames
, onames
, fp
);
3837 p
->manager
->checkReturnValue(result
);
3839 } // ADDvector::DumpDot
3843 BDDvector::DumpDaVinci(
3848 DdManager
*mgr
= p
->manager
->getManager();
3850 DdNode
**F
= ALLOC(DdNode
*,n
);
3851 for (int i
= 0; i
< n
; i
++) {
3852 F
[i
] = p
->vect
[i
].getNode();
3854 int result
= Cudd_DumpDaVinci(mgr
, n
, F
, inames
, onames
, fp
);
3856 p
->manager
->checkReturnValue(result
);
3858 } // BDDvector::DumpDaVinci
3862 ADDvector::DumpDaVinci(
3867 DdManager
*mgr
= p
->manager
->getManager();
3869 DdNode
**F
= ALLOC(DdNode
*,n
);
3870 for (int i
= 0; i
< n
; i
++) {
3871 F
[i
] = p
->vect
[i
].getNode();
3873 int result
= Cudd_DumpDaVinci(mgr
, n
, F
, inames
, onames
, fp
);
3875 p
->manager
->checkReturnValue(result
);
3877 } // ADDvector::DumpDaVinci
3881 BDDvector::DumpDDcal(
3886 DdManager
*mgr
= p
->manager
->getManager();
3888 DdNode
**F
= ALLOC(DdNode
*,n
);
3889 for (int i
= 0; i
< n
; i
++) {
3890 F
[i
] = p
->vect
[i
].getNode();
3892 int result
= Cudd_DumpDDcal(mgr
, n
, F
, inames
, onames
, fp
);
3894 p
->manager
->checkReturnValue(result
);
3896 } // BDDvector::DumpDDcal
3900 BDDvector::DumpFactoredForm(
3905 DdManager
*mgr
= p
->manager
->getManager();
3907 DdNode
**F
= ALLOC(DdNode
*,n
);
3908 for (int i
= 0; i
< n
; i
++) {
3909 F
[i
] = p
->vect
[i
].getNode();
3911 int result
= Cudd_DumpFactoredForm(mgr
, n
, F
, inames
, onames
, fp
);
3913 p
->manager
->checkReturnValue(result
);
3915 } // BDDvector::DumpFactoredForm
3922 DdManager
*mgr
= this->checkSameManager(c
);
3923 DdNode
*result
= Cudd_bddConstrain(mgr
, node
, c
.node
);
3924 this->checkReturnValue(result
);
3925 return BDD(ddMgr
, result
);
3934 DdManager
*mgr
= this->checkSameManager(c
);
3935 DdNode
*result
= Cudd_bddRestrict(mgr
, node
, c
.node
);
3936 this->checkReturnValue(result
);
3937 return BDD(ddMgr
, result
);
3946 DdManager
*mgr
= this->checkSameManager(g
);
3947 DdNode
*result
= Cudd_bddNPAnd(mgr
, node
, g
.node
);
3948 this->checkReturnValue(result
);
3949 return BDD(ddMgr
, result
);
3958 DdManager
*mgr
= this->checkSameManager(c
);
3959 DdNode
*result
= Cudd_addConstrain(mgr
, node
, c
.node
);
3960 this->checkReturnValue(result
);
3961 return ADD(ddMgr
, result
);
3967 BDD::ConstrainDecomp() const
3969 DdManager
*mgr
= ddMgr
->p
->manager
;
3970 DdNode
**result
= Cudd_bddConstrainDecomp(mgr
, node
);
3971 this->checkReturnValue((DdNode
*)result
);
3972 int size
= Cudd_ReadSize(mgr
);
3973 for (int i
= 0; i
< size
; i
++) {
3974 Cudd_Deref(result
[i
]);
3976 BDDvector
vect(size
, ddMgr
, result
);
3980 } // BDD::ConstrainDecomp
3987 DdManager
*mgr
= this->checkSameManager(c
);
3988 DdNode
*result
= Cudd_addRestrict(mgr
, node
, c
.node
);
3989 this->checkReturnValue(result
);
3990 return ADD(ddMgr
, result
);
3996 BDD::CharToVect() const
3998 DdManager
*mgr
= ddMgr
->p
->manager
;
3999 DdNode
**result
= Cudd_bddCharToVect(mgr
, node
);
4000 this->checkReturnValue((DdNode
*)result
);
4001 int size
= Cudd_ReadSize(mgr
);
4002 for (int i
= 0; i
< size
; i
++) {
4003 Cudd_Deref(result
[i
]);
4005 BDDvector
vect(size
, ddMgr
, result
);
4009 } // BDD::CharToVect
4016 DdManager
*mgr
= this->checkSameManager(c
);
4017 DdNode
*result
= Cudd_bddLICompaction(mgr
, node
, c
.node
);
4018 this->checkReturnValue(result
);
4019 return BDD(ddMgr
, result
);
4021 } // BDD::LICompaction
4028 DdManager
*mgr
= this->checkSameManager(u
);
4029 DdNode
*result
= Cudd_bddSqueeze(mgr
, node
, u
.node
);
4030 this->checkReturnValue(result
);
4031 return BDD(ddMgr
, result
);
4040 DdManager
*mgr
= this->checkSameManager(c
);
4041 DdNode
*result
= Cudd_bddMinimize(mgr
, node
, c
.node
);
4042 this->checkReturnValue(result
);
4043 return BDD(ddMgr
, result
);
4049 BDD::SubsetCompress(
4051 int threshold
) const
4053 DdManager
*mgr
= ddMgr
->p
->manager
;
4054 DdNode
*result
= Cudd_SubsetCompress(mgr
, node
, nvars
, threshold
);
4055 this->checkReturnValue(result
);
4056 return BDD(ddMgr
, result
);
4058 } // BDD::SubsetCompress
4062 BDD::SupersetCompress(
4064 int threshold
) const
4066 DdManager
*mgr
= ddMgr
->p
->manager
;
4067 DdNode
*result
= Cudd_SupersetCompress(mgr
, node
, nvars
, threshold
);
4068 this->checkReturnValue(result
);
4069 return BDD(ddMgr
, result
);
4071 } // BDD::SupersetCompress
4080 return Cudd_MakeTreeNode(p
->manager
, low
, size
, type
);
4082 } // Cudd::MakeTreeNode
4085 /* This is incorrect, but we'll wait for this one.
4105 DdManager *mgr = p->manager;
4106 int result = Cudd_addHarwell(fp, mgr, E, x, y, xn, yn_, nx, ny, m, n, bx, sx, by, sy, pr);
4107 this->checkReturnValue(result);
4117 int result
= Cudd_PrintLinear(p
->manager
);
4118 this->checkReturnValue(result
);
4120 } // Cudd::PrintLinear
4128 return Cudd_ReadLinear(p
->manager
, x
, y
);
4130 } // Cudd::ReadLinear
4134 BDD::LiteralSetIntersection(
4137 DdManager
*mgr
= this->checkSameManager(g
);
4138 DdNode
*result
= Cudd_bddLiteralSetIntersection(mgr
, node
, g
.node
);
4139 this->checkReturnValue(result
);
4140 return BDD(ddMgr
, result
);
4142 } // BDD::LiteralSetIntersection
4146 ADD::MatrixMultiply(
4151 DdManager
*mgr
= this->checkSameManager(B
);
4152 DdNode
**Z
= ALLOC(DdNode
*,nz
);
4153 for (int i
= 0; i
< nz
; i
++) {
4156 DdNode
*result
= Cudd_addMatrixMultiply(mgr
, node
, B
.node
, Z
, nz
);
4158 this->checkReturnValue(result
);
4159 return ADD(ddMgr
, result
);
4161 } // ADD::MatrixMultiply
4170 DdManager
*mgr
= this->checkSameManager(B
);
4171 DdNode
**Z
= ALLOC(DdNode
*,nz
);
4172 for (int i
= 0; i
< nz
; i
++) {
4175 DdNode
*result
= Cudd_addTimesPlus(mgr
, node
, B
.node
, Z
, nz
);
4177 this->checkReturnValue(result
);
4178 return ADD(ddMgr
, result
);
4189 DdManager
*mgr
= this->checkSameManager(g
);
4190 DdNode
**Z
= ALLOC(DdNode
*,nz
);
4191 for (int i
= 0; i
< nz
; i
++) {
4194 DdNode
*result
= Cudd_addTriangle(mgr
, node
, g
.node
, Z
, nz
);
4196 this->checkReturnValue(result
);
4197 return ADD(ddMgr
, result
);
4203 BDD::PrioritySelect(
4208 DD_PRFP Pifunc
) const
4211 DdManager
*mgr
= ddMgr
->p
->manager
;
4212 DdNode
**X
= ALLOC(DdNode
*,n
);
4213 DdNode
**Y
= ALLOC(DdNode
*,n
);
4214 DdNode
**Z
= ALLOC(DdNode
*,n
);
4215 for (int i
= 0; i
< n
; i
++) {
4220 DdNode
*result
= Cudd_PrioritySelect(mgr
, node
, X
, Y
, Z
, Pi
.node
, n
, Pifunc
);
4224 this->checkReturnValue(result
);
4225 return BDD(ddMgr
, result
);
4227 } // BDD::PrioritySelect
4237 DdManager
*mgr
= p
->manager
;
4238 DdNode
**X
= ALLOC(DdNode
*,N
);
4239 DdNode
**Y
= ALLOC(DdNode
*,N
);
4240 DdNode
**Z
= ALLOC(DdNode
*,N
);
4241 for (int i
= 0; i
< N
; i
++) {
4242 X
[i
] = x
[i
].getNode();
4243 Y
[i
] = y
[i
].getNode();
4244 Z
[i
] = z
[i
].getNode();
4246 DdNode
*result
= Cudd_Xgty(mgr
, N
, Z
, X
, Y
);
4250 this->checkReturnValue(result
);
4251 return BDD(this, result
);
4262 DdManager
*mgr
= p
->manager
;
4263 DdNode
**X
= ALLOC(DdNode
*,N
);
4264 DdNode
**Y
= ALLOC(DdNode
*,N
);
4265 for (int i
= 0; i
< N
; i
++) {
4266 X
[i
] = x
[i
].getNode();
4267 Y
[i
] = y
[i
].getNode();
4269 DdNode
*result
= Cudd_Xeqy(mgr
, N
, X
, Y
);
4272 this->checkReturnValue(result
);
4273 return BDD(this, result
);
4284 DdManager
*mgr
= p
->manager
;
4285 DdNode
**X
= ALLOC(DdNode
*,N
);
4286 DdNode
**Y
= ALLOC(DdNode
*,N
);
4287 for (int i
= 0; i
< N
; i
++) {
4288 X
[i
] = x
[i
].getNode();
4289 Y
[i
] = y
[i
].getNode();
4291 DdNode
*result
= Cudd_addXeqy(mgr
, N
, X
, X
);
4294 this->checkReturnValue(result
);
4295 return ADD(this, result
);
4307 DdManager
*mgr
= p
->manager
;
4308 DdNode
**X
= ALLOC(DdNode
*,N
);
4309 DdNode
**Y
= ALLOC(DdNode
*,N
);
4310 DdNode
**Z
= ALLOC(DdNode
*,N
);
4311 for (int i
= 0; i
< N
; i
++) {
4312 X
[i
] = x
[i
].getNode();
4313 Y
[i
] = y
[i
].getNode();
4314 Z
[i
] = z
[i
].getNode();
4316 DdNode
*result
= Cudd_Dxygtdxz(mgr
, N
, X
, Y
, Z
);
4320 this->checkReturnValue(result
);
4321 return BDD(this, result
);
4333 DdManager
*mgr
= p
->manager
;
4334 DdNode
**X
= ALLOC(DdNode
*,N
);
4335 DdNode
**Y
= ALLOC(DdNode
*,N
);
4336 DdNode
**Z
= ALLOC(DdNode
*,N
);
4337 for (int i
= 0; i
< N
; i
++) {
4338 X
[i
] = x
[i
].getNode();
4339 Y
[i
] = y
[i
].getNode();
4340 Z
[i
] = z
[i
].getNode();
4342 DdNode
*result
= Cudd_Dxygtdyz(mgr
, N
, X
, Y
, Z
);
4346 this->checkReturnValue(result
);
4347 return BDD(this, result
);
4359 DdManager
*mgr
= p
->manager
;
4360 DdNode
**X
= ALLOC(DdNode
*,N
);
4361 DdNode
**Y
= ALLOC(DdNode
*,N
);
4362 for (int i
= 0; i
< N
; i
++) {
4363 X
[i
] = x
[i
].getNode();
4364 Y
[i
] = y
[i
].getNode();
4366 DdNode
*result
= Cudd_Inequality(mgr
, N
, c
, X
, Y
);
4369 this->checkReturnValue(result
);
4370 return BDD(this, result
);
4372 } // Cudd::Inequality
4382 DdManager
*mgr
= p
->manager
;
4383 DdNode
**X
= ALLOC(DdNode
*,N
);
4384 DdNode
**Y
= ALLOC(DdNode
*,N
);
4385 for (int i
= 0; i
< N
; i
++) {
4386 X
[i
] = x
[i
].getNode();
4387 Y
[i
] = y
[i
].getNode();
4389 DdNode
*result
= Cudd_Disequality(mgr
, N
, c
, X
, Y
);
4392 this->checkReturnValue(result
);
4393 return BDD(this, result
);
4395 } // Cudd::Disequality
4401 unsigned int lowerB
,
4402 unsigned int upperB
)
4405 DdManager
*mgr
= p
->manager
;
4406 DdNode
**X
= ALLOC(DdNode
*,N
);
4407 for (int i
= 0; i
< N
; i
++) {
4408 X
[i
] = x
[i
].getNode();
4410 DdNode
*result
= Cudd_bddInterval(mgr
, N
, X
, lowerB
, upperB
);
4412 this->checkReturnValue(result
);
4413 return BDD(this, result
);
4422 DdManager
*mgr
= this->checkSameManager(Y
);
4423 DdNode
*result
= Cudd_CProjection(mgr
, node
, Y
.node
);
4424 this->checkReturnValue(result
);
4425 return BDD(ddMgr
, result
);
4427 } // BDD::CProjection
4431 BDD::MinHammingDist(
4433 int upperBound
) const
4435 DdManager
*mgr
= ddMgr
->p
->manager
;
4436 int result
= Cudd_MinHammingDist(mgr
, node
, minterm
, upperBound
);
4439 } // BDD::MinHammingDist
4447 int nVars
= xVars
.count();
4448 DdManager
*mgr
= p
->manager
;
4449 DdNode
**X
= ALLOC(DdNode
*,nVars
);
4450 DdNode
**Y
= ALLOC(DdNode
*,nVars
);
4451 for (int i
= 0; i
< nVars
; i
++) {
4452 X
[i
] = xVars
[i
].getNode();
4453 Y
[i
] = yVars
[i
].getNode();
4455 DdNode
*result
= Cudd_addHamming(mgr
, X
, Y
, nVars
);
4458 this->checkReturnValue(result
);
4459 return ADD(this, result
);
4464 /* We'll leave these two out for the time being.
4482 DdManager *mgr = p->manager;
4483 int result = Cudd_addRead(fp, mgr, E, x, y, xn, yn_, nx, ny, m, n, bx, sx, by, sy);
4484 this->checkReturnValue(result);
4504 DdManager *mgr = p->manager;
4505 int result = Cudd_bddRead(fp, mgr, E, x, y, nx, ny, m, n, bx, sx, by, sy);
4506 this->checkReturnValue(result);
4514 Cudd_ReorderingType heuristic
,
4517 int result
= Cudd_ReduceHeap(p
->manager
, heuristic
, minsize
);
4518 this->checkReturnValue(result
);
4520 } // Cudd::ReduceHeap
4527 int result
= Cudd_ShuffleHeap(p
->manager
, permutation
);
4528 this->checkReturnValue(result
);
4530 } // Cudd::ShuffleHeap
4537 DdManager
*mgr
= ddMgr
->p
->manager
;
4538 DdNode
*result
= Cudd_Eval(mgr
, node
, inputs
);
4539 this->checkReturnValue(result
);
4540 return ADD(ddMgr
, result
);
4549 DdManager
*mgr
= ddMgr
->p
->manager
;
4550 DdNode
*result
= Cudd_Eval(mgr
, node
, inputs
);
4551 this->checkReturnValue(result
);
4552 return BDD(ddMgr
, result
);
4563 DdManager
*mgr
= ddMgr
->p
->manager
;
4564 DdNode
*result
= Cudd_ShortestPath(mgr
, node
, weight
, support
, length
);
4565 this->checkReturnValue(result
);
4566 return BDD(ddMgr
, result
);
4568 } // ABDD::ShortestPath
4575 DdManager
*mgr
= ddMgr
->p
->manager
;
4576 DdNode
*result
= Cudd_LargestCube(mgr
, node
, length
);
4577 this->checkReturnValue(result
);
4578 return BDD(ddMgr
, result
);
4580 } // ABDD::LargestCube
4584 ABDD::ShortestLength(
4587 DdManager
*mgr
= ddMgr
->p
->manager
;
4588 int result
= Cudd_ShortestLength(mgr
, node
, weight
);
4589 this->checkReturnValue(result
!= CUDD_OUT_OF_MEM
);
4592 } // ABDD::ShortestLength
4599 DdManager
*mgr
= ddMgr
->p
->manager
;
4600 DdNode
*result
= Cudd_Decreasing(mgr
, node
, i
);
4601 this->checkReturnValue(result
);
4602 return BDD(ddMgr
, result
);
4604 } // BDD::Decreasing
4611 DdManager
*mgr
= ddMgr
->p
->manager
;
4612 DdNode
*result
= Cudd_Increasing(mgr
, node
, i
);
4613 this->checkReturnValue(result
);
4614 return BDD(ddMgr
, result
);
4616 } // BDD::Increasing
4622 const ABDD
& D
) const
4624 DdManager
*mgr
= this->checkSameManager(G
);
4625 this->checkSameManager(D
);
4626 return Cudd_EquivDC(mgr
, node
, G
.node
, D
.node
);
4634 CUDD_VALUE_TYPE tolerance
,
4637 DdManager
*mgr
= this->checkSameManager(g
);
4638 return Cudd_EqualSupNorm(mgr
, node
, g
.node
, tolerance
, pr
);
4640 } // ADD::EqualSupNorm
4644 ABDD::CofMinterm() const
4646 DdManager
*mgr
= ddMgr
->p
->manager
;
4647 double *result
= Cudd_CofMinterm(mgr
, node
);
4648 this->checkReturnValue((DdNode
*)result
);
4651 } // ABDD::CofMinterm
4661 DdManager
*mgr
= this->checkSameManager(Y
);
4662 DdNode
**g
= ALLOC(DdNode
*,n
);
4663 DdNode
*result
= Cudd_SolveEqn(mgr
, node
, Y
.node
, g
, yIndex
, n
);
4664 this->checkReturnValue(result
);
4665 for (int i
= 0; i
< n
; i
++) {
4666 G
[i
] = BDD(ddMgr
, g
[i
]);
4667 Cudd_RecursiveDeref(mgr
,g
[i
]);
4670 return BDD(ddMgr
, result
);
4681 DdManager
*mgr
= ddMgr
->p
->manager
;
4682 DdNode
**g
= ALLOC(DdNode
*,n
);
4683 for (int i
= 0; i
< n
; i
++) {
4686 DdNode
*result
= Cudd_VerifySol(mgr
, node
, g
, yIndex
, n
);
4688 this->checkReturnValue(result
);
4689 return BDD(ddMgr
, result
);
4699 int n
= xVars
.count();
4700 DdManager
*mgr
= ddMgr
->p
->manager
;
4701 DdNode
**X
= ALLOC(DdNode
*,n
);
4702 for (int i
= 0; i
< n
; i
++) {
4703 X
[i
] = xVars
[i
].node
;
4705 DdNode
*result
= Cudd_SplitSet(mgr
, node
, X
, n
, m
);
4707 this->checkReturnValue(result
);
4708 return BDD(ddMgr
, result
);
4714 BDD::SubsetHeavyBranch(
4716 int threshold
) const
4718 DdManager
*mgr
= ddMgr
->p
->manager
;
4719 DdNode
*result
= Cudd_SubsetHeavyBranch(mgr
, node
, numVars
, threshold
);
4720 this->checkReturnValue(result
);
4721 return BDD(ddMgr
, result
);
4723 } // BDD::SubsetHeavyBranch
4727 BDD::SupersetHeavyBranch(
4729 int threshold
) const
4731 DdManager
*mgr
= ddMgr
->p
->manager
;
4732 DdNode
*result
= Cudd_SupersetHeavyBranch(mgr
, node
, numVars
, threshold
);
4733 this->checkReturnValue(result
);
4734 return BDD(ddMgr
, result
);
4736 } // BDD::SupersetHeavyBranch
4740 BDD::SubsetShortPaths(
4743 int hardlimit
) const
4745 DdManager
*mgr
= ddMgr
->p
->manager
;
4746 DdNode
*result
= Cudd_SubsetShortPaths(mgr
, node
, numVars
, threshold
, hardlimit
);
4747 this->checkReturnValue(result
);
4748 return BDD(ddMgr
, result
);
4750 } // BDD::SubsetShortPaths
4754 BDD::SupersetShortPaths(
4757 int hardlimit
) const
4759 DdManager
*mgr
= ddMgr
->p
->manager
;
4760 DdNode
*result
= Cudd_SupersetShortPaths(mgr
, node
, numVars
, threshold
, hardlimit
);
4761 this->checkReturnValue(result
);
4762 return BDD(ddMgr
, result
);
4764 } // BDD::SupersetShortPaths
4772 Cudd_SymmProfile(p
->manager
, lower
, upper
);
4774 } // Cudd::SymmProfile
4779 unsigned int pr
) const
4781 return Cudd_Prime(pr
);
4787 ABDD::PrintMinterm() const
4790 DdManager
*mgr
= ddMgr
->p
->manager
;
4791 int result
= Cudd_PrintMinterm(mgr
, node
);
4792 this->checkReturnValue(result
);
4794 } // ABDD::PrintMinterm
4798 BDD::PrintCover() const
4801 DdManager
*mgr
= ddMgr
->p
->manager
;
4802 int result
= Cudd_bddPrintCover(mgr
, node
, node
);
4803 this->checkReturnValue(result
);
4805 } // BDD::PrintCover
4812 this->checkSameManager(u
);
4814 DdManager
*mgr
= ddMgr
->p
->manager
;
4815 int result
= Cudd_bddPrintCover(mgr
, node
, u
.node
);
4816 this->checkReturnValue(result
);
4818 } // BDD::PrintCover
4822 BDD::EstimateCofactor(
4826 DdManager
*mgr
= ddMgr
->p
->manager
;
4827 int result
= Cudd_EstimateCofactor(mgr
, node
, i
, phase
);
4828 this->checkReturnValue(result
!= CUDD_OUT_OF_MEM
);
4831 } // BDD::EstimateCofactor
4835 BDD::EstimateCofactorSimple(
4838 int result
= Cudd_EstimateCofactorSimple(node
, i
);
4841 } // BDD::EstimateCofactorSimple
4849 DdNode
**nodeArray
= ALLOC(DdNode
*,n
);
4850 for (int i
= 0; i
< n
; i
++) {
4851 nodeArray
[i
] = nodes
[i
].getNode();
4853 int result
= Cudd_SharingSize(nodeArray
, n
);
4855 this->checkReturnValue(result
> 0);
4858 } // Cudd::SharingSize
4865 DdManager
*mgr
= ddMgr
->p
->manager
;
4866 double result
= Cudd_CountMinterm(mgr
, node
, nvars
);
4867 this->checkReturnValue(result
!= (double) CUDD_OUT_OF_MEM
);
4870 } // ABDD::CountMinterm
4874 ABDD::CountPath() const
4876 double result
= Cudd_CountPath(node
);
4877 this->checkReturnValue(result
!= (double) CUDD_OUT_OF_MEM
);
4880 } // ABDD::CountPath
4884 ABDD::Support() const
4886 DdManager
*mgr
= ddMgr
->p
->manager
;
4887 DdNode
*result
= Cudd_Support(mgr
, node
);
4888 this->checkReturnValue(result
);
4889 return BDD(ddMgr
, result
);
4895 ABDD::SupportSize() const
4897 DdManager
*mgr
= ddMgr
->p
->manager
;
4898 int result
= Cudd_SupportSize(mgr
, node
);
4899 this->checkReturnValue(result
!= CUDD_OUT_OF_MEM
);
4902 } // ABDD::SupportSize
4906 BDDvector::VectorSupport() const
4909 DdManager
*mgr
= p
->manager
->getManager();
4910 DdNode
**F
= ALLOC(DdNode
*,n
);
4911 for (int i
= 0; i
< n
; i
++) {
4912 F
[i
] = p
->vect
[i
].getNode();
4914 DdNode
*result
= Cudd_VectorSupport(mgr
, F
, n
);
4916 p
->manager
->checkReturnValue(result
);
4917 return BDD(p
->manager
, result
);
4919 } // BDDvector::VectorSupport
4923 BDDvector::nodeCount() const
4926 DdNode
**nodeArray
= ALLOC(DdNode
*,n
);
4927 for (int i
= 0; i
< n
; i
++) {
4928 nodeArray
[i
] = p
->vect
[i
].getNode();
4930 int result
= Cudd_SharingSize(nodeArray
, n
);
4932 p
->manager
->checkReturnValue(result
> 0);
4935 } // BDDvector::nodeCount
4939 ADDvector::VectorSupport() const
4942 DdManager
*mgr
= p
->manager
->getManager();
4943 DdNode
**F
= ALLOC(DdNode
*,n
);
4944 for (int i
= 0; i
< n
; i
++) {
4945 F
[i
] = p
->vect
[i
].getNode();
4947 DdNode
*result
= Cudd_VectorSupport(mgr
, F
, n
);
4949 p
->manager
->checkReturnValue(result
);
4950 return BDD(p
->manager
, result
);
4952 } // ADDvector::VectorSupport
4956 BDDvector::VectorSupportSize() const
4959 DdManager
*mgr
= p
->manager
->getManager();
4960 DdNode
**F
= ALLOC(DdNode
*,n
);
4961 for (int i
= 0; i
< n
; i
++) {
4962 F
[i
] = p
->vect
[i
].getNode();
4964 int result
= Cudd_VectorSupportSize(mgr
, F
, n
);
4966 p
->manager
->checkReturnValue(result
!= CUDD_OUT_OF_MEM
);
4969 } // BDDvector::VectorSupportSize
4973 ADDvector::VectorSupportSize() const
4976 DdManager
*mgr
= p
->manager
->getManager();
4977 DdNode
**F
= ALLOC(DdNode
*,n
);
4978 for (int i
= 0; i
< n
; i
++) {
4979 F
[i
] = p
->vect
[i
].getNode();
4981 int result
= Cudd_VectorSupportSize(mgr
, F
, n
);
4983 p
->manager
->checkReturnValue(result
!= CUDD_OUT_OF_MEM
);
4986 } // ADDvector::VectorSupportSize
4990 ABDD::ClassifySupport(
4996 DdManager
*mgr
= this->checkSameManager(g
);
4998 int result
= Cudd_ClassifySupport(mgr
, node
, g
.node
, &C
, &F
, &G
);
4999 this->checkReturnValue(result
);
5000 *common
= BDD(ddMgr
, C
);
5001 *onlyF
= BDD(ddMgr
, F
);
5002 *onlyG
= BDD(ddMgr
, G
);
5004 } // ABDD::ClassifySupport
5008 ABDD::CountLeaves() const
5010 return Cudd_CountLeaves(node
);
5012 } // ABDD::CountLeaves
5017 char * string
) const
5019 DdManager
*mgr
= ddMgr
->p
->manager
;
5020 int result
= Cudd_bddPickOneCube(mgr
, node
, string
);
5021 this->checkReturnValue(result
);
5023 } // BDD::PickOneCube
5027 BDD::PickOneMinterm(
5028 BDDvector vars
) const
5030 int n
= vars
.count();
5031 DdManager
*mgr
= ddMgr
->p
->manager
;
5032 DdNode
**V
= ALLOC(DdNode
*,n
);
5033 for (int i
= 0; i
< n
; i
++) {
5034 V
[i
] = vars
[i
].node
;
5036 DdNode
*result
= Cudd_bddPickOneMinterm(mgr
, node
, V
, n
);
5038 this->checkReturnValue(result
);
5039 return BDD(ddMgr
, result
);
5041 } // BDD::PickOneMinterm
5047 CUDD_VALUE_TYPE
* value
) const
5049 DdManager
*mgr
= ddMgr
->p
->manager
;
5050 DdGen
*result
= Cudd_FirstCube(mgr
, node
, cube
, value
);
5051 this->checkReturnValue((DdNode
*)result
);
5054 } // ABDD::FirstCube
5061 CUDD_VALUE_TYPE
* value
)
5063 return Cudd_NextCube(gen
, cube
, value
);
5069 Cudd::bddComputeCube(
5074 DdManager
*mgr
= p
->manager
;
5075 DdNode
**V
= ALLOC(DdNode
*,n
);
5076 for (int i
= 0; i
< n
; i
++) {
5077 V
[i
] = vars
[i
].getNode();
5079 DdNode
*result
= Cudd_bddComputeCube(mgr
, V
, phase
, n
);
5081 this->checkReturnValue(result
);
5082 return BDD(this, result
);
5084 } // Cudd::bddComputeCube
5088 Cudd::addComputeCube(
5093 DdManager
*mgr
= p
->manager
;
5094 DdNode
**V
= ALLOC(DdNode
*,n
);
5095 for (int i
= 0; i
< n
; i
++) {
5096 V
[i
] = vars
[i
].getNode();
5098 DdNode
*result
= Cudd_addComputeCube(mgr
, V
, phase
, n
);
5100 this->checkReturnValue(result
);
5101 return ADD(this, result
);
5103 } // Cudd::addComputeCube
5110 DdManager
*mgr
= ddMgr
->p
->manager
;
5112 DdGen
*result
= Cudd_FirstNode(mgr
, node
, &Fn
);
5113 this->checkReturnValue((DdNode
*)result
);
5114 *fnode
= BDD(ddMgr
, Fn
);
5126 int result
= Cudd_NextNode(gen
, &nn
);
5127 *nnode
= BDD(this, nn
);
5137 return Cudd_GenFree(gen
);
5146 return Cudd_IsGenEmpty(gen
);
5152 Cudd::IndicesToCube(
5156 DdNode
*result
= Cudd_IndicesToCube(p
->manager
, array
, n
);
5157 this->checkReturnValue(result
);
5158 return BDD(this, result
);
5160 } // Cudd::IndicesToCube
5168 Cudd_PrintVersion(fp
);
5170 } // Cudd::PrintVersion
5174 Cudd::AverageDistance() const
5176 return Cudd_AverageDistance(p
->manager
);
5178 } // Cudd::AverageDistance
5184 return Cudd_Random();
5202 DdManager
*mgr
= ddMgr
->p
->manager
;
5203 double result
= Cudd_Density(mgr
, node
, nvars
);
5204 this->checkReturnValue(result
!= (double) CUDD_OUT_OF_MEM
);
5213 DdManager
*mgr
= ddMgr
->p
->manager
;
5214 int result
= Cudd_zddCount(mgr
, node
);
5215 this->checkReturnValue(result
!= CUDD_OUT_OF_MEM
);
5222 ZDD::CountDouble() const
5224 DdManager
*mgr
= ddMgr
->p
->manager
;
5225 double result
= Cudd_zddCountDouble(mgr
, node
);
5226 this->checkReturnValue(result
!= (double) CUDD_OUT_OF_MEM
);
5229 } // ZDD::CountDouble
5236 DdManager
*mgr
= this->checkSameManager(g
);
5237 DdNode
*result
= Cudd_zddProduct(mgr
, node
, g
.node
);
5238 this->checkReturnValue(result
);
5239 return ZDD(ddMgr
, result
);
5248 DdManager
*mgr
= this->checkSameManager(g
);
5249 DdNode
*result
= Cudd_zddUnateProduct(mgr
, node
, g
.node
);
5250 this->checkReturnValue(result
);
5251 return ZDD(ddMgr
, result
);
5253 } // ZDD::UnateProduct
5260 DdManager
*mgr
= this->checkSameManager(g
);
5261 DdNode
*result
= Cudd_zddWeakDiv(mgr
, node
, g
.node
);
5262 this->checkReturnValue(result
);
5263 return ZDD(ddMgr
, result
);
5272 DdManager
*mgr
= this->checkSameManager(g
);
5273 DdNode
*result
= Cudd_zddDivide(mgr
, node
, g
.node
);
5274 this->checkReturnValue(result
);
5275 return ZDD(ddMgr
, result
);
5284 DdManager
*mgr
= this->checkSameManager(g
);
5285 DdNode
*result
= Cudd_zddWeakDivF(mgr
, node
, g
.node
);
5286 this->checkReturnValue(result
);
5287 return ZDD(ddMgr
, result
);
5296 DdManager
*mgr
= this->checkSameManager(g
);
5297 DdNode
*result
= Cudd_zddDivideF(mgr
, node
, g
.node
);
5298 this->checkReturnValue(result
);
5299 return ZDD(ddMgr
, result
);
5305 Cudd::MakeZddTreeNode(
5310 return Cudd_MakeZddTreeNode(p
->manager
, low
, size
, type
);
5312 } // Cudd::MakeZddTreeNode
5320 DdManager
*mgr
= this->checkSameManager(U
);
5322 DdNode
*result
= Cudd_zddIsop(mgr
, node
, U
.node
, &Z
);
5323 this->checkReturnValue(result
);
5324 *zdd_I
= ZDD(ddMgr
, Z
);
5325 return BDD(ddMgr
, result
);
5334 DdManager
*mgr
= this->checkSameManager(U
);
5335 DdNode
*result
= Cudd_bddIsop(mgr
, node
, U
.node
);
5336 this->checkReturnValue(result
);
5337 return BDD(ddMgr
, result
);
5346 DdManager
*mgr
= ddMgr
->p
->manager
;
5347 double result
= Cudd_zddCountMinterm(mgr
, node
, path
);
5348 this->checkReturnValue(result
!= (double) CUDD_OUT_OF_MEM
);
5351 } // ZDD::CountMinterm
5355 Cudd::zddPrintSubtable() const
5358 Cudd_zddPrintSubtable(p
->manager
);
5360 } // Cudd::zddPrintSubtable
5364 BDD::PortToZdd() const
5366 DdManager
*mgr
= ddMgr
->p
->manager
;
5367 DdNode
*result
= Cudd_zddPortFromBdd(mgr
, node
);
5368 this->checkReturnValue(result
);
5369 return ZDD(ddMgr
, result
);
5375 ZDD::PortToBdd() const
5377 DdManager
*mgr
= ddMgr
->p
->manager
;
5378 DdNode
*result
= Cudd_zddPortToBdd(mgr
, node
);
5379 this->checkReturnValue(result
);
5380 return BDD(ddMgr
, result
);
5386 Cudd::zddReduceHeap(
5387 Cudd_ReorderingType heuristic
,
5390 int result
= Cudd_zddReduceHeap(p
->manager
, heuristic
, minsize
);
5391 this->checkReturnValue(result
);
5393 } // Cudd::zddReduceHeap
5397 Cudd::zddShuffleHeap(
5400 int result
= Cudd_zddShuffleHeap(p
->manager
, permutation
);
5401 this->checkReturnValue(result
);
5403 } // Cudd::zddShuffleHeap
5411 DdManager
*mgr
= this->checkSameManager(g
);
5412 this->checkSameManager(h
);
5413 DdNode
*result
= Cudd_zddIte(mgr
, node
, g
.node
, h
.node
);
5414 this->checkReturnValue(result
);
5415 return ZDD(ddMgr
, result
);
5424 DdManager
*mgr
= this->checkSameManager(Q
);
5425 DdNode
*result
= Cudd_zddUnion(mgr
, node
, Q
.node
);
5426 this->checkReturnValue(result
);
5427 return ZDD(ddMgr
, result
);
5436 DdManager
*mgr
= this->checkSameManager(Q
);
5437 DdNode
*result
= Cudd_zddIntersect(mgr
, node
, Q
.node
);
5438 this->checkReturnValue(result
);
5439 return ZDD(ddMgr
, result
);
5448 DdManager
*mgr
= this->checkSameManager(Q
);
5449 DdNode
*result
= Cudd_zddDiff(mgr
, node
, Q
.node
);
5450 this->checkReturnValue(result
);
5451 return ZDD(ddMgr
, result
);
5460 DdManager
*mgr
= this->checkSameManager(Q
);
5461 DdNode
*result
= Cudd_zddDiffConst(mgr
, node
, Q
.node
);
5462 this->checkReturnValue(result
);
5463 return ZDD(ddMgr
, result
);
5472 DdManager
*mgr
= ddMgr
->p
->manager
;
5473 DdNode
*result
= Cudd_zddSubset1(mgr
, node
, var
);
5474 this->checkReturnValue(result
);
5475 return ZDD(ddMgr
, result
);
5484 DdManager
*mgr
= ddMgr
->p
->manager
;
5485 DdNode
*result
= Cudd_zddSubset0(mgr
, node
, var
);
5486 this->checkReturnValue(result
);
5487 return ZDD(ddMgr
, result
);
5496 DdManager
*mgr
= ddMgr
->p
->manager
;
5497 DdNode
*result
= Cudd_zddChange(mgr
, node
, var
);
5498 this->checkReturnValue(result
);
5499 return ZDD(ddMgr
, result
);
5505 Cudd::zddSymmProfile(
5509 Cudd_zddSymmProfile(p
->manager
, lower
, upper
);
5511 } // Cudd::zddSymmProfile
5515 ZDD::PrintMinterm() const
5518 DdManager
*mgr
= ddMgr
->p
->manager
;
5519 int result
= Cudd_zddPrintMinterm(mgr
, node
);
5520 this->checkReturnValue(result
);
5522 } // ZDD::PrintMinterm
5526 ZDD::PrintCover() const
5529 DdManager
*mgr
= ddMgr
->p
->manager
;
5530 int result
= Cudd_zddPrintCover(mgr
, node
);
5531 this->checkReturnValue(result
);
5533 } // ZDD::PrintCover
5542 DdManager
*mgr
= p
->manager
->getManager();
5544 DdNode
**F
= ALLOC(DdNode
*,n
);
5545 for (int i
= 0; i
< n
; i
++) {
5546 F
[i
] = p
->vect
[i
].getNode();
5548 int result
= Cudd_zddDumpDot(mgr
, n
, F
, inames
, onames
, fp
);
5550 p
->manager
->checkReturnValue(result
);
5552 } // ZDDvector::DumpDot