modify default solver parameters
[cl-cudd.git] / distr / obj / cuddObj.cc
blob41df58ae3bacdf15e5fb7529fa7ecd20dceb6f39
1 /**CFile***********************************************************************
3 FileName [cuddObj.cc]
5 PackageName [cuddObj]
7 Synopsis [Functions for the C++ object-oriented encapsulation of CUDD.]
9 Description []
11 SeeAlso []
13 Author [Fabio Somenzi]
15 Copyright [Copyright (c) 1995-2004, Regents of the University of Colorado
17 All rights reserved.
19 Redistribution and use in source and binary forms, with or without
20 modification, are permitted provided that the following conditions
21 are met:
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 ******************************************************************************/
49 #include "cuddObj.hh"
51 // ---------------------------------------------------------------------------
52 // Variable declarations
53 // ---------------------------------------------------------------------------
55 #ifndef lint
56 static char rcsid[] UTIL_UNUSED = "$Id: cuddObj.cc,v 1.13 2009/02/21 19:41:38 fabio Exp fabio $";
57 #endif
59 // ---------------------------------------------------------------------------
60 // Members of class DD
61 // ---------------------------------------------------------------------------
64 DD::DD(Cudd *ddManager, DdNode *ddNode) {
65 ddMgr = ddManager;
66 node = 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";
73 } // DD::DD
76 DD::DD() {
77 ddMgr = 0;
78 node = 0;
80 } // DD::DD
83 DD::DD(const DD &from) {
84 ddMgr = from.ddMgr;
85 node = from.node;
86 if (node != 0) {
87 Cudd_Ref(node);
88 if (ddMgr->isVerbose()) {
89 cout << "Copy DD constructor for node " << hex << long(node) <<
90 " ref = " << Cudd_Regular(node)->ref << "\n";
94 } // DD::DD
97 DD::~DD() {}
100 inline DdManager *
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.");
108 return mgr;
110 } // DD::checkSameManager
113 inline void
114 DD::checkReturnValue(
115 const DdNode *result) const
117 if (result == 0) {
118 DdManager *mgr = ddMgr->p->manager;
119 Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr);
120 switch (errType) {
121 case CUDD_MEMORY_OUT:
122 ddMgr->p->errorHandler("Out of memory.");
123 break;
124 case CUDD_TOO_MANY_NODES:
125 break;
126 case CUDD_MAX_MEM_EXCEEDED:
127 ddMgr->p->errorHandler("Maximum memory exceeded.");
128 break;
129 case CUDD_INVALID_ARG:
130 ddMgr->p->errorHandler("Invalid argument.");
131 break;
132 case CUDD_INTERNAL_ERROR:
133 ddMgr->p->errorHandler("Internal error.");
134 break;
135 case CUDD_NO_ERROR:
136 default:
137 ddMgr->p->errorHandler("Unexpected error.");
138 break;
142 } // DD::checkReturnValue
145 inline void
146 DD::checkReturnValue(
147 const int result,
148 const int expected) const
150 if (result != expected) {
151 DdManager *mgr = ddMgr->p->manager;
152 Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr);
153 switch (errType) {
154 case CUDD_MEMORY_OUT:
155 ddMgr->p->errorHandler("Out of memory.");
156 break;
157 case CUDD_TOO_MANY_NODES:
158 break;
159 case CUDD_MAX_MEM_EXCEEDED:
160 ddMgr->p->errorHandler("Maximum memory exceeded.");
161 break;
162 case CUDD_INVALID_ARG:
163 ddMgr->p->errorHandler("Invalid argument.");
164 break;
165 case CUDD_INTERNAL_ERROR:
166 ddMgr->p->errorHandler("Internal error.");
167 break;
168 case CUDD_NO_ERROR:
169 default:
170 ddMgr->p->errorHandler("Unexpected error.");
171 break;
175 } // DD::checkReturnValue
178 Cudd *
179 DD::manager() const
181 return ddMgr;
183 } // DD::manager
186 inline DdNode *
187 DD::getNode() const
189 return node;
191 } // DD::getNode
195 DD::nodeCount() const
197 return Cudd_DagSize(node);
199 } // DD::nodeCount
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) {}
212 ABDD::~ABDD() {
213 if (node != 0) {
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";
221 } // ABDD::~ABDD
225 ABDD::operator==(
226 const ABDD& other) const
228 this->checkSameManager(other);
229 return node == other.node;
231 } // ABDD::operator==
235 ABDD::operator!=(
236 const ABDD& other) const
238 this->checkSameManager(other);
239 return node != other.node;
241 } // ABDD::operator!=
244 void
245 ABDD::print(
246 int nvars,
247 int verbosity) const
249 cout.flush();
250 int retval = Cudd_PrintDebug(ddMgr->p->manager,node,nvars,verbosity);
251 if (retval == 0) ddMgr->p->errorHandler("print failed");
253 } // ABDD::print
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) {}
266 BDD::operator==(
267 const BDD& other) const
269 this->checkSameManager(other);
270 return node == other.node;
272 } // BDD::operator==
276 BDD::operator!=(
277 const BDD& other) const
279 this->checkSameManager(other);
280 return node != other.node;
282 } // BDD::operator!=
286 BDD::operator=(
287 const BDD& right)
289 if (this == &right) return *this;
290 if (right.node != 0) Cudd_Ref(right.node);
291 if (node != 0) {
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";
298 node = right.node;
299 ddMgr = right.ddMgr;
300 if (node != 0 && ddMgr->isVerbose()) {
301 cout << "BDD assignment for node " << hex << long(node) <<
302 " ref = " << Cudd_Regular(node)->ref << "\n";
304 return *this;
306 } // BDD::operator=
310 BDD::operator<=(
311 const BDD& other) const
313 DdManager *mgr = this->checkSameManager(other);
314 return Cudd_bddLeq(mgr,node,other.node);
316 } // BDD::operator<=
320 BDD::operator>=(
321 const BDD& other) const
323 DdManager *mgr = this->checkSameManager(other);
324 return Cudd_bddLeq(mgr,other.node,node);
326 } // BDD::operator>=
330 BDD::operator<(
331 const BDD& other) const
333 DdManager *mgr = this->checkSameManager(other);
334 return node != other.node && Cudd_bddLeq(mgr,node,other.node);
336 } // BDD::operator<
340 BDD::operator>(
341 const BDD& other) const
343 DdManager *mgr = this->checkSameManager(other);
344 return node != other.node && Cudd_bddLeq(mgr,other.node,node);
346 } // BDD::operator>
350 BDD::operator!() const
352 return BDD(ddMgr, Cudd_Not(node));
354 } // BDD::operator!
358 BDD::operator~() const
360 return BDD(ddMgr, Cudd_Not(node));
362 } // BDD::operator~
366 BDD::operator*(
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);
374 } // BDD::operator*
378 BDD::operator*=(
379 const BDD& other)
381 DdManager *mgr = this->checkSameManager(other);
382 DdNode *result = Cudd_bddAnd(mgr,node,other.node);
383 this->checkReturnValue(result);
384 Cudd_Ref(result);
385 Cudd_RecursiveDeref(mgr,node);
386 node = result;
387 return *this;
389 } // BDD::operator*=
393 BDD::operator&(
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);
401 } // BDD::operator&
405 BDD::operator&=(
406 const BDD& other)
408 DdManager *mgr = this->checkSameManager(other);
409 DdNode *result = Cudd_bddAnd(mgr,node,other.node);
410 this->checkReturnValue(result);
411 Cudd_Ref(result);
412 Cudd_RecursiveDeref(mgr,node);
413 node = result;
414 return *this;
416 } // BDD::operator&=
420 BDD::operator+(
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);
428 } // BDD::operator+
432 BDD::operator+=(
433 const BDD& other)
435 DdManager *mgr = this->checkSameManager(other);
436 DdNode *result = Cudd_bddOr(mgr,node,other.node);
437 this->checkReturnValue(result);
438 Cudd_Ref(result);
439 Cudd_RecursiveDeref(mgr,node);
440 node = result;
441 return *this;
443 } // BDD::operator+=
447 BDD::operator|(
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);
455 } // BDD::operator|
459 BDD::operator|=(
460 const BDD& other)
462 DdManager *mgr = this->checkSameManager(other);
463 DdNode *result = Cudd_bddOr(mgr,node,other.node);
464 this->checkReturnValue(result);
465 Cudd_Ref(result);
466 Cudd_RecursiveDeref(mgr,node);
467 node = result;
468 return *this;
470 } // BDD::operator|=
474 BDD::operator^(
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);
482 } // BDD::operator^
486 BDD::operator^=(
487 const BDD& other)
489 DdManager *mgr = this->checkSameManager(other);
490 DdNode *result = Cudd_bddXor(mgr,node,other.node);
491 this->checkReturnValue(result);
492 Cudd_Ref(result);
493 Cudd_RecursiveDeref(mgr,node);
494 node = result;
495 return *this;
497 } // BDD::operator^=
501 BDD::operator-(
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);
509 } // BDD::operator-
513 BDD::operator-=(
514 const BDD& other)
516 DdManager *mgr = this->checkSameManager(other);
517 DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node));
518 this->checkReturnValue(result);
519 Cudd_Ref(result);
520 Cudd_RecursiveDeref(mgr,node);
521 node = result;
522 return *this;
524 } // BDD::operator-=
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) {}
538 ADD::operator==(
539 const ADD& other) const
541 this->checkSameManager(other);
542 return node == other.node;
544 } // ADD::operator==
548 ADD::operator!=(
549 const ADD& other) const
551 this->checkSameManager(other);
552 return node != other.node;
554 } // ADD::operator!=
558 ADD::operator=(
559 const ADD& right)
561 if (this == &right) return *this;
562 if (right.node != 0) Cudd_Ref(right.node);
563 if (node != 0) {
564 Cudd_RecursiveDeref(ddMgr->p->manager,node);
566 node = right.node;
567 ddMgr = right.ddMgr;
568 return *this;
570 } // ADD::operator=
574 ADD::operator<=(
575 const ADD& other) const
577 DdManager *mgr = this->checkSameManager(other);
578 return Cudd_addLeq(mgr,node,other.node);
580 } // ADD::operator<=
584 ADD::operator>=(
585 const ADD& other) const
587 DdManager *mgr = this->checkSameManager(other);
588 return Cudd_addLeq(mgr,other.node,node);
590 } // ADD::operator>=
594 ADD::operator<(
595 const ADD& other) const
597 DdManager *mgr = this->checkSameManager(other);
598 return node != other.node && Cudd_addLeq(mgr,node,other.node);
600 } // ADD::operator<
604 ADD::operator>(
605 const ADD& other) const
607 DdManager *mgr = this->checkSameManager(other);
608 return node != other.node && Cudd_addLeq(mgr,other.node,node);
610 } // ADD::operator>
614 ADD::operator-() const
616 return ADD(ddMgr, Cudd_addNegate(ddMgr->p->manager,node));
618 } // ADD::operator-
622 ADD::operator*(
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);
630 } // ADD::operator*
634 ADD::operator*=(
635 const ADD& other)
637 DdManager *mgr = this->checkSameManager(other);
638 DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
639 this->checkReturnValue(result);
640 Cudd_Ref(result);
641 Cudd_RecursiveDeref(mgr,node);
642 node = result;
643 return *this;
645 } // ADD::operator*=
649 ADD::operator+(
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);
657 } // ADD::operator+
661 ADD::operator+=(
662 const ADD& other)
664 DdManager *mgr = this->checkSameManager(other);
665 DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node);
666 this->checkReturnValue(result);
667 Cudd_Ref(result);
668 Cudd_RecursiveDeref(mgr,node);
669 node = result;
670 return *this;
672 } // ADD::operator+=
676 ADD::operator-(
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);
684 } // ADD::operator-
688 ADD::operator-=(
689 const ADD& other)
691 DdManager *mgr = this->checkSameManager(other);
692 DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node);
693 this->checkReturnValue(result);
694 Cudd_Ref(result);
695 Cudd_RecursiveDeref(mgr,node);
696 node = result;
697 return *this;
699 } // ADD::operator-=
703 ADD::operator~() const
705 return ADD(ddMgr, Cudd_addCmpl(ddMgr->p->manager,node));
707 } // ADD::operator~
711 ADD::operator&(
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);
719 } // ADD::operator&
723 ADD::operator&=(
724 const ADD& other)
726 DdManager *mgr = this->checkSameManager(other);
727 DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
728 this->checkReturnValue(result);
729 Cudd_Ref(result);
730 Cudd_RecursiveDeref(mgr,node);
731 node = result;
732 return *this;
734 } // ADD::operator&=
738 ADD::operator|(
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);
746 } // ADD::operator|
750 ADD::operator|=(
751 const ADD& other)
753 DdManager *mgr = this->checkSameManager(other);
754 DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node);
755 this->checkReturnValue(result);
756 Cudd_Ref(result);
757 Cudd_RecursiveDeref(mgr,node);
758 node = result;
759 return *this;
761 } // ADD::operator|=
764 // ---------------------------------------------------------------------------
765 // Members of class ZDD
766 // ---------------------------------------------------------------------------
769 ZDD::ZDD(Cudd *bddManager, DdNode *bddNode) : DD(bddManager,bddNode) {}
770 ZDD::ZDD() : DD() {}
771 ZDD::ZDD(const ZDD &from) : DD(from) {}
774 ZDD::~ZDD() {
775 if (node != 0) {
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";
783 } // ZDD::~ZDD
787 ZDD::operator=(
788 const ZDD& right)
790 if (this == &right) return *this;
791 if (right.node != 0) Cudd_Ref(right.node);
792 if (node != 0) {
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";
799 node = right.node;
800 ddMgr = right.ddMgr;
801 if (node != 0 && ddMgr->isVerbose()) {
802 cout << "ZDD assignment for node " << hex << long(node) <<
803 " ref = " << node->ref << "\n";
805 return *this;
807 } // ZDD::operator=
811 ZDD::operator==(
812 const ZDD& other) const
814 this->checkSameManager(other);
815 return node == other.node;
817 } // ZDD::operator==
821 ZDD::operator!=(
822 const ZDD& other) const
824 this->checkSameManager(other);
825 return node != other.node;
827 } // ZDD::operator!=
831 ZDD::operator<=(
832 const ZDD& other) const
834 DdManager *mgr = this->checkSameManager(other);
835 return Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr);
837 } // ZDD::operator<=
841 ZDD::operator>=(
842 const ZDD& other) const
844 DdManager *mgr = this->checkSameManager(other);
845 return Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr);
847 } // ZDD::operator>=
851 ZDD::operator<(
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);
858 } // ZDD::operator<
862 ZDD::operator>(
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);
869 } // ZDD::operator>
872 void
873 ZDD::print(
874 int nvars,
875 int verbosity) const
877 cout.flush();
878 int retval = Cudd_zddPrintDebug(ddMgr->p->manager,node,nvars,verbosity);
879 if (retval == 0) ddMgr->p->errorHandler("print failed");
881 } // ZDD::print
885 ZDD::operator*(
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);
893 } // ZDD::operator*
897 ZDD::operator*=(
898 const ZDD& other)
900 DdManager *mgr = this->checkSameManager(other);
901 DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
902 this->checkReturnValue(result);
903 Cudd_Ref(result);
904 Cudd_RecursiveDerefZdd(mgr,node);
905 node = result;
906 return *this;
908 } // ZDD::operator*=
912 ZDD::operator&(
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);
920 } // ZDD::operator&
924 ZDD::operator&=(
925 const ZDD& other)
927 DdManager *mgr = this->checkSameManager(other);
928 DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
929 this->checkReturnValue(result);
930 Cudd_Ref(result);
931 Cudd_RecursiveDerefZdd(mgr,node);
932 node = result;
933 return *this;
935 } // ZDD::operator&=
939 ZDD::operator+(
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);
947 } // ZDD::operator+
951 ZDD::operator+=(
952 const ZDD& other)
954 DdManager *mgr = this->checkSameManager(other);
955 DdNode *result = Cudd_zddUnion(mgr,node,other.node);
956 this->checkReturnValue(result);
957 Cudd_Ref(result);
958 Cudd_RecursiveDerefZdd(mgr,node);
959 node = result;
960 return *this;
962 } // ZDD::operator+=
966 ZDD::operator|(
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);
974 } // ZDD::operator|
978 ZDD::operator|=(
979 const ZDD& other)
981 DdManager *mgr = this->checkSameManager(other);
982 DdNode *result = Cudd_zddUnion(mgr,node,other.node);
983 this->checkReturnValue(result);
984 Cudd_Ref(result);
985 Cudd_RecursiveDerefZdd(mgr,node);
986 node = result;
987 return *this;
989 } // ZDD::operator|=
993 ZDD::operator-(
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);
1001 } // ZDD::operator-
1005 ZDD::operator-=(
1006 const ZDD& other)
1008 DdManager *mgr = this->checkSameManager(other);
1009 DdNode *result = Cudd_zddDiff(mgr,node,other.node);
1010 this->checkReturnValue(result);
1011 Cudd_Ref(result);
1012 Cudd_RecursiveDerefZdd(mgr,node);
1013 node = result;
1014 return *this;
1016 } // ZDD::operator-=
1019 // ---------------------------------------------------------------------------
1020 // Members of class Cudd
1021 // ---------------------------------------------------------------------------
1024 Cudd::Cudd(
1025 unsigned int numVars,
1026 unsigned int numVarsZ,
1027 unsigned int numSlots,
1028 unsigned int cacheSize,
1029 unsigned long maxMemory)
1031 p = new capsule;
1032 p->manager = Cudd_Init(numVars,numVarsZ,numSlots,cacheSize,maxMemory);
1033 p->errorHandler = defaultError;
1034 p->verbose = 0; // initially terse
1035 p->ref = 1;
1037 } // Cudd::Cudd
1040 Cudd::Cudd(
1041 Cudd& x)
1043 p = x.p;
1044 x.p->ref++;
1046 } // Cudd::Cudd
1049 Cudd::~Cudd()
1051 if (--p->ref == 0) {
1052 int retval = Cudd_CheckZeroRef(p->manager);
1053 if (retval != 0) {
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);
1059 delete p;
1062 } // Cudd::~Cudd
1065 Cudd&
1066 Cudd::operator=(
1067 const Cudd& right)
1069 right.p->ref++;
1070 if (--p->ref == 0) { // disconnect self
1071 int retval = Cudd_CheckZeroRef(p->manager);
1072 if (retval != 0) {
1073 cerr << retval << " unexpected non-zero reference counts\n";
1075 Cudd_Quit(p->manager);
1076 delete p;
1078 p = right.p;
1079 return *this;
1081 } // Cudd::operator=
1085 Cudd::setHandler(
1086 PFC newHandler)
1088 PFC oldHandler = p->errorHandler;
1089 p->errorHandler = newHandler;
1090 return oldHandler;
1092 } // Cudd::setHandler
1096 Cudd::getHandler() const
1098 return p->errorHandler;
1100 } // Cudd::getHandler
1103 inline void
1104 Cudd::checkReturnValue(
1105 const DdNode *result) const
1107 if (result == 0) {
1108 if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) {
1109 p->errorHandler("Out of memory.");
1110 } else {
1111 p->errorHandler("Internal error.");
1115 } // Cudd::checkReturnValue
1118 inline void
1119 Cudd::checkReturnValue(
1120 const int result) const
1122 if (result == 0) {
1123 if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) {
1124 p->errorHandler("Out of memory.");
1125 } else {
1126 p->errorHandler("Internal error.");
1130 } // Cudd::checkReturnValue
1133 void
1134 Cudd::info() const
1136 cout.flush();
1137 int retval = Cudd_PrintInfo(p->manager,stdout);
1138 this->checkReturnValue(retval);
1140 } // Cudd::info
1144 Cudd::bddVar()
1146 DdNode *result = Cudd_bddNewVar(p->manager);
1147 this->checkReturnValue(result);
1148 return BDD(this, result);
1150 } // Cudd::bddVar
1154 Cudd::bddVar(
1155 int index)
1157 DdNode *result = Cudd_bddIthVar(p->manager,index);
1158 this->checkReturnValue(result);
1159 return BDD(this, result);
1161 } // Cudd::bddVar
1165 Cudd::bddOne()
1167 DdNode *result = Cudd_ReadOne(p->manager);
1168 this->checkReturnValue(result);
1169 return BDD(this, result);
1171 } // Cudd::bddOne
1175 Cudd::bddZero()
1177 DdNode *result = Cudd_ReadLogicZero(p->manager);
1178 this->checkReturnValue(result);
1179 return BDD(this, result);
1181 } // Cudd::bddZero
1185 Cudd::addVar()
1187 DdNode *result = Cudd_addNewVar(p->manager);
1188 this->checkReturnValue(result);
1189 return ADD(this, result);
1191 } // Cudd::addVar
1195 Cudd::addVar(
1196 int index)
1198 DdNode *result = Cudd_addIthVar(p->manager,index);
1199 this->checkReturnValue(result);
1200 return ADD(this, result);
1202 } // Cudd::addVar
1206 Cudd::addOne()
1208 DdNode *result = Cudd_ReadOne(p->manager);
1209 this->checkReturnValue(result);
1210 return ADD(this, result);
1212 } // Cudd::addOne
1216 Cudd::addZero()
1218 DdNode *result = Cudd_ReadZero(p->manager);
1219 this->checkReturnValue(result);
1220 return ADD(this, result);
1222 } // Cudd::addZero
1226 Cudd::constant(
1227 CUDD_VALUE_TYPE c)
1229 DdNode *result = Cudd_addConst(p->manager, c);
1230 this->checkReturnValue(result);
1231 return ADD(this, result);
1233 } // Cudd::constant
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
1257 Cudd::zddVar(
1258 int index)
1260 DdNode *result = Cudd_zddIthVar(p->manager,index);
1261 this->checkReturnValue(result);
1262 return ZDD(this, result);
1264 } // Cudd::zddVar
1268 Cudd::zddOne(
1269 int i)
1271 DdNode *result = Cudd_ReadZddOne(p->manager,i);
1272 this->checkReturnValue(result);
1273 return ZDD(this, result);
1275 } // Cudd::zddOne
1279 Cudd::zddZero()
1281 DdNode *result = Cudd_ReadZero(p->manager);
1282 this->checkReturnValue(result);
1283 return ZDD(this, result);
1285 } // Cudd::zddZero
1288 void
1289 defaultError(
1290 string message)
1292 cerr << message << "\n";
1293 exit(1);
1295 } // defaultError
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");
1306 p = new capsule;
1307 p->size = size;
1308 p->manager = manager;
1309 p->vect = new BDD[size];
1310 p->ref = 1;
1311 for (int i = 0; i < size; i++) {
1312 if (nodes == 0) {
1313 p->vect[i] = BDD();
1314 } else {
1315 p->vect[i] = BDD(manager, nodes[i]);
1318 if (manager != 0 && manager->isVerbose()) {
1319 cout << "Standard BDDvector constructor for vector " << hex << long(p)
1320 << "\n";
1323 } // BDDvector::BDDvector
1326 BDDvector::BDDvector(const BDDvector &from)
1328 p = from.p;
1329 p->ref++;
1330 if (p->manager != 0 && p->manager->isVerbose()) {
1331 cout << "Copy BDDvector constructor for vector " << hex << long(p)
1332 << "\n";
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) {
1345 delete [] p->vect;
1346 delete p;
1349 } // BDDvector::~BDDvector
1352 BDDvector&
1353 BDDvector::operator=(
1354 const BDDvector& right)
1356 right.p->ref++;
1357 if (--p->ref == 0) { // disconnect self
1358 for (int i = 1; i < p->size; i++) {
1359 delete &(p->vect[i]);
1361 delete p->vect;
1362 delete p;
1364 p = right.p;
1365 return *this;
1367 } // BDDvector::operator=
1370 BDD&
1371 BDDvector::operator[](int i) const
1373 if (i >= p->size)
1374 (p->manager->getHandler())("Out-of-bounds access attempted");
1375 return p->vect[i];
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");
1388 p = new capsule;
1389 p->size = size;
1390 p->manager = manager;
1391 p->vect = new ADD[size];
1392 p->ref = 1;
1393 for (int i = 0; i < size; i++) {
1394 if (nodes == 0) {
1395 p->vect[i] = ADD();
1396 } else {
1397 p->vect[i] = ADD(manager, nodes[i]);
1400 if (manager != 0 && manager->isVerbose()) {
1401 cout << "Standard ADDvector constructor for vector " << hex << long(p)
1402 << "\n";
1405 } // ADDvector::ADDvector
1408 ADDvector::ADDvector(const ADDvector &from)
1410 p = from.p;
1411 p->ref++;
1412 if (p->manager != 0 && p->manager->isVerbose()) {
1413 cout << "Copy ADDvector constructor for vector " << hex << long(p)
1414 << "\n";
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) {
1427 delete [] p->vect;
1428 delete p;
1431 } // ADDvector::~ADDvector
1434 ADDvector&
1435 ADDvector::operator=(
1436 const ADDvector& right)
1438 right.p->ref++;
1439 if (--p->ref == 0) { // disconnect self
1440 for (int i = 1; i < p->size; i++) {
1441 delete &(p->vect[i]);
1443 delete p->vect;
1444 delete p;
1446 p = right.p;
1447 return *this;
1449 } // ADDvector::operator=
1452 ADD&
1453 ADDvector::operator[](int i) const
1455 if (i >= p->size)
1456 (p->manager->getHandler())("Out-of-bounds access attempted");
1457 return p->vect[i];
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");
1470 p = new capsule;
1471 p->size = size;
1472 p->manager = manager;
1473 p->vect = new ZDD[size];
1474 p->ref = 1;
1475 for (int i = 0; i < size; i++) {
1476 if (nodes == 0) {
1477 p->vect[i] = ZDD();
1478 } else {
1479 p->vect[i] = ZDD(manager, nodes[i]);
1482 if (manager != 0 && manager->isVerbose()) {
1483 cout << "Standard ZDDvector constructor for vector " << hex << long(p)
1484 << "\n";
1487 } // ZDDvector::ZDDvector
1490 ZDDvector::ZDDvector(const ZDDvector &from)
1492 p = from.p;
1493 p->ref++;
1494 if (p->manager != 0 && p->manager->isVerbose()) {
1495 cout << "Copy ZDDvector constructor for vector " << hex << long(p)
1496 << "\n";
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) {
1509 delete [] p->vect;
1510 delete p;
1513 } // ZDDvector::~ZDDvector
1516 ZDDvector&
1517 ZDDvector::operator=(
1518 const ZDDvector& right)
1520 right.p->ref++;
1521 if (--p->ref == 0) { // disconnect self
1522 for (int i = 1; i < p->size; i++) {
1523 delete &(p->vect[i]);
1525 delete p->vect;
1526 delete p;
1528 p = right.p;
1529 return *this;
1531 } // ZDDvector::operator=
1534 ZDD&
1535 ZDDvector::operator[](int i) const
1537 if (i >= p->size)
1538 (p->manager->getHandler())("Out-of-bounds access attempted");
1539 return p->vect[i];
1541 } // ZDDvector::operator[]
1544 // ---------------------------------------------------------------------------
1545 // All the rest
1546 // ---------------------------------------------------------------------------
1550 Cudd::addNewVarAtLevel(
1551 int level)
1553 DdNode *result = Cudd_addNewVarAtLevel(p->manager, level);
1554 this->checkReturnValue(result);
1555 return ADD(this, result);
1557 } // Cudd::addNewVarAtLevel
1561 Cudd::bddNewVarAtLevel(
1562 int level)
1564 DdNode *result = Cudd_bddNewVarAtLevel(p->manager, level);
1565 this->checkReturnValue(result);
1566 return BDD(this, result);
1568 } // Cudd::bddNewVarAtLevel
1571 void
1572 Cudd::zddVarsFromBddVars(
1573 int multiplicity)
1575 int result = Cudd_zddVarsFromBddVars(p->manager, multiplicity);
1576 this->checkReturnValue(result);
1578 } // Cudd::zddVarsFromBddVars
1581 void
1582 Cudd::AutodynEnable(
1583 Cudd_ReorderingType method)
1585 Cudd_AutodynEnable(p->manager, method);
1587 } // Cudd::AutodynEnable
1590 void
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
1607 void
1608 Cudd::AutodynEnableZdd(
1609 Cudd_ReorderingType method)
1611 Cudd_AutodynEnableZdd(p->manager, method);
1613 } // Cudd::AutodynEnableZdd
1616 void
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
1641 void
1642 Cudd::zddRealignEnable()
1644 Cudd_zddRealignEnable(p->manager);
1646 } // Cudd::zddRealignEnable
1649 void
1650 Cudd::zddRealignDisable()
1652 Cudd_zddRealignDisable(p->manager);
1654 } // Cudd::zddRealignDisable
1658 Cudd::bddRealignmentEnabled() const
1660 return Cudd_bddRealignmentEnabled(p->manager);
1662 } // Cudd::bddRealignmentEnabled
1665 void
1666 Cudd::bddRealignEnable()
1668 Cudd_bddRealignEnable(p->manager);
1670 } // Cudd::bddRealignEnable
1673 void
1674 Cudd::bddRealignDisable()
1676 Cudd_bddRealignDisable(p->manager);
1678 } // Cudd::bddRealignDisable
1682 Cudd::background()
1684 DdNode *result = Cudd_ReadBackground(p->manager);
1685 this->checkReturnValue(result);
1686 return ADD(this, result);
1688 } // Cudd::background
1691 void
1692 Cudd::SetBackground(
1693 ADD bg)
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
1704 unsigned int
1705 Cudd::ReadCacheSlots() const
1707 return Cudd_ReadCacheSlots(p->manager);
1709 } // Cudd::ReadCacheSlots
1712 double
1713 Cudd::ReadCacheLookUps() const
1715 return Cudd_ReadCacheLookUps(p->manager);
1717 } // Cudd::ReadCacheLookUps
1720 double
1721 Cudd::ReadCacheUsedSlots() const
1723 return Cudd_ReadCacheUsedSlots(p->manager);
1725 } // Cudd::ReadCacheUsedSlots
1728 double
1729 Cudd::ReadCacheHits() const
1731 return Cudd_ReadCacheHits(p->manager);
1733 } // Cudd::ReadCacheHits
1736 unsigned int
1737 Cudd::ReadMinHit() const
1739 return Cudd_ReadMinHit(p->manager);
1741 } // Cudd::ReadMinHit
1744 void
1745 Cudd::SetMinHit(
1746 unsigned int hr)
1748 Cudd_SetMinHit(p->manager, hr);
1750 } // Cudd::SetMinHit
1753 unsigned int
1754 Cudd::ReadLooseUpTo() const
1756 return Cudd_ReadLooseUpTo(p->manager);
1758 } // Cudd::ReadLooseUpTo
1761 void
1762 Cudd::SetLooseUpTo(
1763 unsigned int lut)
1765 Cudd_SetLooseUpTo(p->manager, lut);
1767 } // Cudd::SetLooseUpTo
1770 unsigned int
1771 Cudd::ReadMaxCache() const
1773 return Cudd_ReadMaxCache(p->manager);
1775 } // Cudd::ReadMaxCache
1778 unsigned int
1779 Cudd::ReadMaxCacheHard() const
1781 return Cudd_ReadMaxCacheHard(p->manager);
1783 } // Cudd::ReadMaxCacheHard
1786 void
1787 Cudd::SetMaxCacheHard(
1788 unsigned int mc)
1790 Cudd_SetMaxCacheHard(p->manager, mc);
1792 } // Cudd::SetMaxCacheHard
1796 Cudd::ReadSize() const
1798 return Cudd_ReadSize(p->manager);
1800 } // Cudd::ReadSize
1804 Cudd::ReadZddSize() const
1806 return Cudd_ReadZddSize(p->manager);
1808 } // Cudd::ReadZddSize
1811 unsigned int
1812 Cudd::ReadSlots() const
1814 return Cudd_ReadSlots(p->manager);
1816 } // Cudd::ReadSlots
1819 unsigned int
1820 Cudd::ReadKeys() const
1822 return Cudd_ReadKeys(p->manager);
1824 } // Cudd::ReadKeys
1827 unsigned int
1828 Cudd::ReadDead() const
1830 return Cudd_ReadDead(p->manager);
1832 } // Cudd::ReadDead
1835 unsigned int
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
1851 long
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
1867 long
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
1883 void
1884 Cudd::SetSiftMaxVar(
1885 int smv)
1887 Cudd_SetSiftMaxVar(p->manager, smv);
1889 } // Cudd::SetSiftMaxVar
1893 Cudd::ReadSiftMaxSwap() const
1895 return Cudd_ReadSiftMaxSwap(p->manager);
1897 } // Cudd::ReadSiftMaxSwap
1900 void
1901 Cudd::SetSiftMaxSwap(
1902 int sms)
1904 Cudd_SetSiftMaxSwap(p->manager, sms);
1906 } // Cudd::SetSiftMaxSwap
1909 double
1910 Cudd::ReadMaxGrowth() const
1912 return Cudd_ReadMaxGrowth(p->manager);
1914 } // Cudd::ReadMaxGrowth
1917 void
1918 Cudd::SetMaxGrowth(
1919 double mg)
1921 Cudd_SetMaxGrowth(p->manager, mg);
1923 } // Cudd::SetMaxGrowth
1926 MtrNode *
1927 Cudd::ReadTree() const
1929 return Cudd_ReadTree(p->manager);
1931 } // Cudd::ReadTree
1934 void
1935 Cudd::SetTree(
1936 MtrNode * tree)
1938 Cudd_SetTree(p->manager, tree);
1940 } // Cudd::SetTree
1943 void
1944 Cudd::FreeTree()
1946 Cudd_FreeTree(p->manager);
1948 } // Cudd::FreeTree
1951 MtrNode *
1952 Cudd::ReadZddTree() const
1954 return Cudd_ReadZddTree(p->manager);
1956 } // Cudd::ReadZddTree
1959 void
1960 Cudd::SetZddTree(
1961 MtrNode * tree)
1963 Cudd_SetZddTree(p->manager, tree);
1965 } // Cudd::SetZddTree
1968 void
1969 Cudd::FreeZddTree()
1971 Cudd_FreeZddTree(p->manager);
1973 } // Cudd::FreeZddTree
1976 unsigned int
1977 DD::NodeReadIndex() const
1979 return Cudd_NodeReadIndex(node);
1981 } // DD::NodeReadIndex
1985 Cudd::ReadPerm(
1986 int i) const
1988 return Cudd_ReadPerm(p->manager, i);
1990 } // Cudd::ReadPerm
1994 Cudd::ReadPermZdd(
1995 int i) const
1997 return Cudd_ReadPermZdd(p->manager, i);
1999 } // Cudd::ReadPermZdd
2003 Cudd::ReadInvPerm(
2004 int i) const
2006 return Cudd_ReadInvPerm(p->manager, i);
2008 } // Cudd::ReadInvPerm
2012 Cudd::ReadInvPermZdd(
2013 int i) const
2015 return Cudd_ReadInvPermZdd(p->manager, i);
2017 } // Cudd::ReadInvPermZdd
2021 Cudd::ReadVars(
2022 int i)
2024 DdNode *result = Cudd_ReadVars(p->manager, i);
2025 this->checkReturnValue(result);
2026 return BDD(this, result);
2028 } // Cudd::ReadVars
2031 CUDD_VALUE_TYPE
2032 Cudd::ReadEpsilon() const
2034 return Cudd_ReadEpsilon(p->manager);
2036 } // Cudd::ReadEpsilon
2039 void
2040 Cudd::SetEpsilon(
2041 CUDD_VALUE_TYPE ep)
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
2056 void
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
2073 void
2074 Cudd::EnableGarbageCollection()
2076 Cudd_EnableGarbageCollection(p->manager);
2078 } // Cudd::EnableGarbageCollection
2081 void
2082 Cudd::DisableGarbageCollection()
2084 Cudd_DisableGarbageCollection(p->manager);
2086 } // Cudd::DisableGarbageCollection
2090 Cudd::DeadAreCounted() const
2092 return Cudd_DeadAreCounted(p->manager);
2094 } // Cudd::DeadAreCounted
2097 void
2098 Cudd::TurnOnCountDead()
2100 Cudd_TurnOnCountDead(p->manager);
2102 } // Cudd::TurnOnCountDead
2105 void
2106 Cudd::TurnOffCountDead()
2108 Cudd_TurnOffCountDead(p->manager);
2110 } // Cudd::TurnOffCountDead
2114 Cudd::ReadRecomb() const
2116 return Cudd_ReadRecomb(p->manager);
2118 } // Cudd::ReadRecomb
2121 void
2122 Cudd::SetRecomb(
2123 int recomb)
2125 Cudd_SetRecomb(p->manager, recomb);
2127 } // Cudd::SetRecomb
2131 Cudd::ReadSymmviolation() const
2133 return Cudd_ReadSymmviolation(p->manager);
2135 } // Cudd::ReadSymmviolation
2138 void
2139 Cudd::SetSymmviolation(
2140 int symmviolation)
2142 Cudd_SetSymmviolation(p->manager, symmviolation);
2144 } // Cudd::SetSymmviolation
2148 Cudd::ReadArcviolation() const
2150 return Cudd_ReadArcviolation(p->manager);
2152 } // Cudd::ReadArcviolation
2155 void
2156 Cudd::SetArcviolation(
2157 int arcviolation)
2159 Cudd_SetArcviolation(p->manager, arcviolation);
2161 } // Cudd::SetArcviolation
2165 Cudd::ReadPopulationSize() const
2167 return Cudd_ReadPopulationSize(p->manager);
2169 } // Cudd::ReadPopulationSize
2172 void
2173 Cudd::SetPopulationSize(
2174 int populationSize)
2176 Cudd_SetPopulationSize(p->manager, populationSize);
2178 } // Cudd::SetPopulationSize
2182 Cudd::ReadNumberXovers() const
2184 return Cudd_ReadNumberXovers(p->manager);
2186 } // Cudd::ReadNumberXovers
2189 void
2190 Cudd::SetNumberXovers(
2191 int numberXovers)
2193 Cudd_SetNumberXovers(p->manager, numberXovers);
2195 } // Cudd::SetNumberXovers
2198 unsigned long
2199 Cudd::ReadMemoryInUse() const
2201 return Cudd_ReadMemoryInUse(p->manager);
2203 } // Cudd::ReadMemoryInUse
2206 long
2207 Cudd::ReadPeakNodeCount() const
2209 return Cudd_ReadPeakNodeCount(p->manager);
2211 } // Cudd::ReadPeakNodeCount
2214 long
2215 Cudd::ReadNodeCount() const
2217 return Cudd_ReadNodeCount(p->manager);
2219 } // Cudd::ReadNodeCount
2222 long
2223 Cudd::zddReadNodeCount() const
2225 return Cudd_zddReadNodeCount(p->manager);
2227 } // Cudd::zddReadNodeCount
2230 void
2231 Cudd::AddHook(
2232 DD_HFP f,
2233 Cudd_HookType where)
2235 int result = Cudd_AddHook(p->manager, f, where);
2236 this->checkReturnValue(result);
2238 } // Cudd::AddHook
2241 void
2242 Cudd::RemoveHook(
2243 DD_HFP f,
2244 Cudd_HookType where)
2246 int result = Cudd_RemoveHook(p->manager, f, where);
2247 this->checkReturnValue(result);
2249 } // Cudd::RemoveHook
2253 Cudd::IsInHook(
2254 DD_HFP f,
2255 Cudd_HookType where) const
2257 return Cudd_IsInHook(p->manager, f, where);
2259 } // Cudd::IsInHook
2262 void
2263 Cudd::EnableReorderingReporting()
2265 int result = Cudd_EnableReorderingReporting(p->manager);
2266 this->checkReturnValue(result);
2268 } // Cudd::EnableReorderingReporting
2271 void
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
2296 void
2297 Cudd::ClearErrorCode()
2299 Cudd_ClearErrorCode(p->manager);
2301 } // Cudd::ClearErrorCode
2304 FILE *
2305 Cudd::ReadStdout() const
2307 return Cudd_ReadStdout(p->manager);
2309 } // Cudd::ReadStdout
2312 void
2313 Cudd::SetStdout(FILE *fp)
2315 Cudd_SetStdout(p->manager, fp);
2317 } // Cudd::SetStdout
2320 FILE *
2321 Cudd::ReadStderr() const
2323 return Cudd_ReadStderr(p->manager);
2325 } // Cudd::ReadStderr
2328 void
2329 Cudd::SetStderr(FILE *fp)
2331 Cudd_SetStderr(p->manager, fp);
2333 } // Cudd::SetStderr
2336 unsigned int
2337 Cudd::ReadNextReordering() const
2339 return Cudd_ReadNextReordering(p->manager);
2341 } // Cudd::ReadNextReordering
2344 double
2345 Cudd::ReadSwapSteps() const
2347 return Cudd_ReadSwapSteps(p->manager);
2349 } // Cudd::ReadSwapSteps
2352 unsigned int
2353 Cudd::ReadMaxLive() const
2355 return Cudd_ReadMaxLive(p->manager);
2357 } // Cudd::ReadMaxLive
2360 void
2361 Cudd::SetMaxLive(unsigned int maxLive)
2363 Cudd_SetMaxLive(p->manager, maxLive);
2365 } // Cudd::SetMaxLive
2368 unsigned long
2369 Cudd::ReadMaxMemory() const
2371 return Cudd_ReadMaxMemory(p->manager);
2373 } // Cudd::ReadMaxMemory
2376 void
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
2409 ADD::ExistAbstract(
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
2421 ADD::UnivAbstract(
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
2433 ADD::OrAbstract(
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
2445 ADD::Plus(
2446 const ADD& g) const
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);
2453 } // ADD::Plus
2457 ADD::Times(
2458 const ADD& g) const
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);
2465 } // ADD::Times
2469 ADD::Threshold(
2470 const ADD& g) const
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);
2477 } // ADD::Threshold
2481 ADD::SetNZ(
2482 const ADD& g) const
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);
2489 } // ADD::SetNZ
2493 ADD::Divide(
2494 const ADD& g) const
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);
2501 } // ADD::Divide
2505 ADD::Minus(
2506 const ADD& g) const
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);
2513 } // ADD::Minus
2517 ADD::Minimum(
2518 const ADD& g) const
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);
2525 } // ADD::Minimum
2529 ADD::Maximum(
2530 const ADD& g) const
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);
2537 } // ADD::Maximum
2541 ADD::OneZeroMaximum(
2542 const ADD& g) const
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
2553 ADD::Diff(
2554 const ADD& g) const
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);
2561 } // ADD::Diff
2565 ADD::Agreement(
2566 const ADD& g) const
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);
2573 } // ADD::Agreement
2577 ADD::Or(
2578 const ADD& g) const
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);
2585 } // ADD::Or
2589 ADD::Nand(
2590 const ADD& g) const
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);
2597 } // ADD::Nand
2601 ADD::Nor(
2602 const ADD& g) const
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);
2609 } // ADD::Nor
2613 ADD::Xor(
2614 const ADD& g) const
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);
2621 } // ADD::Xor
2625 ADD::Xnor(
2626 const ADD& g) const
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);
2633 } // ADD::Xnor
2637 ADD::Log() const
2639 DdManager *mgr = ddMgr->p->manager;
2640 DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addLog, node);
2641 this->checkReturnValue(result);
2642 return ADD(ddMgr, result);
2644 } // ADD::Log
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);
2655 } // ADD::FindMax
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);
2666 } // ADD::FindMin
2670 ADD::IthBit(
2671 int bit) const
2673 DdManager *mgr = ddMgr->p->manager;
2674 DdNode *result = Cudd_addIthBit(mgr, node, bit);
2675 this->checkReturnValue(result);
2676 return ADD(ddMgr, result);
2678 } // ADD::IthBit
2682 ADD::ScalarInverse(
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
2694 ADD::Ite(
2695 const ADD& g,
2696 const ADD& h) const
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);
2704 } // ADD::Ite
2708 ADD::IteConstant(
2709 const ADD& g,
2710 const ADD& h) const
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
2722 ADD::EvalConst(
2723 const ADD& g) const
2725 DdManager *mgr = this->checkSameManager(g);
2726 DdNode *result = Cudd_addEvalConst(mgr, node, g.node);
2727 this->checkReturnValue(result);
2728 return ADD(ddMgr, result);
2730 } // ADD::EvalConst
2734 ADD::Leq(
2735 const ADD& g) const
2737 DdManager *mgr = this->checkSameManager(g);
2738 return Cudd_addLeq(mgr, node, g.node);
2740 } // ADD::Leq
2744 ADD::Cmpl() const
2746 DdManager *mgr = ddMgr->p->manager;
2747 DdNode *result = Cudd_addCmpl(mgr, node);
2748 this->checkReturnValue(result);
2749 return ADD(ddMgr, result);
2751 } // ADD::Cmpl
2755 ADD::Negate() const
2757 DdManager *mgr = ddMgr->p->manager;
2758 DdNode *result = Cudd_addNegate(mgr, node);
2759 this->checkReturnValue(result);
2760 return ADD(ddMgr, result);
2762 } // ADD::Negate
2766 ADD::RoundOff(
2767 int N) const
2769 DdManager *mgr = ddMgr->p->manager;
2770 DdNode *result = Cudd_addRoundOff(mgr, node, N);
2771 this->checkReturnValue(result);
2772 return ADD(ddMgr, result);
2774 } // ADD::RoundOff
2778 Cudd::Walsh(
2779 ADDvector x,
2780 ADDvector y)
2782 int n = x.count();
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);
2790 FREE(X);
2791 FREE(Y);
2792 this->checkReturnValue(result);
2793 return ADD(this, result);
2795 } // ADD::Walsh
2799 Cudd::addResidue(
2800 int n,
2801 int m,
2802 int options,
2803 int top)
2805 DdNode *result = Cudd_addResidue(p->manager, n, m, options, top);
2806 this->checkReturnValue(result);
2807 return ADD(this, result);
2809 } // Cudd::addResidue
2813 BDD::AndAbstract(
2814 const BDD& g,
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(
2828 const BDD& g,
2829 const BDD& cube,
2830 unsigned int limit) const
2832 DdManager *mgr = this->checkSameManager(g);
2833 this->checkSameManager(cube);
2834 DdNode *result = Cudd_bddAndAbstractLimit(mgr, node, g.node,
2835 cube.node, limit);
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
2851 DdApaNumber
2852 Cudd::NewApaNumber(
2853 int digits) const
2855 return Cudd_NewApaNumber(digits);
2857 } // Cudd::NewApaNumber
2860 void
2861 Cudd::ApaCopy(
2862 int digits,
2863 DdApaNumber source,
2864 DdApaNumber dest) const
2866 Cudd_ApaCopy(digits, source, dest);
2868 } // Cudd::ApaCopy
2871 DdApaDigit
2872 Cudd::ApaAdd(
2873 int digits,
2874 DdApaNumber a,
2875 DdApaNumber b,
2876 DdApaNumber sum) const
2878 return Cudd_ApaAdd(digits, a, b, sum);
2880 } // Cudd::ApaAdd
2883 DdApaDigit
2884 Cudd::ApaSubtract(
2885 int digits,
2886 DdApaNumber a,
2887 DdApaNumber b,
2888 DdApaNumber diff) const
2890 return Cudd_ApaSubtract(digits, a, b, diff);
2892 } // Cudd::ApaSubtract
2895 DdApaDigit
2896 Cudd::ApaShortDivision(
2897 int digits,
2898 DdApaNumber dividend,
2899 DdApaDigit divisor,
2900 DdApaNumber quotient) const
2902 return Cudd_ApaShortDivision(digits, dividend, divisor, quotient);
2904 } // Cudd::ApaShortDivision
2907 void
2908 Cudd::ApaShiftRight(
2909 int digits,
2910 DdApaDigit in,
2911 DdApaNumber a,
2912 DdApaNumber b) const
2914 Cudd_ApaShiftRight(digits, in, a, b);
2916 } // Cudd::ApaShiftRight
2919 void
2920 Cudd::ApaSetToLiteral(
2921 int digits,
2922 DdApaNumber number,
2923 DdApaDigit literal) const
2925 Cudd_ApaSetToLiteral(digits, number, literal);
2927 } // Cudd::ApaSetToLiteral
2930 void
2931 Cudd::ApaPowerOfTwo(
2932 int digits,
2933 DdApaNumber number,
2934 int power) const
2936 Cudd_ApaPowerOfTwo(digits, number, power);
2938 } // Cudd::ApaPowerOfTwo
2941 void
2942 Cudd::ApaPrintHex(
2943 FILE * fp,
2944 int digits,
2945 DdApaNumber number) const
2947 cout.flush();
2948 int result = Cudd_ApaPrintHex(fp, digits, number);
2949 this->checkReturnValue(result);
2951 } // Cudd::ApaPrintHex
2954 void
2955 Cudd::ApaPrintDecimal(
2956 FILE * fp,
2957 int digits,
2958 DdApaNumber number) const
2960 cout.flush();
2961 int result = Cudd_ApaPrintDecimal(fp, digits, number);
2962 this->checkReturnValue(result);
2964 } // Cudd::ApaPrintDecimal
2967 DdApaNumber
2968 ABDD::ApaCountMinterm(
2969 int nvars,
2970 int * digits) const
2972 DdManager *mgr = ddMgr->p->manager;
2973 return Cudd_ApaCountMinterm(mgr, node, nvars, digits);
2975 } // ABDD::ApaCountMinterm
2978 void
2979 ABDD::ApaPrintMinterm(
2980 int nvars,
2981 FILE * fp) const
2983 cout.flush();
2984 DdManager *mgr = ddMgr->p->manager;
2985 int result = Cudd_ApaPrintMinterm(fp, mgr, node, nvars);
2986 this->checkReturnValue(result);
2988 } // ABDD::ApaPrintMinterm
2991 void
2992 ABDD::EpdPrintMinterm(
2993 int nvars,
2994 FILE * fp) const
2996 EpDouble count;
2997 char str[24];
2998 cout.flush();
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
3009 BDD::UnderApprox(
3010 int numVars,
3011 int threshold,
3012 int safe,
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
3024 BDD::OverApprox(
3025 int numVars,
3026 int threshold,
3027 int safe,
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(
3040 int numVars,
3041 int threshold,
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(
3054 int numVars,
3055 int threshold,
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
3067 BDD::ExistAbstract(
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(
3080 const BDD& g,
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
3093 BDD::UnivAbstract(
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
3105 BDD::BooleanDiff(
3106 int x) const
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
3126 double
3127 BDD::Correlation(
3128 const BDD& g) const
3130 DdManager *mgr = this->checkSameManager(g);
3131 return Cudd_bddCorrelation(mgr, node, g.node);
3133 } // BDD::Correlation
3136 double
3137 BDD::CorrelationWeights(
3138 const BDD& g,
3139 double * prob) const
3141 DdManager *mgr = this->checkSameManager(g);
3142 return Cudd_bddCorrelationWeights(mgr, node, g.node, prob);
3144 } // BDD::CorrelationWeights
3148 BDD::Ite(
3149 const BDD& g,
3150 const BDD& h) const
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);
3158 } // BDD::Ite
3162 BDD::IteConstant(
3163 const BDD& g,
3164 const BDD& h) const
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
3176 BDD::Intersect(
3177 const BDD& g) const
3179 DdManager *mgr = this->checkSameManager(g);
3180 DdNode *result = Cudd_bddIntersect(mgr, node, g.node);
3181 this->checkReturnValue(result);
3182 return BDD(ddMgr, result);
3184 } // BDD::Intersect
3188 BDD::And(
3189 const BDD& g) const
3191 DdManager *mgr = this->checkSameManager(g);
3192 DdNode *result = Cudd_bddAnd(mgr, node, g.node);
3193 this->checkReturnValue(result);
3194 return BDD(ddMgr, result);
3196 } // BDD::And
3200 BDD::AndLimit(
3201 const BDD& g,
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);
3209 } // BDD::AndLimit
3213 BDD::Or(
3214 const BDD& g) const
3216 DdManager *mgr = this->checkSameManager(g);
3217 DdNode *result = Cudd_bddOr(mgr, node, g.node);
3218 this->checkReturnValue(result);
3219 return BDD(ddMgr, result);
3221 } // BDD::Or
3225 BDD::Nand(
3226 const BDD& g) const
3228 DdManager *mgr = this->checkSameManager(g);
3229 DdNode *result = Cudd_bddNand(mgr, node, g.node);
3230 this->checkReturnValue(result);
3231 return BDD(ddMgr, result);
3233 } // BDD::Nand
3237 BDD::Nor(
3238 const BDD& g) const
3240 DdManager *mgr = this->checkSameManager(g);
3241 DdNode *result = Cudd_bddNor(mgr, node, g.node);
3242 this->checkReturnValue(result);
3243 return BDD(ddMgr, result);
3245 } // BDD::Nor
3249 BDD::Xor(
3250 const BDD& g) const
3252 DdManager *mgr = this->checkSameManager(g);
3253 DdNode *result = Cudd_bddXor(mgr, node, g.node);
3254 this->checkReturnValue(result);
3255 return BDD(ddMgr, result);
3257 } // BDD::Xor
3261 BDD::Xnor(
3262 const BDD& g) const
3264 DdManager *mgr = this->checkSameManager(g);
3265 DdNode *result = Cudd_bddXnor(mgr, node, g.node);
3266 this->checkReturnValue(result);
3267 return BDD(ddMgr, result);
3269 } // BDD::Xnor
3273 BDD::Leq(
3274 const BDD& g) const
3276 DdManager *mgr = this->checkSameManager(g);
3277 return Cudd_bddLeq(mgr, node, g.node);
3279 } // BDD::Leq
3283 ADD::BddThreshold(
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
3307 ADD::BddInterval(
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
3320 ADD::BddIthBit(
3321 int bit) const
3323 DdManager *mgr = ddMgr->p->manager;
3324 DdNode *result = Cudd_addBddIthBit(mgr, node, bit);
3325 this->checkReturnValue(result);
3326 return BDD(ddMgr, result);
3328 } // ADD::BddIthBit
3332 BDD::Add() const
3334 DdManager *mgr = ddMgr->p->manager;
3335 DdNode *result = Cudd_BddToAdd(mgr, node);
3336 this->checkReturnValue(result);
3337 return ADD(ddMgr, result);
3339 } // BDD::Add
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
3354 BDD::Transfer(
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);
3362 } // BDD::Transfer
3365 void
3366 Cudd::DebugCheck()
3368 int result = Cudd_DebugCheck(p->manager);
3369 this->checkReturnValue(result == 0);
3371 } // Cudd::DebugCheck
3374 void
3375 Cudd::CheckKeys()
3377 int result = Cudd_CheckKeys(p->manager);
3378 this->checkReturnValue(result == 0);
3380 } // Cudd::CheckKeys
3384 BDD::ClippingAnd(
3385 const BDD& g,
3386 int maxDepth,
3387 int direction) const
3389 DdManager *mgr = this->checkSameManager(g);
3390 DdNode *result = Cudd_bddClippingAnd(mgr, node, g.node, maxDepth,
3391 direction);
3392 this->checkReturnValue(result);
3393 return BDD(ddMgr, result);
3395 } // BDD::ClippingAnd
3399 BDD::ClippingAndAbstract(
3400 const BDD& g,
3401 const BDD& cube,
3402 int maxDepth,
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
3416 ADD::Cofactor(
3417 const ADD& g) const
3419 DdManager *mgr = this->checkSameManager(g);
3420 DdNode *result = Cudd_Cofactor(mgr, node, g.node);
3421 this->checkReturnValue(result);
3422 return ADD(ddMgr, result);
3424 } // ADD::Cofactor
3428 BDD::Cofactor(
3429 const BDD& g) const
3431 DdManager *mgr = this->checkSameManager(g);
3432 DdNode *result = Cudd_Cofactor(mgr, node, g.node);
3433 this->checkReturnValue(result);
3434 return BDD(ddMgr, result);
3436 } // BDD::Cofactor
3440 BDD::Compose(
3441 const BDD& g,
3442 int v) const
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);
3449 } // BDD::Compose
3453 ADD::Compose(
3454 const ADD& g,
3455 int v) const
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);
3462 } // ADD::Compose
3466 ADD::Permute(
3467 int * permut) const
3469 DdManager *mgr = ddMgr->p->manager;
3470 DdNode *result = Cudd_addPermute(mgr, node, permut);
3471 this->checkReturnValue(result);
3472 return ADD(ddMgr, result);
3474 } // ADD::Permute
3478 ADD::SwapVariables(
3479 ADDvector x,
3480 ADDvector y) const
3482 int n = x.count();
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++) {
3487 X[i] = x[i].node;
3488 Y[i] = y[i].node;
3490 DdNode *result = Cudd_addSwapVariables(mgr, node, X, Y, n);
3491 FREE(X);
3492 FREE(Y);
3493 this->checkReturnValue(result);
3494 return ADD(ddMgr, result);
3496 } // ADD::SwapVariables
3500 BDD::Permute(
3501 int * permut) const
3503 DdManager *mgr = ddMgr->p->manager;
3504 DdNode *result = Cudd_bddPermute(mgr, node, permut);
3505 this->checkReturnValue(result);
3506 return BDD(ddMgr, result);
3508 } // BDD::Permute
3512 BDD::SwapVariables(
3513 BDDvector x,
3514 BDDvector y) const
3516 int n = x.count();
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++) {
3521 X[i] = x[i].node;
3522 Y[i] = y[i].node;
3524 DdNode *result = Cudd_bddSwapVariables(mgr, node, X, Y, n);
3525 FREE(X);
3526 FREE(Y);
3527 this->checkReturnValue(result);
3528 return BDD(ddMgr, result);
3530 } // BDD::SwapVariables
3534 BDD::AdjPermuteX(
3535 BDDvector x) const
3537 int n = x.count();
3538 DdManager *mgr = ddMgr->p->manager;
3539 DdNode **X = ALLOC(DdNode *,n);
3540 for (int i = 0; i < n; i++) {
3541 X[i] = x[i].node;
3543 DdNode *result = Cudd_bddAdjPermuteX(mgr, node, X, n);
3544 FREE(X);
3545 this->checkReturnValue(result);
3546 return BDD(ddMgr, result);
3548 } // BDD::AdjPermuteX
3552 ADD::VectorCompose(
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);
3562 FREE(X);
3563 this->checkReturnValue(result);
3564 return ADD(ddMgr, result);
3566 } // ADD::VectorCompose
3570 ADD::NonSimCompose(
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);
3580 FREE(X);
3581 this->checkReturnValue(result);
3582 return ADD(ddMgr, result);
3584 } // ADD::NonSimCompose
3588 BDD::VectorCompose(
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);
3598 FREE(X);
3599 this->checkReturnValue(result);
3600 return BDD(ddMgr, result);
3602 } // BDD::VectorCompose
3605 void
3606 BDD::ApproxConjDecomp(
3607 BDD* g,
3608 BDD* h) const
3610 DdManager *mgr = ddMgr->p->manager;
3611 DdNode **pieces;
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]);
3618 FREE(pieces);
3620 } // BDD::ApproxConjDecomp
3623 void
3624 BDD::ApproxDisjDecomp(
3625 BDD* g,
3626 BDD* h) const
3628 DdManager *mgr = ddMgr->p->manager;
3629 DdNode **pieces;
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]);
3636 FREE(pieces);
3638 } // BDD::ApproxDisjDecomp
3641 void
3642 BDD::IterConjDecomp(
3643 BDD* g,
3644 BDD* h) const
3646 DdManager *mgr = ddMgr->p->manager;
3647 DdNode **pieces;
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]);
3654 FREE(pieces);
3656 } // BDD::IterConjDecomp
3659 void
3660 BDD::IterDisjDecomp(
3661 BDD* g,
3662 BDD* h) const
3664 DdManager *mgr = ddMgr->p->manager;
3665 DdNode **pieces;
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]);
3672 FREE(pieces);
3674 } // BDD::IterDisjDecomp
3677 void
3678 BDD::GenConjDecomp(
3679 BDD* g,
3680 BDD* h) const
3682 DdManager *mgr = ddMgr->p->manager;
3683 DdNode **pieces;
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]);
3690 FREE(pieces);
3692 } // BDD::GenConjDecomp
3695 void
3696 BDD::GenDisjDecomp(
3697 BDD* g,
3698 BDD* h) const
3700 DdManager *mgr = ddMgr->p->manager;
3701 DdNode **pieces;
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]);
3708 FREE(pieces);
3710 } // BDD::GenDisjDecomp
3713 void
3714 BDD::VarConjDecomp(
3715 BDD* g,
3716 BDD* h) const
3718 DdManager *mgr = ddMgr->p->manager;
3719 DdNode **pieces;
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]);
3726 FREE(pieces);
3728 } // BDD::VarConjDecomp
3731 void
3732 BDD::VarDisjDecomp(
3733 BDD* g,
3734 BDD* h) const
3736 DdManager *mgr = ddMgr->p->manager;
3737 DdNode **pieces;
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]);
3744 FREE(pieces);
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(
3762 int id,
3763 int phase) const
3765 DdManager *mgr = ddMgr->p->manager;
3766 return Cudd_bddIsVarEssential(mgr, node, id, phase);
3768 } // BDD::IsVarEssential
3771 void
3772 ABDD::PrintTwoLiteralClauses(
3773 char **names,
3774 FILE *fp) const
3776 DdManager *mgr = ddMgr->p->manager;
3777 int result = Cudd_PrintTwoLiteralClauses(mgr, node, names, fp);
3778 this->checkReturnValue(result);
3780 } // ABDD::PrintTwoLiteralClauses
3783 void
3784 BDDvector::DumpBlif(
3785 char ** inames,
3786 char ** onames,
3787 char * mname,
3788 FILE * fp,
3789 int mv) const
3791 DdManager *mgr = p->manager->getManager();
3792 int n = p->size;
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);
3798 FREE(F);
3799 p->manager->checkReturnValue(result);
3801 } // BDDvector::DumpBlif
3804 void
3805 BDDvector::DumpDot(
3806 char ** inames,
3807 char ** onames,
3808 FILE * fp) const
3810 DdManager *mgr = p->manager->getManager();
3811 int n = p->size;
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);
3817 FREE(F);
3818 p->manager->checkReturnValue(result);
3820 } // BDDvector::DumpDot
3823 void
3824 ADDvector::DumpDot(
3825 char ** inames,
3826 char ** onames,
3827 FILE * fp) const
3829 DdManager *mgr = p->manager->getManager();
3830 int n = p->size;
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);
3836 FREE(F);
3837 p->manager->checkReturnValue(result);
3839 } // ADDvector::DumpDot
3842 void
3843 BDDvector::DumpDaVinci(
3844 char ** inames,
3845 char ** onames,
3846 FILE * fp) const
3848 DdManager *mgr = p->manager->getManager();
3849 int n = p->size;
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);
3855 FREE(F);
3856 p->manager->checkReturnValue(result);
3858 } // BDDvector::DumpDaVinci
3861 void
3862 ADDvector::DumpDaVinci(
3863 char ** inames,
3864 char ** onames,
3865 FILE * fp) const
3867 DdManager *mgr = p->manager->getManager();
3868 int n = p->size;
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);
3874 FREE(F);
3875 p->manager->checkReturnValue(result);
3877 } // ADDvector::DumpDaVinci
3880 void
3881 BDDvector::DumpDDcal(
3882 char ** inames,
3883 char ** onames,
3884 FILE * fp) const
3886 DdManager *mgr = p->manager->getManager();
3887 int n = p->size;
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);
3893 FREE(F);
3894 p->manager->checkReturnValue(result);
3896 } // BDDvector::DumpDDcal
3899 void
3900 BDDvector::DumpFactoredForm(
3901 char ** inames,
3902 char ** onames,
3903 FILE * fp) const
3905 DdManager *mgr = p->manager->getManager();
3906 int n = p->size;
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);
3912 FREE(F);
3913 p->manager->checkReturnValue(result);
3915 } // BDDvector::DumpFactoredForm
3919 BDD::Constrain(
3920 const BDD& c) const
3922 DdManager *mgr = this->checkSameManager(c);
3923 DdNode *result = Cudd_bddConstrain(mgr, node, c.node);
3924 this->checkReturnValue(result);
3925 return BDD(ddMgr, result);
3927 } // BDD::Constrain
3931 BDD::Restrict(
3932 const BDD& c) const
3934 DdManager *mgr = this->checkSameManager(c);
3935 DdNode *result = Cudd_bddRestrict(mgr, node, c.node);
3936 this->checkReturnValue(result);
3937 return BDD(ddMgr, result);
3939 } // BDD::Restrict
3943 BDD::NPAnd(
3944 const BDD& g) const
3946 DdManager *mgr = this->checkSameManager(g);
3947 DdNode *result = Cudd_bddNPAnd(mgr, node, g.node);
3948 this->checkReturnValue(result);
3949 return BDD(ddMgr, result);
3951 } // BDD::NPAnd
3955 ADD::Constrain(
3956 const ADD& c) const
3958 DdManager *mgr = this->checkSameManager(c);
3959 DdNode *result = Cudd_addConstrain(mgr, node, c.node);
3960 this->checkReturnValue(result);
3961 return ADD(ddMgr, result);
3963 } // ADD::Constrain
3966 BDDvector
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);
3977 FREE(result);
3978 return vect;
3980 } // BDD::ConstrainDecomp
3984 ADD::Restrict(
3985 const ADD& c) const
3987 DdManager *mgr = this->checkSameManager(c);
3988 DdNode *result = Cudd_addRestrict(mgr, node, c.node);
3989 this->checkReturnValue(result);
3990 return ADD(ddMgr, result);
3992 } // ADD::Restrict
3995 BDDvector
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);
4006 FREE(result);
4007 return vect;
4009 } // BDD::CharToVect
4013 BDD::LICompaction(
4014 const BDD& c) const
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
4025 BDD::Squeeze(
4026 const BDD& u) const
4028 DdManager *mgr = this->checkSameManager(u);
4029 DdNode *result = Cudd_bddSqueeze(mgr, node, u.node);
4030 this->checkReturnValue(result);
4031 return BDD(ddMgr, result);
4033 } // BDD::Squeeze
4037 BDD::Minimize(
4038 const BDD& c) const
4040 DdManager *mgr = this->checkSameManager(c);
4041 DdNode *result = Cudd_bddMinimize(mgr, node, c.node);
4042 this->checkReturnValue(result);
4043 return BDD(ddMgr, result);
4045 } // BDD::Minimize
4049 BDD::SubsetCompress(
4050 int nvars,
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(
4063 int nvars,
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
4074 MtrNode *
4075 Cudd::MakeTreeNode(
4076 unsigned int low,
4077 unsigned int size,
4078 unsigned int type)
4080 return Cudd_MakeTreeNode(p->manager, low, size, type);
4082 } // Cudd::MakeTreeNode
4085 /* This is incorrect, but we'll wait for this one.
4086 void
4087 Cudd::Harwell(
4088 FILE * fp,
4089 DdManager * dd,
4090 ADD* E,
4091 ADD** x,
4092 ADD** y,
4093 ADD** xn,
4094 ADD** yn_,
4095 int * nx,
4096 int * ny,
4097 int * m,
4098 int * n,
4099 int bx,
4100 int sx,
4101 int by,
4102 int sy,
4103 int pr)
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);
4109 } // Cudd::Harwell
4113 void
4114 Cudd::PrintLinear()
4116 cout.flush();
4117 int result = Cudd_PrintLinear(p->manager);
4118 this->checkReturnValue(result);
4120 } // Cudd::PrintLinear
4124 Cudd::ReadLinear(
4125 int x,
4126 int y)
4128 return Cudd_ReadLinear(p->manager, x, y);
4130 } // Cudd::ReadLinear
4134 BDD::LiteralSetIntersection(
4135 const BDD& g) const
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(
4147 const ADD& B,
4148 ADDvector z) const
4150 int nz = z.count();
4151 DdManager *mgr = this->checkSameManager(B);
4152 DdNode **Z = ALLOC(DdNode *,nz);
4153 for (int i = 0; i < nz; i++) {
4154 Z[i] = z[i].node;
4156 DdNode *result = Cudd_addMatrixMultiply(mgr, node, B.node, Z, nz);
4157 FREE(Z);
4158 this->checkReturnValue(result);
4159 return ADD(ddMgr, result);
4161 } // ADD::MatrixMultiply
4165 ADD::TimesPlus(
4166 const ADD& B,
4167 ADDvector z) const
4169 int nz = z.count();
4170 DdManager *mgr = this->checkSameManager(B);
4171 DdNode **Z = ALLOC(DdNode *,nz);
4172 for (int i = 0; i < nz; i++) {
4173 Z[i] = z[i].node;
4175 DdNode *result = Cudd_addTimesPlus(mgr, node, B.node, Z, nz);
4176 FREE(Z);
4177 this->checkReturnValue(result);
4178 return ADD(ddMgr, result);
4180 } // ADD::TimesPlus
4184 ADD::Triangle(
4185 const ADD& g,
4186 ADDvector z) const
4188 int nz = z.count();
4189 DdManager *mgr = this->checkSameManager(g);
4190 DdNode **Z = ALLOC(DdNode *,nz);
4191 for (int i = 0; i < nz; i++) {
4192 Z[i] = z[i].node;
4194 DdNode *result = Cudd_addTriangle(mgr, node, g.node, Z, nz);
4195 FREE(Z);
4196 this->checkReturnValue(result);
4197 return ADD(ddMgr, result);
4199 } // ADD::Triangle
4203 BDD::PrioritySelect(
4204 BDDvector x,
4205 BDDvector y,
4206 BDDvector z,
4207 const BDD& Pi,
4208 DD_PRFP Pifunc) const
4210 int n = x.count();
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++) {
4216 X[i] = x[i].node;
4217 Y[i] = y[i].node;
4218 Z[i] = z[i].node;
4220 DdNode *result = Cudd_PrioritySelect(mgr, node, X, Y, Z, Pi.node, n, Pifunc);
4221 FREE(X);
4222 FREE(Y);
4223 FREE(Z);
4224 this->checkReturnValue(result);
4225 return BDD(ddMgr, result);
4227 } // BDD::PrioritySelect
4231 Cudd::Xgty(
4232 BDDvector z,
4233 BDDvector x,
4234 BDDvector y)
4236 int N = z.count();
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);
4247 FREE(X);
4248 FREE(Y);
4249 FREE(Z);
4250 this->checkReturnValue(result);
4251 return BDD(this, result);
4253 } // Cudd::Xgty
4257 Cudd::Xeqy(
4258 BDDvector x,
4259 BDDvector y)
4261 int N = x.count();
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);
4270 FREE(X);
4271 FREE(Y);
4272 this->checkReturnValue(result);
4273 return BDD(this, result);
4275 } // BDD::Xeqy
4279 Cudd::Xeqy(
4280 ADDvector x,
4281 ADDvector y)
4283 int N = x.count();
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);
4292 FREE(X);
4293 FREE(Y);
4294 this->checkReturnValue(result);
4295 return ADD(this, result);
4297 } // ADD::Xeqy
4301 Cudd::Dxygtdxz(
4302 BDDvector x,
4303 BDDvector y,
4304 BDDvector z)
4306 int N = x.count();
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);
4317 FREE(X);
4318 FREE(Y);
4319 FREE(Z);
4320 this->checkReturnValue(result);
4321 return BDD(this, result);
4323 } // Cudd::Dxygtdxz
4327 Cudd::Dxygtdyz(
4328 BDDvector x,
4329 BDDvector y,
4330 BDDvector z)
4332 int N = x.count();
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);
4343 FREE(X);
4344 FREE(Y);
4345 FREE(Z);
4346 this->checkReturnValue(result);
4347 return BDD(this, result);
4349 } // Cudd::Dxygtdyz
4353 Cudd::Inequality(
4354 int c,
4355 BDDvector x,
4356 BDDvector y)
4358 int N = x.count();
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);
4367 FREE(X);
4368 FREE(Y);
4369 this->checkReturnValue(result);
4370 return BDD(this, result);
4372 } // Cudd::Inequality
4376 Cudd::Disequality(
4377 int c,
4378 BDDvector x,
4379 BDDvector y)
4381 int N = x.count();
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);
4390 FREE(X);
4391 FREE(Y);
4392 this->checkReturnValue(result);
4393 return BDD(this, result);
4395 } // Cudd::Disequality
4399 Cudd::Interval(
4400 BDDvector x,
4401 unsigned int lowerB,
4402 unsigned int upperB)
4404 int N = x.count();
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);
4411 FREE(X);
4412 this->checkReturnValue(result);
4413 return BDD(this, result);
4415 } // Cudd::Interval
4419 BDD::CProjection(
4420 const BDD& Y) const
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(
4432 int *minterm,
4433 int upperBound) const
4435 DdManager *mgr = ddMgr->p->manager;
4436 int result = Cudd_MinHammingDist(mgr, node, minterm, upperBound);
4437 return result;
4439 } // BDD::MinHammingDist
4443 Cudd::Hamming(
4444 ADDvector xVars,
4445 ADDvector yVars)
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);
4456 FREE(X);
4457 FREE(Y);
4458 this->checkReturnValue(result);
4459 return ADD(this, result);
4461 } // Cudd::Hamming
4464 /* We'll leave these two out for the time being.
4465 void
4466 Cudd::Read(
4467 FILE * fp,
4468 ADD* E,
4469 ADD** x,
4470 ADD** y,
4471 ADD** xn,
4472 ADD** yn_,
4473 int * nx,
4474 int * ny,
4475 int * m,
4476 int * n,
4477 int bx,
4478 int sx,
4479 int by,
4480 int sy)
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);
4486 } // Cudd::Read
4489 void
4490 Cudd::Read(
4491 FILE * fp,
4492 BDD* E,
4493 BDD** x,
4494 BDD** y,
4495 int * nx,
4496 int * ny,
4497 int * m,
4498 int * n,
4499 int bx,
4500 int sx,
4501 int by,
4502 int sy)
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);
4508 } // Cudd::Read
4512 void
4513 Cudd::ReduceHeap(
4514 Cudd_ReorderingType heuristic,
4515 int minsize)
4517 int result = Cudd_ReduceHeap(p->manager, heuristic, minsize);
4518 this->checkReturnValue(result);
4520 } // Cudd::ReduceHeap
4523 void
4524 Cudd::ShuffleHeap(
4525 int * permutation)
4527 int result = Cudd_ShuffleHeap(p->manager, permutation);
4528 this->checkReturnValue(result);
4530 } // Cudd::ShuffleHeap
4534 ADD::Eval(
4535 int * inputs) const
4537 DdManager *mgr = ddMgr->p->manager;
4538 DdNode *result = Cudd_Eval(mgr, node, inputs);
4539 this->checkReturnValue(result);
4540 return ADD(ddMgr, result);
4542 } // ADD::Eval
4546 BDD::Eval(
4547 int * inputs) const
4549 DdManager *mgr = ddMgr->p->manager;
4550 DdNode *result = Cudd_Eval(mgr, node, inputs);
4551 this->checkReturnValue(result);
4552 return BDD(ddMgr, result);
4554 } // BDD::Eval
4558 ABDD::ShortestPath(
4559 int * weight,
4560 int * support,
4561 int * length) const
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
4572 ABDD::LargestCube(
4573 int * length) const
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(
4585 int * weight) const
4587 DdManager *mgr = ddMgr->p->manager;
4588 int result = Cudd_ShortestLength(mgr, node, weight);
4589 this->checkReturnValue(result != CUDD_OUT_OF_MEM);
4590 return result;
4592 } // ABDD::ShortestLength
4596 BDD::Decreasing(
4597 int i) const
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
4608 BDD::Increasing(
4609 int i) const
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
4620 ABDD::EquivDC(
4621 const ABDD& G,
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);
4628 } // ABDD::EquivDC
4632 ADD::EqualSupNorm(
4633 const ADD& g,
4634 CUDD_VALUE_TYPE tolerance,
4635 int pr) const
4637 DdManager *mgr = this->checkSameManager(g);
4638 return Cudd_EqualSupNorm(mgr, node, g.node, tolerance, pr);
4640 } // ADD::EqualSupNorm
4643 double *
4644 ABDD::CofMinterm() const
4646 DdManager *mgr = ddMgr->p->manager;
4647 double *result = Cudd_CofMinterm(mgr, node);
4648 this->checkReturnValue((DdNode *)result);
4649 return result;
4651 } // ABDD::CofMinterm
4655 BDD::SolveEqn(
4656 const BDD& Y,
4657 BDD* G,
4658 int ** yIndex,
4659 int n) const
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]);
4669 FREE(g);
4670 return BDD(ddMgr, result);
4672 } // BDD::SolveEqn
4676 BDD::VerifySol(
4677 BDD* G,
4678 int * yIndex,
4679 int n) const
4681 DdManager *mgr = ddMgr->p->manager;
4682 DdNode **g = ALLOC(DdNode *,n);
4683 for (int i = 0; i < n; i++) {
4684 g[i] = G[i].node;
4686 DdNode *result = Cudd_VerifySol(mgr, node, g, yIndex, n);
4687 FREE(g);
4688 this->checkReturnValue(result);
4689 return BDD(ddMgr, result);
4691 } // BDD::VerifySol
4695 BDD::SplitSet(
4696 BDDvector xVars,
4697 double m) const
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);
4706 FREE(X);
4707 this->checkReturnValue(result);
4708 return BDD(ddMgr, result);
4710 } // BDD::SplitSet
4714 BDD::SubsetHeavyBranch(
4715 int numVars,
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(
4728 int numVars,
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(
4741 int numVars,
4742 int threshold,
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(
4755 int numVars,
4756 int threshold,
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
4767 void
4768 Cudd::SymmProfile(
4769 int lower,
4770 int upper) const
4772 Cudd_SymmProfile(p->manager, lower, upper);
4774 } // Cudd::SymmProfile
4777 unsigned int
4778 Cudd::Prime(
4779 unsigned int pr) const
4781 return Cudd_Prime(pr);
4783 } // Cudd::Prime
4786 void
4787 ABDD::PrintMinterm() const
4789 cout.flush();
4790 DdManager *mgr = ddMgr->p->manager;
4791 int result = Cudd_PrintMinterm(mgr, node);
4792 this->checkReturnValue(result);
4794 } // ABDD::PrintMinterm
4797 void
4798 BDD::PrintCover() const
4800 cout.flush();
4801 DdManager *mgr = ddMgr->p->manager;
4802 int result = Cudd_bddPrintCover(mgr, node, node);
4803 this->checkReturnValue(result);
4805 } // BDD::PrintCover
4808 void
4809 BDD::PrintCover(
4810 const BDD& u) const
4812 this->checkSameManager(u);
4813 cout.flush();
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(
4823 int i,
4824 int phase) const
4826 DdManager *mgr = ddMgr->p->manager;
4827 int result = Cudd_EstimateCofactor(mgr, node, i, phase);
4828 this->checkReturnValue(result != CUDD_OUT_OF_MEM);
4829 return result;
4831 } // BDD::EstimateCofactor
4835 BDD::EstimateCofactorSimple(
4836 int i) const
4838 int result = Cudd_EstimateCofactorSimple(node, i);
4839 return result;
4841 } // BDD::EstimateCofactorSimple
4845 Cudd::SharingSize(
4846 DD* nodes,
4847 int n) const
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);
4854 FREE(nodeArray);
4855 this->checkReturnValue(result > 0);
4856 return result;
4858 } // Cudd::SharingSize
4861 double
4862 ABDD::CountMinterm(
4863 int nvars) const
4865 DdManager *mgr = ddMgr->p->manager;
4866 double result = Cudd_CountMinterm(mgr, node, nvars);
4867 this->checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
4868 return result;
4870 } // ABDD::CountMinterm
4873 double
4874 ABDD::CountPath() const
4876 double result = Cudd_CountPath(node);
4877 this->checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
4878 return result;
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);
4891 } // ABDD::Support
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);
4900 return result;
4902 } // ABDD::SupportSize
4906 BDDvector::VectorSupport() const
4908 int n = p->size;
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);
4915 FREE(F);
4916 p->manager->checkReturnValue(result);
4917 return BDD(p->manager, result);
4919 } // BDDvector::VectorSupport
4923 BDDvector::nodeCount() const
4925 int n = p->size;
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);
4931 FREE(nodeArray);
4932 p->manager->checkReturnValue(result > 0);
4933 return result;
4935 } // BDDvector::nodeCount
4939 ADDvector::VectorSupport() const
4941 int n = p->size;
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);
4948 FREE(F);
4949 p->manager->checkReturnValue(result);
4950 return BDD(p->manager, result);
4952 } // ADDvector::VectorSupport
4956 BDDvector::VectorSupportSize() const
4958 int n = p->size;
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);
4965 FREE(F);
4966 p->manager->checkReturnValue(result != CUDD_OUT_OF_MEM);
4967 return result;
4969 } // BDDvector::VectorSupportSize
4973 ADDvector::VectorSupportSize() const
4975 int n = p->size;
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);
4982 FREE(F);
4983 p->manager->checkReturnValue(result != CUDD_OUT_OF_MEM);
4984 return result;
4986 } // ADDvector::VectorSupportSize
4989 void
4990 ABDD::ClassifySupport(
4991 const ABDD& g,
4992 BDD* common,
4993 BDD* onlyF,
4994 BDD* onlyG) const
4996 DdManager *mgr = this->checkSameManager(g);
4997 DdNode *C, *F, *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
5015 void
5016 BDD::PickOneCube(
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);
5037 FREE(V);
5038 this->checkReturnValue(result);
5039 return BDD(ddMgr, result);
5041 } // BDD::PickOneMinterm
5044 DdGen *
5045 ABDD::FirstCube(
5046 int ** cube,
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);
5052 return result;
5054 } // ABDD::FirstCube
5058 NextCube(
5059 DdGen * gen,
5060 int ** cube,
5061 CUDD_VALUE_TYPE * value)
5063 return Cudd_NextCube(gen, cube, value);
5065 } // NextCube
5069 Cudd::bddComputeCube(
5070 BDD * vars,
5071 int * phase,
5072 int n)
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);
5080 FREE(V);
5081 this->checkReturnValue(result);
5082 return BDD(this, result);
5084 } // Cudd::bddComputeCube
5088 Cudd::addComputeCube(
5089 ADD * vars,
5090 int * phase,
5091 int n)
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);
5099 FREE(V);
5100 this->checkReturnValue(result);
5101 return ADD(this, result);
5103 } // Cudd::addComputeCube
5106 DdGen *
5107 BDD::FirstNode(
5108 BDD* fnode) const
5110 DdManager *mgr = ddMgr->p->manager;
5111 DdNode *Fn;
5112 DdGen *result = Cudd_FirstNode(mgr, node, &Fn);
5113 this->checkReturnValue((DdNode *)result);
5114 *fnode = BDD(ddMgr, Fn);
5115 return result;
5117 } // DD::FirstNode
5121 Cudd::NextNode(
5122 DdGen * gen,
5123 BDD * nnode)
5125 DdNode *nn;
5126 int result = Cudd_NextNode(gen, &nn);
5127 *nnode = BDD(this, nn);
5128 return result;
5130 } // Cudd::NextNode
5134 GenFree(
5135 DdGen * gen)
5137 return Cudd_GenFree(gen);
5139 } // GenFree
5143 IsGenEmpty(
5144 DdGen * gen)
5146 return Cudd_IsGenEmpty(gen);
5148 } // IsGenEmpty
5152 Cudd::IndicesToCube(
5153 int * array,
5154 int n)
5156 DdNode *result = Cudd_IndicesToCube(p->manager, array, n);
5157 this->checkReturnValue(result);
5158 return BDD(this, result);
5160 } // Cudd::IndicesToCube
5163 void
5164 Cudd::PrintVersion(
5165 FILE * fp) const
5167 cout.flush();
5168 Cudd_PrintVersion(fp);
5170 } // Cudd::PrintVersion
5173 double
5174 Cudd::AverageDistance() const
5176 return Cudd_AverageDistance(p->manager);
5178 } // Cudd::AverageDistance
5181 long
5182 Cudd::Random()
5184 return Cudd_Random();
5186 } // Cudd::Random
5189 void
5190 Cudd::Srandom(
5191 long seed)
5193 Cudd_Srandom(seed);
5195 } // Cudd::Srandom
5198 double
5199 ABDD::Density(
5200 int nvars) const
5202 DdManager *mgr = ddMgr->p->manager;
5203 double result = Cudd_Density(mgr, node, nvars);
5204 this->checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
5205 return result;
5207 } // ABDD::Density
5211 ZDD::Count() const
5213 DdManager *mgr = ddMgr->p->manager;
5214 int result = Cudd_zddCount(mgr, node);
5215 this->checkReturnValue(result != CUDD_OUT_OF_MEM);
5216 return result;
5218 } // ZDD::Count
5221 double
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);
5227 return result;
5229 } // ZDD::CountDouble
5233 ZDD::Product(
5234 const ZDD& g) const
5236 DdManager *mgr = this->checkSameManager(g);
5237 DdNode *result = Cudd_zddProduct(mgr, node, g.node);
5238 this->checkReturnValue(result);
5239 return ZDD(ddMgr, result);
5241 } // ZDD::Product
5245 ZDD::UnateProduct(
5246 const ZDD& g) const
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
5257 ZDD::WeakDiv(
5258 const ZDD& g) const
5260 DdManager *mgr = this->checkSameManager(g);
5261 DdNode *result = Cudd_zddWeakDiv(mgr, node, g.node);
5262 this->checkReturnValue(result);
5263 return ZDD(ddMgr, result);
5265 } // ZDD::WeakDiv
5269 ZDD::Divide(
5270 const ZDD& g) const
5272 DdManager *mgr = this->checkSameManager(g);
5273 DdNode *result = Cudd_zddDivide(mgr, node, g.node);
5274 this->checkReturnValue(result);
5275 return ZDD(ddMgr, result);
5277 } // ZDD::Divide
5281 ZDD::WeakDivF(
5282 const ZDD& g) const
5284 DdManager *mgr = this->checkSameManager(g);
5285 DdNode *result = Cudd_zddWeakDivF(mgr, node, g.node);
5286 this->checkReturnValue(result);
5287 return ZDD(ddMgr, result);
5289 } // ZDD::WeakDivF
5293 ZDD::DivideF(
5294 const ZDD& g) const
5296 DdManager *mgr = this->checkSameManager(g);
5297 DdNode *result = Cudd_zddDivideF(mgr, node, g.node);
5298 this->checkReturnValue(result);
5299 return ZDD(ddMgr, result);
5301 } // ZDD::DivideF
5304 MtrNode *
5305 Cudd::MakeZddTreeNode(
5306 unsigned int low,
5307 unsigned int size,
5308 unsigned int type)
5310 return Cudd_MakeZddTreeNode(p->manager, low, size, type);
5312 } // Cudd::MakeZddTreeNode
5316 BDD::zddIsop(
5317 const BDD& U,
5318 ZDD* zdd_I) const
5320 DdManager *mgr = this->checkSameManager(U);
5321 DdNode *Z;
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);
5327 } // BDD::Isop
5331 BDD::Isop(
5332 const BDD& U) const
5334 DdManager *mgr = this->checkSameManager(U);
5335 DdNode *result = Cudd_bddIsop(mgr, node, U.node);
5336 this->checkReturnValue(result);
5337 return BDD(ddMgr, result);
5339 } // BDD::Isop
5342 double
5343 ZDD::CountMinterm(
5344 int path) const
5346 DdManager *mgr = ddMgr->p->manager;
5347 double result = Cudd_zddCountMinterm(mgr, node, path);
5348 this->checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
5349 return result;
5351 } // ZDD::CountMinterm
5354 void
5355 Cudd::zddPrintSubtable() const
5357 cout.flush();
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);
5371 } // BDD::PortToZdd
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);
5382 } // ZDD::PortToBdd
5385 void
5386 Cudd::zddReduceHeap(
5387 Cudd_ReorderingType heuristic,
5388 int minsize)
5390 int result = Cudd_zddReduceHeap(p->manager, heuristic, minsize);
5391 this->checkReturnValue(result);
5393 } // Cudd::zddReduceHeap
5396 void
5397 Cudd::zddShuffleHeap(
5398 int * permutation)
5400 int result = Cudd_zddShuffleHeap(p->manager, permutation);
5401 this->checkReturnValue(result);
5403 } // Cudd::zddShuffleHeap
5407 ZDD::Ite(
5408 const ZDD& g,
5409 const ZDD& h) const
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);
5417 } // ZDD::Ite
5421 ZDD::Union(
5422 const ZDD& Q) const
5424 DdManager *mgr = this->checkSameManager(Q);
5425 DdNode *result = Cudd_zddUnion(mgr, node, Q.node);
5426 this->checkReturnValue(result);
5427 return ZDD(ddMgr, result);
5429 } // ZDD::Union
5433 ZDD::Intersect(
5434 const ZDD& Q) const
5436 DdManager *mgr = this->checkSameManager(Q);
5437 DdNode *result = Cudd_zddIntersect(mgr, node, Q.node);
5438 this->checkReturnValue(result);
5439 return ZDD(ddMgr, result);
5441 } // ZDD::Intersect
5445 ZDD::Diff(
5446 const ZDD& Q) const
5448 DdManager *mgr = this->checkSameManager(Q);
5449 DdNode *result = Cudd_zddDiff(mgr, node, Q.node);
5450 this->checkReturnValue(result);
5451 return ZDD(ddMgr, result);
5453 } // ZDD::Diff
5457 ZDD::DiffConst(
5458 const ZDD& Q) const
5460 DdManager *mgr = this->checkSameManager(Q);
5461 DdNode *result = Cudd_zddDiffConst(mgr, node, Q.node);
5462 this->checkReturnValue(result);
5463 return ZDD(ddMgr, result);
5465 } // ZDD::DiffConst
5469 ZDD::Subset1(
5470 int var) const
5472 DdManager *mgr = ddMgr->p->manager;
5473 DdNode *result = Cudd_zddSubset1(mgr, node, var);
5474 this->checkReturnValue(result);
5475 return ZDD(ddMgr, result);
5477 } // ZDD::Subset1
5481 ZDD::Subset0(
5482 int var) const
5484 DdManager *mgr = ddMgr->p->manager;
5485 DdNode *result = Cudd_zddSubset0(mgr, node, var);
5486 this->checkReturnValue(result);
5487 return ZDD(ddMgr, result);
5489 } // ZDD::Subset0
5493 ZDD::Change(
5494 int var) const
5496 DdManager *mgr = ddMgr->p->manager;
5497 DdNode *result = Cudd_zddChange(mgr, node, var);
5498 this->checkReturnValue(result);
5499 return ZDD(ddMgr, result);
5501 } // ZDD::Change
5504 void
5505 Cudd::zddSymmProfile(
5506 int lower,
5507 int upper) const
5509 Cudd_zddSymmProfile(p->manager, lower, upper);
5511 } // Cudd::zddSymmProfile
5514 void
5515 ZDD::PrintMinterm() const
5517 cout.flush();
5518 DdManager *mgr = ddMgr->p->manager;
5519 int result = Cudd_zddPrintMinterm(mgr, node);
5520 this->checkReturnValue(result);
5522 } // ZDD::PrintMinterm
5525 void
5526 ZDD::PrintCover() const
5528 cout.flush();
5529 DdManager *mgr = ddMgr->p->manager;
5530 int result = Cudd_zddPrintCover(mgr, node);
5531 this->checkReturnValue(result);
5533 } // ZDD::PrintCover
5536 void
5537 ZDDvector::DumpDot(
5538 char ** inames,
5539 char ** onames,
5540 FILE * fp) const
5542 DdManager *mgr = p->manager->getManager();
5543 int n = p->size;
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);
5549 FREE(F);
5550 p->manager->checkReturnValue(result);
5552 } // ZDDvector::DumpDot