use miden_crypto::stark::air::AirBuilder;
use crate::{MainCols, MidenAirBuilder, constraints::op_flags::OpFlags};
pub fn enforce_main<AB>(
builder: &mut AB,
local: &MainCols<AB::Var>,
next: &MainCols<AB::Var>,
op_flags: &OpFlags<AB::Expr>,
) where
AB: MidenAirBuilder,
{
{
let flag_sum = op_flags.no_shift_at(0) + op_flags.left_shift_at(1);
let expected = op_flags.no_shift_at(0) * local.stack.get(0).into()
+ op_flags.left_shift_at(1) * local.stack.get(1).into();
let actual = next.stack.get(0);
builder.when_transition().assert_zero(actual * flag_sum - expected);
}
for i in 1..15 {
let flag_sum = op_flags.no_shift_at(i)
+ op_flags.left_shift_at(i + 1)
+ op_flags.right_shift_at(i - 1);
let expected = op_flags.no_shift_at(i) * local.stack.get(i).into()
+ op_flags.left_shift_at(i + 1) * local.stack.get(i + 1).into()
+ op_flags.right_shift_at(i - 1) * local.stack.get(i - 1).into();
let actual = next.stack.get(i);
builder.when_transition().assert_zero(actual * flag_sum - expected);
}
{
let flag_sum = op_flags.no_shift_at(15) + op_flags.right_shift_at(14);
let expected = op_flags.no_shift_at(15) * local.stack.get(15).into()
+ op_flags.right_shift_at(14) * local.stack.get(14).into();
let actual = next.stack.get(15);
builder.when_transition().assert_zero(actual * flag_sum - expected);
}
}