mlir.dialects._emitc_ops_gen¶
Attributes¶
Classes¶
With the |
|
With the |
|
The |
|
With the |
|
With the |
|
With the |
|
With the |
|
With the |
|
With the |
|
The |
|
The |
|
The |
|
The |
|
With the |
|
With the |
|
The |
|
The |
|
With the |
|
The |
|
The |
|
The |
|
A |
|
The |
|
Operations within the function cannot implicitly capture values defined |
|
The |
|
The |
|
The |
|
The |
|
The |
|
The |
|
This operation loads the content of a modifiable lvalue into an SSA value. |
|
With the |
|
With the |
|
With the |
|
With the |
|
With the |
|
With the |
|
With the |
|
The |
|
With the |
|
With the |
|
The |
|
With the |
|
With the |
|
The |
|
The |
|
The |
Functions¶
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_irWith the
emitc.addoperation 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_irWith the
emitc.applyoperation 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_irThe
emitc.assignoperation 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¶
- class mlir.dialects._emitc_ops_gen.BitwiseAndOp(result, lhs, rhs, *, loc=None, ip=None)¶
Bases:
_ods_irWith the
emitc.bitwise_andoperation 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_irWith the
emitc.bitwise_left_shiftoperation 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_irWith the
emitc.bitwise_notoperation 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_irWith the
emitc.bitwise_oroperation 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_irWith the
emitc.bitwise_right_shiftoperation 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_irWith the
emitc.bitwise_xoroperation 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_irThe
emitc.calloperation represents a direct call to anemitc.functhat 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_irThe
emitc.call_opaqueoperation 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_irThe
emitc.castoperation 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_irThe
emitc.classoperation 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¶
- class mlir.dialects._emitc_ops_gen.CmpOp(result, predicate, lhs, rhs, *, loc=None, ip=None)¶
Bases:
_ods_irWith the
emitc.cmpoperation 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_irWith the
emitc.conditionaloperation 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_irThe
emitc.constantoperation 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. Theemitc.constantoperation 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_irThe
emitc.declare_funcoperation allows to insert a function declaration for anemitc.funcat a specific position. The operation only requires the “callee” of theemitc.functo 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_irWith the
emitc.divoperation 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_irThe
emitc.dooperation 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:A body region that contains the loop body
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:
An
emitc.expressionoperation producing an i1 valueAn
emitc.yieldpassing 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.dois: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¶
- class mlir.dialects._emitc_ops_gen.ExpressionOp(result, defs, *, do_not_inline=None, loc=None, ip=None)¶
Bases:
_ods_irThe
emitc.expressionoperation 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
noinlineindicates 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_irThe
emitc.fieldoperation declares a named field within anemitc.classoperation. 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_irA
filerepresents a single C/C++ file.mlir-translateignores the body of allemitc.fileops unless the-file-id=idflag is used. With that flag, allemitc.fileops 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¶
- class mlir.dialects._emitc_ops_gen.ForOp(lowerBound, upperBound, step, *, loc=None, ip=None)¶
Bases:
_ods_irThe
emitc.foroperation 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¶
- 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_irOperations 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_irThe
emitc.get_fieldoperation 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_irThe
emitc.get_globaloperation 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_irThe
emitc.globaloperation 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, aninitial_valuecan be provided. Internal linkage can be specified using thestatic_specifierunit attribute and external linkage can be specified using theextern_specifierunit attribute. Note that the default linkage without those two keywords depends on whether the target is C or C++ and whether the global variable isconst. The global variable can also be marked constant using theconst_specifierunit attribute. Writing to such constant global variables is undefined.The global variable can be accessed by using the
emitc.get_globalto 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_irThe
emitc.ifoperation 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¶
- class mlir.dialects._emitc_ops_gen.IncludeOp(include, *, is_standard_include=None, loc=None, ip=None)¶
Bases:
_ods_irThe
emitc.includeoperation allows to define a source file inclusion via the#includedirective.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_irThe
emitc.literaloperation 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_irThis 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_irWith the
emitc.logical_andoperation 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_irWith the
emitc.logical_notoperation 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_irWith the
emitc.logical_oroperation 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_irWith the
emitc.member_of_ptroperation 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_irWith the
emitc.memberoperation 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_irWith the
emitc.muloperation 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_irWith the
emitc.remoperation 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_irThe
emitc.returnoperation 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¶
- class mlir.dialects._emitc_ops_gen.SubOp(result, lhs, rhs, *, loc=None, ip=None)¶
Bases:
_ods_irWith the
emitc.suboperation 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_irWith the
emitc.subscriptoperation 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_irThe
emitc.switchis 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.yieldoperation. 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¶
- class mlir.dialects._emitc_ops_gen.UnaryMinusOp(result, _gen_arg_0, *, loc=None, ip=None)¶
Bases:
_ods_irWith the
emitc.unary_minusoperation 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_irWith the
emitc.unary_plusoperation 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_irThe
emitc.variableoperation 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. Theemitc.variableoperation also supports the EmitC opaque attribute and the EmitC opaque type. If further supports the EmitC pointer type, whereas folding is not supported. Theemitc.variableis 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
variableoperations by usingapplyoperations and pass these to acalloperation.%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_irThe
emitc.verbatimoperation 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.verbatimop has operands, then thevalueis 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, i32would be emitted as#pragma my src=a dst=bif%srcbecameaand%destbecamebin 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_irThe
emitc.yieldterminates 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. Ifemitc.yieldhas an operand, the operand must match the parent operation’s result. If the parent operation defines no values, then theemitc.yieldmay 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).