Added SDC tests
parent
3a8a3e1ff9
commit
b0d719dcf2
@ -0,0 +1,51 @@
|
||||
node alloc(r,e : bool) returns (g : bool)
|
||||
let
|
||||
automaton
|
||||
state Idle
|
||||
do g = false until r then Alloc
|
||||
state Alloc
|
||||
do g = true until e then Idle
|
||||
end
|
||||
tel
|
||||
|
||||
node main_alloc(r1,r2,e1,e2 : bool) returns (g1,g2 : bool)
|
||||
contract
|
||||
assume not (r1 & r2)
|
||||
enforce not (g1 & g2)
|
||||
with (c1,c2:bool)
|
||||
let
|
||||
g1 = inlined alloc(r1 & c1, e1);
|
||||
g2 = inlined alloc(r2 & c2, e2);
|
||||
tel
|
||||
|
||||
node task<<pr,pe:int>>() returns (r,e:bool)
|
||||
let
|
||||
automaton
|
||||
state I
|
||||
var c : int;
|
||||
do
|
||||
r = c = pr;
|
||||
e = false;
|
||||
c = 1 fby c + 1
|
||||
until r then A
|
||||
state A
|
||||
var c : int;
|
||||
do
|
||||
r = false;
|
||||
e = c = pe;
|
||||
c = 1 fby c + 1;
|
||||
until e then I
|
||||
end
|
||||
tel
|
||||
|
||||
(* CHECK main *)
|
||||
|
||||
node main() returns (ok:bool)
|
||||
var r1,r2,e1,e2,g1,g2:bool;
|
||||
let
|
||||
(g1,g2) = main_alloc(r1,r2 & not r1,e1,e2);
|
||||
(* task 1 *)
|
||||
(r1,e1) = task<<5,15>>();
|
||||
(r2,e2) = task<<11,27>>();
|
||||
ok = not (g1 & g2);
|
||||
tel
|
@ -0,0 +1,47 @@
|
||||
(* SDC sS:d={P:D} *)
|
||||
|
||||
node f(x:int) = (y:int)
|
||||
contract
|
||||
assume x >= 10
|
||||
enforce y <= x
|
||||
with (c:bool)
|
||||
let
|
||||
y = 0 -> if c then pre y + 1 else 0;
|
||||
tel
|
||||
|
||||
|
||||
node tasks(nb_req, ended : int) = (waiting, active : int)
|
||||
contract
|
||||
assume (nb_req >= 0) & (ended <= (0 fby active)) & (ended >= 0)
|
||||
enforce (active <= 10)
|
||||
with (act : bool)
|
||||
var activated : int;
|
||||
let
|
||||
waiting = (0 -> pre waiting) + nb_req - activated;
|
||||
activated = 0 -> if (pre waiting > 0) & act then 1 else 0;
|
||||
active = (0 -> pre active) + activated - ended;
|
||||
tel
|
||||
|
||||
node period<<n:int>>() = (s:bool)
|
||||
var c:int;
|
||||
let
|
||||
c = 1 fby (if s then 1 else c + 1);
|
||||
s = c = n;
|
||||
tel
|
||||
|
||||
fun min(x,y:int) = (z:int)
|
||||
let
|
||||
z = if x < y then x else y;
|
||||
tel
|
||||
|
||||
node main() = (ok:bool;active,ended:int)
|
||||
contract assume (active >= 0) & (ended <= (0 fby active)) & (ended >= 0)
|
||||
var x,y,nb_req,waiting:int;
|
||||
let
|
||||
y = f(x);
|
||||
x = 20;
|
||||
nb_req = 0 -> if (pre waiting < 100) & period<<17>>() then 23 else 0;
|
||||
ended = 0;
|
||||
(waiting,active) = tasks(nb_req,ended);
|
||||
ok = (y <= x) & (active <= 9)
|
||||
tel
|
@ -0,0 +1,24 @@
|
||||
node f(x:bool) = (last y:int)
|
||||
contract
|
||||
enforce y > 0 with (c:bool)
|
||||
let
|
||||
automaton
|
||||
state A
|
||||
do y = 1;
|
||||
until c then B
|
||||
| not c then C
|
||||
state B
|
||||
do y = 2;
|
||||
until true then A
|
||||
state C
|
||||
do y = 3;
|
||||
until true then A
|
||||
end
|
||||
tel
|
||||
|
||||
|
||||
node main() = (y:int)
|
||||
let
|
||||
y = f(true)
|
||||
tel
|
||||
|
@ -0,0 +1,141 @@
|
||||
(* Example from Nicolas Berthier *)
|
||||
|
||||
node transceiver(enter_tx,
|
||||
enter_rx,
|
||||
exit_rx,
|
||||
calibrate,
|
||||
sleep,
|
||||
wake_up,
|
||||
irq_tx_done,
|
||||
irq_on_packet,
|
||||
irq_end_of_packet,
|
||||
irq_end_of_calibration,
|
||||
irq_fifo_threshold,
|
||||
ok:bool) returns (red:bool)
|
||||
let
|
||||
automaton
|
||||
state Idle
|
||||
do
|
||||
red = false;
|
||||
until enter_tx & ok then Tx
|
||||
| calibrate & ok then Calibrate
|
||||
| sleep & ok then Sleep
|
||||
| enter_rx & ok then Rx
|
||||
state Tx
|
||||
do
|
||||
red = true;
|
||||
until irq_tx_done then Idle
|
||||
state Calibrate
|
||||
do
|
||||
red = false;
|
||||
until irq_end_of_calibration then Idle
|
||||
state Sleep
|
||||
do
|
||||
red = false;
|
||||
until wake_up & ok then Idle
|
||||
state Rx
|
||||
do
|
||||
red = true;
|
||||
until irq_on_packet then Rx_Packet
|
||||
| exit_rx & ok then Idle
|
||||
state Rx_Packet
|
||||
do
|
||||
red = true;
|
||||
until irq_end_of_packet then Idle
|
||||
end
|
||||
tel
|
||||
|
||||
node adc(adc_on,adc_off,ok:bool) returns (o:bool)
|
||||
let
|
||||
automaton
|
||||
state Off
|
||||
do
|
||||
o = false;
|
||||
until adc_on & ok then On
|
||||
state On
|
||||
do
|
||||
o = true;
|
||||
until adc_off & ok then Off
|
||||
end
|
||||
tel
|
||||
|
||||
node main_rt(enter_tx,
|
||||
enter_rx,
|
||||
exit_rx,
|
||||
calibrate,
|
||||
sleep,
|
||||
wake_up,
|
||||
irq_tx_done,
|
||||
irq_on_packet,
|
||||
irq_end_of_packet,
|
||||
irq_end_of_calibration,
|
||||
irq_fifo_threshold,adc_on,adc_off:bool)
|
||||
returns (a_on,red:bool)
|
||||
|
||||
contract
|
||||
enforce (not (a_on & red)) with (ok_r,ok_a:bool)
|
||||
|
||||
let
|
||||
a_on = inlined adc(adc_on,adc_off,ok_a);
|
||||
red = inlined transceiver(enter_tx,
|
||||
enter_rx,
|
||||
exit_rx,
|
||||
calibrate,
|
||||
sleep,
|
||||
wake_up,
|
||||
irq_tx_done,
|
||||
irq_on_packet,
|
||||
irq_end_of_packet,
|
||||
irq_end_of_calibration,
|
||||
irq_fifo_threshold,ok_r);
|
||||
tel
|
||||
|
||||
node period<<n,ini:int>>() = (s:bool)
|
||||
var c:int;
|
||||
let
|
||||
c = ini fby (if s then 1 else c + 1);
|
||||
s = c = n;
|
||||
tel
|
||||
|
||||
|
||||
(* CHECK main *)
|
||||
node main() returns (ok:bool)
|
||||
var enter_tx,
|
||||
enter_rx,
|
||||
exit_rx,
|
||||
calibrate,
|
||||
sleep,
|
||||
wake_up,
|
||||
irq_tx_done,
|
||||
irq_on_packet,
|
||||
irq_end_of_packet,
|
||||
irq_end_of_calibration,
|
||||
irq_fifo_threshold,adc_on,adc_off:bool;
|
||||
a_on,red:bool;
|
||||
let
|
||||
(a_on,red) = main_rt(enter_tx,
|
||||
enter_rx,
|
||||
exit_rx,
|
||||
calibrate,
|
||||
sleep,
|
||||
wake_up,
|
||||
irq_tx_done,
|
||||
irq_on_packet,
|
||||
irq_end_of_packet,
|
||||
irq_end_of_calibration,
|
||||
irq_fifo_threshold,adc_on,adc_off);
|
||||
ok = not (a_on & red);
|
||||
enter_tx = period<<27,25>>();
|
||||
enter_rx = period<<27,9>>();
|
||||
exit_rx = period<<27,1>>();
|
||||
calibrate = period<<27,19>>();
|
||||
sleep = period<<27,14>>();
|
||||
wake_up = period<<27,11>>();
|
||||
irq_tx_done = period<<27,21>>();
|
||||
irq_on_packet = period<<27,8>>();
|
||||
irq_end_of_packet = period<<27,4>>();
|
||||
irq_end_of_calibration = period<<27,16>>();
|
||||
irq_fifo_threshold = period<<27,3>>();
|
||||
adc_on = period<<17,13>>();
|
||||
adc_off = period<<17,4>>();
|
||||
tel
|
@ -0,0 +1,43 @@
|
||||
type mode = H | M | L
|
||||
|
||||
node server(max:int) = (load:int)
|
||||
contract
|
||||
assume (max >= 5)
|
||||
enforce (load <= max)
|
||||
with (c:mode)
|
||||
let
|
||||
switch c
|
||||
| H do load = 20
|
||||
| M do load = 10
|
||||
| L do load = 0
|
||||
end
|
||||
tel
|
||||
|
||||
type degmode = Normal | Degraded
|
||||
|
||||
node degraded_server(max:int) = (load:int)
|
||||
contract
|
||||
assume (max >= 10)
|
||||
enforce (load <= max)
|
||||
with (cm:mode;cd:degmode)
|
||||
let
|
||||
switch cd
|
||||
| Normal do
|
||||
switch cm
|
||||
| H do load = 20
|
||||
| M do load = 10
|
||||
| L do load = 0
|
||||
end
|
||||
| Degraded do load = 2
|
||||
end
|
||||
tel
|
||||
|
||||
(* CHECK main *)
|
||||
node main() = (ok:bool)
|
||||
var max, load1, load2 : int;
|
||||
let
|
||||
load1 = 0;
|
||||
load2 = degraded_server(max);
|
||||
max = 10;
|
||||
ok = (load1 <= max) & (load2 <= max);
|
||||
tel
|
Loading…
Reference in New Issue