diff --git a/examples/eq.rs b/examples/eq.rs index 021e81ca585caa854f4462ad1aed3964047c67ac..79e61ecb00d52e2092c7995fc8ddf5dd9cc2d662 100644 --- a/examples/eq.rs +++ b/examples/eq.rs @@ -24,25 +24,29 @@ pub enum State { use State::*; -const DISCREPENCY: u32 = 2; +//const DISCREPANCY: u32 = 2; +const DISCREPANCY: u32 = 1; +//const HORIZON: usize = (DISCREPANCY + 4 - 1) as usize; +const HORIZON: usize = (DISCREPANCY + 4 + 1) as usize; const T: bool = true; const F: bool = false; #[no_mangle] fn main() { - let mut DATA: [Data; (DISCREPENCY + 3) as usize] = unsafe { core::mem::uninitialized() }; + let mut DATA: [Data; HORIZON] = unsafe { core::mem::uninitialized() }; ksymbol!(&mut DATA, "DATA"); - let mut STATE_HISTORY: [State; (DISCREPENCY + 3) as usize] = - unsafe { core::mem::uninitialized() }; + let mut STATE_H: [State; HORIZON] = unsafe { core::mem::uninitialized() }; - let mut CNTR_HISTORY: [u32; (DISCREPENCY + 3) as usize] = unsafe { core::mem::uninitialized() }; + let mut CNTR_H: [u32; HORIZON] = unsafe { core::mem::uninitialized() }; let mut TIMEOUT_CNTR: u32 = unsafe { core::mem::uninitialized() }; let mut STATE = S8001; - for i in 0..(DISCREPENCY + 3) as usize { - periodic(&mut STATE, &mut TIMEOUT_CNTR, &mut DATA[i as usize]); + for i in 0..HORIZON { + periodic(&mut STATE, &mut TIMEOUT_CNTR, &mut DATA[i]); + STATE_H[i] = STATE; + CNTR_H[i] = TIMEOUT_CNTR; // invariants // S8000 -> a & b @@ -71,13 +75,13 @@ fn main() { // transition invariants if i > 0 { - match STATE_HISTORY[i - 1] { + match STATE_H[i - 1] { C001 | C002 | C003 => { // transitions from error - kassert!((STATE == S8001) | (STATE == STATE_HISTORY[i - 1])); + kassert!((STATE_H[i] == S8001) | (STATE == STATE_H[i - 1])); } S8005 => { - kassert!((STATE == S8001) | (STATE == C003) | (STATE == STATE_HISTORY[i - 1])); + kassert!((STATE_H[i] == S8001) | (STATE == C003) | (STATE == STATE_H[i - 1])); } _ => (), } @@ -91,20 +95,32 @@ fn main() { 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]); + if STATE_H[i - 1] == STATE_H[i] { + kassert!(TIMEOUT_CNTR < CNTR_H[i - 1]); } } // Waiting states -> !timeout // Waiting states implies that TIMEOUT_CNTR has not yet expired - // and that the time remaining is not longer than the discrepency - kassert!(0 < TIMEOUT_CNTR && TIMEOUT_CNTR <= DISCREPENCY); + // and that the time remaining is not longer than the DISCREPANCY + kassert!(0 < TIMEOUT_CNTR && TIMEOUT_CNTR <= DISCREPANCY); } + _ => {} } + // // liveness? + // if i == HORIZON - 1 { + // let mut ok = false; + // for j in 0..=i { + // if STATE_H[j] == S8001 { + // ok = true; + // } + // } + // kassert!(ok); + // } + // if i > 0 { - // match STATE_HISTORY[i - 1] { + // match STATE_H[i - 1] { // C001 | C002 | C003 | S8005 => { // // no (immediate) transition from error / recover to Enable state // kassert!(!(STATE == S8000)); @@ -118,10 +134,7 @@ fn main() { // } // } - STATE_HISTORY[i] = STATE; - CNTR_HISTORY[i] = TIMEOUT_CNTR; - - unsafe { core::ptr::read_volatile(&STATE_HISTORY[i]) }; + unsafe { core::ptr::read_volatile(&STATE_H[i]) }; } } @@ -130,7 +143,7 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) { S8000 => match (data.a, data.b) { (F, F) => S8001, (F, T) | (T, F) => { - *TIMEOUT_CNTR = DISCREPENCY; + *TIMEOUT_CNTR = DISCREPANCY; S8005 } (T, T) => S8000, @@ -138,11 +151,11 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) { S8001 => match (data.a, data.b) { (F, F) => S8001, (F, T) => { - *TIMEOUT_CNTR = DISCREPENCY; + *TIMEOUT_CNTR = DISCREPANCY; S8014 } (T, F) => { - *TIMEOUT_CNTR = DISCREPENCY; + *TIMEOUT_CNTR = DISCREPANCY; S8004 } (T, T) => S8000,