Skip to content

Commit bcd5b31

Browse files
Merge branch 'main' into mod-builtin-fix
2 parents a913599 + 14ec3e3 commit bcd5b31

File tree

12 files changed

+111
-65
lines changed

12 files changed

+111
-65
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ The cairo-vm-cli supports the following optional arguments:
182182

183183
- `run_from_cairo_pie`: Runs a Cairo PIE instead of a compiled json file. The name of the file will be the first argument received by the CLI (as if it were to run a normal compiled program). Can only be used if proof_mode is not enabled.
184184

185+
- `cairo_layout_params_file`: Only used with dynamic layout. Receives the name of a json file with the dynamic layout parameters.
186+
185187
For example, to obtain the air public inputs from a fibonacci program run, we can run :
186188

187189
```bash

cairo-vm-cli/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
181181
proof_mode: args.proof_mode,
182182
secure_run: args.secure_run,
183183
allow_missing_builtins: args.allow_missing_builtins,
184-
cairo_layout_params,
184+
dynamic_layout_params: cairo_layout_params,
185185
..Default::default()
186186
};
187187

@@ -423,7 +423,7 @@ mod tests {
423423
args.extend_from_slice(&["--layout".to_string(), "dynamic".to_string()]);
424424
args.extend_from_slice(&[
425425
"--cairo_layout_params_file".to_string(),
426-
"../cairo_layout_params_file.json".to_string(),
426+
"../vm/src/tests/cairo_layout_params_file.json".to_string(),
427427
]);
428428
args.push("../cairo_programs/proof_programs/fibonacci.json".to_string());
429429

cairo1-run/src/cairo_run.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ pub struct Cairo1RunConfig<'a> {
8686
pub relocate_mem: bool,
8787
/// Cairo layout chosen for the run
8888
pub layout: LayoutName,
89-
pub cairo_layout_params: Option<CairoLayoutParams>,
89+
pub dynamic_layout_params: Option<CairoLayoutParams>,
9090
/// Run in proof_mode
9191
pub proof_mode: bool,
9292
/// Should be true if either air_public_input or cairo_pie_output are needed
@@ -107,7 +107,7 @@ impl Default for Cairo1RunConfig<'_> {
107107
proof_mode: false,
108108
finalize_builtins: false,
109109
append_return_values: false,
110-
cairo_layout_params: None,
110+
dynamic_layout_params: None,
111111
}
112112
}
113113
}
@@ -250,7 +250,7 @@ pub fn cairo_run_program(
250250
let mut runner = CairoRunner::new_v2(
251251
&program,
252252
cairo_run_config.layout,
253-
cairo_run_config.cairo_layout_params.clone(),
253+
cairo_run_config.dynamic_layout_params.clone(),
254254
runner_mode,
255255
cairo_run_config.trace_enabled,
256256
)?;

cairo1-run/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ fn run(args: impl Iterator<Item = String>) -> Result<Option<String>, Error> {
173173
args: &args.args.0,
174174
finalize_builtins: args.air_public_input.is_some() || args.cairo_pie_output.is_some(),
175175
append_return_values: args.append_return_values,
176-
cairo_layout_params,
176+
dynamic_layout_params: cairo_layout_params,
177177
};
178178

179179
// Try to parse the file as a sierra program
@@ -496,7 +496,7 @@ mod tests {
496496
args.extend_from_slice(&["--layout".to_string(), "dynamic".to_string()]);
497497
args.extend_from_slice(&[
498498
"--cairo_layout_params_file".to_string(),
499-
"../cairo_layout_params_file.json".to_string(),
499+
"../vm/src/tests/cairo_layout_params_file.json".to_string(),
500500
]);
501501
args.push("../cairo_programs/cairo-1-programs/fibonacci.cairo".to_string());
502502

vm/src/cairo_run.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ pub struct CairoRunConfig<'a> {
2929
pub trace_enabled: bool,
3030
pub relocate_mem: bool,
3131
pub layout: LayoutName,
32-
pub cairo_layout_params: Option<CairoLayoutParams>,
32+
/// The `dynamic_layout_params` argument should only be used with dynamic layout.
33+
/// It is ignored otherwise.
34+
pub dynamic_layout_params: Option<CairoLayoutParams>,
3335
pub proof_mode: bool,
3436
pub secure_run: Option<bool>,
3537
pub disable_trace_padding: bool,
@@ -47,7 +49,7 @@ impl<'a> Default for CairoRunConfig<'a> {
4749
secure_run: None,
4850
disable_trace_padding: false,
4951
allow_missing_builtins: None,
50-
cairo_layout_params: None,
52+
dynamic_layout_params: None,
5153
}
5254
}
5355
}
@@ -70,7 +72,7 @@ pub fn cairo_run_program_with_initial_scope(
7072
let mut cairo_runner = CairoRunner::new(
7173
program,
7274
cairo_run_config.layout,
73-
cairo_run_config.cairo_layout_params.clone(),
75+
cairo_run_config.dynamic_layout_params.clone(),
7476
cairo_run_config.proof_mode,
7577
cairo_run_config.trace_enabled,
7678
)?;
@@ -157,7 +159,7 @@ pub fn cairo_run_pie(
157159
let mut cairo_runner = CairoRunner::new(
158160
&program,
159161
cairo_run_config.layout,
160-
cairo_run_config.cairo_layout_params.clone(),
162+
cairo_run_config.dynamic_layout_params.clone(),
161163
false,
162164
cairo_run_config.trace_enabled,
163165
)?;
@@ -230,7 +232,7 @@ pub fn cairo_run_fuzzed_program(
230232
let mut cairo_runner = CairoRunner::new(
231233
&program,
232234
cairo_run_config.layout,
233-
cairo_run_config.cairo_layout_params.clone(),
235+
cairo_run_config.dynamic_layout_params.clone(),
234236
cairo_run_config.proof_mode,
235237
cairo_run_config.trace_enabled,
236238
)?;
File renamed without changes.

vm/src/tests/cairo_run_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,7 @@ fn run_program_with_custom_mod_builtin_params(
11821182
let mut cairo_runner = CairoRunner::new(
11831183
&program,
11841184
cairo_run_config.layout,
1185-
cairo_run_config.cairo_layout_params,
1185+
cairo_run_config.dynamic_layout_params,
11861186
cairo_run_config.proof_mode,
11871187
cairo_run_config.trace_enabled,
11881188
)

vm/src/tests/compare_outputs_dynamic_layouts.sh

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,17 @@ EOF
7171
# Build cases to execute
7272
CASES=(
7373
"cairo_programs/proof_programs/factorial.json;all_cairo"
74-
"cairo_programs/proof_programs/fibonacci.json;all_cairo"
7574
"cairo_programs/proof_programs/factorial.json;double_all_cairo"
75+
"cairo_programs/proof_programs/fibonacci.json;all_cairo"
7676
"cairo_programs/proof_programs/fibonacci.json;double_all_cairo"
77+
"cairo_programs/proof_programs/bigint.json;all_cairo"
78+
"cairo_programs/proof_programs/bigint.json;double_all_cairo"
79+
"cairo_programs/proof_programs/dict.json;all_cairo"
80+
"cairo_programs/proof_programs/dict.json;double_all_cairo"
81+
"cairo_programs/proof_programs/sha256.json;all_cairo"
82+
"cairo_programs/proof_programs/sha256.json;double_all_cairo"
83+
"cairo_programs/proof_programs/keccak.json;all_cairo"
84+
"cairo_programs/proof_programs/keccak.json;double_all_cairo"
7785
"cairo_programs/mod_builtin_feature/proof/mod_builtin.json;all_cairo"
7886
"cairo_programs/mod_builtin_feature/proof/mod_builtin_failure.json;all_cairo"
7987
"cairo_programs/mod_builtin_feature/proof/apply_poly.json;all_cairo"
@@ -91,7 +99,7 @@ for case in "${CASES[@]}"; do
9199

92100
# Run cairo-vm
93101
echo "Running cairo-vm with case: $case"
94-
cargo run -p cairo-vm-cli --release -- "$full_program" \
102+
cargo run -p cairo-vm-cli --features mod_builtin --release -- "$full_program" \
95103
--layout "dynamic" --cairo_layout_params_file "$full_layout" --proof_mode \
96104
--trace_file program_rs.trace --memory_file program_rs.memory --air_public_input program_rs.air_public_input --air_private_input program_rs.air_private_input
97105

vm/src/types/instance_definitions/builtins_instance_def.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,16 +219,22 @@ impl BuiltinsInstanceDef {
219219
let range_check96 = Some(RangeCheckInstanceDef {
220220
ratio: Some(params.range_check96_ratio),
221221
});
222+
#[cfg(feature = "mod_builtin")]
222223
let add_mod = Some(ModInstanceDef {
223224
ratio: Some(params.add_mod_ratio),
224225
word_bit_len: 96,
225226
batch_size: 1,
226227
});
228+
#[cfg(feature = "mod_builtin")]
227229
let mul_mod = Some(ModInstanceDef {
228230
ratio: Some(params.mul_mod_ratio),
229231
word_bit_len: 96,
230232
batch_size: 1,
231233
});
234+
#[cfg(not(feature = "mod_builtin"))]
235+
let add_mod = None;
236+
#[cfg(not(feature = "mod_builtin"))]
237+
let mul_mod = None;
232238

233239
BuiltinsInstanceDef {
234240
output: true,

vm/src/types/layout.rs

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
use crate::types::layout_name::LayoutName;
2-
3-
use super::instance_definitions::{
4-
builtins_instance_def::BuiltinsInstanceDef, diluted_pool_instance_def::DilutedPoolInstanceDef,
1+
use crate::{types::layout_name::LayoutName, vm::errors::runner_errors::RunnerError};
2+
3+
use super::{
4+
builtin_name::BuiltinName,
5+
instance_definitions::{
6+
builtins_instance_def::BuiltinsInstanceDef,
7+
diluted_pool_instance_def::DilutedPoolInstanceDef,
8+
},
59
};
610

711
pub(crate) const MEMORY_UNITS_PER_STEP: u32 = 8;
@@ -214,38 +218,58 @@ pub struct RawCairoLayoutParams {
214218
}
215219

216220
impl TryFrom<RawCairoLayoutParams> for CairoLayoutParams {
217-
type Error = &'static str;
221+
type Error = RunnerError;
218222

219223
fn try_from(value: RawCairoLayoutParams) -> Result<Self, Self::Error> {
220224
if !value.uses_pedersen_builtin && value.pedersen_ratio != 0 {
221-
return Err("pedersen ratio should be 0 when disabled");
225+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
226+
BuiltinName::pedersen,
227+
));
222228
}
223229
if !value.uses_range_check_builtin && value.range_check_ratio != 0 {
224-
return Err("range_check ratio should be 0 when disabled");
230+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
231+
BuiltinName::range_check,
232+
));
225233
}
226234
if !value.uses_ecdsa_builtin && value.ecdsa_ratio != 0 {
227-
return Err("ecdsa ratio should be 0 when disabled");
235+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
236+
BuiltinName::ecdsa,
237+
));
228238
}
229239
if !value.uses_bitwise_builtin && value.bitwise_ratio != 0 {
230-
return Err("bitwise ratio should be 0 when disabled");
240+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
241+
BuiltinName::bitwise,
242+
));
231243
}
232244
if !value.uses_ec_op_builtin && value.ec_op_ratio != 0 {
233-
return Err("ec_op ratio should be 0 when disabled");
245+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
246+
BuiltinName::ec_op,
247+
));
234248
}
235249
if !value.uses_keccak_builtin && value.keccak_ratio != 0 {
236-
return Err("keccak ratio should be 0 when disabled");
250+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
251+
BuiltinName::keccak,
252+
));
237253
}
238254
if !value.uses_poseidon_builtin && value.poseidon_ratio != 0 {
239-
return Err("poseidon ratio should be 0 when disabled");
255+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
256+
BuiltinName::poseidon,
257+
));
240258
}
241259
if !value.uses_range_check96_builtin && value.range_check96_ratio != 0 {
242-
return Err("range_check96 ratio should be 0 when disabled");
260+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
261+
BuiltinName::range_check96,
262+
));
243263
}
244264
if !value.uses_add_mod_builtin && value.add_mod_ratio != 0 {
245-
return Err("add_mod ratio should be 0 when disabled");
265+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
266+
BuiltinName::add_mod,
267+
));
246268
}
247269
if !value.uses_mul_mod_builtin && value.mul_mod_ratio != 0 {
248-
return Err("mul_mod ratio should be 0 when disabled");
270+
return Err(RunnerError::BadDynamicLayoutBuiltinRatio(
271+
BuiltinName::mul_mod,
272+
));
249273
}
250274

251275
Ok(CairoLayoutParams {
@@ -290,16 +314,16 @@ where
290314

291315
#[cfg(test)]
292316
mod tests {
317+
use super::*;
318+
#[cfg(feature = "mod_builtin")]
319+
use crate::types::instance_definitions::mod_instance_def::ModInstanceDef;
293320
use crate::types::instance_definitions::{
294321
bitwise_instance_def::BitwiseInstanceDef, ec_op_instance_def::EcOpInstanceDef,
295322
ecdsa_instance_def::EcdsaInstanceDef, keccak_instance_def::KeccakInstanceDef,
296-
mod_instance_def::ModInstanceDef, pedersen_instance_def::PedersenInstanceDef,
297-
poseidon_instance_def::PoseidonInstanceDef,
323+
pedersen_instance_def::PedersenInstanceDef, poseidon_instance_def::PoseidonInstanceDef,
298324
range_check_instance_def::RangeCheckInstanceDef,
299325
};
300326

301-
use super::*;
302-
303327
#[cfg(target_arch = "wasm32")]
304328
use wasm_bindgen_test::*;
305329

@@ -490,22 +514,30 @@ mod tests {
490514
layout.builtins.range_check96,
491515
Some(RangeCheckInstanceDef { ratio: Some(0) })
492516
);
493-
assert_eq!(
494-
layout.builtins.mul_mod,
495-
Some(ModInstanceDef {
496-
ratio: Some(32),
497-
word_bit_len: 96, // hardcoded
498-
batch_size: 1 // hardcoded
499-
})
500-
);
501-
assert_eq!(
502-
layout.builtins.add_mod,
503-
Some(ModInstanceDef {
504-
ratio: Some(0),
505-
word_bit_len: 96, // hardcoded
506-
batch_size: 1 // hardcoded
507-
})
508-
);
517+
#[cfg(feature = "mod_builtin")]
518+
{
519+
assert_eq!(
520+
layout.builtins.mul_mod,
521+
Some(ModInstanceDef {
522+
ratio: Some(32),
523+
word_bit_len: 96, // hardcoded
524+
batch_size: 1 // hardcoded
525+
}),
526+
);
527+
assert_eq!(
528+
layout.builtins.add_mod,
529+
Some(ModInstanceDef {
530+
ratio: Some(0),
531+
word_bit_len: 96, // hardcoded
532+
batch_size: 1 // hardcoded
533+
})
534+
);
535+
}
536+
#[cfg(not(feature = "mod_builtin"))]
537+
{
538+
assert_eq!(layout.builtins.mul_mod, None,);
539+
assert_eq!(layout.builtins.add_mod, None,);
540+
}
509541
}
510542

511543
#[test]

0 commit comments

Comments
 (0)