openvm_stark_sdk/dummy_airs/fib_air/
chip.rs1use 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 pub a: u32,
18 pub b: u32,
20 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}