'dc' Dialect
Dynamic Control
This is the dc
dialect, used to represent dynamic control constructs with
handshaking semantics.
Operations
dc.branch
(circt::dc::BranchOp)
Branch operation
Syntax:
operation ::= `dc.branch` $condition attr-dict
The incoming select token is propagated to the selected output based on the value of the condition.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
condition | must be a !dc.value |
Results:
Result | Description |
---|---|
trueToken | |
falseToken |
dc.buffer
(circt::dc::BufferOp)
Buffer operation
Syntax:
operation ::= `dc.buffer` `[` $size `]` $input ($initValues^)? attr-dict `:` type($input)
The buffer operation may buffer a dc.value
or dc.token
typed SSA value.
In practice, this provides a mechanism to buffer data-side values in a
control-sensitive manner.
Example:
%value_out = dc.buffer [2] %value : !dc.value<i32, i1, i4>
Hardware/CIRCT context note: buffers have no dialect-side notion of
cycles/stages/implementation. It is up to the generating pass to interpret
buffer semantics - some may want to add attributes to a single buffer, some
may want to stagger dc.buffer
s sequentially.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Attributes:
Attribute | MLIR Type | Description |
---|---|---|
size | ::mlir::IntegerAttr | 64-bit signless integer attribute whose minimum value is 1 |
initValues | ::mlir::ArrayAttr | array attribute |
Operands:
Operand | Description |
---|---|
input | must be a !dc.value or !dc.token type |
Results:
Result | Description |
---|---|
output | must be a !dc.value or !dc.token type |
dc.fork
(circt::dc::ForkOp)
Splits the incoming token into multiple outgoing tokens
This operator splits the incoming token into multiple outgoing tokens.
Example:
%0, %1 = dc.fork [2] %a : !dc.token, !dc.token
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
token |
Results:
Result | Description |
---|---|
outputs | variadic of |
dc.from_esi
(circt::dc::FromESIOp)
Convert an ESI-typed value to a DC-typed value
Syntax:
operation ::= `dc.from_esi` $input attr-dict `:` type($input)
Convert an ESI channel to a dc.token/dc.value
.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
input | an ESI channel |
Results:
Result | Description |
---|---|
output | must be a !dc.value or !dc.token type |
dc.join
(circt::dc::JoinOp)
Synchronizes the incoming tokens with the outgoing token
Syntax:
operation ::= `dc.join` $tokens attr-dict
This operator synchronizes all incoming tokens. Synchronization implies applying join semantics in between all in- and output ports.
Example:
%0 = dc.join %a, %b
Traits: AlwaysSpeculatableImplTrait
, Commutative
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
tokens | variadic of |
Results:
Result | Description |
---|---|
output |
dc.merge
(circt::dc::MergeOp)
Merge operation
Syntax:
operation ::= `dc.merge` $first `,` $second attr-dict
Select one of the incoming tokens and emits an output stating which token was selected. If multiple tokens are ready to transact at the same time, the tokens are selected with priority, from first to last (i.e. left to right in the IR). This property ensures deterministic behavior.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
first | |
second |
Results:
Result | Description |
---|---|
output | must be a !dc.value |
dc.pack
(circt::dc::PackOp)
Pack operation
Syntax:
operation ::= `dc.pack` $token `,` $input attr-dict `:` type($input)
An operation which packs together a !dc.token value with some other value.
Typically, a dc.pack
op will be used to facilitate data-dependent
control flow, wherein a dc.value<i1>
is to be generated as a select
signal for either a dc.branch
or dc.select
operation.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
token | |
input | any type |
Results:
Result | Description |
---|---|
output |
dc.select
(circt::dc::SelectOp)
Select operation
Syntax:
operation ::= `dc.select` $condition `,` $trueToken `,` $falseToken attr-dict
An input token is selected based on the value of the incoming select signal, and propagated to the single output. Only the condition value, the selected input, and the output will be transacted.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
condition | must be a !dc.value |
trueToken | |
falseToken |
Results:
Result | Description |
---|---|
output |
dc.sink
(circt::dc::SinkOp)
Sink operation
Syntax:
operation ::= `dc.sink` $token attr-dict
The sink operation will always accept any incoming tokens, and discard them.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
token |
dc.source
(circt::dc::SourceOp)
Source operation
Syntax:
operation ::= `dc.source` attr-dict
The source operation will always produce a token.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Results:
Result | Description |
---|---|
output |
dc.to_esi
(circt::dc::ToESIOp)
Convert a DC-typed value to an ESI-typed value
Syntax:
operation ::= `dc.to_esi` $input attr-dict `:` type($input)
Convert a dc.token/dc.value
to an ESI channel.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
input | must be a !dc.value or !dc.token type |
Results:
Result | Description |
---|---|
output | an ESI channel |
dc.unpack
(circt::dc::UnpackOp)
Unpack operation
Syntax:
operation ::= `dc.unpack` $input attr-dict `:` qualified(type($input))
An operation which unpacks a !dc.value value into a !dc.token value and its constituent values.
Traits: AlwaysSpeculatableImplTrait
Interfaces: ConditionallySpeculatable
, InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
Effects: MemoryEffects::Effect{}
Operands:
Operand | Description |
---|---|
input |
Results:
Result | Description |
---|---|
token | |
output | any type |
Types
TokenType
Syntax: !dc.token
A !dc.token
-typed value represents a control value with handshake semantics.
ValueType
Syntax:
!dc.value<
Type # innerType
>
A !dc.value
-typed value represents a value which is wrapped with
!dc.token
semantics. This type is used to attach control semantics to
values. The inner value may be of any type.
Parameters:
Parameter | C++ type | Description |
---|---|---|
innerType | Type |