Skip to content

Commit a4be0f6

Browse files
FrancoGiachettagabrielbosioJulianGCalderon
authored
[Sierra-Emu] Implement missing libfuncs from int (#1192)
* Add sierra-emu as a debug utility * Change working dir in sierra-emu job * Remove repeated lines in sierra-emu gitignore * Exclude debug_utils from coverage job * remove some todos from value and implement Coupon libfunc * start adding corelib test * run tests from corelib * remove unwanted file * remove not related things * get return_value from trace * replace ids for debug info * add common folder for integration tests * fix tests * remove todo * ignore test for now * filter ignored tests * Update debug_utils/sierra-emu/tests/common/mod.rs Co-authored-by: Julian Gonzalez Calderon <gonzalezcalderonjulian@gmail.com> * run ignored test from the ci * better ignoring * remove debug_name in enums * refactor * remove unused dependency * implement missing libfuncs from int * fmt * More expressive naming for the workflow Co-authored-by: Gabriel Bosio <38794644+gabrielbosio@users.noreply.github.com> * reviews * reviews * fmt * fmt ci * revert last commit * fmt * accidentally removed rayon usage * avoid map's short-circuiting * catch panics the avoid loosing the test name * log ignored tests * clippy * Add "(WIP)" to corelib's test job Co-authored-by: Gabriel Bosio <38794644+gabrielbosio@users.noreply.github.com> * add general libfuncs: const, equal, to_felt, from_felt * add diff libfunc * print progress as the test runs * fmt * fix from_felt * remove unused files + fix issue with non-integer * format makefile Co-authored-by: Julian Gonzalez Calderon <gonzalezcalderonjulian@gmail.com> * try fix from_felt * fix name test in ci * add dependencies removed in merge * dependencies * clippy * remove unused import * better indent in makefile * uppercase tests summary comment for better sight * simplify a little apply_wrapping_op * merge test-corelib * remove unnecesary pubs * also match builtins instead of filtering them * format * use slices in get_numeric_args_as_bigints * fmt * remove unnecesary to_vec * fmt * use iter instead of into_iter * clippy * reviews + remove uint128 file * rename uint252 file to uint256 * fix clippy --------- Co-authored-by: gabrielbosio <gabrielbosio95@gmail.com> Co-authored-by: Julian Gonzalez Calderon <gonzalezcalderonjulian@gmail.com> Co-authored-by: Gabriel Bosio <38794644+gabrielbosio@users.noreply.github.com>
1 parent c0b8496 commit a4be0f6

File tree

12 files changed

+494
-1177
lines changed

12 files changed

+494
-1177
lines changed

debug_utils/sierra-emu/src/utils.rs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
use cairo_lang_sierra::{
2-
extensions::core::{CoreLibfunc, CoreType, CoreTypeConcrete},
2+
extensions::{
3+
core::{CoreLibfunc, CoreType, CoreTypeConcrete},
4+
utils::Range,
5+
},
36
program_registry::ProgramRegistry,
47
};
58
use num_bigint::BigInt;
6-
use num_traits::ToPrimitive;
9+
use num_traits::{Bounded, One, ToPrimitive};
10+
use starknet_types_core::felt::CAIRO_PRIME_BIGINT;
711

812
use crate::Value;
913

@@ -53,3 +57,49 @@ pub fn get_value_from_integer(
5357
_ => panic!("cannot get integer value for a non-integer type"),
5458
}
5559
}
60+
61+
pub fn integer_range(
62+
ty: &CoreTypeConcrete,
63+
registry: &ProgramRegistry<CoreType, CoreLibfunc>,
64+
) -> Range {
65+
fn range_of<T>() -> Range
66+
where
67+
T: Bounded + Into<BigInt>,
68+
{
69+
Range {
70+
lower: T::min_value().into(),
71+
upper: T::max_value().into() + BigInt::one(),
72+
}
73+
}
74+
75+
match ty {
76+
CoreTypeConcrete::Uint8(_) => range_of::<u8>(),
77+
CoreTypeConcrete::Uint16(_) => range_of::<u16>(),
78+
CoreTypeConcrete::Uint32(_) => range_of::<u32>(),
79+
CoreTypeConcrete::Uint64(_) => range_of::<u64>(),
80+
CoreTypeConcrete::Uint128(_) => range_of::<u128>(),
81+
CoreTypeConcrete::Felt252(_) => Range {
82+
lower: BigInt::ZERO,
83+
upper: CAIRO_PRIME_BIGINT.clone(),
84+
},
85+
CoreTypeConcrete::Sint8(_) => range_of::<i8>(),
86+
CoreTypeConcrete::Sint16(_) => range_of::<i16>(),
87+
CoreTypeConcrete::Sint32(_) => range_of::<i32>(),
88+
CoreTypeConcrete::Sint64(_) => range_of::<i64>(),
89+
CoreTypeConcrete::Sint128(_) => range_of::<i128>(),
90+
CoreTypeConcrete::BoundedInt(info) => info.range.clone(),
91+
CoreTypeConcrete::Bytes31(_) => Range {
92+
lower: BigInt::ZERO,
93+
upper: BigInt::one() << 248,
94+
},
95+
CoreTypeConcrete::Const(info) => {
96+
let ty = registry.get_type(&info.inner_ty).unwrap();
97+
integer_range(ty, registry)
98+
}
99+
CoreTypeConcrete::NonZero(info) => {
100+
let ty = registry.get_type(&info.ty).unwrap();
101+
integer_range(ty, registry)
102+
}
103+
_ => panic!("cannot get integer range value for a non-integer type"),
104+
}
105+
}

debug_utils/sierra-emu/src/value.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,38 @@ impl Value {
250250
})
251251
}
252252
}
253+
254+
macro_rules! impl_conversions {
255+
( $( $t:ty as $i:ident ; )+ ) => { $(
256+
impl From<$t> for Value {
257+
fn from(value: $t) -> Self {
258+
Self::$i(value)
259+
}
260+
}
261+
262+
impl TryFrom<Value> for $t {
263+
type Error = Value;
264+
265+
fn try_from(value: Value) -> Result<Self, Self::Error> {
266+
match value {
267+
Value::$i(value) => Ok(value),
268+
_ => Err(value),
269+
}
270+
}
271+
}
272+
)+ };
273+
}
274+
275+
impl_conversions! {
276+
Felt as Felt;
277+
u8 as U8;
278+
u16 as U16;
279+
u32 as U32;
280+
u64 as U64;
281+
u128 as U128;
282+
i8 as I8;
283+
i16 as I16;
284+
i32 as I32;
285+
i64 as I64;
286+
i128 as I128;
287+
}

debug_utils/sierra-emu/src/vm.rs

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ mod felt252_dict;
4848
mod felt252_dict_entry;
4949
mod function_call;
5050
mod gas;
51-
mod int128;
51+
mod int;
5252
mod int_range;
5353
mod jump;
5454
mod mem;
@@ -58,13 +58,8 @@ mod poseidon;
5858
mod snapshot_take;
5959
mod starknet;
6060
mod r#struct;
61-
mod uint128;
62-
mod uint16;
63-
mod uint252;
64-
mod uint32;
61+
mod uint256;
6562
mod uint512;
66-
mod uint64;
67-
mod uint8;
6863

6964
#[derive(Clone)]
7065
pub struct VirtualMachine {
@@ -497,23 +492,23 @@ fn eval<'a>(
497492
CoreConcreteLibfunc::Nullable(selector) => self::nullable::eval(registry, selector, args),
498493
CoreConcreteLibfunc::Pedersen(selector) => self::pedersen::eval(registry, selector, args),
499494
CoreConcreteLibfunc::Poseidon(selector) => self::poseidon::eval(registry, selector, args),
500-
CoreConcreteLibfunc::Sint128(selector) => self::int128::eval(registry, selector, args),
501-
CoreConcreteLibfunc::Sint16(_) => todo!(),
502-
CoreConcreteLibfunc::Sint32(_) => todo!(),
503-
CoreConcreteLibfunc::Sint64(_) => todo!(),
504-
CoreConcreteLibfunc::Sint8(_) => todo!(),
495+
CoreConcreteLibfunc::Sint8(selector) => self::int::eval_signed(registry, selector, args),
496+
CoreConcreteLibfunc::Sint16(selector) => self::int::eval_signed(registry, selector, args),
497+
CoreConcreteLibfunc::Sint32(selector) => self::int::eval_signed(registry, selector, args),
498+
CoreConcreteLibfunc::Sint64(selector) => self::int::eval_signed(registry, selector, args),
499+
CoreConcreteLibfunc::Sint128(selector) => self::int::eval_i128(registry, selector, args),
500+
CoreConcreteLibfunc::Uint8(selector) => self::int::eval_unsigned(registry, selector, args),
501+
CoreConcreteLibfunc::Uint16(selector) => self::int::eval_unsigned(registry, selector, args),
502+
CoreConcreteLibfunc::Uint32(selector) => self::int::eval_unsigned(registry, selector, args),
503+
CoreConcreteLibfunc::Uint64(selector) => self::int::eval_unsigned(registry, selector, args),
504+
CoreConcreteLibfunc::Uint128(selector) => self::int::eval_uint128(registry, selector, args),
505+
CoreConcreteLibfunc::Uint256(selector) => self::uint256::eval(registry, selector, args),
506+
CoreConcreteLibfunc::Uint512(selector) => self::uint512::eval(registry, selector, args),
507+
CoreConcreteLibfunc::Struct(selector) => self::r#struct::eval(registry, selector, args),
505508
CoreConcreteLibfunc::SnapshotTake(info) => self::snapshot_take::eval(registry, info, args),
506509
CoreConcreteLibfunc::Starknet(selector) => {
507510
self::starknet::eval(registry, selector, args, syscall_handler)
508511
}
509-
CoreConcreteLibfunc::Struct(selector) => self::r#struct::eval(registry, selector, args),
510-
CoreConcreteLibfunc::Uint128(selector) => self::uint128::eval(registry, selector, args),
511-
CoreConcreteLibfunc::Uint16(selector) => self::uint16::eval(registry, selector, args),
512-
CoreConcreteLibfunc::Uint256(selector) => self::uint252::eval(registry, selector, args),
513-
CoreConcreteLibfunc::Uint32(selector) => self::uint32::eval(registry, selector, args),
514-
CoreConcreteLibfunc::Uint512(selector) => self::uint512::eval(registry, selector, args),
515-
CoreConcreteLibfunc::Uint64(selector) => self::uint64::eval(registry, selector, args),
516-
CoreConcreteLibfunc::Uint8(selector) => self::uint8::eval(registry, selector, args),
517512
CoreConcreteLibfunc::UnconditionalJump(info) => self::jump::eval(registry, info, args),
518513
CoreConcreteLibfunc::UnwrapNonZero(_info) => {
519514
let [value] = args.try_into().unwrap();

0 commit comments

Comments
 (0)