Skip to main content

openvm_stark_backend/test_utils/dummy_airs/fib_air/
air.rs

1use std::borrow::Borrow;
2
3use p3_air::{Air, AirBuilder, AirBuilderWithPublicValues, BaseAir, BaseAirWithPublicValues};
4use p3_matrix::Matrix;
5
6use super::columns::{FibonacciCols, NUM_FIBONACCI_COLS};
7use crate::PartitionedBaseAir;
8
9#[derive(Clone, Copy)]
10pub struct FibonacciAir;
11
12impl<F> PartitionedBaseAir<F> for FibonacciAir {}
13impl<F> BaseAir<F> for FibonacciAir {
14    fn width(&self) -> usize {
15        NUM_FIBONACCI_COLS
16    }
17}
18
19impl<F> BaseAirWithPublicValues<F> for FibonacciAir {
20    fn num_public_values(&self) -> usize {
21        3
22    }
23}
24
25impl<AB: AirBuilderWithPublicValues> Air<AB> for FibonacciAir {
26    fn eval(&self, builder: &mut AB) {
27        let main = builder.main();
28        let pis = builder.public_values();
29
30        let a = pis[0];
31        let b = pis[1];
32        let x = pis[2];
33
34        let (local, next) = (main.row_slice(0).unwrap(), main.row_slice(1).unwrap());
35        let local: &FibonacciCols<AB::Var> = (*local).borrow();
36        let next: &FibonacciCols<AB::Var> = (*next).borrow();
37
38        let mut when_first_row = builder.when_first_row();
39
40        when_first_row.assert_eq(local.left.clone(), a);
41        when_first_row.assert_eq(local.right.clone(), b);
42
43        let mut when_transition = builder.when_transition();
44
45        // a' <- b
46        when_transition.assert_eq(local.right.clone(), next.left.clone());
47
48        // b' <- a + b
49        when_transition.assert_eq(local.left.clone() + local.right.clone(), next.right.clone());
50
51        builder.when_last_row().assert_eq(local.right.clone(), x);
52    }
53}