interface I { in void e(); out void f(); out void g(); behaviour { subint Count {0..2}; Count count = 0; [count != 0] on e: illegal; [count == 0] on e: count = 1; [count == 1] on inevitable: {count = 2; f;} [count == 2] on inevitable: {count = 0; g;} } } component C { provides I p; requires I r; behaviour { requires dzn.async i; on p.e(): {r.e(); i.req();} on i.ack(): p.f(); on r.f(): p.g(); on r.g(): {} } } component async_rank { provides I p; requires I r; system { C c2; C c1; p <=> c1.p; c1.r <=> c2.p; c2.r <=> r; } }