openvm_continuations/circuit/inner/unset/
air.rs1use 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}