tasm_lib/rust_shadowing_helper_functions/
array.rs

1use std::collections::HashMap;
2
3use num::Zero;
4use twenty_first::prelude::*;
5
6use crate::prelude::*;
7
8pub fn insert_random_array(
9    element_type: &DataType,
10    mut array_pointer: BFieldElement,
11    array_length: usize,
12    memory: &mut HashMap<BFieldElement, BFieldElement>,
13) {
14    let random_values = element_type.random_elements(array_length);
15
16    for element in random_values {
17        for word in element {
18            memory.insert(array_pointer, word);
19            array_pointer.increment();
20        }
21    }
22}
23
24/// Insert a list of elements into memory encoded as if the list was an array.
25pub fn insert_as_array<T: BFieldCodec>(
26    mut array_pointer: BFieldElement,
27    memory: &mut HashMap<BFieldElement, BFieldElement>,
28    array: Vec<T>,
29) {
30    for element in array {
31        for word in element.encode() {
32            memory.insert(array_pointer, word);
33            array_pointer.increment();
34        }
35    }
36}
37
38/// Read an element from an array
39pub fn array_get(
40    pointer: BFieldElement,
41    index: usize,
42    memory: &HashMap<BFieldElement, BFieldElement>,
43    element_length: usize,
44) -> Vec<BFieldElement> {
45    let read_word = |i| {
46        let word_offset = (element_length * index + i) as u64;
47        let word_index = pointer + BFieldElement::new(word_offset);
48        memory[&word_index]
49    };
50
51    (0..element_length).map(read_word).collect()
52}
53
54pub fn array_from_memory<T: BFieldCodec + Clone>(
55    mut pointer: BFieldElement,
56    array_length: usize,
57    memory: &HashMap<BFieldElement, BFieldElement>,
58) -> Vec<T> {
59    let mut ret = vec![];
60    let element_length = T::static_length().unwrap();
61    for _ in 0..array_length {
62        let mut element = vec![BFieldElement::zero(); element_length];
63        for word in element.iter_mut() {
64            *word = *memory.get(&pointer).unwrap_or(&BFieldElement::zero());
65            pointer.increment();
66        }
67
68        ret.push(*T::decode(&element).unwrap());
69    }
70
71    ret
72}