(* include "notsameperiod2.lus" *)

type data = int

const v:data = 0

node current (v : data; c : bool; u : data)
returns (o : data)
let
  o = merge c u ((v fby o) whenot c)
tel

node mem (v : data; cw : bool; u : data)
returns (o : data)
let
  o = v fby (current (v, cw, u))
tel

node mcounter (start, limit : int)
returns (o : int)
let
    o = (start -> (pre o + 1)) % limit;
tel

node twonodes (cw, cr : bool)
returns (ok : bool)
var uw, ur : int;
let
  uw = mcounter((0, 5) when cw);
  ur = mem(v, cw, uw) when cr;
  ok = (mem(v, cr, ur) = mem(v, cw, uw))
       or (mem(v, cr, ur)= mem(v, cw, v fby uw))
       or (mem(v, cr, ur) = mem(v, cw, v fby v fby uw));
tel

(*
node verify (cw, cr : bool)
returns (ok : bool)
let
    ok = twonodes(cw, cr);
    assert(not notsameperiod2(cw, cr));
tel
*)

node main() returns (ok:bool)
  var cw, cr : bool;
let
  cw = false fby not cw;
  cr = not cw;
  ok = twonodes(cw,cr);
tel
