use core::borrow::Borrow;
use miden_crypto::stark::air::WindowAccess;
use super::{
BusId,
buses::{
LookupOpFlags,
block_hash_and_op_group::{self, emit_block_hash_and_op_group},
block_stack_and_range_logcap::{self, emit_block_stack_and_range_logcap},
chiplet_requests::{self, emit_chiplet_requests},
stack_overflow::{self, emit_stack_overflow},
},
};
use crate::{
Felt, MainCols,
lookup::{LookupAir, LookupBuilder},
};
pub(crate) trait MainLookupBuilder: LookupBuilder<F = Felt> {
fn build_op_flags(
&self,
local: &MainCols<Self::Var>,
next: &MainCols<Self::Var>,
) -> LookupOpFlags<Self::Expr> {
LookupOpFlags::from_main_cols(&local.decoder, &local.stack, &next.decoder)
}
}
pub(crate) struct MainBusContext<'a, LB>
where
LB: LookupBuilder<F = Felt>,
{
pub local: &'a MainCols<LB::Var>,
pub next: &'a MainCols<LB::Var>,
pub op_flags: LookupOpFlags<LB::Expr>,
}
impl<'a, LB> MainBusContext<'a, LB>
where
LB: MainLookupBuilder,
{
pub fn new(builder: &LB, local: &'a MainCols<LB::Var>, next: &'a MainCols<LB::Var>) -> Self {
let op_flags = builder.build_op_flags(local, next);
Self { local, next, op_flags }
}
}
#[derive(Copy, Clone, Debug, Default)]
pub(crate) struct MainLookupAir;
pub(crate) const MAIN_COLUMN_SHAPE: [usize; 4] = [
block_stack_and_range_logcap::MAX_INTERACTIONS_PER_ROW,
block_hash_and_op_group::MAX_INTERACTIONS_PER_ROW,
chiplet_requests::MAX_INTERACTIONS_PER_ROW,
stack_overflow::MAX_INTERACTIONS_PER_ROW,
];
impl<LB> LookupAir<LB> for MainLookupAir
where
LB: MainLookupBuilder,
{
fn num_columns(&self) -> usize {
MAIN_COLUMN_SHAPE.len()
}
fn column_shape(&self) -> &[usize] {
&MAIN_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 = MainBusContext::new(&*builder, local, next);
emit_block_stack_and_range_logcap::<LB>(builder, &ctx);
emit_block_hash_and_op_group::<LB>(builder, &ctx);
emit_chiplet_requests::<LB>(builder, &ctx);
emit_stack_overflow::<LB>(builder, &ctx);
}
}