Nova/src/gadgets/nonnative/mod.rs
src/gadgets/nonnative/mod.rsRaw
1//! This module implements various gadgets necessary for doing non-native arithmetic
2//! Code in this module is adapted from [bellman-bignat](https://github.com/alex-ozdemir/bellman-bignat), which is licenced under MIT
3
4use bellperson::SynthesisError;
5use ff::PrimeField;
6
7trait OptionExt<T> {
8 fn grab(&self) -> Result<&T, SynthesisError>;
9 fn grab_mut(&mut self) -> Result<&mut T, SynthesisError>;
10}
11
12impl<T> OptionExt<T> for Option<T> {
13 fn grab(&self) -> Result<&T, SynthesisError> {
14 self.as_ref().ok_or(SynthesisError::AssignmentMissing)
15 }
16 fn grab_mut(&mut self) -> Result<&mut T, SynthesisError> {
17 self.as_mut().ok_or(SynthesisError::AssignmentMissing)
18 }
19}
20
21trait BitAccess {
22 fn get_bit(&self, i: usize) -> Option<bool>;
23}
24
25impl<Scalar: PrimeField> BitAccess for Scalar {
26 fn get_bit(&self, i: usize) -> Option<bool> {
27 if i as u32 >= Scalar::NUM_BITS {
28 return None;
29 }
30
31 let (byte_pos, bit_pos) = (i / 8, i % 8);
32 let byte = self.to_repr().as_ref()[byte_pos];
33 let bit = byte >> bit_pos & 1;
34 Some(bit == 1)
35 }
36}
37
38pub mod bignat;
39pub mod util;