acvm/pwg/blackbox/
utils.rs

1use acir::{AcirField, circuit::opcodes::FunctionInput, native_types::WitnessMap};
2use itertools::Itertools;
3
4use crate::pwg::{OpcodeResolutionError, input_to_value};
5
6pub(crate) fn to_u8_array<const N: usize, F: AcirField>(
7    initial_witness: &WitnessMap<F>,
8    inputs: &[FunctionInput<F>; N],
9) -> Result<[u8; N], OpcodeResolutionError<F>> {
10    let mut result = [0; N];
11    for (it, input) in result.iter_mut().zip_eq(inputs) {
12        let byte: u8 = input_to_value(initial_witness, *input)?
13            .try_into_u128()
14            .expect("expected input to fit into a u128")
15            .try_into()
16            .expect("expected input to fit into a u8");
17        *it = byte;
18    }
19    Ok(result)
20}
21
22pub(crate) fn to_u8_vec<F: AcirField>(
23    initial_witness: &WitnessMap<F>,
24    inputs: &[FunctionInput<F>],
25) -> Result<Vec<u8>, OpcodeResolutionError<F>> {
26    let mut result = Vec::with_capacity(inputs.len());
27    for input in inputs {
28        let byte: u8 = input_to_value(initial_witness, *input)?
29            .try_into_u128()
30            .expect("expected input to fit into a u8")
31            .try_into()
32            .expect("expected input to fit into a u8");
33        result.push(byte);
34    }
35    Ok(result)
36}