Skip to content

[Serra-Emu] Fix some libfuncs #1223

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 61 commits into from
May 30, 2025
Merged
Show file tree
Hide file tree
Changes from 60 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
64f9139
change initial gas due to overflows
FrancoGiachetta May 5, 2025
b604c09
fix some libfuncs in circuits
FrancoGiachetta May 5, 2025
eda5973
Merge branch 'main' into sierra-emu-felt-dict-circuits
FrancoGiachetta May 5, 2025
8cc9223
fix is() for circuits
FrancoGiachetta May 5, 2025
d8ec998
remove Value::Unit from return values in get_output
FrancoGiachetta May 5, 2025
715f1c9
match U96LimbsLessThanGuarantee correctly
FrancoGiachetta May 5, 2025
11dae8c
some corrections to circuits
FrancoGiachetta May 6, 2025
113327e
some corrections to circuits
FrancoGiachetta May 6, 2025
882cd61
fix failure_guarantee_verify to avoid panicking
FrancoGiachetta May 6, 2025
2710ca4
fix circuits
FrancoGiachetta May 7, 2025
f204ce8
merge main
FrancoGiachetta May 7, 2025
f470f23
more fixes to circuits + implement ec_zero libfunc
FrancoGiachetta May 7, 2025
553b0f3
clippy
FrancoGiachetta May 7, 2025
72ee4f9
remove unnecesary tests
FrancoGiachetta May 7, 2025
be4f4c5
remove unnecesary file
FrancoGiachetta May 7, 2025
2943dae
fix branch index
FrancoGiachetta May 7, 2025
2d36e5a
add comment
FrancoGiachetta May 7, 2025
0aa0fb5
Merge branch 'main' into sierra-emu-felt-dict-circuits
FrancoGiachetta May 7, 2025
7b87748
fix eval_u96_limbs_less_than_guarantee_verify
FrancoGiachetta May 7, 2025
8190c77
Merge branch 'sierra-emu-felt-dict-circuits' of github.com:lambdaclas…
FrancoGiachetta May 7, 2025
90d6170
remove circuit failure test
FrancoGiachetta May 7, 2025
ecf1458
update trace dump with new Value::CircitOutputs
FrancoGiachetta May 7, 2025
fbd7efe
fmt
FrancoGiachetta May 7, 2025
35bda85
reviews + fix modulus in trace dump
FrancoGiachetta May 8, 2025
c373218
remove unnecesary file
FrancoGiachetta May 8, 2025
8334712
fix clippy
FrancoGiachetta May 8, 2025
9b9cea8
implement circuit_single_limb_less_than_guarantee_verify
FrancoGiachetta May 8, 2025
8320eed
fix trace dump for circuit outputs
FrancoGiachetta May 8, 2025
3e5a259
Merge branch 'main' into sierra-emu-felt-dict-circuits
FrancoGiachetta May 8, 2025
cb20d47
Merge branch 'main' into sierra-emu-felt-dict-circuits
FrancoGiachetta May 9, 2025
adb2132
fix felt_dict_get
FrancoGiachetta May 9, 2025
e8d7c31
fix felt_dict_get
FrancoGiachetta May 9, 2025
e9cb7de
Merge branch 'sierra-emu-felt-dict-circuits' of github.com:lambdaclas…
FrancoGiachetta May 9, 2025
52f18cf
implement U96LimbsLessThanGuarantee for trace dump
FrancoGiachetta May 9, 2025
7109ded
remove unnecessary code
FrancoGiachetta May 9, 2025
3a3080b
merge main + reviews
FrancoGiachetta May 9, 2025
f8c5622
fmt
FrancoGiachetta May 9, 2025
6a03cbd
fix felt_dict_entry_get
FrancoGiachetta May 9, 2025
efcc99d
revert change in circuits.rs
FrancoGiachetta May 9, 2025
969fbd4
remove unwanted file
FrancoGiachetta May 9, 2025
a5b6a0c
revert unwanted change
FrancoGiachetta May 9, 2025
729faff
revert unwanted change
FrancoGiachetta May 9, 2025
29e999e
Merge branch 'main' into fix-sierra-emu-libs
FrancoGiachetta May 9, 2025
9678c48
fix cast and int range libfuncs
FrancoGiachetta May 9, 2025
acd1608
make trace dump for circuit outputs cleaner
FrancoGiachetta May 9, 2025
4d4c8a2
remove unwanted code
FrancoGiachetta May 9, 2025
6817c49
increase felt dict count always during get()
FrancoGiachetta May 9, 2025
d419bae
Merge branch 'main' into sierra-emu-felt-dict-circuits
FrancoGiachetta May 9, 2025
409cb03
doc function + merge main
FrancoGiachetta May 9, 2025
3cbe77c
merge main
FrancoGiachetta May 12, 2025
8ea091a
merge circuits
FrancoGiachetta May 12, 2025
8fbf9f0
fix some libfuncs
FrancoGiachetta May 12, 2025
9393cb1
implement CouponCall not working
FrancoGiachetta May 12, 2025
317d463
all tests passing
FrancoGiachetta May 13, 2025
06c6a2e
remove WIP for corelib tests in sierra-emu's ci
FrancoGiachetta May 13, 2025
352c611
remove WIP for corelib tests in sierra-emu's ci
FrancoGiachetta May 13, 2025
1c53716
fmt!
FrancoGiachetta May 13, 2025
6010276
merge main
FrancoGiachetta May 13, 2025
4674eb6
pop unused argument in coupon_call
FrancoGiachetta May 13, 2025
8a5021f
better error messages in utils
FrancoGiachetta May 13, 2025
30c46c1
Merge branch 'main' into fix-sierra-emu-libs
FrancoGiachetta May 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -361,10 +361,9 @@ jobs:
- name: Run tests
working-directory: ./debug_utils/sierra-emu
run: make test-no-corelib
- name: Run corelib's tests (WIP)
- name: Run corelib's tests
working-directory: ./debug_utils/sierra-emu
run: cargo test test_corelib -- --nocapture
continue-on-error: true # ignore result for now. When sierra-emu is fully implemented this should be removed

build-sierra2casm-dbg:
name: Build sierra2casm-dbg
Expand Down
4 changes: 3 additions & 1 deletion debug_utils/sierra-emu/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use cairo_lang_sierra::{
program::{GenFunction, Program, StatementIdx},
program_registry::ProgramRegistry,
};
use debug::type_to_name;
use starknet::StubSyscallHandler;

pub use self::{dump::*, gas::BuiltinCosts, value::*, vm::VirtualMachine};
Expand Down Expand Up @@ -132,7 +133,8 @@ pub fn run_program(
}
_ => todo!(),
},
_ => todo!(),
CoreTypeConcrete::EcOp(_) => Value::Unit,
_ => todo!("{}", type_to_name(type_id, vm.registry())),
}
})
.collect::<Vec<_>>(),
Expand Down
38 changes: 20 additions & 18 deletions debug_utils/sierra-emu/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ use cairo_lang_sierra::{
core::{CoreLibfunc, CoreType, CoreTypeConcrete},
utils::Range,
},
ids::ConcreteTypeId,
program_registry::ProgramRegistry,
};
use num_bigint::BigInt;
use num_traits::{Bounded, One, ToPrimitive};
use starknet_types_core::felt::CAIRO_PRIME_BIGINT;

use crate::Value;
use crate::{debug::type_to_name, Value};

/// Receives a vector of values, filters any which is non numeric and returns a `Vec<BigInt>`
/// Useful when a binary operation takes generic values (like with bounded ints).
Expand All @@ -29,21 +30,20 @@ pub fn get_numeric_args_as_bigints(args: &[Value]) -> Vec<BigInt> {
Value::U128(value) => BigInt::from(*value),
Value::Felt(value) => value.to_bigint(),
Value::Bytes31(value) => value.to_bigint(),
value => panic!("argument should be an integer: {:?}", value),
value => panic!("Argument should be an integer: {:?}", value),
})
.collect()
}

pub fn get_value_from_integer(
registry: &ProgramRegistry<CoreType, CoreLibfunc>,
ty: &CoreTypeConcrete,
ty_id: &ConcreteTypeId,
value: BigInt,
) -> Value {
let ty = registry.get_type(ty_id).unwrap();

match ty {
CoreTypeConcrete::NonZero(info) => {
let ty = registry.get_type(&info.ty).unwrap();
get_value_from_integer(registry, ty, value)
}
CoreTypeConcrete::NonZero(info) => get_value_from_integer(registry, &info.ty, value),
CoreTypeConcrete::Sint8(_) => Value::I8(value.to_i8().unwrap()),
CoreTypeConcrete::Sint16(_) => Value::I16(value.to_i16().unwrap()),
CoreTypeConcrete::Sint32(_) => Value::I32(value.to_i32().unwrap()),
Expand All @@ -62,12 +62,15 @@ pub fn get_value_from_integer(
}
}
CoreTypeConcrete::Felt252(_) => Value::Felt(value.into()),
_ => panic!("cannot get integer value for a non-integer type"),
_ => panic!(
"Cannot get integer value for a non-integer type: {}",
type_to_name(ty_id, registry)
),
}
}

pub fn integer_range(
ty: &CoreTypeConcrete,
ty_id: &ConcreteTypeId,
registry: &ProgramRegistry<CoreType, CoreLibfunc>,
) -> Range {
fn range_of<T>() -> Range
Expand All @@ -80,6 +83,8 @@ pub fn integer_range(
}
}

let ty = registry.get_type(ty_id).unwrap();

match ty {
CoreTypeConcrete::Uint8(_) => range_of::<u8>(),
CoreTypeConcrete::Uint16(_) => range_of::<u16>(),
Expand All @@ -100,14 +105,11 @@ pub fn integer_range(
lower: BigInt::ZERO,
upper: BigInt::one() << 248,
},
CoreTypeConcrete::Const(info) => {
let ty = registry.get_type(&info.inner_ty).unwrap();
integer_range(ty, registry)
}
CoreTypeConcrete::NonZero(info) => {
let ty = registry.get_type(&info.ty).unwrap();
integer_range(ty, registry)
}
_ => panic!("cannot get integer range value for a non-integer type"),
CoreTypeConcrete::Const(info) => integer_range(&info.inner_ty, registry),
CoreTypeConcrete::NonZero(info) => integer_range(&info.ty, registry),
_ => panic!(
"Cannot get integer range value for a non-integer type {}",
type_to_name(ty_id, registry)
),
}
}
6 changes: 5 additions & 1 deletion debug_utils/sierra-emu/src/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,17 @@ impl Value {
index: 0,
payload: Box::new(Value::default_for_type(registry, &info.variants[0])),
},
CoreTypeConcrete::Array(info) => Value::Array {
ty: info.ty.clone(),
data: vec![],
},
CoreTypeConcrete::Struct(info) => Value::Struct(
info.members
.iter()
.map(|member| Value::default_for_type(registry, member))
.collect(),
),
CoreTypeConcrete::Nullable(info) => Value::default_for_type(registry, &info.ty),
CoreTypeConcrete::Nullable(_) => Value::Null,
x => panic!("type {:?} has no default value implementation", x.info()),
}
}
Expand Down
8 changes: 6 additions & 2 deletions debug_utils/sierra-emu/src/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,6 @@ fn eval<'a>(
CoreConcreteLibfunc::Circuit(selector) => self::circuit::eval(registry, selector, args),
CoreConcreteLibfunc::Const(selector) => self::r#const::eval(registry, selector, args),
CoreConcreteLibfunc::Coupon(selector) => self::coupon::eval(registry, selector, args),
CoreConcreteLibfunc::CouponCall(_) => todo!(),
CoreConcreteLibfunc::Debug(_) => todo!(),
CoreConcreteLibfunc::Drop(info) => self::drop::eval(registry, info, args),
CoreConcreteLibfunc::Dup(info) => self::dup::eval(registry, info, args),
Expand All @@ -484,7 +483,12 @@ fn eval<'a>(
CoreConcreteLibfunc::Felt252DictEntry(selector) => {
self::felt252_dict_entry::eval(registry, selector, args)
}
CoreConcreteLibfunc::FunctionCall(info) => self::function_call::eval(registry, info, args),
CoreConcreteLibfunc::FunctionCall(info) => {
self::function_call::eval_function_call(registry, info, args)
}
CoreConcreteLibfunc::CouponCall(info) => {
self::function_call::eval_coupon_call(registry, info, args)
}
CoreConcreteLibfunc::Gas(selector) => {
self::gas::eval(registry, selector, args, gas, *statement_idx, builtin_costs)
}
Expand Down
9 changes: 3 additions & 6 deletions debug_utils/sierra-emu/src/vm/array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -297,13 +297,10 @@ fn eval_snapshot_multi_pop_back(
};

if data.len() >= popped_cty.members.len() {
let new_data = data.split_off(data.len() - popped_cty.members.len());
let value = Value::Struct(data);
let popped_data = data.split_off(data.len() - popped_cty.members.len());
let value = Value::Struct(popped_data);
assert!(value.is(registry, &info.popped_ty));
EvalAction::NormalBranch(
0,
smallvec![rangecheck, Value::Array { data: new_data, ty }, value],
)
EvalAction::NormalBranch(0, smallvec![rangecheck, Value::Array { data, ty }, value])
} else {
EvalAction::NormalBranch(1, smallvec![rangecheck, Value::Array { data, ty }])
}
Expand Down
35 changes: 18 additions & 17 deletions debug_utils/sierra-emu/src/vm/bounded_int.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use super::EvalAction;
use crate::{utils::get_numeric_args_as_bigints, Value};
use crate::{
utils::{get_numeric_args_as_bigints, get_value_from_integer},
Value,
};
use cairo_lang_sierra::{
extensions::{
bounded_int::{
Expand Down Expand Up @@ -126,8 +129,10 @@ pub fn eval_div_rem(
info: &BoundedIntDivRemConcreteLibfunc,
args: Vec<Value>,
) -> EvalAction {
let [lhs, rhs]: [BigInt; 2] = get_numeric_args_as_bigints(&args).try_into().unwrap();

let range_check @ Value::Unit: Value = args[0].clone() else {
panic!()
};
let [lhs, rhs]: [BigInt; 2] = get_numeric_args_as_bigints(&args[1..]).try_into().unwrap();
let quo = &lhs / &rhs;
let rem = lhs % rhs;

Expand All @@ -151,7 +156,7 @@ pub fn eval_div_rem(
EvalAction::NormalBranch(
0,
smallvec![
Value::Unit, // range_check
range_check,
Value::BoundedInt {
range: quo_range,
value: quo,
Expand All @@ -169,14 +174,10 @@ pub fn eval_constrain(
info: &BoundedIntConstrainConcreteLibfunc,
args: Vec<Value>,
) -> EvalAction {
let [range_check @ Value::Unit, value]: [Value; 2] = args.try_into().unwrap() else {
let range_check @ Value::Unit: Value = args[0].clone() else {
panic!()
};

let value = match value {
Value::I8(value) => value.into(),
_ => todo!(),
};
let [value]: [BigInt; 1] = get_numeric_args_as_bigints(&args[1..]).try_into().unwrap();

if value < info.boundary {
let range = match registry
Expand Down Expand Up @@ -224,19 +225,19 @@ pub fn eval_constrain(
}

pub fn eval_is_zero(
_registry: &ProgramRegistry<CoreType, CoreLibfunc>,
_info: &SignatureOnlyConcreteLibfunc,
registry: &ProgramRegistry<CoreType, CoreLibfunc>,
info: &SignatureOnlyConcreteLibfunc,
args: Vec<Value>,
) -> EvalAction {
let [value] = args.try_into().unwrap();
let is_zero = match value {
Value::I8(value) => value == 0,
_ => todo!(),
};
let [value] = get_numeric_args_as_bigints(&args).try_into().unwrap();
let is_zero = value == 0.into();

let int_ty = &info.branch_signatures()[1].vars[0].ty;

if is_zero {
EvalAction::NormalBranch(0, smallvec![])
} else {
let value = get_value_from_integer(registry, int_ty, value);
EvalAction::NormalBranch(1, smallvec![value])
}
}
Expand Down
14 changes: 7 additions & 7 deletions debug_utils/sierra-emu/src/vm/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@ fn eval_downcast(
};
let [value] = get_numeric_args_as_bigints(&args[1..]).try_into().unwrap();

let int_ty = registry.get_type(&info.to_ty).unwrap();

let range = info.to_range.lower.clone()..info.to_range.upper.clone();

if range.contains(&value) {
EvalAction::NormalBranch(
0,
smallvec![range_check, get_value_from_integer(registry, int_ty, value)],
smallvec![
range_check,
get_value_from_integer(registry, &info.to_ty, value)
],
)
} else {
EvalAction::NormalBranch(1, smallvec![range_check])
Expand All @@ -54,12 +56,10 @@ fn eval_upcast(
args: Vec<Value>,
) -> EvalAction {
let [value] = get_numeric_args_as_bigints(&args).try_into().unwrap();
let int_ty = registry
.get_type(&info.branch_signatures()[0].vars[0].ty)
.unwrap();
let int_ty_id = &info.branch_signatures()[0].vars[0].ty;

EvalAction::NormalBranch(
0,
smallvec![get_value_from_integer(registry, int_ty, value)],
smallvec![get_value_from_integer(registry, int_ty_id, value)],
)
}
19 changes: 18 additions & 1 deletion debug_utils/sierra-emu/src/vm/function_call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use cairo_lang_sierra::{
program_registry::ProgramRegistry,
};

pub fn eval(
pub fn eval_function_call(
registry: &ProgramRegistry<CoreType, CoreLibfunc>,
info: &SignatureAndFunctionConcreteLibfunc,
args: Vec<Value>,
Expand All @@ -21,3 +21,20 @@ pub fn eval(

EvalAction::FunctionCall(info.function.id.clone(), args.into_iter().collect())
}

pub fn eval_coupon_call(
registry: &ProgramRegistry<CoreType, CoreLibfunc>,
info: &SignatureAndFunctionConcreteLibfunc,
mut args: Vec<Value>,
) -> EvalAction {
// Don't check the last arg since it is not actually an argument for the function call itself
assert_eq!(args.len() - 1, info.function.params.len());
assert!(args
.iter()
.zip(&info.function.params)
.all(|(value, param)| value.is(registry, &param.ty)));

args.pop();

EvalAction::FunctionCall(info.function.id.clone(), args.into_iter().collect())
}
Loading
Loading