use halo2_base::{
gates::{circuit::MaybeRangeConfig, RangeChip},
halo2_proofs::circuit::Layouter,
utils::ScalarField,
virtual_region::manager::VirtualRegionManager,
};
use crate::rlc::{
chip::RlcChip,
circuit::{builder::RlcCircuitBuilder, RlcConfig},
};
impl<F: ScalarField> RlcCircuitBuilder<F> {
pub fn raw_synthesize_phase0(&self, config: &RlcConfig<F>, mut layouter: impl Layouter<F>) {
let usable_rows = config.rlc.usable_rows;
layouter
.assign_region(
|| "base phase 0",
|mut region| {
self.base.core().phase_manager[0]
.assign_raw(&(config.basic_gates(0), usable_rows), &mut region);
if let MaybeRangeConfig::WithRange(config) = &config.base.base {
self.base.assign_lookups_in_phase(config, &mut region, 0);
}
Ok(())
},
)
.unwrap();
self.base.assign_instances(&config.base.instance, layouter.namespace(|| "expose public"));
}
pub fn load_challenge(&mut self, config: &RlcConfig<F>, layouter: impl Layouter<F>) {
let gamma = layouter.get_challenge(config.rlc.gamma);
gamma.map(|g| self.gamma = Some(g));
log::info!("Challenge value: {gamma:?}");
}
pub fn raw_synthesize_phase1(
&self,
config: &RlcConfig<F>,
mut layouter: impl Layouter<F>,
enforce_copy_constraints: bool,
) {
let usable_rows = config.rlc.usable_rows;
layouter
.assign_region(
|| "base+rlc phase 1",
|mut region| {
let core = self.base.core();
core.phase_manager[1]
.assign_raw(&(config.basic_gates(1), usable_rows), &mut region);
if let MaybeRangeConfig::WithRange(config) = &config.base.base {
self.base.assign_lookups_in_phase(config, &mut region, 1);
}
self.rlc_manager.assign_raw(&config.rlc, &mut region);
if enforce_copy_constraints && !core.witness_gen_only() {
core.copy_manager.assign_raw(config.base.constants(), &mut region);
}
Ok(())
},
)
.unwrap();
}
}
pub trait RlcCircuitInstructions<F: ScalarField> {
type FirstPhasePayload;
fn virtual_assign_phase0(
&self,
builder: &mut RlcCircuitBuilder<F>,
range: &RangeChip<F>,
) -> Self::FirstPhasePayload;
fn virtual_assign_phase1(
builder: &mut RlcCircuitBuilder<F>,
range: &RangeChip<F>,
rlc: &RlcChip<F>,
payload: Self::FirstPhasePayload,
);
}