#[cfg(debug_assertions)]
pub mod debug;
pub mod gadgets;
pub mod synth;
pub mod witness;
pub use witness::{CircuitWitness, FileProofWitness};
use ff::PrimeField;
use ff::PrimeFieldBits;
use nova_snark::{
frontend::{gadgets::num::AllocatedNum, ConstraintSystem, SynthesisError},
traits::circuit::StepCircuit,
};
use std::marker::PhantomData;
use crate::config;
#[derive(Clone, Debug)]
pub struct PorCircuit<F: PrimeField> {
pub file_tree_depth: usize,
pub files_per_step: usize,
pub aggregated_tree_depth: usize,
pub witness: Option<CircuitWitness<F>>,
_p: PhantomData<F>,
}
impl<F: PrimeField> PorCircuit<F> {
pub fn new(
files_per_step: usize,
file_tree_depth: usize,
aggregated_tree_depth: usize,
witnesses: Option<Vec<FileProofWitness<F>>>,
) -> Self {
let circuit_witness = witnesses.map(|w| {
let num_real = w.len();
CircuitWitness::new(w, num_real)
});
Self {
file_tree_depth,
files_per_step,
aggregated_tree_depth,
witness: circuit_witness,
_p: PhantomData,
}
}
}
impl<F: PrimeField> Default for PorCircuit<F> {
fn default() -> Self {
Self {
file_tree_depth: 1,
files_per_step: 1,
aggregated_tree_depth: 0,
witness: None,
_p: PhantomData,
}
}
}
impl<F: PrimeField + PrimeFieldBits> StepCircuit<F> for PorCircuit<F> {
fn arity(&self) -> usize {
config::PublicIOLayout::new(self.files_per_step).arity()
}
fn synthesize<CS: ConstraintSystem<F>>(
&self,
cs: &mut CS,
z: &[AllocatedNum<F>],
) -> Result<Vec<AllocatedNum<F>>, SynthesisError> {
synth::synthesize_por_circuit(
cs,
z,
self.files_per_step,
self.file_tree_depth,
self.aggregated_tree_depth,
self.witness.as_ref(),
)
}
}