1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//! This crate provides unsafe Rust bindings for the University of Colorado decision diagram
//! package (CUDD), including the DDDMP serialisation library. It uses version `3.0.0` of CUDD
//! available from the unofficial [Github mirror](https://github.com/ivmai/cudd) and compiles on
//! Linux and MacOS (you should be also able to build CUDD on Windows using cygwin, but the project
//! is not set-up to do it automatically).
//!
//! > On Linux and macOS, you should ideally have `autoconf`, `automake` and `libtool` installed
//! > to build CUDD. And of course, some C/C++ compiler (`clang`, `gcc`, etc.).
//!
//! In the root module, you will find declarations of the C structs and types used
//! throughout CUDD. The main API of the CUDD package is then exported in `::cudd`. However,
//! CUDD also includes other "public" functionality (multiway-branching trees, extended
//! double precision numbers, serialisation, ...) which can be found in the remaining modules.
//!
//! In some cases, there are macro and constant definitions which cannot be directly exported
//! to Rust. These have been re-implemented and should have their own documentation.
//! For the functions which are re-exported without change, please refer to the original
//! [CUDD doxygen](https://add-lib.scce.info/assets/doxygen-cudd-documentation/) and
//! [manual](https://add-lib.scce.info/assets/documents/cudd-manual.pdf). The documentation
//! of the DDDMP library is available
//! [here](https://www.cs.rice.edu/~lm30/RSynth/CUDD/dddmp/doc/dddmpExt.html).
//!
//! **Completeness:** The main CUDD API should be fully reproduced here (except for one small
//! issue with `f128` numbers). The remaining modules may still be incomplete: if you need
//! a function that isn't exported yet, let us know in the issues.
//!
//! **Correctness:** Unfortunately, CUDD cannot be processed using `bindgen`, so the API was
//! reproduced using a semi-automated method with a manual validation step (bunch of regexes
//! that a human makes sure didn't break anything ;)). As such, it is possible that there
//! are some minor problems that need to be sorted out. Please file an issue if you see any
//! unexpected behaviour or segfaults.
//!
// Allow non-idiomatic names in the whole crate.
extern crate libc;
/// Contains the declarations present in `cudd.h` (main CUDD API).
/// Contains the declarations present in `mtr.h` (multiway-branching trees).
/// Contains the declarations present in `epd.h` (extended double precision numbers).
/// Declarations from `dddmp.h` (serialisation of decision diagrams).
///
/// Currently, the error checking macros are not implemented.
use ;
/// An opaque C struct used to represent the decision diagram node.
/// An opaque C struct used to represent the CUDD manager.
/// An opaque C struct used to represent the CUDD generator.
/// The type of an arbitrary precision "digit".
pub type DdApaDigit = u32;
/// The type of an arbitrary precision integer, corresponding to an array of digits.
pub type DdApaNumber = *mut DdApaDigit;
/// A const-qualified version of `DdApaNumber`.
pub type DdConstApaNumber = *const DdApaDigit;
/// An opaque C struct used to represent the result of the computation of two-literal clauses.
///
/// See `Cudd_FindTwoLiteralClauses`.
/// An opaque C struct representing an extended double precision floating point number.
/// An opaque C struct representing a multi-way branch tree node.