use core::array;
use miden_core::field::PrimeCharacteristicRing;
use crate::{
constraints::{
chiplets::hasher_control::flags::ControllerFlags,
lookup::{
chiplet_air::{ChipletBusContext, ChipletLookupBuilder},
messages::{AceWireMsg, HasherPermLinkMsg},
},
utils::BoolNot,
},
lookup::{Deg, LookupBatch, LookupColumn, LookupGroup},
trace::chiplets::hasher::STATE_WIDTH,
};
pub(in crate::constraints::lookup) const MAX_INTERACTIONS_PER_ROW: usize = 3;
pub(in crate::constraints::lookup) fn emit_v_wiring<LB>(
builder: &mut LB,
ctx: &ChipletBusContext<LB>,
) where
LB: ChipletLookupBuilder,
{
let local = ctx.local;
let ace_flag = ctx.chiplet_active.ace.clone();
let ace = local.ace();
let ace_read = ace.read();
let ace_eval = ace.eval();
let ace_clk = ace.clk;
let ace_ctx = ace.ctx;
let id_0 = ace.id_0;
let id_1 = ace.id_1;
let id_2 = ace_eval.id_2;
let v_0 = ace.v_0;
let v_1 = ace.v_1;
let v_2 = ace_eval.v_2;
let m_0 = ace_read.m_0;
let m_1 = ace_read.m_1;
let sblock: LB::Expr = ace.s_block.into();
let ctrl = local.controller();
let (is_input, is_output) = ControllerFlags::<LB::Expr>::input_output(ctrl);
let controller_flag = ctx.chiplet_active.controller.clone();
let f_ctrl_input = controller_flag.clone() * is_input;
let f_ctrl_output = controller_flag * is_output;
let ctrl_state: [LB::Var; STATE_WIDTH] = array::from_fn(|i| ctrl.state[i]);
let perm_id = ctrl.perm_id;
builder.next_column(
|col| {
col.group(
"ace_perm_link",
|g| {
g.batch(
"ace_wiring",
ace_flag,
move |b| {
let m_0: LB::Expr = m_0.into();
let m_1: LB::Expr = m_1.into();
let wire_1_mult = sblock.not() * m_1 - sblock.clone();
let wire_2_mult = LB::Expr::ZERO - sblock;
let wire_0 = AceWireMsg {
clk: ace_clk.into(),
ctx: ace_ctx.into(),
id: id_0.into(),
v0: v_0.0.into(),
v1: v_0.1.into(),
};
b.insert("wire_0", m_0, wire_0, Deg { v: 5, u: 5 });
let wire_1 = AceWireMsg {
clk: ace_clk.into(),
ctx: ace_ctx.into(),
id: id_1.into(),
v0: v_1.0.into(),
v1: v_1.1.into(),
};
b.insert("wire_1", wire_1_mult, wire_1, Deg { v: 6, u: 5 });
let wire_2 = AceWireMsg {
clk: ace_clk.into(),
ctx: ace_ctx.into(),
id: id_2.into(),
v0: v_2.0.into(),
v1: v_2.1.into(),
};
b.insert("wire_2", wire_2_mult, wire_2, Deg { v: 5, u: 5 });
},
Deg { v: 8, u: 7 }, );
g.add(
"perm_ctrl_input",
f_ctrl_input,
move || {
let state: [LB::Expr; STATE_WIDTH] = ctrl_state.map(Into::into);
HasherPermLinkMsg::Input { perm_id: perm_id.into(), state }
},
Deg { v: 2, u: 3 },
);
g.add(
"perm_ctrl_output",
f_ctrl_output,
move || {
let state: [LB::Expr; STATE_WIDTH] = ctrl_state.map(Into::into);
HasherPermLinkMsg::Output { perm_id: perm_id.into(), state }
},
Deg { v: 3, u: 4 },
);
},
Deg { v: 8, u: 7 },
);
},
Deg { v: 8, u: 7 },
);
}