pub mod state;
use core::borrow::Borrow;
use miden_crypto::stark::air::AirBuilder;
use crate::{
MainCols, MidenAirBuilder,
constraints::chiplets::{
columns::{HasherPeriodicCols, PeriodicCols},
selectors::ChipletFlags,
},
};
pub fn enforce_permutation_constraints<AB>(
builder: &mut AB,
local: &MainCols<AB::Var>,
next: &MainCols<AB::Var>,
flags: &ChipletFlags<AB::Expr>,
) where
AB: MidenAirBuilder,
{
let periodic_hasher: HasherPeriodicCols<AB::PeriodicVar> = {
let periodic: &PeriodicCols<AB::PeriodicVar> = builder.periodic_values().borrow();
periodic.hasher
};
let cols = local.permutation();
let cols_next = next.permutation();
let not_cycle_end: AB::Expr = [
periodic_hasher.is_init_ext,
periodic_hasher.is_ext,
periodic_hasher.is_packed_int,
periodic_hasher.is_int_ext,
]
.map(Into::into)
.into_iter()
.sum();
state::enforce_permutation_steps(
builder,
flags.is_active.clone(),
cols,
cols_next,
&periodic_hasher,
);
builder.when(flags.is_active.clone()).assert_zeros(cols.unused_padding());
builder
.when(flags.is_active.clone())
.when(not_cycle_end.clone())
.assert_eq(cols_next.multiplicity, cols.multiplicity);
builder.when(flags.next_is_first.clone()).assert_zero(not_cycle_end.clone());
builder.when(flags.is_last.clone()).assert_zero(not_cycle_end);
}