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::types::{AirProofInput, AirProofRawInput},
8    rap::AnyRap,
9    Chip, ChipUsageGetter,
10};
11
12use super::{air::FibonacciAir, trace::generate_trace_rows};
13use crate::dummy_airs::fib_air::columns::NUM_FIBONACCI_COLS;
14
15#[derive(Clone, Debug)]
16pub struct FibonacciChip {
17    /// The 0th number in the fibonacci sequence.
18    pub a: u32,
19    /// The 1st number in the fibonacci sequence.
20    pub b: u32,
21    /// Target n-th number in the fibonacci sequence.
22    pub n: usize,
23}
24
25impl FibonacciChip {
26    pub fn new(a: u32, b: u32, n: usize) -> Self {
27        assert!(n.is_power_of_two());
28        Self { a, b, n }
29    }
30}
31
32impl<SC: StarkGenericConfig> Chip<SC> for FibonacciChip
33where
34    Val<SC>: PrimeField32,
35{
36    fn air(&self) -> Arc<dyn AnyRap<SC>> {
37        Arc::new(FibonacciAir)
38    }
39
40    fn generate_air_proof_input(self) -> AirProofInput<SC> {
41        let common_main = generate_trace_rows::<Val<SC>>(self.a, self.b, self.n);
42        let a = common_main.get(0, 0);
43        let b = common_main.get(0, 1);
44        let last_val = common_main.get(self.n - 1, 1);
45        AirProofInput {
46            cached_mains_pdata: vec![],
47            raw: AirProofRawInput {
48                cached_mains: vec![],
49                common_main: Some(generate_trace_rows::<Val<SC>>(self.a, self.b, self.n)),
50                public_values: vec![a, b, last_val],
51            },
52        }
53    }
54}
55
56impl ChipUsageGetter for FibonacciChip {
57    fn air_name(&self) -> String {
58        "FibonacciAir".to_string()
59    }
60    fn current_trace_height(&self) -> usize {
61        self.n
62    }
63    fn trace_width(&self) -> usize {
64        NUM_FIBONACCI_COLS
65    }
66}