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
//! This crate provides unsafe Rust bindings for the parallel multi-terminal binary decision
//! diagram library Sylvan. At the moment, the bindings are based on version `1.6.1` available
//! [on Github](https://github.com/trolando/sylvan). The crate compiles on Linux and MacOS, and
//! if you can build `sylvan` with Visual Studio, it should work on Windows as well (the problem
//! is mostly correctly linking the `gmp` library).
//!
//! > Keep in mind that you will need `cmake` and `gmp` (arbitrary precision numbers) to build
//! Sylvan. Hopefully `gmp` will be soon optional, but for now it is necessary.
//!
//! Since a lot of Sylvan's functionality is defined using preprocessor macros, there is a small
//! wrapper library (`./wrapper/src`) which exports each macro as a function (this can incur
//! a small performance penalty which should be mostly mitigated by enabling link time
//! optimizations). The wrapper also prefixes each function/macro with `Sylvan_` so that they are
//! clearly marked as part of Sylvan API. For documentation, see the original source
//! code and [tutorial](https://trolando.github.io/sylvan/).
//!
//! **Completeness:** Most of the API should be fully reproduced here (including stuff like
//! functions with callbacks). Some minor aspects (like the `sylvan_stats` struct or more advanced
//! lace functionality) are missing, but if you need them, you can create an issues, and they can
//! be added later.
//!
//! **Correctness:** Unfortunately, Sylvan cannot be directly 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;
/// Wraps the `sylvan_bdd.h` declarations.
/// Wraps the `sylvan_common.h` declarations.
/// Wrapper for the essential parts of the `lace.h` interface.
/// Wraps the `sylvan_ldd.h` declarations.
/// Wraps the `sylvan_mt.h` declarations.
/// Wraps the `sylvan_mtbdd.h` declarations.
/// Wraps the `sylvan_stats.h` declarations.
pub type MDD = u64;
pub type MTBDD = u64;
pub type BDDVAR = u32;
pub type MTBDDMAP = MTBDD;
pub type BDD = MTBDD;
pub type BDDMAP = MTBDD;
pub type BDDSET = MTBDD;
pub const MTBDD_COMPLEMENT: MTBDD = 0x8000000000000000;
pub const MTBDD_FALSE: MTBDD = 0;
pub const MTBDD_TRUE: MTBDD = 0x8000000000000000;
pub const MTBDD_INVALID: MTBDD = 0xffffffffffffffff;
pub const SYLVAN_COMPLEMENT: MTBDD = MTBDD_COMPLEMENT;
pub const SYLVAN_FALSE: MTBDD = MTBDD_FALSE;
pub const SYLVAN_TRUE: MTBDD = MTBDD_TRUE;
pub const SYLVAN_INVALID: MTBDD = MTBDD_INVALID;