miden_lifted_stark/lmcs/
utils.rs1use alloc::vec::Vec;
4use core::array;
5
6use p3_field::PackedValue;
7use p3_util::log2_strict_usize;
8
9#[inline]
13pub fn log2_strict_u8(n: usize) -> u8 {
14 log2_strict_usize(n) as u8
15}
16
17pub trait PackedValueExt: PackedValue {
22 #[inline]
27 #[must_use]
28 fn pack_columns<const N: usize>(rows: &[[Self::Value; N]]) -> [Self; N] {
29 assert_eq!(rows.len(), Self::WIDTH);
30 array::from_fn(|col| Self::from_fn(|lane| rows[lane][col]))
31 }
32}
33
34impl<T: PackedValue> PackedValueExt for T {}
36
37#[inline]
39pub const fn aligned_len(len: usize, alignment: usize) -> usize {
40 if alignment <= 1 {
41 len
42 } else {
43 len.next_multiple_of(alignment)
44 }
45}
46
47pub fn aligned_widths(mut widths: Vec<usize>, alignment: usize) -> Vec<usize> {
49 for w in &mut widths {
50 *w = aligned_len(*w, alignment);
51 }
52 widths
53}