#version 100 composite main(out c) { channel ao -> ai; channel bo -> bi; new sync_component(ai, bo); new binary_replicator(bi, ao, c); } primitive sync(in a, out b) { while (true) { sync { if (fires(a) && fires(b)) { msg x = get(a); put(b, x); } else { assert !fires(a) && !fires(b); } } } } primitive binary_replicator(in b, out a, out c) { while (true) { sync { if (fires(b) && fires(a) && fires(c)) { msg x = get(b); put(a, x); put(c, x); } else { assert !fires(a) && !fires(b) && !fires(c); } } } }