---------------------- | |
-- MODULE generator -- | |
---------------------- | |
MODULE generator(cmd) | |
VAR | |
active: boolean; | |
voltage: {high, low}; | |
ASSIGN | |
init(active):= cmd = on; | |
next(active):= case | |
cmd = on: TRUE; | |
cmd = off: FALSE; | |
TRUE: active; | |
esac; | |
voltage := high; | |
------------------- | |
-- MODULE device -- | |
------------------- | |
MODULE device(voltage) | |
-- device is not alive if voltage goes to low for at least 2 time steps | |
VAR counter: 0..2; | |
ASSIGN | |
init(counter):= case | |
voltage = high: 0; | |
TRUE: 1; | |
esac; | |
next(counter):= case | |
voltage = high: 0; | |
voltage = low & counter < 2: counter+1; | |
TRUE: 2; | |
esac; | |
DEFINE | |
alive:= (counter < 2); | |
----------------- | |
-- MODULE main -- | |
----------------- | |
MODULE main | |
VAR | |
mode: {primary_mode, spare_mode}; | |
primary: generator(cmd_primary); | |
spare: generator(cmd_spare); | |
cmd_primary: {on, off, nop}; | |
cmd_spare: {on, off, nop}; | |
voltage: {high, low}; | |
dev: device(voltage); | |
ASSIGN | |
-- initially in primary mode | |
-- goes to spare mode and stays there, if primary voltage is low | |
init(mode) := primary_mode; | |
next(mode) := case | |
mode = primary_mode & primary.voltage = high: primary_mode; | |
TRUE: spare_mode; | |
esac; | |
voltage:= case | |
mode = primary_mode: primary.voltage; | |
TRUE: spare.voltage; | |
esac; | |
init(cmd_primary):= on; | |
next(cmd_primary):= case | |
mode = primary_mode & primary.voltage = low: off; | |
TRUE: nop; | |
esac; | |
init(cmd_spare):= off; | |
next(cmd_spare):= case | |
mode = primary_mode & primary.voltage = low: on; | |
TRUE: nop; | |
esac; | |
INVARSPEC NAME alive:= dev.alive; |