1pub const MAXIMUM_MEMORY_SIZE: u32 = u32::MAX;
3
4pub const BYTE_SIZE: usize = 8;
6
7pub const WORD_SIZE: usize = 4;
9
10pub const LONG_WORD_SIZE: usize = 2 * WORD_SIZE;
12
13pub const BABYBEAR_PRIME: u32 = 0x78000001;
15
16pub mod fd {
17 pub const LOWEST_ALLOWED_FD: u32 = 10;
23
24 macro_rules! create_fd {
26 ($(
27 #[$attr:meta]
28 pub const $name:ident: u32 = $value:expr;
29 )*) => {
30 $(
31 #[$attr]
32 pub const $name: u32 = $value + $crate::consts::fd::LOWEST_ALLOWED_FD;
33 )*
34 }
35 }
36
37 create_fd! {
38 pub const FD_PUBLIC_VALUES: u32 = 3;
40
41 pub const FD_HINT: u32 = 4;
43
44 pub const FD_ECRECOVER_HOOK: u32 = 5;
46
47 pub const FD_EDDECOMPRESS: u32 = 6;
49
50 pub const FD_RSA_MUL_MOD: u32 = 7;
52
53 pub const FD_BLS12_381_SQRT: u32 = 8;
55
56 pub const FD_BLS12_381_INVERSE: u32 = 9;
58
59 pub const FD_FP_SQRT: u32 = 10;
61
62 pub const FD_FP_INV: u32 = 11;
64 }
65}
66
67pub fn words_to_bytes_le_vec(words: &[u32]) -> Vec<u8> {
69 words.iter().flat_map(|word| word.to_le_bytes().into_iter()).collect::<Vec<_>>()
70}
71
72pub fn words_to_bytes_le<const B: usize>(words: &[u32]) -> [u8; B] {
74 debug_assert_eq!(words.len() * 4, B);
75 let mut iter = words.iter().flat_map(|word| word.to_le_bytes().into_iter());
76 core::array::from_fn(|_| iter.next().unwrap())
77}
78
79pub fn bytes_to_words_le<const W: usize>(bytes: &[u8]) -> [u32; W] {
81 debug_assert_eq!(bytes.len(), W * 4);
82 let mut iter = bytes.chunks_exact(4).map(|chunk| u32::from_le_bytes(chunk.try_into().unwrap()));
83 core::array::from_fn(|_| iter.next().unwrap())
84}
85
86pub fn bytes_to_words_le_vec(bytes: &[u8]) -> Vec<u32> {
88 bytes
89 .chunks_exact(4)
90 .map(|chunk| u32::from_le_bytes(chunk.try_into().unwrap()))
91 .collect::<Vec<_>>()
92}
93
94pub fn num_to_comma_separated<T: ToString>(value: T) -> String {
96 value
97 .to_string()
98 .chars()
99 .rev()
100 .collect::<Vec<_>>()
101 .chunks(3)
102 .map(|chunk| chunk.iter().collect::<String>())
103 .collect::<Vec<_>>()
104 .join(",")
105 .chars()
106 .rev()
107 .collect()
108}