use alloc::vec::Vec;
use miden_ace_codegen::{AceCircuit, AceConfig, AceError, InputLayout};
use miden_core::field::QuadFelt;
use crate::{AIRS, HandwrittenMidenAir, ProofOrder};
const LMCS_ALIGNMENT: usize = 8;
pub fn build_multi_air_ace_circuit_for_order(
config: AceConfig,
order: &ProofOrder,
) -> Result<AceCircuit<QuadFelt>, AceError> {
build_factored_multi_air_ace_circuit(config)?.circuit_for_order(order)
}
#[derive(Debug, Clone)]
pub struct FactoredMultiAirCircuit {
inner: miden_ace_codegen::FactoredMultiAirCircuit<QuadFelt>,
}
impl FactoredMultiAirCircuit {
pub fn layout(&self) -> &InputLayout {
self.inner.layout()
}
pub fn num_shuffle_ops(&self) -> usize {
self.inner.num_shuffle_ops()
}
pub fn circuit_for_order(&self, order: &ProofOrder) -> Result<AceCircuit<QuadFelt>, AceError> {
let proof_order: Vec<usize> = order.airs().iter().map(|air| air.instance_index()).collect();
self.inner.circuit_for_order(&proof_order)
}
pub(crate) fn into_inner(self) -> miden_ace_codegen::FactoredMultiAirCircuit<QuadFelt> {
self.inner
}
}
pub fn build_factored_multi_air_ace_circuit(
config: AceConfig,
) -> Result<FactoredMultiAirCircuit, AceError> {
let airs = AIRS.map(HandwrittenMidenAir);
let inner =
miden_ace_codegen::build_factored_multi_air_ace_circuit(&airs, config, LMCS_ALIGNMENT)?;
Ok(FactoredMultiAirCircuit { inner })
}