use miden_core::field::PrimeCharacteristicRing;
use miden_crypto::stark::air::{AirBuilder, LiftedAirBuilder};
use crate::{
MainTraceRow,
constraints::tagging::{
TaggingAirBuilderExt,
ids::{TAG_RANGE_MAIN_BASE, TAG_RANGE_MAIN_COUNT},
},
trace::{RANGE_CHECK_TRACE_OFFSET, range},
};
pub mod bus;
const RANGE_V_COL_IDX: usize = range::V_COL_IDX - RANGE_CHECK_TRACE_OFFSET;
const RANGE_MAIN_NAMES: [&str; TAG_RANGE_MAIN_COUNT] =
["range.main.v.first_row", "range.main.v.last_row", "range.main.v.transition"];
pub fn enforce_main<AB>(
builder: &mut AB,
local: &MainTraceRow<AB::Var>,
next: &MainTraceRow<AB::Var>,
) where
AB: LiftedAirBuilder,
{
enforce_range_boundary_constraints(builder, local);
enforce_range_transition_constraint(builder, local, next);
}
pub fn enforce_range_boundary_constraints<AB>(builder: &mut AB, local: &MainTraceRow<AB::Var>)
where
AB: LiftedAirBuilder,
{
let v = local.range[RANGE_V_COL_IDX].clone();
builder.tagged(TAG_RANGE_MAIN_BASE, RANGE_MAIN_NAMES[0], |builder| {
builder.when_first_row().assert_zero(v.clone());
});
let sixty_five_k = AB::Expr::from_u32(65535);
builder.tagged(TAG_RANGE_MAIN_BASE + 1, RANGE_MAIN_NAMES[1], |builder| {
builder.when_last_row().assert_eq(v, sixty_five_k);
});
}
pub fn enforce_range_transition_constraint<AB>(
builder: &mut AB,
local: &MainTraceRow<AB::Var>,
next: &MainTraceRow<AB::Var>,
) where
AB: LiftedAirBuilder,
{
let v = local.range[RANGE_V_COL_IDX].clone();
let v_next = next.range[RANGE_V_COL_IDX].clone();
let change_v = v_next - v;
let one_expr = AB::Expr::ONE;
let three = AB::Expr::from_u16(3);
let nine = AB::Expr::from_u16(9);
let twenty_seven = AB::Expr::from_u16(27);
let eighty_one = AB::Expr::from_u16(81);
let two_forty_three = AB::Expr::from_u16(243);
let seven_twenty_nine = AB::Expr::from_u16(729);
let two_one_eight_seven = AB::Expr::from_u16(2187);
builder.tagged(TAG_RANGE_MAIN_BASE + 2, RANGE_MAIN_NAMES[2], |builder| {
builder.when_transition().assert_zero(
change_v.clone()
* (change_v.clone() - one_expr)
* (change_v.clone() - three)
* (change_v.clone() - nine)
* (change_v.clone() - twenty_seven)
* (change_v.clone() - eighty_one)
* (change_v.clone() - two_forty_three)
* (change_v.clone() - seven_twenty_nine)
* (change_v - two_one_eight_seven),
);
});
}