blob: 8c0f80d460b229ce28242062db56f6c70f66cb49 [file] [log] [blame]
MODULE main
IVAR
cmd_to_G1 : {cmd_on, cmd_off, nop};
cmd_to_G2 : {cmd_on, cmd_off, nop};
cmd_to_G3 : {cmd_on, cmd_off, nop};
cmd_to_GB1 : {cmd_closed, cmd_open, nop};
cmd_to_GB2 : {cmd_closed, cmd_open, nop};
cmd_to_GB3 : {cmd_closed, cmd_open, nop};
cmd_to_BB1 : {cmd_closed, cmd_open, nop};
cmd_to_BB2 : {cmd_closed, cmd_open, nop};
cmd_to_BB3 : {cmd_closed, cmd_open, nop};
VAR
v_cmd_to_G1 : {cmd_on, cmd_off, nop};
v_cmd_to_G2 : {cmd_on, cmd_off, nop};
v_cmd_to_G3 : {cmd_on, cmd_off, nop};
v_cmd_to_GB1 : {cmd_closed, cmd_open, nop};
v_cmd_to_GB2 : {cmd_closed, cmd_open, nop};
v_cmd_to_GB3 : {cmd_closed, cmd_open, nop};
v_cmd_to_BB1 : {cmd_closed, cmd_open, nop};
v_cmd_to_BB2 : {cmd_closed, cmd_open, nop};
v_cmd_to_BB3 : {cmd_closed, cmd_open, nop};
ASSIGN
init(v_cmd_to_G1) := nop;
next(v_cmd_to_G1) := cmd_to_G1;
init(v_cmd_to_G2) := nop;
next(v_cmd_to_G2) := cmd_to_G2;
init(v_cmd_to_G3) := nop;
next(v_cmd_to_G3) := cmd_to_G3;
init(v_cmd_to_GB1) := nop;
next(v_cmd_to_GB1) := cmd_to_GB1;
init(v_cmd_to_GB2) := nop;
next(v_cmd_to_GB2) := cmd_to_GB2;
init(v_cmd_to_GB3) := nop;
next(v_cmd_to_GB3) := cmd_to_GB3;
init(v_cmd_to_BB1) := nop;
next(v_cmd_to_BB1) := cmd_to_BB1;
init(v_cmd_to_BB2) := nop;
next(v_cmd_to_BB2) := cmd_to_BB2;
init(v_cmd_to_BB3) := nop;
next(v_cmd_to_BB3) := cmd_to_BB3;
VAR
SC : System_Configuration(cmd_to_G1, cmd_to_G2, cmd_to_G3,
cmd_to_GB1, cmd_to_GB2, cmd_to_GB3, cmd_to_BB1, cmd_to_BB2, cmd_to_BB3);
_masterCC : MasterCC#;
-- Requirements
-- R1. No bus will be connected to more than 1 power source at any time
INVAR (SC.B1_poweredby_G1 -> !(SC.B1_poweredby_G2 | SC.B1_poweredby_G3));
INVAR (SC.B1_poweredby_G2 -> !(SC.B1_poweredby_G1 | SC.B1_poweredby_G3));
INVAR (SC.B1_poweredby_G3 -> !(SC.B1_poweredby_G1 | SC.B1_poweredby_G2));
INVAR (SC.B2_poweredby_G1 -> !(SC.B2_poweredby_G2 | SC.B2_poweredby_G3));
INVAR (SC.B2_poweredby_G2 -> !(SC.B2_poweredby_G1 | SC.B2_poweredby_G3));
INVAR (SC.B2_poweredby_G3 -> !(SC.B2_poweredby_G1 | SC.B2_poweredby_G2));
INVAR (SC.B3_poweredby_G1 -> !(SC.B3_poweredby_G2 | SC.B3_poweredby_G3));
INVAR (SC.B3_poweredby_G2 -> !(SC.B3_poweredby_G1 | SC.B3_poweredby_G3));
INVAR (SC.B3_poweredby_G3 -> !(SC.B3_poweredby_G1 | SC.B3_poweredby_G2));
-- R4. If no power source is on, then all buses will be unpowered
INVARSPEC ((SC.G1.is_off & SC.G2.is_off & SC.G3.is_off) -> (!SC.B1.is_powered & !SC.B2.is_powered & !SC.B3.is_powered));
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE System_Configuration(cmd_to_G1, cmd_to_G2, cmd_to_G3,
cmd_to_GB1, cmd_to_GB2, cmd_to_GB3, cmd_to_BB1, cmd_to_BB2, cmd_to_BB3)
VAR
G1 : Generator_#Extended(cmd_to_G1, init_state_G1);
G2 : Generator_#Extended(cmd_to_G2, init_state_G2);
G3 : Generator_#Extended(cmd_to_G3, init_state_G3);
GB1 : Switch_#Extended(cmd_to_GB1, init_state_GB1);
GB2 : Switch_#Extended(cmd_to_GB2, init_state_GB2);
GB3 : Switch_#Extended(cmd_to_GB3, init_state_GB3);
BB1 : Switch_#Extended(cmd_to_BB1, init_state_BB1);
BB2 : Switch_#Extended(cmd_to_BB2, init_state_BB2);
BB3 : Switch_#Extended(cmd_to_BB3, init_state_BB3);
B1 : Bus(B1_poweredby_G1, B1_poweredby_G2, B1_poweredby_G3);
B2 : Bus(B2_poweredby_G1, B2_poweredby_G2, B2_poweredby_G3);
B3 : Bus(B3_poweredby_G1, B3_poweredby_G2, B3_poweredby_G3);
DEFINE
init_state_BB3 := open;
init_state_BB2 := closed;
init_state_BB1 := open;
init_state_GB3 := open;
init_state_GB2 := closed;
init_state_GB1 := closed;
init_state_G3 := off;
init_state_G2 := on;
init_state_G1 := on;
B1_poweredby_G3_R := (B2_poweredby_G3_R & BB1.is_closed);
B1_poweredby_G3_L := (B3_poweredby_G3_U & BB3.is_closed);
B1_poweredby_G2_R := (B2_poweredby_G2_U & BB1.is_closed);
B1_poweredby_G2_L := (B3_poweredby_G2_L & BB3.is_closed);
B1_poweredby_G1_U := (G1.is_on & GB1.is_closed);
B2_poweredby_G3_R := (B3_poweredby_G3_U & BB2.is_closed);
B2_poweredby_G3_L := (B1_poweredby_G3_L & BB1.is_closed);
B2_poweredby_G2_U := (G2.is_on & GB2.is_closed);
B2_poweredby_G1_R := (B3_poweredby_G1_R & BB2.is_closed);
B2_poweredby_G1_L := (B1_poweredby_G1_U & BB1.is_closed);
B3_poweredby_G3_U := (G3.is_on & GB3.is_closed);
B3_poweredby_G2_R := (B1_poweredby_G2_R & BB3.is_closed);
B3_poweredby_G2_L := (B2_poweredby_G2_U & BB2.is_closed);
B3_poweredby_G1_R := (B1_poweredby_G1_U & BB3.is_closed);
B3_poweredby_G1_L := (B2_poweredby_G1_L & BB2.is_closed);
B1_poweredby_G3 := (B1_poweredby_G3_R | B1_poweredby_G3_L);
B1_poweredby_G2 := (B1_poweredby_G2_R | B1_poweredby_G2_L);
B1_poweredby_G1 := B1_poweredby_G1_U;
B2_poweredby_G3 := (B2_poweredby_G3_R | B2_poweredby_G3_L);
B2_poweredby_G2 := B2_poweredby_G2_U;
B2_poweredby_G1 := (B2_poweredby_G1_R | B2_poweredby_G1_L);
B3_poweredby_G3 := B3_poweredby_G3_U;
B3_poweredby_G2 := (B3_poweredby_G2_R | B3_poweredby_G2_L);
B3_poweredby_G1 := (B3_poweredby_G1_R | B3_poweredby_G1_L);
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE Generator_#Extended(cmd, init_state)
VAR
Gen_StuckOff : Gen_StuckOff_FM_Mod(state_#nominal, off, fault_event_stuck_at_off);
VAR
state_#nominal : {on, off};
IVAR
fault_event_stuck_at_off : boolean;
nominal_event : boolean;
DEFINE
is_on := state = on;
is_off := state = off;
state := Gen_StuckOff.state_#fault;
-- Synthesis does not accept DEFINEs as observables
VAR v_state : {on, off};
ASSIGN v_state := state;
ASSIGN
init(state_#nominal) := init_state;
next(state_#nominal) := case
cmd = cmd_on : on;
cmd = cmd_off : off;
TRUE : state;
esac;
TRANS nominal_event = FALSE;
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE Gen_StuckOff_FM_Mod(state__#read, term_#1, fault_event_stuck_at_off#event)
VAR
stuckAt_Off : stuckAt_Off_fm_Mod(mode = NOMINAL, mode_is_stuckAt_Off, term_#1, state__#read, state__#write, event = stuckAt_Off#failure, event = _#NoEvent);
VAR
mode : {NOMINAL, stuckAt_Off#FAULT};
state__#write : {on, off};
IVAR
event : {_#NoEvent, stuckAt_Off#failure};
DEFINE
NoEvent := event = _#NoEvent;
cando_stuckAt_Off#FAULT := ((mode = NOMINAL & stuckAt_Off.trans_trig_guard_#0) | (mode = stuckAt_Off#FAULT & stuckAt_Off.trans_trig_guard_#1));
state_#fault := case
mode = NOMINAL : state__#read;
mode_is_stuckAt_Off : state__#write;
TRUE : state__#read;
esac;
mode_is_stuckAt_Off := mode = stuckAt_Off#FAULT;
INIT mode = NOMINAL;
TRANS (event in stuckAt_Off#failure <-> fault_event_stuck_at_off#event);
TRANS case
((mode = stuckAt_Off#FAULT & stuckAt_Off.trans_trig_guard_#1) | (mode = NOMINAL & stuckAt_Off.trans_trig_guard_#0)) : next(mode) = stuckAt_Off#FAULT;
TRUE : (next(mode) = mode & NoEvent);
esac;
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE stuckAt_Off_fm_Mod(is_nominal, is_fault, term, input, varout, _failure, ev_#NoEvent)
VAR
stuckAt_OffEM : stuckAt_Off_fm_EM_Mod(is_nominal, is_fault, term, input, varout);
DEFINE
failure := _failure;
NoEvent := ev_#NoEvent;
trans_trig_guard_#0 := failure;
trans_trig_guard_#1 := NoEvent;
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE stuckAt_Off_fm_EM_Mod(is_nominal, is_fault, term, input, varout)
TRANS (!(!is_fault & next(is_fault)) | next(varout) = term);
TRANS (!(is_fault & next(is_fault)) | next(varout) = varout);
TRANS (!(is_nominal & next(is_nominal)) | next(varout) = varout);
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE Switch_#Extended(cmd, init_state)
VAR
Switch_StuckClosed_StuckOpen : Switch_StuckClosed_StuckOpen_FM_Mod(state_#nominal, closed, open, fault_event_stuck_at_closed, nominal_event, fault_event_stuck_at_open);
VAR
state_#nominal : {open, closed};
IVAR
fault_event_stuck_at_closed : boolean;
fault_event_stuck_at_open : boolean;
nominal_event : boolean;
DEFINE
is_closed := state = closed;
is_open := state = open;
state := Switch_StuckClosed_StuckOpen.state_#fault;
VAR v_state : {open, closed};
ASSIGN v_state := state;
ASSIGN
init(state_#nominal) := init_state;
next(state_#nominal) := case
cmd = cmd_open : open;
cmd = cmd_closed : closed;
TRUE : state;
esac;
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE Switch_StuckClosed_StuckOpen_FM_Mod(state__#read, term_#1, term_#2, fault_event_stuck_at_closed#event, nominal_event#event, fault_event_stuck_at_open#event)
VAR
stuckAt_Closed : stuckAt_Closed_fm_Mod(mode = NOMINAL, mode_is_stuckAt_Closed, term_#1, state__#read, state__#write, event = stuckAt_Closed#failure, event = stuckAt_Closed#self_fixed, event = _#NoEvent);
stuckAt_Open : stuckAt_Open_fm_Mod(mode = NOMINAL, mode_is_stuckAt_Open, term_#2, state__#read, state__#write, event = stuckAt_Open#failure, event = stuckAt_Open#self_fixed, event = _#NoEvent);
VAR
mode : {NOMINAL, stuckAt_Closed#FAULT, stuckAt_Open#FAULT};
state__#write : {open, closed};
IVAR
event : {_#NoEvent, stuckAt_Closed#failure, stuckAt_Closed#self_fixed, stuckAt_Open#failure, stuckAt_Open#self_fixed};
DEFINE
NoEvent := event = _#NoEvent;
cando_stuckAt_Closed#FAULT := ((mode = NOMINAL & stuckAt_Closed.trans_trig_guard_#0) | (mode = stuckAt_Closed#FAULT & stuckAt_Closed.trans_trig_guard_#1));
cando_stuckAt_Open#FAULT := ((mode = NOMINAL & stuckAt_Open.trans_trig_guard_#0) | (mode = stuckAt_Open#FAULT & stuckAt_Open.trans_trig_guard_#1));
state_#fault := case
mode = NOMINAL : state__#read;
(mode_is_stuckAt_Open | mode_is_stuckAt_Closed) : state__#write;
TRUE : state__#read;
esac;
mode_is_stuckAt_Closed := mode = stuckAt_Closed#FAULT;
mode_is_stuckAt_Open := mode = stuckAt_Open#FAULT;
INIT mode = NOMINAL;
TRANS (event in stuckAt_Closed#failure <-> fault_event_stuck_at_closed#event);
TRANS (event in stuckAt_Open#self_fixed union stuckAt_Closed#self_fixed <-> nominal_event#event);
TRANS (event in stuckAt_Open#failure <-> fault_event_stuck_at_open#event);
TRANS case
(mode = stuckAt_Open#FAULT & stuckAt_Open.trans_trig_guard_#2) : next(mode) = NOMINAL;
((mode = stuckAt_Open#FAULT & stuckAt_Open.trans_trig_guard_#1) | (mode = NOMINAL & stuckAt_Open.trans_trig_guard_#0)) : next(mode) = stuckAt_Open#FAULT;
(mode = stuckAt_Closed#FAULT & stuckAt_Closed.trans_trig_guard_#2) : next(mode) = NOMINAL;
((mode = stuckAt_Closed#FAULT & stuckAt_Closed.trans_trig_guard_#1) | (mode = NOMINAL & stuckAt_Closed.trans_trig_guard_#0)) : next(mode) = stuckAt_Closed#FAULT;
TRUE : (next(mode) = mode & NoEvent);
esac;
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE stuckAt_Closed_fm_Mod(is_nominal, is_fault, term, input, varout, _failure, _self_fixed, ev_#NoEvent)
VAR
stuckAt_ClosedEM : stuckAt_Closed_fm_EM_Mod(is_nominal, is_fault, term, input, varout);
DEFINE
failure := _failure;
self_fixed := _self_fixed;
NoEvent := ev_#NoEvent;
trans_trig_guard_#0 := failure;
trans_trig_guard_#1 := (NoEvent & !self_fixed);
trans_trig_guard_#2 := self_fixed;
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE stuckAt_Closed_fm_EM_Mod(is_nominal, is_fault, term, input, varout)
TRANS (!(!is_fault & next(is_fault)) | next(varout) = term);
TRANS (!(is_fault & next(is_fault)) | next(varout) = varout);
TRANS (!(is_nominal & next(is_nominal)) | next(varout) = varout);
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE stuckAt_Open_fm_Mod(is_nominal, is_fault, term, input, varout, _failure, _self_fixed, ev_#NoEvent)
VAR
stuckAt_OpenEM : stuckAt_Open_fm_EM_Mod(is_nominal, is_fault, term, input, varout);
DEFINE
failure := _failure;
self_fixed := _self_fixed;
NoEvent := ev_#NoEvent;
trans_trig_guard_#0 := failure;
trans_trig_guard_#1 := (NoEvent & !self_fixed);
trans_trig_guard_#2 := self_fixed;
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE stuckAt_Open_fm_EM_Mod(is_nominal, is_fault, term, input, varout)
TRANS (!(!is_fault & next(is_fault)) | next(varout) = term);
TRANS (!(is_fault & next(is_fault)) | next(varout) = varout);
TRANS (!(is_nominal & next(is_nominal)) | next(varout) = varout);
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE Bus(in1, in2, in3)
VAR
state : {working, broken};
DEFINE
is_broken := state = broken;
is_powered := (state = working & count(in1, in2, in3) = 1);
ASSIGN
init(state) := case
count(in1, in2, in3) > 1 : broken;
TRUE : working;
esac;
next(state) := case
next(count(in1, in2, in3) > 1) : broken;
TRUE : state;
esac;
-- ===============================================================================
-- End of module
-- ===============================================================================
-- ===============================================================================
MODULE MasterCC#
-- ===============================================================================
-- End of module
-- ===============================================================================