use super::InputLayout;
use crate::EXT_DEGREE;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum InputKey {
Public(usize),
AuxRandAlpha,
AuxRandBeta,
Main { offset: usize, index: usize },
AuxCoord {
offset: usize,
index: usize,
coord: usize,
},
AuxBusBoundary(usize),
Z,
Alpha,
ZPowN,
GInv,
GInv2,
ZK,
Weight0,
G,
S0,
InvZMinusGInv,
InvZMinusOne,
InvVanishing,
QuotientChunkCoord {
offset: usize,
chunk: usize,
coord: usize,
},
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct InputKeyMapper<'a> {
pub(super) layout: &'a InputLayout,
}
impl InputKeyMapper<'_> {
pub(crate) fn index_of(&self, key: InputKey) -> Option<usize> {
let layout = self.layout;
match key {
InputKey::Public(i) => layout.regions.public_values.index(i),
InputKey::AuxRandAlpha => Some(layout.aux_rand_alpha),
InputKey::AuxRandBeta => Some(layout.aux_rand_beta),
InputKey::Main { offset, index } => match offset {
0 => layout.regions.main_curr.index(index),
1 => layout.regions.main_next.index(index),
_ => None,
},
InputKey::AuxCoord { offset, index, coord } => {
if index >= layout.counts.aux_width || coord >= EXT_DEGREE {
return None;
}
let local = index * EXT_DEGREE + coord;
match offset {
0 => layout.regions.aux_curr.index(local),
1 => layout.regions.aux_next.index(local),
_ => None,
}
},
InputKey::AuxBusBoundary(i) => layout.regions.aux_bus_boundary.index(i),
InputKey::Z => Some(layout.stark.z),
InputKey::Alpha => Some(layout.stark.alpha),
InputKey::GInv => Some(layout.stark.g_inv),
InputKey::ZPowN => Some(layout.stark.z_pow_n),
InputKey::GInv2 => Some(layout.stark.g_inv2),
InputKey::ZK => Some(layout.stark.z_k),
InputKey::Weight0 => Some(layout.stark.weight0),
InputKey::G => Some(layout.stark.g),
InputKey::S0 => Some(layout.stark.s0),
InputKey::InvZMinusGInv => Some(layout.stark.inv_z_minus_g_inv),
InputKey::InvZMinusOne => Some(layout.stark.inv_z_minus_one),
InputKey::InvVanishing => Some(layout.stark.inv_vanishing),
InputKey::QuotientChunkCoord { offset, chunk, coord } => {
if chunk >= layout.counts.num_quotient_chunks || coord >= EXT_DEGREE {
return None;
}
let idx = chunk * EXT_DEGREE + coord;
match offset {
0 => layout.regions.quotient_curr.index(idx),
1 => layout.regions.quotient_next.index(idx),
_ => None,
}
},
}
}
}