|
@ -1,6 +1,8 @@ |
|
|
use alloc::string::{String, ToString};
|
|
|
use alloc::string::{String, ToString};
|
|
|
use alloc::vec::Vec;
|
|
|
use alloc::vec::Vec;
|
|
|
use alloc::{format, vec};
|
|
|
use alloc::{format, vec};
|
|
|
|
|
|
use anyhow::Result;
|
|
|
|
|
|
use num::integer::div_ceil;
|
|
|
use core::marker::PhantomData;
|
|
|
use core::marker::PhantomData;
|
|
|
use plonky2::plonk::circuit_data::CommonCircuitData;
|
|
|
use plonky2::plonk::circuit_data::CommonCircuitData;
|
|
|
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
|
|
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
|
@ -23,7 +25,7 @@ use plonky2::plonk::vars::{ |
|
|
EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch,
|
|
|
EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch,
|
|
|
EvaluationVarsBasePacked,
|
|
|
EvaluationVarsBasePacked,
|
|
|
};
|
|
|
};
|
|
|
use plonky2::util::{bits_u64, ceil_div_usize};
|
|
|
|
|
|
|
|
|
use plonky2::util::bits_u64;
|
|
|
|
|
|
|
|
|
/// A gate for checking that one value is less than or equal to another.
|
|
|
/// A gate for checking that one value is less than or equal to another.
|
|
|
#[derive(Clone, Debug)]
|
|
|
#[derive(Clone, Debug)]
|
|
@ -44,7 +46,7 @@ impl, const D: usize> ComparisonGate { |
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
pub fn chunk_bits(&self) -> usize {
|
|
|
pub fn chunk_bits(&self) -> usize {
|
|
|
ceil_div_usize(self.num_bits, self.num_chunks)
|
|
|
|
|
|
|
|
|
div_ceil(self.num_bits, self.num_chunks)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
pub fn wire_first_input(&self) -> usize {
|
|
|
pub fn wire_first_input(&self) -> usize {
|
|
@ -434,7 +436,7 @@ impl, const D: usize> SimpleGenerator |
|
|
]
|
|
|
]
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
fn run_once(&self, witness: &PartitionWitness<F>, out_buffer: &mut GeneratedValues<F>) {
|
|
|
|
|
|
|
|
|
fn run_once(&self, witness: &PartitionWitness<F>, out_buffer: &mut GeneratedValues<F>) -> Result<()> {
|
|
|
let local_wire = |column| Wire {
|
|
|
let local_wire = |column| Wire {
|
|
|
row: self.row,
|
|
|
row: self.row,
|
|
|
column,
|
|
|
column,
|
|
@ -502,36 +504,38 @@ impl, const D: usize> SimpleGenerator |
|
|
.map(|x| F::from_canonical_u64(*x))
|
|
|
.map(|x| F::from_canonical_u64(*x))
|
|
|
.collect();
|
|
|
.collect();
|
|
|
|
|
|
|
|
|
out_buffer.set_wire(local_wire(self.gate.wire_result_bool()), result);
|
|
|
|
|
|
|
|
|
out_buffer.set_wire(local_wire(self.gate.wire_result_bool()), result)?;
|
|
|
out_buffer.set_wire(
|
|
|
out_buffer.set_wire(
|
|
|
local_wire(self.gate.wire_most_significant_diff()),
|
|
|
local_wire(self.gate.wire_most_significant_diff()),
|
|
|
most_significant_diff,
|
|
|
most_significant_diff,
|
|
|
);
|
|
|
|
|
|
|
|
|
)?;
|
|
|
for i in 0..self.gate.num_chunks {
|
|
|
for i in 0..self.gate.num_chunks {
|
|
|
out_buffer.set_wire(
|
|
|
out_buffer.set_wire(
|
|
|
local_wire(self.gate.wire_first_chunk_val(i)),
|
|
|
local_wire(self.gate.wire_first_chunk_val(i)),
|
|
|
first_input_chunks[i],
|
|
|
first_input_chunks[i],
|
|
|
);
|
|
|
|
|
|
|
|
|
)?;
|
|
|
out_buffer.set_wire(
|
|
|
out_buffer.set_wire(
|
|
|
local_wire(self.gate.wire_second_chunk_val(i)),
|
|
|
local_wire(self.gate.wire_second_chunk_val(i)),
|
|
|
second_input_chunks[i],
|
|
|
second_input_chunks[i],
|
|
|
);
|
|
|
|
|
|
|
|
|
)?;
|
|
|
out_buffer.set_wire(
|
|
|
out_buffer.set_wire(
|
|
|
local_wire(self.gate.wire_equality_dummy(i)),
|
|
|
local_wire(self.gate.wire_equality_dummy(i)),
|
|
|
equality_dummies[i],
|
|
|
equality_dummies[i],
|
|
|
);
|
|
|
|
|
|
out_buffer.set_wire(local_wire(self.gate.wire_chunks_equal(i)), chunks_equal[i]);
|
|
|
|
|
|
|
|
|
)?;
|
|
|
|
|
|
out_buffer.set_wire(local_wire(self.gate.wire_chunks_equal(i)), chunks_equal[i])?;
|
|
|
out_buffer.set_wire(
|
|
|
out_buffer.set_wire(
|
|
|
local_wire(self.gate.wire_intermediate_value(i)),
|
|
|
local_wire(self.gate.wire_intermediate_value(i)),
|
|
|
intermediate_values[i],
|
|
|
intermediate_values[i],
|
|
|
);
|
|
|
|
|
|
|
|
|
)?;
|
|
|
}
|
|
|
}
|
|
|
for i in 0..self.gate.chunk_bits() + 1 {
|
|
|
for i in 0..self.gate.chunk_bits() + 1 {
|
|
|
out_buffer.set_wire(
|
|
|
out_buffer.set_wire(
|
|
|
local_wire(self.gate.wire_most_significant_diff_bit(i)),
|
|
|
local_wire(self.gate.wire_most_significant_diff_bit(i)),
|
|
|
msd_bits[i],
|
|
|
msd_bits[i],
|
|
|
);
|
|
|
|
|
|
|
|
|
)?;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
fn serialize(&self, dst: &mut Vec<u8>, common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
|
|
|
fn serialize(&self, dst: &mut Vec<u8>, common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
|
|
|