mlir.dialects._emitc_ops_gen

Attributes

Classes

_Dialect

AddOp

With the emitc.add operation the arithmetic operator + (addition) can

ApplyOp

With the emitc.apply operation the operators & (address of) and * (contents of)

AssignOp

The emitc.assign operation stores an SSA value to the location designated by an

BitwiseAndOp

With the emitc.bitwise_and operation the bitwise operator & (and) can

BitwiseLeftShiftOp

With the emitc.bitwise_left_shift operation the bitwise operator <<

BitwiseNotOp

With the emitc.bitwise_not operation the bitwise operator ~ (not) can

BitwiseOrOp

With the emitc.bitwise_or operation the bitwise operator | (or)

BitwiseRightShiftOp

With the emitc.bitwise_right_shift operation the bitwise operator >>

BitwiseXorOp

With the emitc.bitwise_xor operation the bitwise operator ^ (xor)

CallOp

The emitc.call operation represents a direct call to an emitc.func

CallOpaqueOp

The emitc.call_opaque operation represents a C++ function call. The callee

CastOp

The emitc.cast operation performs an explicit type conversion and is emitted

ClassOp

The emitc.class operation defines a C++ class, acting as a container

CmpOp

With the emitc.cmp operation the comparison operators ==, !=, <, <=, >, >=, <=>

ConditionalOp

With the emitc.conditional operation the ternary conditional operator can

ConstantOp

The emitc.constant operation produces an SSA value equal to some constant

DeclareFuncOp

The emitc.declare_func operation allows to insert a function declaration for an

DivOp

With the emitc.div operation the arithmetic operator / (division) can

DoOp

The emitc.do operation represents a C/C++ do-while loop construct that

ExpressionOp

The emitc.expression operation returns a single SSA value which is yielded by

FieldOp

The emitc.field operation declares a named field within an emitc.class

FileOp

A file represents a single C/C++ file.

ForOp

The emitc.for operation represents a C loop of the following form:

FuncOp

Operations within the function cannot implicitly capture values defined

GetFieldOp

The emitc.get_field operation retrieves the lvalue of a

GetGlobalOp

The emitc.get_global operation retrieves the lvalue of a

GlobalOp

The emitc.global operation declares or defines a named global variable.

IfOp

The emitc.if operation represents an if-then-else construct for

IncludeOp

The emitc.include operation allows to define a source file inclusion via the

LiteralOp

The emitc.literal operation produces an SSA value equal to some constant

LoadOp

This operation loads the content of a modifiable lvalue into an SSA value.

LogicalAndOp

With the emitc.logical_and operation the logical operator && (and) can

LogicalNotOp

With the emitc.logical_not operation the logical operator ! (negation) can

LogicalOrOp

With the emitc.logical_or operation the logical operator || (inclusive or)

MemberOfPtrOp

With the emitc.member_of_ptr operation the member access operator ->

MemberOp

With the emitc.member operation the member access operator . can be

MulOp

With the emitc.mul operation the arithmetic operator * (multiplication) can

RemOp

With the emitc.rem operation the arithmetic operator % (remainder) can

ReturnOp

The emitc.return operation represents a return operation within a function.

SubOp

With the emitc.sub operation the arithmetic operator - (subtraction) can

SubscriptOp

With the emitc.subscript operation the subscript operator [] can be applied

SwitchOp

The emitc.switch is a control-flow operation that branches to one of

UnaryMinusOp

With the emitc.unary_minus operation the unary operator - (minus) can be

UnaryPlusOp

With the emitc.unary_plus operation the unary operator + (plus) can be

VariableOp

The emitc.variable operation produces an SSA value equal to some value

VerbatimOp

The emitc.verbatim operation produces no results and the value is emitted as is

YieldOp

The emitc.yield terminates its parent EmitC op's region, optionally yielding

Functions

add(→ _ods_ir)

apply(→ _ods_ir)

assign(→ AssignOp)

bitwise_and(→ _ods_ir)

bitwise_left_shift(→ _ods_ir)

bitwise_not(→ _ods_ir)

bitwise_or(→ _ods_ir)

bitwise_right_shift(→ _ods_ir)

bitwise_xor(→ _ods_ir)

call(→ Union[_ods_ir, _ods_ir, CallOp])

call_opaque(→ Union[_ods_ir, _ods_ir, CallOpaqueOp])

cast(→ _ods_ir)

class_(→ ClassOp)

cmp(→ _ods_ir)

conditional(→ _ods_ir)

constant(→ _ods_ir)

declare_func(→ DeclareFuncOp)

div(→ _ods_ir)

do(→ DoOp)

expression(→ _ods_ir)

field(→ FieldOp)

file(→ FileOp)

for_(→ ForOp)

func(→ FuncOp)

get_field(→ _ods_ir)

get_global(→ _ods_ir)

global_(→ GlobalOp)

if_(→ IfOp)

include(→ IncludeOp)

literal(→ _ods_ir)

load(→ _ods_ir)

logical_and(→ _ods_ir)

logical_not(→ _ods_ir)

logical_or(→ _ods_ir)

member_of_ptr(→ _ods_ir)

member(→ _ods_ir)

mul(→ _ods_ir)

rem(→ _ods_ir)

return_(→ ReturnOp)

sub(→ _ods_ir)

subscript(→ _ods_ir)

switch(→ SwitchOp)

unary_minus(→ _ods_ir)

unary_plus(→ _ods_ir)

variable(→ _ods_ir)

verbatim(→ VerbatimOp)

yield_(→ YieldOp)

Module Contents

mlir.dialects._emitc_ops_gen._ods_ir
class mlir.dialects._emitc_ops_gen._Dialect(descriptor: object)

Bases: _ods_ir

DIALECT_NAMESPACE = 'emitc'
class mlir.dialects._emitc_ops_gen.AddOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.add operation the arithmetic operator + (addition) can be applied.

Example:

// Custom form of the addition operation.
%0 = emitc.add %arg0, %arg1 : (i32, i32) -> i32
%1 = emitc.add %arg2, %arg3 : (!emitc.ptr<f32>, i32) -> !emitc.ptr<f32>
// Code emitted for the operations above.
int32_t v5 = v1 + v2;
float* v6 = v3 + v4;
OPERATION_NAME = 'emitc.add'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.add(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.ApplyOp(result, applicableOperator, operand, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.apply operation the operators & (address of) and * (contents of) can be applied to a single operand.

Example:

// Custom form of applying the & operator.
%0 = emitc.apply "&"(%arg0) : (!emitc.lvalue<i32>) -> !emitc.ptr<i32>

// Generic form of the same operation.
%0 = "emitc.apply"(%arg0) {applicableOperator = "&"}
    : (!emitc.lvalue<i32>) -> !emitc.ptr<i32>
OPERATION_NAME = 'emitc.apply'
_ODS_REGIONS = (0, True)
operand() _ods_ir
applicableOperator() _ods_ir
result() _ods_ir

Shortcut to get an op result if it has only one (throws an error otherwise).

mlir.dialects._emitc_ops_gen.apply(result, applicable_operator, operand, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.AssignOp(var, value, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.assign operation stores an SSA value to the location designated by an EmitC variable. This operation doesn’t return any value. The assigned value must be of the same type as the variable being assigned. The operation is emitted as a C/C++ ‘=’ operator.

Example:

// Integer variable
%0 = "emitc.variable"(){value = 42 : i32} : () -> !emitc.lvalue<i32>
%1 = emitc.call_opaque "foo"() : () -> (i32)

// Assign emitted as `... = ...;`
"emitc.assign"(%0, %1) : (!emitc.lvalue<i32>, i32) -> ()
OPERATION_NAME = 'emitc.assign'
_ODS_REGIONS = (0, True)
var() _ods_ir
value() _ods_ir
mlir.dialects._emitc_ops_gen.assign(var, value, *, loc=None, ip=None) AssignOp
class mlir.dialects._emitc_ops_gen.BitwiseAndOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.bitwise_and operation the bitwise operator & (and) can be applied.

Example:

%0 = emitc.bitwise_and %arg0, %arg1 : (i32, i32) -> i32
// Code emitted for the operation above.
int32_t v3 = v1 & v2;
OPERATION_NAME = 'emitc.bitwise_and'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.bitwise_and(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.BitwiseLeftShiftOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.bitwise_left_shift operation the bitwise operator << (left shift) can be applied.

Example:

%0 = emitc.bitwise_left_shift %arg0, %arg1 : (i32, i32) -> i32
// Code emitted for the operation above.
int32_t v3 = v1 << v2;
OPERATION_NAME = 'emitc.bitwise_left_shift'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.bitwise_left_shift(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.BitwiseNotOp(result, _gen_arg_0, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.bitwise_not operation the bitwise operator ~ (not) can be applied.

Example:

%0 = emitc.bitwise_not %arg0 : (i32) -> i32
// Code emitted for the operation above.
int32_t v2 = ~v1;
OPERATION_NAME = 'emitc.bitwise_not'
_ODS_REGIONS = (0, True)
mlir.dialects._emitc_ops_gen.bitwise_not(result, _gen_arg_0, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.BitwiseOrOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.bitwise_or operation the bitwise operator | (or) can be applied.

Example:

%0 = emitc.bitwise_or %arg0, %arg1 : (i32, i32) -> i32
// Code emitted for the operation above.
int32_t v3 = v1 | v2;
OPERATION_NAME = 'emitc.bitwise_or'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.bitwise_or(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.BitwiseRightShiftOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.bitwise_right_shift operation the bitwise operator >> (right shift) can be applied.

Example:

%0 = emitc.bitwise_right_shift %arg0, %arg1 : (i32, i32) -> i32
// Code emitted for the operation above.
int32_t v3 = v1 >> v2;
OPERATION_NAME = 'emitc.bitwise_right_shift'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.bitwise_right_shift(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.BitwiseXorOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.bitwise_xor operation the bitwise operator ^ (xor) can be applied.

Example:

%0 = emitc.bitwise_xor %arg0, %arg1 : (i32, i32) -> i32
// Code emitted for the operation above.
int32_t v3 = v1 ^ v2;
OPERATION_NAME = 'emitc.bitwise_xor'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.bitwise_xor(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.CallOp(result, callee, operands_, *, arg_attrs=None, res_attrs=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.call operation represents a direct call to an emitc.func that is within the same symbol scope as the call. The operands and result type of the call must match the specified function type. The callee is encoded as a symbol reference attribute named “callee”.

Example:

%2 = emitc.call @my_add(%0, %1) : (f32, f32) -> f32
OPERATION_NAME = 'emitc.call'
_ODS_REGIONS = (0, True)
operands_() _ods_ir
callee() _ods_ir
arg_attrs() _ods_ir | None
res_attrs() _ods_ir | None
mlir.dialects._emitc_ops_gen.call(result, callee, operands_, *, arg_attrs=None, res_attrs=None, loc=None, ip=None) _ods_ir | _ods_ir | CallOp
class mlir.dialects._emitc_ops_gen.CallOpaqueOp(result, callee, operands_, *, args=None, template_args=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.call_opaque operation represents a C++ function call. The callee can be an arbitrary non-empty string. The call allows specifying order of operands and attributes in the call as follows:

  • integer value of index type refers to an operand;

  • attribute which will get lowered to constant value in call;

Example:

// Custom form defining a call to `foo()`.
%0 = emitc.call_opaque "foo" () : () -> i32

// Generic form of the same operation.
%0 = "emitc.call_opaque"() {callee = "foo"} : () -> i32
OPERATION_NAME = 'emitc.call_opaque'
_ODS_REGIONS = (0, True)
operands_() _ods_ir
callee() _ods_ir
args() _ods_ir | None
template_args() _ods_ir | None
mlir.dialects._emitc_ops_gen.call_opaque(result, callee, operands_, *, args=None, template_args=None, loc=None, ip=None) _ods_ir | _ods_ir | CallOpaqueOp
class mlir.dialects._emitc_ops_gen.CastOp(dest, source, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.cast operation performs an explicit type conversion and is emitted as a C-style cast expression. It can be applied to integer, float, index and EmitC types.

Example:

// Cast from `int32_t` to `float`
%0 = emitc.cast %arg0: i32 to f32

// Cast from `void` to `int32_t` pointer
%1 = emitc.cast %arg1 :
    !emitc.ptr<!emitc.opaque<"void">> to !emitc.ptr<i32>
OPERATION_NAME = 'emitc.cast'
_ODS_REGIONS = (0, True)
source() _ods_ir
dest() _ods_ir
mlir.dialects._emitc_ops_gen.cast(dest, source, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.ClassOp(sym_name, *, final_specifier=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.class operation defines a C++ class, acting as a container for its data fields (emitc.field) and methods (emitc.func). It creates a distinct scope, isolating its contents from the surrounding MLIR region, similar to how C++ classes encapsulate their internals.

Example:

emitc.class @modelClass {
  emitc.field @fieldName0 : !emitc.array<1xf32> = {emitc.opaque = "input_tensor"}
  emitc.func @execute() {
    %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t
    %1 = get_field @fieldName0 : !emitc.array<1xf32>
    %2 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue<f32>
    return
  }
}
// Class with a final specifer
emitc.class final @modelClass {
  emitc.field @fieldName0 : !emitc.array<1xf32> = {emitc.opaque = "input_tensor"}
  emitc.func @execute() {
    %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t
    %1 = get_field @fieldName0 : !emitc.array<1xf32>
    %2 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue<f32>
    return
  }
}
OPERATION_NAME = 'emitc.class'
_ODS_REGIONS = (1, True)
sym_name() _ods_ir
final_specifier() bool
body() _ods_ir
mlir.dialects._emitc_ops_gen.class_(sym_name, *, final_specifier=None, loc=None, ip=None) ClassOp
class mlir.dialects._emitc_ops_gen.CmpOp(result, predicate, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.cmp operation the comparison operators ==, !=, <, <=, >, >=, <=> can be applied.

Its first argument is an attribute that defines the comparison operator:

  • equal to (mnemonic: "eq"; integer value: 0)

  • not equal to (mnemonic: "ne"; integer value: 1)

  • less than (mnemonic: "lt"; integer value: 2)

  • less than or equal to (mnemonic: "le"; integer value: 3)

  • greater than (mnemonic: "gt"; integer value: 4)

  • greater than or equal to (mnemonic: "ge"; integer value: 5)

  • three-way-comparison (mnemonic: "three_way"; integer value: 6)

Example:

// Custom form of the cmp operation.
%0 = emitc.cmp eq, %arg0, %arg1 : (i32, i32) -> i1
%1 = emitc.cmp lt, %arg2, %arg3 :
    (
      !emitc.opaque<"std::valarray<float>">,
      !emitc.opaque<"std::valarray<float>">
    ) -> !emitc.opaque<"std::valarray<bool>">
// Code emitted for the operations above.
bool v5 = v1 == v2;
std::valarray<bool> v6 = v3 < v4;
OPERATION_NAME = 'emitc.cmp'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
predicate() _ods_ir
mlir.dialects._emitc_ops_gen.cmp(result, predicate, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.ConditionalOp(result, condition, true_value, false_value, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.conditional operation the ternary conditional operator can be applied.

Example:

%0 = emitc.cmp gt, %arg0, %arg1 : (i32, i32) -> i1

%c0 = "emitc.constant"() {value = 10 : i32} : () -> i32
%c1 = "emitc.constant"() {value = 11 : i32} : () -> i32

%1 = emitc.conditional %0, %c0, %c1 : i32
// Code emitted for the operations above.
bool v3 = v1 > v2;
int32_t v4 = 10;
int32_t v5 = 11;
int32_t v6 = v3 ? v4 : v5;
OPERATION_NAME = 'emitc.conditional'
_ODS_REGIONS = (0, True)
condition() _ods_ir
true_value() _ods_ir
false_value() _ods_ir
result() _ods_ir

Shortcut to get an op result if it has only one (throws an error otherwise).

mlir.dialects._emitc_ops_gen.conditional(result, condition, true_value, false_value, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.ConstantOp(result, value, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.constant operation produces an SSA value equal to some constant specified by an attribute. This can be used to form simple integer and floating point constants, as well as more exotic things like tensor constants. The emitc.constant operation also supports the EmitC opaque attribute and the EmitC opaque type. Since folding is supported, it should not be used with pointers.

Example:

// Integer constant
%0 = "emitc.constant"(){value = 42 : i32} : () -> i32

// Constant emitted as `char = CHAR_MIN;`
%1 = "emitc.constant"() {value = #emitc.opaque<"CHAR_MIN">}
  : () -> !emitc.opaque<"char">
OPERATION_NAME = 'emitc.constant'
_ODS_REGIONS = (0, True)
value() _ods_ir
mlir.dialects._emitc_ops_gen.constant(result, value, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.DeclareFuncOp(sym_name, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.declare_func operation allows to insert a function declaration for an emitc.func at a specific position. The operation only requires the “callee” of the emitc.func to be specified as an attribute.

Example:

emitc.declare_func @bar
emitc.func @foo(%arg0: i32) -> i32 {
  %0 = emitc.call @bar(%arg0) : (i32) -> (i32)
  emitc.return %0 : i32
}

emitc.func @bar(%arg0: i32) -> i32 {
  emitc.return %arg0 : i32
}
// Code emitted for the operations above.
int32_t bar(int32_t v1);
int32_t foo(int32_t v1) {
  int32_t v2 = bar(v1);
  return v2;
}

int32_t bar(int32_t v1) {
  return v1;
}
OPERATION_NAME = 'emitc.declare_func'
_ODS_REGIONS = (0, True)
sym_name() _ods_ir
mlir.dialects._emitc_ops_gen.declare_func(sym_name, *, loc=None, ip=None) DeclareFuncOp
class mlir.dialects._emitc_ops_gen.DivOp(result, _gen_arg_0, _gen_arg_1, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.div operation the arithmetic operator / (division) can be applied.

Example:

// Custom form of the division operation.
%0 = emitc.div %arg0, %arg1 : (i32, i32) -> i32
%1 = emitc.div %arg2, %arg3 : (f32, f32) -> f32
// Code emitted for the operations above.
int32_t v5 = v1 / v2;
float v6 = v3 / v4;
OPERATION_NAME = 'emitc.div'
_ODS_REGIONS = (0, True)
mlir.dialects._emitc_ops_gen.div(result, _gen_arg_0, _gen_arg_1, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.DoOp(*, loc=None, ip=None)

Bases: _ods_ir

The emitc.do operation represents a C/C++ do-while loop construct that repeatedly executes a body region as long as a condition region evaluates to true. The operation has two regions:

  1. A body region that contains the loop body

  2. A condition region that must yield a boolean value (i1)

The condition is evaluated before each iteration as follows:

  • The condition region must contain exactly one block with:

  1. An emitc.expression operation producing an i1 value

  2. An emitc.yield passing through the expression result

  • The expression’s body contains the actual condition logic

The body region is executed before the first evaluation of the condition. Thus, there is a guarantee that the loop will be executed at least once. The loop terminates when the condition yields false.

The canonical structure of emitc.do is:

emitc.do {
  // Body region (no terminator required).
  // Loop body operations...
} while {
  // Condition region (must yield i1)
  %condition = emitc.expression : () -> i1 {
    // Condition computation...
    %result = ... : i1  // Last operation must produce i1
    emitc.yield %result : i1
  }
  // Forward expression result
  emitc.yield %condition : i1
}

Example:

emitc.func @do_example() {
  %counter = "emitc.variable"() <{value = 0 : i32}> : () -> !emitc.lvalue<i32>
  %end = emitc.literal "10" : i32
  %step = emitc.literal "1" : i32

  emitc.do {
    // Print current value
    %val = emitc.load %counter : !emitc.lvalue<i32>
    emitc.verbatim "printf(\"%d\\n\", {});" args %val : i32

    // Increment counter
    %new_val = emitc.add %val, %step : (i32, i32) -> i32
    "emitc.assign"(%counter, %new_val) : (!emitc.lvalue<i32>, i32) -> ()
  } while {
    %condition = emitc.expression %counter, %end : (!emitc.lvalue<i32>, i32) -> i1 {
      %current = emitc.load %counter : !emitc.lvalue<i32>
      %cmp_res = emitc.cmp lt, %current, %end : (i32, i32) -> i1
      emitc.yield %cmp_res : i1
    }
    emitc.yield %condition : i1
  }
  return
}
// Code emitted for the operation above.
void do_example() {
  int32_t v1 = 0;
  do {
    int32_t v2 = v1;
    printf("%d\n", v2);
    int32_t v3 = v2 + 1;
    v1 = v3;
  } while (v1 < 10);
  return;
}
OPERATION_NAME = 'emitc.do'
_ODS_REGIONS = (2, True)
bodyRegion() _ods_ir
conditionRegion() _ods_ir
mlir.dialects._emitc_ops_gen.do(*, loc=None, ip=None) DoOp
class mlir.dialects._emitc_ops_gen.ExpressionOp(result, defs, *, do_not_inline=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.expression operation returns a single SSA value which is yielded by its single-basic-block region. The operation takes zero or more input operands that are passed as block arguments to the region.

As the operation is to be emitted as a C expression, the operations within its body must form a single Def-Use tree, or a DAG trivially expandable to one, i.e. a DAG where each operation with side effects is only reachable once from the expression root.

Input operands can be of both value types (EmitCType) and lvalue types (EmitC_LValueType).

Example:

%r = emitc.expression %a, %b, %c : (i32, i32, i32) -> i32 {
  %0 = emitc.call_opaque "foo"(%a) : (i32) -> i32
  %1 = emitc.add %b, %c : (i32, i32) -> i32
  %2 = emitc.mul %0, %1 : (i32, i32) -> i32
  emitc.yield %2 : i32
}

May be emitted as:

int32_t v4 = foo(v1) * (v2 + v3);

When specified, the optional noinline indicates that the expression is to be emitted as seen above, i.e. as the rhs of an EmitC SSA value definition. Otherwise, the expression may be emitted inline, i.e. directly at its use.

OPERATION_NAME = 'emitc.expression'
_ODS_REGIONS = (1, True)
defs() _ods_ir
do_not_inline() bool
result() _ods_ir

Shortcut to get an op result if it has only one (throws an error otherwise).

region() _ods_ir
mlir.dialects._emitc_ops_gen.expression(result, defs, *, do_not_inline=None, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.FieldOp(sym_name, type_, *, initial_value=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.field operation declares a named field within an emitc.class operation. The field’s type must be an EmitC type.

Example:

// Example with an attribute:
emitc.field @fieldName0 : !emitc.array<1xf32>  {emitc.opaque = "another_feature"}
// Example with no attribute:
emitc.field @fieldName0 : !emitc.array<1xf32>
// Example with an initial value:
emitc.field @fieldName0 : !emitc.array<1xf32> = dense<0.0>
// Example with an initial value and attributes:
emitc.field @fieldName0 : !emitc.array<1xf32> = dense<0.0> {
  emitc.opaque = "input_tensor"}
OPERATION_NAME = 'emitc.field'
_ODS_REGIONS = (0, True)
sym_name() _ods_ir
type_() _ods_ir
initial_value() _ods_ir | None
mlir.dialects._emitc_ops_gen.field(sym_name, type_, *, initial_value=None, loc=None, ip=None) FieldOp
class mlir.dialects._emitc_ops_gen.FileOp(id, *, loc=None, ip=None)

Bases: _ods_ir

A file represents a single C/C++ file.

mlir-translate ignores the body of all emitc.file ops unless the -file-id=id flag is used. With that flag, all emitc.file ops with matching id are emitted.

Example:

emitc.file "main" {
  emitc.func @func_one() {
    emitc.return
  }
}
OPERATION_NAME = 'emitc.file'
_ODS_REGIONS = (1, True)
id() _ods_ir
bodyRegion() _ods_ir
mlir.dialects._emitc_ops_gen.file(id, *, loc=None, ip=None) FileOp
class mlir.dialects._emitc_ops_gen.ForOp(lowerBound, upperBound, step, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.for operation represents a C loop of the following form:

for (T i = lb; i < ub; i += step) { /* ... */ } // where T is typeof(lb)

The operation takes 3 SSA values as operands that represent the lower bound, upper bound and step respectively, and defines an SSA value for its induction variable. It has one region capturing the loop body. The induction variable is represented as an argument of this region. This SSA value is a signless integer, or an index. The step is a value of same type.

This operation has no result. The body region must contain exactly one block that terminates with emitc.yield. Calling ForOp::build will create such a region and insert the terminator implicitly if none is defined, so will the parsing even in cases when it is absent from the custom format. For example:

// Index case.
emitc.for %iv = %lb to %ub step %step {
  ... // body
}
...
// Integer case.
emitc.for %iv_32 = %lb_32 to %ub_32 step %step_32 : i32 {
  ... // body
}
OPERATION_NAME = 'emitc.for'
_ODS_REGIONS = (1, True)
lowerBound() _ods_ir
upperBound() _ods_ir
step() _ods_ir
region() _ods_ir
mlir.dialects._emitc_ops_gen.for_(lower_bound, upper_bound, step, *, loc=None, ip=None) ForOp
class mlir.dialects._emitc_ops_gen.FuncOp(sym_name, function_type, *, specifiers=None, arg_attrs=None, res_attrs=None, loc=None, ip=None)

Bases: _ods_ir

Operations within the function cannot implicitly capture values defined outside of the function, i.e. Functions are IsolatedFromAbove. All external references must use function arguments or attributes that establish a symbolic connection (e.g. symbols referenced by name via a string attribute like SymbolRefAttr). While the MLIR textual form provides a nice inline syntax for function arguments, they are internally represented as “block arguments” to the first block in the region.

Only dialect attribute names may be specified in the attribute dictionaries for function arguments, results, or the function itself.

Example:

// A function with no results:
emitc.func @foo(%arg0 : i32) {
  emitc.call_opaque "bar" (%arg0) : (i32) -> ()
  emitc.return
}

// A function with its argument as single result:
emitc.func @foo(%arg0 : i32) -> i32 {
  emitc.return %arg0 : i32
}

// A function with specifiers attribute:
emitc.func @example_specifiers_fn_attr() -> i32
            attributes {specifiers = ["static","inline"]} {
  %0 = emitc.call_opaque "foo" (): () -> i32
  emitc.return %0 : i32
}

// An external function definition:
emitc.func private @extern_func(i32)
                    attributes {specifiers = ["extern"]}
OPERATION_NAME = 'emitc.func'
_ODS_REGIONS = (1, True)
sym_name() _ods_ir
function_type() _ods_ir
specifiers() _ods_ir | None
arg_attrs() _ods_ir | None
res_attrs() _ods_ir | None
body() _ods_ir
mlir.dialects._emitc_ops_gen.func(sym_name, function_type, *, specifiers=None, arg_attrs=None, res_attrs=None, loc=None, ip=None) FuncOp
class mlir.dialects._emitc_ops_gen.GetFieldOp(result, field_name, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.get_field operation retrieves the lvalue of a named field from a given class instance.

Example:

%0 = get_field @fieldName0 : !emitc.array<1xf32>
OPERATION_NAME = 'emitc.get_field'
_ODS_REGIONS = (0, True)
field_name() _ods_ir
result() _ods_ir

Shortcut to get an op result if it has only one (throws an error otherwise).

mlir.dialects._emitc_ops_gen.get_field(result, field_name, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.GetGlobalOp(result, name, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.get_global operation retrieves the lvalue of a named global variable. If the global variable is marked constant, assigning to that lvalue is undefined.

Example:

%x = emitc.get_global @foo : !emitc.array<2xf32>
%y = emitc.get_global @bar : !emitc.lvalue<i32>
OPERATION_NAME = 'emitc.get_global'
_ODS_REGIONS = (0, True)
name() _ods_ir

Returns the fully qualified name of the operation.

result() _ods_ir

Shortcut to get an op result if it has only one (throws an error otherwise).

mlir.dialects._emitc_ops_gen.get_global(result, name, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.GlobalOp(sym_name, type_, *, initial_value=None, extern_specifier=None, static_specifier=None, const_specifier=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.global operation declares or defines a named global variable. The backing memory for the variable is allocated statically and described by the variable’s type, which must be an EmitC type. Optionally, an initial_value can be provided. Internal linkage can be specified using the static_specifier unit attribute and external linkage can be specified using the extern_specifier unit attribute. Note that the default linkage without those two keywords depends on whether the target is C or C++ and whether the global variable is const. The global variable can also be marked constant using the const_specifier unit attribute. Writing to such constant global variables is undefined.

The global variable can be accessed by using the emitc.get_global to retrieve the value for the global variable.

Example:

// Global variable with an initial value.
emitc.global @x : !emitc.array<2xf32> = dense<0.0>
// Global variable with an initial values.
emitc.global @x : !emitc.array<3xi32> = dense<[0, 1, 2]>
// Global variable with an opaque initial value.
emitc.global @x : !emitc.opaque<"char"> = #emitc.opaque<"CHAR_MIN">
// External global variable
emitc.global extern @x : !emitc.array<2xf32>
// Constant global variable with internal linkage
emitc.global static const @x : i32 = 0
OPERATION_NAME = 'emitc.global'
_ODS_REGIONS = (0, True)
sym_name() _ods_ir
type_() _ods_ir
initial_value() _ods_ir | None
extern_specifier() bool
static_specifier() bool
const_specifier() bool
mlir.dialects._emitc_ops_gen.global_(sym_name, type_, *, initial_value=None, extern_specifier=None, static_specifier=None, const_specifier=None, loc=None, ip=None) GlobalOp
class mlir.dialects._emitc_ops_gen.IfOp(condition, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.if operation represents an if-then-else construct for conditionally executing two regions of code. The operand to an if operation is a boolean value. For example:

emitc.if %b  {
  ...
} else {
  ...
}

The “then” region has exactly 1 block. The “else” region may have 0 or 1 blocks. The blocks are always terminated with emitc.yield, which can be left out to be inserted implicitly. This operation doesn’t produce any results.

OPERATION_NAME = 'emitc.if'
_ODS_REGIONS = (2, True)
condition() _ods_ir
thenRegion() _ods_ir
elseRegion() _ods_ir
mlir.dialects._emitc_ops_gen.if_(condition, *, loc=None, ip=None) IfOp
class mlir.dialects._emitc_ops_gen.IncludeOp(include, *, is_standard_include=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.include operation allows to define a source file inclusion via the #include directive.

Example:

// Custom form defining the inclusion of `<myheader>`.
emitc.include <"myheader.h">

// Generic form of the same operation.
"emitc.include" (){include = "myheader.h", is_standard_include} : () -> ()

// Custom form defining the inclusion of `"myheader"`.
emitc.include "myheader.h"

// Generic form of the same operation.
"emitc.include" (){include = "myheader.h"} : () -> ()
OPERATION_NAME = 'emitc.include'
_ODS_REGIONS = (0, True)
include() _ods_ir
is_standard_include() bool
mlir.dialects._emitc_ops_gen.include(include, *, is_standard_include=None, loc=None, ip=None) IncludeOp
class mlir.dialects._emitc_ops_gen.LiteralOp(result, value, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.literal operation produces an SSA value equal to some constant specified by an attribute.

Example:

%p0 = emitc.literal "M_PI" : f32
%1 = "emitc.add" (%arg0, %p0) : (f32, f32) -> f32
// Code emitted for the operation above.
float v2 = v1 + M_PI;
OPERATION_NAME = 'emitc.literal'
_ODS_REGIONS = (0, True)
value() _ods_ir
result() _ods_ir

Shortcut to get an op result if it has only one (throws an error otherwise).

mlir.dialects._emitc_ops_gen.literal(result, value, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.LoadOp(result, operand, *, loc=None, ip=None)

Bases: _ods_ir

This operation loads the content of a modifiable lvalue into an SSA value. Modifications of the lvalue executed after the load are not observable on the produced value.

Example:

%1 = emitc.load %0 : !emitc.lvalue<i32>
// Code emitted for the operation above.
int32_t v2 = v1;
OPERATION_NAME = 'emitc.load'
_ODS_REGIONS = (0, True)
operand() _ods_ir
result() _ods_ir

Shortcut to get an op result if it has only one (throws an error otherwise).

mlir.dialects._emitc_ops_gen.load(result, operand, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.LogicalAndOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.logical_and operation the logical operator && (and) can be applied.

Example:

%0 = emitc.logical_and %arg0, %arg1 : i32, i32
// Code emitted for the operation above.
bool v3 = v1 && v2;
OPERATION_NAME = 'emitc.logical_and'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.logical_and(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.LogicalNotOp(result, _gen_arg_0, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.logical_not operation the logical operator ! (negation) can be applied.

Example:

%0 = emitc.logical_not %arg0 : i32
// Code emitted for the operation above.
bool v2 = !v1;
OPERATION_NAME = 'emitc.logical_not'
_ODS_REGIONS = (0, True)
mlir.dialects._emitc_ops_gen.logical_not(result, _gen_arg_0, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.LogicalOrOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.logical_or operation the logical operator || (inclusive or) can be applied.

Example:

%0 = emitc.logical_or %arg0, %arg1 : i32, i32
// Code emitted for the operation above.
bool v3 = v1 || v2;
OPERATION_NAME = 'emitc.logical_or'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.logical_or(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.MemberOfPtrOp(result, member, operand, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.member_of_ptr operation the member access operator -> can be applied.

Example:

%0 = "emitc.member_of_ptr" (%arg0) {member = "a"}
    : (!emitc.lvalue<!emitc.ptr<!emitc.opaque<"mystruct">>>)
    -> !emitc.lvalue<i32>
%1 = "emitc.member_of_ptr" (%arg0) {member = "b"}
    : (!emitc.lvalue<!emitc.ptr<!emitc.opaque<"mystruct">>>)
    -> !emitc.array<2xi32>
OPERATION_NAME = 'emitc.member_of_ptr'
_ODS_REGIONS = (0, True)
operand() _ods_ir
member() _ods_ir
mlir.dialects._emitc_ops_gen.member_of_ptr(result, member, operand, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.MemberOp(result, member, operand, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.member operation the member access operator . can be applied.

Example:

%0 = "emitc.member" (%arg0) {member = "a"}
    : (!emitc.lvalue<!emitc.opaque<"mystruct">>) -> !emitc.lvalue<i32>
%1 = "emitc.member" (%arg0) {member = "b"}
    : (!emitc.lvalue<!emitc.opaque<"mystruct">>) -> !emitc.array<2xi32>
OPERATION_NAME = 'emitc.member'
_ODS_REGIONS = (0, True)
operand() _ods_ir
member() _ods_ir
mlir.dialects._emitc_ops_gen.member(result, member, operand, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.MulOp(result, _gen_arg_0, _gen_arg_1, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.mul operation the arithmetic operator * (multiplication) can be applied.

Example:

// Custom form of the multiplication operation.
%0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32
%1 = emitc.mul %arg2, %arg3 : (f32, f32) -> f32
// Code emitted for the operations above.
int32_t v5 = v1 * v2;
float v6 = v3 * v4;
OPERATION_NAME = 'emitc.mul'
_ODS_REGIONS = (0, True)
mlir.dialects._emitc_ops_gen.mul(result, _gen_arg_0, _gen_arg_1, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.RemOp(result, _gen_arg_0, _gen_arg_1, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.rem operation the arithmetic operator % (remainder) can be applied.

Example:

// Custom form of the remainder operation.
%0 = emitc.rem %arg0, %arg1 : (i32, i32) -> i32
// Code emitted for the operation above.
int32_t v5 = v1 % v2;
OPERATION_NAME = 'emitc.rem'
_ODS_REGIONS = (0, True)
mlir.dialects._emitc_ops_gen.rem(result, _gen_arg_0, _gen_arg_1, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.ReturnOp(*, operand=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.return operation represents a return operation within a function. The operation takes zero or exactly one operand and produces no results. The operand number and type must match the signature of the function that contains the operation.

Example:

emitc.func @foo() -> (i32) {
  ...
  emitc.return %0 : i32
}
OPERATION_NAME = 'emitc.return'
_ODS_REGIONS = (0, True)
operand() _ods_ir | None
mlir.dialects._emitc_ops_gen.return_(*, operand=None, loc=None, ip=None) ReturnOp
class mlir.dialects._emitc_ops_gen.SubOp(result, lhs, rhs, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.sub operation the arithmetic operator - (subtraction) can be applied.

Example:

// Custom form of the substraction operation.
%0 = emitc.sub %arg0, %arg1 : (i32, i32) -> i32
%1 = emitc.sub %arg2, %arg3 : (!emitc.ptr<f32>, i32) -> !emitc.ptr<f32>
%2 = emitc.sub %arg4, %arg5 : (!emitc.ptr<i32>, !emitc.ptr<i32>)
    -> !emitc.ptrdiff_t
// Code emitted for the operations above.
int32_t v7 = v1 - v2;
float* v8 = v3 - v4;
ptrdiff_t v9 = v5 - v6;
OPERATION_NAME = 'emitc.sub'
_ODS_REGIONS = (0, True)
lhs() _ods_ir
rhs() _ods_ir
mlir.dialects._emitc_ops_gen.sub(result, lhs, rhs, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.SubscriptOp(result, value, indices, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.subscript operation the subscript operator [] can be applied to variables or arguments of array, pointer and opaque type.

Example:

%i = index.constant 1
%j = index.constant 7
%0 = emitc.subscript %arg0[%i, %j] : (!emitc.array<4x8xf32>, index, index)
       -> !emitc.lvalue<f32>
%1 = emitc.subscript %arg1[%i] : (!emitc.ptr<i32>, index)
       -> !emitc.lvalue<i32>
OPERATION_NAME = 'emitc.subscript'
_ODS_REGIONS = (0, True)
value() _ods_ir
indices() _ods_ir
result() _ods_ir

Shortcut to get an op result if it has only one (throws an error otherwise).

mlir.dialects._emitc_ops_gen.subscript(result, value, indices, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.SwitchOp(arg, cases, num_caseRegions, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.switch is a control-flow operation that branches to one of the given regions based on the values of the argument and the cases. The operand to a switch operation is a opaque, integral or pointer wide types.

The operation always has a “default” region and any number of case regions denoted by integer constants. Control-flow transfers to the case region whose constant value equals the value of the argument. If the argument does not equal any of the case values, control-flow transfer to the “default” region.

The operation does not return any value. Moreover, case regions must be explicitly terminated using the emitc.yield operation. Default region is yielded implicitly.

Example:

// Example:
emitc.switch %0 : i32
case 2 {
  %1 = emitc.call_opaque "func_b" () : () -> i32
  emitc.yield
}
case 5 {
  %2 = emitc.call_opaque "func_a" () : () -> i32
  emitc.yield
}
default {
  %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
  emitc.call_opaque "func2" (%3) : (f32) -> ()
}
// Code emitted for the operations above.
switch (v1) {
case 2: {
  int32_t v2 = func_b();
  break;
}
case 5: {
  int32_t v3 = func_a();
  break;
}
default: {
  float v4 = 4.200000000e+01f;
  func2(v4);
  break;
}
}
OPERATION_NAME = 'emitc.switch'
_ODS_REGIONS = (1, False)
arg() _ods_ir
cases() _ods_ir
defaultRegion() _ods_ir
caseRegions() _ods_ir
mlir.dialects._emitc_ops_gen.switch(arg, cases, num_case_regions, *, loc=None, ip=None) SwitchOp
class mlir.dialects._emitc_ops_gen.UnaryMinusOp(result, _gen_arg_0, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.unary_minus operation the unary operator - (minus) can be applied.

Example:

%0 = emitc.unary_minus %arg0 : (i32) -> i32
// Code emitted for the operation above.
int32_t v2 = -v1;
OPERATION_NAME = 'emitc.unary_minus'
_ODS_REGIONS = (0, True)
mlir.dialects._emitc_ops_gen.unary_minus(result, _gen_arg_0, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.UnaryPlusOp(result, _gen_arg_0, *, loc=None, ip=None)

Bases: _ods_ir

With the emitc.unary_plus operation the unary operator + (plus) can be applied.

Example:

%0 = emitc.unary_plus %arg0 : (i32) -> i32
// Code emitted for the operation above.
int32_t v2 = +v1;
OPERATION_NAME = 'emitc.unary_plus'
_ODS_REGIONS = (0, True)
mlir.dialects._emitc_ops_gen.unary_plus(result, _gen_arg_0, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.VariableOp(result, value, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.variable operation produces an SSA value equal to some value specified by an attribute. This can be used to form simple integer and floating point variables, as well as more exotic things like tensor variables. The emitc.variable operation also supports the EmitC opaque attribute and the EmitC opaque type. If further supports the EmitC pointer type, whereas folding is not supported. The emitc.variable is emitted as a C/C++ local variable.

Example:

// Integer variable
%0 = "emitc.variable"(){value = 42 : i32} : () -> !emitc.lvalue<i32>

// Variable emitted as `int32_t* = NULL;`
%1 = "emitc.variable"() {value = #emitc.opaque<"NULL">}
  : () -> !emitc.lvalue<!emitc.ptr<!emitc.opaque<"int32_t">>>

Since folding is not supported, it can be used with pointers. As an example, it is valid to create pointers to variable operations by using apply operations and pass these to a call operation.

%0 = "emitc.variable"() {value = 0 : i32} : () -> !emitc.lvalue<i32>
%1 = "emitc.variable"() {value = 0 : i32} : () -> !emitc.lvalue<i32>
%2 = emitc.apply "&"(%0) : (!emitc.lvalue<i32>) -> !emitc.ptr<i32>
%3 = emitc.apply "&"(%1) : (!emitc.lvalue<i32>) -> !emitc.ptr<i32>
emitc.call_opaque "write"(%2, %3)
  : (!emitc.ptr<i32>, !emitc.ptr<i32>) -> ()
OPERATION_NAME = 'emitc.variable'
_ODS_REGIONS = (0, True)
value() _ods_ir
mlir.dialects._emitc_ops_gen.variable(result, value, *, loc=None, ip=None) _ods_ir
class mlir.dialects._emitc_ops_gen.VerbatimOp(value, fmtArgs, *, loc=None, ip=None)

Bases: _ods_ir

The emitc.verbatim operation produces no results and the value is emitted as is followed by a line break (’n’ character) during translation.

Note: Use with caution. This operation can have arbitrary effects on the semantics of the emitted code. Use semantically more meaningful operations whenever possible. Additionally this op is NOT intended to be used to inject large snippets of code.

This operation can be used in situations where a more suitable operation is not yet implemented in the dialect or where preprocessor directives interfere with the structure of the code. One example of this is to declare the linkage of external symbols to make the generated code usable in both C and C++ contexts:

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif

If the emitc.verbatim op has operands, then the value is interpreted as format string, where {} is a placeholder for an operand in their order. For example, emitc.verbatim "#pragma my src={} dst={}" %src, %dest : i32, i32 would be emitted as #pragma my src=a dst=b if %src became a and %dest became b in the C code. {{ in the format string is interpreted as a single { and doesn’t introduce a placeholder.

Example:

emitc.verbatim "typedef float f32;"
emitc.verbatim "#pragma my var={} property" args %arg : f32
// Code emitted for the operation above.
typedef float f32;
#pragma my var=v1 property
OPERATION_NAME = 'emitc.verbatim'
_ODS_REGIONS = (0, True)
fmtArgs() _ods_ir
value() _ods_ir
mlir.dialects._emitc_ops_gen.verbatim(value, fmt_args, *, loc=None, ip=None) VerbatimOp
class mlir.dialects._emitc_ops_gen.YieldOp(*, result=None, loc=None, ip=None)

Bases: _ods_ir

The emitc.yield terminates its parent EmitC op’s region, optionally yielding an SSA value. The semantics of how the values are yielded is defined by the parent operation. If emitc.yield has an operand, the operand must match the parent operation’s result. If the parent operation defines no values, then the emitc.yield may be left out in the custom syntax and the builders will insert one implicitly. Otherwise, it has to be present in the syntax to indicate which value is yielded.

OPERATION_NAME = 'emitc.yield'
_ODS_REGIONS = (0, True)
result() _ods_ir | None

Shortcut to get an op result if it has only one (throws an error otherwise).

mlir.dialects._emitc_ops_gen.yield_(*, result=None, loc=None, ip=None) YieldOp