48 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Mux
 | 
						|
 | 
						|
The emulator provides a mechanism to interconnect [channels](../channels) in a
 | 
						|
similar way as an [analog
 | 
						|
multiplexer](https://en.wikipedia.org/wiki/Multiplexer) by using the `mux`
 | 
						|
module.
 | 
						|
 | 
						|
Multiplexers or muxers have one output channel, one select channel and a
 | 
						|
variable number of input channels (including zero). Each input channel is
 | 
						|
registered in the multiplexer by using a key with a given value. In the normal
 | 
						|
operation of a mux, the value of the select channel is used to find an input
 | 
						|
with a matching key. When there is no match, the output value is set to null.
 | 
						|
 | 
						|
Multiplexers can be configured to execute a custom select function, which will
 | 
						|
take the value of the select channel and determine which input should be
 | 
						|
selected. This allows a multiplexer to act as a filter too.
 | 
						|
 | 
						|
## Tracking
 | 
						|
 | 
						|
The typical use of multiplexers is to implement the tracking modes of channels.
 | 
						|
As an example, the following diagram shows three multiplexers used to implement
 | 
						|
the subsystem view of [Nanos6](../nanos6):
 | 
						|
 | 
						|

 | 
						|
 | 
						|
The first mux0 uses the thread state channel to filter the value of the
 | 
						|
subsystem channel and only pass it to the output when the thread is in the
 | 
						|
Running state (green). Then the filtered subsystem channel is connected to an
 | 
						|
input of a second mux (mux1) which selects the current input of the thread
 | 
						|
running in the CPU0. The output *nanos6.cpu.subsystem.run* is then connected to
 | 
						|
the Paraver timeline in the row corresponding to the CPU0, which shows the
 | 
						|
subsystem of the currently running thread.
 | 
						|
 | 
						|
The Nanos6 subsystem channel is also connected to the mux2, which forwards the
 | 
						|
value to the output only when the thread state is Active. The output is directly
 | 
						|
connected to the Paraver row assigned to that thread. This channels shows the
 | 
						|
subsystem of the thread by only when is active (not paused nor dead). You can
 | 
						|
see that the subsystem is shown in the thread0 at the current time (red dotted
 | 
						|
line) when in the CPU0 the subsystem has been hidden when the thread stops being
 | 
						|
in the Running state (yellow). 
 | 
						|
 | 
						|
Multiplexers allow models to interact with each other in a controlled way. In
 | 
						|
the example, the blue channel (*nanos6.thread0.subsystem*) is directly modified by
 | 
						|
the Nanos6 model when a new event is received. While the red channels are
 | 
						|
controled by the ovni model.  The rest of the channels are automatically updated
 | 
						|
in the propagation phase of the [bay](../patchbay) allowing the ovni model to
 | 
						|
modify the Nanos6 Paraver view of the subsystems.
 |