diff --git a/crates/cairo-lang-sierra-to-casm/src/invocations/circuit.rs b/crates/cairo-lang-sierra-to-casm/src/invocations/circuit.rs index af0aa160e98..ba1b71c3123 100644 --- a/crates/cairo-lang-sierra-to-casm/src/invocations/circuit.rs +++ b/crates/cairo-lang-sierra-to-casm/src/invocations/circuit.rs @@ -100,6 +100,9 @@ fn build_get_descriptor( circuit_ty: &ConcreteTypeId, builder: CompiledInvocationBuilder<'_>, ) -> Result { + let CircuitInfo { add_offsets, .. } = + builder.program_info.circuits_info.circuits.get(circuit_ty).unwrap(); + let ctx = casm! { // The relocation will point the `call` to the `ret;` instruction that precedes the // relevant const. @@ -108,7 +111,9 @@ fn build_get_descriptor( // constant value (the `1` is to skip the `ret` instruction). // TODO(Gil): Support relocatable CellExpression and return an unstored "[ap - 1] + 1". [ap] = [ap - 1] + 1, ap++; + [ap] = [ap - 1] + (add_offsets.len() * VALUE_SIZE), ap++; }; + let relocations = vec![ RelocationEntry { instruction_idx: 0, @@ -122,10 +127,12 @@ fn build_get_descriptor( Ok(builder.build( ctx.instructions, relocations, - [vec![ReferenceExpression::from_cell(CellExpression::Deref(CellRef { - register: Register::AP, - offset: -1, - }))] + [vec![ReferenceExpression { + cells: vec![ + CellExpression::Deref(CellRef { register: Register::AP, offset: -2 }), + CellExpression::Deref(CellRef { register: Register::AP, offset: -1 }), + ], + }] .into_iter()] .into_iter(), )) diff --git a/crates/cairo-lang-sierra-type-size/src/lib.rs b/crates/cairo-lang-sierra-type-size/src/lib.rs index 7202b5d0936..2533dc979b7 100644 --- a/crates/cairo-lang-sierra-type-size/src/lib.rs +++ b/crates/cairo-lang-sierra-type-size/src/lib.rs @@ -80,10 +80,10 @@ pub fn get_type_size_map( Some(size) } - CoreTypeConcrete::Circuit(CircuitTypeConcrete::CircuitInputAccumulator(_)) => Some(2), + CoreTypeConcrete::Circuit(CircuitTypeConcrete::CircuitInputAccumulator(_)) + | CoreTypeConcrete::Circuit(CircuitTypeConcrete::CircuitDescriptor(_)) => Some(2), CoreTypeConcrete::Circuit(CircuitTypeConcrete::CircuitData(_)) | CoreTypeConcrete::Circuit(CircuitTypeConcrete::CircuitOutput(_)) - | CoreTypeConcrete::Circuit(CircuitTypeConcrete::CircuitDescriptor(_)) | CoreTypeConcrete::Circuit(CircuitTypeConcrete::AddMod(_)) | CoreTypeConcrete::Circuit(CircuitTypeConcrete::MulMod(_)) => Some(1), diff --git a/tests/e2e_test_data/libfuncs/circuit b/tests/e2e_test_data/libfuncs/circuit index 454080f8dc9..3eba63b709a 100644 --- a/tests/e2e_test_data/libfuncs/circuit +++ b/tests/e2e_test_data/libfuncs/circuit @@ -139,7 +139,8 @@ fn foo() -> CircuitDescriptor { } //! > casm -call rel 5; +call rel 7; +[ap + 0] = [ap + -1] + 6, ap++; [ap + 0] = [ap + -1] + 4, ap++; ret; ret;