Speculative Execution Defenses (NuSMV)¶
Description of the Case Study¶
Speculative execution can transiently execute instructions whose effects should be discarded, potentially exposing secrets via
microarchitectural channels. The benchmark suite models seven optimisation stages, each provided with a non-speculative (_nse)
and speculative (_se) version. The systems consist of two cooperating processes that manipulate shared arrays and update a
public register var_Y. The HyperLTL property demands that the public output remains zero even when speculation occurs,
capturing the absence of observable leakage.
The NuSMV model(s)¶
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
----------------------------------------------------------------
-- Flattened proc1: program(0, var_Y, var_size, offset)
----------------------------------------------------------------
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_halt : boolean;
----------------------------------------------------------------
-- Flattened proc2: program(3, var_Y, var_size, offset)
----------------------------------------------------------------
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_halt : boolean;
ASSIGN
----------------------------------------------------------------
-- Globals
----------------------------------------------------------------
init(offset) := 0;
next(offset) := offset;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
----------------------------------------------------------------
-- ========== proc1 ==========
----------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 1 & ((var_Y + offset) = 0)) : proc1_arrB_pos0;
(proc1_line = 1 & ((var_Y + offset) = 1)) : proc1_arrB_pos1;
(proc1_line = 1 & ((var_Y + offset) = 2)) : proc1_arrB_pos2;
(proc1_line = 1 & ((var_Y + offset) = 3)) : proc1_arrB_pos3;
(proc1_line = 1 & ((var_Y + offset) = 4)) : proc1_arrB_pos4;
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0; -- initline for proc1
next(proc1_line) :=
case
-- program1
(proc1_line = 0 & (var_Y >= var_size)) : 2;
(proc1_line = 0 & (var_Y < var_size)) : 1;
(proc1_line = 1) : 2;
(proc1_line = 2) : 2;
-- program2
(proc1_line = 3) : 4;
(proc1_line = 4 & (!proc1_var_X)) : 8;
(proc1_line = 4 & proc1_var_X) : 5;
(proc1_line = 5) : 6;
(proc1_line = 6) : 7;
(proc1_line = 7) : 8;
(proc1_line = 8) : 8;
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z
((proc1_line = 5) & (var_Y = 0)) : proc1_arrA_pos0;
((proc1_line = 5) & (var_Y = 1)) : proc1_arrA_pos1;
((proc1_line = 5) & (var_Y = 2)) : proc1_arrA_pos2;
((proc1_line = 5) & (var_Y = 3)) : proc1_arrA_pos3;
((proc1_line = 5) & (var_Y = 4)) : proc1_arrA_pos4;
-- shift pointer
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 0)) : proc1_var_Z + 0;
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 1)) : proc1_var_Z + 1;
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 2)) : proc1_var_Z + 2;
((proc1_line = 6) & (proc1_var_Z >= 3)) : 4;
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : proc1_arrB_pos0;
((proc1_line = 7) & (proc1_var_Z = 1)) : proc1_arrB_pos1;
((proc1_line = 7) & (proc1_var_Z = 2)) : proc1_arrB_pos2;
((proc1_line = 7) & (proc1_var_Z = 3)) : proc1_arrB_pos3;
((proc1_line = 7) & (proc1_var_Z = 4)) : proc1_arrB_pos4;
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : proc1_var_W;
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays
init(proc1_arrA_pos0) := 0; next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1; next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2; next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3; next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4; next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0; next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1; next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2; next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3; next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4; next(proc1_arrB_pos4) := proc1_arrB_pos4;
----------------------------------------------------------------
-- ========== proc2 ==========
----------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 1 & ((var_Y + offset) = 0)) : proc2_arrB_pos0;
(proc2_line = 1 & ((var_Y + offset) = 1)) : proc2_arrB_pos1;
(proc2_line = 1 & ((var_Y + offset) = 2)) : proc2_arrB_pos2;
(proc2_line = 1 & ((var_Y + offset) = 3)) : proc2_arrB_pos3;
(proc2_line = 1 & ((var_Y + offset) = 4)) : proc2_arrB_pos4;
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3; -- initline for proc2
next(proc2_line) :=
case
-- program1
(proc2_line = 0 & (var_Y >= var_size)) : 2;
(proc2_line = 0 & (var_Y < var_size)) : 1;
(proc2_line = 1) : 2;
(proc2_line = 2) : 2;
-- program2
(proc2_line = 3) : 4;
(proc2_line = 4 & (!proc2_var_X)) : 8;
(proc2_line = 4 & proc2_var_X) : 5;
(proc2_line = 5) : 6;
(proc2_line = 6) : 7;
(proc2_line = 7) : 8;
(proc2_line = 8) : 8;
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
-- load z
((proc2_line = 5) & (var_Y = 0)) : proc2_arrA_pos0;
((proc2_line = 5) & (var_Y = 1)) : proc2_arrA_pos1;
((proc2_line = 5) & (var_Y = 2)) : proc2_arrA_pos2;
((proc2_line = 5) & (var_Y = 3)) : proc2_arrA_pos3;
((proc2_line = 5) & (var_Y = 4)) : proc2_arrA_pos4;
-- shift pointer
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 0)) : proc2_var_Z + 0;
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 1)) : proc2_var_Z + 1;
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 2)) : proc2_var_Z + 2;
((proc2_line = 6) & (proc2_var_Z >= 3)) : 4;
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : proc2_arrB_pos0;
((proc2_line = 7) & (proc2_var_Z = 1)) : proc2_arrB_pos1;
((proc2_line = 7) & (proc2_var_Z = 2)) : proc2_arrB_pos2;
((proc2_line = 7) & (proc2_var_Z = 3)) : proc2_arrB_pos3;
((proc2_line = 7) & (proc2_var_Z = 4)) : proc2_arrB_pos4;
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : proc2_var_W;
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays
init(proc2_arrA_pos0) := 0; next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1; next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2; next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3; next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4; next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0; next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1; next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2; next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3; next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4; next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
----------------------------------------------------------------
-- Flattened proc1: program(0, var_Y, var_size, offset)
----------------------------------------------------------------
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_halt : boolean;
----------------------------------------------------------------
-- Flattened proc2: program(3, var_Y, var_size, offset)
----------------------------------------------------------------
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_halt : boolean;
ASSIGN
----------------------------------------------------------------
-- Shared globals
----------------------------------------------------------------
init(offset) := 0;
next(offset) := offset;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
----------------------------------------------------------------
-- proc1 assignments
----------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line=2 | proc1_line=8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line=1 & ((var_Y+offset)=0)) : proc1_arrB_pos0;
(proc1_line=1 & ((var_Y+offset)=1)) : proc1_arrB_pos1;
(proc1_line=1 & ((var_Y+offset)=2)) : proc1_arrB_pos2;
(proc1_line=1 & ((var_Y+offset)=3)) : proc1_arrB_pos3;
(proc1_line=1 & ((var_Y+offset)=4)) : proc1_arrB_pos4;
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0;
next(proc1_line) :=
case
(proc1_line=0) : {1};
(proc1_line=1) : {2};
(proc1_line=2) : {0};
(proc1_line=3) : {4};
(proc1_line=4) : {5};
(proc1_line=5) : {6};
(proc1_line=6) : {7};
(proc1_line=7) : {8};
(proc1_line=8) : {8};
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line=3) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
((proc1_line=5) & (var_Y=0)) : proc1_arrA_pos0;
((proc1_line=5) & (var_Y=1)) : proc1_arrA_pos1;
((proc1_line=5) & (var_Y=2)) : proc1_arrA_pos2;
((proc1_line=5) & (var_Y=3)) : proc1_arrA_pos3;
((proc1_line=5) & (var_Y=4)) : proc1_arrA_pos4;
((proc1_line=6) & (proc1_var_Z<3) & (offset=0)) : (proc1_var_Z+0);
((proc1_line=6) & (proc1_var_Z<3) & (offset=1)) : (proc1_var_Z+1);
((proc1_line=6) & (proc1_var_Z<3) & (offset=2)) : (proc1_var_Z+2);
((proc1_line=6) & (proc1_var_Z>=3)) : {4};
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line=7) & (proc1_var_Z=0)) : proc1_arrB_pos0;
((proc1_line=7) & (proc1_var_Z=1)) : proc1_arrB_pos1;
((proc1_line=7) & (proc1_var_Z=2)) : proc1_arrB_pos2;
((proc1_line=7) & (proc1_var_Z=3)) : proc1_arrB_pos3;
((proc1_line=7) & (proc1_var_Z=4)) : proc1_arrB_pos4;
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line=8): proc1_var_W;
TRUE: proc1_var_temp_proc2;
esac;
-- static arrays
init(proc1_arrA_pos0) := 0; next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1; next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2; next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3; next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4; next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0; next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1; next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2; next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3; next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4; next(proc1_arrB_pos4) := proc1_arrB_pos4;
----------------------------------------------------------------
-- proc2 assignments (same as proc1, but prefixed proc2_ and initline=3)
----------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line=2 | proc2_line=8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line=1 & ((var_Y+offset)=0)) : proc2_arrB_pos0;
(proc2_line=1 & ((var_Y+offset)=1)) : proc2_arrB_pos1;
(proc2_line=1 & ((var_Y+offset)=2)) : proc2_arrB_pos2;
(proc2_line=1 & ((var_Y+offset)=3)) : proc2_arrB_pos3;
(proc2_line=1 & ((var_Y+offset)=4)) : proc2_arrB_pos4;
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3; -- <-- initline = 3 for proc2
next(proc2_line) :=
case
(proc2_line=0) : {1};
(proc2_line=1) : {2};
(proc2_line=2) : {0};
(proc2_line=3) : {4};
(proc2_line=4) : {5};
(proc2_line=5) : {6};
(proc2_line=6) : {7};
(proc2_line=7) : {8};
(proc2_line=8) : {8};
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line=3) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
((proc2_line=5) & (var_Y=0)) : proc2_arrA_pos0;
((proc2_line=5) & (var_Y=1)) : proc2_arrA_pos1;
((proc2_line=5) & (var_Y=2)) : proc2_arrA_pos2;
((proc2_line=5) & (var_Y=3)) : proc2_arrA_pos3;
((proc2_line=5) & (var_Y=4)) : proc2_arrA_pos4;
((proc2_line=6) & (proc2_var_Z<3) & (offset=0)) : (proc2_var_Z+0);
((proc2_line=6) & (proc2_var_Z<3) & (offset=1)) : (proc2_var_Z+1);
((proc2_line=6) & (proc2_var_Z<3) & (offset=2)) : (proc2_var_Z+2);
((proc2_line=6) & (proc2_var_Z>=3)) : {4};
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line=7) & (proc2_var_Z=0)) : proc2_arrB_pos0;
((proc2_line=7) & (proc2_var_Z=1)) : proc2_arrB_pos1;
((proc2_line=7) & (proc2_var_Z=2)) : proc2_arrB_pos2;
((proc2_line=7) & (proc2_var_Z=3)) : proc2_arrB_pos3;
((proc2_line=7) & (proc2_var_Z=4)) : proc2_arrB_pos4;
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line=8): proc2_var_W;
TRUE: proc2_var_temp_proc2;
esac;
-- static arrays
init(proc2_arrA_pos0) := 0; next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1; next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2; next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3; next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4; next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0; next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1; next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2; next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3; next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4; next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
----------------------------------------------------------------
-- Flattened proc1: program(0, var_Y, var_size, offset)
----------------------------------------------------------------
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_k : 0..4;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
----------------------------------------------------------------
-- Flattened proc2: program(3, var_Y, var_size, offset)
----------------------------------------------------------------
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_k : 0..4;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
halt : boolean;
ASSIGN
----------------------------------------------------------------
-- Shared globals (from main)
----------------------------------------------------------------
init(halt) := FALSE;
next(halt) := (proc1_halt & proc2_halt);
next(offset) := offset;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
----------------------------------------------------------------
-- ========== proc1 ==========
----------------------------------------------------------------
-- halt
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
-- k
init(proc1_k) := 4;
next(proc1_k) := proc1_k;
-- mask
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !proc1_var_X) : 0;
((proc1_line = 2) & proc1_var_X) : 1;
TRUE : proc1_mask;
esac;
-- var_temp_proc1
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 2 & ((var_Y + offset) = 0)) : {proc1_arrB_pos0};
TRUE : proc1_var_temp_proc1;
esac;
-- line (initline = 0)
init(proc1_line) := 0;
next(proc1_line) :=
case
-- program1
(proc1_line = 0 & (var_Y >= var_size)) : {3};
(proc1_line = 0 & (var_Y < var_size)) : {1};
(proc1_line = 1) : {2};
(proc1_line = 2) : {2};
-- program2
(proc1_line = 3) : {4};
(proc1_line = 4 & (!proc1_var_X)) : {8};
(proc1_line = 4 & proc1_var_X) : {5};
(proc1_line = 5) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {8};
TRUE : proc1_line;
esac;
-- var_X
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
-- var_Z
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z
((proc1_line = 5) & (var_Y = 0)) : {proc1_arrA_pos0};
((proc1_line = 5) & (var_Y = 1)) : {proc1_arrA_pos1};
((proc1_line = 5) & (var_Y = 2)) : {proc1_arrA_pos2};
((proc1_line = 5) & (var_Y = 3)) : {proc1_arrA_pos3};
((proc1_line = 5) & (var_Y = 4)) : {proc1_arrA_pos4};
-- masked shift
((proc1_line = 6) & (proc1_mask = 0)) : {0};
TRUE : proc1_var_Z;
esac;
-- var_W
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : {proc1_arrB_pos0};
((proc1_line = 7) & (proc1_var_Z = 1)) : {proc1_arrB_pos1};
((proc1_line = 7) & (proc1_var_Z = 2)) : {proc1_arrB_pos2};
((proc1_line = 7) & (proc1_var_Z = 3)) : {proc1_arrB_pos3};
((proc1_line = 7) & (proc1_var_Z = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_W;
esac;
-- var_temp_proc2
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : {proc1_var_W};
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays
init(proc1_arrA_pos0) := 0; next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1; next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2; next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3; next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4; next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0; next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1; next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2; next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3; next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4; next(proc1_arrB_pos4) := proc1_arrB_pos4;
----------------------------------------------------------------
-- ========== proc2 ==========
----------------------------------------------------------------
-- halt
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
-- k
init(proc2_k) := 4;
next(proc2_k) := proc2_k;
-- mask
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !proc2_var_X) : 0;
((proc2_line = 2) & proc2_var_X) : 1;
TRUE : proc2_mask;
esac;
-- var_temp_proc1
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 2 & ((var_Y + offset) = 0)) : {proc2_arrB_pos0};
TRUE : proc2_var_temp_proc1;
esac;
-- line (initline = 3)
init(proc2_line) := 3;
next(proc2_line) :=
case
-- program1
(proc2_line = 0 & (var_Y >= var_size)) : {3};
(proc2_line = 0 & (var_Y < var_size)) : {1};
(proc2_line = 1) : {2};
(proc2_line = 2) : {2};
-- program2
(proc2_line = 3) : {4};
(proc2_line = 4 & (!proc2_var_X)) : {8};
(proc2_line = 4 & proc2_var_X) : {5};
(proc2_line = 5) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {8};
TRUE : proc2_line;
esac;
-- var_X
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
-- var_Z
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
-- load z
((proc2_line = 5) & (var_Y = 0)) : {proc2_arrA_pos0};
((proc2_line = 5) & (var_Y = 1)) : {proc2_arrA_pos1};
((proc2_line = 5) & (var_Y = 2)) : {proc2_arrA_pos2};
((proc2_line = 5) & (var_Y = 3)) : {proc2_arrA_pos3};
((proc2_line = 5) & (var_Y = 4)) : {proc2_arrA_pos4};
-- masked shift
((proc2_line = 6) & (proc2_mask = 0)) : {0};
TRUE : proc2_var_Z;
esac;
-- var_W
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : {proc2_arrB_pos0};
((proc2_line = 7) & (proc2_var_Z = 1)) : {proc2_arrB_pos1};
((proc2_line = 7) & (proc2_var_Z = 2)) : {proc2_arrB_pos2};
((proc2_line = 7) & (proc2_var_Z = 3)) : {proc2_arrB_pos3};
((proc2_line = 7) & (proc2_var_Z = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_W;
esac;
-- var_temp_proc2
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : {proc2_var_W};
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays
init(proc2_arrA_pos0) := 0; next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1; next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2; next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3; next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4; next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0; next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1; next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2; next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3; next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4; next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
-- top-level vars
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
-- program instance: proc1 = program(0, var_Y, var_size, offset)
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_k : 0..4;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- program instance: proc2 = program(3, var_Y, var_size, offset)
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_k : 0..4;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
halt : boolean;
ASSIGN
init(halt) := FALSE;
next(halt) := (proc1_halt & proc2_halt);
-- original main assignments
next(offset) := offset;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
----------------------------------------------------------------
-- proc1 = program(0, var_Y, var_size, offset)
----------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_k) := 4;
next(proc1_k) := proc1_k;
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 1 & ((var_Y + offset) = 0)) : proc1_arrB_pos0;
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0; -- initline = 0
next(proc1_line) :=
case
(proc1_line = 0) : {1};
(proc1_line = 1) : {2};
(proc1_line = 2) : {0};
(proc1_line = 3) : {4};
(proc1_line = 4) : {5};
(proc1_line = 5) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {3};
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
((proc1_line = 5) & (var_Y = 0)) : {proc1_arrA_pos0};
((proc1_line = 5) & (var_Y = 1)) : {proc1_arrA_pos1};
((proc1_line = 5) & (var_Y = 2)) : {proc1_arrA_pos2};
((proc1_line = 5) & (var_Y = 3)) : {proc1_arrA_pos3};
((proc1_line = 5) & (var_Y = 4)) : {proc1_arrA_pos4};
((proc1_line = 6) & (proc1_mask = 0)) : {0};
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : {proc1_arrB_pos0};
((proc1_line = 7) & (proc1_var_Z = 1)) : {proc1_arrB_pos1};
((proc1_line = 7) & (proc1_var_Z = 2)) : {proc1_arrB_pos2};
((proc1_line = 7) & (proc1_var_Z = 3)) : {proc1_arrB_pos3};
((proc1_line = 7) & (proc1_var_Z = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : {proc1_var_W};
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays for proc1
init(proc1_arrA_pos0) := 0; next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1; next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2; next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3; next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4; next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0; next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1; next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2; next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3; next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4; next(proc1_arrB_pos4) := proc1_arrB_pos4;
----------------------------------------------------------------
-- proc2 = program(3, var_Y, var_size, offset)
----------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_k) := 4;
next(proc2_k) := proc2_k;
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 1 & ((var_Y + offset) = 0)) : {proc2_arrB_pos0};
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3; -- initline = 3
next(proc2_line) :=
case
(proc2_line = 0) : {1};
(proc2_line = 1) : {2};
(proc2_line = 2) : {0};
(proc2_line = 3) : {4};
(proc2_line = 4) : {5};
(proc2_line = 5) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {3};
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
((proc2_line = 5) & (var_Y = 0)) : {proc2_arrA_pos0};
((proc2_line = 5) & (var_Y = 1)) : {proc2_arrA_pos1};
((proc2_line = 5) & (var_Y = 2)) : {proc2_arrA_pos2};
((proc2_line = 5) & (var_Y = 3)) : {proc2_arrA_pos3};
((proc2_line = 5) & (var_Y = 4)) : {proc2_arrA_pos4};
((proc2_line = 6) & (proc2_mask = 0)) : {0};
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : {proc2_arrB_pos0};
((proc2_line = 7) & (proc2_var_Z = 1)) : {proc2_arrB_pos1};
((proc2_line = 7) & (proc2_var_Z = 2)) : {proc2_arrB_pos2};
((proc2_line = 7) & (proc2_var_Z = 3)) : {proc2_arrB_pos3};
((proc2_line = 7) & (proc2_var_Z = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : {proc2_var_W};
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays for proc2
init(proc2_arrA_pos0) := 0; next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1; next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2; next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3; next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4; next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0; next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1; next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2; next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3; next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4; next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
k : 0..4;
-- proc1 (program(0, var_Y, var_size, offset, k))
proc1_line : 0..9;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_check_Ay_eq_k : boolean;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- proc2 (program(3, var_Y, var_size, offset, k))
proc2_line : 0..9;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_check_Ay_eq_k : boolean;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
ASSIGN
----------------------------------------------------------------
-- main vars
----------------------------------------------------------------
next(offset) := offset; -- (init(offset) commented out per input)
next(var_Y) := var_Y; -- (init(var_Y) commented out per input)
init(var_size) := 4;
next(var_size) := var_size;
init(k) := 3;
next(k) := k;
----------------------------------------------------------------
-- proc1: program(0, var_Y, var_size, offset, k)
----------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 3 | proc1_line = 9) : TRUE;
TRUE : FALSE;
esac;
init(proc1_check_Ay_eq_k) :=
(var_Y = 0 & k = 0) | (var_Y = 1 & k = 1)
| (var_Y = 2 & k = 2) | (var_Y = 3 & k = 3)
| (var_Y = 4 & k = 4) | (var_Y = 5 & k = 5)
| (var_Y = 6 & k = 6) | (var_Y = 7 & k = 7);
next(proc1_check_Ay_eq_k) := proc1_check_Ay_eq_k;
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 2 & ((var_Y + offset) = 0)) : { proc1_arrB_pos0 };
(proc1_line = 2 & ((var_Y + offset) = 1)) : { proc1_arrB_pos1 };
(proc1_line = 2 & ((var_Y + offset) = 2)) : { proc1_arrB_pos2 };
(proc1_line = 2 & ((var_Y + offset) = 3)) : { proc1_arrB_pos3 };
(proc1_line = 2 & ((var_Y + offset) = 4)) : { proc1_arrB_pos4 };
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0; -- initline
next(proc1_line) :=
case
-- program1
(proc1_line = 0 & (var_Y >= var_size)) : {3}; -- terminate
(proc1_line = 0 & (var_Y < var_size)) : {1}; -- proceed
(proc1_line = 1 & !proc1_check_Ay_eq_k) : {3};
(proc1_line = 1 & proc1_check_Ay_eq_k) : {2};
(proc1_line = 2) : {3};
(proc1_line = 3) : {3};
-- program2
(proc1_line = 4) : {5};
(proc1_line = 5 & (!proc1_var_X)) : {9};
(proc1_line = 5 & (proc1_var_X)) : {6};
(proc1_line = 6) : {7}; -- load z
(proc1_line = 7) : {8}; -- shift pointer
(proc1_line = 8) : {9}; -- load w
(proc1_line = 9) : {9};
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 4) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z: only var_Y=1..4 present in this module
((proc1_line = 6) & (var_Y = 1)) : { proc1_arrA_pos1 };
((proc1_line = 6) & (var_Y = 2)) : { proc1_arrA_pos2 };
((proc1_line = 6) & (var_Y = 3)) : { proc1_arrA_pos3 };
((proc1_line = 6) & (var_Y = 4)) : { proc1_arrA_pos4 };
-- shift pointer
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 0)) : { proc1_var_Z + 0 };
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 1)) : { proc1_var_Z + 1 };
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 2)) : { proc1_var_Z + 2 };
((proc1_line = 7) & (proc1_var_Z >= 3)) : { 4 };
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 8) & (proc1_var_Z = 0)) : { proc1_arrB_pos0 };
((proc1_line = 8) & (proc1_var_Z = 1)) : { proc1_arrB_pos1 };
((proc1_line = 8) & (proc1_var_Z = 2)) : { proc1_arrB_pos2 };
((proc1_line = 8) & (proc1_var_Z = 3)) : { proc1_arrB_pos3 };
((proc1_line = 8) & (proc1_var_Z = 4)) : { proc1_arrB_pos4 };
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 9) : { proc1_var_W };
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays for proc1
init(proc1_arrA_pos0) := 0; next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1; next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2; next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3; next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4; next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0; next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1; next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2; next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3; next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4; next(proc1_arrB_pos4) := proc1_arrB_pos4;
----------------------------------------------------------------
-- proc2: program(3, var_Y, var_size, offset, k)
----------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 3 | proc2_line = 9) : TRUE;
TRUE : FALSE;
esac;
init(proc2_check_Ay_eq_k) :=
(var_Y = 0 & k = 0) | (var_Y = 1 & k = 1)
| (var_Y = 2 & k = 2) | (var_Y = 3 & k = 3)
| (var_Y = 4 & k = 4) | (var_Y = 5 & k = 5)
| (var_Y = 6 & k = 6) | (var_Y = 7 & k = 7);
next(proc2_check_Ay_eq_k) := proc2_check_Ay_eq_k;
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 2 & ((var_Y + offset) = 0)) : { proc2_arrB_pos0 };
(proc2_line = 2 & ((var_Y + offset) = 1)) : { proc2_arrB_pos1 };
(proc2_line = 2 & ((var_Y + offset) = 2)) : { proc2_arrB_pos2 };
(proc2_line = 2 & ((var_Y + offset) = 3)) : { proc2_arrB_pos3 };
(proc2_line = 2 & ((var_Y + offset) = 4)) : { proc2_arrB_pos4 };
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3; -- initline
next(proc2_line) :=
case
-- program1
(proc2_line = 0 & (var_Y >= var_size)) : {3};
(proc2_line = 0 & (var_Y < var_size)) : {1};
(proc2_line = 1 & !proc2_check_Ay_eq_k) : {3};
(proc2_line = 1 & proc2_check_Ay_eq_k) : {2};
(proc2_line = 2) : {3};
(proc2_line = 3) : {3};
-- program2
(proc2_line = 4) : {5};
(proc2_line = 5 & (!proc2_var_X)) : {9};
(proc2_line = 5 & (proc2_var_X)) : {6};
(proc2_line = 6) : {7}; -- load z
(proc2_line = 7) : {8}; -- shift pointer
(proc2_line = 8) : {9}; -- load w
(proc2_line = 9) : {9};
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 4) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
((proc2_line = 6) & (var_Y = 1)) : { proc2_arrA_pos1 };
((proc2_line = 6) & (var_Y = 2)) : { proc2_arrA_pos2 };
((proc2_line = 6) & (var_Y = 3)) : { proc2_arrA_pos3 };
((proc2_line = 6) & (var_Y = 4)) : { proc2_arrA_pos4 };
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 0)) : { proc2_var_Z + 0 };
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 1)) : { proc2_var_Z + 1 };
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 2)) : { proc2_var_Z + 2 };
((proc2_line = 7) & (proc2_var_Z >= 3)) : { 4 };
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 8) & (proc2_var_Z = 0)) : { proc2_arrB_pos0 };
((proc2_line = 8) & (proc2_var_Z = 1)) : { proc2_arrB_pos1 };
((proc2_line = 8) & (proc2_var_Z = 2)) : { proc2_arrB_pos2 };
((proc2_line = 8) & (proc2_var_Z = 3)) : { proc2_arrB_pos3 };
((proc2_line = 8) & (proc2_var_Z = 4)) : { proc2_arrB_pos4 };
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 9) : { proc2_var_W };
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays for proc2
init(proc2_arrA_pos0) := 0; next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1; next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2; next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3; next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4; next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0; next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1; next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2; next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3; next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4; next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
k : 0..4;
-- proc1 (program(0, var_Y, var_size, offset, k))
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_check_Ay_eq_k : boolean;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- proc2 (program(3, var_Y, var_size, offset, k))
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_check_Ay_eq_k : boolean;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
ASSIGN
-- main vars
next(offset) := offset;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
init(k) := 3;
next(k) := k;
----------------------------------------------------------------
-- proc1: program(0, var_Y, var_size, offset, k)
----------------------------------------------------------------
-- halt
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
-- check_Ay_eq_k
init(proc1_check_Ay_eq_k) :=
(var_Y = 0 & k = 0) | (var_Y = 1 & k = 1)
| (var_Y = 2 & k = 2) | (var_Y = 3 & k = 3)
| (var_Y = 4 & k = 4) | (var_Y = 5 & k = 5)
| (var_Y = 6 & k = 6) | (var_Y = 7 & k = 7);
next(proc1_check_Ay_eq_k) := proc1_check_Ay_eq_k;
-- mask
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
-- proc1_var_temp_proc1
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 1 & ((var_Y + offset) = 0)) : { proc1_arrB_pos0 };
(proc1_line = 1 & ((var_Y + offset) = 1)) : { proc1_arrB_pos1 };
(proc1_line = 1 & ((var_Y + offset) = 2)) : { proc1_arrB_pos2 };
(proc1_line = 1 & ((var_Y + offset) = 3)) : { proc1_arrB_pos3 };
(proc1_line = 1 & ((var_Y + offset) = 4)) : { proc1_arrB_pos4 };
TRUE : proc1_var_temp_proc1;
esac;
-- line
init(proc1_line) := 0; -- initline
next(proc1_line) :=
case
(proc1_line = 0) : {1};
(proc1_line = 1) : {2};
(proc1_line = 2) : {0};
(proc1_line = 3) : {4};
(proc1_line = 4) : {5};
(proc1_line = 5) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {3};
TRUE : proc1_line;
esac;
-- var_X
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
-- var_Z
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z
((proc1_line = 5) & (var_Y = 0)) : { proc1_arrA_pos0 };
((proc1_line = 5) & (var_Y = 1)) : { proc1_arrA_pos1 };
((proc1_line = 5) & (var_Y = 2)) : { proc1_arrA_pos2 };
((proc1_line = 5) & (var_Y = 3)) : { proc1_arrA_pos3 };
((proc1_line = 5) & (var_Y = 4)) : { proc1_arrA_pos4 };
-- shift pointer
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 0)) : { proc1_var_Z + 0 };
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 1)) : { proc1_var_Z + 1 };
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 2)) : { proc1_var_Z + 2 };
((proc1_line = 6) & (proc1_var_Z >= 3)) : { 4 };
TRUE : proc1_var_Z;
esac;
-- var_W
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : { proc1_arrB_pos0 };
((proc1_line = 7) & (proc1_var_Z = 1)) : { proc1_arrB_pos1 };
((proc1_line = 7) & (proc1_var_Z = 2)) : { proc1_arrB_pos2 };
((proc1_line = 7) & (proc1_var_Z = 3)) : { proc1_arrB_pos3 };
((proc1_line = 7) & (proc1_var_Z = 4)) : { proc1_arrB_pos4 };
TRUE : proc1_var_W;
esac;
-- var_temp_proc2
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : { proc1_var_W };
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays A
init(proc1_arrA_pos0) := 0; next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1; next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2; next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3; next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4; next(proc1_arrA_pos4) := proc1_arrA_pos4;
-- static arrays B
init(proc1_arrB_pos0) := 0; next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1; next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2; next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3; next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4; next(proc1_arrB_pos4) := proc1_arrB_pos4;
----------------------------------------------------------------
-- proc2: program(3, var_Y, var_size, offset, k)
----------------------------------------------------------------
-- halt
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
-- check_Ay_eq_k
init(proc2_check_Ay_eq_k) :=
(var_Y = 0 & k = 0) | (var_Y = 1 & k = 1)
| (var_Y = 2 & k = 2) | (var_Y = 3 & k = 3)
| (var_Y = 4 & k = 4) | (var_Y = 5 & k = 5)
| (var_Y = 6 & k = 6) | (var_Y = 7 & k = 7);
next(proc2_check_Ay_eq_k) := proc2_check_Ay_eq_k;
-- mask
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
-- proc2_var_temp_proc1
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 1 & ((var_Y + offset) = 0)) : { proc2_arrB_pos0 };
(proc2_line = 1 & ((var_Y + offset) = 1)) : { proc2_arrB_pos1 };
(proc2_line = 1 & ((var_Y + offset) = 2)) : { proc2_arrB_pos2 };
(proc2_line = 1 & ((var_Y + offset) = 3)) : { proc2_arrB_pos3 };
(proc2_line = 1 & ((var_Y + offset) = 4)) : { proc2_arrB_pos4 };
TRUE : proc2_var_temp_proc1;
esac;
-- line
init(proc2_line) := 3; -- initline
next(proc2_line) :=
case
(proc2_line = 0) : {1};
(proc2_line = 1) : {2};
(proc2_line = 2) : {0};
(proc2_line = 3) : {4};
(proc2_line = 4) : {5};
(proc2_line = 5) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {3};
TRUE : proc2_line;
esac;
-- var_X
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
-- var_Z
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
-- load z
((proc2_line = 5) & (var_Y = 0)) : { proc2_arrA_pos0 };
((proc2_line = 5) & (var_Y = 1)) : { proc2_arrA_pos1 };
((proc2_line = 5) & (var_Y = 2)) : { proc2_arrA_pos2 };
((proc2_line = 5) & (var_Y = 3)) : { proc2_arrA_pos3 };
((proc2_line = 5) & (var_Y = 4)) : { proc2_arrA_pos4 };
-- shift pointer
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 0)) : { proc2_var_Z + 0 };
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 1)) : { proc2_var_Z + 1 };
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 2)) : { proc2_var_Z + 2 };
((proc2_line = 6) & (proc2_var_Z >= 3)) : { 4 };
TRUE : proc2_var_Z;
esac;
-- var_W
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : { proc2_arrB_pos0 };
((proc2_line = 7) & (proc2_var_Z = 1)) : { proc2_arrB_pos1 };
((proc2_line = 7) & (proc2_var_Z = 2)) : { proc2_arrB_pos2 };
((proc2_line = 7) & (proc2_var_Z = 3)) : { proc2_arrB_pos3 };
((proc2_line = 7) & (proc2_var_Z = 4)) : { proc2_arrB_pos4 };
TRUE : proc2_var_W;
esac;
-- var_temp_proc2
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : { proc2_var_W };
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays A
init(proc2_arrA_pos0) := 0; next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1; next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2; next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3; next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4; next(proc2_arrA_pos4) := proc2_arrA_pos4;
-- static arrays B
init(proc2_arrB_pos0) := 0; next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1; next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2; next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3; next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4; next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
k : 0..4;
-- proc1 = program(0, var_Y, var_size, offset, k)
proc1_line : 0..9;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_check_Ay_lt_k : boolean;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- proc2 = program(3, var_Y, var_size, offset, k)
proc2_line : 0..9;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_check_Ay_lt_k : boolean;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
ASSIGN
-- main variables
next(offset) := offset;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
init(k) := 3;
next(k) := k;
----------------------------------------------------------------
-- proc1 instance (initline = 0)
----------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 3 | proc1_line = 9) : TRUE;
TRUE : FALSE;
esac;
-- check_Ay_lt_k (as given)
init(proc1_check_Ay_lt_k) :=
(var_Y = 0 & (k = 1 | k = 2 | k = 3 | k = 4))
| (var_Y = 1 & (k = 2 | k = 3 | k = 4))
| (var_Y = 2 & (k = 3 | k = 4));
next(proc1_check_Ay_lt_k) := proc1_check_Ay_lt_k;
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 2 & ((var_Y + offset) = 0)) : { proc1_arrB_pos0 };
(proc1_line = 2 & ((var_Y + offset) = 1)) : { proc1_arrB_pos1 };
(proc1_line = 2 & ((var_Y + offset) = 2)) : { proc1_arrB_pos2 };
(proc1_line = 2 & ((var_Y + offset) = 3)) : { proc1_arrB_pos3 };
(proc1_line = 2 & ((var_Y + offset) = 4)) : { proc1_arrB_pos4 };
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0;
next(proc1_line) :=
case
-- program1
(proc1_line = 0 & (var_Y >= var_size)) : { 3 };
(proc1_line = 0 & (var_Y < var_size)) : { 1 };
(proc1_line = 1 & !proc1_check_Ay_lt_k) : { 3 };
(proc1_line = 1 & proc1_check_Ay_lt_k) : { 2 };
(proc1_line = 2) : { 3 };
(proc1_line = 3) : { 3 };
-- program2
(proc1_line = 4) : { 5 };
(proc1_line = 5 & (!proc1_var_X)) : { 9 };
(proc1_line = 5 & ( proc1_var_X)) : { 6 };
(proc1_line = 6) : { 7 };
(proc1_line = 7) : { 8 };
(proc1_line = 8) : { 9 };
(proc1_line = 9) : { 9 };
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 4) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z
((proc1_line = 6) & (var_Y = 1)) : { proc1_arrA_pos1 };
((proc1_line = 6) & (var_Y = 2)) : { proc1_arrA_pos2 };
((proc1_line = 6) & (var_Y = 3)) : { proc1_arrA_pos3 };
((proc1_line = 6) & (var_Y = 4)) : { proc1_arrA_pos4 };
-- shift pointer
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 0)) : { proc1_var_Z + 0 };
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 1)) : { proc1_var_Z + 1 };
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 2)) : { proc1_var_Z + 2 };
((proc1_line = 7) & (proc1_var_Z >= 3)) : { 4 };
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 8) & (proc1_var_Z = 0)) : { proc1_arrB_pos0 };
((proc1_line = 8) & (proc1_var_Z = 1)) : { proc1_arrB_pos1 };
((proc1_line = 8) & (proc1_var_Z = 2)) : { proc1_arrB_pos2 };
((proc1_line = 8) & (proc1_var_Z = 3)) : { proc1_arrB_pos3 };
((proc1_line = 8) & (proc1_var_Z = 4)) : { proc1_arrB_pos4 };
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 9) : { proc1_var_W };
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays (proc1)
init(proc1_arrA_pos0) := 0;
next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1;
next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2;
next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3;
next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4;
next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0;
next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1;
next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2;
next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3;
next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4;
next(proc1_arrB_pos4) := proc1_arrB_pos4;
----------------------------------------------------------------
-- proc2 instance (initline = 3)
----------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 3 | proc2_line = 9) : TRUE;
TRUE : FALSE;
esac;
init(proc2_check_Ay_lt_k) :=
(var_Y = 0 & (k = 1 | k = 2 | k = 3 | k = 4))
| (var_Y = 1 & (k = 2 | k = 3 | k = 4))
| (var_Y = 2 & (k = 3 | k = 4));
next(proc2_check_Ay_lt_k) := proc2_check_Ay_lt_k;
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 2 & ((var_Y + offset) = 0)) : { proc2_arrB_pos0 };
(proc2_line = 2 & ((var_Y + offset) = 1)) : { proc2_arrB_pos1 };
(proc2_line = 2 & ((var_Y + offset) = 2)) : { proc2_arrB_pos2 };
(proc2_line = 2 & ((var_Y + offset) = 3)) : { proc2_arrB_pos3 };
(proc2_line = 2 & ((var_Y + offset) = 4)) : { proc2_arrB_pos4 };
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3;
next(proc2_line) :=
case
-- program1
(proc2_line = 0 & (var_Y >= var_size)) : { 3 };
(proc2_line = 0 & (var_Y < var_size)) : { 1 };
(proc2_line = 1 & !proc2_check_Ay_lt_k) : { 3 };
(proc2_line = 1 & proc2_check_Ay_lt_k) : { 2 };
(proc2_line = 2) : { 3 };
(proc2_line = 3) : { 3 };
-- program2
(proc2_line = 4) : { 5 };
(proc2_line = 5 & (!proc2_var_X)) : { 9 };
(proc2_line = 5 & ( proc2_var_X)) : { 6 };
(proc2_line = 6) : { 7 };
(proc2_line = 7) : { 8 };
(proc2_line = 8) : { 9 };
(proc2_line = 9) : { 9 };
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 4) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
-- load z
((proc2_line = 6) & (var_Y = 1)) : { proc2_arrA_pos1 };
((proc2_line = 6) & (var_Y = 2)) : { proc2_arrA_pos2 };
((proc2_line = 6) & (var_Y = 3)) : { proc2_arrA_pos3 };
((proc2_line = 6) & (var_Y = 4)) : { proc2_arrA_pos4 };
-- shift pointer
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 0)) : { proc2_var_Z + 0 };
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 1)) : { proc2_var_Z + 1 };
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 2)) : { proc2_var_Z + 2 };
((proc2_line = 7) & (proc2_var_Z >= 3)) : { 4 };
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 8) & (proc2_var_Z = 0)) : { proc2_arrB_pos0 };
((proc2_line = 8) & (proc2_var_Z = 1)) : { proc2_arrB_pos1 };
((proc2_line = 8) & (proc2_var_Z = 2)) : { proc2_arrB_pos2 };
((proc2_line = 8) & (proc2_var_Z = 3)) : { proc2_arrB_pos3 };
((proc2_line = 8) & (proc2_var_Z = 4)) : { proc2_arrB_pos4 };
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 9) : { proc2_var_W };
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays (proc2)
init(proc2_arrA_pos0) := 0;
next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1;
next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2;
next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3;
next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4;
next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0;
next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1;
next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2;
next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3;
next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4;
next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
k : 0..4;
-- proc1 = program(0, var_Y, var_size, offset, k)
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_check_Ay_lt_k : boolean;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- proc2 = program(3, var_Y, var_size, offset, k)
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_check_Ay_lt_k : boolean;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
ASSIGN
----------------------------------------------------------------
-- main variables (as in your model)
----------------------------------------------------------------
next(offset) := offset; -- init(offset) commented in source
next(var_Y) := var_Y; -- init(var_Y) commented in source
init(var_size) := 4;
next(var_size) := var_size;
init(k) := 3;
next(k) := k;
----------------------------------------------------------------
-- proc1 instance (initline = 0)
----------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_check_Ay_lt_k) :=
(var_Y = 0 & (k = 1 | k = 2 | k = 3 | k = 4))
| (var_Y = 1 & (k = 2 | k = 3 | k = 4))
| (var_Y = 2 & (k = 3 | k = 4));
next(proc1_check_Ay_lt_k) := proc1_check_Ay_lt_k;
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 1 & ((var_Y + offset) = 0)) : { proc1_arrB_pos0 };
(proc1_line = 1 & ((var_Y + offset) = 1)) : { proc1_arrB_pos1 };
(proc1_line = 1 & ((var_Y + offset) = 2)) : { proc1_arrB_pos2 };
(proc1_line = 1 & ((var_Y + offset) = 3)) : { proc1_arrB_pos3 };
(proc1_line = 1 & ((var_Y + offset) = 4)) : { proc1_arrB_pos4 };
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0; -- initline
next(proc1_line) :=
case
-- program1
(proc1_line = 0) : { 1 };
(proc1_line = 1) : { 2 };
(proc1_line = 2) : { 0 };
-- program2
(proc1_line = 3) : { 4 };
(proc1_line = 4) : { 5 };
(proc1_line = 5) : { 6 };
(proc1_line = 6) : { 7 };
(proc1_line = 7) : { 8 };
(proc1_line = 8) : { 3 };
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z
((proc1_line = 5) & (var_Y = 0)) : { proc1_arrA_pos0 };
((proc1_line = 5) & (var_Y = 1)) : { proc1_arrA_pos1 };
((proc1_line = 5) & (var_Y = 2)) : { proc1_arrA_pos2 };
((proc1_line = 5) & (var_Y = 3)) : { proc1_arrA_pos3 };
((proc1_line = 5) & (var_Y = 4)) : { proc1_arrA_pos4 };
-- shift pointer
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 0)) : { proc1_var_Z + 0 };
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 1)) : { proc1_var_Z + 1 };
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 2)) : { proc1_var_Z + 2 };
((proc1_line = 6) & (proc1_var_Z >= 3)) : { 4 };
-- original mask-based alternative was commented in source
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : { proc1_arrB_pos0 };
((proc1_line = 7) & (proc1_var_Z = 1)) : { proc1_arrB_pos1 };
((proc1_line = 7) & (proc1_var_Z = 2)) : { proc1_arrB_pos2 };
((proc1_line = 7) & (proc1_var_Z = 3)) : { proc1_arrB_pos3 };
((proc1_line = 7) & (proc1_var_Z = 4)) : { proc1_arrB_pos4 };
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : { proc1_var_W };
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays (proc1)
init(proc1_arrA_pos0) := 0;
next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1;
next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2;
next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3;
next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4;
next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0;
next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1;
next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2;
next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3;
next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4;
next(proc1_arrB_pos4) := proc1_arrB_pos4;
----------------------------------------------------------------
-- proc2 instance (initline = 3)
----------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_check_Ay_lt_k) :=
(var_Y = 0 & (k = 1 | k = 2 | k = 3 | k = 4))
| (var_Y = 1 & (k = 2 | k = 3 | k = 4))
| (var_Y = 2 & (k = 3 | k = 4));
next(proc2_check_Ay_lt_k) := proc2_check_Ay_lt_k;
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 1 & ((var_Y + offset) = 0)) : { proc2_arrB_pos0 };
(proc2_line = 1 & ((var_Y + offset) = 1)) : { proc2_arrB_pos1 };
(proc2_line = 1 & ((var_Y + offset) = 2)) : { proc2_arrB_pos2 };
(proc2_line = 1 & ((var_Y + offset) = 3)) : { proc2_arrB_pos3 };
(proc2_line = 1 & ((var_Y + offset) = 4)) : { proc2_arrB_pos4 };
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3; -- initline
next(proc2_line) :=
case
-- program1
(proc2_line = 0) : { 1 };
(proc2_line = 1) : { 2 };
(proc2_line = 2) : { 0 };
-- program2
(proc2_line = 3) : { 4 };
(proc2_line = 4) : { 5 };
(proc2_line = 5) : { 6 };
(proc2_line = 6) : { 7 };
(proc2_line = 7) : { 8 };
(proc2_line = 8) : { 3 };
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
-- load z
((proc2_line = 5) & (var_Y = 0)) : { proc2_arrA_pos0 };
((proc2_line = 5) & (var_Y = 1)) : { proc2_arrA_pos1 };
((proc2_line = 5) & (var_Y = 2)) : { proc2_arrA_pos2 };
((proc2_line = 5) & (var_Y = 3)) : { proc2_arrA_pos3 };
((proc2_line = 5) & (var_Y = 4)) : { proc2_arrA_pos4 };
-- shift pointer
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 0)) : { proc2_var_Z + 0 };
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 1)) : { proc2_var_Z + 1 };
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 2)) : { proc2_var_Z + 2 };
((proc2_line = 6) & (proc2_var_Z >= 3)) : { 4 };
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : { proc2_arrB_pos0 };
((proc2_line = 7) & (proc2_var_Z = 1)) : { proc2_arrB_pos1 };
((proc2_line = 7) & (proc2_var_Z = 2)) : { proc2_arrB_pos2 };
((proc2_line = 7) & (proc2_var_Z = 3)) : { proc2_arrB_pos3 };
((proc2_line = 7) & (proc2_var_Z = 4)) : { proc2_arrB_pos4 };
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : { proc2_var_W };
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays (proc2)
init(proc2_arrA_pos0) := 0;
next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1;
next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2;
next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3;
next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4;
next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0;
next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1;
next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2;
next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3;
next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4;
next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
k : 0..4;
-- Inlined program(0, var_Y, var_size, offset, k) as proc1
proc1_line : 0..9;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_check_Ay_lt_k : boolean;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- Inlined program(4, var_Y, var_size, offset, k) as proc2
proc2_line : 0..9;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_check_Ay_lt_k : boolean;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
ASSIGN
next(offset) := offset;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
init(k) := 3;
next(k) := k;
-- ===== proc1 (initline = 0) =====
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 3 | proc1_line = 9) : TRUE;
TRUE : FALSE;
esac;
init(proc1_check_Ay_lt_k) := (var_Y = 0 & (k = 1 | k = 2 | k = 3 | k = 4)) | (var_Y = 1 & (k = 2 | k = 3 | k = 4)) | (var_Y = 2 & (k = 3 | k = 4));
next(proc1_check_Ay_lt_k) := proc1_check_Ay_lt_k;
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 2 & ((var_Y + offset) = 0)) : {proc1_arrB_pos0};
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0;
next(proc1_line) :=
case
(proc1_line = 0 & (var_Y >= var_size)) : {3};
(proc1_line = 0 & (var_Y < var_size)) : {1};
(proc1_line = 1 & !proc1_check_Ay_lt_k) : {3};
(proc1_line = 1 & proc1_check_Ay_lt_k) : {2};
(proc1_line = 2) : {3};
(proc1_line = 3) : {3};
(proc1_line = 4) : {5};
(proc1_line = 5 & (!proc1_var_X)) : {9};
(proc1_line = 5 & (proc1_var_X)) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {9};
(proc1_line = 9) : {9};
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 4) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
((proc1_line = 6) & (var_Y = 0)) : {proc1_arrA_pos0};
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 0)) : {proc1_var_Z + 0};
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 1)) : {proc1_var_Z + 1};
((proc1_line = 7) & (proc1_var_Z < 3) & (offset = 2)) : {proc1_var_Z + 2};
((proc1_line = 7) & (proc1_var_Z >= 3)) : {4};
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 8) & (proc1_var_Z = 0)) : {proc1_arrB_pos0};
((proc1_line = 8) & (proc1_var_Z = 1)) : {proc1_arrB_pos1};
((proc1_line = 8) & (proc1_var_Z = 2)) : {proc1_arrB_pos2};
((proc1_line = 8) & (proc1_var_Z = 3)) : {proc1_arrB_pos3};
((proc1_line = 8) & (proc1_var_Z = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 9) : {proc1_var_W};
TRUE : proc1_var_temp_proc2;
esac;
init(proc1_arrA_pos0) := 0;
next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1;
next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2;
next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3;
next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4;
next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0;
next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1;
next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2;
next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3;
next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4;
next(proc1_arrB_pos4) := proc1_arrB_pos4;
-- ===== proc2 (initline = 4) =====
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 3 | proc2_line = 9) : TRUE;
TRUE : FALSE;
esac;
init(proc2_check_Ay_lt_k) := (var_Y = 0 & (k = 1 | k = 2 | k = 3 | k = 4)) | (var_Y = 1 & (k = 2 | k = 3 | k = 4)) | (var_Y = 2 & (k = 3 | k = 4));
next(proc2_check_Ay_lt_k) := proc2_check_Ay_lt_k;
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 2 & ((var_Y + offset) = 0)) : {proc2_arrB_pos0};
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 4;
next(proc2_line) :=
case
(proc2_line = 0 & (var_Y >= var_size)) : {3};
(proc2_line = 0 & (var_Y < var_size)) : {1};
(proc2_line = 1 & !proc2_check_Ay_lt_k) : {3};
(proc2_line = 1 & proc2_check_Ay_lt_k) : {2};
(proc2_line = 2) : {3};
(proc2_line = 3) : {3};
(proc2_line = 4) : {5};
(proc2_line = 5 & (!proc2_var_X)) : {9};
(proc2_line = 5 & (proc2_var_X)) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {9};
(proc2_line = 9) : {9};
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 4) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
((proc2_line = 6) & (var_Y = 0)) : {proc2_arrA_pos0};
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 0)) : {proc2_var_Z + 0};
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 1)) : {proc2_var_Z + 1};
((proc2_line = 7) & (proc2_var_Z < 3) & (offset = 2)) : {proc2_var_Z + 2};
((proc2_line = 7) & (proc2_var_Z >= 3)) : {4};
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 8) & (proc2_var_Z = 0)) : {proc2_arrB_pos0};
((proc2_line = 8) & (proc2_var_Z = 1)) : {proc2_arrB_pos1};
((proc2_line = 8) & (proc2_var_Z = 2)) : {proc2_arrB_pos2};
((proc2_line = 8) & (proc2_var_Z = 3)) : {proc2_arrB_pos3};
((proc2_line = 8) & (proc2_var_Z = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 9) : {proc2_var_W};
TRUE : proc2_var_temp_proc2;
esac;
init(proc2_arrA_pos0) := 0;
next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1;
next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2;
next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3;
next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4;
next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0;
next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1;
next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2;
next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3;
next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4;
next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
k : 0..4;
-- program(0, ...) as proc1
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_check_Ay_lt_k : boolean;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- program(3, ...) as proc2
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_check_Ay_lt_k : boolean;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
ASSIGN
next(offset) := offset;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
init(k) := 3;
next(k) := k;
-- proc1 (program with initline = 0)
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_check_Ay_lt_k) := (var_Y = 0 & (k = 1 | k = 2 | k = 3 | k = 4)) | (var_Y = 1 & (k = 2 | k = 3 | k = 4)) | (var_Y = 2 & (k = 3 | k = 4));
next(proc1_check_Ay_lt_k) := proc1_check_Ay_lt_k;
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 1 & !proc1_check_Ay_lt_k) : 0;
(proc1_line = 1 & proc1_check_Ay_lt_k & ((var_Y + offset) = 0)) : {proc1_arrB_pos0};
(proc1_line = 1 & proc1_check_Ay_lt_k & ((var_Y + offset) = 1)) : {proc1_arrB_pos1};
(proc1_line = 1 & proc1_check_Ay_lt_k & ((var_Y + offset) = 2)) : {proc1_arrB_pos2};
(proc1_line = 1 & proc1_check_Ay_lt_k & ((var_Y + offset) = 3)) : {proc1_arrB_pos3};
(proc1_line = 1 & proc1_check_Ay_lt_k & ((var_Y + offset) = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0;
next(proc1_line) :=
case
(proc1_line = 0) : {1};
(proc1_line = 1) : {2};
(proc1_line = 2) : {2};
(proc1_line = 3) : {4};
(proc1_line = 4) : {5};
(proc1_line = 5) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {8};
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (var_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
((proc1_line = 5) & (var_Y = 0)) : {proc1_arrA_pos0};
((proc1_line = 5) & (var_Y = 1)) : {proc1_arrA_pos1};
((proc1_line = 5) & (var_Y = 2)) : {proc1_arrA_pos2};
((proc1_line = 5) & (var_Y = 3)) : {proc1_arrA_pos3};
((proc1_line = 5) & (var_Y = 4)) : {proc1_arrA_pos4};
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 0)) : {proc1_var_Z + 0};
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 1)) : {proc1_var_Z + 1};
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 2)) : {proc1_var_Z + 2};
((proc1_line = 6) & (proc1_var_Z >= 3)) : {4};
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
(proc1_line = 7 & !proc1_check_Ay_lt_k) : 0;
((proc1_line = 7) & proc1_check_Ay_lt_k & (proc1_var_Z = 0)) : {proc1_arrB_pos0};
((proc1_line = 7) & proc1_check_Ay_lt_k & (proc1_var_Z = 1)) : {proc1_arrB_pos1};
((proc1_line = 7) & proc1_check_Ay_lt_k & (proc1_var_Z = 2)) : {proc1_arrB_pos2};
((proc1_line = 7) & proc1_check_Ay_lt_k & (proc1_var_Z = 3)) : {proc1_arrB_pos3};
((proc1_line = 7) & proc1_check_Ay_lt_k & (proc1_var_Z = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : {proc1_var_W};
TRUE : proc1_var_temp_proc2;
esac;
init(proc1_arrA_pos0) := 0;
next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1;
next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2;
next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3;
next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4;
next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0;
next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1;
next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2;
next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3;
next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4;
next(proc1_arrB_pos4) := proc1_arrB_pos4;
-- proc2 (program with initline = 3)
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_check_Ay_lt_k) := (var_Y = 0 & (k = 1 | k = 2 | k = 3 | k = 4)) | (var_Y = 1 & (k = 2 | k = 3 | k = 4)) | (var_Y = 2 & (k = 3 | k = 4));
next(proc2_check_Ay_lt_k) := proc2_check_Ay_lt_k;
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 1 & !proc2_check_Ay_lt_k) : 0;
(proc2_line = 1 & proc2_check_Ay_lt_k & ((var_Y + offset) = 0)) : {proc2_arrB_pos0};
(proc2_line = 1 & proc2_check_Ay_lt_k & ((var_Y + offset) = 1)) : {proc2_arrB_pos1};
(proc2_line = 1 & proc2_check_Ay_lt_k & ((var_Y + offset) = 2)) : {proc2_arrB_pos2};
(proc2_line = 1 & proc2_check_Ay_lt_k & ((var_Y + offset) = 3)) : {proc2_arrB_pos3};
(proc2_line = 1 & proc2_check_Ay_lt_k & ((var_Y + offset) = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3;
next(proc2_line) :=
case
(proc2_line = 0) : {1};
(proc2_line = 1) : {2};
(proc2_line = 2) : {2};
(proc2_line = 3) : {4};
(proc2_line = 4) : {5};
(proc2_line = 5) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {8};
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (var_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
((proc2_line = 5) & (var_Y = 0)) : {proc2_arrA_pos0};
((proc2_line = 5) & (var_Y = 1)) : {proc2_arrA_pos1};
((proc2_line = 5) & (var_Y = 2)) : {proc2_arrA_pos2};
((proc2_line = 5) & (var_Y = 3)) : {proc2_arrA_pos3};
((proc2_line = 5) & (var_Y = 4)) : {proc2_arrA_pos4};
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 0)) : {proc2_var_Z + 0};
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 1)) : {proc2_var_Z + 1};
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 2)) : {proc2_var_Z + 2};
((proc2_line = 6) & (proc2_var_Z >= 3)) : {4};
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
(proc2_line = 7 & !proc2_check_Ay_lt_k) : 0;
((proc2_line = 7) & proc2_check_Ay_lt_k & (proc2_var_Z = 0)) : {proc2_arrB_pos0};
((proc2_line = 7) & proc2_check_Ay_lt_k & (proc2_var_Z = 1)) : {proc2_arrB_pos1};
((proc2_line = 7) & proc2_check_Ay_lt_k & (proc2_var_Z = 2)) : {proc2_arrB_pos2};
((proc2_line = 7) & proc2_check_Ay_lt_k & (proc2_var_Z = 3)) : {proc2_arrB_pos3};
((proc2_line = 7) & proc2_check_Ay_lt_k & (proc2_var_Z = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : {proc2_var_W};
TRUE : proc2_var_temp_proc2;
esac;
init(proc2_arrA_pos0) := 0;
next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1;
next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2;
next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3;
next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4;
next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0;
next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1;
next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2;
next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3;
next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4;
next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
pointer_Y : 0..7;
-- Inlined program(0, var_Y, var_size, offset, pointer_Y) as proc1
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_halt : boolean;
-- Inlined program(3, var_Y, var_size, offset, pointer_Y) as proc2
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_halt : boolean;
ASSIGN
-- main-level
next(offset) := offset;
init(pointer_Y) := var_Y;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
next(pointer_Y) := pointer_Y;
--------------------------------------------------------------------------------
-- proc1 (initline = 0)
--------------------------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 1 & ((pointer_Y + offset) = 0)) : {proc1_arrB_pos0};
(proc1_line = 1 & ((pointer_Y + offset) = 1)) : {proc1_arrB_pos1};
(proc1_line = 1 & ((pointer_Y + offset) = 2)) : {proc1_arrB_pos2};
(proc1_line = 1 & ((pointer_Y + offset) = 3)) : {proc1_arrB_pos3};
(proc1_line = 1 & ((pointer_Y + offset) = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0;
next(proc1_line) :=
case
-- program1
(proc1_line = 0 & (pointer_Y >= var_size)) : {2};
(proc1_line = 0 & (pointer_Y < var_size)) : {1};
(proc1_line = 1) : {2};
(proc1_line = 2) : {2};
-- program2
(proc1_line = 3) : {4};
(proc1_line = 4 & (!proc1_var_X)) : {8};
(proc1_line = 4 & ( proc1_var_X)) : {5};
(proc1_line = 5) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {8};
-- default
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (pointer_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z
((proc1_line = 5) & (pointer_Y = 0)) : {proc1_arrA_pos0};
((proc1_line = 5) & (pointer_Y = 1)) : {proc1_arrA_pos1};
((proc1_line = 5) & (pointer_Y = 2)) : {proc1_arrA_pos2};
((proc1_line = 5) & (pointer_Y = 3)) : {proc1_arrA_pos3};
((proc1_line = 5) & (pointer_Y = 4)) : {proc1_arrA_pos4};
-- shift pointer
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 0)) : {proc1_var_Z + 0};
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 1)) : {proc1_var_Z + 1};
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 2)) : {proc1_var_Z + 2};
((proc1_line = 6) & (proc1_var_Z >= 3)) : {4};
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : {proc1_arrB_pos0};
((proc1_line = 7) & (proc1_var_Z = 1)) : {proc1_arrB_pos1};
((proc1_line = 7) & (proc1_var_Z = 2)) : {proc1_arrB_pos2};
((proc1_line = 7) & (proc1_var_Z = 3)) : {proc1_arrB_pos3};
((proc1_line = 7) & (proc1_var_Z = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : {proc1_var_W};
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays (proc1)
init(proc1_arrA_pos0) := 0;
next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1;
next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2;
next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3;
next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4;
next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0;
next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1;
next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2;
next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3;
next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4;
next(proc1_arrB_pos4) := proc1_arrB_pos4;
--------------------------------------------------------------------------------
-- proc2 (initline = 3)
--------------------------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 1 & ((pointer_Y + offset) = 0)) : {proc2_arrB_pos0};
(proc2_line = 1 & ((pointer_Y + offset) = 1)) : {proc2_arrB_pos1};
(proc2_line = 1 & ((pointer_Y + offset) = 2)) : {proc2_arrB_pos2};
(proc2_line = 1 & ((pointer_Y + offset) = 3)) : {proc2_arrB_pos3};
(proc2_line = 1 & ((pointer_Y + offset) = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3;
next(proc2_line) :=
case
-- program1
(proc2_line = 0 & (pointer_Y >= var_size)) : {2};
(proc2_line = 0 & (pointer_Y < var_size)) : {1};
(proc2_line = 1) : {2};
(proc2_line = 2) : {2};
-- program2
(proc2_line = 3) : {4};
(proc2_line = 4 & (!proc2_var_X)) : {8};
(proc2_line = 4 & ( proc2_var_X)) : {5};
(proc2_line = 5) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {8};
-- default
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (pointer_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
-- load z
((proc2_line = 5) & (pointer_Y = 0)) : {proc2_arrA_pos0};
((proc2_line = 5) & (pointer_Y = 1)) : {proc2_arrA_pos1};
((proc2_line = 5) & (pointer_Y = 2)) : {proc2_arrA_pos2};
((proc2_line = 5) & (pointer_Y = 3)) : {proc2_arrA_pos3};
((proc2_line = 5) & (pointer_Y = 4)) : {proc2_arrA_pos4};
-- shift pointer
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 0)) : {proc2_var_Z + 0};
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 1)) : {proc2_var_Z + 1};
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 2)) : {proc2_var_Z + 2};
((proc2_line = 6) & (proc2_var_Z >= 3)) : {4};
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : {proc2_arrB_pos0};
((proc2_line = 7) & (proc2_var_Z = 1)) : {proc2_arrB_pos1};
((proc2_line = 7) & (proc2_var_Z = 2)) : {proc2_arrB_pos2};
((proc2_line = 7) & (proc2_var_Z = 3)) : {proc2_arrB_pos3};
((proc2_line = 7) & (proc2_var_Z = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : {proc2_var_W};
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays (proc2)
init(proc2_arrA_pos0) := 0;
next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1;
next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2;
next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3;
next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4;
next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0;
next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1;
next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2;
next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3;
next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4;
next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
pointer_Y : 0..7;
-- Inlined program(0, var_Y, var_size, offset, pointer_Y) as proc1
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_halt : boolean;
-- Inlined program(3, var_Y, var_size, offset, pointer_Y) as proc2
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_halt : boolean;
ASSIGN
-- main-level assignments
next(offset) := offset;
init(pointer_Y) := var_Y;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
next(pointer_Y) := pointer_Y;
-- ===== proc1 (initline = 0) =====
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 1 & ((pointer_Y + offset) = 0)) : {proc1_arrB_pos0};
(proc1_line = 1 & ((pointer_Y + offset) = 1)) : {proc1_arrB_pos1};
(proc1_line = 1 & ((pointer_Y + offset) = 2)) : {proc1_arrB_pos2};
(proc1_line = 1 & ((pointer_Y + offset) = 3)) : {proc1_arrB_pos3};
(proc1_line = 1 & ((pointer_Y + offset) = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0;
next(proc1_line) :=
case
(proc1_line = 0) : {1};
(proc1_line = 1) : {2};
(proc1_line = 2) : {0};
(proc1_line = 3) : {4};
(proc1_line = 4) : {5};
(proc1_line = 5) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {3};
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (pointer_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
((proc1_line = 5) & (pointer_Y = 0)) : {proc1_arrA_pos0};
((proc1_line = 5) & (pointer_Y = 1)) : {proc1_arrA_pos1};
((proc1_line = 5) & (pointer_Y = 2)) : {proc1_arrA_pos2};
((proc1_line = 5) & (pointer_Y = 3)) : {proc1_arrA_pos3};
((proc1_line = 5) & (pointer_Y = 4)) : {proc1_arrA_pos4};
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 0)) : {proc1_var_Z + 0};
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 1)) : {proc1_var_Z + 1};
((proc1_line = 6) & (proc1_var_Z < 3) & (offset = 2)) : {proc1_var_Z + 2};
((proc1_line = 6) & (proc1_var_Z >= 3)) : {4};
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : {proc1_arrB_pos0};
((proc1_line = 7) & (proc1_var_Z = 1)) : {proc1_arrB_pos1};
((proc1_line = 7) & (proc1_var_Z = 2)) : {proc1_arrB_pos2};
((proc1_line = 7) & (proc1_var_Z = 3)) : {proc1_arrB_pos3};
((proc1_line = 7) & (proc1_var_Z = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : {proc1_var_W};
TRUE : proc1_var_temp_proc2;
esac;
init(proc1_arrA_pos0) := 0;
next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1;
next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2;
next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3;
next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4;
next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0;
next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1;
next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2;
next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3;
next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4;
next(proc1_arrB_pos4) := proc1_arrB_pos4;
-- ===== proc2 (initline = 3) =====
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 1 & ((pointer_Y + offset) = 0)) : {proc2_arrB_pos0};
(proc2_line = 1 & ((pointer_Y + offset) = 1)) : {proc2_arrB_pos1};
(proc2_line = 1 & ((pointer_Y + offset) = 2)) : {proc2_arrB_pos2};
(proc2_line = 1 & ((pointer_Y + offset) = 3)) : {proc2_arrB_pos3};
(proc2_line = 1 & ((pointer_Y + offset) = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3;
next(proc2_line) :=
case
(proc2_line = 0) : {1};
(proc2_line = 1) : {2};
(proc2_line = 2) : {0};
(proc2_line = 3) : {4};
(proc2_line = 4) : {5};
(proc2_line = 5) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {3};
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (pointer_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
((proc2_line = 5) & (pointer_Y = 0)) : {proc2_arrA_pos0};
((proc2_line = 5) & (pointer_Y = 1)) : {proc2_arrA_pos1};
((proc2_line = 5) & (pointer_Y = 2)) : {proc2_arrA_pos2};
((proc2_line = 5) & (pointer_Y = 3)) : {proc2_arrA_pos3};
((proc2_line = 5) & (pointer_Y = 4)) : {proc2_arrA_pos4};
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 0)) : {proc2_var_Z + 0};
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 1)) : {proc2_var_Z + 1};
((proc2_line = 6) & (proc2_var_Z < 3) & (offset = 2)) : {proc2_var_Z + 2};
((proc2_line = 6) & (proc2_var_Z >= 3)) : {4};
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : {proc2_arrB_pos0};
((proc2_line = 7) & (proc2_var_Z = 1)) : {proc2_arrB_pos1};
((proc2_line = 7) & (proc2_var_Z = 2)) : {proc2_arrB_pos2};
((proc2_line = 7) & (proc2_var_Z = 3)) : {proc2_arrB_pos3};
((proc2_line = 7) & (proc2_var_Z = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : {proc2_var_W};
TRUE : proc2_var_temp_proc2;
esac;
init(proc2_arrA_pos0) := 0;
next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1;
next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2;
next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3;
next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4;
next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0;
next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1;
next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2;
next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3;
next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4;
next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
pointer_Y : 0..7;
-- Inlined program(0, var_Y, var_size, offset, pointer_Y) as proc1
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_k : 0..4;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- Inlined program(3, var_Y, var_size, offset, pointer_Y) as proc2
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_k : 0..4;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
ASSIGN
-- main-level state
next(offset) := offset;
init(pointer_Y) := var_Y;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
next(pointer_Y) := pointer_Y;
--------------------------------------------------------------------------------
-- proc1 instance (initline = 0)
--------------------------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_k) := 4;
next(proc1_k) := proc1_k;
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 2 & ((pointer_Y + offset) = 0)) : {proc1_arrB_pos0};
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0;
next(proc1_line) :=
case
-- program1
(proc1_line = 0 & (pointer_Y >= var_size)) : {3}; -- terminate branch
(proc1_line = 0 & (pointer_Y < var_size)) : {1}; -- proceed
(proc1_line = 1) : {2};
(proc1_line = 2) : {2};
-- program 2
(proc1_line = 3) : {4};
(proc1_line = 4 & (!proc1_var_X)) : {8};
(proc1_line = 4 & ( proc1_var_X)) : {5};
(proc1_line = 5) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {8};
-- default
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (pointer_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z (NOTE: uses var_Y, as in the module)
((proc1_line = 5) & (var_Y = 0)) : {proc1_arrA_pos0};
((proc1_line = 5) & (var_Y = 1)) : {proc1_arrA_pos1};
((proc1_line = 5) & (var_Y = 2)) : {proc1_arrA_pos2};
((proc1_line = 5) & (var_Y = 3)) : {proc1_arrA_pos3};
((proc1_line = 5) & (var_Y = 4)) : {proc1_arrA_pos4};
-- masked pointer handling
((proc1_line = 6) & (proc1_mask = 0)) : {0};
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : {proc1_arrB_pos0};
((proc1_line = 7) & (proc1_var_Z = 1)) : {proc1_arrB_pos1};
((proc1_line = 7) & (proc1_var_Z = 2)) : {proc1_arrB_pos2};
((proc1_line = 7) & (proc1_var_Z = 3)) : {proc1_arrB_pos3};
((proc1_line = 7) & (proc1_var_Z = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : {proc1_var_W};
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays (proc1)
init(proc1_arrA_pos0) := 0; next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1; next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2; next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3; next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4; next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0; next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1; next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2; next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3; next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4; next(proc1_arrB_pos4) := proc1_arrB_pos4;
--------------------------------------------------------------------------------
-- proc2 instance (initline = 3)
--------------------------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_k) := 4;
next(proc2_k) := proc2_k;
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 2 & ((pointer_Y + offset) = 0)) : {proc2_arrB_pos0};
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3;
next(proc2_line) :=
case
-- program1
(proc2_line = 0 & (pointer_Y >= var_size)) : {3};
(proc2_line = 0 & (pointer_Y < var_size)) : {1};
(proc2_line = 1) : {2};
(proc2_line = 2) : {2};
-- program 2
(proc2_line = 3) : {4};
(proc2_line = 4 & (!proc2_var_X)) : {8};
(proc2_line = 4 & ( proc2_var_X)) : {5};
(proc2_line = 5) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {8};
-- default
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (pointer_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
-- load z (NOTE: uses var_Y, as in the module)
((proc2_line = 5) & (var_Y = 0)) : {proc2_arrA_pos0};
((proc2_line = 5) & (var_Y = 1)) : {proc2_arrA_pos1};
((proc2_line = 5) & (var_Y = 2)) : {proc2_arrA_pos2};
((proc2_line = 5) & (var_Y = 3)) : {proc2_arrA_pos3};
((proc2_line = 5) & (var_Y = 4)) : {proc2_arrA_pos4};
-- masked pointer handling
((proc2_line = 6) & (proc2_mask = 0)) : {0};
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : {proc2_arrB_pos0};
((proc2_line = 7) & (proc2_var_Z = 1)) : {proc2_arrB_pos1};
((proc2_line = 7) & (proc2_var_Z = 2)) : {proc2_arrB_pos2};
((proc2_line = 7) & (proc2_var_Z = 3)) : {proc2_arrB_pos3};
((proc2_line = 7) & (proc2_var_Z = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : {proc2_var_W};
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays (proc2)
init(proc2_arrA_pos0) := 0; next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1; next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2; next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3; next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4; next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0; next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1; next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2; next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3; next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4; next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
MODULE main
VAR
offset : 0..2;
var_Y : 0..7;
var_size : 0..4;
pointer_Y : 0..7;
-- Inlined program(0, var_Y, var_size, offset, pointer_Y) as proc1
proc1_line : 0..8;
proc1_arrA_pos0 : 0..4;
proc1_arrA_pos1 : 0..4;
proc1_arrA_pos2 : 0..4;
proc1_arrA_pos3 : 0..4;
proc1_arrA_pos4 : 0..4;
proc1_arrB_pos0 : 0..4;
proc1_arrB_pos1 : 0..4;
proc1_arrB_pos2 : 0..4;
proc1_arrB_pos3 : 0..4;
proc1_arrB_pos4 : 0..4;
proc1_var_temp_proc1 : 0..4;
proc1_k : 0..4;
proc1_var_X : boolean;
proc1_var_Z : 0..4;
proc1_var_W : 0..4;
proc1_var_temp_proc2 : 0..4;
proc1_mask : 0..1;
proc1_halt : boolean;
-- Inlined program(3, var_Y, var_size, offset, pointer_Y) as proc2
proc2_line : 0..8;
proc2_arrA_pos0 : 0..4;
proc2_arrA_pos1 : 0..4;
proc2_arrA_pos2 : 0..4;
proc2_arrA_pos3 : 0..4;
proc2_arrA_pos4 : 0..4;
proc2_arrB_pos0 : 0..4;
proc2_arrB_pos1 : 0..4;
proc2_arrB_pos2 : 0..4;
proc2_arrB_pos3 : 0..4;
proc2_arrB_pos4 : 0..4;
proc2_var_temp_proc1 : 0..4;
proc2_k : 0..4;
proc2_var_X : boolean;
proc2_var_Z : 0..4;
proc2_var_W : 0..4;
proc2_var_temp_proc2 : 0..4;
proc2_mask : 0..1;
proc2_halt : boolean;
ASSIGN
-- main-level state
next(offset) := offset;
init(pointer_Y) := var_Y;
next(var_Y) := var_Y;
init(var_size) := 4;
next(var_size) := var_size;
next(pointer_Y) := pointer_Y;
--------------------------------------------------------------------------------
-- proc1 instance (initline = 0)
--------------------------------------------------------------------------------
init(proc1_halt) := FALSE;
next(proc1_halt) :=
case
(proc1_line = 2 | proc1_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc1_k) := 4;
next(proc1_k) := proc1_k;
init(proc1_mask) := 0;
next(proc1_mask) :=
case
((proc1_line = 2) & !(proc1_var_X)) : 0;
((proc1_line = 2) & (proc1_var_X)) : 1;
TRUE : proc1_mask;
esac;
init(proc1_var_temp_proc1) := 0;
next(proc1_var_temp_proc1) :=
case
(proc1_line = 1 & ((pointer_Y + offset) = 0)) : {proc1_arrB_pos0};
TRUE : proc1_var_temp_proc1;
esac;
init(proc1_line) := 0;
next(proc1_line) :=
case
-- program1
(proc1_line = 0) : {1};
(proc1_line = 1) : {2};
(proc1_line = 2) : {0};
-- program 2
(proc1_line = 3) : {4};
(proc1_line = 4) : {5};
(proc1_line = 5) : {6};
(proc1_line = 6) : {7};
(proc1_line = 7) : {8};
(proc1_line = 8) : {3};
-- default
TRUE : proc1_line;
esac;
init(proc1_var_X) := FALSE;
next(proc1_var_X) :=
case
(proc1_line = 3) : (pointer_Y < var_size);
TRUE : proc1_var_X;
esac;
init(proc1_var_Z) := 0;
next(proc1_var_Z) :=
case
-- load z
((proc1_line = 5) & (pointer_Y = 0)) : {proc1_arrA_pos0};
((proc1_line = 5) & (pointer_Y = 1)) : {proc1_arrA_pos1};
((proc1_line = 5) & (pointer_Y = 2)) : {proc1_arrA_pos2};
((proc1_line = 5) & (pointer_Y = 3)) : {proc1_arrA_pos3};
((proc1_line = 5) & (pointer_Y = 4)) : {proc1_arrA_pos4};
-- masked shift pointer
((proc1_line = 6) & (proc1_mask = 0)) : {0};
TRUE : proc1_var_Z;
esac;
init(proc1_var_W) := 0;
next(proc1_var_W) :=
case
((proc1_line = 7) & (proc1_var_Z = 0)) : {proc1_arrB_pos0};
((proc1_line = 7) & (proc1_var_Z = 1)) : {proc1_arrB_pos1};
((proc1_line = 7) & (proc1_var_Z = 2)) : {proc1_arrB_pos2};
((proc1_line = 7) & (proc1_var_Z = 3)) : {proc1_arrB_pos3};
((proc1_line = 7) & (proc1_var_Z = 4)) : {proc1_arrB_pos4};
TRUE : proc1_var_W;
esac;
init(proc1_var_temp_proc2) := 0;
next(proc1_var_temp_proc2) :=
case
(proc1_line = 8) : {proc1_var_W};
TRUE : proc1_var_temp_proc2;
esac;
-- static arrays (proc1)
init(proc1_arrA_pos0) := 0;
next(proc1_arrA_pos0) := proc1_arrA_pos0;
init(proc1_arrA_pos1) := 1;
next(proc1_arrA_pos1) := proc1_arrA_pos1;
init(proc1_arrA_pos2) := 2;
next(proc1_arrA_pos2) := proc1_arrA_pos2;
init(proc1_arrA_pos3) := 3;
next(proc1_arrA_pos3) := proc1_arrA_pos3;
init(proc1_arrA_pos4) := 4;
next(proc1_arrA_pos4) := proc1_arrA_pos4;
init(proc1_arrB_pos0) := 0;
next(proc1_arrB_pos0) := proc1_arrB_pos0;
init(proc1_arrB_pos1) := 1;
next(proc1_arrB_pos1) := proc1_arrB_pos1;
init(proc1_arrB_pos2) := 2;
next(proc1_arrB_pos2) := proc1_arrB_pos2;
init(proc1_arrB_pos3) := 3;
next(proc1_arrB_pos3) := proc1_arrB_pos3;
init(proc1_arrB_pos4) := 4;
next(proc1_arrB_pos4) := proc1_arrB_pos4;
--------------------------------------------------------------------------------
-- proc2 instance (initline = 3)
--------------------------------------------------------------------------------
init(proc2_halt) := FALSE;
next(proc2_halt) :=
case
(proc2_line = 2 | proc2_line = 8) : TRUE;
TRUE : FALSE;
esac;
init(proc2_k) := 4;
next(proc2_k) := proc2_k;
init(proc2_mask) := 0;
next(proc2_mask) :=
case
((proc2_line = 2) & !(proc2_var_X)) : 0;
((proc2_line = 2) & (proc2_var_X)) : 1;
TRUE : proc2_mask;
esac;
init(proc2_var_temp_proc1) := 0;
next(proc2_var_temp_proc1) :=
case
(proc2_line = 1 & ((pointer_Y + offset) = 0)) : {proc2_arrB_pos0};
TRUE : proc2_var_temp_proc1;
esac;
init(proc2_line) := 3;
next(proc2_line) :=
case
-- program1
(proc2_line = 0) : {1};
(proc2_line = 1) : {2};
(proc2_line = 2) : {0};
-- program 2
(proc2_line = 3) : {4};
(proc2_line = 4) : {5};
(proc2_line = 5) : {6};
(proc2_line = 6) : {7};
(proc2_line = 7) : {8};
(proc2_line = 8) : {3};
-- default
TRUE : proc2_line;
esac;
init(proc2_var_X) := FALSE;
next(proc2_var_X) :=
case
(proc2_line = 3) : (pointer_Y < var_size);
TRUE : proc2_var_X;
esac;
init(proc2_var_Z) := 0;
next(proc2_var_Z) :=
case
-- load z
((proc2_line = 5) & (pointer_Y = 0)) : {proc2_arrA_pos0};
((proc2_line = 5) & (pointer_Y = 1)) : {proc2_arrA_pos1};
((proc2_line = 5) & (pointer_Y = 2)) : {proc2_arrA_pos2};
((proc2_line = 5) & (pointer_Y = 3)) : {proc2_arrA_pos3};
((proc2_line = 5) & (pointer_Y = 4)) : {proc2_arrA_pos4};
-- masked shift pointer
((proc2_line = 6) & (proc2_mask = 0)) : {0};
TRUE : proc2_var_Z;
esac;
init(proc2_var_W) := 0;
next(proc2_var_W) :=
case
((proc2_line = 7) & (proc2_var_Z = 0)) : {proc2_arrB_pos0};
((proc2_line = 7) & (proc2_var_Z = 1)) : {proc2_arrB_pos1};
((proc2_line = 7) & (proc2_var_Z = 2)) : {proc2_arrB_pos2};
((proc2_line = 7) & (proc2_var_Z = 3)) : {proc2_arrB_pos3};
((proc2_line = 7) & (proc2_var_Z = 4)) : {proc2_arrB_pos4};
TRUE : proc2_var_W;
esac;
init(proc2_var_temp_proc2) := 0;
next(proc2_var_temp_proc2) :=
case
(proc2_line = 8) : {proc2_var_W};
TRUE : proc2_var_temp_proc2;
esac;
-- static arrays (proc2)
init(proc2_arrA_pos0) := 0;
next(proc2_arrA_pos0) := proc2_arrA_pos0;
init(proc2_arrA_pos1) := 1;
next(proc2_arrA_pos1) := proc2_arrA_pos1;
init(proc2_arrA_pos2) := 2;
next(proc2_arrA_pos2) := proc2_arrA_pos2;
init(proc2_arrA_pos3) := 3;
next(proc2_arrA_pos3) := proc2_arrA_pos3;
init(proc2_arrA_pos4) := 4;
next(proc2_arrA_pos4) := proc2_arrA_pos4;
init(proc2_arrB_pos0) := 0;
next(proc2_arrB_pos0) := proc2_arrB_pos0;
init(proc2_arrB_pos1) := 1;
next(proc2_arrB_pos1) := proc2_arrB_pos1;
init(proc2_arrB_pos2) := 2;
next(proc2_arrB_pos2) := proc2_arrB_pos2;
init(proc2_arrB_pos3) := 3;
next(proc2_arrB_pos3) := proc2_arrB_pos3;
init(proc2_arrB_pos4) := 4;
next(proc2_arrB_pos4) := proc2_arrB_pos4;
DEFINE
-- halting condition
halt := ((proc1_line=8) & (proc2_line=8));
The HyperLTL formula¶
The property asserts that for every trace there exists a witness whose public output var_Y stays at zero in lockstep. All
secure non-speculative variants satisfy the property, while speculative versions that leak data violate it.
Forall A . Exists B . E t .
G((var_Y[A][t] = 0) & (var_Y[B][t] = 0))