-
Notifications
You must be signed in to change notification settings - Fork 164
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* add print hints * test * remove u256 add felt * change log * fix based on comments * add std feature for print * Move Cairo Programs * Update Makefile * Use print tag in test * cargo fmt * Update Makefile * Update Makefile --------- Co-authored-by: Pedro Fontana <[email protected]>
- Loading branch information
Showing
12 changed files
with
278 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
%builtins range_check | ||
|
||
from starkware.cairo.common.alloc import alloc | ||
|
||
func main{range_check_ptr: felt}() { | ||
let name = 0x4b4b5254; | ||
let (arr: felt*) = alloc(); | ||
assert arr[0] = 1; | ||
assert arr[1] = 2; | ||
assert arr[2] = 3; | ||
assert arr[3] = 4; | ||
assert arr[4] = 5; | ||
let arr_len = 5; | ||
%{ | ||
print(bytes.fromhex(f"{ids.name:062x}").decode().replace('\x00','')) | ||
arr = [memory[ids.arr + i] for i in range(ids.arr_len)] | ||
print(arr) | ||
%} | ||
return(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
%builtins range_check | ||
|
||
from starkware.cairo.common.dict_access import DictAccess | ||
from starkware.cairo.common.default_dict import default_dict_new, default_dict_finalize | ||
from starkware.cairo.common.dict import dict_write | ||
|
||
struct MyStruct { | ||
a: felt, | ||
b: felt, | ||
c: felt, | ||
} | ||
|
||
func main{range_check_ptr: felt}() { | ||
let name = 0x4b4b5254; | ||
let (dict_ptr) = default_dict_new(0); | ||
let pointer_size = 3; | ||
|
||
tempvar one = new MyStruct(1,2,3); | ||
dict_write{dict_ptr=dict_ptr}(0, cast(one, felt)); | ||
tempvar two = new MyStruct(2,3,4); | ||
dict_write{dict_ptr=dict_ptr}(1, cast(two, felt)); | ||
tempvar three = new MyStruct(3,4,5); | ||
dict_write{dict_ptr=dict_ptr}(2, cast(three, felt)); | ||
tempvar four = new MyStruct(4,5,6); | ||
dict_write{dict_ptr=dict_ptr}(3, cast(four, felt)); | ||
%{ | ||
print(bytes.fromhex(f"{ids.name:062x}").decode().replace('\x00','')) | ||
data = __dict_manager.get_dict(ids.dict_ptr) | ||
print( | ||
{k: v if isinstance(v, int) else [memory[v + i] for i in range(ids.pointer_size)] for k, v in data.items()} | ||
) | ||
%} | ||
return(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
%builtins range_check | ||
|
||
from starkware.cairo.common.dict_access import DictAccess | ||
from starkware.cairo.common.default_dict import default_dict_new, default_dict_finalize | ||
from starkware.cairo.common.dict import dict_write | ||
|
||
func main{range_check_ptr: felt}() { | ||
let name = 0x4b4b5254; | ||
let (dict_ptr) = default_dict_new(0); | ||
let pointer_size = 1; | ||
dict_write{dict_ptr=dict_ptr}(0, 1); | ||
dict_write{dict_ptr=dict_ptr}(1, 2); | ||
dict_write{dict_ptr=dict_ptr}(2, 3); | ||
dict_write{dict_ptr=dict_ptr}(3, 4); | ||
dict_write{dict_ptr=dict_ptr}(4, 5); | ||
%{ | ||
print(bytes.fromhex(f"{ids.name:062x}").decode().replace('\x00','')) | ||
data = __dict_manager.get_dict(ids.dict_ptr) | ||
print( | ||
{k: v if isinstance(v, int) else [memory[v + i] for i in range(ids.pointer_size)] for k, v in data.items()} | ||
) | ||
%} | ||
return(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
%builtins range_check | ||
|
||
func main{range_check_ptr: felt}() { | ||
let x = 123; | ||
%{ | ||
print(ids.x) | ||
%} | ||
return(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
use core::fmt::{Debug, Formatter}; | ||
|
||
use felt::Felt252; | ||
use num_traits::ToPrimitive; | ||
|
||
use crate::hint_processor::builtin_hint_processor::dict_manager::Dictionary; | ||
use crate::hint_processor::builtin_hint_processor::hint_utils::{ | ||
get_integer_from_var_name, get_ptr_from_var_name, | ||
}; | ||
use crate::serde::deserialize_program::ApTracking; | ||
use crate::stdlib::collections::HashMap; | ||
|
||
use crate::types::exec_scope::ExecutionScopes; | ||
use crate::types::relocatable::MaybeRelocatable; | ||
use crate::vm::errors::hint_errors::HintError; | ||
use crate::{ | ||
hint_processor::hint_processor_definition::HintReference, vm::vm_core::VirtualMachine, | ||
}; | ||
|
||
pub fn print_felt( | ||
vm: &VirtualMachine, | ||
ids_data: &HashMap<String, HintReference>, | ||
ap_tracking: &ApTracking, | ||
) -> Result<(), HintError> { | ||
let val = get_integer_from_var_name("x", vm, ids_data, ap_tracking)?; | ||
println!("{val}"); | ||
Ok(()) | ||
} | ||
|
||
fn print_name( | ||
vm: &VirtualMachine, | ||
ids_data: &HashMap<String, HintReference>, | ||
ap_tracking: &ApTracking, | ||
) -> Result<(), HintError> { | ||
let name = get_integer_from_var_name("name", vm, ids_data, ap_tracking)?; | ||
let name = String::from_utf8(name.to_bigint().to_signed_bytes_be()) | ||
.map_err(|err| HintError::CustomHint(err.to_string().into_boxed_str()))?; | ||
println!("{name}"); | ||
Ok(()) | ||
} | ||
|
||
pub fn print_array( | ||
vm: &VirtualMachine, | ||
ids_data: &HashMap<String, HintReference>, | ||
ap_tracking: &ApTracking, | ||
) -> Result<(), HintError> { | ||
print_name(vm, ids_data, ap_tracking)?; | ||
|
||
let mut acc = Vec::new(); | ||
let arr = get_ptr_from_var_name("arr", vm, ids_data, ap_tracking)?; | ||
let arr_len = get_integer_from_var_name("arr_len", vm, ids_data, ap_tracking)?; | ||
let arr_len = arr_len.to_usize().ok_or_else(|| { | ||
HintError::CustomHint(String::from("arr_len must be a positive integer").into_boxed_str()) | ||
})?; | ||
for i in 0..arr_len { | ||
let val = vm.get_integer((arr + i)?)?; | ||
acc.push(val); | ||
} | ||
println!("{:?}", acc); | ||
Ok(()) | ||
} | ||
|
||
enum DictValue { | ||
Int(Felt252), | ||
Relocatable(Vec<Felt252>), | ||
} | ||
|
||
impl Debug for DictValue { | ||
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { | ||
match self { | ||
Self::Int(int) => write!(f, "{:?}", int), | ||
Self::Relocatable(relocatable) => write!(f, "{:?}", relocatable), | ||
} | ||
} | ||
} | ||
|
||
pub fn print_dict( | ||
vm: &VirtualMachine, | ||
exec_scopes: &ExecutionScopes, | ||
ids_data: &HashMap<String, HintReference>, | ||
ap_tracking: &ApTracking, | ||
) -> Result<(), HintError> { | ||
print_name(vm, ids_data, ap_tracking)?; | ||
|
||
let dict_ptr = get_ptr_from_var_name("dict_ptr", vm, ids_data, ap_tracking)?; | ||
let pointer_size = get_integer_from_var_name("pointer_size", vm, ids_data, ap_tracking)?; | ||
let pointer_size = pointer_size.to_usize().ok_or_else(|| { | ||
HintError::CustomHint( | ||
String::from("pointer_size must be a positive integer").into_boxed_str(), | ||
) | ||
})?; | ||
|
||
let dict_manager = exec_scopes.get_dict_manager()?; | ||
let dict_manager = dict_manager.borrow(); | ||
let tracker = dict_manager.get_tracker(dict_ptr)?; | ||
|
||
let map = match &tracker.data { | ||
Dictionary::SimpleDictionary(dict) => dict, | ||
Dictionary::DefaultDictionary { dict, .. } => dict, | ||
}; | ||
|
||
let mut acc = HashMap::new(); | ||
for (k, v) in map.iter() { | ||
let key = k.get_int_ref().ok_or_else(|| { | ||
HintError::CustomHint(String::from("Expected felt key for dict").into_boxed_str()) | ||
})?; | ||
match v { | ||
MaybeRelocatable::Int(value) => { | ||
acc.insert(key, DictValue::Int(value.clone())); | ||
} | ||
MaybeRelocatable::RelocatableValue(val) => { | ||
let mut structure = Vec::new(); | ||
for i in 0..pointer_size { | ||
let val = vm.get_integer((*val + i)?)?.as_ref().clone(); | ||
structure.push(val); | ||
} | ||
acc.insert(key, DictValue::Relocatable(structure)); | ||
} | ||
} | ||
} | ||
|
||
println!("{:?}", acc); | ||
Ok(()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters