sp1_recursion_compiler/circuit/
mod.rs

1mod builder;
2mod compiler;
3mod config;
4
5pub use builder::*;
6pub use compiler::*;
7pub use config::*;
8
9#[cfg(test)]
10mod tests {
11    use std::sync::Arc;
12
13    use p3_baby_bear::DiffusionMatrixBabyBear;
14    use p3_field::AbstractField;
15
16    use sp1_core_machine::utils::run_test_machine;
17    use sp1_recursion_core::{machine::RecursionAir, Runtime, RuntimeError};
18    use sp1_stark::{BabyBearPoseidon2Inner, StarkGenericConfig};
19
20    use crate::{
21        circuit::{AsmBuilder, AsmCompiler, CircuitV2Builder},
22        ir::*,
23    };
24
25    const DEGREE: usize = 3;
26
27    type SC = BabyBearPoseidon2Inner;
28    type F = <SC as StarkGenericConfig>::Val;
29    type EF = <SC as StarkGenericConfig>::Challenge;
30    type A = RecursionAir<F, DEGREE>;
31
32    #[test]
33    fn test_io() {
34        let mut builder = AsmBuilder::<F, EF>::default();
35
36        let felts = builder.hint_felts_v2(3);
37        assert_eq!(felts.len(), 3);
38        let sum: Felt<_> = builder.eval(felts[0] + felts[1]);
39        builder.assert_felt_eq(sum, felts[2]);
40
41        let exts = builder.hint_exts_v2(3);
42        assert_eq!(exts.len(), 3);
43        let sum: Ext<_, _> = builder.eval(exts[0] + exts[1]);
44        builder.assert_ext_ne(sum, exts[2]);
45
46        let x = builder.hint_ext_v2();
47        builder.assert_ext_eq(x, exts[0] + felts[0]);
48
49        let y = builder.hint_felt_v2();
50        let zero: Felt<_> = builder.constant(F::zero());
51        builder.assert_felt_eq(y, zero);
52
53        let block = builder.into_root_block();
54        let mut compiler = AsmCompiler::default();
55        let program = Arc::new(compiler.compile_inner(block).validate().unwrap());
56        let mut runtime =
57            Runtime::<F, EF, DiffusionMatrixBabyBear>::new(program.clone(), SC::new().perm);
58        runtime.witness_stream = [
59            vec![F::one().into(), F::one().into(), F::two().into()],
60            vec![F::zero().into(), F::one().into(), F::two().into()],
61            vec![F::one().into()],
62            vec![F::zero().into()],
63        ]
64        .concat()
65        .into();
66        runtime.run().unwrap();
67
68        let machine = A::compress_machine(SC::new());
69
70        let (pk, vk) = machine.setup(&program);
71        let result =
72            run_test_machine(vec![runtime.record], machine, pk, vk.clone()).expect("should verify");
73
74        tracing::info!("num shard proofs: {}", result.shard_proofs.len());
75    }
76
77    #[test]
78    fn test_empty_witness_stream() {
79        let mut builder = AsmBuilder::<F, EF>::default();
80
81        let felts = builder.hint_felts_v2(3);
82        assert_eq!(felts.len(), 3);
83        let sum: Felt<_> = builder.eval(felts[0] + felts[1]);
84        builder.assert_felt_eq(sum, felts[2]);
85
86        let exts = builder.hint_exts_v2(3);
87        assert_eq!(exts.len(), 3);
88        let sum: Ext<_, _> = builder.eval(exts[0] + exts[1]);
89        builder.assert_ext_ne(sum, exts[2]);
90
91        let block = builder.into_root_block();
92        let mut compiler = AsmCompiler::default();
93        let program = Arc::new(compiler.compile_inner(block).validate().unwrap());
94        let mut runtime =
95            Runtime::<F, EF, DiffusionMatrixBabyBear>::new(program.clone(), SC::new().perm);
96        runtime.witness_stream =
97            [vec![F::one().into(), F::one().into(), F::two().into()]].concat().into();
98
99        match runtime.run() {
100            Err(RuntimeError::EmptyWitnessStream) => (),
101            Ok(_) => panic!("should not succeed"),
102            Err(x) => panic!("should not yield error variant: {x}"),
103        }
104    }
105}