miden_ace_codegen/layout/
plan.rs1use super::InputKey;
2use crate::EXT_DEGREE;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub(crate) struct InputRegion {
7 pub offset: usize,
8 pub width: usize,
9}
10
11impl InputRegion {
12 pub fn index(&self, local: usize) -> Option<usize> {
14 (local < self.width).then(|| self.offset + local)
15 }
16}
17
18#[derive(Debug, Clone, Copy)]
20pub struct InputCounts {
21 pub width: usize,
23 pub aux_width: usize,
25 pub num_aux_boundary: usize,
27 pub num_public: usize,
29 pub num_vlpi: usize,
33 pub num_randomness: usize,
35 pub num_periodic: usize,
37 pub num_quotient_chunks: usize,
39}
40
41#[derive(Debug, Clone, Copy, PartialEq, Eq)]
43pub(crate) struct LayoutRegions {
44 pub public_values: InputRegion,
46 pub vlpi_reductions: InputRegion,
48 pub randomness: InputRegion,
50 pub main_curr: InputRegion,
52 pub aux_curr: InputRegion,
54 pub quotient_curr: InputRegion,
56 pub main_next: InputRegion,
58 pub aux_next: InputRegion,
60 pub quotient_next: InputRegion,
62 pub aux_bus_boundary: InputRegion,
64 pub stark_vars: InputRegion,
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq)]
78pub(crate) struct StarkVarIndices {
79 pub alpha: usize,
82 pub z_pow_n: usize,
84 pub z_k: usize,
86 pub is_first: usize,
88 pub is_last: usize,
90 pub is_transition: usize,
92 pub gamma: usize,
94
95 pub weight0: usize,
98 pub f: usize,
100 pub s0: usize,
102}
103
104#[derive(Debug, Clone)]
109pub struct InputLayout {
110 pub(crate) regions: LayoutRegions,
112 pub(crate) aux_rand_alpha: usize,
114 pub(crate) aux_rand_beta: usize,
116 pub(crate) vlpi_stride: usize,
118 pub(crate) stark: StarkVarIndices,
120 pub total_inputs: usize,
122 pub counts: InputCounts,
124}
125
126impl InputLayout {
127 pub(crate) fn mapper(&self) -> super::InputKeyMapper<'_> {
128 super::InputKeyMapper { layout: self }
129 }
130
131 pub fn index(&self, key: InputKey) -> Option<usize> {
133 self.mapper().index_of(key)
134 }
135
136 pub(crate) fn validate(&self) {
138 let mut max_end = 0usize;
139 for region in [
140 self.regions.public_values,
141 self.regions.vlpi_reductions,
142 self.regions.randomness,
143 self.regions.main_curr,
144 self.regions.aux_curr,
145 self.regions.quotient_curr,
146 self.regions.main_next,
147 self.regions.aux_next,
148 self.regions.quotient_next,
149 self.regions.aux_bus_boundary,
150 self.regions.stark_vars,
151 ] {
152 max_end = max_end.max(region.offset.saturating_add(region.width));
153 }
154
155 assert!(max_end <= self.total_inputs, "regions exceed total_inputs");
156
157 let aux_coord_width = self.counts.aux_width * EXT_DEGREE;
158 assert_eq!(self.regions.aux_curr.width, aux_coord_width, "aux_curr width mismatch");
159 assert_eq!(self.regions.aux_next.width, aux_coord_width, "aux_next width mismatch");
160
161 let quotient_width = self.counts.num_quotient_chunks * EXT_DEGREE;
162 assert_eq!(
163 self.regions.quotient_curr.width, quotient_width,
164 "quotient_curr width mismatch"
165 );
166 assert_eq!(
167 self.regions.quotient_next.width, quotient_width,
168 "quotient_next width mismatch"
169 );
170 assert_eq!(
171 self.regions.aux_bus_boundary.width, self.counts.num_aux_boundary,
172 "aux bus boundary width mismatch"
173 );
174
175 let stark_start = self.regions.stark_vars.offset;
176 let stark_end = stark_start + self.regions.stark_vars.width;
177 let check = |name: &str, idx: usize| {
178 assert!(idx >= stark_start && idx < stark_end, "stark var {name} out of range");
179 };
180 check("alpha", self.stark.alpha);
182 check("z_pow_n", self.stark.z_pow_n);
183 check("z_k", self.stark.z_k);
184 check("is_first", self.stark.is_first);
185 check("is_last", self.stark.is_last);
186 check("is_transition", self.stark.is_transition);
187 check("gamma", self.stark.gamma);
188 check("weight0", self.stark.weight0);
190 check("f", self.stark.f);
191 check("s0", self.stark.s0);
192
193 let rand_start = self.regions.randomness.offset;
194 let rand_end = rand_start + self.regions.randomness.width;
195 assert!(
196 self.aux_rand_alpha >= rand_start && self.aux_rand_alpha < rand_end,
197 "aux_rand_alpha out of randomness region"
198 );
199 assert!(
200 self.aux_rand_beta >= rand_start && self.aux_rand_beta < rand_end,
201 "aux_rand_beta out of randomness region"
202 );
203 }
204}