sp1_recursion_compiler/circuit/
mod.rs1mod 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}