blob: b91463d51a72d062d4609d4f252cca5dcdddfb76 [file] [log] [blame]
----------------------
-- 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;