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 slop_algebra::{extension::BinomialExtensionField, AbstractField};
14 use sp1_primitives::SP1DiffusionMatrix;
15
16 use sp1_hypercube::inner_perm;
19 use sp1_primitives::SP1Field;
20 use sp1_recursion_executor::{Executor, RuntimeError};
21
22 use crate::{
23 circuit::{AsmBuilder, AsmCompiler, CircuitV2Builder},
24 ir::*,
25 };
26
27 type F = SP1Field;
28 type EF = BinomialExtensionField<SP1Field, 4>;
29
30 #[test]
31 fn test_io() {
32 let mut builder = AsmBuilder::default();
33
34 let felts = builder.hint_felts_v2(3);
35 assert_eq!(felts.len(), 3);
36 let sum: Felt<_> = builder.eval(felts[0] + felts[1]);
37 builder.assert_felt_eq(sum, felts[2]);
38
39 let exts = builder.hint_exts_v2(3);
40 assert_eq!(exts.len(), 3);
41 let sum: Ext<_, _> = builder.eval(exts[0] + exts[1]);
42 builder.assert_ext_ne(sum, exts[2]);
43
44 let x = builder.hint_ext_v2();
45 builder.assert_ext_eq(x, exts[0] + felts[0]);
46
47 let y = builder.hint_felt_v2();
48 let zero: Felt<_> = builder.constant(F::zero());
49 builder.assert_felt_eq(y, zero);
50
51 let block = builder.into_root_block();
52 let mut compiler = AsmCompiler::default();
53 let program = Arc::new(compiler.compile_inner(block).validate().unwrap());
54 let mut executor =
55 Executor::<F, EF, SP1DiffusionMatrix>::new(program.clone(), inner_perm());
56 executor.witness_stream = [
57 vec![F::one().into(), F::one().into(), F::two().into()],
58 vec![F::zero().into(), F::one().into(), F::two().into()],
59 vec![F::one().into()],
60 vec![F::zero().into()],
61 ]
62 .concat()
63 .into();
64 executor.run().unwrap();
65
66 }
75
76 #[test]
77 #[allow(clippy::uninlined_format_args)]
78 fn test_empty_witness_stream() {
79 let mut builder = AsmBuilder::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 executor =
95 Executor::<F, EF, SP1DiffusionMatrix>::new(program.clone(), inner_perm());
96 executor.witness_stream =
97 [vec![F::one().into(), F::one().into(), F::two().into()]].concat().into();
98
99 match executor.run() {
100 Err(RuntimeError::EmptyWitnessStream) => (),
101 Ok(_) => panic!("should not succeed"),
102 Err(x) => panic!("should not yield error variant: {x}"),
103 }
104 }
105}