Allows mkdocs to discover broken links when the pointed document has moved.
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Channels
 | 
						|
 | 
						|
As the emulation progresses, information is written in the PRV trace to record
 | 
						|
the new states. The emulator has specific mechanism to handle the output of new
 | 
						|
states in the PRV trace via channels. A channel stores a value that represents
 | 
						|
an state at a given point in time and typically corresponds to the value that
 | 
						|
will be observed in the Paraver timeline.
 | 
						|
 | 
						|
!!! Note
 | 
						|
 | 
						|
	The emulator receives input *events* and performs *state*
 | 
						|
	transitions which are written into the Paraver trace.
 | 
						|
 | 
						|
Channels become dirty when a new value is written to them. No other
 | 
						|
modifications are allowed by default until the channel is flushed by calling
 | 
						|
`chan_flush()`. This behavior can be controlled with the `CHAN_DIRTY_WRITE`
 | 
						|
property. By default, a duplicated value cannot be written into a channel,
 | 
						|
unless the `CHAN_ALLOW_DUP` or `CHAN_IGNORE_DUP` properties are set.
 | 
						|
 | 
						|
A channel has an unique name used to identify the channel when debugging and
 | 
						|
also to create derived channels. The name can be set following the printf style
 | 
						|
when calling `chan_init()`.
 | 
						|
 | 
						|
## Types
 | 
						|
 | 
						|
There are two types of channels, **single** and **stack**. The type single only
 | 
						|
stores one value which is updated by `chan_set()`. The stack type allows the
 | 
						|
channel to record multiple values in a stack by using `chan_push()` and
 | 
						|
`chan_pop()`. The value of the channels is the topmost in the stack (the last
 | 
						|
pushed).
 | 
						|
 | 
						|
Notice that the `chan_pop()` function uses the same value being pop()'ed as
 | 
						|
argument. The function checks that the stack contains the expected value,
 | 
						|
forcing the emulator to always receive a matching pair of push and pop values.
 | 
						|
 | 
						|
After the channel initialization, the value of the channels is null. A channel
 | 
						|
with an empty stack also returns the value null when being read.
 | 
						|
 | 
						|
## Data value
 | 
						|
 | 
						|
The data type of a channel is handled by the `value` structure. This structure
 | 
						|
can store a null value, a 64 bit integer or a double. Any data type can be
 | 
						|
written to a channel and multiple data types can be stored in the stack.
 | 
						|
 | 
						|
!!! Note
 | 
						|
 | 
						|
    For now only null and int64 types are allowed when the channel is connected
 | 
						|
    to a Paraver trace.
 | 
						|
 | 
						|
## Properties
 | 
						|
 | 
						|
Channels have properties that can be set by `chan_prop_set()`. Setting the
 | 
						|
`CHAN_DIRTY_WRITE` property to true allows a channel to modify its value while
 | 
						|
being in the dirty state.
 | 
						|
 | 
						|
## Duplicate values
 | 
						|
 | 
						|
By default, writing the same value to a channel twice is forbidden and will
 | 
						|
result in a error. The property `CHAN_ALLOW_DUP` allows writing the same value
 | 
						|
to the channel. However, the property `CHAN_IGNORE_DUP` will ignore the attempt
 | 
						|
to write the duplicated value with no error.
 | 
						|
 | 
						|
## Callback
 | 
						|
 | 
						|
A unique function can be set to each channel which will be called once a channel
 | 
						|
becomes dirty with `chan_set_dirty_cb()`. This callback will be called before
 | 
						|
`chan_set()`, `chan_push()` or `chan_pop()` returns. The [patch
 | 
						|
bay](patchbay.md) uses this callback to detect when a channel is modified an run
 | 
						|
other callbacks.
 |