openvm_circuit/utils/
test_utils.rs

1use std::array;
2
3use openvm_circuit::arch::{MemoryConfig, SystemConfig};
4use openvm_instructions::{
5    riscv::{RV32_MEMORY_AS, RV32_REGISTER_AS},
6    NATIVE_AS,
7};
8use openvm_stark_backend::p3_field::PrimeField32;
9use rand::{rngs::StdRng, Rng};
10
11use crate::system::memory::{merkle::public_values::PUBLIC_VALUES_AS, online::PAGE_SIZE};
12
13pub fn i32_to_f<F: PrimeField32>(val: i32) -> F {
14    if val.signum() == -1 {
15        -F::from_canonical_u32(val.unsigned_abs())
16    } else {
17        F::from_canonical_u32(val as u32)
18    }
19}
20
21pub fn generate_long_number<const NUM_LIMBS: usize, const LIMB_BITS: usize>(
22    rng: &mut StdRng,
23) -> [u32; NUM_LIMBS] {
24    array::from_fn(|_| rng.gen_range(0..(1 << LIMB_BITS)))
25}
26
27// in little endian
28pub fn u32_into_limbs<const NUM_LIMBS: usize, const LIMB_BITS: usize>(
29    num: u32,
30) -> [u32; NUM_LIMBS] {
31    array::from_fn(|i| (num >> (LIMB_BITS * i)) & ((1 << LIMB_BITS) - 1))
32}
33
34pub fn u32_sign_extend<const IMM_BITS: usize>(num: u32) -> u32 {
35    if num & (1 << (IMM_BITS - 1)) != 0 {
36        num | (u32::MAX - (1 << IMM_BITS) + 1)
37    } else {
38        num
39    }
40}
41
42pub fn test_system_config_without_continuations() -> SystemConfig {
43    let mut addr_spaces = MemoryConfig::empty_address_space_configs(5);
44    addr_spaces[RV32_REGISTER_AS as usize].num_cells = PAGE_SIZE;
45    addr_spaces[RV32_MEMORY_AS as usize].num_cells = 1 << 22;
46    addr_spaces[PUBLIC_VALUES_AS as usize].num_cells = PAGE_SIZE;
47    addr_spaces[NATIVE_AS as usize].num_cells = 1 << 25;
48    SystemConfig::new(3, MemoryConfig::new(2, addr_spaces, 29, 29, 17, 32), 32)
49        .without_continuations()
50}
51
52// Testing config when native address space is not needed, with continuations enabled
53pub fn test_system_config() -> SystemConfig {
54    let mut config = test_system_config_without_continuations();
55    config.memory_config.addr_spaces[NATIVE_AS as usize].num_cells = 0;
56    config.with_continuations()
57}
58
59/// Generate a random message of a given length in bytes
60pub fn get_random_message(rng: &mut StdRng, len: usize) -> Vec<u8> {
61    let mut random_message: Vec<u8> = vec![0u8; len];
62    rng.fill(&mut random_message[..]);
63    random_message
64}