Skip to main content

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 slop_algebra::{extension::BinomialExtensionField, AbstractField};
14    use sp1_primitives::SP1DiffusionMatrix;
15
16    // use sp1_core_machine::utils::run_test_machine;
17    // use sp1_recursion_core::{machine::RecursionAir, Runtime, RuntimeError};
18    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        // let machine = A::compress_machine(SC::new());
67
68        // let (pk, vk) = machine.setup(&program);
69        // let result =
70        //     run_test_machine(vec![executor.record], machine, pk, vk.clone()).expect("should
71        // verify");
72
73        // tracing::info!("num shard proofs: {}", result.shard_proofs.len());
74    }
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}