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 pub a: u32,
19 pub b: u32,
21 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}