Skip to content

Commit 1bd6a88

Browse files
v0.4.1: Reuse cairo-lang GasMetadata calculations #1183 (#1184)
* Add cairo-lang-sierra-to-casm dependency * Reuse cairo-lang metadata construction * Adapt users across the repository
1 parent 3b66b20 commit 1bd6a88

File tree

7 files changed

+60
-99
lines changed

7 files changed

+60
-99
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ cairo-lang-filesystem = "=2.11.2"
6969
cairo-lang-runner = "=2.11.2"
7070
cairo-lang-semantic = "=2.11.2"
7171
cairo-lang-sierra = "=2.11.2"
72+
cairo-lang-sierra-to-casm = "=2.11.2"
7273
cairo-lang-sierra-generator = "=2.11.2"
7374
educe = "0.5.11" # can't update until https://github.com/magiclen/educe/issues/27
7475
itertools = "0.14.0"

src/bin/cairo-native-run.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ use cairo_lang_compiler::{
33
compile_prepared_db, db::RootDatabase, project::setup_project, CompilerConfig,
44
};
55
use cairo_lang_runner::short_string::as_cairo_short_string;
6+
use cairo_lang_sierra_to_casm::metadata::MetadataComputationConfig;
67
use cairo_native::{
78
context::NativeContext,
89
executor::{AotNativeExecutor, JitNativeExecutor},
9-
metadata::gas::{GasMetadata, MetadataComputationConfig},
10+
metadata::gas::GasMetadata,
1011
starknet_stub::StubSyscallHandler,
1112
};
1213
use clap::{Parser, ValueEnum};

src/bin/utils/test.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::{find_function, format_for_panic, result_to_runresult, RunArgs, RunMo
22
use anyhow::Context;
33
use cairo_lang_runner::RunResultValue;
44
use cairo_lang_sierra::{extensions::gas::CostTokenType, ids::FunctionId, program::Program};
5+
use cairo_lang_sierra_to_casm::metadata::MetadataComputationConfig;
56
use cairo_lang_test_plugin::{
67
test_config::{PanicExpectation, TestExpectation},
78
TestConfig,
@@ -11,7 +12,7 @@ use cairo_lang_utils::{casts::IntoOrPanic, ordered_hash_map::OrderedHashMap};
1112
use cairo_native::{
1213
context::NativeContext,
1314
executor::{AotNativeExecutor, JitNativeExecutor},
14-
metadata::gas::{GasMetadata, MetadataComputationConfig},
15+
metadata::gas::GasMetadata,
1516
starknet_stub::StubSyscallHandler,
1617
};
1718
use colored::Colorize;
@@ -173,6 +174,8 @@ pub fn run_tests(
173174
function_set_costs,
174175
linear_ap_change_solver: true,
175176
linear_gas_solver: true,
177+
skip_non_linear_solver_comparisons: false,
178+
compute_runtime_costs: false,
176179
}),
177180
)
178181
.unwrap();

src/context.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
use crate::{
22
error::{panic::ToNativeAssertError, Error},
33
ffi::{get_data_layout_rep, get_target_triple},
4-
metadata::{
5-
gas::{GasMetadata, MetadataComputationConfig},
6-
runtime_bindings::RuntimeBindingsMeta,
7-
MetadataStorage,
8-
},
4+
metadata::{gas::GasMetadata, runtime_bindings::RuntimeBindingsMeta, MetadataStorage},
95
module::NativeModule,
106
native_assert,
117
utils::run_pass_manager,
@@ -15,6 +11,7 @@ use cairo_lang_sierra::{
1511
program::Program,
1612
program_registry::ProgramRegistry,
1713
};
14+
use cairo_lang_sierra_to_casm::metadata::MetadataComputationConfig;
1815
use llvm_sys::target::{
1916
LLVM_InitializeAllAsmPrinters, LLVM_InitializeAllTargetInfos, LLVM_InitializeAllTargetMCs,
2017
LLVM_InitializeAllTargets,

src/executor/contract.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use crate::{
3737
error::{panic::ToNativeAssertError, Error, Result},
3838
execution_result::{BuiltinStats, ContractExecutionResult},
3939
executor::{invoke_trampoline, BuiltinCostsGuard},
40-
metadata::{gas::MetadataComputationConfig, runtime_bindings::setup_runtime},
40+
metadata::runtime_bindings::setup_runtime,
4141
module::NativeModule,
4242
native_assert, native_panic,
4343
starknet::{handler::StarknetSyscallHandlerCallbacks, StarknetSyscallHandler},
@@ -60,6 +60,7 @@ use cairo_lang_sierra::{
6060
program::{GenFunction, Program, StatementIdx},
6161
program_registry::ProgramRegistry,
6262
};
63+
use cairo_lang_sierra_to_casm::metadata::MetadataComputationConfig;
6364
use cairo_lang_starknet_classes::contract_class::ContractEntryPoints;
6465
use cairo_lang_starknet_classes::{
6566
casm_contract_class::ENTRY_POINT_COST, compiler_version::VersionId,
@@ -206,6 +207,8 @@ impl AotContractExecutor {
206207
.collect(),
207208
linear_gas_solver: no_eq_solver,
208209
linear_ap_change_solver: no_eq_solver,
210+
skip_non_linear_solver_comparisons: false,
211+
compute_runtime_costs: false,
209212
}),
210213
)?;
211214

src/metadata/gas.rs

Lines changed: 46 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,20 @@ use cairo_lang_sierra::{
1616
ids::FunctionId,
1717
program::{Program, StatementIdx},
1818
};
19-
use cairo_lang_sierra_ap_change::{ap_change_info::ApChangeInfo, calc_ap_changes};
20-
use cairo_lang_sierra_ap_change::{
21-
compute::calc_ap_changes as linear_calc_ap_changes, ApChangeError,
19+
use cairo_lang_sierra_ap_change::{ap_change_info::ApChangeInfo, ApChangeError};
20+
use cairo_lang_sierra_gas::{gas_info::GasInfo, CostError};
21+
use cairo_lang_sierra_to_casm::metadata::{
22+
calc_metadata, calc_metadata_ap_change_only, Metadata as CairoGasMetadata,
23+
MetadataComputationConfig, MetadataError as CairoGasMetadataError,
2224
};
23-
use cairo_lang_sierra_gas::{
24-
compute_postcost_info, compute_precost_info, gas_info::GasInfo, CostError,
25-
};
26-
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
2725

2826
use crate::{error::Result as NativeResult, native_panic};
2927

30-
use std::collections::BTreeMap;
28+
use std::{collections::BTreeMap, fmt, ops::Deref};
3129

3230
/// Holds global gas info.
33-
#[derive(Debug, Default, PartialEq, Eq)]
34-
pub struct GasMetadata {
35-
pub ap_change_info: ApChangeInfo,
36-
pub gas_info: GasInfo,
37-
}
31+
#[derive(Default)]
32+
pub struct GasMetadata(pub CairoGasMetadata);
3833

3934
/// The gas cost associated to a determined sierra statement.
4035
///
@@ -43,15 +38,6 @@ pub struct GasMetadata {
4338
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4439
pub struct GasCost(pub Vec<(u64, CostTokenType)>);
4540

46-
/// Configuration for metadata computation.
47-
#[derive(Debug, Clone)]
48-
pub struct MetadataComputationConfig {
49-
pub function_set_costs: OrderedHashMap<FunctionId, OrderedHashMap<CostTokenType, i32>>,
50-
// ignored, its always used
51-
pub linear_gas_solver: bool,
52-
pub linear_ap_change_solver: bool,
53-
}
54-
5541
/// Error for metadata calculations.
5642
#[derive(Debug, thiserror::Error, Eq, PartialEq)]
5743
pub enum GasMetadataError {
@@ -63,26 +49,18 @@ pub enum GasMetadataError {
6349
NotEnoughGas { gas: Box<(u64, u64)> },
6450
}
6551

66-
impl Default for MetadataComputationConfig {
67-
fn default() -> Self {
68-
Self {
69-
function_set_costs: Default::default(),
70-
linear_gas_solver: true,
71-
linear_ap_change_solver: true,
72-
}
73-
}
74-
}
75-
7652
impl GasMetadata {
7753
pub fn new(
7854
sierra_program: &Program,
7955
config: Option<MetadataComputationConfig>,
8056
) -> Result<GasMetadata, GasMetadataError> {
81-
if let Some(metadata_config) = config {
82-
calc_metadata(sierra_program, metadata_config)
57+
let cairo_gas_metadata = if let Some(metadata_config) = config {
58+
calc_metadata(sierra_program, metadata_config)?
8359
} else {
84-
calc_metadata_ap_change_only(sierra_program)
85-
}
60+
calc_metadata_ap_change_only(sierra_program)?
61+
};
62+
63+
Ok(GasMetadata::from(cairo_gas_metadata))
8664
}
8765

8866
/// Returns the initial value for the gas counter.
@@ -183,9 +161,32 @@ impl GasMetadata {
183161
}
184162
}
185163

164+
impl From<CairoGasMetadata> for GasMetadata {
165+
fn from(value: CairoGasMetadata) -> Self {
166+
Self(value)
167+
}
168+
}
169+
170+
impl Deref for GasMetadata {
171+
type Target = CairoGasMetadata;
172+
173+
fn deref(&self) -> &Self::Target {
174+
&self.0
175+
}
176+
}
177+
178+
impl fmt::Debug for GasMetadata {
179+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
180+
f.debug_struct("GasMetadata")
181+
.field("ap_change_info", &self.ap_change_info)
182+
.field("gas_info", &self.gas_info)
183+
.finish()
184+
}
185+
}
186+
186187
impl Clone for GasMetadata {
187188
fn clone(&self) -> Self {
188-
Self {
189+
Self(CairoGasMetadata {
189190
ap_change_info: ApChangeInfo {
190191
variable_values: self.ap_change_info.variable_values.clone(),
191192
function_ap_change: self.ap_change_info.function_ap_change.clone(),
@@ -194,61 +195,15 @@ impl Clone for GasMetadata {
194195
variable_values: self.gas_info.variable_values.clone(),
195196
function_costs: self.gas_info.function_costs.clone(),
196197
},
197-
}
198+
})
198199
}
199200
}
200201

201-
// Methods from https://github.com/starkware-libs/cairo/blob/fbdbbe4c42a6808eccbff8436078f73d0710c772/crates/cairo-lang-sierra-to-casm/src/metadata.rs#L71
202-
203-
/// Calculates the metadata for a Sierra program, with ap change info only.
204-
fn calc_metadata_ap_change_only(program: &Program) -> Result<GasMetadata, GasMetadataError> {
205-
Ok(GasMetadata {
206-
ap_change_info: calc_ap_changes(program, |_, _| 0)?,
207-
gas_info: GasInfo {
208-
variable_values: Default::default(),
209-
function_costs: Default::default(),
210-
},
211-
})
212-
}
213-
214-
/// Calculates the metadata for a Sierra program.
215-
///
216-
/// `no_eq_solver` uses a linear-time algorithm for calculating the gas, instead of solving
217-
/// equations.
218-
fn calc_metadata(
219-
program: &Program,
220-
config: MetadataComputationConfig,
221-
) -> Result<GasMetadata, GasMetadataError> {
222-
let pre_gas_info = compute_precost_info(program)?;
223-
224-
let ap_change_info = if config.linear_ap_change_solver {
225-
linear_calc_ap_changes
226-
} else {
227-
calc_ap_changes
228-
}(program, |idx, token_type| {
229-
pre_gas_info.variable_values[&(idx, token_type)] as usize
230-
})?;
231-
232-
let enforced_function_costs: OrderedHashMap<FunctionId, i32> = config
233-
.function_set_costs
234-
.iter()
235-
.map(|(func, costs)| (func.clone(), costs[&CostTokenType::Const]))
236-
.collect();
237-
let post_gas_info = compute_postcost_info(
238-
program,
239-
&|idx| {
240-
ap_change_info
241-
.variable_values
242-
.get(idx)
243-
.copied()
244-
.unwrap_or_default()
245-
},
246-
&pre_gas_info,
247-
&enforced_function_costs,
248-
)?;
249-
250-
Ok(GasMetadata {
251-
ap_change_info,
252-
gas_info: pre_gas_info.combine(post_gas_info),
253-
})
202+
impl From<CairoGasMetadataError> for GasMetadataError {
203+
fn from(value: CairoGasMetadataError) -> Self {
204+
match value {
205+
CairoGasMetadataError::ApChangeError(x) => GasMetadataError::ApChangeError(x),
206+
CairoGasMetadataError::CostError(x) => GasMetadataError::CostError(x),
207+
}
208+
}
254209
}

0 commit comments

Comments
 (0)