You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							6331 lines
						
					
					
						
							119 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							6331 lines
						
					
					
						
							119 KiB
						
					
					
				| /** | |
|   @file | |
|  | |
|   @ingroup cplusplus | |
|  | |
|   @brief Functions for the C++ object-oriented encapsulation of CUDD. | |
|  | |
|   @author Fabio Somenzi | |
|  | |
|   @copyright@parblock | |
|   Copyright (c) 1995-2015, Regents of the University of Colorado | |
|  | |
|   All rights reserved. | |
|  | |
|   Redistribution and use in source and binary forms, with or without | |
|   modification, are permitted provided that the following conditions | |
|   are met: | |
|  | |
|   Redistributions of source code must retain the above copyright | |
|   notice, this list of conditions and the following disclaimer. | |
|  | |
|   Redistributions in binary form must reproduce the above copyright | |
|   notice, this list of conditions and the following disclaimer in the | |
|   documentation and/or other materials provided with the distribution. | |
|  | |
|   Neither the name of the University of Colorado nor the names of its | |
|   contributors may be used to endorse or promote products derived from | |
|   this software without specific prior written permission. | |
|  | |
|   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
|   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
|   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
|   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
|   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
|   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
|   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
|   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
|   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
|   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | |
|   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
|   POSSIBILITY OF SUCH DAMAGE. | |
|   @endparblock | |
|  | |
| */ | |
| #include <iostream> | |
| #include <sstream> | |
| #include <cassert> | |
| #include <cstdlib> | |
| #include <cstring> | |
| #include <algorithm> | |
| #include <stdexcept> | |
| #include "epdInt.h" | |
| #include "cuddInt.h" | |
| #include "cuddObj.hh" | |
|  | |
| using std::cout; | |
| using std::cerr; | |
| using std::ostream; | |
| using std::endl; | |
| using std::hex; | |
| using std::dec; | |
| using std::string; | |
| using std::vector; | |
| using std::sort; | |
| 
 | |
| namespace cudd { | |
| 
 | |
| // --------------------------------------------------------------------------- | |
| // Variable declarations | |
| // --------------------------------------------------------------------------- | |
|  | |
| // --------------------------------------------------------------------------- | |
| // Members of class Capsule | |
| // --------------------------------------------------------------------------- | |
|  | |
| /** | |
|   @brief Class for reference counting of CUDD managers. | |
|  | |
|   @see Cudd DD ABDD ADD BDD ZDD | |
|  | |
| */ | |
| class Capsule { | |
| public: | |
|     Capsule(unsigned int numVars, unsigned int numVarsZ, | |
|             unsigned int numSlots, unsigned int cacheSize, | |
|             unsigned long maxMemory, PFC defaultHandler); | |
|     ~Capsule(); | |
| #if HAVE_MODERN_CXX == 1 | |
|     Capsule(Capsule const &) = delete; | |
|     Capsule & operator=(Capsule const &) = delete; | |
| #else | |
| private: | |
|     Capsule(Capsule const &); // not defined | |
|     Capsule & operator=(Capsule const &); // not defined | |
| public: | |
| #endif | |
|     DdManager *manager; | |
|     PFC errorHandler; | |
|     PFC timeoutHandler; | |
|     PFC terminationHandler; | |
|     std::vector<char *> varnames; | |
|     int ref; | |
|     bool verbose; | |
| }; | |
| 
 | |
| 
 | |
| Capsule::Capsule( | |
|   unsigned int numVars, | |
|   unsigned int numVarsZ, | |
|   unsigned int numSlots, | |
|   unsigned int cacheSize, | |
|   unsigned long maxMemory, | |
|   PFC defaultHandler) | |
| { | |
|     errorHandler = defaultHandler; | |
|     timeoutHandler = defaultHandler; | |
|     terminationHandler = defaultHandler; | |
|     manager = Cudd_Init(numVars, numVarsZ, numSlots, cacheSize, maxMemory); | |
|     if (!manager) | |
|         errorHandler("Out of memory"); | |
|     verbose = 0; // initially terse | |
|     ref = 1; | |
| 
 | |
| } // Capsule::Capsule | |
|  | |
| 
 | |
| Capsule::~Capsule() | |
| { | |
| #ifdef DD_DEBUG | |
|     if (manager) { | |
|         int retval = Cudd_CheckZeroRef(manager); | |
|         if (retval != 0) { | |
|             cerr << retval << " unexpected non-zero reference counts" << endl; | |
|         } else if (verbose) { | |
|             cerr << "All went well" << endl; | |
|         } | |
|     } | |
| #endif | |
|     for (vector<char *>::iterator it = varnames.begin(); | |
|          it != varnames.end(); ++it) { | |
|         delete [] *it; | |
|     }    | |
|     Cudd_Quit(manager); | |
| 
 | |
| } // Capsule::~Capsule | |
|  | |
| 
 | |
| // --------------------------------------------------------------------------- | |
| // Members of class DD | |
| // --------------------------------------------------------------------------- | |
|  | |
| 
 | |
| DD::DD() : p(0), node(0) {} | |
| 
 | |
| 
 | |
| DD::DD(Capsule *cap, DdNode *ddNode) : p(cap), node(ddNode) { | |
|     if (node) Cudd_Ref(node); | |
|     if (p->verbose) { | |
| 	cout << "Standard DD constructor for node " << hex << node << dec << | |
| 	    " ref = " << Cudd_Regular(node)->ref << "\n"; | |
|     } | |
| 
 | |
| } // DD::DD | |
|  | |
| 
 | |
| DD::DD(Cudd const & manager, DdNode *ddNode) : p(manager.p), node(ddNode) { | |
|     checkReturnValue(ddNode); | |
|     if (node) Cudd_Ref(node); | |
|     if (p->verbose) { | |
| 	cout << "Standard DD constructor for node " << hex << node << dec << | |
| 	    " ref = " << Cudd_Regular(node)->ref << "\n"; | |
|     } | |
| 
 | |
| } // DD::DD | |
|  | |
| 
 | |
| DD::DD(const DD &from) { | |
|     p = from.p; | |
|     node = from.node; | |
|     if (node) { | |
| 	Cudd_Ref(node); | |
| 	if (p->verbose) { | |
| 	    cout << "Copy DD constructor for node " << hex << node << dec << | |
| 		" ref = " << Cudd_Regular(node)->ref << "\n"; | |
| 	} | |
|     } | |
| 
 | |
| } // DD::DD | |
|  | |
| 
 | |
| DD::~DD() {} | |
| 
 | |
| 
 | |
| inline DdManager * | |
| DD::checkSameManager( | |
|   const DD &other) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     if (mgr != other.p->manager) { | |
| 	p->errorHandler("Operands come from different manager."); | |
|     } | |
|     return mgr; | |
| 
 | |
| } // DD::checkSameManager | |
|  | |
| 
 | |
| inline void | |
| DD::checkReturnValue( | |
|   const void *result) const | |
| { | |
|     if (result == 0) { | |
| 	DdManager *mgr = p->manager; | |
| 	Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr); | |
| 	switch (errType) { | |
| 	case CUDD_MEMORY_OUT: | |
| 	    p->errorHandler("Out of memory."); | |
| 	    break; | |
| 	case CUDD_TOO_MANY_NODES: | |
| 	    break; | |
| 	case CUDD_MAX_MEM_EXCEEDED: | |
| 	    p->errorHandler("Maximum memory exceeded."); | |
| 	    break; | |
|         case CUDD_TIMEOUT_EXPIRED:  | |
|             { | |
|                 std::ostringstream msg; | |
|                 unsigned long lag =  | |
|                     Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr); | |
|                 msg << "Timeout expired.  Lag = " << lag << " ms."; | |
|                 p->timeoutHandler(msg.str()); | |
|             } | |
| 	    break; | |
|         case CUDD_TERMINATION: | |
|             { | |
|                 std::ostringstream msg; | |
|                 msg << "Terminated.\n"; | |
|                 p->terminationHandler(msg.str()); | |
|             } | |
|             break; | |
| 	case CUDD_INVALID_ARG: | |
| 	    p->errorHandler("Invalid argument."); | |
| 	    break; | |
| 	case CUDD_INTERNAL_ERROR: | |
| 	    p->errorHandler("Internal error."); | |
| 	    break; | |
| 	case CUDD_NO_ERROR: | |
| 	    p->errorHandler("Unexpected error."); | |
| 	    break; | |
| 	} | |
|     } | |
| 
 | |
| } // DD::checkReturnValue | |
|  | |
| 
 | |
| inline void | |
| DD::checkReturnValue( | |
|   int result, | |
|   int expected) const | |
| { | |
|     if (result != expected) { | |
| 	DdManager *mgr = p->manager; | |
| 	Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr); | |
| 	switch (errType) { | |
| 	case CUDD_MEMORY_OUT: | |
| 	    p->errorHandler("Out of memory."); | |
| 	    break; | |
| 	case CUDD_TOO_MANY_NODES: | |
| 	    break; | |
| 	case CUDD_MAX_MEM_EXCEEDED: | |
| 	    p->errorHandler("Maximum memory exceeded."); | |
| 	    break; | |
|         case CUDD_TIMEOUT_EXPIRED: | |
|             { | |
|                 std::ostringstream msg; | |
|                 unsigned long lag =  | |
|                     Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr); | |
|                 msg << "Timeout expired.  Lag = " << lag << " ms.\n"; | |
|                 p->timeoutHandler(msg.str()); | |
|             } | |
| 	    break; | |
|         case CUDD_TERMINATION: | |
|             { | |
|                 std::ostringstream msg; | |
|                 msg << "Terminated.\n"; | |
|                 p->terminationHandler(msg.str()); | |
|             } | |
|             break; | |
| 	case CUDD_INVALID_ARG: | |
| 	    p->errorHandler("Invalid argument."); | |
| 	    break; | |
| 	case CUDD_INTERNAL_ERROR: | |
| 	    p->errorHandler("Internal error."); | |
| 	    break; | |
| 	case CUDD_NO_ERROR: | |
| 	    p->errorHandler("Unexpected error."); | |
| 	    break; | |
| 	} | |
|     } | |
| 
 | |
| } // DD::checkReturnValue | |
|  | |
| 
 | |
| DdManager * | |
| DD::manager() const | |
| { | |
|     return p->manager; | |
| 
 | |
| } // DD::manager | |
|  | |
| 
 | |
| DdNode * | |
| DD::getNode() const | |
| { | |
|     return node; | |
| 
 | |
| } // DD::getNode | |
|  | |
| 
 | |
| DdNode * | |
| DD::getRegularNode() const | |
| { | |
|     return Cudd_Regular(node); | |
| 
 | |
| } // DD::getRegularNode | |
|  | |
| 
 | |
| int | |
| DD::nodeCount() const | |
| { | |
|     return Cudd_DagSize(node); | |
| 
 | |
| } // DD::nodeCount | |
|  | |
| 
 | |
| unsigned int | |
| DD::NodeReadIndex() const | |
| { | |
|     return Cudd_NodeReadIndex(node); | |
| 
 | |
| } // DD::NodeReadIndex | |
|  | |
| 
 | |
| // --------------------------------------------------------------------------- | |
| // Members of class ABDD | |
| // --------------------------------------------------------------------------- | |
|  | |
| 
 | |
| ABDD::ABDD() : DD() {} | |
| ABDD::ABDD(Capsule *cap, DdNode *bddNode) : DD(cap,bddNode) {} | |
| ABDD::ABDD(Cudd const & manager, DdNode *bddNode) : DD(manager,bddNode) {} | |
| ABDD::ABDD(const ABDD &from) : DD(from) {} | |
| 
 | |
| 
 | |
| ABDD::~ABDD() { | |
|     if (node) { | |
| 	Cudd_RecursiveDeref(p->manager,node); | |
| 	if (p->verbose) { | |
| 	    cout << "ADD/BDD destructor called for node " << hex << dec << | |
| 		node << " ref = " << Cudd_Regular(node)->ref << "\n"; | |
| 	} | |
|     } | |
| 
 | |
| } // ABDD::~ABDD | |
|  | |
| 
 | |
| bool | |
| ABDD::operator==( | |
|   const ABDD& other) const | |
| { | |
|     checkSameManager(other); | |
|     return node == other.node; | |
| 
 | |
| } // ABDD::operator== | |
|  | |
| 
 | |
| bool | |
| ABDD::operator!=( | |
|   const ABDD& other) const | |
| { | |
|     checkSameManager(other); | |
|     return node != other.node; | |
| 
 | |
| } // ABDD::operator!= | |
|  | |
| 
 | |
| bool | |
| ABDD::IsOne() const | |
| { | |
|     return node == Cudd_ReadOne(p->manager); | |
| 
 | |
| } // ABDD::IsOne | |
|  | |
| 
 | |
| void | |
| ABDD::print( | |
|   int nvars, | |
|   int verbosity) const | |
| { | |
|     cout.flush(); | |
|     if (!node) defaultError("empty DD."); | |
|     int retval = Cudd_PrintDebug(p->manager,node,nvars,verbosity); | |
|     fflush(Cudd_ReadStdout(p->manager)); | |
|     checkReturnValue(retval); | |
|     //if (retval == 0) p->errorHandler("print failed"); | |
|  | |
| } // ABDD::print | |
|  | |
| void | |
| ABDD::summary( | |
|   int nvars, | |
|   int mode) const | |
| { | |
|     cout.flush(); | |
|     if (!node) defaultError("empty DD."); | |
|     int retval = Cudd_PrintSummary(p->manager,node,nvars,mode); | |
|     fflush(Cudd_ReadStdout(p->manager)); | |
|     checkReturnValue(retval); | |
| 
 | |
| } // ABDD::summary | |
|  | |
| // --------------------------------------------------------------------------- | |
| // Members of class BDD | |
| // --------------------------------------------------------------------------- | |
|  | |
| BDD::BDD() : ABDD() {} | |
| BDD::BDD(Capsule *cap, DdNode *bddNode) : ABDD(cap,bddNode) {} | |
| BDD::BDD(Cudd const & manager, DdNode *bddNode) : ABDD(manager,bddNode) {} | |
| BDD::BDD(const BDD &from) : ABDD(from) {} | |
| 
 | |
| 
 | |
| BDD | |
| BDD::operator=( | |
|   const BDD& right) | |
| { | |
|     if (this == &right) return *this; | |
|     if (right.node) Cudd_Ref(right.node); | |
|     if (node) { | |
| 	Cudd_RecursiveDeref(p->manager,node); | |
| 	if (p->verbose) { | |
| 	    cout << "BDD dereferencing for node " << hex << node << dec << | |
| 		" ref = " << Cudd_Regular(node)->ref << "\n"; | |
| 	} | |
|     } | |
|     node = right.node; | |
|     p = right.p; | |
|     if (node && p->verbose) { | |
| 	cout << "BDD assignment for node " << hex << node << dec << | |
| 	    " ref = " << Cudd_Regular(node)->ref << "\n"; | |
|     } | |
|     return *this; | |
| 
 | |
| } // BDD::operator= | |
|  | |
| 
 | |
| bool | |
| BDD::operator<=( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return Cudd_bddLeq(mgr,node,other.node); | |
| 
 | |
| } // BDD::operator<= | |
|  | |
| 
 | |
| bool | |
| BDD::operator>=( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return Cudd_bddLeq(mgr,other.node,node); | |
| 
 | |
| } // BDD::operator>= | |
|  | |
| 
 | |
| bool | |
| BDD::operator<( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return node != other.node && Cudd_bddLeq(mgr,node,other.node); | |
| 
 | |
| } // BDD::operator< | |
|  | |
| 
 | |
| bool | |
| BDD::operator>( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return node != other.node && Cudd_bddLeq(mgr,other.node,node); | |
| 
 | |
| } // BDD::operator> | |
|  | |
| 
 | |
| BDD | |
| BDD::operator!() const | |
| { | |
|     return BDD(p, Cudd_Not(node)); | |
| 
 | |
| } // BDD::operator! | |
|  | |
| 
 | |
| BDD | |
| BDD::operator~() const | |
| { | |
|     return BDD(p, Cudd_Not(node)); | |
| 
 | |
| } // BDD::operator~ | |
|  | |
| 
 | |
| BDD | |
| BDD::operator*( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddAnd(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::operator* | |
|  | |
| 
 | |
| BDD | |
| BDD::operator*=( | |
|   const BDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddAnd(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // BDD::operator*= | |
|  | |
| 
 | |
| BDD | |
| BDD::operator&( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddAnd(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::operator& | |
|  | |
| 
 | |
| BDD | |
| BDD::operator&=( | |
|   const BDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddAnd(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // BDD::operator&= | |
|  | |
| 
 | |
| BDD | |
| BDD::operator+( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddOr(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::operator+ | |
|  | |
| 
 | |
| BDD | |
| BDD::operator+=( | |
|   const BDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddOr(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // BDD::operator+= | |
|  | |
| 
 | |
| BDD | |
| BDD::operator|( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddOr(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::operator| | |
|  | |
| 
 | |
| BDD | |
| BDD::operator|=( | |
|   const BDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddOr(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // BDD::operator|= | |
|  | |
| 
 | |
| BDD | |
| BDD::operator^( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddXor(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::operator^ | |
|  | |
| 
 | |
| BDD | |
| BDD::operator^=( | |
|   const BDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddXor(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // BDD::operator^= | |
|  | |
| 
 | |
| BDD | |
| BDD::operator-( | |
|   const BDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node)); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::operator- | |
|  | |
| 
 | |
| BDD | |
| BDD::operator-=( | |
|   const BDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node)); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // BDD::operator-= | |
|  | |
| 
 | |
| ostream & operator<<(ostream & os, BDD const & f) | |
| { | |
|     if (!f.node) defaultError("empty DD."); | |
|     DdManager *mgr = f.p->manager; | |
|     vector<char *> const & vn = f.p->varnames; | |
|     char const * const *inames = vn.size() == (size_t) Cudd_ReadSize(mgr) ? | |
|         &vn[0] : 0; | |
|     char * str = Cudd_FactoredFormString(mgr, f.node, inames); | |
|     f.checkReturnValue(str); | |
|     os << string(str); | |
|     free(str); | |
|     return os; | |
| 
 | |
| } // operator<< | |
|  | |
| 
 | |
| bool | |
| BDD::IsZero() const | |
| { | |
|     return node == Cudd_ReadLogicZero(p->manager); | |
| 
 | |
| } // BDD::IsZero | |
|  | |
| 
 | |
| bool | |
| BDD::IsVar() const | |
| { | |
|     return Cudd_bddIsVar(p->manager, node); | |
| 
 | |
| } // BDD::IsVar | |
|  | |
| 
 | |
| // --------------------------------------------------------------------------- | |
| // Members of class ADD | |
| // --------------------------------------------------------------------------- | |
|  | |
| 
 | |
| ADD::ADD() : ABDD() {} | |
| ADD::ADD(Capsule *cap, DdNode *bddNode) : ABDD(cap,bddNode) {} | |
| ADD::ADD(Cudd const & manager, DdNode *bddNode) : ABDD(manager,bddNode) {} | |
| ADD::ADD(const ADD &from) : ABDD(from) {} | |
| 
 | |
| 
 | |
| ADD | |
| ADD::operator=( | |
|   const ADD& right) | |
| { | |
|     if (this == &right) return *this; | |
|     if (right.node) Cudd_Ref(right.node); | |
|     if (node) { | |
| 	Cudd_RecursiveDeref(p->manager,node); | |
|     } | |
|     node = right.node; | |
|     p = right.p; | |
|     return *this; | |
| 
 | |
| } // ADD::operator= | |
|  | |
| 
 | |
| bool | |
| ADD::operator<=( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return Cudd_addLeq(mgr,node,other.node); | |
| 
 | |
| } // ADD::operator<= | |
|  | |
| 
 | |
| bool | |
| ADD::operator>=( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return Cudd_addLeq(mgr,other.node,node); | |
| 
 | |
| } // ADD::operator>= | |
|  | |
| 
 | |
| bool | |
| ADD::operator<( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return node != other.node && Cudd_addLeq(mgr,node,other.node); | |
| 
 | |
| } // ADD::operator< | |
|  | |
| 
 | |
| bool | |
| ADD::operator>( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return node != other.node && Cudd_addLeq(mgr,other.node,node); | |
| 
 | |
| } // ADD::operator> | |
|  | |
| 
 | |
| ADD | |
| ADD::operator-() const | |
| { | |
|     return ADD(p, Cudd_addNegate(p->manager,node)); | |
| 
 | |
| } // ADD::operator- | |
|  | |
| 
 | |
| ADD | |
| ADD::operator*( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::operator* | |
|  | |
| 
 | |
| ADD | |
| ADD::operator*=( | |
|   const ADD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ADD::operator*= | |
|  | |
| 
 | |
| ADD | |
| ADD::operator+( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::operator+ | |
|  | |
| 
 | |
| ADD | |
| ADD::operator+=( | |
|   const ADD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ADD::operator+= | |
|  | |
| 
 | |
| ADD | |
| ADD::operator-( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::operator- | |
|  | |
| 
 | |
| ADD | |
| ADD::operator-=( | |
|   const ADD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ADD::operator-= | |
|  | |
| 
 | |
| ADD | |
| ADD::operator~() const | |
| { | |
|     return ADD(p, Cudd_addCmpl(p->manager,node)); | |
| 
 | |
| } // ADD::operator~ | |
|  | |
| 
 | |
| ADD | |
| ADD::operator&( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::operator& | |
|  | |
| 
 | |
| ADD | |
| ADD::operator&=( | |
|   const ADD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ADD::operator&= | |
|  | |
| 
 | |
| ADD | |
| ADD::operator|( | |
|   const ADD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::operator| | |
|  | |
| 
 | |
| ADD | |
| ADD::operator|=( | |
|   const ADD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDeref(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ADD::operator|= | |
|  | |
| 
 | |
| bool | |
| ADD::IsZero() const | |
| { | |
|     return node == Cudd_ReadZero(p->manager); | |
| 
 | |
| } // ADD::IsZero | |
|  | |
| 
 | |
| // --------------------------------------------------------------------------- | |
| // Members of class ZDD | |
| // --------------------------------------------------------------------------- | |
|  | |
| 
 | |
| ZDD::ZDD(Capsule *cap, DdNode *bddNode) : DD(cap,bddNode) {} | |
| ZDD::ZDD() : DD() {} | |
| ZDD::ZDD(const ZDD &from) : DD(from) {} | |
| 
 | |
| 
 | |
| ZDD::~ZDD() { | |
|     if (node) { | |
| 	Cudd_RecursiveDerefZdd(p->manager,node); | |
| 	if (p->verbose) { | |
| 	    cout << "ZDD destructor called for node " << hex << node << dec << | |
| 		" ref = " << Cudd_Regular(node)->ref << "\n"; | |
| 	} | |
|     } | |
| 
 | |
| } // ZDD::~ZDD | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator=( | |
|   const ZDD& right) | |
| { | |
|     if (this == &right) return *this; | |
|     if (right.node) Cudd_Ref(right.node); | |
|     if (node) { | |
| 	Cudd_RecursiveDerefZdd(p->manager,node); | |
| 	if (p->verbose) { | |
| 	    cout << "ZDD dereferencing for node " << hex << node << dec << | |
| 		" ref = " << node->ref << "\n"; | |
| 	} | |
|     } | |
|     node = right.node; | |
|     p = right.p; | |
|     if (node && p->verbose) { | |
| 	cout << "ZDD assignment for node " << hex << node << dec << | |
| 	    " ref = " << node->ref << "\n"; | |
|     } | |
|     return *this; | |
| 
 | |
| } // ZDD::operator= | |
|  | |
| 
 | |
| bool | |
| ZDD::operator==( | |
|   const ZDD& other) const | |
| { | |
|     checkSameManager(other); | |
|     return node == other.node; | |
| 
 | |
| } // ZDD::operator== | |
|  | |
| 
 | |
| bool | |
| ZDD::operator!=( | |
|   const ZDD& other) const | |
| { | |
|     checkSameManager(other); | |
|     return node != other.node; | |
| 
 | |
| } // ZDD::operator!= | |
|  | |
| 
 | |
| bool | |
| ZDD::operator<=( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr); | |
| 
 | |
| } // ZDD::operator<= | |
|  | |
| 
 | |
| bool | |
| ZDD::operator>=( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr); | |
| 
 | |
| } // ZDD::operator>= | |
|  | |
| 
 | |
| bool | |
| ZDD::operator<( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return node != other.node && | |
| 	Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr); | |
| 
 | |
| } // ZDD::operator< | |
|  | |
| 
 | |
| bool | |
| ZDD::operator>( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     return node != other.node && | |
| 	Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr); | |
| 
 | |
| } // ZDD::operator> | |
|  | |
| 
 | |
| void | |
| ZDD::print( | |
|   int nvars, | |
|   int verbosity) const | |
| { | |
|     cout.flush(); | |
|     int retval = Cudd_zddPrintDebug(p->manager,node,nvars,verbosity); | |
|     fflush(Cudd_ReadStdout(p->manager)); | |
|     if (retval == 0) p->errorHandler("print failed"); | |
| 
 | |
| } // ZDD::print | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator*( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddIntersect(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::operator* | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator*=( | |
|   const ZDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddIntersect(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDerefZdd(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ZDD::operator*= | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator&( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddIntersect(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::operator& | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator&=( | |
|   const ZDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddIntersect(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDerefZdd(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ZDD::operator&= | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator+( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddUnion(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::operator+ | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator+=( | |
|   const ZDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddUnion(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDerefZdd(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ZDD::operator+= | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator|( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddUnion(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::operator| | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator|=( | |
|   const ZDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddUnion(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDerefZdd(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ZDD::operator|= | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator-( | |
|   const ZDD& other) const | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddDiff(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::operator- | |
|  | |
| 
 | |
| ZDD | |
| ZDD::operator-=( | |
|   const ZDD& other) | |
| { | |
|     DdManager *mgr = checkSameManager(other); | |
|     DdNode *result = Cudd_zddDiff(mgr,node,other.node); | |
|     checkReturnValue(result); | |
|     Cudd_Ref(result); | |
|     Cudd_RecursiveDerefZdd(mgr,node); | |
|     node = result; | |
|     return *this; | |
| 
 | |
| } // ZDD::operator-= | |
|  | |
| 
 | |
| // --------------------------------------------------------------------------- | |
| // Members of class Cudd | |
| // --------------------------------------------------------------------------- | |
|  | |
| 
 | |
| Cudd::Cudd( | |
|   unsigned int numVars, | |
|   unsigned int numVarsZ, | |
|   unsigned int numSlots, | |
|   unsigned int cacheSize, | |
|   unsigned long maxMemory, | |
|   PFC defaultHandler) | |
| { | |
|     p = new Capsule(numVars,numVarsZ,numSlots,cacheSize,maxMemory,defaultHandler); | |
| 
 | |
| } // Cudd::Cudd | |
|  | |
| 
 | |
| Cudd::Cudd( | |
|   const Cudd& x) | |
| { | |
|     p = x.p; | |
|     x.p->ref++; | |
|     if (p->verbose) | |
|         cout << "Cudd Copy Constructor" << endl; | |
| 
 | |
| } // Cudd::Cudd | |
|  | |
| 
 | |
| Cudd::~Cudd() | |
| { | |
|     if (--p->ref == 0) { | |
| 	delete p; | |
|     } | |
| 
 | |
| } // Cudd::~Cudd | |
|  | |
| 
 | |
| DdManager * | |
| Cudd::getManager(void) const | |
| { | |
|     return p->manager; | |
| 
 | |
| } // Cudd::getManager | |
|  | |
| 
 | |
| void | |
| Cudd::makeVerbose(void) const | |
| { | |
|     p->verbose = 1; | |
| 
 | |
| } // Cudd::makeVerbose | |
|  | |
| 
 | |
| void | |
| Cudd::makeTerse(void) const | |
| { | |
|     p->verbose = 0; | |
| 
 | |
| } // Cudd::makeTerse | |
|  | |
| 
 | |
| bool | |
| Cudd::isVerbose(void) const | |
| { | |
|     return p->verbose; | |
| 
 | |
| } // Cudd::isVerbose | |
|  | |
| 
 | |
| Cudd& | |
| Cudd::operator=( | |
|   const Cudd& right) | |
| { | |
|     right.p->ref++; | |
|     if (--p->ref == 0) {	// disconnect self | |
| 	delete p; | |
|     } | |
|     p = right.p; | |
|     return *this; | |
| 
 | |
| } // Cudd::operator= | |
|  | |
| 
 | |
| PFC | |
| Cudd::setHandler( | |
|   PFC newHandler) const | |
| { | |
|     PFC oldHandler = p->errorHandler; | |
|     p->errorHandler = newHandler; | |
|     return oldHandler; | |
| 
 | |
| } // Cudd::setHandler | |
|  | |
| 
 | |
| PFC | |
| Cudd::getHandler() const | |
| { | |
|     return p->errorHandler; | |
| 
 | |
| } // Cudd::getHandler | |
|  | |
| 
 | |
| PFC | |
| Cudd::setTimeoutHandler( | |
|   PFC newHandler) const | |
| { | |
|     PFC oldHandler = p->timeoutHandler; | |
|     p->timeoutHandler = newHandler; | |
|     return oldHandler; | |
| 
 | |
| } // Cudd::setTimeoutHandler | |
|  | |
| 
 | |
| PFC | |
| Cudd::getTimeoutHandler() const | |
| { | |
|     return p->timeoutHandler; | |
| 
 | |
| } // Cudd::getTimeourHandler | |
|  | |
| 
 | |
| PFC | |
| Cudd::setTerminationHandler( | |
|   PFC newHandler) const | |
| { | |
|     PFC oldHandler = p->terminationHandler; | |
|     p->terminationHandler = newHandler; | |
|     return oldHandler; | |
| 
 | |
| } // Cudd::setTerminationHandler | |
|  | |
| 
 | |
| PFC | |
| Cudd::getTerminationHandler() const | |
| { | |
|     return p->terminationHandler; | |
| 
 | |
| } // Cudd::getTerminationHandler | |
|  | |
| 
 | |
| void | |
| Cudd::pushVariableName(std::string s) const | |
| { | |
|     char * cstr = new char[s.length() + 1]; | |
|     strcpy(cstr, s.c_str()); | |
|     p->varnames.push_back(cstr); | |
| } | |
| 
 | |
| 
 | |
| void | |
| Cudd::clearVariableNames(void) const | |
| { | |
|     for (vector<char *>::iterator it = p->varnames.begin(); | |
|          it != p->varnames.end(); ++it) { | |
|         delete [] *it; | |
|     } | |
|     p->varnames.clear(); | |
| } | |
| 
 | |
| 
 | |
| std::string | |
| Cudd::getVariableName(size_t i) const | |
| { | |
|     return std::string(p->varnames.at(i)); | |
| } | |
| 
 | |
| 
 | |
| inline void | |
| Cudd::checkReturnValue( | |
|   const void *result) const | |
| { | |
|     if (result == 0) { | |
| 	if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) { | |
| 	    p->errorHandler("Out of memory."); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TOO_MANY_NODES) { | |
|             p->errorHandler("Too many nodes."); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_MAX_MEM_EXCEEDED) { | |
|             p->errorHandler("Maximum memory exceeded."); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TIMEOUT_EXPIRED) { | |
|             std::ostringstream msg; | |
|             DdManager *mgr = p->manager; | |
|             unsigned long lag =  | |
|                 Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr); | |
|             msg << "Timeout expired.  Lag = " << lag << " ms.\n"; | |
|             p->timeoutHandler(msg.str()); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TERMINATION) { | |
|             std::ostringstream msg; | |
|             msg << "Terminated.\n"; | |
|             p->terminationHandler(msg.str()); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INVALID_ARG) { | |
|             p->errorHandler("Invalid argument."); | |
| 	} else if (Cudd_ReadErrorCode(p->manager) == CUDD_INTERNAL_ERROR) { | |
| 	    p->errorHandler("Internal error."); | |
| 	} else { | |
|             p->errorHandler("Unexpected error."); | |
|         } | |
|     } | |
| 
 | |
| } // Cudd::checkReturnValue | |
|  | |
| 
 | |
| inline void | |
| Cudd::checkReturnValue( | |
|   const int result) const | |
| { | |
|     if (result == 0) { | |
| 	if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) { | |
| 	    p->errorHandler("Out of memory."); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TOO_MANY_NODES) { | |
|             p->errorHandler("Too many nodes."); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_MAX_MEM_EXCEEDED) { | |
|             p->errorHandler("Maximum memory exceeded."); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TIMEOUT_EXPIRED) { | |
|             std::ostringstream msg; | |
|             DdManager *mgr = p->manager; | |
|             unsigned long lag =  | |
|                 Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr); | |
|             msg << "Timeout expired.  Lag = " << lag << " ms.\n"; | |
|             p->timeoutHandler(msg.str()); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TERMINATION) { | |
|             std::ostringstream msg; | |
|             msg << "Terminated.\n"; | |
|             p->terminationHandler(msg.str()); | |
|         } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INVALID_ARG) { | |
|             p->errorHandler("Invalid argument."); | |
| 	} else if (Cudd_ReadErrorCode(p->manager) == CUDD_INTERNAL_ERROR) { | |
| 	    p->errorHandler("Internal error."); | |
| 	} else { | |
| 	    p->errorHandler("Unexpected error."); | |
| 	} | |
|     } | |
| 
 | |
| } // Cudd::checkReturnValue | |
|  | |
| 
 | |
| void | |
| Cudd::info() const | |
| { | |
|     cout.flush(); | |
|     int retval = Cudd_PrintInfo(p->manager,stdout); | |
|     checkReturnValue(retval); | |
| 
 | |
| } // Cudd::info | |
|  | |
| 
 | |
| BDD | |
| Cudd::bddVar() const | |
| { | |
|     DdNode *result = Cudd_bddNewVar(p->manager); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::bddVar | |
|  | |
| 
 | |
| BDD | |
| Cudd::bddVar( | |
|   int index) const | |
| { | |
|     DdNode *result = Cudd_bddIthVar(p->manager,index); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::bddVar | |
|  | |
| 
 | |
| BDD | |
| Cudd::bddOne() const | |
| { | |
|     DdNode *result = Cudd_ReadOne(p->manager); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::bddOne | |
|  | |
| 
 | |
| BDD | |
| Cudd::bddZero() const | |
| { | |
|     DdNode *result = Cudd_ReadLogicZero(p->manager); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::bddZero | |
|  | |
| 
 | |
| ADD | |
| Cudd::addVar() const | |
| { | |
|     DdNode *result = Cudd_addNewVar(p->manager); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::addVar | |
|  | |
| 
 | |
| ADD | |
| Cudd::addVar( | |
|   int index) const | |
| { | |
|     DdNode *result = Cudd_addIthVar(p->manager,index); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::addVar | |
|  | |
| 
 | |
| ADD | |
| Cudd::addOne() const | |
| { | |
|     DdNode *result = Cudd_ReadOne(p->manager); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::addOne | |
|  | |
| 
 | |
| ADD | |
| Cudd::addZero() const | |
| { | |
|     DdNode *result = Cudd_ReadZero(p->manager); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::addZero | |
|  | |
| 
 | |
| ADD | |
| Cudd::constant( | |
|   CUDD_VALUE_TYPE c) const | |
| { | |
|     DdNode *result = Cudd_addConst(p->manager, c); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::constant | |
|  | |
| 
 | |
| ADD | |
| Cudd::plusInfinity() const | |
| { | |
|     DdNode *result = Cudd_ReadPlusInfinity(p->manager); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::plusInfinity | |
|  | |
| 
 | |
| ADD | |
| Cudd::minusInfinity() const | |
| { | |
|     DdNode *result = Cudd_ReadMinusInfinity(p->manager); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::minusInfinity | |
|  | |
| 
 | |
| ZDD | |
| Cudd::zddVar( | |
|   int index) const | |
| { | |
|     DdNode *result = Cudd_zddIthVar(p->manager,index); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // Cudd::zddVar | |
|  | |
| 
 | |
| ZDD | |
| Cudd::zddOne( | |
|   int i) const | |
| { | |
|     DdNode *result = Cudd_ReadZddOne(p->manager,i); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // Cudd::zddOne | |
|  | |
| 
 | |
| ZDD | |
| Cudd::zddZero() const | |
| { | |
|     DdNode *result = Cudd_ReadZero(p->manager); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // Cudd::zddZero | |
|  | |
| 
 | |
| void | |
| defaultError( | |
|   string message) | |
| { | |
|     throw std::logic_error(message); | |
| 
 | |
| } // defaultError | |
|  | |
| 
 | |
| // --------------------------------------------------------------------------- | |
| // All the rest | |
| // --------------------------------------------------------------------------- | |
|  | |
| 
 | |
| ADD | |
| Cudd::addNewVarAtLevel( | |
|   int level) const | |
| { | |
|     DdNode *result = Cudd_addNewVarAtLevel(p->manager, level); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::addNewVarAtLevel | |
|  | |
| 
 | |
| BDD | |
| Cudd::bddNewVarAtLevel( | |
|   int level) const | |
| { | |
|     DdNode *result = Cudd_bddNewVarAtLevel(p->manager, level); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::bddNewVarAtLevel | |
|  | |
| 
 | |
| void | |
| Cudd::zddVarsFromBddVars( | |
|   int multiplicity) const | |
| { | |
|     int result = Cudd_zddVarsFromBddVars(p->manager, multiplicity); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::zddVarsFromBddVars | |
|  | |
| 
 | |
| unsigned long | |
| Cudd::ReadStartTime() const | |
| { | |
|     return Cudd_ReadStartTime(p->manager); | |
| 
 | |
| } // Cudd::ReadStartTime | |
|  | |
| 
 | |
| unsigned long | |
| Cudd::ReadElapsedTime() const | |
| { | |
|     return Cudd_ReadElapsedTime(p->manager); | |
| 
 | |
| } // Cudd::ReadElapsedTime | |
|  | |
| 
 | |
| void  | |
| Cudd::SetStartTime( | |
|   unsigned long st) const | |
| { | |
|     Cudd_SetStartTime(p->manager, st); | |
| 
 | |
| } // Cudd::SetStartTime | |
|  | |
| 
 | |
| void  | |
| Cudd::ResetStartTime() const | |
| { | |
|     Cudd_ResetStartTime(p->manager); | |
| 
 | |
| } // Cudd::ResetStartTime | |
|  | |
| 
 | |
| unsigned long | |
| Cudd::ReadTimeLimit() const | |
| { | |
|     return Cudd_ReadTimeLimit(p->manager); | |
| 
 | |
| } // Cudd::ReadTimeLimit | |
|  | |
| 
 | |
| unsigned long | |
| Cudd::SetTimeLimit( | |
|   unsigned long tl) const | |
| { | |
|     return Cudd_SetTimeLimit(p->manager, tl); | |
| 
 | |
| } // Cudd::SetTimeLimit | |
|  | |
| 
 | |
| void | |
| Cudd::UpdateTimeLimit() const | |
| { | |
|     Cudd_UpdateTimeLimit(p->manager); | |
| 
 | |
| } // Cudd::UpdateTimeLimit | |
|  | |
| 
 | |
| void | |
| Cudd::IncreaseTimeLimit( | |
|   unsigned long increase) const | |
| { | |
|     Cudd_IncreaseTimeLimit(p->manager, increase); | |
| 
 | |
| } // Cudd::IncreaseTimeLimit | |
|  | |
| 
 | |
| void  | |
| Cudd::UnsetTimeLimit() const | |
| { | |
|     Cudd_UnsetTimeLimit(p->manager); | |
| 
 | |
| } // Cudd::UnsetTimeLimit | |
|  | |
| 
 | |
| bool | |
| Cudd::TimeLimited() const | |
| { | |
|     return Cudd_TimeLimited(p->manager); | |
| 
 | |
| } // Cudd::TimeLimited | |
|  | |
| 
 | |
| void | |
| Cudd::RegisterTerminationCallback( | |
|   DD_THFP callback, | |
|   void * callback_arg) const | |
| { | |
|     Cudd_RegisterTerminationCallback(p->manager, callback, callback_arg); | |
| 
 | |
| } // Cudd::RegisterTerminationCallback | |
|  | |
| 
 | |
| void | |
| Cudd::UnregisterTerminationCallback() const | |
| { | |
|     Cudd_UnregisterTerminationCallback(p->manager); | |
| 
 | |
| } // Cudd::UnregisterTerminationCallback | |
|  | |
| 
 | |
| DD_OOMFP | |
| Cudd::RegisterOutOfMemoryCallback( | |
|   DD_OOMFP callback) const | |
| { | |
|     return Cudd_RegisterOutOfMemoryCallback(p->manager, callback); | |
| 
 | |
| } // Cudd::RegisterOutOfMemoryCallback | |
|  | |
| 
 | |
| void | |
| Cudd::UnregisterOutOfMemoryCallback() const | |
| { | |
|     Cudd_UnregisterOutOfMemoryCallback(p->manager); | |
| 
 | |
| } // Cudd::UnregisterOutOfMemoryCallback | |
|  | |
| 
 | |
| void | |
| Cudd::AutodynEnable( | |
|   Cudd_ReorderingType method) const | |
| { | |
|     Cudd_AutodynEnable(p->manager, method); | |
| 
 | |
| } // Cudd::AutodynEnable | |
|  | |
| 
 | |
| void | |
| Cudd::AutodynDisable() const | |
| { | |
|     Cudd_AutodynDisable(p->manager); | |
| 
 | |
| } // Cudd::AutodynDisable | |
|  | |
| 
 | |
| bool | |
| Cudd::ReorderingStatus( | |
|   Cudd_ReorderingType * method) const | |
| { | |
|     return Cudd_ReorderingStatus(p->manager, method); | |
| 
 | |
| } // Cudd::ReorderingStatus | |
|  | |
| 
 | |
| void | |
| Cudd::AutodynEnableZdd( | |
|   Cudd_ReorderingType method) const | |
| { | |
|     Cudd_AutodynEnableZdd(p->manager, method); | |
| 
 | |
| } // Cudd::AutodynEnableZdd | |
|  | |
| 
 | |
| void | |
| Cudd::AutodynDisableZdd() const | |
| { | |
|     Cudd_AutodynDisableZdd(p->manager); | |
| 
 | |
| } // Cudd::AutodynDisableZdd | |
|  | |
| 
 | |
| bool | |
| Cudd::ReorderingStatusZdd( | |
|   Cudd_ReorderingType * method) const | |
| { | |
|     return Cudd_ReorderingStatusZdd(p->manager, method); | |
| 
 | |
| } // Cudd::ReorderingStatusZdd | |
|  | |
| 
 | |
| bool | |
| Cudd::zddRealignmentEnabled() const | |
| { | |
|     return Cudd_zddRealignmentEnabled(p->manager); | |
| 
 | |
| } // Cudd::zddRealignmentEnabled | |
|  | |
| 
 | |
| void | |
| Cudd::zddRealignEnable() const | |
| { | |
|     Cudd_zddRealignEnable(p->manager); | |
| 
 | |
| } // Cudd::zddRealignEnable | |
|  | |
| 
 | |
| void | |
| Cudd::zddRealignDisable() const | |
| { | |
|     Cudd_zddRealignDisable(p->manager); | |
| 
 | |
| } // Cudd::zddRealignDisable | |
|  | |
| 
 | |
| bool | |
| Cudd::bddRealignmentEnabled() const | |
| { | |
|     return Cudd_bddRealignmentEnabled(p->manager); | |
| 
 | |
| } // Cudd::bddRealignmentEnabled | |
|  | |
| 
 | |
| void | |
| Cudd::bddRealignEnable() const | |
| { | |
|     Cudd_bddRealignEnable(p->manager); | |
| 
 | |
| } // Cudd::bddRealignEnable | |
|  | |
| 
 | |
| void | |
| Cudd::bddRealignDisable() const | |
| { | |
|     Cudd_bddRealignDisable(p->manager); | |
| 
 | |
| } // Cudd::bddRealignDisable | |
|  | |
| 
 | |
| ADD | |
| Cudd::background() const | |
| { | |
|     DdNode *result = Cudd_ReadBackground(p->manager); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::background | |
|  | |
| 
 | |
| void | |
| Cudd::SetBackground( | |
|   ADD bg) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     if (mgr != bg.manager()) { | |
| 	p->errorHandler("Background comes from different manager."); | |
|     } | |
|     Cudd_SetBackground(mgr, bg.getNode()); | |
| 
 | |
| } // Cudd::SetBackground | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadCacheSlots() const | |
| { | |
|     return Cudd_ReadCacheSlots(p->manager); | |
| 
 | |
| } // Cudd::ReadCacheSlots | |
|  | |
| 
 | |
| double | |
| Cudd::ReadCacheLookUps() const | |
| { | |
|     return Cudd_ReadCacheLookUps(p->manager); | |
| 
 | |
| } // Cudd::ReadCacheLookUps | |
|  | |
| 
 | |
| double | |
| Cudd::ReadCacheUsedSlots() const | |
| { | |
|     return Cudd_ReadCacheUsedSlots(p->manager); | |
| 
 | |
| } // Cudd::ReadCacheUsedSlots | |
|  | |
| 
 | |
| double | |
| Cudd::ReadCacheHits() const | |
| { | |
|     return Cudd_ReadCacheHits(p->manager); | |
| 
 | |
| } // Cudd::ReadCacheHits | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadMinHit() const | |
| { | |
|     return Cudd_ReadMinHit(p->manager); | |
| 
 | |
| } // Cudd::ReadMinHit | |
|  | |
| 
 | |
| void | |
| Cudd::SetMinHit( | |
|   unsigned int hr) const | |
| { | |
|     Cudd_SetMinHit(p->manager, hr); | |
| 
 | |
| } // Cudd::SetMinHit | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadLooseUpTo() const | |
| { | |
|     return Cudd_ReadLooseUpTo(p->manager); | |
| 
 | |
| } // Cudd::ReadLooseUpTo | |
|  | |
| 
 | |
| void | |
| Cudd::SetLooseUpTo( | |
|   unsigned int lut) const | |
| { | |
|     Cudd_SetLooseUpTo(p->manager, lut); | |
| 
 | |
| } // Cudd::SetLooseUpTo | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadMaxCache() const | |
| { | |
|     return Cudd_ReadMaxCache(p->manager); | |
| 
 | |
| } // Cudd::ReadMaxCache | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadMaxCacheHard() const | |
| { | |
|     return Cudd_ReadMaxCacheHard(p->manager); | |
| 
 | |
| } // Cudd::ReadMaxCacheHard | |
|  | |
| 
 | |
| void | |
| Cudd::SetMaxCacheHard( | |
|   unsigned int mc) const | |
| { | |
|     Cudd_SetMaxCacheHard(p->manager, mc); | |
| 
 | |
| } // Cudd::SetMaxCacheHard | |
|  | |
| 
 | |
| int | |
| Cudd::ReadSize() const | |
| { | |
|     return Cudd_ReadSize(p->manager); | |
| 
 | |
| } // Cudd::ReadSize | |
|  | |
| 
 | |
| int | |
| Cudd::ReadZddSize() const | |
| { | |
|     return Cudd_ReadZddSize(p->manager); | |
| 
 | |
| } // Cudd::ReadZddSize | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadSlots() const | |
| { | |
|     return Cudd_ReadSlots(p->manager); | |
| 
 | |
| } // Cudd::ReadSlots | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadKeys() const | |
| { | |
|     return Cudd_ReadKeys(p->manager); | |
| 
 | |
| } // Cudd::ReadKeys | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadDead() const | |
| { | |
|     return Cudd_ReadDead(p->manager); | |
| 
 | |
| } // Cudd::ReadDead | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadMinDead() const | |
| { | |
|     return Cudd_ReadMinDead(p->manager); | |
| 
 | |
| } // Cudd::ReadMinDead | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadReorderings() const | |
| { | |
|     return Cudd_ReadReorderings(p->manager); | |
| 
 | |
| } // Cudd::ReadReorderings | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadMaxReorderings() const | |
| { | |
|     return Cudd_ReadMaxReorderings(p->manager); | |
| 
 | |
| } // Cudd::ReadMaxReorderings | |
|  | |
| void | |
| Cudd::SetMaxReorderings( | |
|   unsigned int mr) const | |
| { | |
|     Cudd_SetMaxReorderings(p->manager, mr); | |
| 
 | |
| } // Cudd::SetMaxReorderings | |
|  | |
| long | |
| Cudd::ReadReorderingTime() const | |
| { | |
|     return Cudd_ReadReorderingTime(p->manager); | |
| 
 | |
| } // Cudd::ReadReorderingTime | |
|  | |
| 
 | |
| int | |
| Cudd::ReadGarbageCollections() const | |
| { | |
|     return Cudd_ReadGarbageCollections(p->manager); | |
| 
 | |
| } // Cudd::ReadGarbageCollections | |
|  | |
| 
 | |
| long | |
| Cudd::ReadGarbageCollectionTime() const | |
| { | |
|     return Cudd_ReadGarbageCollectionTime(p->manager); | |
| 
 | |
| } // Cudd::ReadGarbageCollectionTime | |
|  | |
| 
 | |
| int | |
| Cudd::ReadSiftMaxVar() const | |
| { | |
|     return Cudd_ReadSiftMaxVar(p->manager); | |
| 
 | |
| } // Cudd::ReadSiftMaxVar | |
|  | |
| 
 | |
| void | |
| Cudd::SetSiftMaxVar( | |
|   int smv) const | |
| { | |
|     Cudd_SetSiftMaxVar(p->manager, smv); | |
| 
 | |
| } // Cudd::SetSiftMaxVar | |
|  | |
| 
 | |
| int | |
| Cudd::ReadSiftMaxSwap() const | |
| { | |
|     return Cudd_ReadSiftMaxSwap(p->manager); | |
| 
 | |
| } // Cudd::ReadSiftMaxSwap | |
|  | |
| 
 | |
| void | |
| Cudd::SetSiftMaxSwap( | |
|   int sms) const | |
| { | |
|     Cudd_SetSiftMaxSwap(p->manager, sms); | |
| 
 | |
| } // Cudd::SetSiftMaxSwap | |
|  | |
| 
 | |
| double | |
| Cudd::ReadMaxGrowth() const | |
| { | |
|     return Cudd_ReadMaxGrowth(p->manager); | |
| 
 | |
| } // Cudd::ReadMaxGrowth | |
|  | |
| 
 | |
| void | |
| Cudd::SetMaxGrowth( | |
|   double mg) const | |
| { | |
|     Cudd_SetMaxGrowth(p->manager, mg); | |
| 
 | |
| } // Cudd::SetMaxGrowth | |
|  | |
| 
 | |
| MtrNode * | |
| Cudd::ReadTree() const | |
| { | |
|     return Cudd_ReadTree(p->manager); | |
| 
 | |
| } // Cudd::ReadTree | |
|  | |
| 
 | |
| void | |
| Cudd::SetTree( | |
|   MtrNode * tree) const | |
| { | |
|     Cudd_SetTree(p->manager, tree); | |
| 
 | |
| } // Cudd::SetTree | |
|  | |
| 
 | |
| void | |
| Cudd::FreeTree() const | |
| { | |
|     Cudd_FreeTree(p->manager); | |
| 
 | |
| } // Cudd::FreeTree | |
|  | |
| 
 | |
| MtrNode * | |
| Cudd::ReadZddTree() const | |
| { | |
|     return Cudd_ReadZddTree(p->manager); | |
| 
 | |
| } // Cudd::ReadZddTree | |
|  | |
| 
 | |
| void | |
| Cudd::SetZddTree( | |
|   MtrNode * tree) const | |
| { | |
|     Cudd_SetZddTree(p->manager, tree); | |
| 
 | |
| } // Cudd::SetZddTree | |
|  | |
| 
 | |
| void | |
| Cudd::FreeZddTree() const | |
| { | |
|     Cudd_FreeZddTree(p->manager); | |
| 
 | |
| } // Cudd::FreeZddTree | |
|  | |
| 
 | |
| int | |
| Cudd::ReadPerm( | |
|   int i) const | |
| { | |
|     return Cudd_ReadPerm(p->manager, i); | |
| 
 | |
| } // Cudd::ReadPerm | |
|  | |
| 
 | |
| int | |
| Cudd::ReadPermZdd( | |
|   int i) const | |
| { | |
|     return Cudd_ReadPermZdd(p->manager, i); | |
| 
 | |
| } // Cudd::ReadPermZdd | |
|  | |
| 
 | |
| int | |
| Cudd::ReadInvPerm( | |
|   int i) const | |
| { | |
|     return Cudd_ReadInvPerm(p->manager, i); | |
| 
 | |
| } // Cudd::ReadInvPerm | |
|  | |
| 
 | |
| int | |
| Cudd::ReadInvPermZdd( | |
|   int i) const | |
| { | |
|     return Cudd_ReadInvPermZdd(p->manager, i); | |
| 
 | |
| } // Cudd::ReadInvPermZdd | |
|  | |
| 
 | |
| BDD | |
| Cudd::ReadVars( | |
|   int i) const | |
| { | |
|     DdNode *result = Cudd_ReadVars(p->manager, i); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::ReadVars | |
|  | |
| 
 | |
| CUDD_VALUE_TYPE | |
| Cudd::ReadEpsilon() const | |
| { | |
|     return Cudd_ReadEpsilon(p->manager); | |
| 
 | |
| } // Cudd::ReadEpsilon | |
|  | |
| 
 | |
| void | |
| Cudd::SetEpsilon( | |
|   CUDD_VALUE_TYPE ep) const | |
| { | |
|     Cudd_SetEpsilon(p->manager, ep); | |
| 
 | |
| } // Cudd::SetEpsilon | |
|  | |
| 
 | |
| Cudd_AggregationType | |
| Cudd::ReadGroupcheck() const | |
| { | |
|     return Cudd_ReadGroupcheck(p->manager); | |
| 
 | |
| } // Cudd::ReadGroupcheck | |
|  | |
| 
 | |
| void | |
| Cudd::SetGroupcheck( | |
|   Cudd_AggregationType gc) const | |
| { | |
|     Cudd_SetGroupcheck(p->manager, gc); | |
| 
 | |
| } // Cudd::SetGroupcheck | |
|  | |
| 
 | |
| bool | |
| Cudd::GarbageCollectionEnabled() const | |
| { | |
|     return Cudd_GarbageCollectionEnabled(p->manager); | |
| 
 | |
| } // Cudd::GarbageCollectionEnabled | |
|  | |
| 
 | |
| void | |
| Cudd::EnableGarbageCollection() const | |
| { | |
|     Cudd_EnableGarbageCollection(p->manager); | |
| 
 | |
| } // Cudd::EnableGarbageCollection | |
|  | |
| 
 | |
| void | |
| Cudd::DisableGarbageCollection() const | |
| { | |
|     Cudd_DisableGarbageCollection(p->manager); | |
| 
 | |
| } // Cudd::DisableGarbageCollection | |
|  | |
| 
 | |
| bool | |
| Cudd::DeadAreCounted() const | |
| { | |
|     return Cudd_DeadAreCounted(p->manager); | |
| 
 | |
| } // Cudd::DeadAreCounted | |
|  | |
| 
 | |
| void | |
| Cudd::TurnOnCountDead() const | |
| { | |
|     Cudd_TurnOnCountDead(p->manager); | |
| 
 | |
| } // Cudd::TurnOnCountDead | |
|  | |
| 
 | |
| void | |
| Cudd::TurnOffCountDead() const | |
| { | |
|     Cudd_TurnOffCountDead(p->manager); | |
| 
 | |
| } // Cudd::TurnOffCountDead | |
|  | |
| 
 | |
| int | |
| Cudd::ReadRecomb() const | |
| { | |
|     return Cudd_ReadRecomb(p->manager); | |
| 
 | |
| } // Cudd::ReadRecomb | |
|  | |
| 
 | |
| void | |
| Cudd::SetRecomb( | |
|   int recomb) const | |
| { | |
|     Cudd_SetRecomb(p->manager, recomb); | |
| 
 | |
| } // Cudd::SetRecomb | |
|  | |
| 
 | |
| int | |
| Cudd::ReadSymmviolation() const | |
| { | |
|     return Cudd_ReadSymmviolation(p->manager); | |
| 
 | |
| } // Cudd::ReadSymmviolation | |
|  | |
| 
 | |
| void | |
| Cudd::SetSymmviolation( | |
|   int symmviolation) const | |
| { | |
|     Cudd_SetSymmviolation(p->manager, symmviolation); | |
| 
 | |
| } // Cudd::SetSymmviolation | |
|  | |
| 
 | |
| int | |
| Cudd::ReadArcviolation() const | |
| { | |
|     return Cudd_ReadArcviolation(p->manager); | |
| 
 | |
| } // Cudd::ReadArcviolation | |
|  | |
| 
 | |
| void | |
| Cudd::SetArcviolation( | |
|   int arcviolation) const | |
| { | |
|     Cudd_SetArcviolation(p->manager, arcviolation); | |
| 
 | |
| } // Cudd::SetArcviolation | |
|  | |
| 
 | |
| int | |
| Cudd::ReadPopulationSize() const | |
| { | |
|     return Cudd_ReadPopulationSize(p->manager); | |
| 
 | |
| } // Cudd::ReadPopulationSize | |
|  | |
| 
 | |
| void | |
| Cudd::SetPopulationSize( | |
|   int populationSize) const | |
| { | |
|     Cudd_SetPopulationSize(p->manager, populationSize); | |
| 
 | |
| } // Cudd::SetPopulationSize | |
|  | |
| 
 | |
| int | |
| Cudd::ReadNumberXovers() const | |
| { | |
|     return Cudd_ReadNumberXovers(p->manager); | |
| 
 | |
| } // Cudd::ReadNumberXovers | |
|  | |
| 
 | |
| void | |
| Cudd::SetNumberXovers( | |
|   int numberXovers) const | |
| { | |
|     Cudd_SetNumberXovers(p->manager, numberXovers); | |
| 
 | |
| } // Cudd::SetNumberXovers | |
|  | |
| 
 | |
| unsigned int  | |
| Cudd::ReadOrderRandomization() const | |
| { | |
|     return Cudd_ReadOrderRandomization(p->manager); | |
| 
 | |
| } // Cudd::ReadOrderRandomization | |
|  | |
| 
 | |
| void  | |
| Cudd::SetOrderRandomization( | |
|   unsigned int factor) const | |
| { | |
|     Cudd_SetOrderRandomization(p->manager, factor); | |
| 
 | |
| } // Cudd::SetOrderRandomization | |
|  | |
| 
 | |
| unsigned long | |
| Cudd::ReadMemoryInUse() const | |
| { | |
|     return Cudd_ReadMemoryInUse(p->manager); | |
| 
 | |
| } // Cudd::ReadMemoryInUse | |
|  | |
| 
 | |
| long | |
| Cudd::ReadPeakNodeCount() const | |
| { | |
|     return Cudd_ReadPeakNodeCount(p->manager); | |
| 
 | |
| } // Cudd::ReadPeakNodeCount | |
|  | |
| 
 | |
| long | |
| Cudd::ReadNodeCount() const | |
| { | |
|     return Cudd_ReadNodeCount(p->manager); | |
| 
 | |
| } // Cudd::ReadNodeCount | |
|  | |
| 
 | |
| long | |
| Cudd::zddReadNodeCount() const | |
| { | |
|     return Cudd_zddReadNodeCount(p->manager); | |
| 
 | |
| } // Cudd::zddReadNodeCount | |
|  | |
| 
 | |
| void | |
| Cudd::AddHook( | |
|   DD_HFP f, | |
|   Cudd_HookType where) const | |
| { | |
|     int result = Cudd_AddHook(p->manager, f, where); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::AddHook | |
|  | |
| 
 | |
| void | |
| Cudd::RemoveHook( | |
|   DD_HFP f, | |
|   Cudd_HookType where) const | |
| { | |
|     int result = Cudd_RemoveHook(p->manager, f, where); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::RemoveHook | |
|  | |
| 
 | |
| bool | |
| Cudd::IsInHook( | |
|   DD_HFP f, | |
|   Cudd_HookType where) const | |
| { | |
|     return Cudd_IsInHook(p->manager, f, where); | |
| 
 | |
| } // Cudd::IsInHook | |
|  | |
| 
 | |
| void | |
| Cudd::EnableReorderingReporting() const | |
| { | |
|     int result = Cudd_EnableReorderingReporting(p->manager); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::EnableReorderingReporting | |
|  | |
| 
 | |
| void | |
| Cudd::DisableReorderingReporting() const | |
| { | |
|     int result = Cudd_DisableReorderingReporting(p->manager); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::DisableReorderingReporting | |
|  | |
| 
 | |
| bool | |
| Cudd::ReorderingReporting() const | |
| { | |
|     return Cudd_ReorderingReporting(p->manager); | |
| 
 | |
| } // Cudd::ReorderingReporting | |
|  | |
| 
 | |
| int | |
| Cudd::ReadErrorCode() const | |
| { | |
|     return Cudd_ReadErrorCode(p->manager); | |
| 
 | |
| } // Cudd::ReadErrorCode | |
|  | |
| 
 | |
| void | |
| Cudd::ClearErrorCode() const | |
| { | |
|     Cudd_ClearErrorCode(p->manager); | |
| 
 | |
| } // Cudd::ClearErrorCode | |
|  | |
| 
 | |
| DD_OOMFP Cudd::InstallOutOfMemoryHandler(DD_OOMFP newHandler) const | |
| { | |
|     return Cudd_InstallOutOfMemoryHandler(newHandler); | |
| 
 | |
| } // Cudd::InstallOutOfMemoryHandler | |
|  | |
| 
 | |
| FILE * | |
| Cudd::ReadStdout() const | |
| { | |
|     return Cudd_ReadStdout(p->manager); | |
| 
 | |
| } // Cudd::ReadStdout | |
|  | |
| 
 | |
| void | |
| Cudd::SetStdout(FILE *fp) const | |
| { | |
|     Cudd_SetStdout(p->manager, fp); | |
| 
 | |
| } // Cudd::SetStdout | |
|  | |
| 
 | |
| FILE * | |
| Cudd::ReadStderr() const | |
| { | |
|     return Cudd_ReadStderr(p->manager); | |
| 
 | |
| } // Cudd::ReadStderr | |
|  | |
| 
 | |
| void | |
| Cudd::SetStderr(FILE *fp) const | |
| { | |
|     Cudd_SetStderr(p->manager, fp); | |
| 
 | |
| } // Cudd::SetStderr | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadNextReordering() const | |
| { | |
|     return Cudd_ReadNextReordering(p->manager); | |
| 
 | |
| } // Cudd::ReadNextReordering | |
|  | |
| 
 | |
| void | |
| Cudd::SetNextReordering( | |
|   unsigned int next) const | |
| { | |
|     Cudd_SetNextReordering(p->manager, next); | |
| 
 | |
| } // Cudd::SetNextReordering | |
|  | |
| 
 | |
| double | |
| Cudd::ReadSwapSteps() const | |
| { | |
|     return Cudd_ReadSwapSteps(p->manager); | |
| 
 | |
| } // Cudd::ReadSwapSteps | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::ReadMaxLive() const | |
| { | |
|     return Cudd_ReadMaxLive(p->manager); | |
| 
 | |
| } // Cudd::ReadMaxLive | |
|  | |
| 
 | |
| void | |
| Cudd::SetMaxLive(unsigned int maxLive) const | |
| { | |
|     Cudd_SetMaxLive(p->manager, maxLive); | |
| 
 | |
| } // Cudd::SetMaxLive | |
|  | |
| 
 | |
| size_t | |
| Cudd::ReadMaxMemory() const | |
| { | |
|     return Cudd_ReadMaxMemory(p->manager); | |
| 
 | |
| } // Cudd::ReadMaxMemory | |
|  | |
| 
 | |
| size_t | |
| Cudd::SetMaxMemory(size_t maxMem) const | |
| { | |
|     return Cudd_SetMaxMemory(p->manager, maxMem); | |
| 
 | |
| } // Cudd::SetMaxMemory | |
|  | |
| 
 | |
| int | |
| Cudd::bddBindVar(int index) const | |
| { | |
|     return Cudd_bddBindVar(p->manager, index); | |
| 
 | |
| } // Cudd::bddBindVar | |
|  | |
| 
 | |
| int | |
| Cudd::bddUnbindVar(int index) const | |
| { | |
|     return Cudd_bddUnbindVar(p->manager, index); | |
| 
 | |
| } // Cudd::bddUnbindVar | |
|  | |
| 
 | |
| bool | |
| Cudd::bddVarIsBound(int index) const | |
| { | |
|     return Cudd_bddVarIsBound(p->manager, index); | |
| 
 | |
| } // Cudd::bddVarIsBound | |
|  | |
| 
 | |
| ADD | |
| ADD::ExistAbstract( | |
|   const ADD& cube) const | |
| { | |
|     DdManager *mgr = checkSameManager(cube); | |
|     DdNode *result = Cudd_addExistAbstract(mgr, node, cube.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::ExistAbstract | |
|  | |
| 
 | |
| ADD | |
| ADD::UnivAbstract( | |
|   const ADD& cube) const | |
| { | |
|     DdManager *mgr = checkSameManager(cube); | |
|     DdNode *result = Cudd_addUnivAbstract(mgr, node, cube.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::UnivAbstract | |
|  | |
| 
 | |
| ADD | |
| ADD::OrAbstract( | |
|   const ADD& cube) const | |
| { | |
|     DdManager *mgr = checkSameManager(cube); | |
|     DdNode *result = Cudd_addOrAbstract(mgr, node, cube.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::OrAbstract | |
|  | |
| ADD | |
| ADD::MinAbstract(const ADD& cube) const | |
| { | |
|     DdManager *mgr = checkSameManager(cube); | |
|     DdNode *result = Cudd_addMinAbstract(mgr, node, cube.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| } // ADD::MinAbstract | |
|      | |
| ADD | |
| ADD::MaxAbstract(const ADD& cube) const | |
| { | |
|     DdManager *mgr = checkSameManager(cube); | |
|     DdNode *result = Cudd_addMaxAbstract(mgr, node, cube.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| } // ADD::MaxAbstract | |
|  | |
| ADD | |
| ADD::Plus( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addPlus, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Plus | |
|  | |
| 
 | |
| ADD | |
| ADD::Times( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addTimes, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Times | |
|  | |
| 
 | |
| ADD | |
| ADD::Threshold( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addThreshold, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Threshold | |
|  | |
| 
 | |
| ADD | |
| ADD::SetNZ( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addSetNZ, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::SetNZ | |
|  | |
| 
 | |
| ADD | |
| ADD::Divide( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addDivide, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Divide | |
|  | |
| 
 | |
| ADD | |
| ADD::Minus( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addMinus, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Minus | |
|  | |
| 
 | |
| ADD | |
| ADD::Minimum( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addMinimum, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Minimum | |
|  | |
| 
 | |
| ADD | |
| ADD::Maximum( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addMaximum, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Maximum | |
|  | |
| 
 | |
| ADD | |
| ADD::OneZeroMaximum( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addOneZeroMaximum, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::OneZeroMaximum | |
|  | |
| 
 | |
| ADD | |
| ADD::Diff( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addDiff, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Diff | |
|  | |
| 
 | |
| ADD | |
| ADD::Agreement( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addAgreement, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Agreement | |
|  | |
| 
 | |
| ADD | |
| ADD::Or( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addOr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Or | |
|  | |
| 
 | |
| ADD | |
| ADD::Nand( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addNand, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Nand | |
|  | |
| 
 | |
| ADD | |
| ADD::Nor( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addNor, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Nor | |
|  | |
| 
 | |
| ADD | |
| ADD::Xor( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addXor, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Xor | |
|  | |
| 
 | |
| ADD | |
| ADD::Xnor( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addXnor, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Xnor | |
|  | |
| ADD | |
| ADD::Pow( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addPow, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::Pow | |
|      | |
| ADD | |
| ADD::Mod( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addMod, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::Mod | |
|      | |
| ADD | |
| ADD::LogXY( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addLogXY, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::LogXY | |
|      | |
| ADD | |
| ADD::Log() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addLog, node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::Log | |
|      | |
| ADD | |
| ADD::Floor() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addFloor, node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::Floor | |
|      | |
| ADD | |
| ADD::Ceil() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addCeil, node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::Ceil | |
|  | |
| ADD | |
| ADD::FindMax() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addFindMax(mgr, node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::FindMax | |
|  | |
| 
 | |
| ADD | |
| ADD::FindMin() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addFindMin(mgr, node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::FindMin | |
|  | |
| 
 | |
| ADD | |
| ADD::IthBit( | |
|   int bit) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addIthBit(mgr, node, bit); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::IthBit | |
|  | |
| 
 | |
| ADD | |
| ADD::ScalarInverse( | |
|   const ADD& epsilon) const | |
| { | |
|     DdManager *mgr = checkSameManager(epsilon); | |
|     DdNode *result = Cudd_addScalarInverse(mgr, node, epsilon.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::ScalarInverse | |
|  | |
| 
 | |
| ADD | |
| ADD::Ite( | |
|   const ADD& g, | |
|   const ADD& h) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     checkSameManager(h); | |
|     DdNode *result = Cudd_addIte(mgr, node, g.node, h.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Ite | |
|  | |
| 
 | |
| ADD | |
| ADD::IteConstant( | |
|   const ADD& g, | |
|   const ADD& h) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     checkSameManager(h); | |
|     DdNode *result = Cudd_addIteConstant(mgr, node, g.node, h.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::IteConstant | |
|  | |
| 
 | |
| ADD | |
| ADD::EvalConst( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addEvalConst(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::EvalConst | |
|  | |
| 
 | |
| bool | |
| ADD::Leq( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     return Cudd_addLeq(mgr, node, g.node); | |
| 
 | |
| } // ADD::Leq | |
|  | |
| 
 | |
| ADD | |
| ADD::Cmpl() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addCmpl(mgr, node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Cmpl | |
|  | |
| 
 | |
| ADD | |
| ADD::Negate() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addNegate(mgr, node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Negate | |
|  | |
| 
 | |
| ADD | |
| ADD::RoundOff( | |
|   int N) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addRoundOff(mgr, node, N); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::RoundOff | |
|  | |
| 
 | |
| ADD | |
| Cudd::Walsh( | |
|   std::vector<ADD> x, | |
|   std::vector<ADD> y) const | |
| { | |
|     size_t n = x.size(); | |
|     DdNode **X = new DdNode *[n]; | |
|     DdNode **Y = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	X[i] = x[i].getNode(); | |
| 	Y[i] = y[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_addWalsh(p->manager, X, Y, (int) n); | |
|     delete [] X; | |
|     delete [] Y; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Walsh | |
|  | |
| 
 | |
| ADD | |
| Cudd::addResidue( | |
|   int n, | |
|   int m, | |
|   int options, | |
|   int top) const | |
| { | |
|     DdNode *result = Cudd_addResidue(p->manager, n, m, options, top); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::addResidue | |
|  | |
| ADD | |
| ADD::Equals(const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addEquals, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::Equals | |
|      | |
| ADD | |
| ADD::NotEquals(const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addNotEquals, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::NotEquals | |
|  | |
| ADD | |
| ADD::LessThan(const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addLessThan, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::LessThan | |
|      | |
| ADD | |
| ADD::LessThanOrEqual(const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addLessThanEquals, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::LessThanOrEqual | |
|      | |
| ADD | |
| ADD::GreaterThan(const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addGreaterThan, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::GreaterThan | |
|      | |
| ADD | |
| ADD::GreaterThanOrEqual(const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addApply(mgr, Cudd_addGreaterThanEquals, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
|          | |
| } // ADD::GreaterThanOrEqual | |
|  | |
| BDD | |
| BDD::AndAbstract( | |
|   const BDD& g, | |
|   const BDD& cube, | |
|   unsigned int limit) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     checkSameManager(cube); | |
|     DdNode *result; | |
|     if (limit == 0) | |
| 	result = Cudd_bddAndAbstract(mgr, node, g.node, cube.node); | |
|     else | |
| 	result = Cudd_bddAndAbstractLimit(mgr, node, g.node, | |
| 					  cube.node, limit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::AndAbstract | |
|  | |
| 
 | |
| int | |
| Cudd::ApaNumberOfDigits( | |
|   int binaryDigits) const | |
| { | |
|     return Cudd_ApaNumberOfDigits(binaryDigits); | |
| 
 | |
| } // Cudd::ApaNumberOfDigits | |
|  | |
| 
 | |
| DdApaNumber | |
| Cudd::NewApaNumber( | |
|   int digits) const | |
| { | |
|     return Cudd_NewApaNumber(digits); | |
| 
 | |
| } // Cudd::NewApaNumber | |
|  | |
| 
 | |
| void | |
| Cudd::ApaCopy( | |
|   int digits, | |
|   DdApaNumber source, | |
|   DdApaNumber dest) const | |
| { | |
|     Cudd_ApaCopy(digits, source, dest); | |
| 
 | |
| } // Cudd::ApaCopy | |
|  | |
| 
 | |
| DdApaDigit | |
| Cudd::ApaAdd( | |
|   int digits, | |
|   DdApaNumber a, | |
|   DdApaNumber b, | |
|   DdApaNumber sum) const | |
| { | |
|     return Cudd_ApaAdd(digits, a, b, sum); | |
| 
 | |
| } // Cudd::ApaAdd | |
|  | |
| 
 | |
| DdApaDigit | |
| Cudd::ApaSubtract( | |
|   int digits, | |
|   DdApaNumber a, | |
|   DdApaNumber b, | |
|   DdApaNumber diff) const | |
| { | |
|     return Cudd_ApaSubtract(digits, a, b, diff); | |
| 
 | |
| } // Cudd::ApaSubtract | |
|  | |
| 
 | |
| DdApaDigit | |
| Cudd::ApaShortDivision( | |
|   int digits, | |
|   DdApaNumber dividend, | |
|   DdApaDigit divisor, | |
|   DdApaNumber quotient) const | |
| { | |
|     return Cudd_ApaShortDivision(digits, dividend, divisor, quotient); | |
| 
 | |
| } // Cudd::ApaShortDivision | |
|  | |
| 
 | |
| void | |
| Cudd::ApaShiftRight( | |
|   int digits, | |
|   DdApaDigit in, | |
|   DdApaNumber a, | |
|   DdApaNumber b) const | |
| { | |
|     Cudd_ApaShiftRight(digits, in, a, b); | |
| 
 | |
| } // Cudd::ApaShiftRight | |
|  | |
| 
 | |
| void | |
| Cudd::ApaSetToLiteral( | |
|   int digits, | |
|   DdApaNumber number, | |
|   DdApaDigit literal) const | |
| { | |
|     Cudd_ApaSetToLiteral(digits, number, literal); | |
| 
 | |
| } // Cudd::ApaSetToLiteral | |
|  | |
| 
 | |
| void | |
| Cudd::ApaPowerOfTwo( | |
|   int digits, | |
|   DdApaNumber number, | |
|   int power) const | |
| { | |
|     Cudd_ApaPowerOfTwo(digits, number, power); | |
| 
 | |
| } // Cudd::ApaPowerOfTwo | |
|  | |
| 
 | |
| void | |
| Cudd::ApaPrintHex( | |
|   int digits, | |
|   DdApaNumber number, | |
|   FILE * fp) const | |
| { | |
|     cout.flush(); | |
|     int result = Cudd_ApaPrintHex(fp, digits, number); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::ApaPrintHex | |
|  | |
| 
 | |
| void | |
| Cudd::ApaPrintDecimal( | |
|   int digits, | |
|   DdApaNumber number, | |
|   FILE * fp) const | |
| { | |
|     cout.flush(); | |
|     int result = Cudd_ApaPrintDecimal(fp, digits, number); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::ApaPrintDecimal | |
|  | |
| 
 | |
| std::string | |
| Cudd::ApaStringDecimal( | |
|   int digits, | |
|   DdApaNumber number) const | |
| { | |
|     char * result = Cudd_ApaStringDecimal(digits, number); | |
|     checkReturnValue(result); | |
|     std::string ret = std::string(result); | |
|     free(result); | |
|     return ret; | |
| 
 | |
| } // Cudd::ApaStringDecimal | |
|  | |
| 
 | |
| void | |
| Cudd::ApaPrintExponential( | |
|   int digits, | |
|   DdApaNumber number, | |
|   int precision, | |
|   FILE * fp) const | |
| { | |
|     cout.flush(); | |
|     int result = Cudd_ApaPrintExponential(fp, digits, number, precision); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::ApaPrintExponential | |
|  | |
| 
 | |
| DdApaNumber | |
| ABDD::ApaCountMinterm( | |
|   int nvars, | |
|   int * digits) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     return Cudd_ApaCountMinterm(mgr, node, nvars, digits); | |
| 
 | |
| } // ABDD::ApaCountMinterm | |
|  | |
| 
 | |
| void | |
| ABDD::ApaPrintMinterm( | |
|   int nvars, | |
|   FILE * fp) const | |
| { | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_ApaPrintMinterm(fp, mgr, node, nvars); | |
|     checkReturnValue(result); | |
| 
 | |
| } // ABDD::ApaPrintMinterm | |
|  | |
| 
 | |
| void | |
| ABDD::ApaPrintMintermExp( | |
|   int nvars, | |
|   int precision, | |
|   FILE * fp) const | |
| { | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_ApaPrintMintermExp(fp, mgr, node, nvars, precision); | |
|     checkReturnValue(result); | |
| 
 | |
| } // ABDD::ApaPrintMintermExp | |
|  | |
| 
 | |
| void | |
| ABDD::EpdPrintMinterm( | |
|   int nvars, | |
|   FILE * fp) const | |
| { | |
|     EpDouble count; | |
|     char str[24]; | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_EpdCountMinterm(mgr, node, nvars, &count); | |
|     checkReturnValue(result,0); | |
|     EpdGetString(&count, str); | |
|     fprintf(fp, "%s", str); | |
| 
 | |
| } // ABDD::EpdPrintMinterm | |
|  | |
| 
 | |
| long double | |
| ABDD::LdblCountMinterm( | |
|   int nvars) const | |
| { | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     long double result = Cudd_LdblCountMinterm(mgr, node, nvars); | |
|     checkReturnValue(result != (long double) CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ABDD::LdblCountMinterm | |
|  | |
| 
 | |
| BDD | |
| BDD::UnderApprox( | |
|   int numVars, | |
|   int threshold, | |
|   bool safe, | |
|   double quality) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_UnderApprox(mgr, node, numVars, threshold, safe, quality); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::UnderApprox | |
|  | |
| 
 | |
| BDD | |
| BDD::OverApprox( | |
|   int numVars, | |
|   int threshold, | |
|   bool safe, | |
|   double quality) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_OverApprox(mgr, node, numVars, threshold, safe, quality); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::OverApprox | |
|  | |
| 
 | |
| BDD | |
| BDD::RemapUnderApprox( | |
|   int numVars, | |
|   int threshold, | |
|   double quality) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_RemapUnderApprox(mgr, node, numVars, threshold, quality); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::RemapUnderApprox | |
|  | |
| 
 | |
| BDD | |
| BDD::RemapOverApprox( | |
|   int numVars, | |
|   int threshold, | |
|   double quality) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_RemapOverApprox(mgr, node, numVars, threshold, quality); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::RemapOverApprox | |
|  | |
| 
 | |
| BDD | |
| BDD::BiasedUnderApprox( | |
|   const BDD& bias, | |
|   int numVars, | |
|   int threshold, | |
|   double quality1, | |
|   double quality0) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_BiasedUnderApprox(mgr, node, bias.node, numVars,  | |
|                                             threshold, quality1, quality0); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::BiasedUnderApprox | |
|  | |
| 
 | |
| BDD | |
| BDD::BiasedOverApprox( | |
|   const BDD& bias, | |
|   int numVars, | |
|   int threshold, | |
|   double quality1, | |
|   double quality0) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_BiasedOverApprox(mgr, node, bias.node, numVars,  | |
|                                            threshold, quality1, quality0); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::BiasedOverApprox | |
|  | |
| 
 | |
| BDD | |
| BDD::ExistAbstract( | |
|   const BDD& cube, | |
|   unsigned int limit) const | |
| { | |
|     DdManager *mgr = checkSameManager(cube); | |
|     DdNode *result; | |
|     if (limit == 0) | |
|         result = Cudd_bddExistAbstract(mgr, node, cube.node); | |
|     else | |
|         result = Cudd_bddExistAbstractLimit(mgr, node, cube.node, limit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::ExistAbstract | |
|  | |
| 
 | |
| BDD | |
| BDD::XorExistAbstract( | |
|   const BDD& g, | |
|   const BDD& cube) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     checkSameManager(cube); | |
|     DdNode *result = Cudd_bddXorExistAbstract(mgr, node, g.node, cube.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::XorExistAbstract | |
|  | |
| 
 | |
| BDD | |
| BDD::UnivAbstract( | |
|   const BDD& cube) const | |
| { | |
|     DdManager *mgr = checkSameManager(cube); | |
|     DdNode *result = Cudd_bddUnivAbstract(mgr, node, cube.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::UnivAbstract | |
|  | |
| 
 | |
| BDD | |
| BDD::BooleanDiff( | |
|   int x) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_bddBooleanDiff(mgr, node, x); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::BooleanDiff | |
|  | |
| 
 | |
| bool | |
| BDD::VarIsDependent( | |
|   const BDD& var) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     return Cudd_bddVarIsDependent(mgr, node, var.node); | |
| 
 | |
| } // BDD::VarIsDependent | |
|  | |
| 
 | |
| double | |
| BDD::Correlation( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     return Cudd_bddCorrelation(mgr, node, g.node); | |
| 
 | |
| } // BDD::Correlation | |
|  | |
| 
 | |
| double | |
| BDD::CorrelationWeights( | |
|   const BDD& g, | |
|   double * prob) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     return Cudd_bddCorrelationWeights(mgr, node, g.node, prob); | |
| 
 | |
| } // BDD::CorrelationWeights | |
|  | |
| 
 | |
| BDD | |
| BDD::Ite( | |
|   const BDD& g, | |
|   const BDD& h, | |
|   unsigned int limit) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     checkSameManager(h); | |
|     DdNode *result; | |
|     if (limit == 0) | |
| 	result = Cudd_bddIte(mgr, node, g.node, h.node); | |
|     else | |
| 	result = Cudd_bddIteLimit(mgr, node, g.node, h.node, limit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Ite | |
|  | |
| 
 | |
| BDD | |
| BDD::IteConstant( | |
|   const BDD& g, | |
|   const BDD& h) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     checkSameManager(h); | |
|     DdNode *result = Cudd_bddIteConstant(mgr, node, g.node, h.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::IteConstant | |
|  | |
| 
 | |
| BDD | |
| BDD::Intersect( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_bddIntersect(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Intersect | |
|  | |
| 
 | |
| BDD | |
| BDD::And( | |
|   const BDD& g, | |
|   unsigned int limit) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result; | |
|     if (limit == 0) | |
| 	result = Cudd_bddAnd(mgr, node, g.node); | |
|     else | |
| 	result = Cudd_bddAndLimit(mgr, node, g.node, limit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::And | |
|  | |
| 
 | |
| BDD | |
| BDD::Or( | |
|   const BDD& g, | |
|   unsigned int limit) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result; | |
|     if (limit == 0) | |
| 	result = Cudd_bddOr(mgr, node, g.node); | |
|     else | |
| 	result = Cudd_bddOrLimit(mgr, node, g.node, limit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Or | |
|  | |
| 
 | |
| BDD | |
| BDD::Nand( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_bddNand(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Nand | |
|  | |
| 
 | |
| BDD | |
| BDD::Nor( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_bddNor(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Nor | |
|  | |
| 
 | |
| BDD | |
| BDD::Xor( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_bddXor(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Xor | |
|  | |
| 
 | |
| BDD | |
| BDD::Xnor( | |
|   const BDD& g, | |
|   unsigned int limit) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result; | |
|     if (limit == 0) | |
| 	result = Cudd_bddXnor(mgr, node, g.node); | |
|     else | |
| 	result = Cudd_bddXnorLimit(mgr, node, g.node, limit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Xnor | |
|  | |
| 
 | |
| bool | |
| BDD::Leq( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     return Cudd_bddLeq(mgr, node, g.node); | |
| 
 | |
| } // BDD::Leq | |
|  | |
| 
 | |
| BDD | |
| ADD::BddThreshold( | |
|   CUDD_VALUE_TYPE value) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addBddThreshold(mgr, node, value); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ADD::BddThreshold | |
|  | |
| 
 | |
| BDD | |
| ADD::BddStrictThreshold( | |
|   CUDD_VALUE_TYPE value) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addBddStrictThreshold(mgr, node, value); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ADD::BddStrictThreshold | |
|  | |
| 
 | |
| BDD | |
| ADD::BddInterval( | |
|   CUDD_VALUE_TYPE lower, | |
|   CUDD_VALUE_TYPE upper) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addBddInterval(mgr, node, lower, upper); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ADD::BddInterval | |
|  | |
| 
 | |
| BDD | |
| ADD::BddIthBit( | |
|   int bit) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addBddIthBit(mgr, node, bit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ADD::BddIthBit | |
|  | |
| 
 | |
| ADD | |
| BDD::Add() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_BddToAdd(mgr, node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // BDD::Add | |
|  | |
| 
 | |
| BDD | |
| ADD::BddPattern() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addBddPattern(mgr, node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ADD::BddPattern | |
|  | |
| 
 | |
| BDD | |
| BDD::Transfer( | |
|   Cudd& destination) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_bddTransfer(mgr, destination.p->manager, node); | |
|     checkReturnValue(result); | |
|     return BDD(destination.p, result); | |
| 
 | |
| } // BDD::Transfer | |
|  | |
| 
 | |
| void | |
| Cudd::DebugCheck() const | |
| { | |
|     int result = Cudd_DebugCheck(p->manager); | |
|     checkReturnValue(result == 0); | |
| 
 | |
| } // Cudd::DebugCheck | |
|  | |
| 
 | |
| void | |
| Cudd::CheckKeys() const | |
| { | |
|     int result = Cudd_CheckKeys(p->manager); | |
|     checkReturnValue(result == 0); | |
| 
 | |
| } // Cudd::CheckKeys | |
|  | |
| 
 | |
| BDD | |
| BDD::ClippingAnd( | |
|   const BDD& g, | |
|   int maxDepth, | |
|   int direction) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_bddClippingAnd(mgr, node, g.node, maxDepth, | |
| 					 direction); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::ClippingAnd | |
|  | |
| 
 | |
| BDD | |
| BDD::ClippingAndAbstract( | |
|   const BDD& g, | |
|   const BDD& cube, | |
|   int maxDepth, | |
|   int direction) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     checkSameManager(cube); | |
|     DdNode *result = Cudd_bddClippingAndAbstract(mgr, node, g.node, cube.node, | |
| 						 maxDepth, direction); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::ClippingAndAbstract | |
|  | |
| 
 | |
| ADD | |
| ADD::Cofactor( | |
|   const ADD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_Cofactor(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Cofactor | |
|  | |
| 
 | |
| BDD | |
| BDD::Cofactor( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_Cofactor(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Cofactor | |
|  | |
| 
 | |
| bool | |
| BDD::VarAreSymmetric(int index1, int index2) const | |
| { | |
|     return Cudd_VarsAreSymmetric(p->manager, node, index1, index2); | |
| 
 | |
| } // BDD::VarAreSymmetric | |
|  | |
| BDD | |
| BDD::Compose( | |
|   const BDD& g, | |
|   int v) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_bddCompose(mgr, node, g.node, v); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Compose | |
|  | |
| 
 | |
| ADD | |
| ADD::Compose( | |
|   const ADD& g, | |
|   int v) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_addCompose(mgr, node, g.node, v); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Compose | |
|  | |
| 
 | |
| ADD | |
| ADD::Permute( | |
|   int * permut) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_addPermute(mgr, node, permut); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Permute | |
|  | |
| 
 | |
| ADD | |
| ADD::SwapVariables( | |
|   std::vector<ADD> x, | |
|   std::vector<ADD> y) const | |
| { | |
|     size_t n = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[n]; | |
|     DdNode **Y = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	X[i] = x[i].node; | |
| 	Y[i] = y[i].node; | |
|     } | |
|     DdNode *result = Cudd_addSwapVariables(mgr, node, X, Y, (int) n); | |
|     delete [] X; | |
|     delete [] Y; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::SwapVariables | |
|  | |
| 
 | |
| BDD | |
| BDD::Permute( | |
|   int * permut) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_bddPermute(mgr, node, permut); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Permute | |
|  | |
| 
 | |
| BDD | |
| BDD::SwapVariables( | |
|   std::vector<BDD> x, | |
|   std::vector<BDD> y) const | |
| { | |
|     size_t n = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[n]; | |
|     DdNode **Y = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
|         X[i] = x[i].node; | |
|         Y[i] = y[i].node; | |
|     } | |
|     DdNode *result = Cudd_bddSwapVariables(mgr, node, X, Y, (int) n); | |
|     delete [] X; | |
|     delete [] Y; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SwapVariables | |
|  | |
| 
 | |
| BDD | |
| BDD::AdjPermuteX( | |
|   std::vector<BDD> x) const | |
| { | |
|     size_t n = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	X[i] = x[i].node; | |
|     } | |
|     DdNode *result = Cudd_bddAdjPermuteX(mgr, node, X, (int) n); | |
|     delete [] X; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::AdjPermuteX | |
|  | |
| 
 | |
| ADD | |
| ADD::VectorCompose( | |
|   std::vector<ADD> vect) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = (size_t) Cudd_ReadSize(mgr); | |
|     DdNode **X = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	X[i] = vect[i].node; | |
|     } | |
|     DdNode *result = Cudd_addVectorCompose(mgr, node, X); | |
|     delete [] X; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::VectorCompose | |
|  | |
| 
 | |
| ADD | |
| ADD::NonSimCompose( | |
|   std::vector<ADD> vect) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = (size_t) Cudd_ReadSize(mgr); | |
|     DdNode **X = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	X[i] = vect[i].node; | |
|     } | |
|     DdNode *result = Cudd_addNonSimCompose(mgr, node, X); | |
|     delete [] X; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::NonSimCompose | |
|  | |
| 
 | |
| BDD | |
| BDD::VectorCompose( | |
|   std::vector<BDD> vect) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = (size_t) Cudd_ReadSize(mgr); | |
|     DdNode **X = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	X[i] = vect[i].node; | |
|     } | |
|     DdNode *result = Cudd_bddVectorCompose(mgr, node, X); | |
|     delete [] X; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::VectorCompose | |
|  | |
| 
 | |
| void | |
| BDD::ApproxConjDecomp( | |
|   BDD* g, | |
|   BDD* h) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **pieces; | |
|     int result = Cudd_bddApproxConjDecomp(mgr, node, &pieces); | |
|     checkReturnValue(result == 2); | |
|     *g = BDD(p, pieces[0]); | |
|     *h = BDD(p, pieces[1]); | |
|     Cudd_RecursiveDeref(mgr,pieces[0]); | |
|     Cudd_RecursiveDeref(mgr,pieces[1]); | |
|     free(pieces); | |
| 
 | |
| } // BDD::ApproxConjDecomp | |
|  | |
| 
 | |
| void | |
| BDD::ApproxDisjDecomp( | |
|   BDD* g, | |
|   BDD* h) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **pieces; | |
|     int result = Cudd_bddApproxDisjDecomp(mgr, node, &pieces); | |
|     checkReturnValue(result == 2); | |
|     *g = BDD(p, pieces[0]); | |
|     *h = BDD(p, pieces[1]); | |
|     Cudd_RecursiveDeref(mgr,pieces[0]); | |
|     Cudd_RecursiveDeref(mgr,pieces[1]); | |
|     free(pieces); | |
| 
 | |
| } // BDD::ApproxDisjDecomp | |
|  | |
| 
 | |
| void | |
| BDD::IterConjDecomp( | |
|   BDD* g, | |
|   BDD* h) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **pieces; | |
|     int result = Cudd_bddIterConjDecomp(mgr, node, &pieces); | |
|     checkReturnValue(result == 2); | |
|     *g = BDD(p, pieces[0]); | |
|     *h = BDD(p, pieces[1]); | |
|     Cudd_RecursiveDeref(mgr,pieces[0]); | |
|     Cudd_RecursiveDeref(mgr,pieces[1]); | |
|     free(pieces); | |
| 
 | |
| } // BDD::IterConjDecomp | |
|  | |
| 
 | |
| void | |
| BDD::IterDisjDecomp( | |
|   BDD* g, | |
|   BDD* h) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **pieces; | |
|     int result = Cudd_bddIterDisjDecomp(mgr, node, &pieces); | |
|     checkReturnValue(result == 2); | |
|     *g = BDD(p, pieces[0]); | |
|     *h = BDD(p, pieces[1]); | |
|     Cudd_RecursiveDeref(mgr,pieces[0]); | |
|     Cudd_RecursiveDeref(mgr,pieces[1]); | |
|     free(pieces); | |
| 
 | |
| } // BDD::IterDisjDecomp | |
|  | |
| 
 | |
| void | |
| BDD::GenConjDecomp( | |
|   BDD* g, | |
|   BDD* h) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **pieces; | |
|     int result = Cudd_bddGenConjDecomp(mgr, node, &pieces); | |
|     checkReturnValue(result == 2); | |
|     *g = BDD(p, pieces[0]); | |
|     *h = BDD(p, pieces[1]); | |
|     Cudd_RecursiveDeref(mgr,pieces[0]); | |
|     Cudd_RecursiveDeref(mgr,pieces[1]); | |
|     free(pieces); | |
| 
 | |
| } // BDD::GenConjDecomp | |
|  | |
| 
 | |
| void | |
| BDD::GenDisjDecomp( | |
|   BDD* g, | |
|   BDD* h) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **pieces; | |
|     int result = Cudd_bddGenDisjDecomp(mgr, node, &pieces); | |
|     checkReturnValue(result == 2); | |
|     *g = BDD(p, pieces[0]); | |
|     *h = BDD(p, pieces[1]); | |
|     Cudd_RecursiveDeref(mgr,pieces[0]); | |
|     Cudd_RecursiveDeref(mgr,pieces[1]); | |
|     free(pieces); | |
| 
 | |
| } // BDD::GenDisjDecomp | |
|  | |
| 
 | |
| void | |
| BDD::VarConjDecomp( | |
|   BDD* g, | |
|   BDD* h) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **pieces; | |
|     int result = Cudd_bddVarConjDecomp(mgr, node, &pieces); | |
|     checkReturnValue(result == 2); | |
|     *g = BDD(p, pieces[0]); | |
|     *h = BDD(p, pieces[1]); | |
|     Cudd_RecursiveDeref(mgr,pieces[0]); | |
|     Cudd_RecursiveDeref(mgr,pieces[1]); | |
|     free(pieces); | |
| 
 | |
| } // BDD::VarConjDecomp | |
|  | |
| 
 | |
| void | |
| BDD::VarDisjDecomp( | |
|   BDD* g, | |
|   BDD* h) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **pieces; | |
|     int result = Cudd_bddVarDisjDecomp(mgr, node, &pieces); | |
|     checkReturnValue(result == 2); | |
|     *g = BDD(p, pieces[0]); | |
|     *h = BDD(p, pieces[1]); | |
|     Cudd_RecursiveDeref(mgr,pieces[0]); | |
|     Cudd_RecursiveDeref(mgr,pieces[1]); | |
|     free(pieces); | |
| 
 | |
| } // BDD::VarDisjDecomp | |
|  | |
| 
 | |
| bool | |
| ABDD::IsCube() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     return Cudd_CheckCube(mgr, node); | |
| 
 | |
| } // ABDD::IsCube | |
|  | |
| 
 | |
| BDD | |
| ABDD::FindEssential() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_FindEssential(mgr, node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ABDD::FindEssential | |
|  | |
| 
 | |
| bool | |
| BDD::IsVarEssential( | |
|   int id, | |
|   int phase) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     return Cudd_bddIsVarEssential(mgr, node, id, phase); | |
| 
 | |
| } // BDD::IsVarEssential | |
|  | |
| 
 | |
| void | |
| ABDD::PrintTwoLiteralClauses( | |
|   char **names, | |
|   FILE *fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_PrintTwoLiteralClauses(mgr, node, names, fp); | |
|     checkReturnValue(result); | |
| 
 | |
| } // ABDD::PrintTwoLiteralClauses | |
|  | |
| 
 | |
| void | |
| Cudd::DumpBlif( | |
|   const std::vector<BDD>& nodes, | |
|   char const * const * inames, | |
|   char const * const * onames, | |
|   char * mname, | |
|   FILE * fp, | |
|   int mv) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = nodes.size(); | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i ++) { | |
| 	F[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_DumpBlif(mgr, (int) n, F, inames, onames, mname, fp, mv); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::DumpBlif | |
|  | |
| 
 | |
| void | |
| Cudd::DumpDot( | |
|   const std::vector<BDD>& nodes, | |
|   char const * const * inames, | |
|   char const * const * onames, | |
|   FILE * fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = nodes.size(); | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i ++) { | |
| 	F[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_DumpDot(mgr, (int) n, F, inames, onames, fp); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::DumpDot | |
|  | |
| 
 | |
| void | |
| Cudd::DumpDot( | |
|   const std::vector<ADD>& nodes, | |
|   char const * const * inames, | |
|   char const * const * onames, | |
|   FILE * fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = nodes.size(); | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i ++) { | |
| 	F[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_DumpDot(mgr, (int) n, F, inames, onames, fp); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::DumpDot | |
|  | |
| 
 | |
| void | |
| Cudd::DumpDaVinci( | |
|   const std::vector<BDD>& nodes, | |
|   char const * const * inames, | |
|   char const * const * onames, | |
|   FILE * fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = nodes.size(); | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i ++) { | |
| 	F[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_DumpDaVinci(mgr, (int) n, F, inames, onames, fp); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::DumpDaVinci | |
|  | |
| 
 | |
| void | |
| Cudd::DumpDaVinci( | |
|   const std::vector<ADD>& nodes, | |
|   char const * const * inames, | |
|   char const * const * onames, | |
|   FILE * fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = nodes.size(); | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i ++) { | |
| 	F[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_DumpDaVinci(mgr, (int) n, F, inames, onames, fp); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::DumpDaVinci | |
|  | |
| 
 | |
| void | |
| Cudd::DumpDDcal( | |
|   const std::vector<BDD>& nodes, | |
|   char const * const * inames, | |
|   char const * const * onames, | |
|   FILE * fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = nodes.size(); | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i ++) { | |
| 	F[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_DumpDDcal(mgr, (int) n, F, inames, onames, fp); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::DumpDDcal | |
|  | |
| 
 | |
| void | |
| Cudd::DumpFactoredForm( | |
|   const std::vector<BDD>& nodes, | |
|   char const * const * inames, | |
|   char const * const * onames, | |
|   FILE * fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = nodes.size(); | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i ++) { | |
| 	F[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_DumpFactoredForm(mgr, (int) n, F, inames, onames, fp); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::DumpFactoredForm | |
|  | |
| 
 | |
| void | |
| BDD::PrintFactoredForm( | |
|   char const * const * inames, | |
|   FILE * fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *f = node; | |
|     int result = Cudd_DumpFactoredForm(mgr, 0, &f, inames, 0, fp); | |
|     checkReturnValue(result); | |
| 
 | |
| } // BDD::PrintFactoredForm | |
|  | |
| 
 | |
| string | |
| BDD::FactoredFormString(char const * const * inames) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *f = node; | |
|     char *cstr = Cudd_FactoredFormString(mgr, f, inames); | |
|     checkReturnValue(cstr); | |
|     string str(cstr); | |
|     free(cstr); | |
|     return str; | |
| 
 | |
| } // BDD::FactoredFormString | |
|  | |
| 
 | |
| BDD | |
| BDD::Constrain( | |
|   const BDD& c) const | |
| { | |
|     DdManager *mgr = checkSameManager(c); | |
|     DdNode *result = Cudd_bddConstrain(mgr, node, c.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Constrain | |
|  | |
| 
 | |
| BDD | |
| BDD::Restrict( | |
|   const BDD& c) const | |
| { | |
|     DdManager *mgr = checkSameManager(c); | |
|     DdNode *result = Cudd_bddRestrict(mgr, node, c.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Restrict | |
|  | |
| 
 | |
| BDD | |
| BDD::NPAnd( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_bddNPAnd(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::NPAnd | |
|  | |
| 
 | |
| ADD | |
| ADD::Constrain( | |
|   const ADD& c) const | |
| { | |
|     DdManager *mgr = checkSameManager(c); | |
|     DdNode *result = Cudd_addConstrain(mgr, node, c.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Constrain | |
|  | |
| 
 | |
| std::vector<BDD> | |
| BDD::ConstrainDecomp() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **result = Cudd_bddConstrainDecomp(mgr, node); | |
|     checkReturnValue(result); | |
|     int size = Cudd_ReadSize(mgr); | |
|     vector<BDD> vect; | |
|     for (int i = 0; i < size; i++) { | |
| 	Cudd_Deref(result[i]); | |
| 	vect.push_back(BDD(p, result[i])); | |
|     } | |
|     free(result); | |
|     return vect; | |
| 
 | |
| } // BDD::ConstrainDecomp | |
|  | |
| 
 | |
| ADD | |
| ADD::Restrict( | |
|   const ADD& c) const | |
| { | |
|     DdManager *mgr = checkSameManager(c); | |
|     DdNode *result = Cudd_addRestrict(mgr, node, c.node); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Restrict | |
|  | |
| 
 | |
| std::vector<BDD> | |
| BDD::CharToVect() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **result = Cudd_bddCharToVect(mgr, node); | |
|     checkReturnValue(result); | |
|     int size = Cudd_ReadSize(mgr); | |
|     vector<BDD> vect; | |
|     for (int i = 0; i < size; i++) { | |
| 	Cudd_Deref(result[i]); | |
| 	vect.push_back(BDD(p, result[i])); | |
|     } | |
|     free(result); | |
|     return vect; | |
| 
 | |
| } // BDD::CharToVect | |
|  | |
| 
 | |
| BDD | |
| BDD::LICompaction( | |
|   const BDD& c) const | |
| { | |
|     DdManager *mgr = checkSameManager(c); | |
|     DdNode *result = Cudd_bddLICompaction(mgr, node, c.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::LICompaction | |
|  | |
| 
 | |
| BDD | |
| BDD::Squeeze( | |
|   const BDD& u) const | |
| { | |
|     DdManager *mgr = checkSameManager(u); | |
|     DdNode *result = Cudd_bddSqueeze(mgr, node, u.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Squeeze | |
|  | |
| 
 | |
| BDD | |
| BDD::Interpolate( | |
|   const BDD& u) const | |
| { | |
|     DdManager *mgr = checkSameManager(u); | |
|     DdNode *result = Cudd_bddInterpolate(mgr, node, u.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Interpolate | |
|  | |
| 
 | |
| BDD | |
| BDD::Minimize( | |
|   const BDD& c) const | |
| { | |
|     DdManager *mgr = checkSameManager(c); | |
|     DdNode *result = Cudd_bddMinimize(mgr, node, c.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Minimize | |
|  | |
| 
 | |
| BDD | |
| BDD::SubsetCompress( | |
|   int nvars, | |
|   int threshold) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_SubsetCompress(mgr, node, nvars, threshold); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SubsetCompress | |
|  | |
| 
 | |
| BDD | |
| BDD::SupersetCompress( | |
|   int nvars, | |
|   int threshold) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_SupersetCompress(mgr, node, nvars, threshold); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SupersetCompress | |
|  | |
| 
 | |
| MtrNode * | |
| Cudd::MakeTreeNode( | |
|   unsigned int low, | |
|   unsigned int size, | |
|   unsigned int type) const | |
| { | |
|     return Cudd_MakeTreeNode(p->manager, low, size, type); | |
| 
 | |
| } // Cudd::MakeTreeNode | |
|  | |
| 
 | |
| ADD | |
| Cudd::Harwell( | |
|   FILE * fp, | |
|   std::vector<ADD>& x, | |
|   std::vector<ADD>& y, | |
|   std::vector<ADD>& xn, | |
|   std::vector<ADD>& yn_, | |
|   int * m, | |
|   int * n, | |
|   int bx, | |
|   int sx, | |
|   int by, | |
|   int sy, | |
|   int pr) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *E; | |
|     DdNode **xa = 0, **ya = 0, **xna = 0, **yna = 0; | |
|     int nx = x.size(), ny = y.size(); | |
|     if (nx > 0) { | |
|         xa = (DdNode **) malloc(nx * sizeof(DdNode *)); | |
|         if (!xa) { | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         xna = (DdNode **) malloc(nx * sizeof(DdNode *)); | |
|         if (!xna) { | |
|             free(xa); | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         for (int i = 0; i < nx; ++i) { | |
|             xa[i] = x.at(i).node; | |
|             xna[i] = xn.at(i).node; | |
|         } | |
|     } | |
|     if (ny > 0) { | |
|         ya = (DdNode **) malloc(ny * sizeof(DdNode *)); | |
|         if (!ya) { | |
|             free(xa); | |
|             free(xna); | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         yna = (DdNode **) malloc(ny * sizeof(DdNode *)); | |
|         if (!yna) { | |
|             free(xa); | |
|             free(xna); | |
|             free(ya); | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         for (int j = 0; j < ny; ++j) { | |
|             ya[j] = y.at(j).node; | |
|             yna[j] = yn_.at(j).node; | |
|         } | |
|     } | |
|     int result = Cudd_addHarwell(fp, mgr, &E, &xa, &ya, &xna, &yna, &nx, &ny, | |
|                                  m, n, bx, sx, by, sy, pr); | |
|     checkReturnValue(result); | |
|     for (int i = x.size(); i < nx; ++i) { | |
|         x.push_back(ADD(p, xa[i])); | |
|         xn.push_back(ADD(p, xna[i])); | |
|     } | |
|     free(xa); | |
|     free(xna); | |
|     for (int j = y.size(); j < ny; ++j) { | |
|         y.push_back(ADD(p, ya[j])); | |
|         yn_.push_back(ADD(p, yna[j])); | |
|     } | |
|     free(ya); | |
|     free(yna); | |
|     Cudd_Deref(E); | |
|     return ADD(p, E); | |
| 
 | |
| } // Cudd::Harwell | |
|  | |
| 
 | |
| void | |
| Cudd::PrintLinear(void) const | |
| { | |
|     cout.flush(); | |
|     int result = Cudd_PrintLinear(p->manager); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::PrintLinear | |
|  | |
| 
 | |
| int | |
| Cudd::ReadLinear( | |
|   int x, | |
|   int y) const | |
| { | |
|     return Cudd_ReadLinear(p->manager, x, y); | |
| 
 | |
| } // Cudd::ReadLinear | |
|  | |
| 
 | |
| BDD | |
| BDD::LiteralSetIntersection( | |
|   const BDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_bddLiteralSetIntersection(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::LiteralSetIntersection | |
|  | |
| 
 | |
| ADD | |
| ADD::MatrixMultiply( | |
|   const ADD& B, | |
|   std::vector<ADD> z) const | |
| { | |
|     size_t nz = z.size(); | |
|     DdManager *mgr = checkSameManager(B); | |
|     DdNode **Z = new DdNode *[nz]; | |
|     for (size_t i = 0; i < nz; i++) { | |
| 	Z[i] = z[i].node; | |
|     } | |
|     DdNode *result = Cudd_addMatrixMultiply(mgr, node, B.node, Z, (int) nz); | |
|     delete [] Z; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::MatrixMultiply | |
|  | |
| 
 | |
| ADD | |
| ADD::TimesPlus( | |
|   const ADD& B, | |
|   std::vector<ADD> z) const | |
| { | |
|     size_t nz = z.size(); | |
|     DdManager *mgr = checkSameManager(B); | |
|     DdNode **Z = new DdNode *[nz]; | |
|     for (size_t i = 0; i < nz; i++) { | |
| 	Z[i] = z[i].node; | |
|     } | |
|     DdNode *result = Cudd_addTimesPlus(mgr, node, B.node, Z, (int) nz); | |
|     delete [] Z; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::TimesPlus | |
|  | |
| 
 | |
| ADD | |
| ADD::Triangle( | |
|   const ADD& g, | |
|   std::vector<ADD> z) const | |
| { | |
|     size_t nz = z.size(); | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode **Z = new DdNode *[nz]; | |
|     for (size_t i = 0; i < nz; i++) { | |
| 	Z[i] = z[i].node; | |
|     } | |
|     DdNode *result = Cudd_addTriangle(mgr, node, g.node, Z, (int) nz); | |
|     delete [] Z; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Triangle | |
|  | |
| 
 | |
| BDD | |
| BDD::PrioritySelect( | |
|   std::vector<BDD> x, | |
|   std::vector<BDD> y, | |
|   std::vector<BDD> z, | |
|   const BDD& Pi, | |
|   DD_PRFP Pifunc) const | |
| { | |
|     size_t n = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[n]; | |
|     DdNode **Y = new DdNode *[n]; | |
|     DdNode **Z = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	X[i] = x[i].node; | |
| 	Y[i] = y[i].node; | |
| 	Z[i] = z[i].node; | |
|     } | |
|     DdNode *result = Cudd_PrioritySelect(mgr, node, X, Y, Z, Pi.node, | |
|                                          (int) n, Pifunc); | |
|     delete [] X; | |
|     delete [] Y; | |
|     delete [] Z; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::PrioritySelect | |
|  | |
| 
 | |
| BDD | |
| Cudd::Xgty( | |
|   std::vector<BDD> z, | |
|   std::vector<BDD> x, | |
|   std::vector<BDD> y) const | |
| { | |
|     size_t N = z.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[N]; | |
|     DdNode **Y = new DdNode *[N]; | |
|     DdNode **Z = new DdNode *[N]; | |
|     for (size_t i = 0; i < N; i++) { | |
| 	X[i] = x[i].getNode(); | |
| 	Y[i] = y[i].getNode(); | |
| 	Z[i] = z[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_Xgty(mgr, (int) N, Z, X, Y); | |
|     delete [] X; | |
|     delete [] Y; | |
|     delete [] Z; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::Xgty | |
|  | |
| 
 | |
| BDD | |
| Cudd::Xeqy( | |
|   std::vector<BDD> x, | |
|   std::vector<BDD> y) const | |
| { | |
|     size_t N = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[N]; | |
|     DdNode **Y = new DdNode *[N]; | |
|     for (size_t i = 0; i < N; i++) { | |
| 	X[i] = x[i].getNode(); | |
| 	Y[i] = y[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_Xeqy(mgr, (int) N, X, Y); | |
|     delete [] X; | |
|     delete [] Y; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Xeqy | |
|  | |
| 
 | |
| ADD | |
| Cudd::Xeqy( | |
|   std::vector<ADD> x, | |
|   std::vector<ADD> y) const | |
| { | |
|     size_t N = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[N]; | |
|     DdNode **Y = new DdNode *[N]; | |
|     for (size_t i = 0; i < N; i++) { | |
| 	X[i] = x[i].getNode(); | |
| 	Y[i] = y[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_addXeqy(mgr, (int) N, X, X); | |
|     delete [] X; | |
|     delete [] Y; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Xeqy | |
|  | |
| 
 | |
| BDD | |
| Cudd::Dxygtdxz( | |
|   std::vector<BDD> x, | |
|   std::vector<BDD> y, | |
|   std::vector<BDD> z) const | |
| { | |
|     size_t N = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[N]; | |
|     DdNode **Y = new DdNode *[N]; | |
|     DdNode **Z = new DdNode *[N]; | |
|     for (size_t i = 0; i < N; i++) { | |
| 	X[i] = x[i].getNode(); | |
| 	Y[i] = y[i].getNode(); | |
| 	Z[i] = z[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_Dxygtdxz(mgr, (int) N, X, Y, Z); | |
|     delete [] X; | |
|     delete [] Y; | |
|     delete [] Z; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::Dxygtdxz | |
|  | |
| 
 | |
| BDD | |
| Cudd::Dxygtdyz( | |
|   std::vector<BDD> x, | |
|   std::vector<BDD> y, | |
|   std::vector<BDD> z) const | |
| { | |
|     size_t N = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[N]; | |
|     DdNode **Y = new DdNode *[N]; | |
|     DdNode **Z = new DdNode *[N]; | |
|     for (size_t i = 0; i < N; i++) { | |
| 	X[i] = x[i].getNode(); | |
| 	Y[i] = y[i].getNode(); | |
| 	Z[i] = z[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_Dxygtdyz(mgr, (int) N, X, Y, Z); | |
|     delete [] X; | |
|     delete [] Y; | |
|     delete [] Z; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::Dxygtdyz | |
|  | |
| 
 | |
| BDD | |
| Cudd::Inequality( | |
|   int c, | |
|   std::vector<BDD> x, | |
|   std::vector<BDD> y) const | |
| { | |
|     size_t N = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[N]; | |
|     DdNode **Y = new DdNode *[N]; | |
|     for (size_t i = 0; i < N; i++) { | |
| 	X[i] = x[i].getNode(); | |
| 	Y[i] = y[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_Inequality(mgr, (int) N, c, X, Y); | |
|     delete [] X; | |
|     delete [] Y; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::Inequality | |
|  | |
| 
 | |
| BDD | |
| Cudd::Disequality( | |
|   int c, | |
|   std::vector<BDD> x, | |
|   std::vector<BDD> y) const | |
| { | |
|     size_t N = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[N]; | |
|     DdNode **Y = new DdNode *[N]; | |
|     for (size_t i = 0; i < N; i++) { | |
| 	X[i] = x[i].getNode(); | |
| 	Y[i] = y[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_Disequality(mgr, (int) N, c, X, Y); | |
|     delete [] X; | |
|     delete [] Y; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::Disequality | |
|  | |
| 
 | |
| BDD | |
| Cudd::Interval( | |
|   std::vector<BDD> x, | |
|   unsigned int lowerB, | |
|   unsigned int upperB) const | |
| { | |
|     size_t N = x.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[N]; | |
|     for (size_t i = 0; i < N; i++) { | |
| 	X[i] = x[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_bddInterval(mgr, (int) N, X, lowerB, upperB); | |
|     delete [] X; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::Interval | |
|  | |
| 
 | |
| BDD | |
| BDD::CProjection( | |
|   const BDD& Y) const | |
| { | |
|     DdManager *mgr = checkSameManager(Y); | |
|     DdNode *result = Cudd_CProjection(mgr, node, Y.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::CProjection | |
|  | |
| 
 | |
| int | |
| BDD::MinHammingDist( | |
|   int *minterm, | |
|   int upperBound) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_MinHammingDist(mgr, node, minterm, upperBound); | |
|     return result; | |
| 
 | |
| } // BDD::MinHammingDist | |
|  | |
| 
 | |
| ADD | |
| Cudd::Hamming( | |
|   std::vector<ADD> xVars, | |
|   std::vector<ADD> yVars) const | |
| { | |
|     size_t nVars = xVars.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[nVars]; | |
|     DdNode **Y = new DdNode *[nVars]; | |
|     for (size_t i = 0; i < nVars; i++) { | |
| 	X[i] = xVars[i].getNode(); | |
| 	Y[i] = yVars[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_addHamming(mgr, X, Y, (int) nVars); | |
|     delete [] X; | |
|     delete [] Y; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::Hamming | |
|  | |
| 
 | |
| ADD | |
| Cudd::Read( | |
|   FILE * fp, | |
|   std::vector<ADD>& x, | |
|   std::vector<ADD>& y, | |
|   std::vector<ADD>& xn, | |
|   std::vector<ADD>& yn_, | |
|   int * m, | |
|   int * n, | |
|   int bx, | |
|   int sx, | |
|   int by, | |
|   int sy) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *E; | |
|     DdNode **xa = 0, **ya = 0, **xna = 0, **yna = 0; | |
|     int nx = x.size(), ny = y.size(); | |
|     if (nx > 0) { | |
|         xa = (DdNode **) malloc(nx * sizeof(DdNode *)); | |
|         if (!xa) { | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         xna = (DdNode **) malloc(nx * sizeof(DdNode *)); | |
|         if (!xna) { | |
|             free(xa); | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         for (int i = 0; i < nx; ++i) { | |
|             xa[i] = x.at(i).node; | |
|             xna[i] = xn.at(i).node; | |
|         } | |
|     } | |
|     if (ny > 0) { | |
|         ya = (DdNode **) malloc(ny * sizeof(DdNode *)); | |
|         if (!ya) { | |
|             free(xa); | |
|             free(xna); | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         yna = (DdNode **) malloc(ny * sizeof(DdNode *)); | |
|         if (!yna) { | |
|             free(xa); | |
|             free(xna); | |
|             free(ya); | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         for (int j = 0; j < ny; ++j) { | |
|             ya[j] = y.at(j).node; | |
|             yna[j] = yn_.at(j).node; | |
|         } | |
|     } | |
|     int result = Cudd_addRead(fp, mgr, &E, &xa, &ya, &xna, &yna, &nx, &ny, | |
|                               m, n, bx, sx, by, sy); | |
|     checkReturnValue(result); | |
|     for (int i = x.size(); i < nx; ++i) { | |
|         x.push_back(ADD(p, xa[i])); | |
|         xn.push_back(ADD(p, xna[i])); | |
|     } | |
|     free(xa); | |
|     free(xna); | |
|     for (int j = y.size(); j < ny; ++j) { | |
|         y.push_back(ADD(p, ya[j])); | |
|         yn_.push_back(ADD(p, yna[j])); | |
|     } | |
|     free(ya); | |
|     free(yna); | |
|     Cudd_Deref(E); | |
|     return ADD(p, E); | |
| 
 | |
| } // Cudd::Read | |
|  | |
| 
 | |
| BDD | |
| Cudd::Read( | |
|   FILE * fp, | |
|   std::vector<BDD>& x, | |
|   std::vector<BDD>& y, | |
|   int * m, | |
|   int * n, | |
|   int bx, | |
|   int sx, | |
|   int by, | |
|   int sy) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *E; | |
|     DdNode **xa = 0, **ya = 0; | |
|     int nx = x.size(), ny = y.size(); | |
|     if (nx > 0) { | |
|         xa = (DdNode **) malloc(nx * sizeof(DdNode *)); | |
|         if (!xa) { | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         for (int i = 0; i < nx; ++i) { | |
|             xa[i] = x.at(i).node; | |
|         } | |
|     } | |
|     if (ny > 0) { | |
|         ya = (DdNode **) malloc(ny * sizeof(DdNode *)); | |
|         if (!ya) { | |
|             free(xa); | |
|             p->errorHandler("Out of memory."); | |
|         } | |
|         for (int j = 0; j < nx; ++j) { | |
|             ya[j] = y.at(j).node; | |
|         } | |
|     } | |
|     int result = Cudd_bddRead(fp, mgr, &E, &xa, &ya, &nx, &ny, | |
|                               m, n, bx, sx, by, sy); | |
|     checkReturnValue(result); | |
|     for (int i = x.size(); i < nx; ++i) { | |
|         x.push_back(BDD(p, xa[i])); | |
|     } | |
|     free(xa); | |
|     for (int j = y.size(); j < ny; ++j) { | |
|         y.push_back(BDD(p, ya[j])); | |
|     } | |
|     free(ya); | |
|     Cudd_Deref(E); | |
|     return BDD(p, E); | |
| 
 | |
| } // Cudd::Read | |
|  | |
| 
 | |
| void | |
| Cudd::ReduceHeap( | |
|   Cudd_ReorderingType heuristic, | |
|   int minsize) const | |
| { | |
|     int result = Cudd_ReduceHeap(p->manager, heuristic, minsize); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::ReduceHeap | |
|  | |
| 
 | |
| void | |
| Cudd::ShuffleHeap( | |
|   int * permutation) const | |
| { | |
|     int result = Cudd_ShuffleHeap(p->manager, permutation); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::ShuffleHeap | |
|  | |
| 
 | |
| ADD | |
| ADD::Eval( | |
|   int * inputs) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_Eval(mgr, node, inputs); | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // ADD::Eval | |
|  | |
| 
 | |
| BDD | |
| BDD::Eval( | |
|   int * inputs) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_Eval(mgr, node, inputs); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Eval | |
|  | |
| 
 | |
| BDD | |
| ABDD::ShortestPath( | |
|   int * weight, | |
|   int * support, | |
|   int * length) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_ShortestPath(mgr, node, weight, support, length); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ABDD::ShortestPath | |
|  | |
| 
 | |
| BDD | |
| ABDD::LargestCube( | |
|   int * length) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_LargestCube(mgr, node, length); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ABDD::LargestCube | |
|  | |
| 
 | |
| int | |
| ABDD::ShortestLength( | |
|   int * weight) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_ShortestLength(mgr, node, weight); | |
|     checkReturnValue(result != CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ABDD::ShortestLength | |
|  | |
| 
 | |
| BDD | |
| BDD::Decreasing( | |
|   int i) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_Decreasing(mgr, node, i); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Decreasing | |
|  | |
| 
 | |
| BDD | |
| BDD::Increasing( | |
|   int i) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_Increasing(mgr, node, i); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Increasing | |
|  | |
| 
 | |
| bool | |
| ABDD::EquivDC( | |
|   const ABDD& G, | |
|   const ABDD& D) const | |
| { | |
|     DdManager *mgr = checkSameManager(G); | |
|     checkSameManager(D); | |
|     return Cudd_EquivDC(mgr, node, G.node, D.node); | |
| 
 | |
| } // ABDD::EquivDC | |
|  | |
| bool | |
| BDD::LeqUnless( | |
|   const BDD& G, | |
|   const BDD& D) const | |
| { | |
|     DdManager *mgr = checkSameManager(G); | |
|     checkSameManager(D); | |
|     int res = Cudd_bddLeqUnless(mgr, node, G.node, D.node); | |
|     return res; | |
| 
 | |
| } // BDD::LeqUnless | |
|  | |
| 
 | |
| bool | |
| ADD::EqualSupNorm( | |
|   const ADD& g, | |
|   CUDD_VALUE_TYPE tolerance, | |
|   int pr) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     return Cudd_EqualSupNorm(mgr, node, g.node, tolerance, pr); | |
| 
 | |
| } // ADD::EqualSupNorm | |
|  | |
| bool | |
| ADD::EqualSupNormRel( | |
|   const ADD& g, | |
|   CUDD_VALUE_TYPE tolerance, | |
|   int pr) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     return Cudd_EqualSupNormRel(mgr, node, g.node, tolerance, pr) != 0; | |
|          | |
| } // ADD::EqualSupNormRel | |
|  | |
| BDD | |
| BDD::MakePrime( | |
|   const BDD& F) const | |
| { | |
|     DdManager *mgr = checkSameManager(F); | |
|     if (!Cudd_CheckCube(mgr, node)) { | |
|         p->errorHandler("Invalid argument."); | |
|     } | |
|     DdNode *result = Cudd_bddMakePrime(mgr, node, F.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD:MakePrime | |
|  | |
| 
 | |
| BDD | |
| BDD::MaximallyExpand( | |
|   const BDD& ub, | |
|   const BDD& f) | |
| { | |
|     DdManager *mgr = checkSameManager(ub); | |
|     checkSameManager(f); | |
|     DdNode *result = Cudd_bddMaximallyExpand(mgr, node, ub.node, f.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::MaximallyExpand | |
|  | |
| 
 | |
| BDD | |
| BDD::LargestPrimeUnate( | |
|   const BDD& phases) | |
| { | |
|     DdManager *mgr = checkSameManager(phases); | |
|     DdNode *result = Cudd_bddLargestPrimeUnate(mgr, node, phases.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::LargestPrimeUnate | |
|  | |
| 
 | |
| double * | |
| ABDD::CofMinterm() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     double *result = Cudd_CofMinterm(mgr, node); | |
|     checkReturnValue(result); | |
|     return result; | |
| 
 | |
| } // ABDD::CofMinterm | |
|  | |
| 
 | |
| BDD | |
| BDD::SolveEqn( | |
|   const BDD& Y, | |
|   std::vector<BDD> & G, | |
|   int ** yIndex, | |
|   int n) const | |
| { | |
|     DdManager *mgr = checkSameManager(Y); | |
|     DdNode **g = new DdNode *[n]; | |
|     DdNode *result = Cudd_SolveEqn(mgr, node, Y.node, g, yIndex, n); | |
|     checkReturnValue(result); | |
|     for (int i = 0; i < n; i++) { | |
|         G.push_back(BDD(p, g[i])); | |
| 	Cudd_RecursiveDeref(mgr,g[i]); | |
|     } | |
|     delete [] g; | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SolveEqn | |
|  | |
| 
 | |
| BDD | |
| BDD::VerifySol( | |
|   std::vector<BDD> const & G, | |
|   int * yIndex) const | |
| { | |
|     size_t n = G.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **g = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	g[i] = G[i].node; | |
|     } | |
|     DdNode *result = Cudd_VerifySol(mgr, node, g, yIndex, (int) n); | |
|     delete [] g; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::VerifySol | |
|  | |
| 
 | |
| BDD | |
| BDD::SplitSet( | |
|   std::vector<BDD> xVars, | |
|   double m) const | |
| { | |
|     size_t n = xVars.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **X = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	X[i] = xVars[i].node; | |
|     } | |
|     DdNode *result = Cudd_SplitSet(mgr, node, X, (int) n, m); | |
|     delete [] X; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SplitSet | |
|  | |
| 
 | |
| BDD | |
| BDD::SubsetHeavyBranch( | |
|   int numVars, | |
|   int threshold) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_SubsetHeavyBranch(mgr, node, numVars, threshold); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SubsetHeavyBranch | |
|  | |
| 
 | |
| BDD | |
| BDD::SupersetHeavyBranch( | |
|   int numVars, | |
|   int threshold) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_SupersetHeavyBranch(mgr, node, numVars, threshold); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SupersetHeavyBranch | |
|  | |
| 
 | |
| BDD | |
| BDD::SubsetShortPaths( | |
|   int numVars, | |
|   int threshold, | |
|   bool hardlimit) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_SubsetShortPaths(mgr, node, numVars, threshold, hardlimit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SubsetShortPaths | |
|  | |
| 
 | |
| BDD | |
| BDD::SupersetShortPaths( | |
|   int numVars, | |
|   int threshold, | |
|   bool hardlimit) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_SupersetShortPaths(mgr, node, numVars, threshold, hardlimit); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::SupersetShortPaths | |
|  | |
| 
 | |
| void | |
| Cudd::SymmProfile( | |
|   int lower, | |
|   int upper) const | |
| { | |
|     Cudd_SymmProfile(p->manager, lower, upper); | |
| 
 | |
| } // Cudd::SymmProfile | |
|  | |
| 
 | |
| unsigned int | |
| Cudd::Prime( | |
|   unsigned int pr) const | |
| { | |
|     return Cudd_Prime(pr); | |
| 
 | |
| } // Cudd::Prime | |
|  | |
| 
 | |
| void | |
| Cudd::Reserve( | |
|   int amount) const | |
| { | |
|     int result = Cudd_Reserve(p->manager, amount); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::Reserve | |
|  | |
| 
 | |
| void | |
| ABDD::PrintMinterm() const | |
| { | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_PrintMinterm(mgr, node); | |
|     checkReturnValue(result); | |
| 
 | |
| } // ABDD::PrintMinterm | |
|  | |
| 
 | |
| void | |
| BDD::PrintCover() const | |
| { | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_bddPrintCover(mgr, node, node); | |
|     checkReturnValue(result); | |
| 
 | |
| } // BDD::PrintCover | |
|  | |
| 
 | |
| void | |
| BDD::PrintCover( | |
|   const BDD& u) const | |
| { | |
|     checkSameManager(u); | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_bddPrintCover(mgr, node, u.node); | |
|     checkReturnValue(result); | |
| 
 | |
| } // BDD::PrintCover | |
|  | |
| 
 | |
| int | |
| BDD::EstimateCofactor( | |
|   int i, | |
|   int phase) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_EstimateCofactor(mgr, node, i, phase); | |
|     checkReturnValue(result != CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // BDD::EstimateCofactor | |
|  | |
| 
 | |
| int | |
| BDD::EstimateCofactorSimple( | |
|   int i) const | |
| { | |
|     int result = Cudd_EstimateCofactorSimple(node, i); | |
|     return result; | |
| 
 | |
| } // BDD::EstimateCofactorSimple | |
|  | |
| 
 | |
| int | |
| Cudd::SharingSize( | |
|   DD* nodes, | |
|   int n) const | |
| { | |
|     DdNode **nodeArray = new DdNode *[n]; | |
|     for (int i = 0; i < n; i++) { | |
| 	nodeArray[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_SharingSize(nodeArray, n); | |
|     delete [] nodeArray; | |
|     checkReturnValue(n == 0 || result > 0); | |
|     return result; | |
| 
 | |
| } // Cudd::SharingSize | |
|  | |
| 
 | |
| int | |
| Cudd::SharingSize( | |
|   const std::vector<BDD>& v) const | |
| { | |
|     vector<BDD>::size_type n = v.size(); | |
|     DdNode **nodeArray = new DdNode *[n]; | |
|     for (vector<BDD>::size_type i = 0; i != n; ++i) { | |
| 	nodeArray[i] = v[i].getNode(); | |
|     } | |
|     int result = Cudd_SharingSize(nodeArray, (int) n); | |
|     delete [] nodeArray; | |
|     checkReturnValue(n == 0 || result > 0); | |
|     return result; | |
| 
 | |
| } // Cudd::SharingSize | |
|  | |
| 
 | |
| double | |
| ABDD::CountMinterm( | |
|   int nvars) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     double result = Cudd_CountMinterm(mgr, node, nvars); | |
|     checkReturnValue(result != (double) CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ABDD::CountMinterm | |
|  | |
| 
 | |
| double | |
| ABDD::CountPath() const | |
| { | |
|     double result = Cudd_CountPath(node); | |
|     checkReturnValue(result != (double) CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ABDD::CountPath | |
|  | |
| 
 | |
| BDD | |
| ABDD::Support() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_Support(mgr, node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ABDD::Support | |
|  | |
| 
 | |
| int | |
| ABDD::SupportSize() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_SupportSize(mgr, node); | |
|     checkReturnValue(result != CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ABDD::SupportSize | |
|  | |
| 
 | |
| BDD | |
| Cudd::VectorSupport(const std::vector<BDD>& roots) const | |
| { | |
|     size_t n = roots.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	F[i] = roots[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_VectorSupport(mgr, F, (int) n); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::VectorSupport | |
|  | |
| 
 | |
| std::vector<unsigned int> | |
| ABDD::SupportIndices() const | |
| { | |
|     unsigned int *support; | |
|     DdManager *mgr = p->manager; | |
|     int size = Cudd_SupportIndices(mgr, node, (int **)&support); | |
|     checkReturnValue(size >= 0); | |
|     // size could be 0, in which case support is 0 too! | |
|     vector<unsigned int> indices(support, support+size); | |
|     if (support) free(support); | |
|     return indices; | |
| 
 | |
| } // ABDD::SupportIndices | |
|  | |
| 
 | |
| std::vector<unsigned int> | |
| Cudd::SupportIndices(const std::vector<BDD>& roots) const | |
| { | |
|     unsigned int *support; | |
|     size_t n = roots.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	F[i] = roots[i].getNode(); | |
|     } | |
|     int size = Cudd_VectorSupportIndices(mgr, F, (int) n, (int **)&support); | |
|     delete [] F; | |
|     checkReturnValue(size >= 0); | |
|     // size could be 0, in which case support is 0 too! | |
|     vector<unsigned int> indices(support, support+size); | |
|     if (support) free(support); | |
|     return indices; | |
| 
 | |
| } // Cudd::SupportIndices | |
|  | |
| 
 | |
| std::vector<unsigned int> | |
| Cudd::SupportIndices(const std::vector<ADD>& roots) const | |
| { | |
|     unsigned int *support; | |
|     size_t n = roots.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	F[i] = roots[i].getNode(); | |
|     } | |
|     int size = Cudd_VectorSupportIndices(mgr, F, (int) n, (int **)&support); | |
|     delete [] F; | |
|     checkReturnValue(size >= 0); | |
|     // size could be 0, in which case support is 0 too! | |
|     vector<unsigned int> indices(support, support+size); | |
|     if (support) free(support); | |
|     return indices; | |
| 
 | |
| } // Cudd::SupportIndices | |
|  | |
| 
 | |
| int | |
| Cudd::nodeCount(const std::vector<BDD>& roots) const | |
| { | |
|     size_t n = roots.size(); | |
|     DdNode **nodeArray = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	nodeArray[i] = roots[i].getNode(); | |
|     } | |
|     int result = Cudd_SharingSize(nodeArray, (int) n); | |
|     delete [] nodeArray; | |
|     checkReturnValue(result > 0); | |
|     return result; | |
| 
 | |
| } // Cudd::nodeCount | |
|  | |
| 
 | |
| BDD | |
| Cudd::VectorSupport(const std::vector<ADD>& roots) const | |
| { | |
|     size_t n = roots.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	F[i] = roots[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_VectorSupport(mgr, F, (int) n); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::VectorSupport | |
|  | |
| 
 | |
| int | |
| Cudd::VectorSupportSize(const std::vector<BDD>& roots) const | |
| { | |
|     size_t n = roots.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	F[i] = roots[i].getNode(); | |
|     } | |
|     int result = Cudd_VectorSupportSize(mgr, F, (int) n); | |
|     delete [] F; | |
|     checkReturnValue(result != CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // Cudd::VectorSupportSize | |
|  | |
| 
 | |
| int | |
| Cudd::VectorSupportSize(const std::vector<ADD>& roots) const | |
| { | |
|     size_t n = roots.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	F[i] = roots[i].getNode(); | |
|     } | |
|     int result = Cudd_VectorSupportSize(mgr, F, (int) n); | |
|     delete [] F; | |
|     checkReturnValue(result != CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // Cudd::VectorSupportSize | |
|  | |
| 
 | |
| void | |
| ABDD::ClassifySupport( | |
|   const ABDD& g, | |
|   BDD* common, | |
|   BDD* onlyF, | |
|   BDD* onlyG) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *C, *F, *G; | |
|     int result = Cudd_ClassifySupport(mgr, node, g.node, &C, &F, &G); | |
|     checkReturnValue(result); | |
|     *common = BDD(p, C); | |
|     *onlyF = BDD(p, F); | |
|     *onlyG = BDD(p, G); | |
| 
 | |
| } // ABDD::ClassifySupport | |
|  | |
| 
 | |
| int | |
| ABDD::CountLeaves() const | |
| { | |
|     return Cudd_CountLeaves(node); | |
| 
 | |
| } // ABDD::CountLeaves | |
|  | |
| DdGen * | |
| ABDD::FirstCube( | |
|                 int ** cube, | |
|                 CUDD_VALUE_TYPE * value) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdGen *result = Cudd_FirstCube(mgr, node, cube, value); | |
|     checkReturnValue((DdNode *)result); | |
|     return result; | |
|      | |
| } // ABDD::FirstCube | |
|  | |
| 
 | |
| int | |
| ABDD::NextCube( | |
|                DdGen * gen, | |
|                int ** cube, | |
|                CUDD_VALUE_TYPE * value) | |
| { | |
|     return Cudd_NextCube(gen, cube, value); | |
|      | |
| } // ABDD::NextCube | |
|  | |
| void | |
| BDD::PickOneCube( | |
|   char * string) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_bddPickOneCube(mgr, node, string); | |
|     checkReturnValue(result); | |
| 
 | |
| } // BDD::PickOneCube | |
|  | |
| 
 | |
| BDD | |
| BDD::PickOneMinterm( | |
|   std::vector<BDD> vars) const | |
| { | |
|     size_t n = vars.size(); | |
|     DdManager *mgr = p->manager; | |
|     DdNode **V = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	V[i] = vars[i].node; | |
|     } | |
|     DdNode *result = Cudd_bddPickOneMinterm(mgr, node, V, (int) n); | |
|     delete [] V; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::PickOneMinterm | |
|  | |
| 
 | |
| BDD | |
| Cudd::bddComputeCube( | |
|   BDD * vars, | |
|   int * phase, | |
|   int n) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **V = new DdNode *[n]; | |
|     for (int i = 0; i < n; i++) { | |
| 	V[i] = vars[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_bddComputeCube(mgr, V, phase, n); | |
|     delete [] V; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::bddComputeCube | |
|  | |
| 
 | |
| BDD | |
| Cudd::computeCube( | |
|   std::vector<BDD> const & vars) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = vars.size(); | |
|     DdNode **V = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	V[i] = vars[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_bddComputeCube(mgr, V, 0, n); | |
|     delete [] V; | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::computeCube | |
|  | |
| 
 | |
| ADD | |
| Cudd::addComputeCube( | |
|   ADD * vars, | |
|   int * phase, | |
|   int n) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode **V = new DdNode *[n]; | |
|     for (int i = 0; i < n; i++) { | |
| 	V[i] = vars[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_addComputeCube(mgr, V, phase, n); | |
|     delete [] V; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::addComputeCube | |
|  | |
| 
 | |
| ADD | |
| Cudd::computeCube( | |
|   std::vector<ADD> const & vars) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = vars.size(); | |
|     DdNode **V = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	V[i] = vars[i].getNode(); | |
|     } | |
|     DdNode *result = Cudd_addComputeCube(mgr, V, 0, n); | |
|     delete [] V; | |
|     checkReturnValue(result); | |
|     return ADD(p, result); | |
| 
 | |
| } // Cudd::computeCube | |
|  | |
| 
 | |
| BDD | |
| Cudd::IndicesToCube( | |
|   int * array, | |
|   int n) const | |
| { | |
|     DdNode *result = Cudd_IndicesToCube(p->manager, array, n); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // Cudd::IndicesToCube | |
|  | |
| 
 | |
| void | |
| Cudd::PrintVersion( | |
|   FILE * fp) const | |
| { | |
|     cout.flush(); | |
|     Cudd_PrintVersion(fp); | |
| 
 | |
| } // Cudd::PrintVersion | |
|  | |
| 
 | |
| double | |
| Cudd::AverageDistance() const | |
| { | |
|     return Cudd_AverageDistance(p->manager); | |
| 
 | |
| } // Cudd::AverageDistance | |
|  | |
| 
 | |
| int32_t | |
| Cudd::Random() const | |
| { | |
|     return Cudd_Random(p->manager); | |
| 
 | |
| } // Cudd::Random | |
|  | |
| 
 | |
| void | |
| Cudd::Srandom( | |
|   int32_t seed) const | |
| { | |
|     Cudd_Srandom(p->manager,seed); | |
| 
 | |
| } // Cudd::Srandom | |
|  | |
| 
 | |
| double | |
| ABDD::Density( | |
|   int nvars) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     double result = Cudd_Density(mgr, node, nvars); | |
|     checkReturnValue(result != (double) CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ABDD::Density | |
|  | |
| 
 | |
| int | |
| ZDD::Count() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_zddCount(mgr, node); | |
|     checkReturnValue(result != CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ZDD::Count | |
|  | |
| 
 | |
| double | |
| ZDD::CountDouble() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     double result = Cudd_zddCountDouble(mgr, node); | |
|     checkReturnValue(result != (double) CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ZDD::CountDouble | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Product( | |
|   const ZDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_zddProduct(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Product | |
|  | |
| 
 | |
| ZDD | |
| ZDD::UnateProduct( | |
|   const ZDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_zddUnateProduct(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::UnateProduct | |
|  | |
| 
 | |
| ZDD | |
| ZDD::WeakDiv( | |
|   const ZDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_zddWeakDiv(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::WeakDiv | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Divide( | |
|   const ZDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_zddDivide(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Divide | |
|  | |
| 
 | |
| ZDD | |
| ZDD::WeakDivF( | |
|   const ZDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_zddWeakDivF(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::WeakDivF | |
|  | |
| 
 | |
| ZDD | |
| ZDD::DivideF( | |
|   const ZDD& g) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     DdNode *result = Cudd_zddDivideF(mgr, node, g.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::DivideF | |
|  | |
| 
 | |
| MtrNode * | |
| Cudd::MakeZddTreeNode( | |
|   unsigned int low, | |
|   unsigned int size, | |
|   unsigned int type) const | |
| { | |
|     return Cudd_MakeZddTreeNode(p->manager, low, size, type); | |
| 
 | |
| } // Cudd::MakeZddTreeNode | |
|  | |
| 
 | |
| BDD | |
| BDD::zddIsop( | |
|   const BDD& U, | |
|   ZDD* zdd_I) const | |
| { | |
|     DdManager *mgr = checkSameManager(U); | |
|     DdNode *Z; | |
|     DdNode *result = Cudd_zddIsop(mgr, node, U.node, &Z); | |
|     checkReturnValue(result); | |
|     *zdd_I = ZDD(p, Z); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Isop | |
|  | |
| 
 | |
| BDD | |
| BDD::Isop( | |
|   const BDD& U) const | |
| { | |
|     DdManager *mgr = checkSameManager(U); | |
|     DdNode *result = Cudd_bddIsop(mgr, node, U.node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // BDD::Isop | |
|  | |
| 
 | |
| double | |
| ZDD::CountMinterm( | |
|   int path) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     double result = Cudd_zddCountMinterm(mgr, node, path); | |
|     checkReturnValue(result != (double) CUDD_OUT_OF_MEM); | |
|     return result; | |
| 
 | |
| } // ZDD::CountMinterm | |
|  | |
| 
 | |
| void | |
| Cudd::zddPrintSubtable() const | |
| { | |
|     cout.flush(); | |
|     Cudd_zddPrintSubtable(p->manager); | |
| 
 | |
| } // Cudd::zddPrintSubtable | |
|  | |
| 
 | |
| ZDD | |
| BDD::PortToZdd() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_zddPortFromBdd(mgr, node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // BDD::PortToZdd | |
|  | |
| 
 | |
| BDD | |
| ZDD::PortToBdd() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_zddPortToBdd(mgr, node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ZDD::PortToBdd | |
|  | |
| 
 | |
| void | |
| Cudd::zddReduceHeap( | |
|   Cudd_ReorderingType heuristic, | |
|   int minsize) const | |
| { | |
|     int result = Cudd_zddReduceHeap(p->manager, heuristic, minsize); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::zddReduceHeap | |
|  | |
| 
 | |
| void | |
| Cudd::zddShuffleHeap( | |
|   int * permutation) const | |
| { | |
|     int result = Cudd_zddShuffleHeap(p->manager, permutation); | |
|     checkReturnValue(result); | |
| 
 | |
| } // Cudd::zddShuffleHeap | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Ite( | |
|   const ZDD& g, | |
|   const ZDD& h) const | |
| { | |
|     DdManager *mgr = checkSameManager(g); | |
|     checkSameManager(h); | |
|     DdNode *result = Cudd_zddIte(mgr, node, g.node, h.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Ite | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Union( | |
|   const ZDD& Q) const | |
| { | |
|     DdManager *mgr = checkSameManager(Q); | |
|     DdNode *result = Cudd_zddUnion(mgr, node, Q.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Union | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Intersect( | |
|   const ZDD& Q) const | |
| { | |
|     DdManager *mgr = checkSameManager(Q); | |
|     DdNode *result = Cudd_zddIntersect(mgr, node, Q.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Intersect | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Diff( | |
|   const ZDD& Q) const | |
| { | |
|     DdManager *mgr = checkSameManager(Q); | |
|     DdNode *result = Cudd_zddDiff(mgr, node, Q.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Diff | |
|  | |
| 
 | |
| ZDD | |
| ZDD::DiffConst( | |
|   const ZDD& Q) const | |
| { | |
|     DdManager *mgr = checkSameManager(Q); | |
|     DdNode *result = Cudd_zddDiffConst(mgr, node, Q.node); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::DiffConst | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Subset1( | |
|   int var) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_zddSubset1(mgr, node, var); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Subset1 | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Subset0( | |
|   int var) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_zddSubset0(mgr, node, var); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Subset0 | |
|  | |
| 
 | |
| ZDD | |
| ZDD::Change( | |
|   int var) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_zddChange(mgr, node, var); | |
|     checkReturnValue(result); | |
|     return ZDD(p, result); | |
| 
 | |
| } // ZDD::Change | |
|  | |
| 
 | |
| void | |
| Cudd::zddSymmProfile( | |
|   int lower, | |
|   int upper) const | |
| { | |
|     Cudd_zddSymmProfile(p->manager, lower, upper); | |
| 
 | |
| } // Cudd::zddSymmProfile | |
|  | |
| 
 | |
| void | |
| ZDD::PrintMinterm() const | |
| { | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_zddPrintMinterm(mgr, node); | |
|     checkReturnValue(result); | |
| 
 | |
| } // ZDD::PrintMinterm | |
|  | |
| 
 | |
| void | |
| ZDD::PrintCover() const | |
| { | |
|     cout.flush(); | |
|     DdManager *mgr = p->manager; | |
|     int result = Cudd_zddPrintCover(mgr, node); | |
|     checkReturnValue(result); | |
| 
 | |
| } // ZDD::PrintCover | |
|  | |
| 
 | |
| BDD | |
| ZDD::Support() const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     DdNode *result = Cudd_zddSupport(mgr, node); | |
|     checkReturnValue(result); | |
|     return BDD(p, result); | |
| 
 | |
| } // ZDD::Support | |
|  | |
| 
 | |
| void | |
| Cudd::DumpDot( | |
|   const std::vector<ZDD>& nodes, | |
|   char const * const * inames, | |
|   char const * const * onames, | |
|   FILE * fp) const | |
| { | |
|     DdManager *mgr = p->manager; | |
|     size_t n = nodes.size(); | |
|     DdNode **F = new DdNode *[n]; | |
|     for (size_t i = 0; i < n; i++) { | |
| 	F[i] = nodes[i].getNode(); | |
|     } | |
|     int result = Cudd_zddDumpDot(mgr, (int) n, F, inames, onames, fp); | |
|     delete [] F; | |
|     checkReturnValue(result); | |
| 
 | |
| } // vector<ZDD>::DumpDot | |
|  | |
| 
 | |
| std::string | |
| Cudd::OrderString(void) const | |
| { | |
|     DdManager * mgr = p->manager; | |
|     int nvars = Cudd_ReadSize(mgr); | |
|     bool hasNames = p->varnames.size() == (size_t) nvars; | |
|     std::ostringstream oss; | |
|     std::string separ = ""; | |
|     for (int level = 0; level != nvars; ++level) { | |
|         oss << separ; | |
|         separ = " "; | |
|         int index = Cudd_ReadInvPerm(mgr, level); | |
|         if (hasNames) { | |
|             oss << p->varnames.at(index); | |
|         } else { | |
|             oss << "x" << index; | |
|         } | |
|     } | |
|     return oss.str(); | |
| 
 | |
| } // Cudd::OrderString | |
|      | |
| } // end namespace storm
 |