use std::fmt::Debug;
use midnight_proofs::{
circuit::{Layouter, Value},
plonk::Error,
};
use crate::{types::AssignedNative, CircuitField};
pub trait CoreDecompositionInstructions<F: CircuitField>: Clone + Debug {
fn decompose_fixed_limb_size(
&self,
layouter: &mut impl Layouter<F>,
x: &AssignedNative<F>,
bit_length: usize,
limb_size: usize,
) -> Result<Vec<AssignedNative<F>>, Error>;
fn assign_less_than_pow2(
&self,
layouter: &mut impl Layouter<F>,
value: Value<F>,
bit_length: usize,
) -> Result<AssignedNative<F>, Error>;
fn assert_less_than_pow2(
&self,
layouter: &mut impl Layouter<F>,
x: &AssignedNative<F>,
bit_length: usize,
) -> Result<(), Error> {
let y = self.assign_less_than_pow2(layouter, x.value().copied(), bit_length)?;
layouter.assign_region(
|| "copy",
|mut region| region.constrain_equal(x.cell(), y.cell()),
)
}
fn assign_many_small(
&self,
layouter: &mut impl Layouter<F>,
values: &[Value<F>],
bit_length: usize,
) -> Result<Vec<AssignedNative<F>>, Error>;
}