use core::ops::Range;
use miden_core::Felt;
use miden_processor::ProcessorState;
pub mod aead_decrypt;
use alloc::vec::Vec;
pub mod debug;
pub mod falcon_div;
pub mod precompiles;
pub mod readonly;
pub mod smt_peek;
pub mod sorted_array;
pub mod u128_div;
pub mod u256_div;
pub mod u64_div;
fn u64_to_u32_elements(value: u64) -> (Felt, Felt) {
let hi = Felt::from_u32((value >> 32) as u32);
let lo = Felt::from_u32(value as u32);
(hi, lo)
}
pub(crate) fn read_memory_region(
process: &ProcessorState,
start_ptr: u64,
len: u64,
) -> Option<Vec<Felt>> {
let ctx = process.ctx();
memory_region_range(start_ptr, len)?
.map(|addr| process.get_mem_value(ctx, addr))
.collect()
}
pub(crate) fn read_uninitialized_memory_region(
process: &ProcessorState,
start_ptr: u64,
len: u64,
) -> Option<Vec<Felt>> {
let ctx = process.ctx();
let elements = memory_region_range(start_ptr, len)?
.map(|addr| process.get_mem_value(ctx, addr).unwrap_or(Felt::ZERO))
.collect();
Some(elements)
}
fn memory_region_range(start_ptr: u64, len: u64) -> Option<Range<u32>> {
let start_addr: u32 = start_ptr.try_into().ok()?;
let len: u32 = len.try_into().ok()?;
if !start_addr.is_multiple_of(4) {
return None;
}
let end_addr = start_addr.checked_add(len)?;
Some(start_addr..end_addr)
}