diff --git a/crates/cairo-lang-runner/src/profiling_test.rs b/crates/cairo-lang-runner/src/profiling_test.rs index c73970f5995..c9904d998bd 100644 --- a/crates/cairo-lang-runner/src/profiling_test.rs +++ b/crates/cairo-lang-runner/src/profiling_test.rs @@ -20,6 +20,7 @@ cairo_lang_test_utils::test_file_test!( { major_test_cases: "major_test_cases", profiling: "profiling", + circuit: "circuit", }, test_profiling ); diff --git a/crates/cairo-lang-runner/src/profiling_test_data/circuit b/crates/cairo-lang-runner/src/profiling_test_data/circuit new file mode 100644 index 00000000000..856f1c17964 --- /dev/null +++ b/crates/cairo-lang-runner/src/profiling_test_data/circuit @@ -0,0 +1,148 @@ +//! > Test profiling info of circuit.sierra + +//! > test_runner_name +test_profiling + +//! > cairo_code +>>> file: ../../examples/circuit.cairo + +//! > function_name +eval_circuit + +//! > expected_profiling_info +Weight by sierra statement: + statement 57: 22 (eval_circuit, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>([1], [2], [51], [52], [21], [53], [54]) { fallthrough([55], [56], [57]) 95([5], [58], [59], [60]) }) + statement 363: 14 (fill_circuit_input, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>([7], [67]) { fallthrough([68]) 368([69]) }) + statement 362: 8 (store_temp>([67]) -> ([67])) + statement 375: 8 (store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>([74]) -> ([74])) + statement 14: 6 (try_into_circuit_modulus([13]) { fallthrough([21]) 251() }) + statement 51: 5 (get_circuit_descriptor, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>() -> ([51])) + statement 63: 5 (get_circuit_output, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>, core::circuit::MulModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>>([57]) -> ([61], [62])) + statement 93: 5 (store_temp>([73]) -> ([73])) + statement 13: 4 (store_local, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>>>([14], [13]) -> ([13])) + statement 26: 4 (store_temp, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>>>([28]) -> ([28])) + statement 40: 4 (store_temp, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>>>([39]) -> ([39])) + statement 25: 3 (store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>([23]) -> ([23])) + statement 39: 3 (store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>([34]) -> ([34])) + statement 47: 3 (store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>([45]) -> ([45])) + statement 366: 3 (store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>([70]) -> ([71])) + statement 370: 3 (store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>([72]) -> ([71])) + statement 387: 3 (store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>([8]) -> ([8])) + statement 67: 2 (u96_limbs_less_than_guarantee_verify<4>([62]) { fallthrough([63]) 82([64]) }) + statement 69: 2 (u96_limbs_less_than_guarantee_verify<3>([63]) { fallthrough([65]) 79([66]) }) + statement 71: 2 (u96_limbs_less_than_guarantee_verify<2>([65]) { fallthrough([67]) 76([68]) }) + statement 272: 2 (finalize_locals() -> ()) + statement 274: 2 (enum_match, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>([2]) { fallthrough([6]) 354([7]) }) + statement 373: 2 (store_temp([0]) -> ([0])) + statement 374: 2 (store_temp([1]) -> ([1])) + statement 376: 2 (return([0], [1], [74])) + statement 6: 1 (finalize_locals() -> ()) + statement 23: 1 (store_temp([0]) -> ([0])) + statement 24: 1 (store_temp([4]) -> ([4])) + statement 27: 1 (store_local([16], [15]) -> ([15])) + statement 28: 1 (function_call, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::next::<[core::internal::BoundedInt::<0, 79228162514264337593543950335>; 4], core::circuit::U96sIntoCircuitInputValue, core::traits::FixedSizedArrayDrop::, core::internal::BoundedIntDrop::<0, 79228162514264337593543950335>, 4>>>([0], [4], [23], [28]) -> ([29], [30], [31])) + statement 29: 1 (enum_match, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>([31]) { fallthrough([32]) 237([33]) }) + statement 37: 1 (store_temp([29]) -> ([29])) + statement 38: 1 (store_temp([30]) -> ([30])) + statement 41: 1 (function_call, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::next::<[core::internal::BoundedInt::<0, 79228162514264337593543950335>; 4], core::circuit::U96sIntoCircuitInputValue, core::traits::FixedSizedArrayDrop::, core::internal::BoundedIntDrop::<0, 79228162514264337593543950335>, 4>>>([29], [30], [34], [39]) -> ([40], [41], [42])) + statement 42: 1 (enum_match, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>([42]) { fallthrough([43]) 223([44]) }) + statement 45: 1 (store_temp([40]) -> ([40])) + statement 46: 1 (store_temp([41]) -> ([41])) + statement 48: 1 (function_call, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::done>([40], [41], [45]) -> ([46], [47], [48])) + statement 49: 1 (enum_match, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>([48]) { fallthrough([49]) 209([50]) }) + statement 55: 1 (store_temp>([53]) -> ([53])) + statement 56: 1 (store_temp>([54]) -> ([54])) + statement 65: 1 (store_temp([55]) -> ([55])) + statement 66: 1 (store_temp([56]) -> ([56])) + statement 74: 1 (store_temp([69]) -> ([70])) + statement 75: 1 (jump() { 84() }) + statement 85: 1 (u96_guarantee_verify([15], [70]) -> ([71])) + statement 88: 1 (store_temp([46]) -> ([46])) + statement 89: 1 (store_temp([55]) -> ([55])) + statement 90: 1 (store_temp([56]) -> ([56])) + statement 91: 1 (store_temp([71]) -> ([71])) + statement 92: 1 (store_temp([47]) -> ([47])) + statement 94: 1 (return([46], [55], [56], [71], [47], [73])) + statement 367: 1 (jump() { 371() }) + statement 378: 1 (finalize_locals() -> ()) + statement 380: 1 (enum_match, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>([2]) { fallthrough([5]) 389([6]) }) + statement 385: 1 (store_temp([0]) -> ([0])) + statement 386: 1 (store_temp([1]) -> ([1])) + statement 388: 1 (return([0], [1], [8])) +Weight by concrete libfunc: + libfunc eval_circuit, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>: 22 + libfunc store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>: 15 + libfunc fill_circuit_input, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>: 14 + libfunc store_temp, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>>>: 8 + libfunc store_temp>: 8 + libfunc store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>: 8 + libfunc store_temp: 7 + libfunc store_temp: 7 + libfunc try_into_circuit_modulus: 6 + libfunc get_circuit_descriptor, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>: 5 + libfunc get_circuit_output, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>, core::circuit::MulModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>>: 5 + libfunc store_temp>: 5 + libfunc finalize_locals: 4 + libfunc store_local, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>, BoundedInt<0, 79228162514264337593543950335>>>: 4 + libfunc enum_match, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>>: 3 + libfunc store_temp, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>: 3 + libfunc enum_match, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>: 2 + libfunc function_call, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::next::<[core::internal::BoundedInt::<0, 79228162514264337593543950335>; 4], core::circuit::U96sIntoCircuitInputValue, core::traits::FixedSizedArrayDrop::, core::internal::BoundedIntDrop::<0, 79228162514264337593543950335>, 4>>>: 2 + libfunc jump: 2 + libfunc store_temp: 2 + libfunc store_temp: 2 + libfunc u96_limbs_less_than_guarantee_verify<2>: 2 + libfunc u96_limbs_less_than_guarantee_verify<3>: 2 + libfunc u96_limbs_less_than_guarantee_verify<4>: 2 + libfunc enum_match, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>,)>>: 1 + libfunc function_call, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::done>: 1 + libfunc store_local: 1 + libfunc store_temp>: 1 + libfunc store_temp>: 1 + libfunc store_temp: 1 + libfunc store_temp: 1 + libfunc u96_guarantee_verify: 1 + return: 4 +Weight by generic libfunc: + libfunc store_temp: 69 + libfunc eval_circuit: 22 + libfunc fill_circuit_input: 14 + libfunc enum_match: 6 + libfunc try_into_circuit_modulus: 6 + libfunc u96_limbs_less_than_guarantee_verify: 6 + libfunc get_circuit_descriptor: 5 + libfunc get_circuit_output: 5 + libfunc store_local: 5 + libfunc finalize_locals: 4 + libfunc function_call: 3 + libfunc jump: 2 + libfunc u96_guarantee_verify: 1 + return: 4 +Weight by user function (inc. generated): + function test::eval_circuit: 97 + function core::circuit::FillInputResultImpl::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::next::<[core::internal::BoundedInt::<0, 79228162514264337593543950335>; 4], core::circuit::U96sIntoCircuitInputValue, core::traits::FixedSizedArrayDrop::, core::internal::BoundedIntDrop::<0, 79228162514264337593543950335>, 4>>: 47 + function core::circuit::FillInputResultImpl::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::done: 8 +Weight by original user function (exc. generated): + function test::eval_circuit: 97 + function core::circuit::FillInputResultImpl::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::next::<[core::internal::BoundedInt::<0, 79228162514264337593543950335>; 4], core::circuit::U96sIntoCircuitInputValue, core::traits::FixedSizedArrayDrop::, core::internal::BoundedIntDrop::<0, 79228162514264337593543950335>, 4>>: 47 + function core::circuit::FillInputResultImpl::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::done: 8 +Weight by Cairo function: + function core::circuit::FillInputResultImpl::next: 45 + function lib.cairo::eval_circuit: 41 + function core::circuit::EvalCircuitImpl::eval_ex: 24 + function core::circuit::U384TryIntoCircuitModulus::try_into: 10 + function core::circuit::IntoU96GuaranteeImplByNext::into_u96_guarantee: 8 + function core::circuit::FillInputResultImpl::done: 7 + function core::circuit::CircuitOutputsImpl::get_output: 5 + function core::circuit::EvalCircuitImpl::eval: 5 + function unknown: 4 + function core::circuit::IntoU96GuaranteeImplFinal::into_u96_guarantee: 2 + function core::circuit::DestructU96Guarantee::destruct: 1 +Weight by Sierra stack trace: + test::eval_circuit: 152 + test::eval_circuit -> core::circuit::FillInputResultImpl::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::next::<[core::internal::BoundedInt::<0, 79228162514264337593543950335>; 4], core::circuit::U96sIntoCircuitInputValue, core::traits::FixedSizedArrayDrop::, core::internal::BoundedIntDrop::<0, 79228162514264337593543950335>, 4>>: 47 + test::eval_circuit -> core::circuit::FillInputResultImpl::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::done: 8 +Weight by Cairo stack trace: + test::eval_circuit: 152 + test::eval_circuit -> core::circuit::FillInputResultImpl::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::next::<[core::internal::BoundedInt::<0, 79228162514264337593543950335>; 4], core::circuit::U96sIntoCircuitInputValue, core::traits::FixedSizedArrayDrop::, core::internal::BoundedIntDrop::<0, 79228162514264337593543950335>, 4>>: 47 + test::eval_circuit -> core::circuit::FillInputResultImpl::, core::circuit::CircuitInput::<1>>>, core::circuit::SubModGate::, core::circuit::CircuitInput::<1>>>, core::circuit::CircuitInput::<1>>>, core::circuit::AddModGate::, core::circuit::CircuitInput::<1>>, core::circuit::InverseGate::, core::circuit::CircuitInput::<1>>>)>>::done: 8 diff --git a/examples/circuit.cairo b/examples/circuit.cairo new file mode 100644 index 00000000000..cb5e12b06a1 --- /dev/null +++ b/examples/circuit.cairo @@ -0,0 +1,30 @@ +use core::circuit::{ + RangeCheck96, AddMod, MulMod, u96, CircuitElement, CircuitInput, circuit_add, circuit_sub, + circuit_mul, circuit_inverse, EvalCircuitResult, EvalCircuitTrait, u384, CircuitOutputsTrait, + CircuitModulus, FillInputResultTrait, CircuitInputs, +}; + + + +pub fn eval_circuit() -> u384 { + let in1 = CircuitElement::> {}; + let in2 = CircuitElement::> {}; + let add = circuit_add(in1, in2); + let inv = circuit_inverse(add); + let sub = circuit_sub(inv, in2); + let mul = circuit_mul(inv, sub); + + let modulus = TryInto::<_, CircuitModulus>::try_into([7, 0, 0, 0]).unwrap(); + let outputs = + match (mul, add, inv) + .new_inputs() + .next([3, 0, 0, 0]) + .next([6, 0, 0, 0]) + .done() + .eval(modulus) { + EvalCircuitResult::Success(outputs) => { outputs }, + EvalCircuitResult::Failure((_, _)) => { panic!("Expected success") } + }; + + outputs.get_output(mul) +}