pub struct BaseCircuitBuilder<F: ScalarField> {
pub config_params: BaseCircuitParams,
pub assigned_instances: Vec<Vec<AssignedValue<F>>>,
/* private fields */
}
Expand description
A circuit builder is a collection of virtual region managers that together assign virtual regions into a single physical circuit.
BaseCircuitBuilder is a circuit builder to create a circuit where the columns correspond to super::BaseConfig.
This builder can hold multiple threads, but the Circuit
implementation only evaluates the first phase.
The user will have to implement a separate Circuit
with multi-phase witness generation logic.
This is used to manage the virtual region corresponding to super::FlexGateConfig and (optionally) RangeConfig.
This can be used even if only using GateChip
without RangeChip.
The circuit will have NI
public instance (aka public inputs+outputs) columns.
Fields§
§config_params: BaseCircuitParams
Configuration parameters for the circuit shape
assigned_instances: Vec<Vec<AssignedValue<F>>>
The assigned instances to expose publicly at the end of circuit synthesis
Implementations§
Source§impl<F: ScalarField> BaseCircuitBuilder<F>
impl<F: ScalarField> BaseCircuitBuilder<F>
Sourcepub fn core(&self) -> &MultiPhaseCoreManager<F>
pub fn core(&self) -> &MultiPhaseCoreManager<F>
Virtual region for each challenge phase. These cannot be shared across threads while keeping circuit deterministic.
Sourcepub fn lookup_manager(&self) -> &[LookupAnyManager<F, 1>; 3]
pub fn lookup_manager(&self) -> &[LookupAnyManager<F, 1>; 3]
The range lookup manager
Source§impl<F: ScalarField> BaseCircuitBuilder<F>
impl<F: ScalarField> BaseCircuitBuilder<F>
Sourcepub fn core_mut(&mut self) -> &mut MultiPhaseCoreManager<F>
pub fn core_mut(&mut self) -> &mut MultiPhaseCoreManager<F>
Virtual region for each challenge phase. These cannot be shared across threads while keeping circuit deterministic.
Sourcepub fn lookup_manager_mut(&mut self) -> &mut [LookupAnyManager<F, 1>; 3]
pub fn lookup_manager_mut(&mut self) -> &mut [LookupAnyManager<F, 1>; 3]
The range lookup manager
Source§impl<F: ScalarField> BaseCircuitBuilder<F>
impl<F: ScalarField> BaseCircuitBuilder<F>
Sourcepub fn set_core(&mut self, val: MultiPhaseCoreManager<F>) -> &mut Self
pub fn set_core(&mut self, val: MultiPhaseCoreManager<F>) -> &mut Self
Virtual region for each challenge phase. These cannot be shared across threads while keeping circuit deterministic.
Sourcepub fn set_lookup_manager(
&mut self,
val: [LookupAnyManager<F, 1>; 3],
) -> &mut Self
pub fn set_lookup_manager( &mut self, val: [LookupAnyManager<F, 1>; 3], ) -> &mut Self
The range lookup manager
Source§impl<F: ScalarField> BaseCircuitBuilder<F>
impl<F: ScalarField> BaseCircuitBuilder<F>
Sourcepub fn new(witness_gen_only: bool) -> Self
pub fn new(witness_gen_only: bool) -> Self
Creates a new BaseCircuitBuilder with all default managers.
witness_gen_only
:- If true, the builder only does witness asignments and does not store constraint information – this should only be used for the real prover.
- If false, the builder also imposes constraints (selectors, fixed columns, copy constraints). Primarily used for keygen and mock prover (but can also be used for real prover).
By default, no circuit configuration parameters have been set.
These should be set separately using use_params
, or use_k
, use_lookup_bits
, and calculate_params
.
Upon construction, there are no public instances (aka all witnesses are private).
The intended usage is that before calling synthesize
, witness generation can be done to populate
assigned instances, which are supplied as assigned_instances
to this struct.
The Circuit
implementation for this struct will then expose these instances and constrain
them using the Halo2 API.
Sourcepub fn from_stage(stage: CircuitBuilderStage) -> Self
pub fn from_stage(stage: CircuitBuilderStage) -> Self
Creates a new MultiPhaseCoreManager depending on the stage of circuit building. If the stage is CircuitBuilderStage::Prover, the MultiPhaseCoreManager is used for witness generation only.
Sourcepub fn prover(
config_params: BaseCircuitParams,
break_points: MultiPhaseThreadBreakPoints,
) -> Self
pub fn prover( config_params: BaseCircuitParams, break_points: MultiPhaseThreadBreakPoints, ) -> Self
Creates a new BaseCircuitBuilder with a pinned circuit configuration given by config_params
and break_points
.
Sourcepub fn set_copy_manager(&mut self, copy_manager: SharedCopyConstraintManager<F>)
pub fn set_copy_manager(&mut self, copy_manager: SharedCopyConstraintManager<F>)
Sets the copy manager to the given one in all shared references.
Sourcepub fn use_copy_manager(
self,
copy_manager: SharedCopyConstraintManager<F>,
) -> Self
pub fn use_copy_manager( self, copy_manager: SharedCopyConstraintManager<F>, ) -> Self
Returns self
with a given copy manager
Sourcepub fn deep_clone(&self) -> Self
pub fn deep_clone(&self) -> Self
Deep clone of self
, where the underlying object of shared references in SharedCopyConstraintManager and LookupAnyManager are cloned.
Sourcepub fn lookup_bits(&self) -> Option<usize>
pub fn lookup_bits(&self) -> Option<usize>
The log_2 size of the lookup table, if using.
Sourcepub fn set_lookup_bits(&mut self, lookup_bits: usize)
pub fn set_lookup_bits(&mut self, lookup_bits: usize)
Set lookup bits
Sourcepub fn use_lookup_bits(self, lookup_bits: usize) -> Self
pub fn use_lookup_bits(self, lookup_bits: usize) -> Self
Returns new with lookup bits
Sourcepub fn set_instance_columns(&mut self, num_instance_columns: usize)
pub fn set_instance_columns(&mut self, num_instance_columns: usize)
Set the number of instance columns. This resizes self.assigned_instances
.
Sourcepub fn use_instance_columns(self, num_instance_columns: usize) -> Self
pub fn use_instance_columns(self, num_instance_columns: usize) -> Self
Returns new with self.assigned_instances
resized to specified number of instance columns.
Sourcepub fn set_params(&mut self, params: BaseCircuitParams)
pub fn set_params(&mut self, params: BaseCircuitParams)
Set config params
Sourcepub fn use_params(self, params: BaseCircuitParams) -> Self
pub fn use_params(self, params: BaseCircuitParams) -> Self
Returns new with config params
Sourcepub fn break_points(&self) -> MultiPhaseThreadBreakPoints
pub fn break_points(&self) -> MultiPhaseThreadBreakPoints
The break points of the circuit.
Sourcepub fn set_break_points(&mut self, break_points: MultiPhaseThreadBreakPoints)
pub fn set_break_points(&mut self, break_points: MultiPhaseThreadBreakPoints)
Sets the break points of the circuit.
Sourcepub fn use_break_points(self, break_points: MultiPhaseThreadBreakPoints) -> Self
pub fn use_break_points(self, break_points: MultiPhaseThreadBreakPoints) -> Self
Returns new with break points
Sourcepub fn witness_gen_only(&self) -> bool
pub fn witness_gen_only(&self) -> bool
Returns if the circuit is only used for witness generation.
Sourcepub fn unknown(self, use_unknown: bool) -> Self
pub fn unknown(self, use_unknown: bool) -> Self
Creates a new MultiPhaseCoreManager with use_unknown
flag set.
use_unknown
: If true, during key generation witnessValue
s are replaced withValue::unknown()
for safety.
Sourcepub fn main(&mut self, phase: usize) -> &mut Context<F>
pub fn main(&mut self, phase: usize) -> &mut Context<F>
Returns a mutable reference to the Context of a gate thread. Spawns a new thread for the given phase, if none exists.
phase
: The challenge phase (as an index) of the gate thread.
Sourcepub fn pool(&mut self, phase: usize) -> &mut SinglePhaseCoreManager<F>
pub fn pool(&mut self, phase: usize) -> &mut SinglePhaseCoreManager<F>
Returns SinglePhaseCoreManager with the virtual region with all core threads in the given phase.
Sourcepub fn new_thread(&mut self, phase: usize) -> &mut Context<F>
pub fn new_thread(&mut self, phase: usize) -> &mut Context<F>
Spawns a new thread for a new given phase
. Returns a mutable reference to the Context of the new thread.
phase
: The phase (index) of the gate thread.
Sourcepub fn statistics(&self) -> RangeStatistics
pub fn statistics(&self) -> RangeStatistics
Returns some statistics about the virtual region.
Sourcepub fn calculate_params(
&mut self,
minimum_rows: Option<usize>,
) -> BaseCircuitParams
pub fn calculate_params( &mut self, minimum_rows: Option<usize>, ) -> BaseCircuitParams
Auto-calculates configuration parameters for the circuit and sets them.
k
: The number of in the circuit (i.e. numeber of rows = 2k)minimum_rows
: The minimum number of rows in the circuit that cannot be used for witness assignments and contain randomblinding factors
to ensure zk property, defaults to 0.lookup_bits
: The fixed lookup table will consist of [0, 2lookup_bits)
Sourcepub fn assign_instances(
&self,
instance_columns: &[Column<Instance>],
layouter: impl Layouter<F>,
)
pub fn assign_instances( &self, instance_columns: &[Column<Instance>], layouter: impl Layouter<F>, )
Copies assigned_instances
to the instance columns. Should only be called at the very end of
synthesize
after virtual assigned_instances
have been assigned to physical circuit.
Sourcepub fn range_chip(&self) -> RangeChip<F>
pub fn range_chip(&self) -> RangeChip<F>
Creates a new RangeChip sharing the same LookupAnyManagers as self
.
Sourcepub fn assign_lookups_in_phase(
&self,
config: &RangeConfig<F>,
region: &mut Region<'_, F>,
phase: usize,
)
pub fn assign_lookups_in_phase( &self, config: &RangeConfig<F>, region: &mut Region<'_, F>, phase: usize, )
Copies the queued cells to be range looked up in phase phase
to special advice lookup columns
using LookupAnyManager.
§Special case
Just for RangeConfig, we have special handling for the case where there is a single (physical)
advice column in super::FlexGateConfig. In this case, RangeConfig
does not create extra lookup advice columns,
the single advice column has lookup enabled, and there is a selector to toggle when lookup should
be turned on.
Trait Implementations§
Source§impl<F: ScalarField> AsMut<BaseCircuitBuilder<F>> for BaseCircuitBuilder<F>
impl<F: ScalarField> AsMut<BaseCircuitBuilder<F>> for BaseCircuitBuilder<F>
Source§fn as_mut(&mut self) -> &mut BaseCircuitBuilder<F>
fn as_mut(&mut self) -> &mut BaseCircuitBuilder<F>
Source§impl<F: ScalarField> AsRef<BaseCircuitBuilder<F>> for BaseCircuitBuilder<F>
impl<F: ScalarField> AsRef<BaseCircuitBuilder<F>> for BaseCircuitBuilder<F>
Source§fn as_ref(&self) -> &BaseCircuitBuilder<F>
fn as_ref(&self) -> &BaseCircuitBuilder<F>
Source§impl<F: ScalarField> Circuit<F> for BaseCircuitBuilder<F>
impl<F: ScalarField> Circuit<F> for BaseCircuitBuilder<F>
Source§fn without_witnesses(&self) -> Self
fn without_witnesses(&self) -> Self
Creates a new instance of the BaseCircuitBuilder without witnesses by setting the witness_gen_only flag to false
Source§fn configure_with_params(
meta: &mut ConstraintSystem<F>,
params: Self::Params,
) -> Self::Config
fn configure_with_params( meta: &mut ConstraintSystem<F>, params: Self::Params, ) -> Self::Config
Configures a new circuit using BaseCircuitParams
Source§fn synthesize(
&self,
config: Self::Config,
layouter: impl Layouter<F>,
) -> Result<(), Error>
fn synthesize( &self, config: Self::Config, layouter: impl Layouter<F>, ) -> Result<(), Error>
Performs the actual computation on the circuit (e.g., witness generation), populating the lookup table and filling in all the advice values for a particular proof.
Source§type Config = BaseConfig<F>
type Config = BaseConfig<F>
Source§type FloorPlanner = SimpleFloorPlanner
type FloorPlanner = SimpleFloorPlanner
Circuit
trait because its behaviour is circuit-critical.Source§type Params = BaseCircuitParams
type Params = BaseCircuitParams
circuit-params
feature.Source§fn params(&self) -> Self::Params
fn params(&self) -> Self::Params
circuit-params
feature.Source§fn configure(_: &mut ConstraintSystem<F>) -> Self::Config
fn configure(_: &mut ConstraintSystem<F>) -> Self::Config
Source§impl<F: Clone + ScalarField> Clone for BaseCircuitBuilder<F>
impl<F: Clone + ScalarField> Clone for BaseCircuitBuilder<F>
Source§fn clone(&self) -> BaseCircuitBuilder<F>
fn clone(&self) -> BaseCircuitBuilder<F>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<F: Debug + ScalarField> Debug for BaseCircuitBuilder<F>
impl<F: Debug + ScalarField> Debug for BaseCircuitBuilder<F>
Source§impl<F: ScalarField> Default for BaseCircuitBuilder<F>
impl<F: ScalarField> Default for BaseCircuitBuilder<F>
Source§fn default() -> Self
fn default() -> Self
Quick start default circuit builder which can be used for MockProver, Keygen, and real prover. For best performance during real proof generation, we recommend using BaseCircuitBuilder::prover instead.
Auto Trait Implementations§
impl<F> Freeze for BaseCircuitBuilder<F>
impl<F> !RefUnwindSafe for BaseCircuitBuilder<F>
impl<F> Send for BaseCircuitBuilder<F>
impl<F> !Sync for BaseCircuitBuilder<F>
impl<F> Unpin for BaseCircuitBuilder<F>where
F: Unpin,
impl<F> UnwindSafe for BaseCircuitBuilder<F>where
F: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.