openvm_stark_sdk/dummy_airs/fib_air/
chip.rs

1use std::sync::Arc;
2
3use openvm_stark_backend::{
4    config::{StarkGenericConfig, Val},
5    p3_field::PrimeField32,
6    p3_matrix::Matrix,
7    prover::{cpu::CpuBackend, types::AirProvingContext},
8    AirRef, Chip, ChipUsageGetter,
9};
10
11use super::trace::generate_trace_rows;
12use crate::dummy_airs::fib_air::{air::FibonacciAir, columns::NUM_FIBONACCI_COLS};
13
14#[derive(Clone, Debug)]
15pub struct FibonacciChip {
16    /// The 0th number in the fibonacci sequence.
17    pub a: u32,
18    /// The 1st number in the fibonacci sequence.
19    pub b: u32,
20    /// Target n-th number in the fibonacci sequence.
21    pub n: usize,
22}
23
24impl FibonacciChip {
25    pub fn new(a: u32, b: u32, n: usize) -> Self {
26        assert!(n.is_power_of_two());
27        Self { a, b, n }
28    }
29
30    pub fn air<SC: StarkGenericConfig>(&self) -> AirRef<SC> {
31        Arc::new(FibonacciAir)
32    }
33}
34
35impl<SC: StarkGenericConfig> Chip<(), CpuBackend<SC>> for FibonacciChip
36where
37    Val<SC>: PrimeField32,
38{
39    fn generate_proving_ctx(&self, _: ()) -> AirProvingContext<CpuBackend<SC>> {
40        let common_main = generate_trace_rows::<Val<SC>>(self.a, self.b, self.n);
41        let a = common_main.get(0, 0);
42        let b = common_main.get(0, 1);
43        let last_val = common_main.get(self.n - 1, 1);
44        AirProvingContext::simple(Arc::new(common_main), vec![a, b, last_val])
45    }
46}
47
48impl ChipUsageGetter for FibonacciChip {
49    fn air_name(&self) -> String {
50        "FibonacciAir".to_string()
51    }
52    fn current_trace_height(&self) -> usize {
53        self.n
54    }
55    fn trace_width(&self) -> usize {
56        NUM_FIBONACCI_COLS
57    }
58}