openvm_circuit/utils/
test_utils.rs1use 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
27pub 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
52pub 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
59pub 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}