Skip to content
Snippets Groups Projects
Commit c0a8adae authored by Per's avatar Per
Browse files

example wip

parent dc75f851
No related branches found
No related tags found
No related merge requests found
...@@ -30,13 +30,14 @@ const F: bool = false; ...@@ -30,13 +30,14 @@ const F: bool = false;
#[no_mangle] #[no_mangle]
fn main() { fn main() {
let mut DATA: [Data; (DISCREPENCY + 2) as usize] = unsafe { core::mem::uninitialized() }; let mut DATA: [Data; (DISCREPENCY + 2) as usize] =
unsafe { core::mem::uninitialized() };
ksymbol!(&mut DATA, "DATA"); ksymbol!(&mut DATA, "DATA");
let mut STATE_HISTORY: [State; (DISCREPENCY + 2) as usize] = let mut STATE_HISTORY: [State; (DISCREPENCY + 2) as usize] =
unsafe { core::mem::uninitialized() }; unsafe { core::mem::uninitialized() };
let mut TIMEOUT_CNTR: u32 = DISCREPENCY; let mut TIMEOUT_CNTR: u32 = unsafe { core::mem::uninitialized() };
let mut STATE = S8001; let mut STATE = S8001;
for i in 0..(DISCREPENCY + 2) as usize { for i in 0..(DISCREPENCY + 2) as usize {
...@@ -62,66 +63,73 @@ fn main() { ...@@ -62,66 +63,73 @@ fn main() {
} }
// S8001 -> !a & !b // S8001 -> !a & !b
// we can only stay or enter the Init state if both inputs are false // we can only stay or enter the Init state if either input are false
if STATE == S8001 { if STATE == S8001 {
kassert!(TIMEOUT_CNTR == DISCREPENCY); // kassert!(TIMEOUT_CNTR == DISCREPENCY);
kassert!(!DATA[i].a | !DATA[i].b); kassert!(!DATA[i].a | !DATA[i].b);
} }
// !a & !b & !timeout-> S8001 // // !a & !b & !timeout-> S8001
// ensures that we enter the Init state if both inputs are false // // ensures that we enter the Init state if both inputs are false
// under the condition that a timout has not occured // // under the condition that a timout has not occured
if !DATA[i].a & !DATA[i].b & (TIMEOUT_CNTR > 0) { // if !DATA[i].a & !DATA[i].b {
kassert!(STATE == S8001); // kassert!(STATE == S8001);
} // }
// DISCREPANCY related invariants // // DISCREPANCY related invariants
match STATE { // match STATE {
// Error -> timeout // // Error -> timeout
// error states implies TIMEOUT_CNTR to have expired // // error states implies TIMEOUT_CNTR to have expired
C001 | C002 | C003 => kassert!(TIMEOUT_CNTR == 0), // C001 | C002 | C003 => kassert!(TIMEOUT_CNTR == 0),
// Waiting states -> !timeout // // Waiting states -> !timeout
// wait states implies that TIMEOUT_CNTR not yet expired // // wait states implies that TIMEOUT_CNTR 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), // S8004 | S8005 | S8014 => {
_ => {} // kassert!(0 < TIMEOUT_CNTR && TIMEOUT_CNTR <= DISCREPENCY)
} // }
// _ => {}
// transition invariants // }
if i > 0 {
match STATE_HISTORY[i - 1] { // // transition invariants
C001 | C002 | C003 | S8005 => { // if i > 0 {
// // match STATE_HISTORY[i - 1] {
// no (immediate) transition from error / recover to Enable state // C001 | C002 | C003 | S8005 => {
kassert!(!(STATE == S8000)); // //
} // // no (immediate) transition from error / recover to Enable state
_ => { // kassert!(!(STATE == S8000));
// liveness from Init and Wait states, Enable is ensured // }
if DATA[i].a & DATA[i].b & (TIMEOUT_CNTR > 0) { // _ => {
kassert!(STATE == S8000); // // liveness from Init and Wait states, Enable is ensured
} // if DATA[i].a & DATA[i].b & (TIMEOUT_CNTR > 0) {
} // kassert!(STATE == S8000);
} // }
} // }
// }
// }
STATE_HISTORY[i] = STATE; STATE_HISTORY[i] = STATE;
} }
} }
fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) { fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) {
*STATE = match STATE { *STATE = match STATE {
S8000 => match (data.a, data.b) { S8000 => match (data.a, data.b) {
(F, F) => { (F, F) => S8001,
(F, T) | (T, F) => {
*TIMEOUT_CNTR = DISCREPENCY; *TIMEOUT_CNTR = DISCREPENCY;
S8001 S8005
} }
(F, T) | (T, F) => S8005,
(T, T) => S8000, (T, T) => S8000,
}, },
S8001 => match (data.a, data.b) { S8001 => match (data.a, data.b) {
(F, F) => S8001, (F, F) => S8001,
(F, T) => S8014, (F, T) => {
(T, F) => S8004, *TIMEOUT_CNTR = DISCREPENCY;
S8014
}
(T, F) => {
*TIMEOUT_CNTR = DISCREPENCY;
S8004
}
(T, T) => S8000, (T, T) => S8000,
}, },
S8004 => { S8004 => {
...@@ -129,10 +137,7 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) { ...@@ -129,10 +137,7 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) {
match *TIMEOUT_CNTR { match *TIMEOUT_CNTR {
0 => C001, 0 => C001,
_ => match (data.a, data.b) { _ => match (data.a, data.b) {
(F, _) => { (F, _) => S8001,
*TIMEOUT_CNTR = DISCREPENCY;
S8001
}
(_, T) => S8000, (_, T) => S8000,
_ => S8004, _ => S8004,
}, },
...@@ -143,10 +148,7 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) { ...@@ -143,10 +148,7 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) {
match *TIMEOUT_CNTR { match *TIMEOUT_CNTR {
0 => C002, 0 => C002,
_ => match (data.a, data.b) { _ => match (data.a, data.b) {
(_, F) => { (_, F) => S8001,
*TIMEOUT_CNTR = DISCREPENCY;
S8001
}
(T, _) => S8000, (T, _) => S8000,
_ => S8014, _ => S8014,
}, },
...@@ -157,26 +159,17 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) { ...@@ -157,26 +159,17 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) {
match *TIMEOUT_CNTR { match *TIMEOUT_CNTR {
0 => C003, 0 => C003,
_ => match (data.a, data.b) { _ => match (data.a, data.b) {
(F, F) => { (F, F) => S8001,
*TIMEOUT_CNTR = DISCREPENCY;
S8001
}
_ => S8005, _ => S8005,
}, },
} }
} }
C001 | C002 => match (data.a, data.b) { C001 | C002 => match (data.a, data.b) {
(F, F) => { (F, F) => S8001,
*TIMEOUT_CNTR = DISCREPENCY;
S8001
}
_ => *STATE, _ => *STATE,
}, },
C003 => match (data.a, data.b) { C003 => match (data.a, data.b) {
(F, F) => { (F, F) => S8001,
*TIMEOUT_CNTR = DISCREPENCY;
S8001
}
_ => C003, _ => C003,
}, },
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment