aiger-circuit

Crates.ioaiger-circuit
lib.rsaiger-circuit
version1.0.2
created_at2025-12-07 05:19:07.928185+00
updated_at2025-12-08 00:02:24.879096+00
descriptionAnd-inverter graph (AIG) library that can serialize data into AIGER format. Supports third-party circuit representations
homepage
repositoryhttps://github.com/mnemonikr/aiger-circuit
max_upload_size
id1971210
size47,770
(mnemonikr)

documentation

README

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!();
    }
}
Commit count: 0

cargo fmt