pub mod config;
pub mod poseidon2;
pub mod utils;
use crate::{
cpu::CpuChip, exp_reverse_bits::ExpReverseBitsLenChip, fri_fold::FriFoldChip,
memory::MemoryGlobalChip, multi::MultiChip, poseidon2_wide::Poseidon2WideChip,
program::ProgramChip, range_check::RangeCheckChip,
};
use core::iter::once;
use p3_field::{extension::BinomiallyExtendable, PrimeField32};
use sp1_stark::{Chip, StarkGenericConfig, StarkMachine, PROOF_MAX_NUM_PVS};
use std::marker::PhantomData;
use crate::runtime::D;
pub type RecursionAirWideDeg3<F> = RecursionAir<F, 3>;
pub type RecursionAirWideDeg9<F> = RecursionAir<F, 9>;
pub type RecursionAirWideDeg17<F> = RecursionAir<F, 17>;
#[derive(sp1_derive::MachineAir)]
#[sp1_core_path = "sp1_stark"]
#[execution_record_path = "crate::runtime::ExecutionRecord<F>"]
#[program_path = "crate::runtime::RecursionProgram<F>"]
#[builder_path = "crate::air::SP1RecursionAirBuilder<F = F>"]
#[eval_trait_bound = "AB::Var: 'static"]
pub enum RecursionAir<F: PrimeField32 + BinomiallyExtendable<D>, const DEGREE: usize> {
Program(ProgramChip),
Cpu(CpuChip<F, DEGREE>),
MemoryGlobal(MemoryGlobalChip),
Poseidon2Wide(Poseidon2WideChip<DEGREE>),
FriFold(FriFoldChip<DEGREE>),
RangeCheck(RangeCheckChip<F>),
Multi(MultiChip<DEGREE>),
ExpReverseBitsLen(ExpReverseBitsLenChip<DEGREE>),
}
impl<F: PrimeField32 + BinomiallyExtendable<D>, const DEGREE: usize> RecursionAir<F, DEGREE> {
pub fn machine<SC: StarkGenericConfig<Val = F>>(config: SC) -> StarkMachine<SC, Self> {
let chips = Self::get_all().into_iter().map(Chip::new).collect::<Vec<_>>();
StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS)
}
pub fn wrap_machine<SC: StarkGenericConfig<Val = F>>(config: SC) -> StarkMachine<SC, Self> {
let chips = Self::get_wrap_all().into_iter().map(Chip::new).collect::<Vec<_>>();
StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS)
}
pub fn wrap_machine_dyn<SC: StarkGenericConfig<Val = F>>(config: SC) -> StarkMachine<SC, Self> {
let chips = Self::get_wrap_dyn_all().into_iter().map(Chip::new).collect::<Vec<_>>();
StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS)
}
pub fn get_all() -> Vec<Self> {
once(RecursionAir::Program(ProgramChip))
.chain(once(RecursionAir::Cpu(CpuChip {
fixed_log2_rows: None,
_phantom: PhantomData,
})))
.chain(once(RecursionAir::MemoryGlobal(MemoryGlobalChip { fixed_log2_rows: None })))
.chain(once(RecursionAir::Poseidon2Wide(Poseidon2WideChip::<DEGREE> {
fixed_log2_rows: None,
pad: true,
})))
.chain(once(RecursionAir::FriFold(FriFoldChip::<DEGREE> {
fixed_log2_rows: None,
pad: true,
})))
.chain(once(RecursionAir::RangeCheck(RangeCheckChip::default())))
.chain(once(RecursionAir::ExpReverseBitsLen(ExpReverseBitsLenChip::<DEGREE> {
fixed_log2_rows: None,
pad: true,
})))
.collect()
}
pub fn get_wrap_dyn_all() -> Vec<Self> {
once(RecursionAir::Program(ProgramChip))
.chain(once(RecursionAir::Cpu(CpuChip {
fixed_log2_rows: None,
_phantom: PhantomData,
})))
.chain(once(RecursionAir::MemoryGlobal(MemoryGlobalChip { fixed_log2_rows: None })))
.chain(once(RecursionAir::Multi(MultiChip { fixed_log2_rows: None })))
.chain(once(RecursionAir::RangeCheck(RangeCheckChip::default())))
.chain(once(RecursionAir::ExpReverseBitsLen(ExpReverseBitsLenChip::<DEGREE> {
fixed_log2_rows: None,
pad: true,
})))
.collect()
}
pub fn get_wrap_all() -> Vec<Self> {
once(RecursionAir::Program(ProgramChip))
.chain(once(RecursionAir::Cpu(CpuChip {
fixed_log2_rows: Some(20),
_phantom: PhantomData,
})))
.chain(once(RecursionAir::MemoryGlobal(MemoryGlobalChip { fixed_log2_rows: Some(19) })))
.chain(once(RecursionAir::Multi(MultiChip { fixed_log2_rows: Some(17) })))
.chain(once(RecursionAir::RangeCheck(RangeCheckChip::default())))
.collect()
}
}