use miden_core::field::PrimeCharacteristicRing;
use super::{HasherColumns, HasherFlags};
use crate::{
Felt,
constraints::tagging::{
TagGroup, TaggingAirBuilderExt, tagged_assert_zero, tagged_assert_zero_integrity,
tagged_assert_zeros, tagged_assert_zeros_integrity,
},
};
const SELECTOR_BOOL_NAMESPACE: &str = "chiplets.hasher.selectors.binary";
const SELECTOR_STABILITY_NAMESPACE: &str = "chiplets.hasher.selectors.stability";
const SELECTOR_CONT_NAMESPACE: &str = "chiplets.hasher.selectors.continuation";
const SELECTOR_INVALID_NAMESPACE: &str = "chiplets.hasher.selectors.invalid";
const SELECTOR_BOOL_NAMES: [&str; 3] = [SELECTOR_BOOL_NAMESPACE; 3];
const SELECTOR_CONSIST_NAMES: [&str; 4] = [
SELECTOR_STABILITY_NAMESPACE,
SELECTOR_STABILITY_NAMESPACE,
SELECTOR_CONT_NAMESPACE,
SELECTOR_INVALID_NAMESPACE,
];
const SELECTOR_BOOL_TAGS: TagGroup = TagGroup {
base: super::HASHER_SELECTOR_BOOL_BASE_ID,
names: &SELECTOR_BOOL_NAMES,
};
const SELECTOR_CONSIST_TAGS: TagGroup = TagGroup {
base: super::HASHER_SELECTOR_CONSIST_BASE_ID,
names: &SELECTOR_CONSIST_NAMES,
};
pub(super) fn enforce_selector_consistency<AB>(
builder: &mut AB,
hasher_flag: AB::Expr,
cols: &HasherColumns<AB::Expr>,
cols_next: &HasherColumns<AB::Expr>,
flags: &HasherFlags<AB::Expr>,
) where
AB: TaggingAirBuilderExt<F = Felt>,
{
let one: AB::Expr = AB::Expr::ONE;
let stability_gate = one.clone() - flags.f_out.clone() - flags.f_out_next.clone();
let gate = hasher_flag.clone() * stability_gate;
let mut idx = 0;
tagged_assert_zeros(
builder,
&SELECTOR_CONSIST_TAGS,
&mut idx,
SELECTOR_STABILITY_NAMESPACE,
[
gate.clone() * (cols_next.s1.clone() - cols.s1.clone()),
gate * (cols_next.s2.clone() - cols.s2.clone()),
],
);
let gate = hasher_flag.clone() * flags.f_continuation();
tagged_assert_zero(builder, &SELECTOR_CONSIST_TAGS, &mut idx, gate * cols_next.s0.clone());
tagged_assert_zero_integrity(
builder,
&SELECTOR_CONSIST_TAGS,
&mut idx,
hasher_flag
* flags.cycle_row_31.clone()
* (one.clone() - cols.s0.clone())
* cols.s1.clone(),
);
}
pub fn enforce_selector_booleanity<AB>(
builder: &mut AB,
hasher_flag: AB::Expr,
s0: AB::Var,
s1: AB::Var,
s2: AB::Var,
) where
AB: TaggingAirBuilderExt<F = Felt>,
{
let s0: AB::Expr = s0.into();
let s1: AB::Expr = s1.into();
let s2: AB::Expr = s2.into();
let mut idx = 0;
tagged_assert_zeros_integrity(
builder,
&SELECTOR_BOOL_TAGS,
&mut idx,
SELECTOR_BOOL_NAMESPACE,
[
hasher_flag.clone() * s0.clone() * (s0 - AB::Expr::ONE),
hasher_flag.clone() * s1.clone() * (s1 - AB::Expr::ONE),
hasher_flag * s2.clone() * (s2 - AB::Expr::ONE),
],
);
}