use core::borrow::Borrow;
use miden_crypto::stark::air::WindowAccess;
use super::{
BusId,
buses::{
ChipletActiveFlags,
chiplet_responses::{self, emit_chiplet_responses},
hash_kernel::{self, emit_hash_kernel_table},
wiring::{self, emit_v_wiring},
},
};
use crate::{
Felt, MainCols,
lookup::{LookupAir, LookupBuilder},
};
pub(crate) trait ChipletLookupBuilder: LookupBuilder<F = Felt> {
fn build_chiplet_active(&self, local: &MainCols<Self::Var>) -> ChipletActiveFlags<Self::Expr> {
ChipletActiveFlags::from_main_cols(local)
}
}
pub(crate) struct ChipletBusContext<'a, LB>
where
LB: LookupBuilder<F = Felt>,
{
pub local: &'a MainCols<LB::Var>,
pub next: &'a MainCols<LB::Var>,
pub chiplet_active: ChipletActiveFlags<LB::Expr>,
}
impl<'a, LB> ChipletBusContext<'a, LB>
where
LB: ChipletLookupBuilder,
{
pub fn new(builder: &LB, local: &'a MainCols<LB::Var>, next: &'a MainCols<LB::Var>) -> Self {
let chiplet_active = builder.build_chiplet_active(local);
Self { local, next, chiplet_active }
}
}
#[derive(Copy, Clone, Debug, Default)]
pub(crate) struct ChipletLookupAir;
pub(crate) const CHIPLET_COLUMN_SHAPE: [usize; 3] = [
chiplet_responses::MAX_INTERACTIONS_PER_ROW,
hash_kernel::MAX_INTERACTIONS_PER_ROW,
wiring::MAX_INTERACTIONS_PER_ROW,
];
impl<LB> LookupAir<LB> for ChipletLookupAir
where
LB: ChipletLookupBuilder,
{
fn num_columns(&self) -> usize {
CHIPLET_COLUMN_SHAPE.len()
}
fn column_shape(&self) -> &[usize] {
&CHIPLET_COLUMN_SHAPE
}
fn max_message_width(&self) -> usize {
super::messages::MIDEN_MAX_MESSAGE_WIDTH
}
fn num_bus_ids(&self) -> usize {
BusId::COUNT
}
fn eval(&self, builder: &mut LB) {
let main = builder.main();
let local: &MainCols<_> = main.current_slice().borrow();
let next: &MainCols<_> = main.next_slice().borrow();
let ctx = ChipletBusContext::new(&*builder, local, next);
emit_chiplet_responses::<LB>(builder, &ctx);
emit_hash_kernel_table::<LB>(builder, &ctx);
emit_v_wiring::<LB>(builder, &ctx);
}
}