| 22 | } |
| 23 | |
| 24 | fn u32_sum(values: &[u64]) -> ([G; 4], G) { |
| 25 | let sum: u128 = values.iter().map(|x| u128::from(*x)).sum(); |
| 26 | let word = u32::try_from(sum & 0xFFFF_FFFF).expect("masked to 32 bits"); |
| 27 | let carry = u64::try_from(sum >> 32).expect("sum of u32 words fits in u64"); |
| 28 | (word.to_le_bytes().map(|b| G::from_u64(b.into())), G::from_u64(carry)) |
| 29 | } |
| 30 | |
| 31 | pub struct QueryRecord { |
| 32 | pub function_queries: Vec<QueryMap>, |
| 33 | pub memory_queries: FxIndexMap<usize, QueryMap>, |
| 34 | pub bytes1_queries: Bytes1Queries, |
| 35 | pub bytes2_queries: Bytes2Queries, |
| 36 | } |
| 37 | |
| 38 | impl QueryRecord { |
| 39 | pub fn new(toplevel: &Toplevel) -> Self { |
| 40 | let function_queries = toplevel |
| 41 | .functions |