blob: b8edbea19a401aea88813f7e6b534dd2ea6f019a [file] [log] [blame]
# RUN: mlir-linalg-ods-yaml-gen %s --o-ods-decl=- | FileCheck %s --check-prefix=ODS
# RUN: mlir-linalg-ods-yaml-gen %s --o-impl=- | FileCheck %s --check-prefix=IMPL
# @linalg_structured_op
# def test1(O=TensorDef(T, S.M, S.N, output=True)):
# """Title.
# Detailed description.
# """
# O[D.m, D.n] = cast(T, const(42)) + cast(T, index(D.n))
--- !LinalgOpConfig
metadata: !LinalgOpMetadata
name: test1
cpp_class_name: Test1Op
doc: |-
Title.
Detailed description.
structured_op: !LinalgStructuredOpConfig
args:
- !LinalgOperandDefConfig
name: O
usage: OutputOperand
type_var: T
shape_map: affine_map<()[s0, s1] -> (s0, s1)>
indexing_maps: !LinalgIndexingMapsConfig
static_indexing_maps:
- affine_map<(d0, d1)[s0, s1] -> (d0, d1)>
iterator_types:
- parallel
- parallel
assignments:
- !ScalarAssign
arg: O
value: !ScalarExpression
scalar_apply:
fn_name: add
operands:
- !ScalarExpression
symbolic_cast:
type_var: T
operands:
- !ScalarExpression
scalar_const: '42 : i64'
is_unsigned_cast: false
- !ScalarExpression
symbolic_cast:
type_var: T
operands:
- !ScalarExpression
scalar_index: 1
is_unsigned_cast: true
# ODS-LABEL: def Test1Op : LinalgStructuredBase_Op<"test1"
# ODS: let summary = [{ Title. }];
# ODS-NEXT: let description = [{
# ODS-NEXT: Detailed description.
# ODS-NEXT: }];
# ODS: let arguments =
# ODS-NEXT: Variadic<AnyType>:$inputs,
# ODS-NEXT: Variadic<AnyShaped>:$outputs
# ODS: let builders =
# ODS: (ins "TypeRange":$resultTensorTypes, "ValueRange":$inputs,
# ODS-NEXT: "ValueRange":$outputs,
# ODS-NEXT: CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes),
# ODS: $_state.addOperands(inputs);
# ODS-NEXT: $_state.addOperands(outputs);
# ODS-NEXT: $_state.addTypes(resultTensorTypes);
# ODS-NEXT: $_state.addAttributes(attributes);
# ODS-NEXT: $_state.addAttribute(
# ODS-NEXT: "operand_segment_sizes",
# ODS-NEXT: $_builder.getI32VectorAttr({
# ODS-NEXT: static_cast<int32_t>(inputs.size()),
# ODS-NEXT: static_cast<int32_t>(outputs.size())}));
# ODS-NEXT: createAndFillStructuredOpRegion<Test1Op>(
# ODS-NEXT: $_builder,
# ODS-NEXT: $_state,
# ODS-NEXT: TypeRange(inputs),
# ODS-NEXT: TypeRange(outputs)
# IMPL-LABEL: void Test1Op::regionBuilder(
# IMPL: ImplicitLocOpBuilder &b, Block &block)
# IMPL: Value [[VAL0:[a-z0-9]+]] = helper.constant("42 : i64");
# IMPL-DAG: Value [[VAL1:[a-z0-9]+]] = helper.cast(block.getArgument(0).getType(), [[VAL0]], false);
# IMPL-DAG: Value [[VAL2:[a-z0-9]+]] = helper.index(1);
# IMPL-DAG: Value [[VAL3:[a-z0-9]+]] = helper.cast(block.getArgument(0).getType(), [[VAL2]], true);
# IMPL-DAG: Value [[VAL4:[a-z0-9]+]] = helper.applyfn__add([[VAL1]], [[VAL3]]);
# @linalg_structured_op
# def test2(I=TensorDef(T, S.M, S.N),
# O=TensorDef(T, S.M, S.N, output=True),
# strides=AttributeDef(S.SM, S.SN)):
# """Title.
# Detailed description.
# """
# O[D.m, D.n] = I[D.n * S.SM, D.m * S.SN]
--- !LinalgOpConfig
metadata: !LinalgOpMetadata
name: test2
cpp_class_name: Test2Op
doc: |-
Title.
Detailed description.
structured_op: !LinalgStructuredOpConfig
args:
- !LinalgOperandDefConfig
name: I
usage: InputOperand
type_var: T
shape_map: affine_map<()[s0, s1, s2, s3] -> (s0, s1)>
- !LinalgOperandDefConfig
name: O
usage: OutputOperand
type_var: T
shape_map: affine_map<()[s0, s1, s2, s3] -> (s0, s1)>
- !LinalgOperandDefConfig
name: strides
usage: IndexAttribute
type_var: I64
attribute_map: affine_map<()[s0, s1, s2, s3] -> (s2, s3)>
indexing_maps: !LinalgIndexingMapsConfig
static_indexing_maps:
- affine_map<(d0, d1)[s0, s1, s2, s3] -> (d1 * s2, d0 * s3)>
- affine_map<(d0, d1)[s0, s1, s2, s3] -> (d0, d1)>
iterator_types:
- parallel
- parallel
assignments:
- !ScalarAssign
arg: O
value: !ScalarExpression
scalar_arg: I
# ODS-LABEL: def Test2Op : LinalgStructuredBase_Op<"test2"
# ODS: let arguments =
# ODS-NEXT: Variadic<AnyType>:$inputs,
# ODS-NEXT: Variadic<AnyShaped>:$outputs,
# ODS-NEXT: RankedI64ElementsAttr<[2]>:$strides
# ODS: "Attribute":$strides
# ODS: $_state.addAttribute("strides", strides);
# ODS: bool hasDynamicIndexingMaps();
# ODS-NEXT: LogicalResult verifyIndexingMapRequiredAttributes();
# IMPL: getSymbolBindings(Test2Op self)
# IMPL: cst2 = self.strides().getValues<int64_t>()[0];
# IMPL-NEXT: getAffineConstantExpr(cst2, context)
# IMPL: cst3 = self.strides().getValues<int64_t>()[1];
# IMPL-NEXT: getAffineConstantExpr(cst3, context)
# IMPL: Test2Op::indexing_maps()
# IMPL: = getSymbolBindings(*this);
# IMPL: "affine_map<(d0, d1)[s0, s1, s2, s3] -> (d1 * s2, d0 * s3)>"
# IMPL: "affine_map<(d0, d1)[s0, s1, s2, s3] -> (d0, d1)>"
# IMPL: Test2Op::getNumRegionArgs() { return 2; }
# IMPL: Test2Op::hasDynamicIndexingMaps() { return true; }
# IMPL: Test2Op::verifyIndexingMapRequiredAttributes()
# IMPL: auto attr = op->getAttrOfType<DenseElementsAttr>("strides")
# IMPL: "missing indexing map required attribute 'strides'"
# IMPL: void Test2Op::regionBuilder(ImplicitLocOpBuilder &b, Block &block)
# IMPL-NEXT: assert(2 > 0 && block.getNumArguments() == 2 &&
# IMPL: yields.push_back(block.getArgument(0));