openvm_circuit/utils/
test_utils.rs

1use std::array;
2
3use openvm_stark_backend::p3_field::PrimeField32;
4use rand::{rngs::StdRng, Rng};
5
6pub fn i32_to_f<F: PrimeField32>(val: i32) -> F {
7    if val.signum() == -1 {
8        -F::from_canonical_u32(val.unsigned_abs())
9    } else {
10        F::from_canonical_u32(val as u32)
11    }
12}
13
14pub fn generate_long_number<const NUM_LIMBS: usize, const LIMB_BITS: usize>(
15    rng: &mut StdRng,
16) -> [u32; NUM_LIMBS] {
17    array::from_fn(|_| rng.gen_range(0..(1 << LIMB_BITS)))
18}
19
20// in little endian
21pub fn u32_into_limbs<const NUM_LIMBS: usize, const LIMB_BITS: usize>(
22    num: u32,
23) -> [u32; NUM_LIMBS] {
24    array::from_fn(|i| (num >> (LIMB_BITS * i)) & ((1 << LIMB_BITS) - 1))
25}
26
27pub fn u32_sign_extend<const IMM_BITS: usize>(num: u32) -> u32 {
28    if num & (1 << (IMM_BITS - 1)) != 0 {
29        num | (u32::MAX - (1 << IMM_BITS) + 1)
30    } else {
31        num
32    }
33}