Skip to content
Snippets Groups Projects
Commit 9f5798d1 authored by Per Lindgren's avatar Per Lindgren
Browse files

wip

parent a5985794
No related branches found
No related tags found
No related merge requests found
...@@ -36,6 +36,8 @@ fn main() { ...@@ -36,6 +36,8 @@ fn main() {
let mut STATE_HISTORY: [State; (DISCREPENCY + 3) as usize] = let mut STATE_HISTORY: [State; (DISCREPENCY + 3) as usize] =
unsafe { core::mem::uninitialized() }; unsafe { core::mem::uninitialized() };
let mut CNTR_HISTORY: [u32; (DISCREPENCY + 3) as usize] = unsafe { core::mem::uninitialized() };
let mut TIMEOUT_CNTR: u32 = unsafe { core::mem::uninitialized() }; let mut TIMEOUT_CNTR: u32 = unsafe { core::mem::uninitialized() };
let mut STATE = S8001; let mut STATE = S8001;
...@@ -67,38 +69,58 @@ fn main() { ...@@ -67,38 +69,58 @@ fn main() {
kassert!(!DATA[i].a | !DATA[i].b); kassert!(!DATA[i].a | !DATA[i].b);
} }
// transition invariants
if i > 0 {
match STATE_HISTORY[i - 1] {
C001 | C002 | C003 => {
// transitions from error
kassert!((STATE == S8001) | (STATE == STATE_HISTORY[i - 1]));
}
S8005 => {
kassert!((STATE == S8001) | (STATE == C003) | (STATE == STATE_HISTORY[i - 1]));
}
_ => (),
}
}
// DISCREPANCY related invariants // DISCREPANCY related invariants
match STATE { match STATE {
// Error -> timeout // Error -> timeout
C001 | C002 | C003 => kassert!(TIMEOUT_CNTR == 0), C001 | C002 | C003 => kassert!(TIMEOUT_CNTR == 0),
S8004 | S8005 | S8014 => {
// remaining in a waiting state decreases the counter
if i > 0 {
if STATE_HISTORY[i - 1] == STATE {
kassert!(TIMEOUT_CNTR < CNTR_HISTORY[i - 1]);
}
}
// Waiting states -> !timeout // Waiting states -> !timeout
// Waiting states implies that TIMEOUT_CNTR has not yet expired // Waiting states implies that TIMEOUT_CNTR has not yet expired
// and that the time remaining is not longer than the discrepency // and that the time remaining is not longer than the discrepency
S8004 | S8005 | S8014 => { kassert!(0 < TIMEOUT_CNTR && TIMEOUT_CNTR <= DISCREPENCY);
kassert!(0 < TIMEOUT_CNTR && TIMEOUT_CNTR <= DISCREPENCY)
} }
_ => {} _ => {}
} }
// transition invariants // if i > 0 {
if i > 0 { // match STATE_HISTORY[i - 1] {
match STATE_HISTORY[i - 1] { // C001 | C002 | C003 | S8005 => {
C001 | C002 | C003 | S8005 => { // // no (immediate) transition from error / recover to Enable state
// no (immediate) transition from error / recover to Enable state // kassert!(!(STATE == S8000));
kassert!(!(STATE == S8000)); // }
} // _ => {
_ => { // // liveness from Init and Wait states, Enable is ensured
// liveness from Init and Wait states, Enable is ensured // if DATA[i].a & DATA[i].b & (TIMEOUT_CNTR > 0) {
if DATA[i].a & DATA[i].b & (TIMEOUT_CNTR > 0) { // kassert!(STATE == S8000);
kassert!(STATE == S8000); // }
} // }
} // }
} // }
}
STATE_HISTORY[i] = STATE; STATE_HISTORY[i] = STATE;
CNTR_HISTORY[i] = TIMEOUT_CNTR;
unsafe { core::ptr::read_volatile(&STATE_HISTORY[i]) }; unsafe { core::ptr::read_volatile(&STATE_HISTORY[i]) };
} }
} }
......
...@@ -5,8 +5,7 @@ use klee::{kassert, ksymbol}; ...@@ -5,8 +5,7 @@ use klee::{kassert, ksymbol};
#[no_mangle] #[no_mangle]
fn main() { fn main() {
let mut DATA: [Data; (DISCREPENCY + 1) as usize] = let mut DATA: [Data; (DISCREPENCY + 1) as usize] = unsafe { core::mem::uninitialized() };
unsafe { core::mem::uninitialized() };
ksymbol!(&mut DATA, "DATA"); ksymbol!(&mut DATA, "DATA");
let mut TIMEOUT_CNTR: u32 = unsafe { core::mem::uninitialized() }; let mut TIMEOUT_CNTR: u32 = unsafe { core::mem::uninitialized() };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment