openvm_stark_sdk/dummy_airs/fib_air/
air.rs

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