Rust bindings to the Espresso heuristic logic minimiser from UC Berkeley, with a modern high-level API for Boolean function minimisation.
Espresso takes Boolean functions and produces minimal or near-minimal equivalent representations. This Rust crate provides safe, thread-safe bindings with modern features:
- High-Level API - Boolean expressions and truth tables (covers) with automatic dimension tracking
- Automatic Minimisation - Heuristic and exact algorithms
- Multi-Output Support - Minimise multiple outputs simultaneously
- Thread-Safe - Safe concurrent execution
- Flexible Input - Parse expressions, build truth tables, or load PLA files
- Boolean Expressions - Parse and compose expressions with the
expr!macro, supporting both mathematical (*,+) and logical (&,|) notation - Cover API - Direct truth table manipulation with automatic dimension management for precise control
- Multi-Output Functions - Minimise multiple outputs simultaneously in a single cover
- Advanced Minimisation - Both heuristic (fast, ~99% optimal) and exact (guaranteed minimal) algorithms
- Don't-Care Optimisation - FD, FR, and FDR cover types for flexible optimisation with don't-care and off-sets
- Thread-Safe - Safe concurrent execution with C11 thread-local storage
- PLA File Support - Read and write Berkeley PLA format for interoperability
Add to your Cargo.toml:
[dependencies]
espresso-logic = "3.1"use espresso_logic::{BoolExpr, expr};
fn main() -> std::io::Result<()> {
// Build expression with redundant terms
let redundant = expr!("a" * "b" + "a" * "b" * "c");
println!("Original: {}", redundant);
// Minimise it
let minimised = redundant.minimize()?;
println!("Minimised: {}", minimised); // Output: a * b
Ok(())
}use espresso_logic::{Cover, CoverType};
fn main() -> std::io::Result<()> {
// Create a cover for XOR function
let mut cover = Cover::new(CoverType::F);
// Add cubes: output is 1 when inputs differ
cover.add_cube(&[Some(false), Some(true)], &[Some(true)])?; // 01 -> 1
cover.add_cube(&[Some(true), Some(false)], &[Some(true)])?; // 10 -> 1
let minimised = cover.minimize()?;
println!("Minimised to {} cubes", minimised.num_cubes());
Ok(())
}Note: Covers support multi-output functions, don't-care optimisation, and PLA file I/O.
Choose the right API for your use case:
Use when you need to:
- Parse or compose Boolean expressions
- Work with single-output functions
- Use high-level operators and the
expr!macro
use espresso_logic::{BoolExpr, expr, Minimizable};
let xor = expr!("a" * !"b" + !"a" * "b");
let minimised = xor.minimize()?;Use when you need to:
- Build truth tables directly with cubes
- Handle multi-output functions
- Control don't-care and off-sets (FD, FR, FDR types)
- Read/write PLA files
use espresso_logic::{Cover, CoverType};
let mut cover = Cover::new(CoverType::FD); // with don't-cares
cover.add_cube(&[Some(true), None], &[Some(true)])?; // 1- -> 1Use the espresso module directly when you need:
- Access to intermediate covers (ON-set, don't-care, OFF-set)
- Maximum performance (~5-10% faster)
- Fine-grained control over the minimisation process
See the espresso module documentation for details.
Prerequisites: Rust 1.70+, C compiler, libclang
# macOS
xcode-select --install
# Ubuntu/Debian
sudo apt-get install build-essential libclang-devSee docs/INSTALLATION.md for detailed platform-specific instructions.
Install the optional CLI:
cargo install espresso-logic --features cliUsage:
espresso input.pla > output.pla
espresso -s input.pla # Show statisticsSee docs/CLI.md for more options.
Run included examples:
cargo run --example boolean_expressions
cargo run --example xor_function
cargo run --example pla_file
cargo run --example concurrent_transparentSee docs/EXAMPLES.md for comprehensive code examples.
- API Reference - Complete API documentation
- Examples Guide - Comprehensive usage examples
- Boolean Expressions - Expression API details
- PLA Format - PLA file format specification
- CLI Guide - Command-line usage
- Installation - Platform-specific setup
cargo testSee TESTING.md for comprehensive testing documentation.
Contributions welcome! See CONTRIBUTING.md for guidelines.
This project contains three layers of licensed work:
- Original Espresso: UC Berkeley (permissive license)
- Modernized C Code: Sébastien Cottinet (MIT)
- Rust Wrapper: Marcos Sartori (MIT)
See LICENSE and ACKNOWLEDGMENTS.md for details.
Espresso was developed by Robert K. Brayton and his team at UC Berkeley. Special thanks to the original developers and Sébastien Cottinet for the modernized C version.
If you use this library in academic work, please cite:
@article{brayton1984logic,
title={Logic minimization algorithms for VLSI synthesis},
author={Brayton, Robert K and Hachtel, Gary D and McMullen, Curtis T and Sangiovanni-Vincentelli, Alberto L},
journal={Kluwer Academic Publishers},
year={1984}
}Made with ❤️ for the Rust and digital logic communities.