[![Crates.io](https://img.shields.io/crates/v/cudd-sys?style=flat-square)](https://crates.io/crates/cudd-sys)
[![Api Docs](https://img.shields.io/badge/docs-api-yellowgreen?style=flat-square)](https://docs.rs/cudd-sys/)
[![Continuous integration](https://img.shields.io/github/actions/workflow/status/pclewis/cudd-sys/build.yml?branch=master&style=flat-square)](https://github.com/pclewis/cudd-sys/actions?query=workflow%3Abuild)

# Rust Bindings for the CUDD library

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/cuddorg/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 behavior or segfaults.
