use crate::{
constraints::lookup::{
main_air::{MainBusContext, MainLookupBuilder},
messages::StackOverflowMsg,
},
lookup::{Deg, LookupColumn, LookupGroup},
};
pub(in crate::constraints::lookup) const MAX_INTERACTIONS_PER_ROW: usize = 1;
pub(in crate::constraints::lookup) fn emit_stack_overflow<LB>(
builder: &mut LB,
ctx: &MainBusContext<LB>,
) where
LB: MainLookupBuilder,
{
let local = ctx.local;
let next = ctx.next;
let op_flags = &ctx.op_flags;
let clk = local.system.clk;
let s15 = local.stack.get(15);
let s15_next = next.stack.get(15);
let b1 = local.stack.b1;
let b1_next = next.stack.b1;
let h5 = local.decoder.hasher_state[5];
let f_overflow = op_flags.overflow();
let f_left_overflow = op_flags.left_shift() * f_overflow.clone();
let f_dyncall_overflow = op_flags.dyncall() * f_overflow;
builder.next_column(
|col| {
col.group(
"overflow_interactions",
|g| {
g.add(
"right_shift",
op_flags.right_shift(),
|| StackOverflowMsg {
clk: clk.into(),
val: s15.into(),
prev: b1.into(),
},
Deg { v: 6, u: 7 },
);
g.remove(
"left_shift",
f_left_overflow,
|| StackOverflowMsg {
clk: b1.into(),
val: s15_next.into(),
prev: b1_next.into(),
},
Deg { v: 7, u: 8 },
);
g.remove(
"dyncall",
f_dyncall_overflow,
|| StackOverflowMsg {
clk: b1.into(),
val: s15_next.into(),
prev: h5.into(),
},
Deg { v: 7, u: 8 },
);
},
Deg { v: 7, u: 8 },
);
},
Deg { v: 7, u: 8 },
);
}