sp1_recursion_compiler/ir/
bits.rs1use 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 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 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 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}