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.

344 lines
14 KiB

2 months ago
  1. Release 3.0.0 of Cudd uses autotools for its build. It can also
  2. produce a shared library. The shared library contains the core CUDD
  3. functions, and, optionally, the dddmp functions and the C++ wrapper.
  4. It is now safe to use separate CUDD managers in different threads.
  5. There are changes in the API, discussed later. The documentation is
  6. now extracted from the code by Doxygen. About a dozen bugs were fixed
  7. in seldom-used functions.
  8. The switch to autotools means that one no longer needs to edit the
  9. configuration section of the main Makefile. It was also instrumental
  10. in providing shared library support (via libtool) on multiple
  11. platforms and a "check" make target worth its name. Initial support
  12. for cross compilation has been added.
  13. Build time is significantly longer, especially the first time, and
  14. especially when shared libraries are enabled. In return one gets
  15. dependency tracking, support for VPATH builds, packaging of
  16. distributions, and so on.
  17. The CUDD package and its sub-packages now expose significantly fewer
  18. details of their implementations to the applications. It is now
  19. possible to compile a CUDD-based application while including only the
  20. cudd.h header and linking only libcudd.a (or the equivalent shared
  21. library). A few const type qualifiers have been added to APIs too.
  22. Some macros have been turned into functions to improve encapsulation,
  23. namely Cudd_T, Cudd_E, Cudd_V, and Cudd_IsConstant. Another API
  24. change brought about by this restructuring is that the digits of
  25. arbitrary-precision integers are now always 32-bit wide. As a
  26. consequence, the function Cudd_ApaIntDivision is now deprecated.
  27. The malloc/realloc/free wrappers in safe_mem.c have been simplified
  28. and made more consistent with the standard functions. (The majority
  29. of what the wrappers did was supplying functionality that any modern
  30. compliant implementation of C would supply anyway.) Some parts of the
  31. util library are no longer distributed with CUDD. (They were never
  32. used by it.)
  33. Applications that call functions from the mtr or epd packages now have
  34. to explicitly include their headers _before_ including cudd.h.
  35. Applications that access data structures that are no longer exposed
  36. should declare their close kinship with those data structure by
  37. including the internal headers.
  38. There is a new function in the API, Cudd_PrintSummary, that is
  39. analogous to Cudd_PrintDebug, but only prints one line using
  40. arbitrary-precision arithmetic to compute the number of minterms. The
  41. function Cudd_ApaPrintExponential now behaves like printf of glibc with
  42. a "g" conversion specifier. These changes were motivated by the
  43. discrepancies between printfs on Linux and Windows that affected "make
  44. check."
  45. CUDD now explicitly calls an implementation of qsort that is included
  46. in the util library. While this version of qsort has been shipped
  47. with CUDD since Release 1.0.0, it was up to the application to decide
  48. whether to link it or not. However, dynamic linking on Windows and OS
  49. X makes it difficult to replace the system qsort with a function of
  50. the same name; hence, there is now a util_qsort in the CUDD library.
  51. (The main reasons for not using the system qsort are repeatability and
  52. performance of variable reordering.) To use the system qsort,
  53. configure CUDD with the --with-system-qsort option. Keep in mind that
  54. some tests in "make check" may fail in this case by producing variable
  55. orders different from the reference ones.
  56. The random number generator is now local to a manager. The interface
  57. has changed accordingly. The only global variable in the whole
  58. package is the one used to store the out-of-memory handler. As long
  59. as it is not modified, distinct CUDD managers can be run in different
  60. threads.
  61. Even with a portable sort routine and random number generator, CUDD
  62. does not guarantee the same output on all platforms. For instance,
  63. the simulated annealing reordering algorithm uses floating-point
  64. arithmetic, and the results on i686 machines occasionally differ from
  65. those on x86_64 machines.
  66. In the C++ wrapper, the default error handler now throws an exception
  67. instead of failing. A new function helps in handling failed memory
  68. allocations: Cudd_InstallOutOfMemoryHandler; it can be used to modify
  69. the default behavior, which is to terminate the program. There are a
  70. few new functions in the C++ API and a substantial clean-up has taken
  71. place. Several functions have had some of their parameters given
  72. default values, and in a few cases the order of the parameters has
  73. been changed to improve consistency.
  74. New functions:
  75. DD_OOMFP Cudd_InstallOutOfMemoryHandler(DD_OOMFP newHandler);
  76. DD_OOMFP Cudd_RegisterOutOfMemoryCallback(DdManager *unique, DD_OOMFP callback);
  77. void Cudd_UnregisterOutOfMemoryCallback(DdManager *unique);
  78. void Cudd_OutOfMemSilent(size_t size);
  79. DdNode * Cudd_bddInterpolate(DdManager * dd, DdNode * l, DdNode * u);
  80. int Cudd_VarsAreSymmetric(DdManager * dd, DdNode * f, int index1, int index2);
  81. int Cudd_PrintSummary(DdManager * dd, DdNode * f, int n, int mode);
  82. void Cudd_FreeApaNumber(DdApaNumber number);
  83. char * Cudd_ApaStringDecimal(int digits, DdConstApaNumber number);
  84. long double Cudd_LdblCountMinterm(DdManager const *manager, DdNode *node,
  85. int nvars);
  86. int Cudd_EpdPrintMinterm(DdManager const * dd, DdNode * node, int nvars);
  87. st_table * st_init_table_with_params_and_arg(st_compare_arg_t,
  88. st_hash_arg_t, void const *, int, int, double, int);
  89. st_table * st_init_table_with_arg(st_compare_arg_t, st_hash_arg_t,
  90. void const *);
  91. void ABDD::summary(int nvars, int mode = 0) const;
  92. DD_OOMFP Cudd::InstallOutOfMemoryHandler(DD_OOMFP newHandler) const;
  93. DD_OOMFP RegisterOutOfMemoryCallback(DD_OOMFP callback) const;
  94. void UnregisterOutOfMemoryCallback(void) const;
  95. BDD computeCube(std::vector<BDD> const & vars) const;
  96. ADD computeCube(std::vector<ADD> const & vars) const;
  97. BDD BDD::Interpolate(const BDD& u) const;
  98. bool BDD::VarAreSymmetric(int index1, int index2) const;
  99. std::string ApaStringDecimal(int digits, DdApaNumber number) const;
  100. void Cudd::ApaPrintExponential(int digits, DdApaNumber number,
  101. int precision = 6, FILE * fp = stdout) const;
  102. void ApaPrintMintermExp(int nvars, int precision = 6, FILE * fp = stdout) const;
  103. long double LdblCountMinterm(int nvars) const;
  104. ADD Cudd::Harwell(FILE * fp, std::vector<ADD>& x, std::vector<ADD>& y,
  105. std::vector<ADD>& xn, std::vector<ADD>& yn_,
  106. int * m, int * n, int bx = 0, int sx = 2, int by = 1,
  107. int sy = 2, int pr = 0) const;
  108. ADD Cudd::Read(FILE * fp, std::vector<ADD>& x, std::vector<ADD>& y,
  109. std::vector<ADD>& xn, std::vector<ADD>& yn_, int * m, int * n,
  110. int bx = 0, int sx = 2, int by = 1, int sy = 2) const;
  111. BDD Cudd::Read(FILE * fp, std::vector<BDD>& x, std::vector<BDD>& y,
  112. int * m, int * n, int bx = 0, int sx = 2, int by = 1,
  113. int sy = 2) const;
  114. std::string Cudd::OrderString(void) const;
  115. Special thanks go to Hubert Garavel for the many discussions that have
  116. greatly contributed to shaping this new CUDD release.
  117. ----------------------------------------------------------------------
  118. Release 2.6.0 of Cudd is the first release to compile out of the box
  119. with MinGW-w64. This is achieved primarily by using types and macros
  120. defined in inttypes.h. The only visible changes in the API are some
  121. parameter types that are now "size_t" instead of "unsinged long."
  122. Support for multi-threaded applications has been slightly enhanced.
  123. The Makefile has been slightly enhanced and finally supports creation
  124. of top-level tag files for both emacs and vi.
  125. The code has been cleaned up a bit so that all warnings that would be
  126. produced by gcc with "-Wextra" have been removed. The tests run by
  127. nanotrav/tst.sh and obj/testobj cover a bit more of the package's
  128. functionality.
  129. ----------------------------------------------------------------------
  130. Release 2.5.1 of Cudd improves support for multi-threaded applications.
  131. Specifically, an application may now register a callback function that
  132. is called from time to time to check whether computation should be
  133. terminated because another thread has found the result.
  134. The C++ interface allows the application to register variable names with
  135. the manager and implements operator<< for BDDs. The interfaces of
  136. SolveEqn and VerifySol now take std::vectors instead of plain arrays.
  137. Fixed a few bugs in CUDD and a bug in the mtr package.
  138. Added const qualifiers to dumping function interfaces
  139. (Cudd_DumpDot,...).
  140. The Makefile now supports gmake's -j option. Change "@+" back to "@" if
  141. this causes problems with your make program.
  142. Buggy documentation that was shipped with 2.5.0 has been fixed.
  143. New functions:
  144. int Cudd_bddIsVar(DdManager * dd, DdNode * f);
  145. void Cudd_RegisterTerminationCallback(DdManager *unique,
  146. void Cudd_UnregisterTerminationCallback(DdManager *unique);
  147. void Cudd_SetApplicationHook(DdManager *dd, void * value);
  148. void * Cudd_ReadApplicationHook(DdManager *dd);
  149. char * Cudd_FactoredFormString(DdManager *dd, DdNode *f,
  150. char const * const * inames);
  151. ----------------------------------------------------------------------
  152. Releas 2.5.0 of Cudd introduces the ability to set timeouts. The
  153. function that is interrupted returns NULL (which the application must
  154. be prepared to handle,) but the BDDs are uncorrupted and the invoking
  155. program can continue to use the manager.
  156. In addition, reordering is now aware of timeouts, so that it gives up
  157. when a timeout is approaching to give the invoking program a chance to
  158. obtain some results.
  159. The response time to the timeout is not immediate, though most of the time
  160. it is well below one second. Checking for timeouts has a small overhead.
  161. In experiments, less than 1% has been observed on average.
  162. Creation of BDD managers with many variables (e.g., tens or hundreds
  163. of thousands) is now much more efficient. Computing small supports of
  164. BDDs when there are many variables is also much more efficient, but
  165. this has been at the cost of separating the function for BDDs and ADDs
  166. (Cudd_Support) from that for ZDDs (Cudd_zddSupport).
  167. The C++ interface has undergone a major upgrade.
  168. The handling of variable gruops in reordering has been much improved.
  169. (Thanks to Arie Gurfinkel for a very detailed bug report!) A handful
  170. of other bugs have been fixed as well.
  171. New Functions:
  172. unsigned long Cudd_ReadStartTime(DdManager *unique);
  173. unsigned long Cudd_ReadElapsedTime(DdManager *unique);
  174. void Cudd_SetStartTime(DdManager *unique, unsigned long st);
  175. void Cudd_ResetStartTime(DdManager *unique);
  176. unsigned long Cudd_ReadTimeLimit(DdManager *unique);
  177. void Cudd_SetTimeLimit(DdManager *unique, unsigned long tl);
  178. void Cudd_UpdateTimeLimit(DdManager * unique);
  179. void Cudd_IncreaseTimeLimit(DdManager * unique, unsigned long increase);
  180. void Cudd_UnsetTimeLimit(DdManager *unique);
  181. int Cudd_TimeLimited(DdManager *unique);
  182. unsigned int Cudd_ReadMaxReorderings (DdManager *dd);
  183. void Cudd_SetMaxReorderings (DdManager *dd, unsigned int mr);
  184. unsigned int Cudd_ReadOrderRandomization(DdManager * dd);
  185. void Cudd_SetOrderRandomization(DdManager * dd, unsigned int factor);
  186. int Cudd_PrintGroupedOrder(DdManager * dd, const char *str, void *data);
  187. int Cudd_EnableOrderingMonitoring(DdManager *dd);
  188. int Cudd_DisableOrderingMonitoring(DdManager *dd);
  189. int Cudd_OrderingMonitoring(DdManager *dd);
  190. DdNode * Cudd_bddExistAbstractLimit(DdManager * manager, DdNode * f, DdNode * cube, unsigned int limit);
  191. DdNode * Cudd_bddIteLimit (DdManager *dd, DdNode *f, DdNode *g, DdNode *h, unsigned int limit);
  192. DdNode * Cudd_bddOrLimit (DdManager *dd, DdNode *f, DdNode *g, unsigned int limit);
  193. DdNode * Cudd_bddXnorLimit (DdManager *dd, DdNode *f, DdNode *g, unsigned int limit);
  194. int Cudd_CheckCube (DdManager *dd, DdNode *g);
  195. DdNode * Cudd_bddMaximallyExpand(DdManager *dd, DdNode *lb, DdNode *ub, DdNode *f);
  196. DdNode * Cudd_bddLargestPrimeUnate(DdManager *dd , DdNode *f, DdNode *phaseBdd);
  197. int Cudd_Reserve(DdManager *manager, int amount);
  198. int Cudd_SupportIndices(DdManager * dd, DdNode * f, int **indices);
  199. int Cudd_VectorSupportIndices(DdManager * dd, DdNode ** F, int n, int **indices);
  200. DdNode * Cudd_zddSupport(DdManager * dd, DdNode * f);
  201. Changed prototypes:
  202. unsigned int Cudd_ReadReorderings (DdManager *dd);
  203. ----------------------------------------------------------------------
  204. Release 2.4.2 of Cudd features several bug fixes. The most important
  205. are those that prevented Cudd from making full use of up to 4 GB of
  206. memory when using 32-bit pointers. A handful of bugs were discovered by
  207. Coverity. (Thanks to Christian Stangier!)
  208. This release can be compiled with either 64-bit pointers or 32-bit
  209. pointers on x86_64 platforms if sizeof(long) = sizeof(void *) = 8 and
  210. sizeof(int) = 4. This is known as the LP64 model. For 32-bit pointers,
  211. one usually needs supplementary libraries. On Ubuntu and Debian Linux,
  212. one needs g++-multilib, which can be installed with
  213. "apt-get install g++-multilib."
  214. Added functions
  215. DdNode *Cudd_Inequality (DdManager * dd, int N, int c, DdNode ** x,
  216. DdNode ** y);
  217. DdNode * Cudd_Disequality (DdManager * dd, int N, int c, DdNode ** x,
  218. DdNode ** y);
  219. DdNode * Cudd_bddInterval (DdManager * dd, int N, DdNode ** x,
  220. unsigned int lowerB, unsigned int upperB);
  221. Changed prototypes:
  222. int Cudd_DumpBlif (DdManager *dd, int n, DdNode **f, char
  223. **inames, char **onames, char *mname, FILE *fp, int mv);
  224. int Cudd_DumpBlifBody (DdManager *dd, int n, DdNode **f, char
  225. **inames, char **onames, FILE *fp, int mv);
  226. The additional parameter allows the caller to choose between plain blif
  227. and blif-MV.
  228. ----------------------------------------------------------------------
  229. Release 2.4.1 of Cudd features one major change with respect to previous
  230. releases. The licensing terms are now explicitly stated.