Skip to content

Commit a35aa57

Browse files
chore: use explicit Result<_, ExecutionError> and pre_compute* returns StaticProgramError (#1898)
Remove `arch::execution::Result = Result<_, ExecutionError>` because our `use execution::*` makes it a confusing `arch::Result` typedef. Moreover all `pre_compute` functions should return `StaticProgramError` to distinguish from `ExecutionError` which is for runtime errors.
1 parent 41c2b4b commit a35aa57

File tree

44 files changed

+246
-456
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+246
-456
lines changed

crates/circuits/mod-builder/src/core_chip.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,7 @@ use itertools::Itertools;
88
use num_bigint::BigUint;
99
use num_traits::Zero;
1010
use openvm_circuit::{
11-
arch::{
12-
get_record_from_slice, AdapterAirContext, AdapterCoreLayout, AdapterCoreMetadata,
13-
AdapterTraceFiller, AdapterTraceStep, CustomBorrow, DynAdapterInterface, DynArray,
14-
InstructionExecutor, MinimalInstruction, RecordArena, Result, SizedRecord, TraceFiller,
15-
VmAdapterInterface, VmCoreAir, VmStateMut,
16-
},
11+
arch::*,
1712
system::memory::{online::TracingMemory, MemoryAuxColsFactory},
1813
};
1914
use openvm_circuit_primitives::{
@@ -395,7 +390,7 @@ where
395390
&mut self,
396391
state: VmStateMut<F, TracingMemory, RA>,
397392
instruction: &Instruction<F>,
398-
) -> Result<()> {
393+
) -> Result<(), ExecutionError> {
399394
let (mut adapter_record, mut core_record) = state.ctx.alloc(self.get_record_layout());
400395

401396
A::start(*state.pc, state.memory, &mut adapter_record);

crates/vm/derive/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pub fn instruction_executor_derive(input: TokenStream) -> TokenStream {
5757
&mut self,
5858
state: ::openvm_circuit::arch::VmStateMut<#field_ty_generic, ::openvm_circuit::system::memory::online::TracingMemory, RA>,
5959
instruction: &::openvm_circuit::arch::instructions::instruction::Instruction<#field_ty_generic>,
60-
) -> ::openvm_circuit::arch::Result<()> {
60+
) -> Result<(), ::openvm_circuit::arch::ExecutionError> {
6161
self.0.execute(state, instruction)
6262
}
6363

@@ -109,7 +109,7 @@ pub fn instruction_executor_derive(input: TokenStream) -> TokenStream {
109109
&mut self,
110110
state: ::openvm_circuit::arch::VmStateMut<#field_ty_generic, ::openvm_circuit::system::memory::online::TracingMemory, RA>,
111111
instruction: &::openvm_circuit::arch::instructions::instruction::Instruction<#field_ty_generic>,
112-
) -> ::openvm_circuit::arch::Result<()> {
112+
) -> Result<(), ::openvm_circuit::arch::ExecutionError> {
113113
match self {
114114
#(#execute_arms,)*
115115
}
@@ -167,7 +167,7 @@ pub fn ins_executor_e1_derive(input: TokenStream) -> TokenStream {
167167
pc: u32,
168168
inst: &::openvm_circuit::arch::instructions::instruction::Instruction<F>,
169169
data: &mut [u8],
170-
) -> ::openvm_circuit::arch::execution::Result<::openvm_circuit::arch::ExecuteFunc<F, Ctx>>
170+
) -> Result<::openvm_circuit::arch::ExecuteFunc<F, Ctx>, ::openvm_circuit::arch::StaticProgramError>
171171
where
172172
Ctx: ::openvm_circuit::arch::execution_mode::E1ExecutionCtx, {
173173
self.0.pre_compute_e1(pc, inst, data)
@@ -240,7 +240,7 @@ pub fn ins_executor_e1_derive(input: TokenStream) -> TokenStream {
240240
pc: u32,
241241
instruction: &::openvm_circuit::arch::instructions::instruction::Instruction<F>,
242242
data: &mut [u8],
243-
) -> ::openvm_circuit::arch::execution::Result<::openvm_circuit::arch::ExecuteFunc<F, Ctx>>
243+
) -> Result<::openvm_circuit::arch::ExecuteFunc<F, Ctx>, ::openvm_circuit::arch::StaticProgramError>
244244
where
245245
Ctx: ::openvm_circuit::arch::execution_mode::E1ExecutionCtx, {
246246
match self {
@@ -295,7 +295,7 @@ pub fn ins_executor_e2_derive(input: TokenStream) -> TokenStream {
295295
pc: u32,
296296
inst: &::openvm_circuit::arch::instructions::instruction::Instruction<F>,
297297
data: &mut [u8],
298-
) -> ::openvm_circuit::arch::execution::Result<::openvm_circuit::arch::ExecuteFunc<F, Ctx>>
298+
) -> Result<::openvm_circuit::arch::ExecuteFunc<F, Ctx>, ::openvm_circuit::arch::StaticProgramError>
299299
where
300300
Ctx: ::openvm_circuit::arch::execution_mode::E2ExecutionCtx, {
301301
self.0.pre_compute_e2(chip_idx, pc, inst, data)
@@ -369,7 +369,7 @@ pub fn ins_executor_e2_derive(input: TokenStream) -> TokenStream {
369369
pc: u32,
370370
instruction: &::openvm_circuit::arch::instructions::instruction::Instruction<F>,
371371
data: &mut [u8],
372-
) -> ::openvm_circuit::arch::execution::Result<::openvm_circuit::arch::ExecuteFunc<F, Ctx>>
372+
) -> Result<::openvm_circuit::arch::ExecuteFunc<F, Ctx>, ::openvm_circuit::arch::StaticProgramError>
373373
where
374374
Ctx: ::openvm_circuit::arch::execution_mode::E2ExecutionCtx, {
375375
match self {

crates/vm/src/arch/execution.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,10 @@ use crate::{
1818
arch::{execution_mode::E2ExecutionCtx, ExecutorInventoryError, MatrixRecordArena},
1919
system::{
2020
memory::online::{GuestMemory, TracingMemory},
21-
program::{ProgramBus, StaticProgramError},
21+
program::ProgramBus,
2222
},
2323
};
2424

25-
pub type Result<T> = std::result::Result<T, ExecutionError>;
26-
2725
#[derive(Error, Debug)]
2826
pub enum ExecutionError {
2927
#[error("execution failed at pc {pc}")]
@@ -72,9 +70,17 @@ pub enum ExecutionError {
7270
Inventory(#[from] ExecutorInventoryError),
7371
#[error("static program error: {0}")]
7472
Static(#[from] StaticProgramError),
75-
// TODO[jpw]: this should be in StaticProgramError
73+
}
74+
75+
/// Errors in the program that can be statically analyzed before runtime.
76+
#[derive(Error, Debug)]
77+
pub enum StaticProgramError {
7678
#[error("invalid instruction at pc {0}")]
7779
InvalidInstruction(u32),
80+
#[error("Too many executors")]
81+
TooManyExecutors,
82+
#[error("Executor not found for opcode {opcode}")]
83+
ExecutorNotFound { opcode: VmOpcode },
7884
}
7985

8086
/// Global VM state accessible during instruction execution.
@@ -99,7 +105,7 @@ pub trait InstructionExecutor<F, RA = MatrixRecordArena<F>>: Clone {
99105
&mut self,
100106
state: VmStateMut<F, TracingMemory, RA>,
101107
instruction: &Instruction<F>,
102-
) -> Result<()>;
108+
) -> Result<(), ExecutionError>;
103109

104110
/// For display purposes. From absolute opcode as `usize`, return the string name of the opcode
105111
/// if it is a supported opcode by the present executor.
@@ -129,7 +135,7 @@ pub trait InsExecutorE1<F> {
129135
pc: u32,
130136
inst: &Instruction<F>,
131137
data: &mut [u8],
132-
) -> Result<ExecuteFunc<F, Ctx>>
138+
) -> Result<ExecuteFunc<F, Ctx>, StaticProgramError>
133139
where
134140
Ctx: E1ExecutionCtx;
135141
}
@@ -143,7 +149,7 @@ pub trait InsExecutorE2<F> {
143149
pc: u32,
144150
inst: &Instruction<F>,
145151
data: &mut [u8],
146-
) -> Result<ExecuteFunc<F, Ctx>>
152+
) -> Result<ExecuteFunc<F, Ctx>, StaticProgramError>
147153
where
148154
Ctx: E2ExecutionCtx;
149155
}

crates/vm/src/arch/interpreter.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ use crate::{
2121
create_memory_image,
2222
execution_mode::{E1ExecutionCtx, E2ExecutionCtx},
2323
ExecuteFunc, ExecutionError, ExecutorInventory, ExecutorInventoryError, ExitCode,
24-
InsExecutorE1, InsExecutorE2, PreComputeInstruction, Streams, SystemConfig,
25-
VmExecutionConfig, VmSegmentState,
24+
InsExecutorE1, InsExecutorE2, PreComputeInstruction, StaticProgramError, Streams,
25+
SystemConfig, VmExecutionConfig, VmSegmentState,
2626
},
2727
system::memory::online::GuestMemory,
2828
};
@@ -386,7 +386,8 @@ fn get_pre_compute_instructions<'a, F: PrimeField32, E: InsExecutorE1<F>, Ctx: E
386386
} else {
387387
PreComputeInstruction {
388388
handler: |_, vm_state| {
389-
vm_state.exit_code = Err(ExecutionError::InvalidInstruction(vm_state.pc));
389+
vm_state.exit_code =
390+
Err(StaticProgramError::InvalidInstruction(vm_state.pc).into());
390391
},
391392
pre_compute: buf,
392393
}
@@ -442,7 +443,8 @@ fn get_e2_pre_compute_instructions<
442443
} else {
443444
PreComputeInstruction {
444445
handler: |_, vm_state| {
445-
vm_state.exit_code = Err(ExecutionError::InvalidInstruction(vm_state.pc));
446+
vm_state.exit_code =
447+
Err(StaticProgramError::InvalidInstruction(vm_state.pc).into());
446448
},
447449
pre_compute: buf,
448450
}

crates/vm/src/arch/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ mod config;
22
/// Instruction execution traits and types.
33
/// Execution bus and interface.
44
pub mod execution;
5+
/// Execution context types for different execution modes.
56
pub mod execution_mode;
67
/// Traits and builders to compose collections of chips into a virtual machine.
78
mod extensions;
@@ -27,6 +28,7 @@ pub mod testing;
2728

2829
pub use config::*;
2930
pub use execution::*;
31+
pub use execution_mode::{E1ExecutionCtx, E2ExecutionCtx};
3032
pub use extensions::*;
3133
pub use integration_api::*;
3234
pub use openvm_instructions as instructions;

crates/vm/src/system/phantom/execution.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
arch::{
1212
execution_mode::{E1ExecutionCtx, E2ExecutionCtx},
1313
E2PreCompute, ExecuteFunc, ExecutionError, InsExecutorE1, InsExecutorE2,
14-
PhantomSubExecutor, Streams, VmSegmentState,
14+
PhantomSubExecutor, StaticProgramError, Streams, VmSegmentState,
1515
},
1616
system::{memory::online::GuestMemory, phantom::PhantomExecutor},
1717
};
@@ -45,7 +45,7 @@ where
4545
_pc: u32,
4646
inst: &Instruction<F>,
4747
data: &mut [u8],
48-
) -> Result<ExecuteFunc<F, Ctx>, ExecutionError>
48+
) -> Result<ExecuteFunc<F, Ctx>, StaticProgramError>
4949
where
5050
Ctx: E1ExecutionCtx,
5151
{
@@ -177,7 +177,7 @@ where
177177
_pc: u32,
178178
inst: &Instruction<F>,
179179
data: &mut [u8],
180-
) -> Result<ExecuteFunc<F, Ctx>, ExecutionError>
180+
) -> Result<ExecuteFunc<F, Ctx>, StaticProgramError>
181181
where
182182
Ctx: E2ExecutionCtx,
183183
{

crates/vm/src/system/program/mod.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
use openvm_instructions::{
22
instruction::Instruction,
33
program::{Program, DEFAULT_PC_STEP},
4-
LocalOpcode, SystemOpcode, VmOpcode,
4+
LocalOpcode, SystemOpcode,
55
};
66
use openvm_stark_backend::{
77
config::StarkGenericConfig,
88
p3_field::Field,
99
p3_maybe_rayon::prelude::*,
1010
prover::{cpu::CpuBackend, types::CommittedTraceData},
1111
};
12-
use thiserror::Error;
1312

14-
use crate::arch::{ExecutionError, ExecutorId, ExecutorInventory};
13+
use crate::arch::{ExecutionError, ExecutorId, ExecutorInventory, StaticProgramError};
1514

1615
#[cfg(test)]
1716
pub mod tests;
@@ -159,15 +158,6 @@ impl<F: Field, E> ProgramHandler<F, E> {
159158
}
160159
}
161160

162-
/// Errors in the program that can be statically analyzed before runtime.
163-
#[derive(Error, Debug)]
164-
pub enum StaticProgramError {
165-
#[error("Too many executors")]
166-
TooManyExecutors,
167-
#[error("Executor not found for opcode {opcode}")]
168-
ExecutorNotFound { opcode: VmOpcode },
169-
}
170-
171161
// For CPU backend only
172162
pub struct ProgramChip<SC: StarkGenericConfig> {
173163
/// `i` -> frequency of instruction in `i`th row of trace matrix. This requires filtering

crates/vm/src/system/public_values/core.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::{
2525
get_record_from_slice, AdapterAirContext, AdapterTraceFiller, AdapterTraceStep,
2626
BasicAdapterInterface, E2PreCompute, EmptyAdapterCoreLayout, ExecuteFunc, ExecutionError,
2727
InsExecutorE1, InsExecutorE2, InstructionExecutor, MinimalInstruction, RecordArena,
28-
TraceFiller, VmCoreAir, VmSegmentState, VmStateMut,
28+
StaticProgramError, TraceFiller, VmCoreAir, VmSegmentState, VmStateMut,
2929
},
3030
system::{
3131
memory::{
@@ -267,7 +267,7 @@ where
267267
_pc: u32,
268268
inst: &Instruction<F>,
269269
data: &mut [u8],
270-
) -> Result<ExecuteFunc<F, Ctx>, ExecutionError>
270+
) -> Result<ExecuteFunc<F, Ctx>, StaticProgramError>
271271
where
272272
Ctx: E1ExecutionCtx,
273273
{
@@ -298,7 +298,7 @@ where
298298
_pc: u32,
299299
inst: &Instruction<F>,
300300
data: &mut [u8],
301-
) -> Result<ExecuteFunc<F, Ctx>, ExecutionError>
301+
) -> Result<ExecuteFunc<F, Ctx>, StaticProgramError>
302302
where
303303
Ctx: E2ExecutionCtx,
304304
{

extensions/algebra/circuit/src/lib.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,16 @@ use derive_more::derive::{Deref, DerefMut};
77
use num_bigint::BigUint;
88
use openvm_algebra_transpiler::{Fp2Opcode, Rv32ModularArithmeticOpcode};
99
use openvm_circuit::{
10-
arch::{
11-
execution::ExecuteFunc,
12-
execution_mode::{E1ExecutionCtx, E2ExecutionCtx},
13-
instructions::riscv::{RV32_MEMORY_AS, RV32_REGISTER_AS},
14-
DynArray, E2PreCompute, ExecutionError, InsExecutorE1, InsExecutorE2, Result,
15-
VmSegmentState,
16-
},
10+
arch::*,
1711
system::memory::{online::GuestMemory, POINTER_MAX_BITS},
1812
};
1913
use openvm_circuit_derive::InstructionExecutor;
2014
use openvm_circuit_primitives::AlignedBytesBorrow;
21-
use openvm_instructions::{instruction::Instruction, program::DEFAULT_PC_STEP};
15+
use openvm_instructions::{
16+
instruction::Instruction,
17+
program::DEFAULT_PC_STEP,
18+
riscv::{RV32_MEMORY_AS, RV32_REGISTER_AS},
19+
};
2220
use openvm_mod_circuit_builder::{
2321
run_field_expression_precomputed, FieldExpr, FieldExpressionStep,
2422
};
@@ -117,7 +115,7 @@ impl<'a, const BLOCKS: usize, const BLOCK_SIZE: usize, const IS_FP2: bool>
117115
pc: u32,
118116
inst: &Instruction<F>,
119117
data: &mut FieldExpressionPreCompute<'a>,
120-
) -> Result<Option<Operation>> {
118+
) -> Result<Option<Operation>, StaticProgramError> {
121119
let Instruction {
122120
opcode,
123121
a,
@@ -134,7 +132,7 @@ impl<'a, const BLOCKS: usize, const BLOCK_SIZE: usize, const IS_FP2: bool>
134132
let d = d.as_canonical_u32();
135133
let e = e.as_canonical_u32();
136134
if d != RV32_REGISTER_AS || e != RV32_MEMORY_AS {
137-
return Err(ExecutionError::InvalidInstruction(pc));
135+
return Err(StaticProgramError::InvalidInstruction(pc));
138136
}
139137

140138
let local_opcode = opcode.local_opcode_idx(self.0.offset);
@@ -213,7 +211,7 @@ impl<F: PrimeField32, const BLOCKS: usize, const BLOCK_SIZE: usize, const IS_FP2
213211
pc: u32,
214212
inst: &Instruction<F>,
215213
data: &mut [u8],
216-
) -> Result<ExecuteFunc<F, Ctx>>
214+
) -> Result<ExecuteFunc<F, Ctx>, StaticProgramError>
217215
where
218216
Ctx: E1ExecutionCtx,
219217
{
@@ -310,7 +308,7 @@ impl<F: PrimeField32, const BLOCKS: usize, const BLOCK_SIZE: usize, const IS_FP2
310308
pc: u32,
311309
inst: &Instruction<F>,
312310
data: &mut [u8],
313-
) -> Result<ExecuteFunc<F, Ctx>>
311+
) -> Result<ExecuteFunc<F, Ctx>, StaticProgramError>
314312
where
315313
Ctx: E2ExecutionCtx,
316314
{

0 commit comments

Comments
 (0)