2022-06-27 07:18:21 -07:00
|
|
|
use plonky2::field::extension::Extendable;
|
2022-06-27 15:07:52 -07:00
|
|
|
use plonky2::field::packed::PackedField;
|
2022-06-27 12:24:09 -07:00
|
|
|
use plonky2::field::types::Field;
|
2022-06-14 16:55:08 -07:00
|
|
|
use plonky2::hash::hash_types::RichField;
|
|
|
|
|
use plonky2::iop::ext_target::ExtensionTarget;
|
2024-02-13 11:47:54 -05:00
|
|
|
use starky::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer};
|
2022-06-14 16:55:08 -07:00
|
|
|
|
2022-06-29 16:23:44 -07:00
|
|
|
use crate::cpu::columns::CpuColumnsView;
|
2023-10-30 14:05:54 -04:00
|
|
|
use crate::cpu::stack;
|
2022-06-14 16:55:08 -07:00
|
|
|
|
2022-08-17 21:19:27 -07:00
|
|
|
const LIMB_SIZE: usize = 32;
|
2022-06-14 16:55:08 -07:00
|
|
|
const ALL_1_LIMB: u64 = (1 << LIMB_SIZE) - 1;
|
|
|
|
|
|
2023-10-30 14:28:24 -04:00
|
|
|
/// Evaluates constraints for NOT.
|
2023-11-13 09:26:56 -05:00
|
|
|
pub(crate) fn eval_packed<P: PackedField>(
|
2022-06-29 16:23:44 -07:00
|
|
|
lv: &CpuColumnsView<P>,
|
2023-10-26 17:52:54 -04:00
|
|
|
nv: &CpuColumnsView<P>,
|
2022-06-14 16:55:08 -07:00
|
|
|
yield_constr: &mut ConstraintConsumer<P>,
|
|
|
|
|
) {
|
2022-08-26 16:39:39 -05:00
|
|
|
// This is simple: just do output = 0xffffffff - input.
|
2022-08-26 22:05:16 -07:00
|
|
|
let input = lv.mem_channels[0].value;
|
2023-10-26 17:52:54 -04:00
|
|
|
let output = nv.mem_channels[0].value;
|
2023-10-30 14:05:54 -04:00
|
|
|
let filter = lv.op.not_pop * lv.opcode_bits[0];
|
2022-08-26 16:39:39 -05:00
|
|
|
for (input_limb, output_limb) in input.into_iter().zip(output) {
|
|
|
|
|
yield_constr.constraint(
|
|
|
|
|
filter * (output_limb + input_limb - P::Scalar::from_canonical_u64(ALL_1_LIMB)),
|
|
|
|
|
);
|
2022-06-14 16:55:08 -07:00
|
|
|
}
|
2023-10-30 14:05:54 -04:00
|
|
|
|
|
|
|
|
// Stack constraints.
|
|
|
|
|
stack::eval_packed_one(lv, nv, filter, stack::BASIC_UNARY_OP.unwrap(), yield_constr);
|
2022-06-14 16:55:08 -07:00
|
|
|
}
|
|
|
|
|
|
2023-10-30 14:28:24 -04:00
|
|
|
/// Circuit version of `eval_packed`.
|
|
|
|
|
/// Evaluates constraints for NOT.
|
2023-11-13 09:26:56 -05:00
|
|
|
pub(crate) fn eval_ext_circuit<F: RichField + Extendable<D>, const D: usize>(
|
2022-06-14 16:55:08 -07:00
|
|
|
builder: &mut plonky2::plonk::circuit_builder::CircuitBuilder<F, D>,
|
2022-06-29 16:23:44 -07:00
|
|
|
lv: &CpuColumnsView<ExtensionTarget<D>>,
|
2023-10-26 17:52:54 -04:00
|
|
|
nv: &CpuColumnsView<ExtensionTarget<D>>,
|
2022-06-14 16:55:08 -07:00
|
|
|
yield_constr: &mut RecursiveConstraintConsumer<F, D>,
|
|
|
|
|
) {
|
2022-08-26 22:05:16 -07:00
|
|
|
let input = lv.mem_channels[0].value;
|
2023-10-26 17:52:54 -04:00
|
|
|
let output = nv.mem_channels[0].value;
|
2023-10-30 14:05:54 -04:00
|
|
|
let filter = builder.mul_extension(lv.op.not_pop, lv.opcode_bits[0]);
|
2022-08-26 16:39:39 -05:00
|
|
|
for (input_limb, output_limb) in input.into_iter().zip(output) {
|
|
|
|
|
let constr = builder.add_extension(output_limb, input_limb);
|
2022-06-14 16:55:08 -07:00
|
|
|
let constr = builder.arithmetic_extension(
|
|
|
|
|
F::ONE,
|
|
|
|
|
-F::from_canonical_u64(ALL_1_LIMB),
|
|
|
|
|
filter,
|
|
|
|
|
constr,
|
|
|
|
|
filter,
|
|
|
|
|
);
|
|
|
|
|
yield_constr.constraint(builder, constr);
|
|
|
|
|
}
|
2023-10-30 14:05:54 -04:00
|
|
|
|
|
|
|
|
// Stack constraints.
|
|
|
|
|
stack::eval_ext_circuit_one(
|
|
|
|
|
builder,
|
|
|
|
|
lv,
|
|
|
|
|
nv,
|
|
|
|
|
filter,
|
|
|
|
|
stack::BASIC_UNARY_OP.unwrap(),
|
|
|
|
|
yield_constr,
|
|
|
|
|
);
|
2022-06-14 16:55:08 -07:00
|
|
|
}
|