Skip to main content

sp1_recursion_compiler/ir/
bits.rs

1use slop_algebra::AbstractField;
2use sp1_primitives::SP1Field;
3use sp1_recursion_executor::NUM_BITS;
4
5use super::{Builder, Config, DslIr, Felt, Var};
6
7impl<C: Config> Builder<C> {
8    /// Converts a variable to bits inside a circuit.
9    pub fn num2bits_v_circuit(&mut self, num: Var<C::N>, bits: usize) -> Vec<Var<C::N>> {
10        let mut output = Vec::new();
11        for _ in 0..bits {
12            output.push(self.uninit());
13        }
14
15        self.push_op(DslIr::CircuitNum2BitsV(num, bits, output.clone()));
16
17        output
18    }
19
20    /// Converts a felt to bits inside a circuit.
21    pub fn num2bits_f_circuit(&mut self, num: Felt<SP1Field>) -> Vec<Var<C::N>> {
22        let mut output = Vec::new();
23        for _ in 0..NUM_BITS {
24            output.push(self.uninit());
25        }
26
27        self.push_op(DslIr::CircuitNum2BitsF(num, output.clone()));
28
29        output
30    }
31
32    /// Convert bits to a variable inside a circuit.
33    pub fn bits2num_v_circuit(&mut self, bits: &[Var<C::N>]) -> Var<C::N> {
34        let result: Var<_> = self.eval(C::N::zero());
35        for i in 0..bits.len() {
36            self.assign(result, result + bits[i] * C::N::from_canonical_u32(1 << i));
37        }
38        result
39    }
40}