jf_relation/gadgets/
mod.rs

1// Copyright (c) 2022 Espresso Systems (espressosys.com)
2// This file is part of the Jellyfish library.
3
4// You should have received a copy of the MIT License
5// along with the Jellyfish library. If not, see <https://mit-license.org/>.
6
7//! Gates and gadgets implementations
8
9pub mod ecc;
10pub mod ultraplonk;
11
12mod arithmetic;
13mod cmp;
14mod emulated;
15mod logic;
16mod range;
17#[allow(unused_imports)]
18pub use arithmetic::*;
19#[allow(unused_imports)]
20pub use cmp::*;
21#[allow(unused_imports)]
22pub use emulated::*;
23#[allow(unused_imports)]
24pub use logic::*;
25#[allow(unused_imports)]
26pub use range::*;
27
28// Helper functions
29mod utils;
30
31/// Utils for test
32pub mod test_utils {
33    use crate::{Arithmetization, Circuit, CircuitError, PlonkCircuit};
34    use ark_ff::PrimeField;
35
36    /// two circuit with the same statement should have the same extended
37    /// permutation polynomials even with different variable assignment
38    pub fn test_variable_independence_for_circuit<F: PrimeField>(
39        circuit_1: PlonkCircuit<F>,
40        circuit_2: PlonkCircuit<F>,
41    ) -> Result<(), CircuitError> {
42        assert_eq!(circuit_1.num_gates(), circuit_2.num_gates());
43        assert_eq!(circuit_1.num_vars(), circuit_2.num_vars());
44        // Check extended permutation polynomials
45        let sigma_polys_1 = circuit_1.compute_extended_permutation_polynomials()?;
46        let sigma_polys_2 = circuit_2.compute_extended_permutation_polynomials()?;
47        sigma_polys_1
48            .iter()
49            .zip(sigma_polys_2.iter())
50            .for_each(|(p1, p2)| assert_eq!(p1, p2));
51        Ok(())
52    }
53}