----------------------------------------------------------------
node COUNT(init,incr:int;reset:bool) returns (n:int);
let
  n = init -> if reset then init else pre(n)+incr;
tel

----------------------------------------------------------------
node TWO_STATES (init,set,reset:bool) returns (state:bool);
let
  state = init -> if set and not pre(state) then true
                  else if reset and pre(state) then false
                       else pre(state);
tel


----------------------------------------------------------------
-- node stopwatch (start_stop,reset: bool) returns (time:int);
-- var CK, running: bool;
-- let
--   time = current(COUNT((0,1,reset) when CK));
--   CK = true -> running or reset;
--   running = TWO_STATES(false, start_stop, start_stop);
-- tel

----------------------------------------------------------------
-- first attempt:
----------------------------------------------------------------
node stopwatch (start_stop,reset: bool) returns (time:int);
var CK, running: bool;
let
  time = 0 -> if CK then COUNT(0,1,reset) else pre time;
  CK = true -> running or reset;
  running = TWO_STATES(false, start_stop, start_stop);
tel