Expand description

MCircuit (pronounced mc-urkit) provides a series of types and traits for working with circuits. Specifically, arithmetic circuits on GF2 and Z64, the former of which are effectively boolean circuits. It is used by Reverie.

MCircuit includes:

  • A circuit parsing library for BLIF files
  • Code for evaluating circuits in its gate format
  • Traits for constructing, translating, and iterating over gates
  • Code to export circuits in the Bristol Fashion format


pub use parsers::Parse;




Wraps Operation to define a field for each gate. Also supports conversions and metadata.

Defines the individual logic gate operations we can support


Conglomerate trait that wraps all the other useful traits defined in this module.

Applies to all gates, allows access to the input and output wire IDs of the gates

Trait related to buffer gates. If the gate doesn’t change its input value (ie adding zero, multiplying by one), then we say this is an “identity” gate, eligible to be folded out. !

Defines a number of helper methods for replacing the I/O wires on a gate with new ones

Implemented for acceptable types to use as wire values. It would be nice if this could just be a set of required traits, but num_traits::is_zero isn’t implemented for bool.


Copies most of the code from evaluate_composite_program, but takes a VcdDumper and dumps the value of each destination wire after evaluating a gate.

Evaluates a composite program (in the clear). Uses assert! to check AssertZero gates

Get the largest (arithmetic, boolean) wires in a program so we know how much memory to allocate. Respects size hints, if present at the start of the circuit

Get the largest (arithmetic, boolean) wires in a program so we know how much memory to allocate. Does NOT respect size hints.