decaf377/ark_curve/
r1cs.rs

1pub mod element;
2pub mod fqvar_ext;
3mod inner;
4mod lazy;
5pub mod ops;
6
7use ark_ff::ToConstraintField;
8use ark_std::vec::Vec;
9pub use element::ElementVar;
10
11use crate::{Element, Fq};
12use ark_r1cs_std::fields::fp::FpVar;
13use ark_relations::r1cs::{
14    ConstraintSynthesizer, ConstraintSystem, OptimizationGoal, SynthesisMode,
15};
16
17pub type FqVar = FpVar<Fq>;
18
19pub trait CountConstraints: ConstraintSynthesizer<Fq> + Sized {
20    fn num_constraints_and_instance_variables(self) -> (usize, usize) {
21        let cs = ConstraintSystem::new_ref();
22        cs.set_optimization_goal(OptimizationGoal::Constraints);
23        cs.set_mode(SynthesisMode::Setup);
24
25        // Synthesize the circuit.
26        self.generate_constraints(cs.clone())
27            .expect("can generate constraints");
28        cs.finalize();
29        (cs.num_constraints(), cs.num_instance_variables())
30    }
31}
32
33impl<T> CountConstraints for T where T: ConstraintSynthesizer<Fq> + Sized {}
34
35impl ToConstraintField<Fq> for Element {
36    fn to_field_elements(&self) -> Option<Vec<Fq>> {
37        Some([self.vartime_compress_to_field()].to_vec())
38    }
39}