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

  1. /**
  2. @file
  3. @ingroup cplusplus
  4. @brief Functions for the C++ object-oriented encapsulation of CUDD.
  5. @author Fabio Somenzi
  6. @copyright@parblock
  7. Copyright (c) 1995-2015, Regents of the University of Colorado
  8. All rights reserved.
  9. Redistribution and use in source and binary forms, with or without
  10. modification, are permitted provided that the following conditions
  11. are met:
  12. Redistributions of source code must retain the above copyright
  13. notice, this list of conditions and the following disclaimer.
  14. Redistributions in binary form must reproduce the above copyright
  15. notice, this list of conditions and the following disclaimer in the
  16. documentation and/or other materials provided with the distribution.
  17. Neither the name of the University of Colorado nor the names of its
  18. contributors may be used to endorse or promote products derived from
  19. this software without specific prior written permission.
  20. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  23. FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  24. COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  25. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  26. BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  27. LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  28. CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  30. ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31. POSSIBILITY OF SUCH DAMAGE.
  32. @endparblock
  33. */
  34. #include <iostream>
  35. #include <sstream>
  36. #include <cassert>
  37. #include <cstdlib>
  38. #include <cstring>
  39. #include <algorithm>
  40. #include <stdexcept>
  41. #include "epdInt.h"
  42. #include "cuddInt.h"
  43. #include "cuddObj.hh"
  44. using std::cout;
  45. using std::cerr;
  46. using std::ostream;
  47. using std::endl;
  48. using std::hex;
  49. using std::dec;
  50. using std::string;
  51. using std::vector;
  52. using std::sort;
  53. namespace cudd {
  54. // ---------------------------------------------------------------------------
  55. // Variable declarations
  56. // ---------------------------------------------------------------------------
  57. // ---------------------------------------------------------------------------
  58. // Members of class Capsule
  59. // ---------------------------------------------------------------------------
  60. /**
  61. @brief Class for reference counting of CUDD managers.
  62. @see Cudd DD ABDD ADD BDD ZDD
  63. */
  64. class Capsule {
  65. public:
  66. Capsule(unsigned int numVars, unsigned int numVarsZ,
  67. unsigned int numSlots, unsigned int cacheSize,
  68. unsigned long maxMemory, PFC defaultHandler);
  69. ~Capsule();
  70. #if HAVE_MODERN_CXX == 1
  71. Capsule(Capsule const &) = delete;
  72. Capsule & operator=(Capsule const &) = delete;
  73. #else
  74. private:
  75. Capsule(Capsule const &); // not defined
  76. Capsule & operator=(Capsule const &); // not defined
  77. public:
  78. #endif
  79. DdManager *manager;
  80. PFC errorHandler;
  81. PFC timeoutHandler;
  82. PFC terminationHandler;
  83. std::vector<char *> varnames;
  84. int ref;
  85. bool verbose;
  86. };
  87. Capsule::Capsule(
  88. unsigned int numVars,
  89. unsigned int numVarsZ,
  90. unsigned int numSlots,
  91. unsigned int cacheSize,
  92. unsigned long maxMemory,
  93. PFC defaultHandler)
  94. {
  95. errorHandler = defaultHandler;
  96. timeoutHandler = defaultHandler;
  97. terminationHandler = defaultHandler;
  98. manager = Cudd_Init(numVars, numVarsZ, numSlots, cacheSize, maxMemory);
  99. if (!manager)
  100. errorHandler("Out of memory");
  101. verbose = 0; // initially terse
  102. ref = 1;
  103. } // Capsule::Capsule
  104. Capsule::~Capsule()
  105. {
  106. #ifdef DD_DEBUG
  107. if (manager) {
  108. int retval = Cudd_CheckZeroRef(manager);
  109. if (retval != 0) {
  110. cerr << retval << " unexpected non-zero reference counts" << endl;
  111. } else if (verbose) {
  112. cerr << "All went well" << endl;
  113. }
  114. }
  115. #endif
  116. for (vector<char *>::iterator it = varnames.begin();
  117. it != varnames.end(); ++it) {
  118. delete [] *it;
  119. }
  120. Cudd_Quit(manager);
  121. } // Capsule::~Capsule
  122. // ---------------------------------------------------------------------------
  123. // Members of class DD
  124. // ---------------------------------------------------------------------------
  125. DD::DD() : p(0), node(0) {}
  126. DD::DD(Capsule *cap, DdNode *ddNode) : p(cap), node(ddNode) {
  127. if (node) Cudd_Ref(node);
  128. if (p->verbose) {
  129. cout << "Standard DD constructor for node " << hex << node << dec <<
  130. " ref = " << Cudd_Regular(node)->ref << "\n";
  131. }
  132. } // DD::DD
  133. DD::DD(Cudd const & manager, DdNode *ddNode) : p(manager.p), node(ddNode) {
  134. checkReturnValue(ddNode);
  135. if (node) Cudd_Ref(node);
  136. if (p->verbose) {
  137. cout << "Standard DD constructor for node " << hex << node << dec <<
  138. " ref = " << Cudd_Regular(node)->ref << "\n";
  139. }
  140. } // DD::DD
  141. DD::DD(const DD &from) {
  142. p = from.p;
  143. node = from.node;
  144. if (node) {
  145. Cudd_Ref(node);
  146. if (p->verbose) {
  147. cout << "Copy DD constructor for node " << hex << node << dec <<
  148. " ref = " << Cudd_Regular(node)->ref << "\n";
  149. }
  150. }
  151. } // DD::DD
  152. DD::~DD() {}
  153. inline DdManager *
  154. DD::checkSameManager(
  155. const DD &other) const
  156. {
  157. DdManager *mgr = p->manager;
  158. if (mgr != other.p->manager) {
  159. p->errorHandler("Operands come from different manager.");
  160. }
  161. return mgr;
  162. } // DD::checkSameManager
  163. inline void
  164. DD::checkReturnValue(
  165. const void *result) const
  166. {
  167. if (result == 0) {
  168. DdManager *mgr = p->manager;
  169. Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr);
  170. switch (errType) {
  171. case CUDD_MEMORY_OUT:
  172. p->errorHandler("Out of memory.");
  173. break;
  174. case CUDD_TOO_MANY_NODES:
  175. break;
  176. case CUDD_MAX_MEM_EXCEEDED:
  177. p->errorHandler("Maximum memory exceeded.");
  178. break;
  179. case CUDD_TIMEOUT_EXPIRED:
  180. {
  181. std::ostringstream msg;
  182. unsigned long lag =
  183. Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
  184. msg << "Timeout expired. Lag = " << lag << " ms.";
  185. p->timeoutHandler(msg.str());
  186. }
  187. break;
  188. case CUDD_TERMINATION:
  189. {
  190. std::ostringstream msg;
  191. msg << "Terminated.\n";
  192. p->terminationHandler(msg.str());
  193. }
  194. break;
  195. case CUDD_INVALID_ARG:
  196. p->errorHandler("Invalid argument.");
  197. break;
  198. case CUDD_INTERNAL_ERROR:
  199. p->errorHandler("Internal error.");
  200. break;
  201. case CUDD_NO_ERROR:
  202. p->errorHandler("Unexpected error.");
  203. break;
  204. }
  205. }
  206. } // DD::checkReturnValue
  207. inline void
  208. DD::checkReturnValue(
  209. int result,
  210. int expected) const
  211. {
  212. if (result != expected) {
  213. DdManager *mgr = p->manager;
  214. Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr);
  215. switch (errType) {
  216. case CUDD_MEMORY_OUT:
  217. p->errorHandler("Out of memory.");
  218. break;
  219. case CUDD_TOO_MANY_NODES:
  220. break;
  221. case CUDD_MAX_MEM_EXCEEDED:
  222. p->errorHandler("Maximum memory exceeded.");
  223. break;
  224. case CUDD_TIMEOUT_EXPIRED:
  225. {
  226. std::ostringstream msg;
  227. unsigned long lag =
  228. Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
  229. msg << "Timeout expired. Lag = " << lag << " ms.\n";
  230. p->timeoutHandler(msg.str());
  231. }
  232. break;
  233. case CUDD_TERMINATION:
  234. {
  235. std::ostringstream msg;
  236. msg << "Terminated.\n";
  237. p->terminationHandler(msg.str());
  238. }
  239. break;
  240. case CUDD_INVALID_ARG:
  241. p->errorHandler("Invalid argument.");
  242. break;
  243. case CUDD_INTERNAL_ERROR:
  244. p->errorHandler("Internal error.");
  245. break;
  246. case CUDD_NO_ERROR:
  247. p->errorHandler("Unexpected error.");
  248. break;
  249. }
  250. }
  251. } // DD::checkReturnValue
  252. DdManager *
  253. DD::manager() const
  254. {
  255. return p->manager;
  256. } // DD::manager
  257. DdNode *
  258. DD::getNode() const
  259. {
  260. return node;
  261. } // DD::getNode
  262. DdNode *
  263. DD::getRegularNode() const
  264. {
  265. return Cudd_Regular(node);
  266. } // DD::getRegularNode
  267. int
  268. DD::nodeCount() const
  269. {
  270. return Cudd_DagSize(node);
  271. } // DD::nodeCount
  272. unsigned int
  273. DD::NodeReadIndex() const
  274. {
  275. return Cudd_NodeReadIndex(node);
  276. } // DD::NodeReadIndex
  277. // ---------------------------------------------------------------------------
  278. // Members of class ABDD
  279. // ---------------------------------------------------------------------------
  280. ABDD::ABDD() : DD() {}
  281. ABDD::ABDD(Capsule *cap, DdNode *bddNode) : DD(cap,bddNode) {}
  282. ABDD::ABDD(Cudd const & manager, DdNode *bddNode) : DD(manager,bddNode) {}
  283. ABDD::ABDD(const ABDD &from) : DD(from) {}
  284. ABDD::~ABDD() {
  285. if (node) {
  286. Cudd_RecursiveDeref(p->manager,node);
  287. if (p->verbose) {
  288. cout << "ADD/BDD destructor called for node " << hex << dec <<
  289. node << " ref = " << Cudd_Regular(node)->ref << "\n";
  290. }
  291. }
  292. } // ABDD::~ABDD
  293. bool
  294. ABDD::operator==(
  295. const ABDD& other) const
  296. {
  297. checkSameManager(other);
  298. return node == other.node;
  299. } // ABDD::operator==
  300. bool
  301. ABDD::operator!=(
  302. const ABDD& other) const
  303. {
  304. checkSameManager(other);
  305. return node != other.node;
  306. } // ABDD::operator!=
  307. bool
  308. ABDD::IsOne() const
  309. {
  310. return node == Cudd_ReadOne(p->manager);
  311. } // ABDD::IsOne
  312. void
  313. ABDD::print(
  314. int nvars,
  315. int verbosity) const
  316. {
  317. cout.flush();
  318. if (!node) defaultError("empty DD.");
  319. int retval = Cudd_PrintDebug(p->manager,node,nvars,verbosity);
  320. fflush(Cudd_ReadStdout(p->manager));
  321. checkReturnValue(retval);
  322. //if (retval == 0) p->errorHandler("print failed");
  323. } // ABDD::print
  324. void
  325. ABDD::summary(
  326. int nvars,
  327. int mode) const
  328. {
  329. cout.flush();
  330. if (!node) defaultError("empty DD.");
  331. int retval = Cudd_PrintSummary(p->manager,node,nvars,mode);
  332. fflush(Cudd_ReadStdout(p->manager));
  333. checkReturnValue(retval);
  334. } // ABDD::summary
  335. // ---------------------------------------------------------------------------
  336. // Members of class BDD
  337. // ---------------------------------------------------------------------------
  338. BDD::BDD() : ABDD() {}
  339. BDD::BDD(Capsule *cap, DdNode *bddNode) : ABDD(cap,bddNode) {}
  340. BDD::BDD(Cudd const & manager, DdNode *bddNode) : ABDD(manager,bddNode) {}
  341. BDD::BDD(const BDD &from) : ABDD(from) {}
  342. BDD
  343. BDD::operator=(
  344. const BDD& right)
  345. {
  346. if (this == &right) return *this;
  347. if (right.node) Cudd_Ref(right.node);
  348. if (node) {
  349. Cudd_RecursiveDeref(p->manager,node);
  350. if (p->verbose) {
  351. cout << "BDD dereferencing for node " << hex << node << dec <<
  352. " ref = " << Cudd_Regular(node)->ref << "\n";
  353. }
  354. }
  355. node = right.node;
  356. p = right.p;
  357. if (node && p->verbose) {
  358. cout << "BDD assignment for node " << hex << node << dec <<
  359. " ref = " << Cudd_Regular(node)->ref << "\n";
  360. }
  361. return *this;
  362. } // BDD::operator=
  363. bool
  364. BDD::operator<=(
  365. const BDD& other) const
  366. {
  367. DdManager *mgr = checkSameManager(other);
  368. return Cudd_bddLeq(mgr,node,other.node);
  369. } // BDD::operator<=
  370. bool
  371. BDD::operator>=(
  372. const BDD& other) const
  373. {
  374. DdManager *mgr = checkSameManager(other);
  375. return Cudd_bddLeq(mgr,other.node,node);
  376. } // BDD::operator>=
  377. bool
  378. BDD::operator<(
  379. const BDD& other) const
  380. {
  381. DdManager *mgr = checkSameManager(other);
  382. return node != other.node && Cudd_bddLeq(mgr,node,other.node);
  383. } // BDD::operator<
  384. bool
  385. BDD::operator>(
  386. const BDD& other) const
  387. {
  388. DdManager *mgr = checkSameManager(other);
  389. return node != other.node && Cudd_bddLeq(mgr,other.node,node);
  390. } // BDD::operator>
  391. BDD
  392. BDD::operator!() const
  393. {
  394. return BDD(p, Cudd_Not(node));
  395. } // BDD::operator!
  396. BDD
  397. BDD::operator~() const
  398. {
  399. return BDD(p, Cudd_Not(node));
  400. } // BDD::operator~
  401. BDD
  402. BDD::operator*(
  403. const BDD& other) const
  404. {
  405. DdManager *mgr = checkSameManager(other);
  406. DdNode *result = Cudd_bddAnd(mgr,node,other.node);
  407. checkReturnValue(result);
  408. return BDD(p, result);
  409. } // BDD::operator*
  410. BDD
  411. BDD::operator*=(
  412. const BDD& other)
  413. {
  414. DdManager *mgr = checkSameManager(other);
  415. DdNode *result = Cudd_bddAnd(mgr,node,other.node);
  416. checkReturnValue(result);
  417. Cudd_Ref(result);
  418. Cudd_RecursiveDeref(mgr,node);
  419. node = result;
  420. return *this;
  421. } // BDD::operator*=
  422. BDD
  423. BDD::operator&(
  424. const BDD& other) const
  425. {
  426. DdManager *mgr = checkSameManager(other);
  427. DdNode *result = Cudd_bddAnd(mgr,node,other.node);
  428. checkReturnValue(result);
  429. return BDD(p, result);
  430. } // BDD::operator&
  431. BDD
  432. BDD::operator&=(
  433. const BDD& other)
  434. {
  435. DdManager *mgr = checkSameManager(other);
  436. DdNode *result = Cudd_bddAnd(mgr,node,other.node);
  437. checkReturnValue(result);
  438. Cudd_Ref(result);
  439. Cudd_RecursiveDeref(mgr,node);
  440. node = result;
  441. return *this;
  442. } // BDD::operator&=
  443. BDD
  444. BDD::operator+(
  445. const BDD& other) const
  446. {
  447. DdManager *mgr = checkSameManager(other);
  448. DdNode *result = Cudd_bddOr(mgr,node,other.node);
  449. checkReturnValue(result);
  450. return BDD(p, result);
  451. } // BDD::operator+
  452. BDD
  453. BDD::operator+=(
  454. const BDD& other)
  455. {
  456. DdManager *mgr = checkSameManager(other);
  457. DdNode *result = Cudd_bddOr(mgr,node,other.node);
  458. checkReturnValue(result);
  459. Cudd_Ref(result);
  460. Cudd_RecursiveDeref(mgr,node);
  461. node = result;
  462. return *this;
  463. } // BDD::operator+=
  464. BDD
  465. BDD::operator|(
  466. const BDD& other) const
  467. {
  468. DdManager *mgr = checkSameManager(other);
  469. DdNode *result = Cudd_bddOr(mgr,node,other.node);
  470. checkReturnValue(result);
  471. return BDD(p, result);
  472. } // BDD::operator|
  473. BDD
  474. BDD::operator|=(
  475. const BDD& other)
  476. {
  477. DdManager *mgr = checkSameManager(other);
  478. DdNode *result = Cudd_bddOr(mgr,node,other.node);
  479. checkReturnValue(result);
  480. Cudd_Ref(result);
  481. Cudd_RecursiveDeref(mgr,node);
  482. node = result;
  483. return *this;
  484. } // BDD::operator|=
  485. BDD
  486. BDD::operator^(
  487. const BDD& other) const
  488. {
  489. DdManager *mgr = checkSameManager(other);
  490. DdNode *result = Cudd_bddXor(mgr,node,other.node);
  491. checkReturnValue(result);
  492. return BDD(p, result);
  493. } // BDD::operator^
  494. BDD
  495. BDD::operator^=(
  496. const BDD& other)
  497. {
  498. DdManager *mgr = checkSameManager(other);
  499. DdNode *result = Cudd_bddXor(mgr,node,other.node);
  500. checkReturnValue(result);
  501. Cudd_Ref(result);
  502. Cudd_RecursiveDeref(mgr,node);
  503. node = result;
  504. return *this;
  505. } // BDD::operator^=
  506. BDD
  507. BDD::operator-(
  508. const BDD& other) const
  509. {
  510. DdManager *mgr = checkSameManager(other);
  511. DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node));
  512. checkReturnValue(result);
  513. return BDD(p, result);
  514. } // BDD::operator-
  515. BDD
  516. BDD::operator-=(
  517. const BDD& other)
  518. {
  519. DdManager *mgr = checkSameManager(other);
  520. DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node));
  521. checkReturnValue(result);
  522. Cudd_Ref(result);
  523. Cudd_RecursiveDeref(mgr,node);
  524. node = result;
  525. return *this;
  526. } // BDD::operator-=
  527. ostream & operator<<(ostream & os, BDD const & f)
  528. {
  529. if (!f.node) defaultError("empty DD.");
  530. DdManager *mgr = f.p->manager;
  531. vector<char *> const & vn = f.p->varnames;
  532. char const * const *inames = vn.size() == (size_t) Cudd_ReadSize(mgr) ?
  533. &vn[0] : 0;
  534. char * str = Cudd_FactoredFormString(mgr, f.node, inames);
  535. f.checkReturnValue(str);
  536. os << string(str);
  537. free(str);
  538. return os;
  539. } // operator<<
  540. bool
  541. BDD::IsZero() const
  542. {
  543. return node == Cudd_ReadLogicZero(p->manager);
  544. } // BDD::IsZero
  545. bool
  546. BDD::IsVar() const
  547. {
  548. return Cudd_bddIsVar(p->manager, node);
  549. } // BDD::IsVar
  550. // ---------------------------------------------------------------------------
  551. // Members of class ADD
  552. // ---------------------------------------------------------------------------
  553. ADD::ADD() : ABDD() {}
  554. ADD::ADD(Capsule *cap, DdNode *bddNode) : ABDD(cap,bddNode) {}
  555. ADD::ADD(Cudd const & manager, DdNode *bddNode) : ABDD(manager,bddNode) {}
  556. ADD::ADD(const ADD &from) : ABDD(from) {}
  557. ADD
  558. ADD::operator=(
  559. const ADD& right)
  560. {
  561. if (this == &right) return *this;
  562. if (right.node) Cudd_Ref(right.node);
  563. if (node) {
  564. Cudd_RecursiveDeref(p->manager,node);
  565. }
  566. node = right.node;
  567. p = right.p;
  568. return *this;
  569. } // ADD::operator=
  570. bool
  571. ADD::operator<=(
  572. const ADD& other) const
  573. {
  574. DdManager *mgr = checkSameManager(other);
  575. return Cudd_addLeq(mgr,node,other.node);
  576. } // ADD::operator<=
  577. bool
  578. ADD::operator>=(
  579. const ADD& other) const
  580. {
  581. DdManager *mgr = checkSameManager(other);
  582. return Cudd_addLeq(mgr,other.node,node);
  583. } // ADD::operator>=
  584. bool
  585. ADD::operator<(
  586. const ADD& other) const
  587. {
  588. DdManager *mgr = checkSameManager(other);
  589. return node != other.node && Cudd_addLeq(mgr,node,other.node);
  590. } // ADD::operator<
  591. bool
  592. ADD::operator>(
  593. const ADD& other) const
  594. {
  595. DdManager *mgr = checkSameManager(other);
  596. return node != other.node && Cudd_addLeq(mgr,other.node,node);
  597. } // ADD::operator>
  598. ADD
  599. ADD::operator-() const
  600. {
  601. return ADD(p, Cudd_addNegate(p->manager,node));
  602. } // ADD::operator-
  603. ADD
  604. ADD::operator*(
  605. const ADD& other) const
  606. {
  607. DdManager *mgr = checkSameManager(other);
  608. DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
  609. checkReturnValue(result);
  610. return ADD(p, result);
  611. } // ADD::operator*
  612. ADD
  613. ADD::operator*=(
  614. const ADD& other)
  615. {
  616. DdManager *mgr = checkSameManager(other);
  617. DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
  618. checkReturnValue(result);
  619. Cudd_Ref(result);
  620. Cudd_RecursiveDeref(mgr,node);
  621. node = result;
  622. return *this;
  623. } // ADD::operator*=
  624. ADD
  625. ADD::operator+(
  626. const ADD& other) const
  627. {
  628. DdManager *mgr = checkSameManager(other);
  629. DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node);
  630. checkReturnValue(result);
  631. return ADD(p, result);
  632. } // ADD::operator+
  633. ADD
  634. ADD::operator+=(
  635. const ADD& other)
  636. {
  637. DdManager *mgr = checkSameManager(other);
  638. DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node);
  639. checkReturnValue(result);
  640. Cudd_Ref(result);
  641. Cudd_RecursiveDeref(mgr,node);
  642. node = result;
  643. return *this;
  644. } // ADD::operator+=
  645. ADD
  646. ADD::operator-(
  647. const ADD& other) const
  648. {
  649. DdManager *mgr = checkSameManager(other);
  650. DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node);
  651. checkReturnValue(result);
  652. return ADD(p, result);
  653. } // ADD::operator-
  654. ADD
  655. ADD::operator-=(
  656. const ADD& other)
  657. {
  658. DdManager *mgr = checkSameManager(other);
  659. DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node);
  660. checkReturnValue(result);
  661. Cudd_Ref(result);
  662. Cudd_RecursiveDeref(mgr,node);
  663. node = result;
  664. return *this;
  665. } // ADD::operator-=
  666. ADD
  667. ADD::operator~() const
  668. {
  669. return ADD(p, Cudd_addCmpl(p->manager,node));
  670. } // ADD::operator~
  671. ADD
  672. ADD::operator&(
  673. const ADD& other) const
  674. {
  675. DdManager *mgr = checkSameManager(other);
  676. DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
  677. checkReturnValue(result);
  678. return ADD(p, result);
  679. } // ADD::operator&
  680. ADD
  681. ADD::operator&=(
  682. const ADD& other)
  683. {
  684. DdManager *mgr = checkSameManager(other);
  685. DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
  686. checkReturnValue(result);
  687. Cudd_Ref(result);
  688. Cudd_RecursiveDeref(mgr,node);
  689. node = result;
  690. return *this;
  691. } // ADD::operator&=
  692. ADD
  693. ADD::operator|(
  694. const ADD& other) const
  695. {
  696. DdManager *mgr = checkSameManager(other);
  697. DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node);
  698. checkReturnValue(result);
  699. return ADD(p, result);
  700. } // ADD::operator|
  701. ADD
  702. ADD::operator|=(
  703. const ADD& other)
  704. {
  705. DdManager *mgr = checkSameManager(other);
  706. DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node);
  707. checkReturnValue(result);
  708. Cudd_Ref(result);
  709. Cudd_RecursiveDeref(mgr,node);
  710. node = result;
  711. return *this;
  712. } // ADD::operator|=
  713. bool
  714. ADD::IsZero() const
  715. {
  716. return node == Cudd_ReadZero(p->manager);
  717. } // ADD::IsZero
  718. // ---------------------------------------------------------------------------
  719. // Members of class ZDD
  720. // ---------------------------------------------------------------------------
  721. ZDD::ZDD(Capsule *cap, DdNode *bddNode) : DD(cap,bddNode) {}
  722. ZDD::ZDD() : DD() {}
  723. ZDD::ZDD(const ZDD &from) : DD(from) {}
  724. ZDD::~ZDD() {
  725. if (node) {
  726. Cudd_RecursiveDerefZdd(p->manager,node);
  727. if (p->verbose) {
  728. cout << "ZDD destructor called for node " << hex << node << dec <<
  729. " ref = " << Cudd_Regular(node)->ref << "\n";
  730. }
  731. }
  732. } // ZDD::~ZDD
  733. ZDD
  734. ZDD::operator=(
  735. const ZDD& right)
  736. {
  737. if (this == &right) return *this;
  738. if (right.node) Cudd_Ref(right.node);
  739. if (node) {
  740. Cudd_RecursiveDerefZdd(p->manager,node);
  741. if (p->verbose) {
  742. cout << "ZDD dereferencing for node " << hex << node << dec <<
  743. " ref = " << node->ref << "\n";
  744. }
  745. }
  746. node = right.node;
  747. p = right.p;
  748. if (node && p->verbose) {
  749. cout << "ZDD assignment for node " << hex << node << dec <<
  750. " ref = " << node->ref << "\n";
  751. }
  752. return *this;
  753. } // ZDD::operator=
  754. bool
  755. ZDD::operator==(
  756. const ZDD& other) const
  757. {
  758. checkSameManager(other);
  759. return node == other.node;
  760. } // ZDD::operator==
  761. bool
  762. ZDD::operator!=(
  763. const ZDD& other) const
  764. {
  765. checkSameManager(other);
  766. return node != other.node;
  767. } // ZDD::operator!=
  768. bool
  769. ZDD::operator<=(
  770. const ZDD& other) const
  771. {
  772. DdManager *mgr = checkSameManager(other);
  773. return Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr);
  774. } // ZDD::operator<=
  775. bool
  776. ZDD::operator>=(
  777. const ZDD& other) const
  778. {
  779. DdManager *mgr = checkSameManager(other);
  780. return Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr);
  781. } // ZDD::operator>=
  782. bool
  783. ZDD::operator<(
  784. const ZDD& other) const
  785. {
  786. DdManager *mgr = checkSameManager(other);
  787. return node != other.node &&
  788. Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr);
  789. } // ZDD::operator<
  790. bool
  791. ZDD::operator>(
  792. const ZDD& other) const
  793. {
  794. DdManager *mgr = checkSameManager(other);
  795. return node != other.node &&
  796. Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr);
  797. } // ZDD::operator>
  798. void
  799. ZDD::print(
  800. int nvars,
  801. int verbosity) const
  802. {
  803. cout.flush();
  804. int retval = Cudd_zddPrintDebug(p->manager,node,nvars,verbosity);
  805. fflush(Cudd_ReadStdout(p->manager));
  806. if (retval == 0) p->errorHandler("print failed");
  807. } // ZDD::print
  808. ZDD
  809. ZDD::operator*(
  810. const ZDD& other) const
  811. {
  812. DdManager *mgr = checkSameManager(other);
  813. DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
  814. checkReturnValue(result);
  815. return ZDD(p, result);
  816. } // ZDD::operator*
  817. ZDD
  818. ZDD::operator*=(
  819. const ZDD& other)
  820. {
  821. DdManager *mgr = checkSameManager(other);
  822. DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
  823. checkReturnValue(result);
  824. Cudd_Ref(result);
  825. Cudd_RecursiveDerefZdd(mgr,node);
  826. node = result;
  827. return *this;
  828. } // ZDD::operator*=
  829. ZDD
  830. ZDD::operator&(
  831. const ZDD& other) const
  832. {
  833. DdManager *mgr = checkSameManager(other);
  834. DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
  835. checkReturnValue(result);
  836. return ZDD(p, result);
  837. } // ZDD::operator&
  838. ZDD
  839. ZDD::operator&=(
  840. const ZDD& other)
  841. {
  842. DdManager *mgr = checkSameManager(other);
  843. DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
  844. checkReturnValue(result);
  845. Cudd_Ref(result);
  846. Cudd_RecursiveDerefZdd(mgr,node);
  847. node = result;
  848. return *this;
  849. } // ZDD::operator&=
  850. ZDD
  851. ZDD::operator+(
  852. const ZDD& other) const
  853. {
  854. DdManager *mgr = checkSameManager(other);
  855. DdNode *result = Cudd_zddUnion(mgr,node,other.node);
  856. checkReturnValue(result);
  857. return ZDD(p, result);
  858. } // ZDD::operator+
  859. ZDD
  860. ZDD::operator+=(
  861. const ZDD& other)
  862. {
  863. DdManager *mgr = checkSameManager(other);
  864. DdNode *result = Cudd_zddUnion(mgr,node,other.node);
  865. checkReturnValue(result);
  866. Cudd_Ref(result);
  867. Cudd_RecursiveDerefZdd(mgr,node);
  868. node = result;
  869. return *this;
  870. } // ZDD::operator+=
  871. ZDD
  872. ZDD::operator|(
  873. const ZDD& other) const
  874. {
  875. DdManager *mgr = checkSameManager(other);
  876. DdNode *result = Cudd_zddUnion(mgr,node,other.node);
  877. checkReturnValue(result);
  878. return ZDD(p, result);
  879. } // ZDD::operator|
  880. ZDD
  881. ZDD::operator|=(
  882. const ZDD& other)
  883. {
  884. DdManager *mgr = checkSameManager(other);
  885. DdNode *result = Cudd_zddUnion(mgr,node,other.node);
  886. checkReturnValue(result);
  887. Cudd_Ref(result);
  888. Cudd_RecursiveDerefZdd(mgr,node);
  889. node = result;
  890. return *this;
  891. } // ZDD::operator|=
  892. ZDD
  893. ZDD::operator-(
  894. const ZDD& other) const
  895. {
  896. DdManager *mgr = checkSameManager(other);
  897. DdNode *result = Cudd_zddDiff(mgr,node,other.node);
  898. checkReturnValue(result);
  899. return ZDD(p, result);
  900. } // ZDD::operator-
  901. ZDD
  902. ZDD::operator-=(
  903. const ZDD& other)
  904. {
  905. DdManager *mgr = checkSameManager(other);
  906. DdNode *result = Cudd_zddDiff(mgr,node,other.node);
  907. checkReturnValue(result);
  908. Cudd_Ref(result);
  909. Cudd_RecursiveDerefZdd(mgr,node);
  910. node = result;
  911. return *this;
  912. } // ZDD::operator-=
  913. // ---------------------------------------------------------------------------
  914. // Members of class Cudd
  915. // ---------------------------------------------------------------------------
  916. Cudd::Cudd(
  917. unsigned int numVars,
  918. unsigned int numVarsZ,
  919. unsigned int numSlots,
  920. unsigned int cacheSize,
  921. unsigned long maxMemory,
  922. PFC defaultHandler)
  923. {
  924. p = new Capsule(numVars,numVarsZ,numSlots,cacheSize,maxMemory,defaultHandler);
  925. } // Cudd::Cudd
  926. Cudd::Cudd(
  927. const Cudd& x)
  928. {
  929. p = x.p;
  930. x.p->ref++;
  931. if (p->verbose)
  932. cout << "Cudd Copy Constructor" << endl;
  933. } // Cudd::Cudd
  934. Cudd::~Cudd()
  935. {
  936. if (--p->ref == 0) {
  937. delete p;
  938. }
  939. } // Cudd::~Cudd
  940. DdManager *
  941. Cudd::getManager(void) const
  942. {
  943. return p->manager;
  944. } // Cudd::getManager
  945. void
  946. Cudd::makeVerbose(void) const
  947. {
  948. p->verbose = 1;
  949. } // Cudd::makeVerbose
  950. void
  951. Cudd::makeTerse(void) const
  952. {
  953. p->verbose = 0;
  954. } // Cudd::makeTerse
  955. bool
  956. Cudd::isVerbose(void) const
  957. {
  958. return p->verbose;
  959. } // Cudd::isVerbose
  960. Cudd&
  961. Cudd::operator=(
  962. const Cudd& right)
  963. {
  964. right.p->ref++;
  965. if (--p->ref == 0) { // disconnect self
  966. delete p;
  967. }
  968. p = right.p;
  969. return *this;
  970. } // Cudd::operator=
  971. PFC
  972. Cudd::setHandler(
  973. PFC newHandler) const
  974. {
  975. PFC oldHandler = p->errorHandler;
  976. p->errorHandler = newHandler;
  977. return oldHandler;
  978. } // Cudd::setHandler
  979. PFC
  980. Cudd::getHandler() const
  981. {
  982. return p->errorHandler;
  983. } // Cudd::getHandler
  984. PFC
  985. Cudd::setTimeoutHandler(
  986. PFC newHandler) const
  987. {
  988. PFC oldHandler = p->timeoutHandler;
  989. p->timeoutHandler = newHandler;
  990. return oldHandler;
  991. } // Cudd::setTimeoutHandler
  992. PFC
  993. Cudd::getTimeoutHandler() const
  994. {
  995. return p->timeoutHandler;
  996. } // Cudd::getTimeourHandler
  997. PFC
  998. Cudd::setTerminationHandler(
  999. PFC newHandler) const
  1000. {
  1001. PFC oldHandler = p->terminationHandler;
  1002. p->terminationHandler = newHandler;
  1003. return oldHandler;
  1004. } // Cudd::setTerminationHandler
  1005. PFC
  1006. Cudd::getTerminationHandler() const
  1007. {
  1008. return p->terminationHandler;
  1009. } // Cudd::getTerminationHandler
  1010. void
  1011. Cudd::pushVariableName(std::string s) const
  1012. {
  1013. char * cstr = new char[s.length() + 1];
  1014. strcpy(cstr, s.c_str());
  1015. p->varnames.push_back(cstr);
  1016. }
  1017. void
  1018. Cudd::clearVariableNames(void) const
  1019. {
  1020. for (vector<char *>::iterator it = p->varnames.begin();
  1021. it != p->varnames.end(); ++it) {
  1022. delete [] *it;
  1023. }
  1024. p->varnames.clear();
  1025. }
  1026. std::string
  1027. Cudd::getVariableName(size_t i) const
  1028. {
  1029. return std::string(p->varnames.at(i));
  1030. }
  1031. inline void
  1032. Cudd::checkReturnValue(
  1033. const void *result) const
  1034. {
  1035. if (result == 0) {
  1036. if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) {
  1037. p->errorHandler("Out of memory.");
  1038. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TOO_MANY_NODES) {
  1039. p->errorHandler("Too many nodes.");
  1040. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_MAX_MEM_EXCEEDED) {
  1041. p->errorHandler("Maximum memory exceeded.");
  1042. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TIMEOUT_EXPIRED) {
  1043. std::ostringstream msg;
  1044. DdManager *mgr = p->manager;
  1045. unsigned long lag =
  1046. Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
  1047. msg << "Timeout expired. Lag = " << lag << " ms.\n";
  1048. p->timeoutHandler(msg.str());
  1049. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TERMINATION) {
  1050. std::ostringstream msg;
  1051. msg << "Terminated.\n";
  1052. p->terminationHandler(msg.str());
  1053. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INVALID_ARG) {
  1054. p->errorHandler("Invalid argument.");
  1055. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INTERNAL_ERROR) {
  1056. p->errorHandler("Internal error.");
  1057. } else {
  1058. p->errorHandler("Unexpected error.");
  1059. }
  1060. }
  1061. } // Cudd::checkReturnValue
  1062. inline void
  1063. Cudd::checkReturnValue(
  1064. const int result) const
  1065. {
  1066. if (result == 0) {
  1067. if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) {
  1068. p->errorHandler("Out of memory.");
  1069. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TOO_MANY_NODES) {
  1070. p->errorHandler("Too many nodes.");
  1071. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_MAX_MEM_EXCEEDED) {
  1072. p->errorHandler("Maximum memory exceeded.");
  1073. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TIMEOUT_EXPIRED) {
  1074. std::ostringstream msg;
  1075. DdManager *mgr = p->manager;
  1076. unsigned long lag =
  1077. Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
  1078. msg << "Timeout expired. Lag = " << lag << " ms.\n";
  1079. p->timeoutHandler(msg.str());
  1080. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TERMINATION) {
  1081. std::ostringstream msg;
  1082. msg << "Terminated.\n";
  1083. p->terminationHandler(msg.str());
  1084. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INVALID_ARG) {
  1085. p->errorHandler("Invalid argument.");
  1086. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INTERNAL_ERROR) {
  1087. p->errorHandler("Internal error.");
  1088. } else {
  1089. p->errorHandler("Unexpected error.");
  1090. }
  1091. }
  1092. } // Cudd::checkReturnValue
  1093. void
  1094. Cudd::info() const
  1095. {
  1096. cout.flush();
  1097. int retval = Cudd_PrintInfo(p->manager,stdout);
  1098. checkReturnValue(retval);
  1099. } // Cudd::info
  1100. BDD
  1101. Cudd::bddVar() const
  1102. {
  1103. DdNode *result = Cudd_bddNewVar(p->manager);
  1104. checkReturnValue(result);
  1105. return BDD(p, result);
  1106. } // Cudd::bddVar
  1107. BDD
  1108. Cudd::bddVar(
  1109. int index) const
  1110. {
  1111. DdNode *result = Cudd_bddIthVar(p->manager,index);
  1112. checkReturnValue(result);
  1113. return BDD(p, result);
  1114. } // Cudd::bddVar
  1115. BDD
  1116. Cudd::bddOne() const
  1117. {
  1118. DdNode *result = Cudd_ReadOne(p->manager);
  1119. checkReturnValue(result);
  1120. return BDD(p, result);
  1121. } // Cudd::bddOne
  1122. BDD
  1123. Cudd::bddZero() const
  1124. {
  1125. DdNode *result = Cudd_ReadLogicZero(p->manager);
  1126. checkReturnValue(result);
  1127. return BDD(p, result);
  1128. } // Cudd::bddZero
  1129. ADD
  1130. Cudd::addVar() const
  1131. {
  1132. DdNode *result = Cudd_addNewVar(p->manager);
  1133. checkReturnValue(result);
  1134. return ADD(p, result);
  1135. } // Cudd::addVar
  1136. ADD
  1137. Cudd::addVar(
  1138. int index) const
  1139. {
  1140. DdNode *result = Cudd_addIthVar(p->manager,index);
  1141. checkReturnValue(result);
  1142. return ADD(p, result);
  1143. } // Cudd::addVar
  1144. ADD
  1145. Cudd::addOne() const
  1146. {
  1147. DdNode *result = Cudd_ReadOne(p->manager);
  1148. checkReturnValue(result);
  1149. return ADD(p, result);
  1150. } // Cudd::addOne
  1151. ADD
  1152. Cudd::addZero() const
  1153. {
  1154. DdNode *result = Cudd_ReadZero(p->manager);
  1155. checkReturnValue(result);
  1156. return ADD(p, result);
  1157. } // Cudd::addZero
  1158. ADD
  1159. Cudd::constant(
  1160. CUDD_VALUE_TYPE c) const
  1161. {
  1162. DdNode *result = Cudd_addConst(p->manager, c);
  1163. checkReturnValue(result);
  1164. return ADD(p, result);
  1165. } // Cudd::constant
  1166. ADD
  1167. Cudd::plusInfinity() const
  1168. {
  1169. DdNode *result = Cudd_ReadPlusInfinity(p->manager);
  1170. checkReturnValue(result);
  1171. return ADD(p, result);
  1172. } // Cudd::plusInfinity
  1173. ADD
  1174. Cudd::minusInfinity() const
  1175. {
  1176. DdNode *result = Cudd_ReadMinusInfinity(p->manager);
  1177. checkReturnValue(result);
  1178. return ADD(p, result);
  1179. } // Cudd::minusInfinity
  1180. ZDD
  1181. Cudd::zddVar(
  1182. int index) const
  1183. {
  1184. DdNode *result = Cudd_zddIthVar(p->manager,index);
  1185. checkReturnValue(result);
  1186. return ZDD(p, result);
  1187. } // Cudd::zddVar
  1188. ZDD
  1189. Cudd::zddOne(
  1190. int i) const
  1191. {
  1192. DdNode *result = Cudd_ReadZddOne(p->manager,i);
  1193. checkReturnValue(result);
  1194. return ZDD(p, result);
  1195. } // Cudd::zddOne
  1196. ZDD
  1197. Cudd::zddZero() const
  1198. {
  1199. DdNode *result = Cudd_ReadZero(p->manager);
  1200. checkReturnValue(result);
  1201. return ZDD(p, result);
  1202. } // Cudd::zddZero
  1203. void
  1204. defaultError(
  1205. string message)
  1206. {
  1207. throw std::logic_error(message);
  1208. } // defaultError
  1209. // ---------------------------------------------------------------------------
  1210. // All the rest
  1211. // ---------------------------------------------------------------------------
  1212. ADD
  1213. Cudd::addNewVarAtLevel(
  1214. int level) const
  1215. {
  1216. DdNode *result = Cudd_addNewVarAtLevel(p->manager, level);
  1217. checkReturnValue(result);
  1218. return ADD(p, result);
  1219. } // Cudd::addNewVarAtLevel
  1220. BDD
  1221. Cudd::bddNewVarAtLevel(
  1222. int level) const
  1223. {
  1224. DdNode *result = Cudd_bddNewVarAtLevel(p->manager, level);
  1225. checkReturnValue(result);
  1226. return BDD(p, result);
  1227. } // Cudd::bddNewVarAtLevel
  1228. void
  1229. Cudd::zddVarsFromBddVars(
  1230. int multiplicity) const
  1231. {
  1232. int result = Cudd_zddVarsFromBddVars(p->manager, multiplicity);
  1233. checkReturnValue(result);
  1234. } // Cudd::zddVarsFromBddVars
  1235. unsigned long
  1236. Cudd::ReadStartTime() const
  1237. {
  1238. return Cudd_ReadStartTime(p->manager);
  1239. } // Cudd::ReadStartTime
  1240. unsigned long
  1241. Cudd::ReadElapsedTime() const
  1242. {
  1243. return Cudd_ReadElapsedTime(p->manager);
  1244. } // Cudd::ReadElapsedTime
  1245. void
  1246. Cudd::SetStartTime(
  1247. unsigned long st) const
  1248. {
  1249. Cudd_SetStartTime(p->manager, st);
  1250. } // Cudd::SetStartTime
  1251. void
  1252. Cudd::ResetStartTime() const
  1253. {
  1254. Cudd_ResetStartTime(p->manager);
  1255. } // Cudd::ResetStartTime
  1256. unsigned long
  1257. Cudd::ReadTimeLimit() const
  1258. {
  1259. return Cudd_ReadTimeLimit(p->manager);
  1260. } // Cudd::ReadTimeLimit
  1261. unsigned long
  1262. Cudd::SetTimeLimit(
  1263. unsigned long tl) const
  1264. {
  1265. return Cudd_SetTimeLimit(p->manager, tl);
  1266. } // Cudd::SetTimeLimit
  1267. void
  1268. Cudd::UpdateTimeLimit() const
  1269. {
  1270. Cudd_UpdateTimeLimit(p->manager);
  1271. } // Cudd::UpdateTimeLimit
  1272. void
  1273. Cudd::IncreaseTimeLimit(
  1274. unsigned long increase) const
  1275. {
  1276. Cudd_IncreaseTimeLimit(p->manager, increase);
  1277. } // Cudd::IncreaseTimeLimit
  1278. void
  1279. Cudd::UnsetTimeLimit() const
  1280. {
  1281. Cudd_UnsetTimeLimit(p->manager);
  1282. } // Cudd::UnsetTimeLimit
  1283. bool
  1284. Cudd::TimeLimited() const
  1285. {
  1286. return Cudd_TimeLimited(p->manager);
  1287. } // Cudd::TimeLimited
  1288. void
  1289. Cudd::RegisterTerminationCallback(
  1290. DD_THFP callback,
  1291. void * callback_arg) const
  1292. {
  1293. Cudd_RegisterTerminationCallback(p->manager, callback, callback_arg);
  1294. } // Cudd::RegisterTerminationCallback
  1295. void
  1296. Cudd::UnregisterTerminationCallback() const
  1297. {
  1298. Cudd_UnregisterTerminationCallback(p->manager);
  1299. } // Cudd::UnregisterTerminationCallback
  1300. DD_OOMFP
  1301. Cudd::RegisterOutOfMemoryCallback(
  1302. DD_OOMFP callback) const
  1303. {
  1304. return Cudd_RegisterOutOfMemoryCallback(p->manager, callback);
  1305. } // Cudd::RegisterOutOfMemoryCallback
  1306. void
  1307. Cudd::UnregisterOutOfMemoryCallback() const
  1308. {
  1309. Cudd_UnregisterOutOfMemoryCallback(p->manager);
  1310. } // Cudd::UnregisterOutOfMemoryCallback
  1311. void
  1312. Cudd::AutodynEnable(
  1313. Cudd_ReorderingType method) const
  1314. {
  1315. Cudd_AutodynEnable(p->manager, method);
  1316. } // Cudd::AutodynEnable
  1317. void
  1318. Cudd::AutodynDisable() const
  1319. {
  1320. Cudd_AutodynDisable(p->manager);
  1321. } // Cudd::AutodynDisable
  1322. bool
  1323. Cudd::ReorderingStatus(
  1324. Cudd_ReorderingType * method) const
  1325. {
  1326. return Cudd_ReorderingStatus(p->manager, method);
  1327. } // Cudd::ReorderingStatus
  1328. void
  1329. Cudd::AutodynEnableZdd(
  1330. Cudd_ReorderingType method) const
  1331. {
  1332. Cudd_AutodynEnableZdd(p->manager, method);
  1333. } // Cudd::AutodynEnableZdd
  1334. void
  1335. Cudd::AutodynDisableZdd() const
  1336. {
  1337. Cudd_AutodynDisableZdd(p->manager);
  1338. } // Cudd::AutodynDisableZdd
  1339. bool
  1340. Cudd::ReorderingStatusZdd(
  1341. Cudd_ReorderingType * method) const
  1342. {
  1343. return Cudd_ReorderingStatusZdd(p->manager, method);
  1344. } // Cudd::ReorderingStatusZdd
  1345. bool
  1346. Cudd::zddRealignmentEnabled() const
  1347. {
  1348. return Cudd_zddRealignmentEnabled(p->manager);
  1349. } // Cudd::zddRealignmentEnabled
  1350. void
  1351. Cudd::zddRealignEnable() const
  1352. {
  1353. Cudd_zddRealignEnable(p->manager);
  1354. } // Cudd::zddRealignEnable
  1355. void
  1356. Cudd::zddRealignDisable() const
  1357. {
  1358. Cudd_zddRealignDisable(p->manager);
  1359. } // Cudd::zddRealignDisable
  1360. bool
  1361. Cudd::bddRealignmentEnabled() const
  1362. {
  1363. return Cudd_bddRealignmentEnabled(p->manager);
  1364. } // Cudd::bddRealignmentEnabled
  1365. void
  1366. Cudd::bddRealignEnable() const
  1367. {
  1368. Cudd_bddRealignEnable(p->manager);
  1369. } // Cudd::bddRealignEnable
  1370. void
  1371. Cudd::bddRealignDisable() const
  1372. {
  1373. Cudd_bddRealignDisable(p->manager);
  1374. } // Cudd::bddRealignDisable
  1375. ADD
  1376. Cudd::background() const
  1377. {
  1378. DdNode *result = Cudd_ReadBackground(p->manager);
  1379. checkReturnValue(result);
  1380. return ADD(p, result);
  1381. } // Cudd::background
  1382. void
  1383. Cudd::SetBackground(
  1384. ADD bg) const
  1385. {
  1386. DdManager *mgr = p->manager;
  1387. if (mgr != bg.manager()) {
  1388. p->errorHandler("Background comes from different manager.");
  1389. }
  1390. Cudd_SetBackground(mgr, bg.getNode());
  1391. } // Cudd::SetBackground
  1392. unsigned int
  1393. Cudd::ReadCacheSlots() const
  1394. {
  1395. return Cudd_ReadCacheSlots(p->manager);
  1396. } // Cudd::ReadCacheSlots
  1397. double
  1398. Cudd::ReadCacheLookUps() const
  1399. {
  1400. return Cudd_ReadCacheLookUps(p->manager);
  1401. } // Cudd::ReadCacheLookUps
  1402. double
  1403. Cudd::ReadCacheUsedSlots() const
  1404. {
  1405. return Cudd_ReadCacheUsedSlots(p->manager);
  1406. } // Cudd::ReadCacheUsedSlots
  1407. double
  1408. Cudd::ReadCacheHits() const
  1409. {
  1410. return Cudd_ReadCacheHits(p->manager);
  1411. } // Cudd::ReadCacheHits
  1412. unsigned int
  1413. Cudd::ReadMinHit() const
  1414. {
  1415. return Cudd_ReadMinHit(p->manager);
  1416. } // Cudd::ReadMinHit
  1417. void
  1418. Cudd::SetMinHit(
  1419. unsigned int hr) const
  1420. {
  1421. Cudd_SetMinHit(p->manager, hr);
  1422. } // Cudd::SetMinHit
  1423. unsigned int
  1424. Cudd::ReadLooseUpTo() const
  1425. {
  1426. return Cudd_ReadLooseUpTo(p->manager);
  1427. } // Cudd::ReadLooseUpTo
  1428. void
  1429. Cudd::SetLooseUpTo(
  1430. unsigned int lut) const
  1431. {
  1432. Cudd_SetLooseUpTo(p->manager, lut);
  1433. } // Cudd::SetLooseUpTo
  1434. unsigned int
  1435. Cudd::ReadMaxCache() const
  1436. {
  1437. return Cudd_ReadMaxCache(p->manager);
  1438. } // Cudd::ReadMaxCache
  1439. unsigned int
  1440. Cudd::ReadMaxCacheHard() const
  1441. {
  1442. return Cudd_ReadMaxCacheHard(p->manager);
  1443. } // Cudd::ReadMaxCacheHard
  1444. void
  1445. Cudd::SetMaxCacheHard(
  1446. unsigned int mc) const
  1447. {
  1448. Cudd_SetMaxCacheHard(p->manager, mc);
  1449. } // Cudd::SetMaxCacheHard
  1450. int
  1451. Cudd::ReadSize() const
  1452. {
  1453. return Cudd_ReadSize(p->manager);
  1454. } // Cudd::ReadSize
  1455. int
  1456. Cudd::ReadZddSize() const
  1457. {
  1458. return Cudd_ReadZddSize(p->manager);
  1459. } // Cudd::ReadZddSize
  1460. unsigned int
  1461. Cudd::ReadSlots() const
  1462. {
  1463. return Cudd_ReadSlots(p->manager);
  1464. } // Cudd::ReadSlots
  1465. unsigned int
  1466. Cudd::ReadKeys() const
  1467. {
  1468. return Cudd_ReadKeys(p->manager);
  1469. } // Cudd::ReadKeys
  1470. unsigned int
  1471. Cudd::ReadDead() const
  1472. {
  1473. return Cudd_ReadDead(p->manager);
  1474. } // Cudd::ReadDead
  1475. unsigned int
  1476. Cudd::ReadMinDead() const
  1477. {
  1478. return Cudd_ReadMinDead(p->manager);
  1479. } // Cudd::ReadMinDead
  1480. unsigned int
  1481. Cudd::ReadReorderings() const
  1482. {
  1483. return Cudd_ReadReorderings(p->manager);
  1484. } // Cudd::ReadReorderings
  1485. unsigned int
  1486. Cudd::ReadMaxReorderings() const
  1487. {
  1488. return Cudd_ReadMaxReorderings(p->manager);
  1489. } // Cudd::ReadMaxReorderings
  1490. void
  1491. Cudd::SetMaxReorderings(
  1492. unsigned int mr) const
  1493. {
  1494. Cudd_SetMaxReorderings(p->manager, mr);
  1495. } // Cudd::SetMaxReorderings
  1496. long
  1497. Cudd::ReadReorderingTime() const
  1498. {
  1499. return Cudd_ReadReorderingTime(p->manager);
  1500. } // Cudd::ReadReorderingTime
  1501. int
  1502. Cudd::ReadGarbageCollections() const
  1503. {
  1504. return Cudd_ReadGarbageCollections(p->manager);
  1505. } // Cudd::ReadGarbageCollections
  1506. long
  1507. Cudd::ReadGarbageCollectionTime() const
  1508. {
  1509. return Cudd_ReadGarbageCollectionTime(p->manager);
  1510. } // Cudd::ReadGarbageCollectionTime
  1511. int
  1512. Cudd::ReadSiftMaxVar() const
  1513. {
  1514. return Cudd_ReadSiftMaxVar(p->manager);
  1515. } // Cudd::ReadSiftMaxVar
  1516. void
  1517. Cudd::SetSiftMaxVar(
  1518. int smv) const
  1519. {
  1520. Cudd_SetSiftMaxVar(p->manager, smv);
  1521. } // Cudd::SetSiftMaxVar
  1522. int
  1523. Cudd::ReadSiftMaxSwap() const
  1524. {
  1525. return Cudd_ReadSiftMaxSwap(p->manager);
  1526. } // Cudd::ReadSiftMaxSwap
  1527. void
  1528. Cudd::SetSiftMaxSwap(
  1529. int sms) const
  1530. {
  1531. Cudd_SetSiftMaxSwap(p->manager, sms);
  1532. } // Cudd::SetSiftMaxSwap
  1533. double
  1534. Cudd::ReadMaxGrowth() const
  1535. {
  1536. return Cudd_ReadMaxGrowth(p->manager);
  1537. } // Cudd::ReadMaxGrowth
  1538. void
  1539. Cudd::SetMaxGrowth(
  1540. double mg) const
  1541. {
  1542. Cudd_SetMaxGrowth(p->manager, mg);
  1543. } // Cudd::SetMaxGrowth
  1544. MtrNode *
  1545. Cudd::ReadTree() const
  1546. {
  1547. return Cudd_ReadTree(p->manager);
  1548. } // Cudd::ReadTree
  1549. void
  1550. Cudd::SetTree(
  1551. MtrNode * tree) const
  1552. {
  1553. Cudd_SetTree(p->manager, tree);
  1554. } // Cudd::SetTree
  1555. void
  1556. Cudd::FreeTree() const
  1557. {
  1558. Cudd_FreeTree(p->manager);
  1559. } // Cudd::FreeTree
  1560. MtrNode *
  1561. Cudd::ReadZddTree() const
  1562. {
  1563. return Cudd_ReadZddTree(p->manager);
  1564. } // Cudd::ReadZddTree
  1565. void
  1566. Cudd::SetZddTree(
  1567. MtrNode * tree) const
  1568. {
  1569. Cudd_SetZddTree(p->manager, tree);
  1570. } // Cudd::SetZddTree
  1571. void
  1572. Cudd::FreeZddTree() const
  1573. {
  1574. Cudd_FreeZddTree(p->manager);
  1575. } // Cudd::FreeZddTree
  1576. int
  1577. Cudd::ReadPerm(
  1578. int i) const
  1579. {
  1580. return Cudd_ReadPerm(p->manager, i);
  1581. } // Cudd::ReadPerm
  1582. int
  1583. Cudd::ReadPermZdd(
  1584. int i) const
  1585. {
  1586. return Cudd_ReadPermZdd(p->manager, i);
  1587. } // Cudd::ReadPermZdd
  1588. int
  1589. Cudd::ReadInvPerm(
  1590. int i) const
  1591. {
  1592. return Cudd_ReadInvPerm(p->manager, i);
  1593. } // Cudd::ReadInvPerm
  1594. int
  1595. Cudd::ReadInvPermZdd(
  1596. int i) const
  1597. {
  1598. return Cudd_ReadInvPermZdd(p->manager, i);
  1599. } // Cudd::ReadInvPermZdd
  1600. BDD
  1601. Cudd::ReadVars(
  1602. int i) const
  1603. {
  1604. DdNode *result = Cudd_ReadVars(p->manager, i);
  1605. checkReturnValue(result);
  1606. return BDD(p, result);
  1607. } // Cudd::ReadVars
  1608. CUDD_VALUE_TYPE
  1609. Cudd::ReadEpsilon() const
  1610. {
  1611. return Cudd_ReadEpsilon(p->manager);
  1612. } // Cudd::ReadEpsilon
  1613. void
  1614. Cudd::SetEpsilon(
  1615. CUDD_VALUE_TYPE ep) const
  1616. {
  1617. Cudd_SetEpsilon(p->manager, ep);
  1618. } // Cudd::SetEpsilon
  1619. Cudd_AggregationType
  1620. Cudd::ReadGroupcheck() const
  1621. {
  1622. return Cudd_ReadGroupcheck(p->manager);
  1623. } // Cudd::ReadGroupcheck
  1624. void
  1625. Cudd::SetGroupcheck(
  1626. Cudd_AggregationType gc) const
  1627. {
  1628. Cudd_SetGroupcheck(p->manager, gc);
  1629. } // Cudd::SetGroupcheck
  1630. bool
  1631. Cudd::GarbageCollectionEnabled() const
  1632. {
  1633. return Cudd_GarbageCollectionEnabled(p->manager);
  1634. } // Cudd::GarbageCollectionEnabled
  1635. void
  1636. Cudd::EnableGarbageCollection() const
  1637. {
  1638. Cudd_EnableGarbageCollection(p->manager);
  1639. } // Cudd::EnableGarbageCollection
  1640. void
  1641. Cudd::DisableGarbageCollection() const
  1642. {
  1643. Cudd_DisableGarbageCollection(p->manager);
  1644. } // Cudd::DisableGarbageCollection
  1645. bool
  1646. Cudd::DeadAreCounted() const
  1647. {
  1648. return Cudd_DeadAreCounted(p->manager);
  1649. } // Cudd::DeadAreCounted
  1650. void
  1651. Cudd::TurnOnCountDead() const
  1652. {
  1653. Cudd_TurnOnCountDead(p->manager);
  1654. } // Cudd::TurnOnCountDead
  1655. void
  1656. Cudd::TurnOffCountDead() const
  1657. {
  1658. Cudd_TurnOffCountDead(p->manager);
  1659. } // Cudd::TurnOffCountDead
  1660. int
  1661. Cudd::ReadRecomb() const
  1662. {
  1663. return Cudd_ReadRecomb(p->manager);
  1664. } // Cudd::ReadRecomb
  1665. void
  1666. Cudd::SetRecomb(
  1667. int recomb) const
  1668. {
  1669. Cudd_SetRecomb(p->manager, recomb);
  1670. } // Cudd::SetRecomb
  1671. int
  1672. Cudd::ReadSymmviolation() const
  1673. {
  1674. return Cudd_ReadSymmviolation(p->manager);
  1675. } // Cudd::ReadSymmviolation
  1676. void
  1677. Cudd::SetSymmviolation(
  1678. int symmviolation) const
  1679. {
  1680. Cudd_SetSymmviolation(p->manager, symmviolation);
  1681. } // Cudd::SetSymmviolation
  1682. int
  1683. Cudd::ReadArcviolation() const
  1684. {
  1685. return Cudd_ReadArcviolation(p->manager);
  1686. } // Cudd::ReadArcviolation
  1687. void
  1688. Cudd::SetArcviolation(
  1689. int arcviolation) const
  1690. {
  1691. Cudd_SetArcviolation(p->manager, arcviolation);
  1692. } // Cudd::SetArcviolation
  1693. int
  1694. Cudd::ReadPopulationSize() const
  1695. {
  1696. return Cudd_ReadPopulationSize(p->manager);
  1697. } // Cudd::ReadPopulationSize
  1698. void
  1699. Cudd::SetPopulationSize(
  1700. int populationSize) const
  1701. {
  1702. Cudd_SetPopulationSize(p->manager, populationSize);
  1703. } // Cudd::SetPopulationSize
  1704. int
  1705. Cudd::ReadNumberXovers() const
  1706. {
  1707. return Cudd_ReadNumberXovers(p->manager);
  1708. } // Cudd::ReadNumberXovers
  1709. void
  1710. Cudd::SetNumberXovers(
  1711. int numberXovers) const
  1712. {
  1713. Cudd_SetNumberXovers(p->manager, numberXovers);
  1714. } // Cudd::SetNumberXovers
  1715. unsigned int
  1716. Cudd::ReadOrderRandomization() const
  1717. {
  1718. return Cudd_ReadOrderRandomization(p->manager);
  1719. } // Cudd::ReadOrderRandomization
  1720. void
  1721. Cudd::SetOrderRandomization(
  1722. unsigned int factor) const
  1723. {
  1724. Cudd_SetOrderRandomization(p->manager, factor);
  1725. } // Cudd::SetOrderRandomization
  1726. unsigned long
  1727. Cudd::ReadMemoryInUse() const
  1728. {
  1729. return Cudd_ReadMemoryInUse(p->manager);
  1730. } // Cudd::ReadMemoryInUse
  1731. long
  1732. Cudd::ReadPeakNodeCount() const
  1733. {
  1734. return Cudd_ReadPeakNodeCount(p->manager);
  1735. } // Cudd::ReadPeakNodeCount
  1736. long
  1737. Cudd::ReadNodeCount() const
  1738. {
  1739. return Cudd_ReadNodeCount(p->manager);
  1740. } // Cudd::ReadNodeCount
  1741. long
  1742. Cudd::zddReadNodeCount() const
  1743. {
  1744. return Cudd_zddReadNodeCount(p->manager);
  1745. } // Cudd::zddReadNodeCount
  1746. void
  1747. Cudd::AddHook(
  1748. DD_HFP f,
  1749. Cudd_HookType where) const
  1750. {
  1751. int result = Cudd_AddHook(p->manager, f, where);
  1752. checkReturnValue(result);
  1753. } // Cudd::AddHook
  1754. void
  1755. Cudd::RemoveHook(
  1756. DD_HFP f,
  1757. Cudd_HookType where) const
  1758. {
  1759. int result = Cudd_RemoveHook(p->manager, f, where);
  1760. checkReturnValue(result);
  1761. } // Cudd::RemoveHook
  1762. bool
  1763. Cudd::IsInHook(
  1764. DD_HFP f,
  1765. Cudd_HookType where) const
  1766. {
  1767. return Cudd_IsInHook(p->manager, f, where);
  1768. } // Cudd::IsInHook
  1769. void
  1770. Cudd::EnableReorderingReporting() const
  1771. {
  1772. int result = Cudd_EnableReorderingReporting(p->manager);
  1773. checkReturnValue(result);
  1774. } // Cudd::EnableReorderingReporting
  1775. void
  1776. Cudd::DisableReorderingReporting() const
  1777. {
  1778. int result = Cudd_DisableReorderingReporting(p->manager);
  1779. checkReturnValue(result);
  1780. } // Cudd::DisableReorderingReporting
  1781. bool
  1782. Cudd::ReorderingReporting() const
  1783. {
  1784. return Cudd_ReorderingReporting(p->manager);
  1785. } // Cudd::ReorderingReporting
  1786. int
  1787. Cudd::ReadErrorCode() const
  1788. {
  1789. return Cudd_ReadErrorCode(p->manager);
  1790. } // Cudd::ReadErrorCode
  1791. void
  1792. Cudd::ClearErrorCode() const
  1793. {
  1794. Cudd_ClearErrorCode(p->manager);
  1795. } // Cudd::ClearErrorCode
  1796. DD_OOMFP Cudd::InstallOutOfMemoryHandler(DD_OOMFP newHandler) const
  1797. {
  1798. return Cudd_InstallOutOfMemoryHandler(newHandler);
  1799. } // Cudd::InstallOutOfMemoryHandler
  1800. FILE *
  1801. Cudd::ReadStdout() const
  1802. {
  1803. return Cudd_ReadStdout(p->manager);
  1804. } // Cudd::ReadStdout
  1805. void
  1806. Cudd::SetStdout(FILE *fp) const
  1807. {
  1808. Cudd_SetStdout(p->manager, fp);
  1809. } // Cudd::SetStdout
  1810. FILE *
  1811. Cudd::ReadStderr() const
  1812. {
  1813. return Cudd_ReadStderr(p->manager);
  1814. } // Cudd::ReadStderr
  1815. void
  1816. Cudd::SetStderr(FILE *fp) const
  1817. {
  1818. Cudd_SetStderr(p->manager, fp);
  1819. } // Cudd::SetStderr
  1820. unsigned int
  1821. Cudd::ReadNextReordering() const
  1822. {
  1823. return Cudd_ReadNextReordering(p->manager);
  1824. } // Cudd::ReadNextReordering
  1825. void
  1826. Cudd::SetNextReordering(
  1827. unsigned int next) const
  1828. {
  1829. Cudd_SetNextReordering(p->manager, next);
  1830. } // Cudd::SetNextReordering
  1831. double
  1832. Cudd::ReadSwapSteps() const
  1833. {
  1834. return Cudd_ReadSwapSteps(p->manager);
  1835. } // Cudd::ReadSwapSteps
  1836. unsigned int
  1837. Cudd::ReadMaxLive() const
  1838. {
  1839. return Cudd_ReadMaxLive(p->manager);
  1840. } // Cudd::ReadMaxLive
  1841. void
  1842. Cudd::SetMaxLive(unsigned int maxLive) const
  1843. {
  1844. Cudd_SetMaxLive(p->manager, maxLive);
  1845. } // Cudd::SetMaxLive
  1846. size_t
  1847. Cudd::ReadMaxMemory() const
  1848. {
  1849. return Cudd_ReadMaxMemory(p->manager);
  1850. } // Cudd::ReadMaxMemory
  1851. size_t
  1852. Cudd::SetMaxMemory(size_t maxMem) const
  1853. {
  1854. return Cudd_SetMaxMemory(p->manager, maxMem);
  1855. } // Cudd::SetMaxMemory
  1856. int
  1857. Cudd::bddBindVar(int index) const
  1858. {
  1859. return Cudd_bddBindVar(p->manager, index);
  1860. } // Cudd::bddBindVar
  1861. int
  1862. Cudd::bddUnbindVar(int index) const
  1863. {
  1864. return Cudd_bddUnbindVar(p->manager, index);
  1865. } // Cudd::bddUnbindVar
  1866. bool
  1867. Cudd::bddVarIsBound(int index) const
  1868. {
  1869. return Cudd_bddVarIsBound(p->manager, index);
  1870. } // Cudd::bddVarIsBound
  1871. ADD
  1872. ADD::ExistAbstract(
  1873. const ADD& cube) const
  1874. {
  1875. DdManager *mgr = checkSameManager(cube);
  1876. DdNode *result = Cudd_addExistAbstract(mgr, node, cube.node);
  1877. checkReturnValue(result);
  1878. return ADD(p, result);
  1879. } // ADD::ExistAbstract
  1880. ADD
  1881. ADD::UnivAbstract(
  1882. const ADD& cube) const
  1883. {
  1884. DdManager *mgr = checkSameManager(cube);
  1885. DdNode *result = Cudd_addUnivAbstract(mgr, node, cube.node);
  1886. checkReturnValue(result);
  1887. return ADD(p, result);
  1888. } // ADD::UnivAbstract
  1889. ADD
  1890. ADD::OrAbstract(
  1891. const ADD& cube) const
  1892. {
  1893. DdManager *mgr = checkSameManager(cube);
  1894. DdNode *result = Cudd_addOrAbstract(mgr, node, cube.node);
  1895. checkReturnValue(result);
  1896. return ADD(p, result);
  1897. } // ADD::OrAbstract
  1898. ADD
  1899. ADD::MinAbstract(const ADD& cube) const
  1900. {
  1901. DdManager *mgr = checkSameManager(cube);
  1902. DdNode *result = Cudd_addMinAbstract(mgr, node, cube.node);
  1903. checkReturnValue(result);
  1904. return ADD(p, result);
  1905. } // ADD::MinAbstract
  1906. ADD
  1907. ADD::MaxAbstract(const ADD& cube) const
  1908. {
  1909. DdManager *mgr = checkSameManager(cube);
  1910. DdNode *result = Cudd_addMaxAbstract(mgr, node, cube.node);
  1911. checkReturnValue(result);
  1912. return ADD(p, result);
  1913. } // ADD::MaxAbstract
  1914. ADD
  1915. ADD::Plus(
  1916. const ADD& g) const
  1917. {
  1918. DdManager *mgr = checkSameManager(g);
  1919. DdNode *result = Cudd_addApply(mgr, Cudd_addPlus, node, g.node);
  1920. checkReturnValue(result);
  1921. return ADD(p, result);
  1922. } // ADD::Plus
  1923. ADD
  1924. ADD::Times(
  1925. const ADD& g) const
  1926. {
  1927. DdManager *mgr = checkSameManager(g);
  1928. DdNode *result = Cudd_addApply(mgr, Cudd_addTimes, node, g.node);
  1929. checkReturnValue(result);
  1930. return ADD(p, result);
  1931. } // ADD::Times
  1932. ADD
  1933. ADD::Threshold(
  1934. const ADD& g) const
  1935. {
  1936. DdManager *mgr = checkSameManager(g);
  1937. DdNode *result = Cudd_addApply(mgr, Cudd_addThreshold, node, g.node);
  1938. checkReturnValue(result);
  1939. return ADD(p, result);
  1940. } // ADD::Threshold
  1941. ADD
  1942. ADD::SetNZ(
  1943. const ADD& g) const
  1944. {
  1945. DdManager *mgr = checkSameManager(g);
  1946. DdNode *result = Cudd_addApply(mgr, Cudd_addSetNZ, node, g.node);
  1947. checkReturnValue(result);
  1948. return ADD(p, result);
  1949. } // ADD::SetNZ
  1950. ADD
  1951. ADD::Divide(
  1952. const ADD& g) const
  1953. {
  1954. DdManager *mgr = checkSameManager(g);
  1955. DdNode *result = Cudd_addApply(mgr, Cudd_addDivide, node, g.node);
  1956. checkReturnValue(result);
  1957. return ADD(p, result);
  1958. } // ADD::Divide
  1959. ADD
  1960. ADD::Minus(
  1961. const ADD& g) const
  1962. {
  1963. DdManager *mgr = checkSameManager(g);
  1964. DdNode *result = Cudd_addApply(mgr, Cudd_addMinus, node, g.node);
  1965. checkReturnValue(result);
  1966. return ADD(p, result);
  1967. } // ADD::Minus
  1968. ADD
  1969. ADD::Minimum(
  1970. const ADD& g) const
  1971. {
  1972. DdManager *mgr = checkSameManager(g);
  1973. DdNode *result = Cudd_addApply(mgr, Cudd_addMinimum, node, g.node);
  1974. checkReturnValue(result);
  1975. return ADD(p, result);
  1976. } // ADD::Minimum
  1977. ADD
  1978. ADD::Maximum(
  1979. const ADD& g) const
  1980. {
  1981. DdManager *mgr = checkSameManager(g);
  1982. DdNode *result = Cudd_addApply(mgr, Cudd_addMaximum, node, g.node);
  1983. checkReturnValue(result);
  1984. return ADD(p, result);
  1985. } // ADD::Maximum
  1986. ADD
  1987. ADD::OneZeroMaximum(
  1988. const ADD& g) const
  1989. {
  1990. DdManager *mgr = checkSameManager(g);
  1991. DdNode *result = Cudd_addApply(mgr, Cudd_addOneZeroMaximum, node, g.node);
  1992. checkReturnValue(result);
  1993. return ADD(p, result);
  1994. } // ADD::OneZeroMaximum
  1995. ADD
  1996. ADD::Diff(
  1997. const ADD& g) const
  1998. {
  1999. DdManager *mgr = checkSameManager(g);
  2000. DdNode *result = Cudd_addApply(mgr, Cudd_addDiff, node, g.node);
  2001. checkReturnValue(result);
  2002. return ADD(p, result);
  2003. } // ADD::Diff
  2004. ADD
  2005. ADD::Agreement(
  2006. const ADD& g) const
  2007. {
  2008. DdManager *mgr = checkSameManager(g);
  2009. DdNode *result = Cudd_addApply(mgr, Cudd_addAgreement, node, g.node);
  2010. checkReturnValue(result);
  2011. return ADD(p, result);
  2012. } // ADD::Agreement
  2013. ADD
  2014. ADD::Or(
  2015. const ADD& g) const
  2016. {
  2017. DdManager *mgr = checkSameManager(g);
  2018. DdNode *result = Cudd_addApply(mgr, Cudd_addOr, node, g.node);
  2019. checkReturnValue(result);
  2020. return ADD(p, result);
  2021. } // ADD::Or
  2022. ADD
  2023. ADD::Nand(
  2024. const ADD& g) const
  2025. {
  2026. DdManager *mgr = checkSameManager(g);
  2027. DdNode *result = Cudd_addApply(mgr, Cudd_addNand, node, g.node);
  2028. checkReturnValue(result);
  2029. return ADD(p, result);
  2030. } // ADD::Nand
  2031. ADD
  2032. ADD::Nor(
  2033. const ADD& g) const
  2034. {
  2035. DdManager *mgr = checkSameManager(g);
  2036. DdNode *result = Cudd_addApply(mgr, Cudd_addNor, node, g.node);
  2037. checkReturnValue(result);
  2038. return ADD(p, result);
  2039. } // ADD::Nor
  2040. ADD
  2041. ADD::Xor(
  2042. const ADD& g) const
  2043. {
  2044. DdManager *mgr = checkSameManager(g);
  2045. DdNode *result = Cudd_addApply(mgr, Cudd_addXor, node, g.node);
  2046. checkReturnValue(result);
  2047. return ADD(p, result);
  2048. } // ADD::Xor
  2049. ADD
  2050. ADD::Xnor(
  2051. const ADD& g) const
  2052. {
  2053. DdManager *mgr = checkSameManager(g);
  2054. DdNode *result = Cudd_addApply(mgr, Cudd_addXnor, node, g.node);
  2055. checkReturnValue(result);
  2056. return ADD(p, result);
  2057. } // ADD::Xnor
  2058. ADD
  2059. ADD::Pow(
  2060. const ADD& g) const
  2061. {
  2062. DdManager *mgr = checkSameManager(g);
  2063. DdNode *result = Cudd_addApply(mgr, Cudd_addPow, node, g.node);
  2064. checkReturnValue(result);
  2065. return ADD(p, result);
  2066. } // ADD::Pow
  2067. ADD
  2068. ADD::Mod(
  2069. const ADD& g) const
  2070. {
  2071. DdManager *mgr = checkSameManager(g);
  2072. DdNode *result = Cudd_addApply(mgr, Cudd_addMod, node, g.node);
  2073. checkReturnValue(result);
  2074. return ADD(p, result);
  2075. } // ADD::Mod
  2076. ADD
  2077. ADD::LogXY(
  2078. const ADD& g) const
  2079. {
  2080. DdManager *mgr = checkSameManager(g);
  2081. DdNode *result = Cudd_addApply(mgr, Cudd_addLogXY, node, g.node);
  2082. checkReturnValue(result);
  2083. return ADD(p, result);
  2084. } // ADD::LogXY
  2085. ADD
  2086. ADD::Log() const
  2087. {
  2088. DdManager *mgr = p->manager;
  2089. DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addLog, node);
  2090. checkReturnValue(result);
  2091. return ADD(p, result);
  2092. } // ADD::Log
  2093. ADD
  2094. ADD::Floor() const
  2095. {
  2096. DdManager *mgr = p->manager;
  2097. DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addFloor, node);
  2098. checkReturnValue(result);
  2099. return ADD(p, result);
  2100. } // ADD::Floor
  2101. ADD
  2102. ADD::Ceil() const
  2103. {
  2104. DdManager *mgr = p->manager;
  2105. DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addCeil, node);
  2106. checkReturnValue(result);
  2107. return ADD(p, result);
  2108. } // ADD::Ceil
  2109. ADD
  2110. ADD::FindMax() const
  2111. {
  2112. DdManager *mgr = p->manager;
  2113. DdNode *result = Cudd_addFindMax(mgr, node);
  2114. checkReturnValue(result);
  2115. return ADD(p, result);
  2116. } // ADD::FindMax
  2117. ADD
  2118. ADD::FindMin() const
  2119. {
  2120. DdManager *mgr = p->manager;
  2121. DdNode *result = Cudd_addFindMin(mgr, node);
  2122. checkReturnValue(result);
  2123. return ADD(p, result);
  2124. } // ADD::FindMin
  2125. ADD
  2126. ADD::IthBit(
  2127. int bit) const
  2128. {
  2129. DdManager *mgr = p->manager;
  2130. DdNode *result = Cudd_addIthBit(mgr, node, bit);
  2131. checkReturnValue(result);
  2132. return ADD(p, result);
  2133. } // ADD::IthBit
  2134. ADD
  2135. ADD::ScalarInverse(
  2136. const ADD& epsilon) const
  2137. {
  2138. DdManager *mgr = checkSameManager(epsilon);
  2139. DdNode *result = Cudd_addScalarInverse(mgr, node, epsilon.node);
  2140. checkReturnValue(result);
  2141. return ADD(p, result);
  2142. } // ADD::ScalarInverse
  2143. ADD
  2144. ADD::Ite(
  2145. const ADD& g,
  2146. const ADD& h) const
  2147. {
  2148. DdManager *mgr = checkSameManager(g);
  2149. checkSameManager(h);
  2150. DdNode *result = Cudd_addIte(mgr, node, g.node, h.node);
  2151. checkReturnValue(result);
  2152. return ADD(p, result);
  2153. } // ADD::Ite
  2154. ADD
  2155. ADD::IteConstant(
  2156. const ADD& g,
  2157. const ADD& h) const
  2158. {
  2159. DdManager *mgr = checkSameManager(g);
  2160. checkSameManager(h);
  2161. DdNode *result = Cudd_addIteConstant(mgr, node, g.node, h.node);
  2162. checkReturnValue(result);
  2163. return ADD(p, result);
  2164. } // ADD::IteConstant
  2165. ADD
  2166. ADD::EvalConst(
  2167. const ADD& g) const
  2168. {
  2169. DdManager *mgr = checkSameManager(g);
  2170. DdNode *result = Cudd_addEvalConst(mgr, node, g.node);
  2171. checkReturnValue(result);
  2172. return ADD(p, result);
  2173. } // ADD::EvalConst
  2174. bool
  2175. ADD::Leq(
  2176. const ADD& g) const
  2177. {
  2178. DdManager *mgr = checkSameManager(g);
  2179. return Cudd_addLeq(mgr, node, g.node);
  2180. } // ADD::Leq
  2181. ADD
  2182. ADD::Cmpl() const
  2183. {
  2184. DdManager *mgr = p->manager;
  2185. DdNode *result = Cudd_addCmpl(mgr, node);
  2186. checkReturnValue(result);
  2187. return ADD(p, result);
  2188. } // ADD::Cmpl
  2189. ADD
  2190. ADD::Negate() const
  2191. {
  2192. DdManager *mgr = p->manager;
  2193. DdNode *result = Cudd_addNegate(mgr, node);
  2194. checkReturnValue(result);
  2195. return ADD(p, result);
  2196. } // ADD::Negate
  2197. ADD
  2198. ADD::RoundOff(
  2199. int N) const
  2200. {
  2201. DdManager *mgr = p->manager;
  2202. DdNode *result = Cudd_addRoundOff(mgr, node, N);
  2203. checkReturnValue(result);
  2204. return ADD(p, result);
  2205. } // ADD::RoundOff
  2206. ADD
  2207. Cudd::Walsh(
  2208. std::vector<ADD> x,
  2209. std::vector<ADD> y) const
  2210. {
  2211. size_t n = x.size();
  2212. DdNode **X = new DdNode *[n];
  2213. DdNode **Y = new DdNode *[n];
  2214. for (size_t i = 0; i < n; i++) {
  2215. X[i] = x[i].getNode();
  2216. Y[i] = y[i].getNode();
  2217. }
  2218. DdNode *result = Cudd_addWalsh(p->manager, X, Y, (int) n);
  2219. delete [] X;
  2220. delete [] Y;
  2221. checkReturnValue(result);
  2222. return ADD(p, result);
  2223. } // ADD::Walsh
  2224. ADD
  2225. Cudd::addResidue(
  2226. int n,
  2227. int m,
  2228. int options,
  2229. int top) const
  2230. {
  2231. DdNode *result = Cudd_addResidue(p->manager, n, m, options, top);
  2232. checkReturnValue(result);
  2233. return ADD(p, result);
  2234. } // Cudd::addResidue
  2235. ADD
  2236. ADD::Equals(const ADD& g) const
  2237. {
  2238. DdManager *mgr = checkSameManager(g);
  2239. DdNode *result = Cudd_addApply(mgr, Cudd_addEquals, node, g.node);
  2240. checkReturnValue(result);
  2241. return ADD(p, result);
  2242. } // ADD::Equals
  2243. ADD
  2244. ADD::NotEquals(const ADD& g) const
  2245. {
  2246. DdManager *mgr = checkSameManager(g);
  2247. DdNode *result = Cudd_addApply(mgr, Cudd_addNotEquals, node, g.node);
  2248. checkReturnValue(result);
  2249. return ADD(p, result);
  2250. } // ADD::NotEquals
  2251. ADD
  2252. ADD::LessThan(const ADD& g) const
  2253. {
  2254. DdManager *mgr = checkSameManager(g);
  2255. DdNode *result = Cudd_addApply(mgr, Cudd_addLessThan, node, g.node);
  2256. checkReturnValue(result);
  2257. return ADD(p, result);
  2258. } // ADD::LessThan
  2259. ADD
  2260. ADD::LessThanOrEqual(const ADD& g) const
  2261. {
  2262. DdManager *mgr = checkSameManager(g);
  2263. DdNode *result = Cudd_addApply(mgr, Cudd_addLessThanEquals, node, g.node);
  2264. checkReturnValue(result);
  2265. return ADD(p, result);
  2266. } // ADD::LessThanOrEqual
  2267. ADD
  2268. ADD::GreaterThan(const ADD& g) const
  2269. {
  2270. DdManager *mgr = checkSameManager(g);
  2271. DdNode *result = Cudd_addApply(mgr, Cudd_addGreaterThan, node, g.node);
  2272. checkReturnValue(result);
  2273. return ADD(p, result);
  2274. } // ADD::GreaterThan
  2275. ADD
  2276. ADD::GreaterThanOrEqual(const ADD& g) const
  2277. {
  2278. DdManager *mgr = checkSameManager(g);
  2279. DdNode *result = Cudd_addApply(mgr, Cudd_addGreaterThanEquals, node, g.node);
  2280. checkReturnValue(result);
  2281. return ADD(p, result);
  2282. } // ADD::GreaterThanOrEqual
  2283. BDD
  2284. BDD::AndAbstract(
  2285. const BDD& g,
  2286. const BDD& cube,
  2287. unsigned int limit) const
  2288. {
  2289. DdManager *mgr = checkSameManager(g);
  2290. checkSameManager(cube);
  2291. DdNode *result;
  2292. if (limit == 0)
  2293. result = Cudd_bddAndAbstract(mgr, node, g.node, cube.node);
  2294. else
  2295. result = Cudd_bddAndAbstractLimit(mgr, node, g.node,
  2296. cube.node, limit);
  2297. checkReturnValue(result);
  2298. return BDD(p, result);
  2299. } // BDD::AndAbstract
  2300. int
  2301. Cudd::ApaNumberOfDigits(
  2302. int binaryDigits) const
  2303. {
  2304. return Cudd_ApaNumberOfDigits(binaryDigits);
  2305. } // Cudd::ApaNumberOfDigits
  2306. DdApaNumber
  2307. Cudd::NewApaNumber(
  2308. int digits) const
  2309. {
  2310. return Cudd_NewApaNumber(digits);
  2311. } // Cudd::NewApaNumber
  2312. void
  2313. Cudd::ApaCopy(
  2314. int digits,
  2315. DdApaNumber source,
  2316. DdApaNumber dest) const
  2317. {
  2318. Cudd_ApaCopy(digits, source, dest);
  2319. } // Cudd::ApaCopy
  2320. DdApaDigit
  2321. Cudd::ApaAdd(
  2322. int digits,
  2323. DdApaNumber a,
  2324. DdApaNumber b,
  2325. DdApaNumber sum) const
  2326. {
  2327. return Cudd_ApaAdd(digits, a, b, sum);
  2328. } // Cudd::ApaAdd
  2329. DdApaDigit
  2330. Cudd::ApaSubtract(
  2331. int digits,
  2332. DdApaNumber a,
  2333. DdApaNumber b,
  2334. DdApaNumber diff) const
  2335. {
  2336. return Cudd_ApaSubtract(digits, a, b, diff);
  2337. } // Cudd::ApaSubtract
  2338. DdApaDigit
  2339. Cudd::ApaShortDivision(
  2340. int digits,
  2341. DdApaNumber dividend,
  2342. DdApaDigit divisor,
  2343. DdApaNumber quotient) const
  2344. {
  2345. return Cudd_ApaShortDivision(digits, dividend, divisor, quotient);
  2346. } // Cudd::ApaShortDivision
  2347. void
  2348. Cudd::ApaShiftRight(
  2349. int digits,
  2350. DdApaDigit in,
  2351. DdApaNumber a,
  2352. DdApaNumber b) const
  2353. {
  2354. Cudd_ApaShiftRight(digits, in, a, b);
  2355. } // Cudd::ApaShiftRight
  2356. void
  2357. Cudd::ApaSetToLiteral(
  2358. int digits,
  2359. DdApaNumber number,
  2360. DdApaDigit literal) const
  2361. {
  2362. Cudd_ApaSetToLiteral(digits, number, literal);
  2363. } // Cudd::ApaSetToLiteral
  2364. void
  2365. Cudd::ApaPowerOfTwo(
  2366. int digits,
  2367. DdApaNumber number,
  2368. int power) const
  2369. {
  2370. Cudd_ApaPowerOfTwo(digits, number, power);
  2371. } // Cudd::ApaPowerOfTwo
  2372. void
  2373. Cudd::ApaPrintHex(
  2374. int digits,
  2375. DdApaNumber number,
  2376. FILE * fp) const
  2377. {
  2378. cout.flush();
  2379. int result = Cudd_ApaPrintHex(fp, digits, number);
  2380. checkReturnValue(result);
  2381. } // Cudd::ApaPrintHex
  2382. void
  2383. Cudd::ApaPrintDecimal(
  2384. int digits,
  2385. DdApaNumber number,
  2386. FILE * fp) const
  2387. {
  2388. cout.flush();
  2389. int result = Cudd_ApaPrintDecimal(fp, digits, number);
  2390. checkReturnValue(result);
  2391. } // Cudd::ApaPrintDecimal
  2392. std::string
  2393. Cudd::ApaStringDecimal(
  2394. int digits,
  2395. DdApaNumber number) const
  2396. {
  2397. char * result = Cudd_ApaStringDecimal(digits, number);
  2398. checkReturnValue(result);
  2399. std::string ret = std::string(result);
  2400. free(result);
  2401. return ret;
  2402. } // Cudd::ApaStringDecimal
  2403. void
  2404. Cudd::ApaPrintExponential(
  2405. int digits,
  2406. DdApaNumber number,
  2407. int precision,
  2408. FILE * fp) const
  2409. {
  2410. cout.flush();
  2411. int result = Cudd_ApaPrintExponential(fp, digits, number, precision);
  2412. checkReturnValue(result);
  2413. } // Cudd::ApaPrintExponential
  2414. DdApaNumber
  2415. ABDD::ApaCountMinterm(
  2416. int nvars,
  2417. int * digits) const
  2418. {
  2419. DdManager *mgr = p->manager;
  2420. return Cudd_ApaCountMinterm(mgr, node, nvars, digits);
  2421. } // ABDD::ApaCountMinterm
  2422. void
  2423. ABDD::ApaPrintMinterm(
  2424. int nvars,
  2425. FILE * fp) const
  2426. {
  2427. cout.flush();
  2428. DdManager *mgr = p->manager;
  2429. int result = Cudd_ApaPrintMinterm(fp, mgr, node, nvars);
  2430. checkReturnValue(result);
  2431. } // ABDD::ApaPrintMinterm
  2432. void
  2433. ABDD::ApaPrintMintermExp(
  2434. int nvars,
  2435. int precision,
  2436. FILE * fp) const
  2437. {
  2438. cout.flush();
  2439. DdManager *mgr = p->manager;
  2440. int result = Cudd_ApaPrintMintermExp(fp, mgr, node, nvars, precision);
  2441. checkReturnValue(result);
  2442. } // ABDD::ApaPrintMintermExp
  2443. void
  2444. ABDD::EpdPrintMinterm(
  2445. int nvars,
  2446. FILE * fp) const
  2447. {
  2448. EpDouble count;
  2449. char str[24];
  2450. cout.flush();
  2451. DdManager *mgr = p->manager;
  2452. int result = Cudd_EpdCountMinterm(mgr, node, nvars, &count);
  2453. checkReturnValue(result,0);
  2454. EpdGetString(&count, str);
  2455. fprintf(fp, "%s", str);
  2456. } // ABDD::EpdPrintMinterm
  2457. long double
  2458. ABDD::LdblCountMinterm(
  2459. int nvars) const
  2460. {
  2461. cout.flush();
  2462. DdManager *mgr = p->manager;
  2463. long double result = Cudd_LdblCountMinterm(mgr, node, nvars);
  2464. checkReturnValue(result != (long double) CUDD_OUT_OF_MEM);
  2465. return result;
  2466. } // ABDD::LdblCountMinterm
  2467. BDD
  2468. BDD::UnderApprox(
  2469. int numVars,
  2470. int threshold,
  2471. bool safe,
  2472. double quality) const
  2473. {
  2474. DdManager *mgr = p->manager;
  2475. DdNode *result = Cudd_UnderApprox(mgr, node, numVars, threshold, safe, quality);
  2476. checkReturnValue(result);
  2477. return BDD(p, result);
  2478. } // BDD::UnderApprox
  2479. BDD
  2480. BDD::OverApprox(
  2481. int numVars,
  2482. int threshold,
  2483. bool safe,
  2484. double quality) const
  2485. {
  2486. DdManager *mgr = p->manager;
  2487. DdNode *result = Cudd_OverApprox(mgr, node, numVars, threshold, safe, quality);
  2488. checkReturnValue(result);
  2489. return BDD(p, result);
  2490. } // BDD::OverApprox
  2491. BDD
  2492. BDD::RemapUnderApprox(
  2493. int numVars,
  2494. int threshold,
  2495. double quality) const
  2496. {
  2497. DdManager *mgr = p->manager;
  2498. DdNode *result = Cudd_RemapUnderApprox(mgr, node, numVars, threshold, quality);
  2499. checkReturnValue(result);
  2500. return BDD(p, result);
  2501. } // BDD::RemapUnderApprox
  2502. BDD
  2503. BDD::RemapOverApprox(
  2504. int numVars,
  2505. int threshold,
  2506. double quality) const
  2507. {
  2508. DdManager *mgr = p->manager;
  2509. DdNode *result = Cudd_RemapOverApprox(mgr, node, numVars, threshold, quality);
  2510. checkReturnValue(result);
  2511. return BDD(p, result);
  2512. } // BDD::RemapOverApprox
  2513. BDD
  2514. BDD::BiasedUnderApprox(
  2515. const BDD& bias,
  2516. int numVars,
  2517. int threshold,
  2518. double quality1,
  2519. double quality0) const
  2520. {
  2521. DdManager *mgr = p->manager;
  2522. DdNode *result = Cudd_BiasedUnderApprox(mgr, node, bias.node, numVars,
  2523. threshold, quality1, quality0);
  2524. checkReturnValue(result);
  2525. return BDD(p, result);
  2526. } // BDD::BiasedUnderApprox
  2527. BDD
  2528. BDD::BiasedOverApprox(
  2529. const BDD& bias,
  2530. int numVars,
  2531. int threshold,
  2532. double quality1,
  2533. double quality0) const
  2534. {
  2535. DdManager *mgr = p->manager;
  2536. DdNode *result = Cudd_BiasedOverApprox(mgr, node, bias.node, numVars,
  2537. threshold, quality1, quality0);
  2538. checkReturnValue(result);
  2539. return BDD(p, result);
  2540. } // BDD::BiasedOverApprox
  2541. BDD
  2542. BDD::ExistAbstract(
  2543. const BDD& cube,
  2544. unsigned int limit) const
  2545. {
  2546. DdManager *mgr = checkSameManager(cube);
  2547. DdNode *result;
  2548. if (limit == 0)
  2549. result = Cudd_bddExistAbstract(mgr, node, cube.node);
  2550. else
  2551. result = Cudd_bddExistAbstractLimit(mgr, node, cube.node, limit);
  2552. checkReturnValue(result);
  2553. return BDD(p, result);
  2554. } // BDD::ExistAbstract
  2555. BDD
  2556. BDD::XorExistAbstract(
  2557. const BDD& g,
  2558. const BDD& cube) const
  2559. {
  2560. DdManager *mgr = checkSameManager(g);
  2561. checkSameManager(cube);
  2562. DdNode *result = Cudd_bddXorExistAbstract(mgr, node, g.node, cube.node);
  2563. checkReturnValue(result);
  2564. return BDD(p, result);
  2565. } // BDD::XorExistAbstract
  2566. BDD
  2567. BDD::UnivAbstract(
  2568. const BDD& cube) const
  2569. {
  2570. DdManager *mgr = checkSameManager(cube);
  2571. DdNode *result = Cudd_bddUnivAbstract(mgr, node, cube.node);
  2572. checkReturnValue(result);
  2573. return BDD(p, result);
  2574. } // BDD::UnivAbstract
  2575. BDD
  2576. BDD::BooleanDiff(
  2577. int x) const
  2578. {
  2579. DdManager *mgr = p->manager;
  2580. DdNode *result = Cudd_bddBooleanDiff(mgr, node, x);
  2581. checkReturnValue(result);
  2582. return BDD(p, result);
  2583. } // BDD::BooleanDiff
  2584. bool
  2585. BDD::VarIsDependent(
  2586. const BDD& var) const
  2587. {
  2588. DdManager *mgr = p->manager;
  2589. return Cudd_bddVarIsDependent(mgr, node, var.node);
  2590. } // BDD::VarIsDependent
  2591. double
  2592. BDD::Correlation(
  2593. const BDD& g) const
  2594. {
  2595. DdManager *mgr = checkSameManager(g);
  2596. return Cudd_bddCorrelation(mgr, node, g.node);
  2597. } // BDD::Correlation
  2598. double
  2599. BDD::CorrelationWeights(
  2600. const BDD& g,
  2601. double * prob) const
  2602. {
  2603. DdManager *mgr = checkSameManager(g);
  2604. return Cudd_bddCorrelationWeights(mgr, node, g.node, prob);
  2605. } // BDD::CorrelationWeights
  2606. BDD
  2607. BDD::Ite(
  2608. const BDD& g,
  2609. const BDD& h,
  2610. unsigned int limit) const
  2611. {
  2612. DdManager *mgr = checkSameManager(g);
  2613. checkSameManager(h);
  2614. DdNode *result;
  2615. if (limit == 0)
  2616. result = Cudd_bddIte(mgr, node, g.node, h.node);
  2617. else
  2618. result = Cudd_bddIteLimit(mgr, node, g.node, h.node, limit);
  2619. checkReturnValue(result);
  2620. return BDD(p, result);
  2621. } // BDD::Ite
  2622. BDD
  2623. BDD::IteConstant(
  2624. const BDD& g,
  2625. const BDD& h) const
  2626. {
  2627. DdManager *mgr = checkSameManager(g);
  2628. checkSameManager(h);
  2629. DdNode *result = Cudd_bddIteConstant(mgr, node, g.node, h.node);
  2630. checkReturnValue(result);
  2631. return BDD(p, result);
  2632. } // BDD::IteConstant
  2633. BDD
  2634. BDD::Intersect(
  2635. const BDD& g) const
  2636. {
  2637. DdManager *mgr = checkSameManager(g);
  2638. DdNode *result = Cudd_bddIntersect(mgr, node, g.node);
  2639. checkReturnValue(result);
  2640. return BDD(p, result);
  2641. } // BDD::Intersect
  2642. BDD
  2643. BDD::And(
  2644. const BDD& g,
  2645. unsigned int limit) const
  2646. {
  2647. DdManager *mgr = checkSameManager(g);
  2648. DdNode *result;
  2649. if (limit == 0)
  2650. result = Cudd_bddAnd(mgr, node, g.node);
  2651. else
  2652. result = Cudd_bddAndLimit(mgr, node, g.node, limit);
  2653. checkReturnValue(result);
  2654. return BDD(p, result);
  2655. } // BDD::And
  2656. BDD
  2657. BDD::Or(
  2658. const BDD& g,
  2659. unsigned int limit) const
  2660. {
  2661. DdManager *mgr = checkSameManager(g);
  2662. DdNode *result;
  2663. if (limit == 0)
  2664. result = Cudd_bddOr(mgr, node, g.node);
  2665. else
  2666. result = Cudd_bddOrLimit(mgr, node, g.node, limit);
  2667. checkReturnValue(result);
  2668. return BDD(p, result);
  2669. } // BDD::Or
  2670. BDD
  2671. BDD::Nand(
  2672. const BDD& g) const
  2673. {
  2674. DdManager *mgr = checkSameManager(g);
  2675. DdNode *result = Cudd_bddNand(mgr, node, g.node);
  2676. checkReturnValue(result);
  2677. return BDD(p, result);
  2678. } // BDD::Nand
  2679. BDD
  2680. BDD::Nor(
  2681. const BDD& g) const
  2682. {
  2683. DdManager *mgr = checkSameManager(g);
  2684. DdNode *result = Cudd_bddNor(mgr, node, g.node);
  2685. checkReturnValue(result);
  2686. return BDD(p, result);
  2687. } // BDD::Nor
  2688. BDD
  2689. BDD::Xor(
  2690. const BDD& g) const
  2691. {
  2692. DdManager *mgr = checkSameManager(g);
  2693. DdNode *result = Cudd_bddXor(mgr, node, g.node);
  2694. checkReturnValue(result);
  2695. return BDD(p, result);
  2696. } // BDD::Xor
  2697. BDD
  2698. BDD::Xnor(
  2699. const BDD& g,
  2700. unsigned int limit) const
  2701. {
  2702. DdManager *mgr = checkSameManager(g);
  2703. DdNode *result;
  2704. if (limit == 0)
  2705. result = Cudd_bddXnor(mgr, node, g.node);
  2706. else
  2707. result = Cudd_bddXnorLimit(mgr, node, g.node, limit);
  2708. checkReturnValue(result);
  2709. return BDD(p, result);
  2710. } // BDD::Xnor
  2711. bool
  2712. BDD::Leq(
  2713. const BDD& g) const
  2714. {
  2715. DdManager *mgr = checkSameManager(g);
  2716. return Cudd_bddLeq(mgr, node, g.node);
  2717. } // BDD::Leq
  2718. BDD
  2719. ADD::BddThreshold(
  2720. CUDD_VALUE_TYPE value) const
  2721. {
  2722. DdManager *mgr = p->manager;
  2723. DdNode *result = Cudd_addBddThreshold(mgr, node, value);
  2724. checkReturnValue(result);
  2725. return BDD(p, result);
  2726. } // ADD::BddThreshold
  2727. BDD
  2728. ADD::BddStrictThreshold(
  2729. CUDD_VALUE_TYPE value) const
  2730. {
  2731. DdManager *mgr = p->manager;
  2732. DdNode *result = Cudd_addBddStrictThreshold(mgr, node, value);
  2733. checkReturnValue(result);
  2734. return BDD(p, result);
  2735. } // ADD::BddStrictThreshold
  2736. BDD
  2737. ADD::BddInterval(
  2738. CUDD_VALUE_TYPE lower,
  2739. CUDD_VALUE_TYPE upper) const
  2740. {
  2741. DdManager *mgr = p->manager;
  2742. DdNode *result = Cudd_addBddInterval(mgr, node, lower, upper);
  2743. checkReturnValue(result);
  2744. return BDD(p, result);
  2745. } // ADD::BddInterval
  2746. BDD
  2747. ADD::BddIthBit(
  2748. int bit) const
  2749. {
  2750. DdManager *mgr = p->manager;
  2751. DdNode *result = Cudd_addBddIthBit(mgr, node, bit);
  2752. checkReturnValue(result);
  2753. return BDD(p, result);
  2754. } // ADD::BddIthBit
  2755. ADD
  2756. BDD::Add() const
  2757. {
  2758. DdManager *mgr = p->manager;
  2759. DdNode *result = Cudd_BddToAdd(mgr, node);
  2760. checkReturnValue(result);
  2761. return ADD(p, result);
  2762. } // BDD::Add
  2763. BDD
  2764. ADD::BddPattern() const
  2765. {
  2766. DdManager *mgr = p->manager;
  2767. DdNode *result = Cudd_addBddPattern(mgr, node);
  2768. checkReturnValue(result);
  2769. return BDD(p, result);
  2770. } // ADD::BddPattern
  2771. BDD
  2772. BDD::Transfer(
  2773. Cudd& destination) const
  2774. {
  2775. DdManager *mgr = p->manager;
  2776. DdNode *result = Cudd_bddTransfer(mgr, destination.p->manager, node);
  2777. checkReturnValue(result);
  2778. return BDD(destination.p, result);
  2779. } // BDD::Transfer
  2780. void
  2781. Cudd::DebugCheck() const
  2782. {
  2783. int result = Cudd_DebugCheck(p->manager);
  2784. checkReturnValue(result == 0);
  2785. } // Cudd::DebugCheck
  2786. void
  2787. Cudd::CheckKeys() const
  2788. {
  2789. int result = Cudd_CheckKeys(p->manager);
  2790. checkReturnValue(result == 0);
  2791. } // Cudd::CheckKeys
  2792. BDD
  2793. BDD::ClippingAnd(
  2794. const BDD& g,
  2795. int maxDepth,
  2796. int direction) const
  2797. {
  2798. DdManager *mgr = checkSameManager(g);
  2799. DdNode *result = Cudd_bddClippingAnd(mgr, node, g.node, maxDepth,
  2800. direction);
  2801. checkReturnValue(result);
  2802. return BDD(p, result);
  2803. } // BDD::ClippingAnd
  2804. BDD
  2805. BDD::ClippingAndAbstract(
  2806. const BDD& g,
  2807. const BDD& cube,
  2808. int maxDepth,
  2809. int direction) const
  2810. {
  2811. DdManager *mgr = checkSameManager(g);
  2812. checkSameManager(cube);
  2813. DdNode *result = Cudd_bddClippingAndAbstract(mgr, node, g.node, cube.node,
  2814. maxDepth, direction);
  2815. checkReturnValue(result);
  2816. return BDD(p, result);
  2817. } // BDD::ClippingAndAbstract
  2818. ADD
  2819. ADD::Cofactor(
  2820. const ADD& g) const
  2821. {
  2822. DdManager *mgr = checkSameManager(g);
  2823. DdNode *result = Cudd_Cofactor(mgr, node, g.node);
  2824. checkReturnValue(result);
  2825. return ADD(p, result);
  2826. } // ADD::Cofactor
  2827. BDD
  2828. BDD::Cofactor(
  2829. const BDD& g) const
  2830. {
  2831. DdManager *mgr = checkSameManager(g);
  2832. DdNode *result = Cudd_Cofactor(mgr, node, g.node);
  2833. checkReturnValue(result);
  2834. return BDD(p, result);
  2835. } // BDD::Cofactor
  2836. bool
  2837. BDD::VarAreSymmetric(int index1, int index2) const
  2838. {
  2839. return Cudd_VarsAreSymmetric(p->manager, node, index1, index2);
  2840. } // BDD::VarAreSymmetric
  2841. BDD
  2842. BDD::Compose(
  2843. const BDD& g,
  2844. int v) const
  2845. {
  2846. DdManager *mgr = checkSameManager(g);
  2847. DdNode *result = Cudd_bddCompose(mgr, node, g.node, v);
  2848. checkReturnValue(result);
  2849. return BDD(p, result);
  2850. } // BDD::Compose
  2851. ADD
  2852. ADD::Compose(
  2853. const ADD& g,
  2854. int v) const
  2855. {
  2856. DdManager *mgr = checkSameManager(g);
  2857. DdNode *result = Cudd_addCompose(mgr, node, g.node, v);
  2858. checkReturnValue(result);
  2859. return ADD(p, result);
  2860. } // ADD::Compose
  2861. ADD
  2862. ADD::Permute(
  2863. int * permut) const
  2864. {
  2865. DdManager *mgr = p->manager;
  2866. DdNode *result = Cudd_addPermute(mgr, node, permut);
  2867. checkReturnValue(result);
  2868. return ADD(p, result);
  2869. } // ADD::Permute
  2870. ADD
  2871. ADD::SwapVariables(
  2872. std::vector<ADD> x,
  2873. std::vector<ADD> y) const
  2874. {
  2875. size_t n = x.size();
  2876. DdManager *mgr = p->manager;
  2877. DdNode **X = new DdNode *[n];
  2878. DdNode **Y = new DdNode *[n];
  2879. for (size_t i = 0; i < n; i++) {
  2880. X[i] = x[i].node;
  2881. Y[i] = y[i].node;
  2882. }
  2883. DdNode *result = Cudd_addSwapVariables(mgr, node, X, Y, (int) n);
  2884. delete [] X;
  2885. delete [] Y;
  2886. checkReturnValue(result);
  2887. return ADD(p, result);
  2888. } // ADD::SwapVariables
  2889. BDD
  2890. BDD::Permute(
  2891. int * permut) const
  2892. {
  2893. DdManager *mgr = p->manager;
  2894. DdNode *result = Cudd_bddPermute(mgr, node, permut);
  2895. checkReturnValue(result);
  2896. return BDD(p, result);
  2897. } // BDD::Permute
  2898. BDD
  2899. BDD::SwapVariables(
  2900. std::vector<BDD> x,
  2901. std::vector<BDD> y) const
  2902. {
  2903. size_t n = x.size();
  2904. DdManager *mgr = p->manager;
  2905. DdNode **X = new DdNode *[n];
  2906. DdNode **Y = new DdNode *[n];
  2907. for (size_t i = 0; i < n; i++) {
  2908. X[i] = x[i].node;
  2909. Y[i] = y[i].node;
  2910. }
  2911. DdNode *result = Cudd_bddSwapVariables(mgr, node, X, Y, (int) n);
  2912. delete [] X;
  2913. delete [] Y;
  2914. checkReturnValue(result);
  2915. return BDD(p, result);
  2916. } // BDD::SwapVariables
  2917. BDD
  2918. BDD::AdjPermuteX(
  2919. std::vector<BDD> x) const
  2920. {
  2921. size_t n = x.size();
  2922. DdManager *mgr = p->manager;
  2923. DdNode **X = new DdNode *[n];
  2924. for (size_t i = 0; i < n; i++) {
  2925. X[i] = x[i].node;
  2926. }
  2927. DdNode *result = Cudd_bddAdjPermuteX(mgr, node, X, (int) n);
  2928. delete [] X;
  2929. checkReturnValue(result);
  2930. return BDD(p, result);
  2931. } // BDD::AdjPermuteX
  2932. ADD
  2933. ADD::VectorCompose(
  2934. std::vector<ADD> vect) const
  2935. {
  2936. DdManager *mgr = p->manager;
  2937. size_t n = (size_t) Cudd_ReadSize(mgr);
  2938. DdNode **X = new DdNode *[n];
  2939. for (size_t i = 0; i < n; i++) {
  2940. X[i] = vect[i].node;
  2941. }
  2942. DdNode *result = Cudd_addVectorCompose(mgr, node, X);
  2943. delete [] X;
  2944. checkReturnValue(result);
  2945. return ADD(p, result);
  2946. } // ADD::VectorCompose
  2947. ADD
  2948. ADD::NonSimCompose(
  2949. std::vector<ADD> vect) const
  2950. {
  2951. DdManager *mgr = p->manager;
  2952. size_t n = (size_t) Cudd_ReadSize(mgr);
  2953. DdNode **X = new DdNode *[n];
  2954. for (size_t i = 0; i < n; i++) {
  2955. X[i] = vect[i].node;
  2956. }
  2957. DdNode *result = Cudd_addNonSimCompose(mgr, node, X);
  2958. delete [] X;
  2959. checkReturnValue(result);
  2960. return ADD(p, result);
  2961. } // ADD::NonSimCompose
  2962. BDD
  2963. BDD::VectorCompose(
  2964. std::vector<BDD> vect) const
  2965. {
  2966. DdManager *mgr = p->manager;
  2967. size_t n = (size_t) Cudd_ReadSize(mgr);
  2968. DdNode **X = new DdNode *[n];
  2969. for (size_t i = 0; i < n; i++) {
  2970. X[i] = vect[i].node;
  2971. }
  2972. DdNode *result = Cudd_bddVectorCompose(mgr, node, X);
  2973. delete [] X;
  2974. checkReturnValue(result);
  2975. return BDD(p, result);
  2976. } // BDD::VectorCompose
  2977. void
  2978. BDD::ApproxConjDecomp(
  2979. BDD* g,
  2980. BDD* h) const
  2981. {
  2982. DdManager *mgr = p->manager;
  2983. DdNode **pieces;
  2984. int result = Cudd_bddApproxConjDecomp(mgr, node, &pieces);
  2985. checkReturnValue(result == 2);
  2986. *g = BDD(p, pieces[0]);
  2987. *h = BDD(p, pieces[1]);
  2988. Cudd_RecursiveDeref(mgr,pieces[0]);
  2989. Cudd_RecursiveDeref(mgr,pieces[1]);
  2990. free(pieces);
  2991. } // BDD::ApproxConjDecomp
  2992. void
  2993. BDD::ApproxDisjDecomp(
  2994. BDD* g,
  2995. BDD* h) const
  2996. {
  2997. DdManager *mgr = p->manager;
  2998. DdNode **pieces;
  2999. int result = Cudd_bddApproxDisjDecomp(mgr, node, &pieces);
  3000. checkReturnValue(result == 2);
  3001. *g = BDD(p, pieces[0]);
  3002. *h = BDD(p, pieces[1]);
  3003. Cudd_RecursiveDeref(mgr,pieces[0]);
  3004. Cudd_RecursiveDeref(mgr,pieces[1]);
  3005. free(pieces);
  3006. } // BDD::ApproxDisjDecomp
  3007. void
  3008. BDD::IterConjDecomp(
  3009. BDD* g,
  3010. BDD* h) const
  3011. {
  3012. DdManager *mgr = p->manager;
  3013. DdNode **pieces;
  3014. int result = Cudd_bddIterConjDecomp(mgr, node, &pieces);
  3015. checkReturnValue(result == 2);
  3016. *g = BDD(p, pieces[0]);
  3017. *h = BDD(p, pieces[1]);
  3018. Cudd_RecursiveDeref(mgr,pieces[0]);
  3019. Cudd_RecursiveDeref(mgr,pieces[1]);
  3020. free(pieces);
  3021. } // BDD::IterConjDecomp
  3022. void
  3023. BDD::IterDisjDecomp(
  3024. BDD* g,
  3025. BDD* h) const
  3026. {
  3027. DdManager *mgr = p->manager;
  3028. DdNode **pieces;
  3029. int result = Cudd_bddIterDisjDecomp(mgr, node, &pieces);
  3030. checkReturnValue(result == 2);
  3031. *g = BDD(p, pieces[0]);
  3032. *h = BDD(p, pieces[1]);
  3033. Cudd_RecursiveDeref(mgr,pieces[0]);
  3034. Cudd_RecursiveDeref(mgr,pieces[1]);
  3035. free(pieces);
  3036. } // BDD::IterDisjDecomp
  3037. void
  3038. BDD::GenConjDecomp(
  3039. BDD* g,
  3040. BDD* h) const
  3041. {
  3042. DdManager *mgr = p->manager;
  3043. DdNode **pieces;
  3044. int result = Cudd_bddGenConjDecomp(mgr, node, &pieces);
  3045. checkReturnValue(result == 2);
  3046. *g = BDD(p, pieces[0]);
  3047. *h = BDD(p, pieces[1]);
  3048. Cudd_RecursiveDeref(mgr,pieces[0]);
  3049. Cudd_RecursiveDeref(mgr,pieces[1]);
  3050. free(pieces);
  3051. } // BDD::GenConjDecomp
  3052. void
  3053. BDD::GenDisjDecomp(
  3054. BDD* g,
  3055. BDD* h) const
  3056. {
  3057. DdManager *mgr = p->manager;
  3058. DdNode **pieces;
  3059. int result = Cudd_bddGenDisjDecomp(mgr, node, &pieces);
  3060. checkReturnValue(result == 2);
  3061. *g = BDD(p, pieces[0]);
  3062. *h = BDD(p, pieces[1]);
  3063. Cudd_RecursiveDeref(mgr,pieces[0]);
  3064. Cudd_RecursiveDeref(mgr,pieces[1]);
  3065. free(pieces);
  3066. } // BDD::GenDisjDecomp
  3067. void
  3068. BDD::VarConjDecomp(
  3069. BDD* g,
  3070. BDD* h) const
  3071. {
  3072. DdManager *mgr = p->manager;
  3073. DdNode **pieces;
  3074. int result = Cudd_bddVarConjDecomp(mgr, node, &pieces);
  3075. checkReturnValue(result == 2);
  3076. *g = BDD(p, pieces[0]);
  3077. *h = BDD(p, pieces[1]);
  3078. Cudd_RecursiveDeref(mgr,pieces[0]);
  3079. Cudd_RecursiveDeref(mgr,pieces[1]);
  3080. free(pieces);
  3081. } // BDD::VarConjDecomp
  3082. void
  3083. BDD::VarDisjDecomp(
  3084. BDD* g,
  3085. BDD* h) const
  3086. {
  3087. DdManager *mgr = p->manager;
  3088. DdNode **pieces;
  3089. int result = Cudd_bddVarDisjDecomp(mgr, node, &pieces);
  3090. checkReturnValue(result == 2);
  3091. *g = BDD(p, pieces[0]);
  3092. *h = BDD(p, pieces[1]);
  3093. Cudd_RecursiveDeref(mgr,pieces[0]);
  3094. Cudd_RecursiveDeref(mgr,pieces[1]);
  3095. free(pieces);
  3096. } // BDD::VarDisjDecomp
  3097. bool
  3098. ABDD::IsCube() const
  3099. {
  3100. DdManager *mgr = p->manager;
  3101. return Cudd_CheckCube(mgr, node);
  3102. } // ABDD::IsCube
  3103. BDD
  3104. ABDD::FindEssential() const
  3105. {
  3106. DdManager *mgr = p->manager;
  3107. DdNode *result = Cudd_FindEssential(mgr, node);
  3108. checkReturnValue(result);
  3109. return BDD(p, result);
  3110. } // ABDD::FindEssential
  3111. bool
  3112. BDD::IsVarEssential(
  3113. int id,
  3114. int phase) const
  3115. {
  3116. DdManager *mgr = p->manager;
  3117. return Cudd_bddIsVarEssential(mgr, node, id, phase);
  3118. } // BDD::IsVarEssential
  3119. void
  3120. ABDD::PrintTwoLiteralClauses(
  3121. char **names,
  3122. FILE *fp) const
  3123. {
  3124. DdManager *mgr = p->manager;
  3125. int result = Cudd_PrintTwoLiteralClauses(mgr, node, names, fp);
  3126. checkReturnValue(result);
  3127. } // ABDD::PrintTwoLiteralClauses
  3128. void
  3129. Cudd::DumpBlif(
  3130. const std::vector<BDD>& nodes,
  3131. char const * const * inames,
  3132. char const * const * onames,
  3133. char * mname,
  3134. FILE * fp,
  3135. int mv) const
  3136. {
  3137. DdManager *mgr = p->manager;
  3138. size_t n = nodes.size();
  3139. DdNode **F = new DdNode *[n];
  3140. for (size_t i = 0; i < n; i ++) {
  3141. F[i] = nodes[i].getNode();
  3142. }
  3143. int result = Cudd_DumpBlif(mgr, (int) n, F, inames, onames, mname, fp, mv);
  3144. delete [] F;
  3145. checkReturnValue(result);
  3146. } // Cudd::DumpBlif
  3147. void
  3148. Cudd::DumpDot(
  3149. const std::vector<BDD>& nodes,
  3150. char const * const * inames,
  3151. char const * const * onames,
  3152. FILE * fp) const
  3153. {
  3154. DdManager *mgr = p->manager;
  3155. size_t n = nodes.size();
  3156. DdNode **F = new DdNode *[n];
  3157. for (size_t i = 0; i < n; i ++) {
  3158. F[i] = nodes[i].getNode();
  3159. }
  3160. int result = Cudd_DumpDot(mgr, (int) n, F, inames, onames, fp);
  3161. delete [] F;
  3162. checkReturnValue(result);
  3163. } // Cudd::DumpDot
  3164. void
  3165. Cudd::DumpDot(
  3166. const std::vector<ADD>& nodes,
  3167. char const * const * inames,
  3168. char const * const * onames,
  3169. FILE * fp) const
  3170. {
  3171. DdManager *mgr = p->manager;
  3172. size_t n = nodes.size();
  3173. DdNode **F = new DdNode *[n];
  3174. for (size_t i = 0; i < n; i ++) {
  3175. F[i] = nodes[i].getNode();
  3176. }
  3177. int result = Cudd_DumpDot(mgr, (int) n, F, inames, onames, fp);
  3178. delete [] F;
  3179. checkReturnValue(result);
  3180. } // Cudd::DumpDot
  3181. void
  3182. Cudd::DumpDaVinci(
  3183. const std::vector<BDD>& nodes,
  3184. char const * const * inames,
  3185. char const * const * onames,
  3186. FILE * fp) const
  3187. {
  3188. DdManager *mgr = p->manager;
  3189. size_t n = nodes.size();
  3190. DdNode **F = new DdNode *[n];
  3191. for (size_t i = 0; i < n; i ++) {
  3192. F[i] = nodes[i].getNode();
  3193. }
  3194. int result = Cudd_DumpDaVinci(mgr, (int) n, F, inames, onames, fp);
  3195. delete [] F;
  3196. checkReturnValue(result);
  3197. } // Cudd::DumpDaVinci
  3198. void
  3199. Cudd::DumpDaVinci(
  3200. const std::vector<ADD>& nodes,
  3201. char const * const * inames,
  3202. char const * const * onames,
  3203. FILE * fp) const
  3204. {
  3205. DdManager *mgr = p->manager;
  3206. size_t n = nodes.size();
  3207. DdNode **F = new DdNode *[n];
  3208. for (size_t i = 0; i < n; i ++) {
  3209. F[i] = nodes[i].getNode();
  3210. }
  3211. int result = Cudd_DumpDaVinci(mgr, (int) n, F, inames, onames, fp);
  3212. delete [] F;
  3213. checkReturnValue(result);
  3214. } // Cudd::DumpDaVinci
  3215. void
  3216. Cudd::DumpDDcal(
  3217. const std::vector<BDD>& nodes,
  3218. char const * const * inames,
  3219. char const * const * onames,
  3220. FILE * fp) const
  3221. {
  3222. DdManager *mgr = p->manager;
  3223. size_t n = nodes.size();
  3224. DdNode **F = new DdNode *[n];
  3225. for (size_t i = 0; i < n; i ++) {
  3226. F[i] = nodes[i].getNode();
  3227. }
  3228. int result = Cudd_DumpDDcal(mgr, (int) n, F, inames, onames, fp);
  3229. delete [] F;
  3230. checkReturnValue(result);
  3231. } // Cudd::DumpDDcal
  3232. void
  3233. Cudd::DumpFactoredForm(
  3234. const std::vector<BDD>& nodes,
  3235. char const * const * inames,
  3236. char const * const * onames,
  3237. FILE * fp) const
  3238. {
  3239. DdManager *mgr = p->manager;
  3240. size_t n = nodes.size();
  3241. DdNode **F = new DdNode *[n];
  3242. for (size_t i = 0; i < n; i ++) {
  3243. F[i] = nodes[i].getNode();
  3244. }
  3245. int result = Cudd_DumpFactoredForm(mgr, (int) n, F, inames, onames, fp);
  3246. delete [] F;
  3247. checkReturnValue(result);
  3248. } // Cudd::DumpFactoredForm
  3249. void
  3250. BDD::PrintFactoredForm(
  3251. char const * const * inames,
  3252. FILE * fp) const
  3253. {
  3254. DdManager *mgr = p->manager;
  3255. DdNode *f = node;
  3256. int result = Cudd_DumpFactoredForm(mgr, 0, &f, inames, 0, fp);
  3257. checkReturnValue(result);
  3258. } // BDD::PrintFactoredForm
  3259. string
  3260. BDD::FactoredFormString(char const * const * inames) const
  3261. {
  3262. DdManager *mgr = p->manager;
  3263. DdNode *f = node;
  3264. char *cstr = Cudd_FactoredFormString(mgr, f, inames);
  3265. checkReturnValue(cstr);
  3266. string str(cstr);
  3267. free(cstr);
  3268. return str;
  3269. } // BDD::FactoredFormString
  3270. BDD
  3271. BDD::Constrain(
  3272. const BDD& c) const
  3273. {
  3274. DdManager *mgr = checkSameManager(c);
  3275. DdNode *result = Cudd_bddConstrain(mgr, node, c.node);
  3276. checkReturnValue(result);
  3277. return BDD(p, result);
  3278. } // BDD::Constrain
  3279. BDD
  3280. BDD::Restrict(
  3281. const BDD& c) const
  3282. {
  3283. DdManager *mgr = checkSameManager(c);
  3284. DdNode *result = Cudd_bddRestrict(mgr, node, c.node);
  3285. checkReturnValue(result);
  3286. return BDD(p, result);
  3287. } // BDD::Restrict
  3288. BDD
  3289. BDD::NPAnd(
  3290. const BDD& g) const
  3291. {
  3292. DdManager *mgr = checkSameManager(g);
  3293. DdNode *result = Cudd_bddNPAnd(mgr, node, g.node);
  3294. checkReturnValue(result);
  3295. return BDD(p, result);
  3296. } // BDD::NPAnd
  3297. ADD
  3298. ADD::Constrain(
  3299. const ADD& c) const
  3300. {
  3301. DdManager *mgr = checkSameManager(c);
  3302. DdNode *result = Cudd_addConstrain(mgr, node, c.node);
  3303. checkReturnValue(result);
  3304. return ADD(p, result);
  3305. } // ADD::Constrain
  3306. std::vector<BDD>
  3307. BDD::ConstrainDecomp() const
  3308. {
  3309. DdManager *mgr = p->manager;
  3310. DdNode **result = Cudd_bddConstrainDecomp(mgr, node);
  3311. checkReturnValue(result);
  3312. int size = Cudd_ReadSize(mgr);
  3313. vector<BDD> vect;
  3314. for (int i = 0; i < size; i++) {
  3315. Cudd_Deref(result[i]);
  3316. vect.push_back(BDD(p, result[i]));
  3317. }
  3318. free(result);
  3319. return vect;
  3320. } // BDD::ConstrainDecomp
  3321. ADD
  3322. ADD::Restrict(
  3323. const ADD& c) const
  3324. {
  3325. DdManager *mgr = checkSameManager(c);
  3326. DdNode *result = Cudd_addRestrict(mgr, node, c.node);
  3327. checkReturnValue(result);
  3328. return ADD(p, result);
  3329. } // ADD::Restrict
  3330. std::vector<BDD>
  3331. BDD::CharToVect() const
  3332. {
  3333. DdManager *mgr = p->manager;
  3334. DdNode **result = Cudd_bddCharToVect(mgr, node);
  3335. checkReturnValue(result);
  3336. int size = Cudd_ReadSize(mgr);
  3337. vector<BDD> vect;
  3338. for (int i = 0; i < size; i++) {
  3339. Cudd_Deref(result[i]);
  3340. vect.push_back(BDD(p, result[i]));
  3341. }
  3342. free(result);
  3343. return vect;
  3344. } // BDD::CharToVect
  3345. BDD
  3346. BDD::LICompaction(
  3347. const BDD& c) const
  3348. {
  3349. DdManager *mgr = checkSameManager(c);
  3350. DdNode *result = Cudd_bddLICompaction(mgr, node, c.node);
  3351. checkReturnValue(result);
  3352. return BDD(p, result);
  3353. } // BDD::LICompaction
  3354. BDD
  3355. BDD::Squeeze(
  3356. const BDD& u) const
  3357. {
  3358. DdManager *mgr = checkSameManager(u);
  3359. DdNode *result = Cudd_bddSqueeze(mgr, node, u.node);
  3360. checkReturnValue(result);
  3361. return BDD(p, result);
  3362. } // BDD::Squeeze
  3363. BDD
  3364. BDD::Interpolate(
  3365. const BDD& u) const
  3366. {
  3367. DdManager *mgr = checkSameManager(u);
  3368. DdNode *result = Cudd_bddInterpolate(mgr, node, u.node);
  3369. checkReturnValue(result);
  3370. return BDD(p, result);
  3371. } // BDD::Interpolate
  3372. BDD
  3373. BDD::Minimize(
  3374. const BDD& c) const
  3375. {
  3376. DdManager *mgr = checkSameManager(c);
  3377. DdNode *result = Cudd_bddMinimize(mgr, node, c.node);
  3378. checkReturnValue(result);
  3379. return BDD(p, result);
  3380. } // BDD::Minimize
  3381. BDD
  3382. BDD::SubsetCompress(
  3383. int nvars,
  3384. int threshold) const
  3385. {
  3386. DdManager *mgr = p->manager;
  3387. DdNode *result = Cudd_SubsetCompress(mgr, node, nvars, threshold);
  3388. checkReturnValue(result);
  3389. return BDD(p, result);
  3390. } // BDD::SubsetCompress
  3391. BDD
  3392. BDD::SupersetCompress(
  3393. int nvars,
  3394. int threshold) const
  3395. {
  3396. DdManager *mgr = p->manager;
  3397. DdNode *result = Cudd_SupersetCompress(mgr, node, nvars, threshold);
  3398. checkReturnValue(result);
  3399. return BDD(p, result);
  3400. } // BDD::SupersetCompress
  3401. MtrNode *
  3402. Cudd::MakeTreeNode(
  3403. unsigned int low,
  3404. unsigned int size,
  3405. unsigned int type) const
  3406. {
  3407. return Cudd_MakeTreeNode(p->manager, low, size, type);
  3408. } // Cudd::MakeTreeNode
  3409. ADD
  3410. Cudd::Harwell(
  3411. FILE * fp,
  3412. std::vector<ADD>& x,
  3413. std::vector<ADD>& y,
  3414. std::vector<ADD>& xn,
  3415. std::vector<ADD>& yn_,
  3416. int * m,
  3417. int * n,
  3418. int bx,
  3419. int sx,
  3420. int by,
  3421. int sy,
  3422. int pr) const
  3423. {
  3424. DdManager *mgr = p->manager;
  3425. DdNode *E;
  3426. DdNode **xa = 0, **ya = 0, **xna = 0, **yna = 0;
  3427. int nx = x.size(), ny = y.size();
  3428. if (nx > 0) {
  3429. xa = (DdNode **) malloc(nx * sizeof(DdNode *));
  3430. if (!xa) {
  3431. p->errorHandler("Out of memory.");
  3432. }
  3433. xna = (DdNode **) malloc(nx * sizeof(DdNode *));
  3434. if (!xna) {
  3435. free(xa);
  3436. p->errorHandler("Out of memory.");
  3437. }
  3438. for (int i = 0; i < nx; ++i) {
  3439. xa[i] = x.at(i).node;
  3440. xna[i] = xn.at(i).node;
  3441. }
  3442. }
  3443. if (ny > 0) {
  3444. ya = (DdNode **) malloc(ny * sizeof(DdNode *));
  3445. if (!ya) {
  3446. free(xa);
  3447. free(xna);
  3448. p->errorHandler("Out of memory.");
  3449. }
  3450. yna = (DdNode **) malloc(ny * sizeof(DdNode *));
  3451. if (!yna) {
  3452. free(xa);
  3453. free(xna);
  3454. free(ya);
  3455. p->errorHandler("Out of memory.");
  3456. }
  3457. for (int j = 0; j < ny; ++j) {
  3458. ya[j] = y.at(j).node;
  3459. yna[j] = yn_.at(j).node;
  3460. }
  3461. }
  3462. int result = Cudd_addHarwell(fp, mgr, &E, &xa, &ya, &xna, &yna, &nx, &ny,
  3463. m, n, bx, sx, by, sy, pr);
  3464. checkReturnValue(result);
  3465. for (int i = x.size(); i < nx; ++i) {
  3466. x.push_back(ADD(p, xa[i]));
  3467. xn.push_back(ADD(p, xna[i]));
  3468. }
  3469. free(xa);
  3470. free(xna);
  3471. for (int j = y.size(); j < ny; ++j) {
  3472. y.push_back(ADD(p, ya[j]));
  3473. yn_.push_back(ADD(p, yna[j]));
  3474. }
  3475. free(ya);
  3476. free(yna);
  3477. Cudd_Deref(E);
  3478. return ADD(p, E);
  3479. } // Cudd::Harwell
  3480. void
  3481. Cudd::PrintLinear(void) const
  3482. {
  3483. cout.flush();
  3484. int result = Cudd_PrintLinear(p->manager);
  3485. checkReturnValue(result);
  3486. } // Cudd::PrintLinear
  3487. int
  3488. Cudd::ReadLinear(
  3489. int x,
  3490. int y) const
  3491. {
  3492. return Cudd_ReadLinear(p->manager, x, y);
  3493. } // Cudd::ReadLinear
  3494. BDD
  3495. BDD::LiteralSetIntersection(
  3496. const BDD& g) const
  3497. {
  3498. DdManager *mgr = checkSameManager(g);
  3499. DdNode *result = Cudd_bddLiteralSetIntersection(mgr, node, g.node);
  3500. checkReturnValue(result);
  3501. return BDD(p, result);
  3502. } // BDD::LiteralSetIntersection
  3503. ADD
  3504. ADD::MatrixMultiply(
  3505. const ADD& B,
  3506. std::vector<ADD> z) const
  3507. {
  3508. size_t nz = z.size();
  3509. DdManager *mgr = checkSameManager(B);
  3510. DdNode **Z = new DdNode *[nz];
  3511. for (size_t i = 0; i < nz; i++) {
  3512. Z[i] = z[i].node;
  3513. }
  3514. DdNode *result = Cudd_addMatrixMultiply(mgr, node, B.node, Z, (int) nz);
  3515. delete [] Z;
  3516. checkReturnValue(result);
  3517. return ADD(p, result);
  3518. } // ADD::MatrixMultiply
  3519. ADD
  3520. ADD::TimesPlus(
  3521. const ADD& B,
  3522. std::vector<ADD> z) const
  3523. {
  3524. size_t nz = z.size();
  3525. DdManager *mgr = checkSameManager(B);
  3526. DdNode **Z = new DdNode *[nz];
  3527. for (size_t i = 0; i < nz; i++) {
  3528. Z[i] = z[i].node;
  3529. }
  3530. DdNode *result = Cudd_addTimesPlus(mgr, node, B.node, Z, (int) nz);
  3531. delete [] Z;
  3532. checkReturnValue(result);
  3533. return ADD(p, result);
  3534. } // ADD::TimesPlus
  3535. ADD
  3536. ADD::Triangle(
  3537. const ADD& g,
  3538. std::vector<ADD> z) const
  3539. {
  3540. size_t nz = z.size();
  3541. DdManager *mgr = checkSameManager(g);
  3542. DdNode **Z = new DdNode *[nz];
  3543. for (size_t i = 0; i < nz; i++) {
  3544. Z[i] = z[i].node;
  3545. }
  3546. DdNode *result = Cudd_addTriangle(mgr, node, g.node, Z, (int) nz);
  3547. delete [] Z;
  3548. checkReturnValue(result);
  3549. return ADD(p, result);
  3550. } // ADD::Triangle
  3551. BDD
  3552. BDD::PrioritySelect(
  3553. std::vector<BDD> x,
  3554. std::vector<BDD> y,
  3555. std::vector<BDD> z,
  3556. const BDD& Pi,
  3557. DD_PRFP Pifunc) const
  3558. {
  3559. size_t n = x.size();
  3560. DdManager *mgr = p->manager;
  3561. DdNode **X = new DdNode *[n];
  3562. DdNode **Y = new DdNode *[n];
  3563. DdNode **Z = new DdNode *[n];
  3564. for (size_t i = 0; i < n; i++) {
  3565. X[i] = x[i].node;
  3566. Y[i] = y[i].node;
  3567. Z[i] = z[i].node;
  3568. }
  3569. DdNode *result = Cudd_PrioritySelect(mgr, node, X, Y, Z, Pi.node,
  3570. (int) n, Pifunc);
  3571. delete [] X;
  3572. delete [] Y;
  3573. delete [] Z;
  3574. checkReturnValue(result);
  3575. return BDD(p, result);
  3576. } // BDD::PrioritySelect
  3577. BDD
  3578. Cudd::Xgty(
  3579. std::vector<BDD> z,
  3580. std::vector<BDD> x,
  3581. std::vector<BDD> y) const
  3582. {
  3583. size_t N = z.size();
  3584. DdManager *mgr = p->manager;
  3585. DdNode **X = new DdNode *[N];
  3586. DdNode **Y = new DdNode *[N];
  3587. DdNode **Z = new DdNode *[N];
  3588. for (size_t i = 0; i < N; i++) {
  3589. X[i] = x[i].getNode();
  3590. Y[i] = y[i].getNode();
  3591. Z[i] = z[i].getNode();
  3592. }
  3593. DdNode *result = Cudd_Xgty(mgr, (int) N, Z, X, Y);
  3594. delete [] X;
  3595. delete [] Y;
  3596. delete [] Z;
  3597. checkReturnValue(result);
  3598. return BDD(p, result);
  3599. } // Cudd::Xgty
  3600. BDD
  3601. Cudd::Xeqy(
  3602. std::vector<BDD> x,
  3603. std::vector<BDD> y) const
  3604. {
  3605. size_t N = x.size();
  3606. DdManager *mgr = p->manager;
  3607. DdNode **X = new DdNode *[N];
  3608. DdNode **Y = new DdNode *[N];
  3609. for (size_t i = 0; i < N; i++) {
  3610. X[i] = x[i].getNode();
  3611. Y[i] = y[i].getNode();
  3612. }
  3613. DdNode *result = Cudd_Xeqy(mgr, (int) N, X, Y);
  3614. delete [] X;
  3615. delete [] Y;
  3616. checkReturnValue(result);
  3617. return BDD(p, result);
  3618. } // BDD::Xeqy
  3619. ADD
  3620. Cudd::Xeqy(
  3621. std::vector<ADD> x,
  3622. std::vector<ADD> y) const
  3623. {
  3624. size_t N = x.size();
  3625. DdManager *mgr = p->manager;
  3626. DdNode **X = new DdNode *[N];
  3627. DdNode **Y = new DdNode *[N];
  3628. for (size_t i = 0; i < N; i++) {
  3629. X[i] = x[i].getNode();
  3630. Y[i] = y[i].getNode();
  3631. }
  3632. DdNode *result = Cudd_addXeqy(mgr, (int) N, X, X);
  3633. delete [] X;
  3634. delete [] Y;
  3635. checkReturnValue(result);
  3636. return ADD(p, result);
  3637. } // ADD::Xeqy
  3638. BDD
  3639. Cudd::Dxygtdxz(
  3640. std::vector<BDD> x,
  3641. std::vector<BDD> y,
  3642. std::vector<BDD> z) const
  3643. {
  3644. size_t N = x.size();
  3645. DdManager *mgr = p->manager;
  3646. DdNode **X = new DdNode *[N];
  3647. DdNode **Y = new DdNode *[N];
  3648. DdNode **Z = new DdNode *[N];
  3649. for (size_t i = 0; i < N; i++) {
  3650. X[i] = x[i].getNode();
  3651. Y[i] = y[i].getNode();
  3652. Z[i] = z[i].getNode();
  3653. }
  3654. DdNode *result = Cudd_Dxygtdxz(mgr, (int) N, X, Y, Z);
  3655. delete [] X;
  3656. delete [] Y;
  3657. delete [] Z;
  3658. checkReturnValue(result);
  3659. return BDD(p, result);
  3660. } // Cudd::Dxygtdxz
  3661. BDD
  3662. Cudd::Dxygtdyz(
  3663. std::vector<BDD> x,
  3664. std::vector<BDD> y,
  3665. std::vector<BDD> z) const
  3666. {
  3667. size_t N = x.size();
  3668. DdManager *mgr = p->manager;
  3669. DdNode **X = new DdNode *[N];
  3670. DdNode **Y = new DdNode *[N];
  3671. DdNode **Z = new DdNode *[N];
  3672. for (size_t i = 0; i < N; i++) {
  3673. X[i] = x[i].getNode();
  3674. Y[i] = y[i].getNode();
  3675. Z[i] = z[i].getNode();
  3676. }
  3677. DdNode *result = Cudd_Dxygtdyz(mgr, (int) N, X, Y, Z);
  3678. delete [] X;
  3679. delete [] Y;
  3680. delete [] Z;
  3681. checkReturnValue(result);
  3682. return BDD(p, result);
  3683. } // Cudd::Dxygtdyz
  3684. BDD
  3685. Cudd::Inequality(
  3686. int c,
  3687. std::vector<BDD> x,
  3688. std::vector<BDD> y) const
  3689. {
  3690. size_t N = x.size();
  3691. DdManager *mgr = p->manager;
  3692. DdNode **X = new DdNode *[N];
  3693. DdNode **Y = new DdNode *[N];
  3694. for (size_t i = 0; i < N; i++) {
  3695. X[i] = x[i].getNode();
  3696. Y[i] = y[i].getNode();
  3697. }
  3698. DdNode *result = Cudd_Inequality(mgr, (int) N, c, X, Y);
  3699. delete [] X;
  3700. delete [] Y;
  3701. checkReturnValue(result);
  3702. return BDD(p, result);
  3703. } // Cudd::Inequality
  3704. BDD
  3705. Cudd::Disequality(
  3706. int c,
  3707. std::vector<BDD> x,
  3708. std::vector<BDD> y) const
  3709. {
  3710. size_t N = x.size();
  3711. DdManager *mgr = p->manager;
  3712. DdNode **X = new DdNode *[N];
  3713. DdNode **Y = new DdNode *[N];
  3714. for (size_t i = 0; i < N; i++) {
  3715. X[i] = x[i].getNode();
  3716. Y[i] = y[i].getNode();
  3717. }
  3718. DdNode *result = Cudd_Disequality(mgr, (int) N, c, X, Y);
  3719. delete [] X;
  3720. delete [] Y;
  3721. checkReturnValue(result);
  3722. return BDD(p, result);
  3723. } // Cudd::Disequality
  3724. BDD
  3725. Cudd::Interval(
  3726. std::vector<BDD> x,
  3727. unsigned int lowerB,
  3728. unsigned int upperB) const
  3729. {
  3730. size_t N = x.size();
  3731. DdManager *mgr = p->manager;
  3732. DdNode **X = new DdNode *[N];
  3733. for (size_t i = 0; i < N; i++) {
  3734. X[i] = x[i].getNode();
  3735. }
  3736. DdNode *result = Cudd_bddInterval(mgr, (int) N, X, lowerB, upperB);
  3737. delete [] X;
  3738. checkReturnValue(result);
  3739. return BDD(p, result);
  3740. } // Cudd::Interval
  3741. BDD
  3742. BDD::CProjection(
  3743. const BDD& Y) const
  3744. {
  3745. DdManager *mgr = checkSameManager(Y);
  3746. DdNode *result = Cudd_CProjection(mgr, node, Y.node);
  3747. checkReturnValue(result);
  3748. return BDD(p, result);
  3749. } // BDD::CProjection
  3750. int
  3751. BDD::MinHammingDist(
  3752. int *minterm,
  3753. int upperBound) const
  3754. {
  3755. DdManager *mgr = p->manager;
  3756. int result = Cudd_MinHammingDist(mgr, node, minterm, upperBound);
  3757. return result;
  3758. } // BDD::MinHammingDist
  3759. ADD
  3760. Cudd::Hamming(
  3761. std::vector<ADD> xVars,
  3762. std::vector<ADD> yVars) const
  3763. {
  3764. size_t nVars = xVars.size();
  3765. DdManager *mgr = p->manager;
  3766. DdNode **X = new DdNode *[nVars];
  3767. DdNode **Y = new DdNode *[nVars];
  3768. for (size_t i = 0; i < nVars; i++) {
  3769. X[i] = xVars[i].getNode();
  3770. Y[i] = yVars[i].getNode();
  3771. }
  3772. DdNode *result = Cudd_addHamming(mgr, X, Y, (int) nVars);
  3773. delete [] X;
  3774. delete [] Y;
  3775. checkReturnValue(result);
  3776. return ADD(p, result);
  3777. } // Cudd::Hamming
  3778. ADD
  3779. Cudd::Read(
  3780. FILE * fp,
  3781. std::vector<ADD>& x,
  3782. std::vector<ADD>& y,
  3783. std::vector<ADD>& xn,
  3784. std::vector<ADD>& yn_,
  3785. int * m,
  3786. int * n,
  3787. int bx,
  3788. int sx,
  3789. int by,
  3790. int sy) const
  3791. {
  3792. DdManager *mgr = p->manager;
  3793. DdNode *E;
  3794. DdNode **xa = 0, **ya = 0, **xna = 0, **yna = 0;
  3795. int nx = x.size(), ny = y.size();
  3796. if (nx > 0) {
  3797. xa = (DdNode **) malloc(nx * sizeof(DdNode *));
  3798. if (!xa) {
  3799. p->errorHandler("Out of memory.");
  3800. }
  3801. xna = (DdNode **) malloc(nx * sizeof(DdNode *));
  3802. if (!xna) {
  3803. free(xa);
  3804. p->errorHandler("Out of memory.");
  3805. }
  3806. for (int i = 0; i < nx; ++i) {
  3807. xa[i] = x.at(i).node;
  3808. xna[i] = xn.at(i).node;
  3809. }
  3810. }
  3811. if (ny > 0) {
  3812. ya = (DdNode **) malloc(ny * sizeof(DdNode *));
  3813. if (!ya) {
  3814. free(xa);
  3815. free(xna);
  3816. p->errorHandler("Out of memory.");
  3817. }
  3818. yna = (DdNode **) malloc(ny * sizeof(DdNode *));
  3819. if (!yna) {
  3820. free(xa);
  3821. free(xna);
  3822. free(ya);
  3823. p->errorHandler("Out of memory.");
  3824. }
  3825. for (int j = 0; j < ny; ++j) {
  3826. ya[j] = y.at(j).node;
  3827. yna[j] = yn_.at(j).node;
  3828. }
  3829. }
  3830. int result = Cudd_addRead(fp, mgr, &E, &xa, &ya, &xna, &yna, &nx, &ny,
  3831. m, n, bx, sx, by, sy);
  3832. checkReturnValue(result);
  3833. for (int i = x.size(); i < nx; ++i) {
  3834. x.push_back(ADD(p, xa[i]));
  3835. xn.push_back(ADD(p, xna[i]));
  3836. }
  3837. free(xa);
  3838. free(xna);
  3839. for (int j = y.size(); j < ny; ++j) {
  3840. y.push_back(ADD(p, ya[j]));
  3841. yn_.push_back(ADD(p, yna[j]));
  3842. }
  3843. free(ya);
  3844. free(yna);
  3845. Cudd_Deref(E);
  3846. return ADD(p, E);
  3847. } // Cudd::Read
  3848. BDD
  3849. Cudd::Read(
  3850. FILE * fp,
  3851. std::vector<BDD>& x,
  3852. std::vector<BDD>& y,
  3853. int * m,
  3854. int * n,
  3855. int bx,
  3856. int sx,
  3857. int by,
  3858. int sy) const
  3859. {
  3860. DdManager *mgr = p->manager;
  3861. DdNode *E;
  3862. DdNode **xa = 0, **ya = 0;
  3863. int nx = x.size(), ny = y.size();
  3864. if (nx > 0) {
  3865. xa = (DdNode **) malloc(nx * sizeof(DdNode *));
  3866. if (!xa) {
  3867. p->errorHandler("Out of memory.");
  3868. }
  3869. for (int i = 0; i < nx; ++i) {
  3870. xa[i] = x.at(i).node;
  3871. }
  3872. }
  3873. if (ny > 0) {
  3874. ya = (DdNode **) malloc(ny * sizeof(DdNode *));
  3875. if (!ya) {
  3876. free(xa);
  3877. p->errorHandler("Out of memory.");
  3878. }
  3879. for (int j = 0; j < nx; ++j) {
  3880. ya[j] = y.at(j).node;
  3881. }
  3882. }
  3883. int result = Cudd_bddRead(fp, mgr, &E, &xa, &ya, &nx, &ny,
  3884. m, n, bx, sx, by, sy);
  3885. checkReturnValue(result);
  3886. for (int i = x.size(); i < nx; ++i) {
  3887. x.push_back(BDD(p, xa[i]));
  3888. }
  3889. free(xa);
  3890. for (int j = y.size(); j < ny; ++j) {
  3891. y.push_back(BDD(p, ya[j]));
  3892. }
  3893. free(ya);
  3894. Cudd_Deref(E);
  3895. return BDD(p, E);
  3896. } // Cudd::Read
  3897. void
  3898. Cudd::ReduceHeap(
  3899. Cudd_ReorderingType heuristic,
  3900. int minsize) const
  3901. {
  3902. int result = Cudd_ReduceHeap(p->manager, heuristic, minsize);
  3903. checkReturnValue(result);
  3904. } // Cudd::ReduceHeap
  3905. void
  3906. Cudd::ShuffleHeap(
  3907. int * permutation) const
  3908. {
  3909. int result = Cudd_ShuffleHeap(p->manager, permutation);
  3910. checkReturnValue(result);
  3911. } // Cudd::ShuffleHeap
  3912. ADD
  3913. ADD::Eval(
  3914. int * inputs) const
  3915. {
  3916. DdManager *mgr = p->manager;
  3917. DdNode *result = Cudd_Eval(mgr, node, inputs);
  3918. checkReturnValue(result);
  3919. return ADD(p, result);
  3920. } // ADD::Eval
  3921. BDD
  3922. BDD::Eval(
  3923. int * inputs) const
  3924. {
  3925. DdManager *mgr = p->manager;
  3926. DdNode *result = Cudd_Eval(mgr, node, inputs);
  3927. checkReturnValue(result);
  3928. return BDD(p, result);
  3929. } // BDD::Eval
  3930. BDD
  3931. ABDD::ShortestPath(
  3932. int * weight,
  3933. int * support,
  3934. int * length) const
  3935. {
  3936. DdManager *mgr = p->manager;
  3937. DdNode *result = Cudd_ShortestPath(mgr, node, weight, support, length);
  3938. checkReturnValue(result);
  3939. return BDD(p, result);
  3940. } // ABDD::ShortestPath
  3941. BDD
  3942. ABDD::LargestCube(
  3943. int * length) const
  3944. {
  3945. DdManager *mgr = p->manager;
  3946. DdNode *result = Cudd_LargestCube(mgr, node, length);
  3947. checkReturnValue(result);
  3948. return BDD(p, result);
  3949. } // ABDD::LargestCube
  3950. int
  3951. ABDD::ShortestLength(
  3952. int * weight) const
  3953. {
  3954. DdManager *mgr = p->manager;
  3955. int result = Cudd_ShortestLength(mgr, node, weight);
  3956. checkReturnValue(result != CUDD_OUT_OF_MEM);
  3957. return result;
  3958. } // ABDD::ShortestLength
  3959. BDD
  3960. BDD::Decreasing(
  3961. int i) const
  3962. {
  3963. DdManager *mgr = p->manager;
  3964. DdNode *result = Cudd_Decreasing(mgr, node, i);
  3965. checkReturnValue(result);
  3966. return BDD(p, result);
  3967. } // BDD::Decreasing
  3968. BDD
  3969. BDD::Increasing(
  3970. int i) const
  3971. {
  3972. DdManager *mgr = p->manager;
  3973. DdNode *result = Cudd_Increasing(mgr, node, i);
  3974. checkReturnValue(result);
  3975. return BDD(p, result);
  3976. } // BDD::Increasing
  3977. bool
  3978. ABDD::EquivDC(
  3979. const ABDD& G,
  3980. const ABDD& D) const
  3981. {
  3982. DdManager *mgr = checkSameManager(G);
  3983. checkSameManager(D);
  3984. return Cudd_EquivDC(mgr, node, G.node, D.node);
  3985. } // ABDD::EquivDC
  3986. bool
  3987. BDD::LeqUnless(
  3988. const BDD& G,
  3989. const BDD& D) const
  3990. {
  3991. DdManager *mgr = checkSameManager(G);
  3992. checkSameManager(D);
  3993. int res = Cudd_bddLeqUnless(mgr, node, G.node, D.node);
  3994. return res;
  3995. } // BDD::LeqUnless
  3996. bool
  3997. ADD::EqualSupNorm(
  3998. const ADD& g,
  3999. CUDD_VALUE_TYPE tolerance,
  4000. int pr) const
  4001. {
  4002. DdManager *mgr = checkSameManager(g);
  4003. return Cudd_EqualSupNorm(mgr, node, g.node, tolerance, pr);
  4004. } // ADD::EqualSupNorm
  4005. bool
  4006. ADD::EqualSupNormRel(
  4007. const ADD& g,
  4008. CUDD_VALUE_TYPE tolerance,
  4009. int pr) const
  4010. {
  4011. DdManager *mgr = checkSameManager(g);
  4012. return Cudd_EqualSupNormRel(mgr, node, g.node, tolerance, pr) != 0;
  4013. } // ADD::EqualSupNormRel
  4014. BDD
  4015. BDD::MakePrime(
  4016. const BDD& F) const
  4017. {
  4018. DdManager *mgr = checkSameManager(F);
  4019. if (!Cudd_CheckCube(mgr, node)) {
  4020. p->errorHandler("Invalid argument.");
  4021. }
  4022. DdNode *result = Cudd_bddMakePrime(mgr, node, F.node);
  4023. checkReturnValue(result);
  4024. return BDD(p, result);
  4025. } // BDD:MakePrime
  4026. BDD
  4027. BDD::MaximallyExpand(
  4028. const BDD& ub,
  4029. const BDD& f)
  4030. {
  4031. DdManager *mgr = checkSameManager(ub);
  4032. checkSameManager(f);
  4033. DdNode *result = Cudd_bddMaximallyExpand(mgr, node, ub.node, f.node);
  4034. checkReturnValue(result);
  4035. return BDD(p, result);
  4036. } // BDD::MaximallyExpand
  4037. BDD
  4038. BDD::LargestPrimeUnate(
  4039. const BDD& phases)
  4040. {
  4041. DdManager *mgr = checkSameManager(phases);
  4042. DdNode *result = Cudd_bddLargestPrimeUnate(mgr, node, phases.node);
  4043. checkReturnValue(result);
  4044. return BDD(p, result);
  4045. } // BDD::LargestPrimeUnate
  4046. double *
  4047. ABDD::CofMinterm() const
  4048. {
  4049. DdManager *mgr = p->manager;
  4050. double *result = Cudd_CofMinterm(mgr, node);
  4051. checkReturnValue(result);
  4052. return result;
  4053. } // ABDD::CofMinterm
  4054. BDD
  4055. BDD::SolveEqn(
  4056. const BDD& Y,
  4057. std::vector<BDD> & G,
  4058. int ** yIndex,
  4059. int n) const
  4060. {
  4061. DdManager *mgr = checkSameManager(Y);
  4062. DdNode **g = new DdNode *[n];
  4063. DdNode *result = Cudd_SolveEqn(mgr, node, Y.node, g, yIndex, n);
  4064. checkReturnValue(result);
  4065. for (int i = 0; i < n; i++) {
  4066. G.push_back(BDD(p, g[i]));
  4067. Cudd_RecursiveDeref(mgr,g[i]);
  4068. }
  4069. delete [] g;
  4070. return BDD(p, result);
  4071. } // BDD::SolveEqn
  4072. BDD
  4073. BDD::VerifySol(
  4074. std::vector<BDD> const & G,
  4075. int * yIndex) const
  4076. {
  4077. size_t n = G.size();
  4078. DdManager *mgr = p->manager;
  4079. DdNode **g = new DdNode *[n];
  4080. for (size_t i = 0; i < n; i++) {
  4081. g[i] = G[i].node;
  4082. }
  4083. DdNode *result = Cudd_VerifySol(mgr, node, g, yIndex, (int) n);
  4084. delete [] g;
  4085. checkReturnValue(result);
  4086. return BDD(p, result);
  4087. } // BDD::VerifySol
  4088. BDD
  4089. BDD::SplitSet(
  4090. std::vector<BDD> xVars,
  4091. double m) const
  4092. {
  4093. size_t n = xVars.size();
  4094. DdManager *mgr = p->manager;
  4095. DdNode **X = new DdNode *[n];
  4096. for (size_t i = 0; i < n; i++) {
  4097. X[i] = xVars[i].node;
  4098. }
  4099. DdNode *result = Cudd_SplitSet(mgr, node, X, (int) n, m);
  4100. delete [] X;
  4101. checkReturnValue(result);
  4102. return BDD(p, result);
  4103. } // BDD::SplitSet
  4104. BDD
  4105. BDD::SubsetHeavyBranch(
  4106. int numVars,
  4107. int threshold) const
  4108. {
  4109. DdManager *mgr = p->manager;
  4110. DdNode *result = Cudd_SubsetHeavyBranch(mgr, node, numVars, threshold);
  4111. checkReturnValue(result);
  4112. return BDD(p, result);
  4113. } // BDD::SubsetHeavyBranch
  4114. BDD
  4115. BDD::SupersetHeavyBranch(
  4116. int numVars,
  4117. int threshold) const
  4118. {
  4119. DdManager *mgr = p->manager;
  4120. DdNode *result = Cudd_SupersetHeavyBranch(mgr, node, numVars, threshold);
  4121. checkReturnValue(result);
  4122. return BDD(p, result);
  4123. } // BDD::SupersetHeavyBranch
  4124. BDD
  4125. BDD::SubsetShortPaths(
  4126. int numVars,
  4127. int threshold,
  4128. bool hardlimit) const
  4129. {
  4130. DdManager *mgr = p->manager;
  4131. DdNode *result = Cudd_SubsetShortPaths(mgr, node, numVars, threshold, hardlimit);
  4132. checkReturnValue(result);
  4133. return BDD(p, result);
  4134. } // BDD::SubsetShortPaths
  4135. BDD
  4136. BDD::SupersetShortPaths(
  4137. int numVars,
  4138. int threshold,
  4139. bool hardlimit) const
  4140. {
  4141. DdManager *mgr = p->manager;
  4142. DdNode *result = Cudd_SupersetShortPaths(mgr, node, numVars, threshold, hardlimit);
  4143. checkReturnValue(result);
  4144. return BDD(p, result);
  4145. } // BDD::SupersetShortPaths
  4146. void
  4147. Cudd::SymmProfile(
  4148. int lower,
  4149. int upper) const
  4150. {
  4151. Cudd_SymmProfile(p->manager, lower, upper);
  4152. } // Cudd::SymmProfile
  4153. unsigned int
  4154. Cudd::Prime(
  4155. unsigned int pr) const
  4156. {
  4157. return Cudd_Prime(pr);
  4158. } // Cudd::Prime
  4159. void
  4160. Cudd::Reserve(
  4161. int amount) const
  4162. {
  4163. int result = Cudd_Reserve(p->manager, amount);
  4164. checkReturnValue(result);
  4165. } // Cudd::Reserve
  4166. void
  4167. ABDD::PrintMinterm() const
  4168. {
  4169. cout.flush();
  4170. DdManager *mgr = p->manager;
  4171. int result = Cudd_PrintMinterm(mgr, node);
  4172. checkReturnValue(result);
  4173. } // ABDD::PrintMinterm
  4174. void
  4175. BDD::PrintCover() const
  4176. {
  4177. cout.flush();
  4178. DdManager *mgr = p->manager;
  4179. int result = Cudd_bddPrintCover(mgr, node, node);
  4180. checkReturnValue(result);
  4181. } // BDD::PrintCover
  4182. void
  4183. BDD::PrintCover(
  4184. const BDD& u) const
  4185. {
  4186. checkSameManager(u);
  4187. cout.flush();
  4188. DdManager *mgr = p->manager;
  4189. int result = Cudd_bddPrintCover(mgr, node, u.node);
  4190. checkReturnValue(result);
  4191. } // BDD::PrintCover
  4192. int
  4193. BDD::EstimateCofactor(
  4194. int i,
  4195. int phase) const
  4196. {
  4197. DdManager *mgr = p->manager;
  4198. int result = Cudd_EstimateCofactor(mgr, node, i, phase);
  4199. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4200. return result;
  4201. } // BDD::EstimateCofactor
  4202. int
  4203. BDD::EstimateCofactorSimple(
  4204. int i) const
  4205. {
  4206. int result = Cudd_EstimateCofactorSimple(node, i);
  4207. return result;
  4208. } // BDD::EstimateCofactorSimple
  4209. int
  4210. Cudd::SharingSize(
  4211. DD* nodes,
  4212. int n) const
  4213. {
  4214. DdNode **nodeArray = new DdNode *[n];
  4215. for (int i = 0; i < n; i++) {
  4216. nodeArray[i] = nodes[i].getNode();
  4217. }
  4218. int result = Cudd_SharingSize(nodeArray, n);
  4219. delete [] nodeArray;
  4220. checkReturnValue(n == 0 || result > 0);
  4221. return result;
  4222. } // Cudd::SharingSize
  4223. int
  4224. Cudd::SharingSize(
  4225. const std::vector<BDD>& v) const
  4226. {
  4227. vector<BDD>::size_type n = v.size();
  4228. DdNode **nodeArray = new DdNode *[n];
  4229. for (vector<BDD>::size_type i = 0; i != n; ++i) {
  4230. nodeArray[i] = v[i].getNode();
  4231. }
  4232. int result = Cudd_SharingSize(nodeArray, (int) n);
  4233. delete [] nodeArray;
  4234. checkReturnValue(n == 0 || result > 0);
  4235. return result;
  4236. } // Cudd::SharingSize
  4237. double
  4238. ABDD::CountMinterm(
  4239. int nvars) const
  4240. {
  4241. DdManager *mgr = p->manager;
  4242. double result = Cudd_CountMinterm(mgr, node, nvars);
  4243. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4244. return result;
  4245. } // ABDD::CountMinterm
  4246. double
  4247. ABDD::CountPath() const
  4248. {
  4249. double result = Cudd_CountPath(node);
  4250. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4251. return result;
  4252. } // ABDD::CountPath
  4253. BDD
  4254. ABDD::Support() const
  4255. {
  4256. DdManager *mgr = p->manager;
  4257. DdNode *result = Cudd_Support(mgr, node);
  4258. checkReturnValue(result);
  4259. return BDD(p, result);
  4260. } // ABDD::Support
  4261. int
  4262. ABDD::SupportSize() const
  4263. {
  4264. DdManager *mgr = p->manager;
  4265. int result = Cudd_SupportSize(mgr, node);
  4266. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4267. return result;
  4268. } // ABDD::SupportSize
  4269. BDD
  4270. Cudd::VectorSupport(const std::vector<BDD>& roots) const
  4271. {
  4272. size_t n = roots.size();
  4273. DdManager *mgr = p->manager;
  4274. DdNode **F = new DdNode *[n];
  4275. for (size_t i = 0; i < n; i++) {
  4276. F[i] = roots[i].getNode();
  4277. }
  4278. DdNode *result = Cudd_VectorSupport(mgr, F, (int) n);
  4279. delete [] F;
  4280. checkReturnValue(result);
  4281. return BDD(p, result);
  4282. } // Cudd::VectorSupport
  4283. std::vector<unsigned int>
  4284. ABDD::SupportIndices() const
  4285. {
  4286. unsigned int *support;
  4287. DdManager *mgr = p->manager;
  4288. int size = Cudd_SupportIndices(mgr, node, (int **)&support);
  4289. checkReturnValue(size >= 0);
  4290. // size could be 0, in which case support is 0 too!
  4291. vector<unsigned int> indices(support, support+size);
  4292. if (support) free(support);
  4293. return indices;
  4294. } // ABDD::SupportIndices
  4295. std::vector<unsigned int>
  4296. Cudd::SupportIndices(const std::vector<BDD>& roots) const
  4297. {
  4298. unsigned int *support;
  4299. size_t n = roots.size();
  4300. DdManager *mgr = p->manager;
  4301. DdNode **F = new DdNode *[n];
  4302. for (size_t i = 0; i < n; i++) {
  4303. F[i] = roots[i].getNode();
  4304. }
  4305. int size = Cudd_VectorSupportIndices(mgr, F, (int) n, (int **)&support);
  4306. delete [] F;
  4307. checkReturnValue(size >= 0);
  4308. // size could be 0, in which case support is 0 too!
  4309. vector<unsigned int> indices(support, support+size);
  4310. if (support) free(support);
  4311. return indices;
  4312. } // Cudd::SupportIndices
  4313. std::vector<unsigned int>
  4314. Cudd::SupportIndices(const std::vector<ADD>& roots) const
  4315. {
  4316. unsigned int *support;
  4317. size_t n = roots.size();
  4318. DdManager *mgr = p->manager;
  4319. DdNode **F = new DdNode *[n];
  4320. for (size_t i = 0; i < n; i++) {
  4321. F[i] = roots[i].getNode();
  4322. }
  4323. int size = Cudd_VectorSupportIndices(mgr, F, (int) n, (int **)&support);
  4324. delete [] F;
  4325. checkReturnValue(size >= 0);
  4326. // size could be 0, in which case support is 0 too!
  4327. vector<unsigned int> indices(support, support+size);
  4328. if (support) free(support);
  4329. return indices;
  4330. } // Cudd::SupportIndices
  4331. int
  4332. Cudd::nodeCount(const std::vector<BDD>& roots) const
  4333. {
  4334. size_t n = roots.size();
  4335. DdNode **nodeArray = new DdNode *[n];
  4336. for (size_t i = 0; i < n; i++) {
  4337. nodeArray[i] = roots[i].getNode();
  4338. }
  4339. int result = Cudd_SharingSize(nodeArray, (int) n);
  4340. delete [] nodeArray;
  4341. checkReturnValue(result > 0);
  4342. return result;
  4343. } // Cudd::nodeCount
  4344. BDD
  4345. Cudd::VectorSupport(const std::vector<ADD>& roots) const
  4346. {
  4347. size_t n = roots.size();
  4348. DdManager *mgr = p->manager;
  4349. DdNode **F = new DdNode *[n];
  4350. for (size_t i = 0; i < n; i++) {
  4351. F[i] = roots[i].getNode();
  4352. }
  4353. DdNode *result = Cudd_VectorSupport(mgr, F, (int) n);
  4354. delete [] F;
  4355. checkReturnValue(result);
  4356. return BDD(p, result);
  4357. } // Cudd::VectorSupport
  4358. int
  4359. Cudd::VectorSupportSize(const std::vector<BDD>& roots) const
  4360. {
  4361. size_t n = roots.size();
  4362. DdManager *mgr = p->manager;
  4363. DdNode **F = new DdNode *[n];
  4364. for (size_t i = 0; i < n; i++) {
  4365. F[i] = roots[i].getNode();
  4366. }
  4367. int result = Cudd_VectorSupportSize(mgr, F, (int) n);
  4368. delete [] F;
  4369. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4370. return result;
  4371. } // Cudd::VectorSupportSize
  4372. int
  4373. Cudd::VectorSupportSize(const std::vector<ADD>& roots) const
  4374. {
  4375. size_t n = roots.size();
  4376. DdManager *mgr = p->manager;
  4377. DdNode **F = new DdNode *[n];
  4378. for (size_t i = 0; i < n; i++) {
  4379. F[i] = roots[i].getNode();
  4380. }
  4381. int result = Cudd_VectorSupportSize(mgr, F, (int) n);
  4382. delete [] F;
  4383. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4384. return result;
  4385. } // Cudd::VectorSupportSize
  4386. void
  4387. ABDD::ClassifySupport(
  4388. const ABDD& g,
  4389. BDD* common,
  4390. BDD* onlyF,
  4391. BDD* onlyG) const
  4392. {
  4393. DdManager *mgr = checkSameManager(g);
  4394. DdNode *C, *F, *G;
  4395. int result = Cudd_ClassifySupport(mgr, node, g.node, &C, &F, &G);
  4396. checkReturnValue(result);
  4397. *common = BDD(p, C);
  4398. *onlyF = BDD(p, F);
  4399. *onlyG = BDD(p, G);
  4400. } // ABDD::ClassifySupport
  4401. int
  4402. ABDD::CountLeaves() const
  4403. {
  4404. return Cudd_CountLeaves(node);
  4405. } // ABDD::CountLeaves
  4406. DdGen *
  4407. ABDD::FirstCube(
  4408. int ** cube,
  4409. CUDD_VALUE_TYPE * value) const
  4410. {
  4411. DdManager *mgr = p->manager;
  4412. DdGen *result = Cudd_FirstCube(mgr, node, cube, value);
  4413. checkReturnValue((DdNode *)result);
  4414. return result;
  4415. } // ABDD::FirstCube
  4416. int
  4417. ABDD::NextCube(
  4418. DdGen * gen,
  4419. int ** cube,
  4420. CUDD_VALUE_TYPE * value)
  4421. {
  4422. return Cudd_NextCube(gen, cube, value);
  4423. } // ABDD::NextCube
  4424. void
  4425. BDD::PickOneCube(
  4426. char * string) const
  4427. {
  4428. DdManager *mgr = p->manager;
  4429. int result = Cudd_bddPickOneCube(mgr, node, string);
  4430. checkReturnValue(result);
  4431. } // BDD::PickOneCube
  4432. BDD
  4433. BDD::PickOneMinterm(
  4434. std::vector<BDD> vars) const
  4435. {
  4436. size_t n = vars.size();
  4437. DdManager *mgr = p->manager;
  4438. DdNode **V = new DdNode *[n];
  4439. for (size_t i = 0; i < n; i++) {
  4440. V[i] = vars[i].node;
  4441. }
  4442. DdNode *result = Cudd_bddPickOneMinterm(mgr, node, V, (int) n);
  4443. delete [] V;
  4444. checkReturnValue(result);
  4445. return BDD(p, result);
  4446. } // BDD::PickOneMinterm
  4447. BDD
  4448. Cudd::bddComputeCube(
  4449. BDD * vars,
  4450. int * phase,
  4451. int n) const
  4452. {
  4453. DdManager *mgr = p->manager;
  4454. DdNode **V = new DdNode *[n];
  4455. for (int i = 0; i < n; i++) {
  4456. V[i] = vars[i].getNode();
  4457. }
  4458. DdNode *result = Cudd_bddComputeCube(mgr, V, phase, n);
  4459. delete [] V;
  4460. checkReturnValue(result);
  4461. return BDD(p, result);
  4462. } // Cudd::bddComputeCube
  4463. BDD
  4464. Cudd::computeCube(
  4465. std::vector<BDD> const & vars) const
  4466. {
  4467. DdManager *mgr = p->manager;
  4468. size_t n = vars.size();
  4469. DdNode **V = new DdNode *[n];
  4470. for (size_t i = 0; i < n; i++) {
  4471. V[i] = vars[i].getNode();
  4472. }
  4473. DdNode *result = Cudd_bddComputeCube(mgr, V, 0, n);
  4474. delete [] V;
  4475. checkReturnValue(result);
  4476. return BDD(p, result);
  4477. } // Cudd::computeCube
  4478. ADD
  4479. Cudd::addComputeCube(
  4480. ADD * vars,
  4481. int * phase,
  4482. int n) const
  4483. {
  4484. DdManager *mgr = p->manager;
  4485. DdNode **V = new DdNode *[n];
  4486. for (int i = 0; i < n; i++) {
  4487. V[i] = vars[i].getNode();
  4488. }
  4489. DdNode *result = Cudd_addComputeCube(mgr, V, phase, n);
  4490. delete [] V;
  4491. checkReturnValue(result);
  4492. return ADD(p, result);
  4493. } // Cudd::addComputeCube
  4494. ADD
  4495. Cudd::computeCube(
  4496. std::vector<ADD> const & vars) const
  4497. {
  4498. DdManager *mgr = p->manager;
  4499. size_t n = vars.size();
  4500. DdNode **V = new DdNode *[n];
  4501. for (size_t i = 0; i < n; i++) {
  4502. V[i] = vars[i].getNode();
  4503. }
  4504. DdNode *result = Cudd_addComputeCube(mgr, V, 0, n);
  4505. delete [] V;
  4506. checkReturnValue(result);
  4507. return ADD(p, result);
  4508. } // Cudd::computeCube
  4509. BDD
  4510. Cudd::IndicesToCube(
  4511. int * array,
  4512. int n) const
  4513. {
  4514. DdNode *result = Cudd_IndicesToCube(p->manager, array, n);
  4515. checkReturnValue(result);
  4516. return BDD(p, result);
  4517. } // Cudd::IndicesToCube
  4518. void
  4519. Cudd::PrintVersion(
  4520. FILE * fp) const
  4521. {
  4522. cout.flush();
  4523. Cudd_PrintVersion(fp);
  4524. } // Cudd::PrintVersion
  4525. double
  4526. Cudd::AverageDistance() const
  4527. {
  4528. return Cudd_AverageDistance(p->manager);
  4529. } // Cudd::AverageDistance
  4530. int32_t
  4531. Cudd::Random() const
  4532. {
  4533. return Cudd_Random(p->manager);
  4534. } // Cudd::Random
  4535. void
  4536. Cudd::Srandom(
  4537. int32_t seed) const
  4538. {
  4539. Cudd_Srandom(p->manager,seed);
  4540. } // Cudd::Srandom
  4541. double
  4542. ABDD::Density(
  4543. int nvars) const
  4544. {
  4545. DdManager *mgr = p->manager;
  4546. double result = Cudd_Density(mgr, node, nvars);
  4547. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4548. return result;
  4549. } // ABDD::Density
  4550. int
  4551. ZDD::Count() const
  4552. {
  4553. DdManager *mgr = p->manager;
  4554. int result = Cudd_zddCount(mgr, node);
  4555. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4556. return result;
  4557. } // ZDD::Count
  4558. double
  4559. ZDD::CountDouble() const
  4560. {
  4561. DdManager *mgr = p->manager;
  4562. double result = Cudd_zddCountDouble(mgr, node);
  4563. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4564. return result;
  4565. } // ZDD::CountDouble
  4566. ZDD
  4567. ZDD::Product(
  4568. const ZDD& g) const
  4569. {
  4570. DdManager *mgr = checkSameManager(g);
  4571. DdNode *result = Cudd_zddProduct(mgr, node, g.node);
  4572. checkReturnValue(result);
  4573. return ZDD(p, result);
  4574. } // ZDD::Product
  4575. ZDD
  4576. ZDD::UnateProduct(
  4577. const ZDD& g) const
  4578. {
  4579. DdManager *mgr = checkSameManager(g);
  4580. DdNode *result = Cudd_zddUnateProduct(mgr, node, g.node);
  4581. checkReturnValue(result);
  4582. return ZDD(p, result);
  4583. } // ZDD::UnateProduct
  4584. ZDD
  4585. ZDD::WeakDiv(
  4586. const ZDD& g) const
  4587. {
  4588. DdManager *mgr = checkSameManager(g);
  4589. DdNode *result = Cudd_zddWeakDiv(mgr, node, g.node);
  4590. checkReturnValue(result);
  4591. return ZDD(p, result);
  4592. } // ZDD::WeakDiv
  4593. ZDD
  4594. ZDD::Divide(
  4595. const ZDD& g) const
  4596. {
  4597. DdManager *mgr = checkSameManager(g);
  4598. DdNode *result = Cudd_zddDivide(mgr, node, g.node);
  4599. checkReturnValue(result);
  4600. return ZDD(p, result);
  4601. } // ZDD::Divide
  4602. ZDD
  4603. ZDD::WeakDivF(
  4604. const ZDD& g) const
  4605. {
  4606. DdManager *mgr = checkSameManager(g);
  4607. DdNode *result = Cudd_zddWeakDivF(mgr, node, g.node);
  4608. checkReturnValue(result);
  4609. return ZDD(p, result);
  4610. } // ZDD::WeakDivF
  4611. ZDD
  4612. ZDD::DivideF(
  4613. const ZDD& g) const
  4614. {
  4615. DdManager *mgr = checkSameManager(g);
  4616. DdNode *result = Cudd_zddDivideF(mgr, node, g.node);
  4617. checkReturnValue(result);
  4618. return ZDD(p, result);
  4619. } // ZDD::DivideF
  4620. MtrNode *
  4621. Cudd::MakeZddTreeNode(
  4622. unsigned int low,
  4623. unsigned int size,
  4624. unsigned int type) const
  4625. {
  4626. return Cudd_MakeZddTreeNode(p->manager, low, size, type);
  4627. } // Cudd::MakeZddTreeNode
  4628. BDD
  4629. BDD::zddIsop(
  4630. const BDD& U,
  4631. ZDD* zdd_I) const
  4632. {
  4633. DdManager *mgr = checkSameManager(U);
  4634. DdNode *Z;
  4635. DdNode *result = Cudd_zddIsop(mgr, node, U.node, &Z);
  4636. checkReturnValue(result);
  4637. *zdd_I = ZDD(p, Z);
  4638. return BDD(p, result);
  4639. } // BDD::Isop
  4640. BDD
  4641. BDD::Isop(
  4642. const BDD& U) const
  4643. {
  4644. DdManager *mgr = checkSameManager(U);
  4645. DdNode *result = Cudd_bddIsop(mgr, node, U.node);
  4646. checkReturnValue(result);
  4647. return BDD(p, result);
  4648. } // BDD::Isop
  4649. double
  4650. ZDD::CountMinterm(
  4651. int path) const
  4652. {
  4653. DdManager *mgr = p->manager;
  4654. double result = Cudd_zddCountMinterm(mgr, node, path);
  4655. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4656. return result;
  4657. } // ZDD::CountMinterm
  4658. void
  4659. Cudd::zddPrintSubtable() const
  4660. {
  4661. cout.flush();
  4662. Cudd_zddPrintSubtable(p->manager);
  4663. } // Cudd::zddPrintSubtable
  4664. ZDD
  4665. BDD::PortToZdd() const
  4666. {
  4667. DdManager *mgr = p->manager;
  4668. DdNode *result = Cudd_zddPortFromBdd(mgr, node);
  4669. checkReturnValue(result);
  4670. return ZDD(p, result);
  4671. } // BDD::PortToZdd
  4672. BDD
  4673. ZDD::PortToBdd() const
  4674. {
  4675. DdManager *mgr = p->manager;
  4676. DdNode *result = Cudd_zddPortToBdd(mgr, node);
  4677. checkReturnValue(result);
  4678. return BDD(p, result);
  4679. } // ZDD::PortToBdd
  4680. void
  4681. Cudd::zddReduceHeap(
  4682. Cudd_ReorderingType heuristic,
  4683. int minsize) const
  4684. {
  4685. int result = Cudd_zddReduceHeap(p->manager, heuristic, minsize);
  4686. checkReturnValue(result);
  4687. } // Cudd::zddReduceHeap
  4688. void
  4689. Cudd::zddShuffleHeap(
  4690. int * permutation) const
  4691. {
  4692. int result = Cudd_zddShuffleHeap(p->manager, permutation);
  4693. checkReturnValue(result);
  4694. } // Cudd::zddShuffleHeap
  4695. ZDD
  4696. ZDD::Ite(
  4697. const ZDD& g,
  4698. const ZDD& h) const
  4699. {
  4700. DdManager *mgr = checkSameManager(g);
  4701. checkSameManager(h);
  4702. DdNode *result = Cudd_zddIte(mgr, node, g.node, h.node);
  4703. checkReturnValue(result);
  4704. return ZDD(p, result);
  4705. } // ZDD::Ite
  4706. ZDD
  4707. ZDD::Union(
  4708. const ZDD& Q) const
  4709. {
  4710. DdManager *mgr = checkSameManager(Q);
  4711. DdNode *result = Cudd_zddUnion(mgr, node, Q.node);
  4712. checkReturnValue(result);
  4713. return ZDD(p, result);
  4714. } // ZDD::Union
  4715. ZDD
  4716. ZDD::Intersect(
  4717. const ZDD& Q) const
  4718. {
  4719. DdManager *mgr = checkSameManager(Q);
  4720. DdNode *result = Cudd_zddIntersect(mgr, node, Q.node);
  4721. checkReturnValue(result);
  4722. return ZDD(p, result);
  4723. } // ZDD::Intersect
  4724. ZDD
  4725. ZDD::Diff(
  4726. const ZDD& Q) const
  4727. {
  4728. DdManager *mgr = checkSameManager(Q);
  4729. DdNode *result = Cudd_zddDiff(mgr, node, Q.node);
  4730. checkReturnValue(result);
  4731. return ZDD(p, result);
  4732. } // ZDD::Diff
  4733. ZDD
  4734. ZDD::DiffConst(
  4735. const ZDD& Q) const
  4736. {
  4737. DdManager *mgr = checkSameManager(Q);
  4738. DdNode *result = Cudd_zddDiffConst(mgr, node, Q.node);
  4739. checkReturnValue(result);
  4740. return ZDD(p, result);
  4741. } // ZDD::DiffConst
  4742. ZDD
  4743. ZDD::Subset1(
  4744. int var) const
  4745. {
  4746. DdManager *mgr = p->manager;
  4747. DdNode *result = Cudd_zddSubset1(mgr, node, var);
  4748. checkReturnValue(result);
  4749. return ZDD(p, result);
  4750. } // ZDD::Subset1
  4751. ZDD
  4752. ZDD::Subset0(
  4753. int var) const
  4754. {
  4755. DdManager *mgr = p->manager;
  4756. DdNode *result = Cudd_zddSubset0(mgr, node, var);
  4757. checkReturnValue(result);
  4758. return ZDD(p, result);
  4759. } // ZDD::Subset0
  4760. ZDD
  4761. ZDD::Change(
  4762. int var) const
  4763. {
  4764. DdManager *mgr = p->manager;
  4765. DdNode *result = Cudd_zddChange(mgr, node, var);
  4766. checkReturnValue(result);
  4767. return ZDD(p, result);
  4768. } // ZDD::Change
  4769. void
  4770. Cudd::zddSymmProfile(
  4771. int lower,
  4772. int upper) const
  4773. {
  4774. Cudd_zddSymmProfile(p->manager, lower, upper);
  4775. } // Cudd::zddSymmProfile
  4776. void
  4777. ZDD::PrintMinterm() const
  4778. {
  4779. cout.flush();
  4780. DdManager *mgr = p->manager;
  4781. int result = Cudd_zddPrintMinterm(mgr, node);
  4782. checkReturnValue(result);
  4783. } // ZDD::PrintMinterm
  4784. void
  4785. ZDD::PrintCover() const
  4786. {
  4787. cout.flush();
  4788. DdManager *mgr = p->manager;
  4789. int result = Cudd_zddPrintCover(mgr, node);
  4790. checkReturnValue(result);
  4791. } // ZDD::PrintCover
  4792. BDD
  4793. ZDD::Support() const
  4794. {
  4795. DdManager *mgr = p->manager;
  4796. DdNode *result = Cudd_zddSupport(mgr, node);
  4797. checkReturnValue(result);
  4798. return BDD(p, result);
  4799. } // ZDD::Support
  4800. void
  4801. Cudd::DumpDot(
  4802. const std::vector<ZDD>& nodes,
  4803. char const * const * inames,
  4804. char const * const * onames,
  4805. FILE * fp) const
  4806. {
  4807. DdManager *mgr = p->manager;
  4808. size_t n = nodes.size();
  4809. DdNode **F = new DdNode *[n];
  4810. for (size_t i = 0; i < n; i++) {
  4811. F[i] = nodes[i].getNode();
  4812. }
  4813. int result = Cudd_zddDumpDot(mgr, (int) n, F, inames, onames, fp);
  4814. delete [] F;
  4815. checkReturnValue(result);
  4816. } // vector<ZDD>::DumpDot
  4817. std::string
  4818. Cudd::OrderString(void) const
  4819. {
  4820. DdManager * mgr = p->manager;
  4821. int nvars = Cudd_ReadSize(mgr);
  4822. bool hasNames = p->varnames.size() == (size_t) nvars;
  4823. std::ostringstream oss;
  4824. std::string separ = "";
  4825. for (int level = 0; level != nvars; ++level) {
  4826. oss << separ;
  4827. separ = " ";
  4828. int index = Cudd_ReadInvPerm(mgr, level);
  4829. if (hasNames) {
  4830. oss << p->varnames.at(index);
  4831. } else {
  4832. oss << "x" << index;
  4833. }
  4834. }
  4835. return oss.str();
  4836. } // Cudd::OrderString
  4837. } // end namespace storm