acvm::pwg

Struct ACVM

Source
pub struct ACVM<'a, F: AcirField, B: BlackBoxFunctionSolver<F>> {
Show 16 fields status: ACVMStatus<F>, backend: &'a B, block_solvers: HashMap<BlockId, MemoryOpSolver<F>>, opcodes: &'a [Opcode<F>], instruction_pointer: usize, witness_map: WitnessMap<F>, brillig_solver: Option<BrilligSolver<'a, F, B>>, acir_call_counter: usize, acir_call_results: Vec<Vec<F>>, unconstrained_functions: &'a [BrilligBytecode<F>], assertion_payloads: &'a [(OpcodeLocation, AssertionPayload<F>)], profiling_active: bool, profiling_samples: ProfilingSamples, brillig_fuzzing_active: bool, brillig_branch_to_feature_map: Option<&'a BranchToFeatureMap>, brillig_fuzzing_trace: Option<Vec<u32>>,
}

Fields§

§status: ACVMStatus<F>§backend: &'a B§block_solvers: HashMap<BlockId, MemoryOpSolver<F>>

Stores the solver for memory operations acting on blocks of memory disambiguated by block.

§opcodes: &'a [Opcode<F>]

A list of opcodes which are to be executed by the ACVM.

§instruction_pointer: usize

Index of the next opcode to be executed.

§witness_map: WitnessMap<F>

A mapping of witnesses to their solved values The map is updated as the ACVM executes.

§brillig_solver: Option<BrilligSolver<'a, F, B>>§acir_call_counter: usize

A counter maintained throughout an ACVM process that determines whether the caller has resolved the results of an ACIR call.

§acir_call_results: Vec<Vec<F>>

Represents the outputs of all ACIR calls during an ACVM process List is appended onto by the caller upon reaching a ACVMStatus::RequiresAcirCall

§unconstrained_functions: &'a [BrilligBytecode<F>]§assertion_payloads: &'a [(OpcodeLocation, AssertionPayload<F>)]§profiling_active: bool§profiling_samples: ProfilingSamples§brillig_fuzzing_active: bool§brillig_branch_to_feature_map: Option<&'a BranchToFeatureMap>§brillig_fuzzing_trace: Option<Vec<u32>>

Implementations§

Source§

impl<'a, F: AcirField, B: BlackBoxFunctionSolver<F>> ACVM<'a, F, B>

Source

pub fn new( backend: &'a B, opcodes: &'a [Opcode<F>], initial_witness: WitnessMap<F>, unconstrained_functions: &'a [BrilligBytecode<F>], assertion_payloads: &'a [(OpcodeLocation, AssertionPayload<F>)], ) -> Self

Source

pub fn with_profiler(&mut self, profiling_active: bool)

Source

pub fn with_brillig_fuzzing( &mut self, brillig_branch_to_feature_map: Option<&'a BranchToFeatureMap>, )

Source

pub fn get_brillig_fuzzing_trace(&self) -> Option<Vec<u32>>

Source

pub fn witness_map(&self) -> &WitnessMap<F>

Returns a reference to the current state of the ACVM’s WitnessMap.

Once execution has completed, the witness map can be extracted using ACVM::finalize

Source

pub fn overwrite_witness(&mut self, witness: Witness, value: F) -> Option<F>

Source

pub fn opcodes(&self) -> &[Opcode<F>]

Returns a slice containing the opcodes of the circuit being executed.

Source

pub fn instruction_pointer(&self) -> usize

Returns the index of the current opcode to be executed.

Source

pub fn take_profiling_samples(&mut self) -> ProfilingSamples

Source

pub fn finalize(self) -> WitnessMap<F>

Finalize the ACVM execution, returning the resulting WitnessMap.

Source

fn status(&mut self, status: ACVMStatus<F>) -> ACVMStatus<F>

Updates the current status of the VM. Returns the given status.

Source

pub fn get_status(&self) -> &ACVMStatus<F>

Source

fn fail(&mut self, error: OpcodeResolutionError<F>) -> ACVMStatus<F>

Sets the VM status to ACVMStatus::Failure using the provided error. Returns the new status.

Source

fn wait_for_foreign_call( &mut self, foreign_call: ForeignCallWaitInfo<F>, ) -> ACVMStatus<F>

Sets the status of the VM to RequiresForeignCall. Indicating that the VM is now waiting for a foreign call to be resolved.

Source

pub fn get_pending_foreign_call(&self) -> Option<&ForeignCallWaitInfo<F>>

Return a reference to the arguments for the next pending foreign call, if one exists.

Source

pub fn resolve_pending_foreign_call( &mut self, foreign_call_result: ForeignCallResult<F>, )

Resolves a foreign call’s result using a result calculated outside of the ACVM.

The ACVM can then be restarted to solve the remaining Brillig VM process as well as the remaining ACIR opcodes.

Source

fn wait_for_acir_call( &mut self, acir_call: AcirCallWaitInfo<F>, ) -> ACVMStatus<F>

Sets the status of the VM to RequiresAcirCall Indicating that the VM is now waiting for an ACIR call to be resolved

Source

pub fn resolve_pending_acir_call(&mut self, call_result: Vec<F>)

Resolves an ACIR call’s result (simply a list of fields) using a result calculated by a separate ACVM instance.

The current ACVM instance can then be restarted to solve the remaining ACIR opcodes.

Source

pub fn solve(&mut self) -> ACVMStatus<F>

Executes the ACVM’s circuit until execution halts.

Execution can halt due to three reasons:

  1. All opcodes have been executed successfully.
  2. The circuit has been found to be unsatisfiable.
  3. A Brillig foreign call has been encountered and must be resolved.
Source

fn current_opcode(&self) -> &'a Opcode<F>

Source

pub fn solve_opcode(&mut self) -> ACVMStatus<F>

Executes a single opcode using the dedicated solver.

Foreign or ACIR Calls are deferred to the caller, which will either instantiate a new ACVM to execute the called ACIR function or a custom implementation to execute the foreign call. Then it will resume execution of the current ACVM with the results of the call.

Source

fn handle_opcode_resolution( &mut self, resolution: Result<(), OpcodeResolutionError<F>>, ) -> ACVMStatus<F>

Returns the status of the ACVM If the status is an error, it converts the error into OpcodeResolutionError

Source

fn extract_assertion_payload( &self, location: OpcodeLocation, ) -> Option<ResolvedAssertionPayload<F>>

Source

fn solve_brillig_call_opcode( &mut self, id: &BrilligFunctionId, inputs: &'a [BrilligInputs<F>], outputs: &[BrilligOutputs], predicate: &Option<Expression<F>>, ) -> Result<Option<ForeignCallWaitInfo<F>>, OpcodeResolutionError<F>>

Solves a Brillig Call opcode, which represents a call to an unconstrained function. It first handles the predicate and returns zero values if the predicate is false. Then it executes (or resumes execution) the Brillig function using a Brillig VM.

Source

pub fn step_into_brillig(&mut self) -> StepResult<'a, F, B>

Source

pub fn finish_brillig_with_solver( &mut self, solver: BrilligSolver<'a, F, B>, ) -> ACVMStatus<F>

Source

pub fn solve_call_opcode( &mut self, id: &AcirFunctionId, inputs: &[Witness], outputs: &[Witness], predicate: &Option<Expression<F>>, ) -> Result<Option<AcirCallWaitInfo<F>>, OpcodeResolutionError<F>>

Defer execution of the ACIR call opcode to the caller, or finalize the execution.

  1. It first handles the predicate and return zero values if the predicate is false.
  2. If the results of the execution are not available, it issues a ‘AcirCallWaitInfo’ to notify the caller that it (the caller) needs to execute the ACIR function.
  3. If the results are available, it updates the witness map and indicates that the opcode is solved.

Auto Trait Implementations§

§

impl<'a, F, B> Freeze for ACVM<'a, F, B>
where F: Freeze,

§

impl<'a, F, B> RefUnwindSafe for ACVM<'a, F, B>

§

impl<'a, F, B> Send for ACVM<'a, F, B>
where B: Sync, F: Send + Sync,

§

impl<'a, F, B> Sync for ACVM<'a, F, B>
where B: Sync, F: Sync,

§

impl<'a, F, B> Unpin for ACVM<'a, F, B>
where F: Unpin,

§

impl<'a, F, B> UnwindSafe for ACVM<'a, F, B>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
§

impl<D> OwoColorize for D

§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either [OwoColorize::fg] or a color-specific method, such as [OwoColorize::green], Read more
§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either [OwoColorize::bg] or a color-specific method, such as [OwoColorize::on_yellow], Read more
§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more