openvm_circuit/arch/testing/program/
air.rs

1use openvm_stark_backend::{
2    interaction::InteractionBuilder,
3    p3_air::{Air, BaseAir},
4    p3_field::Field,
5    p3_matrix::Matrix,
6    rap::{BaseAirWithPublicValues, PartitionedBaseAir},
7};
8
9use super::ProgramTester;
10use crate::system::program::ProgramBus;
11
12#[derive(Clone, Copy, Debug, derive_new::new)]
13pub struct ProgramDummyAir {
14    pub bus: ProgramBus,
15}
16
17impl<F: Field> BaseAirWithPublicValues<F> for ProgramDummyAir {}
18impl<F: Field> PartitionedBaseAir<F> for ProgramDummyAir {}
19impl<F: Field> BaseAir<F> for ProgramDummyAir {
20    fn width(&self) -> usize {
21        ProgramTester::<F>::width()
22    }
23}
24
25impl<AB: InteractionBuilder> Air<AB> for ProgramDummyAir {
26    fn eval(&self, builder: &mut AB) {
27        let main = builder.main();
28        let local = main.row_slice(0);
29        let local = local.iter().map(|x| (*x).into()).collect::<Vec<AB::Expr>>();
30        self.bus.inner.add_key_with_lookups(
31            builder,
32            local[..local.len() - 1].iter().cloned(),
33            local[local.len() - 1].clone(),
34        );
35    }
36}