openvm_continuations/circuit/inner/unset/
air.rs

1use std::borrow::Borrow;
2
3use openvm_circuit_primitives::{ColumnsAir, StructReflection, StructReflectionHelper};
4use openvm_recursion_circuit::bus::{PublicValuesBus, PublicValuesBusMessage};
5use openvm_recursion_circuit_derive::AlignedBorrow;
6use openvm_stark_backend::{
7    interaction::InteractionBuilder, BaseAirWithPublicValues, PartitionedBaseAir,
8};
9use p3_air::{Air, AirBuilder, BaseAir};
10use p3_field::PrimeCharacteristicRing;
11use p3_matrix::Matrix;
12
13use crate::circuit::inner::bus::{PvsAirConsistencyBus, PvsAirConsistencyMessage};
14
15#[repr(C)]
16#[derive(AlignedBorrow, StructReflection)]
17pub struct UnsetPvsCols<F> {
18    pub proof_idx: F,
19    pub is_valid: F,
20}
21
22#[derive(ColumnsAir)]
23#[columns_via(UnsetPvsCols<u8>)]
24pub struct UnsetPvsAir {
25    pub public_values_bus: PublicValuesBus,
26    pub pvs_air_consistency_bus: PvsAirConsistencyBus,
27    pub air_idx: usize,
28    pub num_pvs: usize,
29    pub def_flag: u32,
30}
31
32impl<F> BaseAir<F> for UnsetPvsAir {
33    fn width(&self) -> usize {
34        UnsetPvsCols::<u8>::width()
35    }
36}
37impl<F> BaseAirWithPublicValues<F> for UnsetPvsAir {}
38impl<F> PartitionedBaseAir<F> for UnsetPvsAir {}
39
40impl<AB: AirBuilder + InteractionBuilder> Air<AB> for UnsetPvsAir {
41    fn eval(&self, builder: &mut AB) {
42        let main = builder.main();
43        let local = main.row_slice(0).expect("window should have two elements");
44        let next = main.row_slice(1).expect("window should have two elements");
45        let local: &UnsetPvsCols<AB::Var> = (*local).borrow();
46        let next: &UnsetPvsCols<AB::Var> = (*next).borrow();
47
48        builder.assert_bool(local.is_valid);
49        builder
50            .when_transition()
51            .assert_one(next.proof_idx - local.proof_idx);
52
53        let air_idx = AB::F::from_usize(self.air_idx);
54
55        for pv_idx in 0..self.num_pvs {
56            self.public_values_bus.receive(
57                builder,
58                local.proof_idx,
59                PublicValuesBusMessage {
60                    air_idx,
61                    pv_idx: AB::F::from_usize(pv_idx),
62                    value: AB::F::ZERO,
63                },
64                local.is_valid,
65            );
66        }
67
68        self.pvs_air_consistency_bus.lookup_key(
69            builder,
70            local.proof_idx,
71            PvsAirConsistencyMessage {
72                deferral_flag: AB::F::from_u32(self.def_flag),
73                has_verifier_pvs: AB::F::ONE,
74            },
75            local.is_valid,
76        );
77    }
78}