arcis-compiler 0.10.4

A framework for writing secure multi-party computation (MPC) circuits to be executed on the Arcium network.
Documentation
use crate::{
    core::{
        compile_passes::{
            circuit_pass::CircuitPass,
            DeadCodeEliminator,
            DeadGateEliminator,
            Optimizer,
            BUILD_FN_SEQ,
        },
        ir::IntermediateRepresentation,
    },
    AsyncMPCCircuit,
};
use core_utils::circuit::batcher::batch_circuit;

pub struct Compiler;

impl Compiler {
    /// Common SubExpression Elimination and Dead Code Elimination
    fn dead_code_elimination(old_ir: IntermediateRepresentation) -> IntermediateRepresentation {
        DeadCodeEliminator::eliminate(old_ir)
    }

    /// Performs optimizations and
    /// returns an intermediate representation that can be converted into a circuit.
    pub fn optimize_into_circuitable(
        mut ir: IntermediateRepresentation,
    ) -> IntermediateRepresentation {
        for build_fn in BUILD_FN_SEQ {
            // Optimizing.
            ir = Optimizer::optimize(ir);
            // Eliminating dead code.
            ir = Self::dead_code_elimination(ir);
            // Building.
            ir = build_fn(ir);
        }

        // Another round of DCE
        Self::dead_code_elimination(ir)
    }

    pub fn improve_async_mpc_circuit(circuit: AsyncMPCCircuit) -> AsyncMPCCircuit {
        let circuit = DeadGateEliminator::make_and_run(circuit);
        let res = batch_circuit(&circuit);
        let circuit = match res {
            Ok(circuit) => circuit,
            Err(e) => {
                // Log if batching failed and return the original circuit
                eprintln!("Error while batching circuit: {e:?}");
                circuit
            }
        };
        circuit
    }
}