use ff::Field;
use midnight_proofs::{
circuit::Layouter,
plonk::{Error, Expression},
};
use crate::{
field::AssignedNative,
instructions::ArithInstructions,
verifier::{
expressions::{compress_expressions, eval_expression},
trash::TrashEvaluated,
SelfEmulation,
},
};
#[allow(clippy::too_many_arguments)]
pub(crate) fn trash_expressions<S: SelfEmulation>(
layouter: &mut impl Layouter<S::F>,
scalar_chip: &S::ScalarChip,
trash_evaluated: &TrashEvaluated<S>,
selector: &Expression<S::F>,
constraint_expressions: &[Expression<S::F>],
advice_evals: &[AssignedNative<S::F>],
fixed_evals: &[AssignedNative<S::F>],
instance_evals: &[AssignedNative<S::F>],
trash_challenge: &AssignedNative<S::F>,
) -> Result<Vec<AssignedNative<S::F>>, Error> {
let id = {
let compressed = compress_expressions::<S>(
layouter,
scalar_chip,
advice_evals,
fixed_evals,
instance_evals,
trash_challenge,
constraint_expressions,
)?;
let q = eval_expression::<S>(
layouter,
scalar_chip,
advice_evals,
fixed_evals,
instance_evals,
selector,
)?;
scalar_chip.add_and_mul(
layouter,
(S::F::ZERO, &q),
(-S::F::ONE, &trash_evaluated.trash_eval),
(S::F::ONE, &compressed),
S::F::ZERO,
S::F::ONE,
)?
};
Ok(vec![id])
}