Thanks to visit codestin.com
Credit goes to lib.rs

#aiger #circuit #serialization #representation #convert #aig #and-inverter

aiger-circuit

And-inverter graph (AIG) library that can serialize data into AIGER format. Supports third-party circuit representations

2 stable releases

Uses new Rust 2024

new 1.0.2 Dec 8, 2025
1.0.1 Dec 7, 2025

#885 in Encoding

MPL-2.0 license

29KB
572 lines

Overview

Library for converting and serializing any symbolic circuit into AIGER format. It can also be used to query and iterate over the AIGER inputs, gates, and outputs which could be used to generate an AST for a solver.

Using Aiger

# use aiger_circuit::Aiger;
# use aiger_circuit::circuit::SimpleCircuit;
# let output = SimpleCircuit::lit(false);
// Output is the output value of a complex circuit
let aiger = Aiger::with_output(&output);
let serialized = aiger.serialize_binary();

Iterating over circuit components

# use aiger_circuit::Aiger;
# use aiger_circuit::circuit::SimpleCircuit;
# let output = SimpleCircuit::lit(false);
let aiger = Aiger::with_output(&output);
for input in aiger.inputs() {
    // Iterate over all variables used in the circuit
}

for gate in aiger.gates() {
    // Iterate over all unique gates in the circuit
}

for output in aiger.outputs() {
    // Iterate over all circuit outputs
}

Simple Circuit

The SimpleCircuit object can be used to build circuits for Aiger.

# use aiger_circuit::Aiger;
# use aiger_circuit::circuit::{AsAigerCircuit, SimpleCircuit};
let output = !SimpleCircuit::var(0) & SimpleCircuit::lit(true);
let aiger = Aiger::with_output(&output);
let serialized = aiger.serialize_binary();

Circuit Conversion

This library does not prescribe a circuit representation. Simply implement the AsAigerCircuit trait to enable support for your own custom circuit type.

# use aiger_circuit::circuit::{AsAigerCircuit, AigerCircuit};
# struct YourCircuitType { }
impl<'a> AsAigerCircuit<'a> for YourCircuitType {
    type Inner = YourCircuitType;

    fn as_aiger_circuit(&'a self) -> AigerCircuit<'a, Self::Inner> {
        // Generate approprite AigerCircuit type (And, Not, Variable, Literal)
        todo!();
    }
}

No runtime deps