procedure Ping(ALIVE_period: bool); modifies ALIVE_repeating, x__t, x__f; implementation Ping(ALIVE_period: bool) { anon0: call boogie_si_record_bool(ALIVE_period); goto anon3_Then, anon3_Else; anon3_Then: goto L1, L2; L1: assume ALIVE_period; assume !x__t; goto L0; L2: assume !ALIVE_period; assume !x__f; goto L0; L0: goto L5, L6, L7, L8; L5: assume !ALIVE_period; assume true; call {:async 1} ALIVE_Ping_Pro(); assume true; call {:async 1} Ping(true); ALIVE_repeating := true; goto L4; L6: assume ALIVE_period; assume true; call {:async 1} ALIVE_Ping_Anti(); goto L4; L7: goto L4; L8: assume true; call {:async 1} Ping(ALIVE_period); goto L4; L4: goto L11, L12; L11: assume ALIVE_period; x__t := true; goto L10; L12: assume !ALIVE_period; x__f := true; goto L10; L10: goto anon2; anon3_Else: goto L15, L16; L15: assume ALIVE_period; assume x__t; goto L14; L16: assume !ALIVE_period; assume x__f; goto L14; L14: goto anon2; anon2: return; } procedure Pong(ALIVE_period: bool); modifies ALIVE_repeating, x__t, x__f; implementation Pong(ALIVE_period: bool) { anon0: call boogie_si_record_bool(ALIVE_period); goto anon3_Then, anon3_Else; anon3_Then: goto L19, L20; L19: assume ALIVE_period; assume x__t; goto L18; L20: assume !ALIVE_period; assume x__f; goto L18; L18: goto L23, L24, L25, L26; L23: assume !ALIVE_period; assume true; call {:async 1} ALIVE_Pong_Pro(); assume true; call {:async 1} Pong(true); ALIVE_repeating := true; goto L22; L24: assume ALIVE_period; assume true; call {:async 1} ALIVE_Pong_Anti(); goto L22; L25: goto L22; L26: assume true; call {:async 1} Pong(ALIVE_period); goto L22; L22: goto L29, L30; L29: assume ALIVE_period; x__t := false; goto L28; L30: assume !ALIVE_period; x__f := false; goto L28; L28: goto anon2; anon3_Else: goto L33, L34; L33: assume ALIVE_period; assume !x__t; goto L32; L34: assume !ALIVE_period; assume !x__f; goto L32; L32: goto anon2; anon2: return; } procedure ALIVE_Main_ORIG(ALIVE_period: bool); modifies x__t, x__f, ALIVE_repeating; implementation ALIVE_Main_ORIG(ALIVE_period: bool) { anon0: goto L37, L38; L37: assume ALIVE_period; x__t := false; goto L36; L38: assume !ALIVE_period; x__f := false; goto L36; L36: goto L41, L42, L43, L44; L41: assume !ALIVE_period; assume true; call {:async 1} ALIVE_Ping_Pro(); assume true; call {:async 1} Ping(true); ALIVE_repeating := true; goto L40; L42: assume ALIVE_period; assume true; call {:async 1} ALIVE_Ping_Anti(); goto L40; L43: goto L40; L44: assume true; call {:async 1} Ping(ALIVE_period); goto L40; L40: goto L47, L48, L49, L50; L47: assume !ALIVE_period; assume true; call {:async 1} ALIVE_Pong_Pro(); assume true; call {:async 1} Pong(true); ALIVE_repeating := true; goto L46; L48: assume ALIVE_period; assume true; call {:async 1} ALIVE_Pong_Anti(); goto L46; L49: goto L46; L50: assume true; call {:async 1} Pong(ALIVE_period); goto L46; L46: return; } var ALIVE_turn: bool; var ALIVE_last_proc: int; var ALIVE_last_arg_bool: [int]bool; var ALIVE_last_arg_int: [int]int; var ALIVE_repeating: bool; var ALIVE_pending: int; var x__f: bool; var x__t: bool; procedure ALIVE_Ping_Pro(); modifies ALIVE_last_proc, ALIVE_turn; implementation ALIVE_Ping_Pro() { L52: assume ALIVE_turn; ALIVE_last_proc := 86; ALIVE_turn := false; return; } procedure ALIVE_Ping_Anti(); modifies ALIVE_turn; implementation ALIVE_Ping_Anti() { L53: assume !ALIVE_turn; assume ALIVE_last_proc == 86; ALIVE_turn := true; return; } procedure ALIVE_Pong_Pro(); modifies ALIVE_last_proc, ALIVE_turn; implementation ALIVE_Pong_Pro() { L54: assume ALIVE_turn; ALIVE_last_proc := 107; ALIVE_turn := false; return; } procedure ALIVE_Pong_Anti(); modifies ALIVE_turn; implementation ALIVE_Pong_Anti() { L55: assume !ALIVE_turn; assume ALIVE_last_proc == 107; ALIVE_turn := true; return; } procedure boogie_si_record_bool(x: bool); procedure Main(); modifies ALIVE_repeating, ALIVE_turn, ALIVE_pending; implementation Main() { var x__tmp: bool; L56: ALIVE_repeating := false; ALIVE_turn := true; ALIVE_pending := 0; assume x__tmp == x__t; call {:async 1} ALIVE_Main_ORIG(false); assume ALIVE_repeating; assume ALIVE_turn; assume x__tmp == x__t; assume x__tmp == x__f; assert false; return; }