# 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_DUPLICATES` property is 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. The `CHAN_DUPLICATES` property determines is a channel can write the same value to the channel twice. ## 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) uses this callback to detect when a channel is modified an run other callbacks.