//! > Basic executable.

//! > test_runner_name
CompileExecutableTestRunner(expect_diagnostics: false)

//! > cairo_code
#[executable]
fn main() {}

//! > generated_casm_code
# builtins: output
# header #
%{ raise NotImplementedError("memory[ap + 0].. = params[0])") %}
[ap + 2] = [fp + -3] + 1, ap++;
[ap + 2] = [ap + 1], ap++;
ap += 2;
call rel 12;
jmp rel 5 if [ap + -3] != 0, ap++;
[ap + -1] = [ap + -2];
jmp rel 4;
[ap + -1] = [fp + -3] + 1;
[ap + -4] = [[fp + -3] + 0];
[ap + 0] = [ap + -1], ap++;
ret;
# sierra based code #
[fp + -5] = [ap + 0] + [fp + -6], ap++;
jmp rel 4 if [ap + -1] != 0;
jmp rel 13;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 117999715903629884655797335944760714204113152088920212735095598, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -3], ap++;
[ap + 0] = [ap + -4] + 1, ap++;
ret;
ap += 2;
[ap + 0] = 0, ap++;
[ap + 0] = [fp + -4], ap++;
[ap + 0] = [fp + -3], ap++;
ret;
# footer #
ret;

//! > expected_diagnostics

//! > ==========================================================================

//! > Test executable with arguments.

//! > test_runner_name
CompileExecutableTestRunner(expect_diagnostics: false)

//! > cairo_code
#[executable]
fn main(a: felt252, b: felt252) -> felt252 {
    a + b
}

//! > generated_casm_code
# builtins: output
# header #
%{ raise NotImplementedError("memory[ap + 0].. = params[0])") %}
[ap + 2] = [fp + -3] + 1, ap++;
[ap + 2] = [ap + 1], ap++;
ap += 2;
call rel 12;
jmp rel 5 if [ap + -3] != 0, ap++;
[ap + -1] = [ap + -2];
jmp rel 4;
[ap + -1] = [fp + -3] + 1;
[ap + -4] = [[fp + -3] + 0];
[ap + 0] = [ap + -1], ap++;
ret;
# sierra based code #
[fp + -5] = [ap + 0] + [fp + -6], ap++;
jmp rel 4 if [ap + -1] != 0;
jmp rel 54;
[ap + 0] = [fp + -6] + 1, ap++;
[ap + 0] = [fp + -5], ap++;
[ap + 0] = [[fp + -6] + 0], ap++;
[ap + -2] = [ap + 0] + [ap + -3], ap++;
jmp rel 4 if [ap + -1] != 0;
jmp rel 32;
[ap + 0] = [ap + -4] + 1, ap++;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = [[ap + -6] + 0], ap++;
[ap + -2] = [ap + 0] + [ap + -3], ap++;
jmp rel 4 if [ap + -1] != 0;
jmp rel 13;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 117999715903629884655797335944760714204113152088920212735095598, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -3], ap++;
[ap + 0] = [ap + -4] + 1, ap++;
ret;
ap += 1;
[ap + 0] = [ap + -7] + [ap + -3], ap++;
[ap + -1] = [[fp + -3] + 0];
[ap + 0] = 0, ap++;
[ap + 0] = [fp + -4], ap++;
[ap + 0] = [fp + -3] + 1, ap++;
ret;
ap += 4;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 485748461484230571791265682659113160264223489397539653310998840191492913, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -3], ap++;
[ap + 0] = [ap + -4] + 1, ap++;
ret;
ap += 8;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 485748461484230571791265682659113160264223489397539653310998840191492912, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -3], ap++;
[ap + 0] = [ap + -4] + 1, ap++;
ret;
# footer #
ret;

//! > expected_diagnostics

//! > ==========================================================================

//! > Test executable with recursion.

//! > test_runner_name
CompileExecutableTestRunner(expect_diagnostics: false)

//! > cairo_code
#[executable]
fn fib(a: u128, b: u128, n: u128) -> u128 {
    if n == 0 {
        a
    } else {
        fib(b, a + b, n - 1)
    }
}

//! > generated_casm_code
# builtins: output, range_check
# header #
[ap + 0] = [fp + -3], ap++;
%{ raise NotImplementedError("memory[ap + 0].. = params[0])") %}
[ap + 2] = [fp + -4] + 1, ap++;
[ap + 2] = [ap + 1], ap++;
ap += 2;
call rel 13;
jmp rel 5 if [ap + -3] != 0, ap++;
[ap + -1] = [ap + -2];
jmp rel 4;
[ap + -1] = [fp + -4] + 1;
[ap + -4] = [[fp + -4] + 0];
[ap + 0] = [ap + -1], ap++;
[ap + 0] = [ap + -6], ap++;
ret;
# sierra based code #
[fp + -5] = [ap + 0] + [fp + -6], ap++;
jmp rel 4 if [ap + -1] != 0;
jmp rel 10;
[ap + 0] = [fp + -6] + 1, ap++;
[ap + 0] = [fp + -5], ap++;
[ap + 0] = 0, ap++;
[ap + 0] = [fp + -6], ap++;
jmp rel 8;
[ap + 0] = [fp + -6], ap++;
[ap + 0] = [fp + -5], ap++;
[ap + 0] = 1, ap++;
[ap + 0] = 0, ap++;
jmp rel 199 if [ap + -2] != 0;
[ap + 0] = [[ap + -1] + 0], ap++;
%{ memory[ap + 0] = memory[ap + -1] < 340282366920938463463374607431768211456 %}
jmp rel 22 if [ap + 0] != 0, ap++;
%{ (memory[ap + 3], memory[ap + 4]) = divmod(memory[ap + -2], 340282366920938463463374607431768211456) %}
[ap + 3] = [[fp + -7] + 0], ap++;
[ap + 3] = [[fp + -7] + 1], ap++;
[ap + -2] = [ap + 1] * 340282366920938463463374607431768211456, ap++;
[ap + -5] = [ap + -3] + [ap + 1], ap++;
[ap + -3] = [ap + -1] + -10633823966279327296825105735305134080, ap++;
jmp rel 6 if [ap + -4] != 0;
[ap + -3] = [ap + -1] + 340282366920938463463374607431768211455;
jmp rel 4;
[ap + -3] = [ap + -2] + 329648542954659136166549501696463077376;
[ap + -3] = [[fp + -7] + 2];
jmp rel 174 if [ap + -2] != 0;
[fp + -1] = [fp + -1] + 1;
[ap + -2] = [[fp + -7] + 0];
[ap + 0] = [fp + -7] + 1, ap++;
[ap + -6] = [ap + 0] + [ap + -7], ap++;
jmp rel 4 if [ap + -1] != 0;
jmp rel 10;
[ap + 0] = [ap + -8] + 1, ap++;
[ap + 0] = [ap + -8], ap++;
[ap + 0] = 0, ap++;
[ap + 0] = [ap + -11], ap++;
jmp rel 8;
[ap + 0] = [ap + -8], ap++;
[ap + 0] = [ap + -8], ap++;
[ap + 0] = 1, ap++;
[ap + 0] = 0, ap++;
jmp rel 135 if [ap + -2] != 0;
[ap + 0] = [[ap + -1] + 0], ap++;
%{ memory[ap + 0] = memory[ap + -1] < 340282366920938463463374607431768211456 %}
jmp rel 22 if [ap + 0] != 0, ap++;
%{ (memory[ap + 3], memory[ap + 4]) = divmod(memory[ap + -2], 340282366920938463463374607431768211456) %}
[ap + 3] = [[ap + -8] + 0], ap++;
[ap + 3] = [[ap + -9] + 1], ap++;
[ap + -2] = [ap + 1] * 340282366920938463463374607431768211456, ap++;
[ap + -5] = [ap + -3] + [ap + 1], ap++;
[ap + -3] = [ap + -1] + -10633823966279327296825105735305134080, ap++;
jmp rel 6 if [ap + -4] != 0;
[ap + -3] = [ap + -1] + 340282366920938463463374607431768211455;
jmp rel 4;
[ap + -3] = [ap + -2] + 329648542954659136166549501696463077376;
[ap + -3] = [[ap + -13] + 2];
jmp rel 110 if [ap + -2] != 0;
[fp + -1] = [fp + -1] + 1;
[ap + -2] = [[ap + -8] + 0];
[ap + 0] = [ap + -8] + 1, ap++;
[ap + -6] = [ap + 0] + [ap + -7], ap++;
jmp rel 4 if [ap + -1] != 0;
jmp rel 10;
[ap + 0] = [ap + -8] + 1, ap++;
[ap + 0] = [ap + -8], ap++;
[ap + 0] = 0, ap++;
[ap + 0] = [ap + -11], ap++;
jmp rel 8;
[ap + 0] = [ap + -8], ap++;
[ap + 0] = [ap + -8], ap++;
[ap + 0] = 1, ap++;
[ap + 0] = 0, ap++;
jmp rel 71 if [ap + -2] != 0;
[ap + 0] = [[ap + -1] + 0], ap++;
%{ memory[ap + 0] = memory[ap + -1] < 340282366920938463463374607431768211456 %}
jmp rel 22 if [ap + 0] != 0, ap++;
%{ (memory[ap + 3], memory[ap + 4]) = divmod(memory[ap + -2], 340282366920938463463374607431768211456) %}
[ap + 3] = [[ap + -8] + 0], ap++;
[ap + 3] = [[ap + -9] + 1], ap++;
[ap + -2] = [ap + 1] * 340282366920938463463374607431768211456, ap++;
[ap + -5] = [ap + -3] + [ap + 1], ap++;
[ap + -3] = [ap + -1] + -10633823966279327296825105735305134080, ap++;
jmp rel 6 if [ap + -4] != 0;
[ap + -3] = [ap + -1] + 340282366920938463463374607431768211455;
jmp rel 4;
[ap + -3] = [ap + -2] + 329648542954659136166549501696463077376;
[ap + -3] = [[ap + -13] + 2];
jmp rel 46 if [ap + -2] != 0;
[fp + -1] = [fp + -1] + 1;
[ap + -2] = [[ap + -8] + 0];
[ap + 0] = [ap + -8] + 1, ap++;
[ap + -6] = [ap + 0] + [ap + -7], ap++;
jmp rel 4 if [ap + -1] != 0;
jmp rel 14;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 117999715903629884655797335944760714204113152088920212735095598, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = [ap + -4], ap++;
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = [ap + -5] + 1, ap++;
ret;
[ap + 0] = [ap + -2], ap++;
[ap + 0] = [ap + -21], ap++;
[ap + 0] = [ap + -14], ap++;
[ap + 0] = [ap + -7], ap++;
call rel 69;
jmp rel 10 if [ap + -3] != 0;
[ap + -1] = [[fp + -3] + 0];
[ap + 0] = [ap + -4], ap++;
[ap + 0] = 0, ap++;
[ap + 0] = [fp + -4], ap++;
[ap + 0] = [fp + -3] + 1, ap++;
ret;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = [ap + -4], ap++;
ret;
[ap + 0] = [ap + -13] + 3, ap++;
jmp rel 3;
[ap + 0] = [ap + -6], ap++;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 485748461484230571791265682659113160264223489397539653310998840191492914, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = [ap + -3], ap++;
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = [ap + -5] + 1, ap++;
ret;
[ap + 0] = [ap + -13] + 3, ap++;
jmp rel 3;
[ap + 0] = [ap + -6], ap++;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 485748461484230571791265682659113160264223489397539653310998840191492913, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = [ap + -3], ap++;
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = [ap + -5] + 1, ap++;
ret;
[ap + 0] = [fp + -7] + 3, ap++;
jmp rel 3;
[ap + 0] = [fp + -7], ap++;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 485748461484230571791265682659113160264223489397539653310998840191492912, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = [ap + -3], ap++;
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = [ap + -5] + 1, ap++;
ret;
jmp rel 9 if [fp + -3] != 0;
[ap + 0] = [fp + -6], ap++;
[ap + 0] = 0, ap++;
[ap + 0] = 0, ap++;
[ap + 0] = [fp + -5], ap++;
ret;
[ap + 1] = [fp + -5] + [fp + -4], ap++;
%{ memory[ap + -1] = memory[ap + 0] < 340282366920938463463374607431768211456 %}
jmp rel 7 if [ap + -1] != 0, ap++;
[ap + -1] = [ap + 0] + 340282366920938463463374607431768211456, ap++;
[ap + -1] = [[fp + -6] + 0];
jmp rel 35;
[ap + -1] = [[fp + -6] + 0];
[ap + 0] = 1, ap++;
[fp + -3] = [ap + 1] + [ap + -1], ap++;
%{ memory[ap + -1] = memory[ap + 0] < 340282366920938463463374607431768211456 %}
jmp rel 7 if [ap + -1] != 0, ap++;
[ap + 0] = [ap + -1] + 340282366920938463463374607431768211456, ap++;
[ap + -1] = [[fp + -6] + 1];
jmp rel 11;
[ap + -1] = [[fp + -6] + 1];
[ap + 0] = [fp + -6] + 2, ap++;
[ap + 0] = [fp + -4], ap++;
[ap + 0] = [ap + -6], ap++;
[ap + 0] = [ap + -4], ap++;
call rel -34;
ret;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 39878429859763533771555484554338820190071, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = [fp + -6] + 2, ap++;
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = [ap + -5] + 1, ap++;
ret;
%{ memory[ap + 0] = segments.add() %}
ap += 1;
[ap + 0] = 39878429859757942499084499860145094553463, ap++;
[ap + -1] = [[ap + -2] + 0];
[ap + 0] = [fp + -6] + 1, ap++;
[ap + 0] = 1, ap++;
[ap + 0] = [ap + -4], ap++;
[ap + 0] = [ap + -5] + 1, ap++;
ret;
# footer #
ret;

//! > expected_diagnostics

//! > ==========================================================================

//! > Test raw executable.

//! > test_runner_name
CompileExecutableTestRunner(expect_diagnostics: false)

//! > cairo_code
#[executable_raw]
fn main(mut _input: Span<felt252>, ref _output: Array<felt252>) {}

//! > generated_casm_code
# builtins: output
# header #
%{ raise NotImplementedError("memory[ap + 0].. = params[0])") %}
[ap + 2] = [fp + -3] + 1, ap++;
[ap + 2] = [ap + 1], ap++;
ap += 2;
call rel 7;
[ap + 0] = 0, ap++;
[ap + -1] = [[fp + -3] + 0];
[ap + 0] = [ap + -2], ap++;
ret;
# sierra based code #
[ap + 0] = [fp + -4], ap++;
[ap + 0] = [fp + -3], ap++;
ret;
# footer #
ret;

//! > expected_diagnostics
