In contrast to a Non-Receptive Mixer, the environment of a Mixer need not guarantee mutual exclusion of the passive requests. A request on a passive port while the Mixer is `busy' (processing a request on the other passive port) is not lost but is handled when the Mixer becomes `idle' again.
When a Mixer receives requests on both passive ports, it will process exactly one of them (and delay the other). The specification leaves the choice open. Often there is a fairness requirement on this choice: if a choice situation arises `infinitely often' then both outputs are chosen `infinitely often'.
Specification in Verdect:
define MIXER = |[ a0, a1, a, b0, b1 :: pref *[ ar?; a0; a1; aa! ] || pref *[ br?; b0; b1; ba! ] || pref *[ (a0 | b0); a ] || pref *[ a; cr!; ca?; (a1 | b1) ] ]| endAlso available through this link
Specification in DI Algebra:
NAME = "Mixer" I = { r0, r1, a } O = { a0, a1, r } MX = [ r0? -> r!; M0 , r1? -> r!; M1 ] M0 = [ r1? -> M2 , a? -> a0!; MX ] M1 = [ r0? -> M2 , a? -> a1!; MX ] M2 = a?; [ a0! -> r!; M1, a1! -> r!; M0 ] [{r0},{a0}] [{r1},{a1}] [{r},{a}]Also available through this link
The roles of ports a and b can be interchanged:
MIX(a, b; c) =
MIX(b, a; c)
A Mixer is not output deterministic, since there is output disabling in states 9 and 10 (not in 11!). The output nondeterminism is dynamic.
No information available
No information available
The Mixer can be generalized to a k-mixer, which multiplexes k passive ports onto one active port. A Mixer is a 2-Mixer.