xref: /llvm-project/mlir/test/python/python_test_ops.td (revision 3766ba44a8945681f4c52acb0331efcff66ef7b1)
19f3f6d7bSStella Laurenzo//===-- python_test_ops.td - Python test Op definitions ----*- tablegen -*-===//
29f3f6d7bSStella Laurenzo//
39f3f6d7bSStella Laurenzo// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49f3f6d7bSStella Laurenzo// See https://llvm.org/LICENSE.txt for license information.
59f3f6d7bSStella Laurenzo// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69f3f6d7bSStella Laurenzo//
79f3f6d7bSStella Laurenzo//===----------------------------------------------------------------------===//
89f3f6d7bSStella Laurenzo
99f3f6d7bSStella Laurenzo#ifndef PYTHON_TEST_OPS
109f3f6d7bSStella Laurenzo#define PYTHON_TEST_OPS
119f3f6d7bSStella Laurenzo
121d7120c6SRiver Riddleinclude "mlir/IR/AttrTypeBase.td"
139f3f6d7bSStella Laurenzoinclude "mlir/IR/OpBase.td"
1414c92070SAlex Zinenkoinclude "mlir/Interfaces/InferTypeOpInterface.td"
159f3f6d7bSStella Laurenzo
169f3f6d7bSStella Laurenzodef Python_Test_Dialect : Dialect {
179f3f6d7bSStella Laurenzo  let name = "python_test";
1814c92070SAlex Zinenko  let cppNamespace = "python_test";
194957518eSMogball
204957518eSMogball  let useDefaultTypePrinterParser = 1;
214957518eSMogball  let useDefaultAttributePrinterParser = 1;
229f3f6d7bSStella Laurenzo}
2389a92fb3SAlex Zinenko
2489a92fb3SAlex Zinenkoclass TestType<string name, string typeMnemonic>
2589a92fb3SAlex Zinenko    : TypeDef<Python_Test_Dialect, name> {
2689a92fb3SAlex Zinenko  let mnemonic = typeMnemonic;
2789a92fb3SAlex Zinenko}
2889a92fb3SAlex Zinenko
2989a92fb3SAlex Zinenkoclass TestAttr<string name, string attrMnemonic>
3089a92fb3SAlex Zinenko    : AttrDef<Python_Test_Dialect, name> {
3189a92fb3SAlex Zinenko  let mnemonic = attrMnemonic;
3289a92fb3SAlex Zinenko}
3389a92fb3SAlex Zinenko
34697a5036SSanjoy Dasclass TestOp<string mnemonic, list<Trait> traits = []>
352ab14dffSMaksim Levental    : Op<Python_Test_Dialect, mnemonic, traits> {
362ab14dffSMaksim Levental  let assemblyFormat = "operands attr-dict functional-type(operands, results)";
372ab14dffSMaksim Levental}
389f3f6d7bSStella Laurenzo
3989a92fb3SAlex Zinenko//===----------------------------------------------------------------------===//
4089a92fb3SAlex Zinenko// Type definitions.
4189a92fb3SAlex Zinenko//===----------------------------------------------------------------------===//
4289a92fb3SAlex Zinenko
4389a92fb3SAlex Zinenkodef TestType : TestType<"TestType", "test_type">;
4489a92fb3SAlex Zinenko
4589a92fb3SAlex Zinenko//===----------------------------------------------------------------------===//
4689a92fb3SAlex Zinenko// Attribute definitions.
4789a92fb3SAlex Zinenko//===----------------------------------------------------------------------===//
4889a92fb3SAlex Zinenko
4989a92fb3SAlex Zinenkodef TestAttr : TestAttr<"TestAttr", "test_attr">;
5089a92fb3SAlex Zinenko
5189a92fb3SAlex Zinenko//===----------------------------------------------------------------------===//
5289a92fb3SAlex Zinenko// Operation definitions.
5389a92fb3SAlex Zinenko//===----------------------------------------------------------------------===//
5489a92fb3SAlex Zinenko
559f3f6d7bSStella Laurenzodef AttributedOp : TestOp<"attributed_op"> {
569f3f6d7bSStella Laurenzo  let arguments = (ins I32Attr:$mandatory_i32,
579f3f6d7bSStella Laurenzo                   OptionalAttr<I32Attr>:$optional_i32,
589f3f6d7bSStella Laurenzo                   UnitAttr:$unit);
599f3f6d7bSStella Laurenzo}
609f3f6d7bSStella Laurenzo
6193156458SMaksim Leventaldef CustomAttributedOp : TestOp<"custom_attributed_op"> {
6293156458SMaksim Levental  let arguments = (ins TestAttr:$test_attr);
6393156458SMaksim Levental}
6493156458SMaksim Levental
65c606fefaSpengchao.hudef AttributesOp : TestOp<"attributes_op"> {
66ca23c933SIngo Müller  let arguments = (ins
67ca23c933SIngo Müller                   AffineMapArrayAttr:$x_affinemaparr,
68ca23c933SIngo Müller                   AffineMapAttr:$x_affinemap,
69ca23c933SIngo Müller                   ArrayAttr:$x_arr,
70ca23c933SIngo Müller                   BoolArrayAttr:$x_boolarr,
71ca23c933SIngo Müller                   BoolAttr:$x_bool,
72ca23c933SIngo Müller                   DenseBoolArrayAttr:$x_dboolarr,
73ca23c933SIngo Müller                   DenseF32ArrayAttr:$x_df32arr,
74ca23c933SIngo Müller                   DenseF64ArrayAttr:$x_df64arr,
75ca23c933SIngo Müller                   DenseI16ArrayAttr:$x_df16arr,
76ca23c933SIngo Müller                   DenseI32ArrayAttr:$x_di32arr,
77ca23c933SIngo Müller                   DenseI64ArrayAttr:$x_di64arr,
78ca23c933SIngo Müller                   DenseI8ArrayAttr:$x_di8arr,
79ca23c933SIngo Müller                   DictArrayAttr:$x_dictarr,
80ca23c933SIngo Müller                   DictionaryAttr:$x_dict,
81ca23c933SIngo Müller                   F32ArrayAttr:$x_f32arr,
82c606fefaSpengchao.hu                   F32Attr:$x_f32,
83ca23c933SIngo Müller                   F64ArrayAttr:$x_f64arr,
84c606fefaSpengchao.hu                   F64Attr:$x_f64,
85ca23c933SIngo Müller                   F64ElementsAttr:$x_f64elems,
86ca23c933SIngo Müller                   FlatSymbolRefArrayAttr:$x_flatsymrefarr,
87ca23c933SIngo Müller                   FlatSymbolRefAttr:$x_flatsymref,
88ca23c933SIngo Müller                   I16Attr:$x_i16,
89ca23c933SIngo Müller                   I1Attr:$x_i1,
90ca23c933SIngo Müller                   I32ArrayAttr:$x_i32arr,
91ca23c933SIngo Müller                   I32Attr:$x_i32,
92ca23c933SIngo Müller                   I32ElementsAttr:$x_i32elems,
93ca23c933SIngo Müller                   I64ArrayAttr:$x_i64arr,
94ca23c933SIngo Müller                   I64Attr:$x_i64,
95ca23c933SIngo Müller                   I64ElementsAttr:$x_i64elems,
96ca23c933SIngo Müller                   I64SmallVectorArrayAttr:$x_i64svecarr,
97ca23c933SIngo Müller                   I8Attr:$x_i8,
98ca23c933SIngo Müller                   IndexAttr:$x_idx,
99ca23c933SIngo Müller                   IndexElementsAttr:$x_idxelems,
100ca23c933SIngo Müller                   IndexListArrayAttr:$x_idxlistarr,
101ca23c933SIngo Müller                   SI16Attr:$x_si16,
102ca23c933SIngo Müller                   SI1Attr:$x_si1,
103ca23c933SIngo Müller                   SI32Attr:$x_si32,
104ca23c933SIngo Müller                   SI64Attr:$x_si64,
105ca23c933SIngo Müller                   SI8Attr:$x_si8,
106ca23c933SIngo Müller                   StrArrayAttr:$x_strarr,
107c606fefaSpengchao.hu                   StrAttr:$x_str,
108ca23c933SIngo Müller                   SymbolNameAttr:$x_sym,
109ca23c933SIngo Müller                   SymbolRefArrayAttr:$x_symrefarr,
110ca23c933SIngo Müller                   SymbolRefAttr:$x_symref,
111ca23c933SIngo Müller                   TypeArrayAttr:$x_typearr,
112ca23c933SIngo Müller                   TypeAttr:$x_type,
113ca23c933SIngo Müller                   UI16Attr:$x_ui16,
114ca23c933SIngo Müller                   UI1Attr:$x_ui1,
115ca23c933SIngo Müller                   UI32Attr:$x_ui32,
116ca23c933SIngo Müller                   UI64Attr:$x_ui64,
117ca23c933SIngo Müller                   UI8Attr:$x_ui8,
118ca23c933SIngo Müller                   UnitAttr:$x_unit
119ca23c933SIngo Müller                   );
120c606fefaSpengchao.hu}
121c606fefaSpengchao.hu
122b4c93eceSJohn Demmedef PropertyOp : TestOp<"property_op"> {
123b4c93eceSJohn Demme  let arguments = (ins I32Attr:$property,
124b4c93eceSJohn Demme                   I32:$idx);
125b4c93eceSJohn Demme}
126b4c93eceSJohn Demme
12714c92070SAlex Zinenkodef DummyOp : TestOp<"dummy_op"> {
12814c92070SAlex Zinenko}
12914c92070SAlex Zinenko
13014c92070SAlex Zinenkodef InferResultsOp : TestOp<"infer_results_op", [InferTypeOpInterface]> {
13114c92070SAlex Zinenko  let arguments = (ins);
13214c92070SAlex Zinenko  let results = (outs AnyInteger:$single, AnyInteger:$doubled);
13314c92070SAlex Zinenko
13414c92070SAlex Zinenko  let extraClassDeclaration = [{
135db791b27SRamkumar Ramachandra    static ::llvm::LogicalResult inferReturnTypes(
13622426110SRamkumar Ramachandra      ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location,
13714c92070SAlex Zinenko      ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes,
1385e118f93SMehdi Amini      ::mlir::OpaqueProperties,
13914c92070SAlex Zinenko      ::mlir::RegionRange regions,
14014c92070SAlex Zinenko      ::llvm::SmallVectorImpl<::mlir::Type> &inferredReturnTypes) {
14114c92070SAlex Zinenko      ::mlir::Builder b(context);
14214c92070SAlex Zinenko      inferredReturnTypes.push_back(b.getI32Type());
14314c92070SAlex Zinenko      inferredReturnTypes.push_back(b.getI64Type());
14414c92070SAlex Zinenko      return ::mlir::success();
14514c92070SAlex Zinenko    }
14614c92070SAlex Zinenko  }];
14714c92070SAlex Zinenko}
14814c92070SAlex Zinenko
149e0ca7e99Smaxdef I32OrF32 : TypeConstraint<Or<[I32.predicate, F32.predicate]>,
150e0ca7e99Smax                                 "i32 or f32">;
151e0ca7e99Smax
152e0ca7e99Smaxdef InferResultsVariadicInputsOp : TestOp<"infer_results_variadic_inputs_op",
153e0ca7e99Smax    [InferTypeOpInterface, AttrSizedOperandSegments]> {
154e0ca7e99Smax  let arguments = (ins Optional<I64>:$single, Optional<I64>:$doubled);
155e0ca7e99Smax  let results = (outs I32OrF32:$res);
156e0ca7e99Smax
157e0ca7e99Smax  let extraClassDeclaration = [{
158db791b27SRamkumar Ramachandra    static ::llvm::LogicalResult inferReturnTypes(
159e0ca7e99Smax      ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location,
160e0ca7e99Smax      ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes,
161e0ca7e99Smax      ::mlir::OpaqueProperties,
162e0ca7e99Smax      ::mlir::RegionRange regions,
163e0ca7e99Smax      ::llvm::SmallVectorImpl<::mlir::Type> &inferredReturnTypes) {
164e0ca7e99Smax      ::mlir::Builder b(context);
165e0ca7e99Smax      if (operands.size() == 1)
166e0ca7e99Smax          inferredReturnTypes.push_back(b.getI32Type());
167e0ca7e99Smax      else if (operands.size() == 2)
168e0ca7e99Smax          inferredReturnTypes.push_back(b.getF32Type());
169e0ca7e99Smax      return ::mlir::success();
170e0ca7e99Smax    }
171e0ca7e99Smax  }];
172e0ca7e99Smax}
173e0ca7e99Smax
1742995d29bSAlex Zinenko// If all result types are buildable, the InferTypeOpInterface is implied and is
1752995d29bSAlex Zinenko// autogenerated by C++ ODS.
1762995d29bSAlex Zinenkodef InferResultsImpliedOp : TestOp<"infer_results_implied_op"> {
1772995d29bSAlex Zinenko  let results = (outs I32:$integer, F64:$flt, Index:$index);
1782995d29bSAlex Zinenko}
1792995d29bSAlex Zinenko
180f22008edSArash Taheri-Dezfoulidef InferShapedTypeComponentsOp : TestOp<"infer_shaped_type_components_op",
181f22008edSArash Taheri-Dezfouli  [DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
182f22008edSArash Taheri-Dezfouli                             ["inferReturnTypeComponents"]>]> {
183f22008edSArash Taheri-Dezfouli  let arguments = (ins AnyTensor:$operand);
184f22008edSArash Taheri-Dezfouli  let results = (outs AnyTensor:$result);
185f22008edSArash Taheri-Dezfouli
186f22008edSArash Taheri-Dezfouli  let extraClassDefinition = [{
187db791b27SRamkumar Ramachandra    ::llvm::LogicalResult $cppClass::inferReturnTypeComponents(
188f22008edSArash Taheri-Dezfouli      ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location,
189f22008edSArash Taheri-Dezfouli      ::mlir::ValueShapeRange operands, ::mlir::DictionaryAttr attributes,
190f22008edSArash Taheri-Dezfouli      ::mlir::OpaqueProperties properties, ::mlir::RegionRange regions,
191f22008edSArash Taheri-Dezfouli      ::llvm::SmallVectorImpl<
192f22008edSArash Taheri-Dezfouli        ::mlir::ShapedTypeComponents>& inferredShapedTypeComponents) {
193f22008edSArash Taheri-Dezfouli      $cppClass::Adaptor adaptor(operands, attributes, properties, regions);
194f22008edSArash Taheri-Dezfouli      auto operandType =
195d46a135dSTres Popp          ::llvm::cast<::mlir::ShapedType>(adaptor.getOperand().getType());
196f22008edSArash Taheri-Dezfouli      if (operandType.hasRank()) {
197f22008edSArash Taheri-Dezfouli        inferredShapedTypeComponents.emplace_back(operandType.getShape(),
198f22008edSArash Taheri-Dezfouli            operandType.getElementType());
199f22008edSArash Taheri-Dezfouli      } else {
200f22008edSArash Taheri-Dezfouli        inferredShapedTypeComponents.emplace_back(operandType.getElementType());
201f22008edSArash Taheri-Dezfouli      }
202f22008edSArash Taheri-Dezfouli      return ::mlir::success();
203f22008edSArash Taheri-Dezfouli    }
204f22008edSArash Taheri-Dezfouli  }];
205f22008edSArash Taheri-Dezfouli}
206f22008edSArash Taheri-Dezfouli
2072995d29bSAlex Zinenkodef SameOperandAndResultTypeOp : TestOp<"same_operand_and_result_type_op",
2082995d29bSAlex Zinenko                                        [SameOperandsAndResultType]> {
2092995d29bSAlex Zinenko  let arguments = (ins Variadic<AnyType>);
2102995d29bSAlex Zinenko  let results = (outs AnyType:$one, AnyType:$two);
2112995d29bSAlex Zinenko}
2122995d29bSAlex Zinenko
2132995d29bSAlex Zinenkodef FirstAttrDeriveTypeAttrOp : TestOp<"first_attr_derive_type_attr_op",
2142995d29bSAlex Zinenko                               [FirstAttrDerivedResultType]> {
2152995d29bSAlex Zinenko  let arguments = (ins AnyType:$input, TypeAttr:$type);
2162995d29bSAlex Zinenko  let results = (outs AnyType:$one, AnyType:$two);
2172995d29bSAlex Zinenko}
2182995d29bSAlex Zinenko
2192995d29bSAlex Zinenkodef FirstAttrDeriveAttrOp : TestOp<"first_attr_derive_attr_op",
2202995d29bSAlex Zinenko                               [FirstAttrDerivedResultType]> {
2212995d29bSAlex Zinenko  let arguments = (ins AnyAttr:$iattr);
2222995d29bSAlex Zinenko  let results = (outs AnyType:$one, AnyType:$two, AnyType:$three);
2232995d29bSAlex Zinenko}
2242995d29bSAlex Zinenko
22554c99842SMichal Terepetadef OptionalOperandOp : TestOp<"optional_operand_op"> {
22654c99842SMichal Terepeta  let arguments = (ins Optional<AnyType>:$input);
22754c99842SMichal Terepeta  let results = (outs I32:$result);
22854c99842SMichal Terepeta}
22954c99842SMichal Terepeta
230*3766ba44SKasper Nielsendef SameVariadicOperandSizeOp : TestOp<"same_variadic_operand",
231*3766ba44SKasper Nielsen                                       [SameVariadicOperandSize]> {
232*3766ba44SKasper Nielsen  let arguments = (ins Variadic<AnyType>:$variadic1, AnyType:$non_variadic,
233*3766ba44SKasper Nielsen                   Variadic<AnyType>:$variadic2);
234*3766ba44SKasper Nielsen}
235*3766ba44SKasper Nielsen
236*3766ba44SKasper Nielsen// Check different arrangements of variadic groups
237*3766ba44SKasper Nielsendef SameVariadicResultSizeOpVFV : TestOp<"same_variadic_result_vfv",
238*3766ba44SKasper Nielsen                                        [SameVariadicResultSize]> {
239*3766ba44SKasper Nielsen  let results = (outs Variadic<AnyType>:$variadic1, AnyType:$non_variadic,
240*3766ba44SKasper Nielsen                 Variadic<AnyType>:$variadic2);
241*3766ba44SKasper Nielsen}
242*3766ba44SKasper Nielsen
243*3766ba44SKasper Nielsendef SameVariadicResultSizeOpVVV : TestOp<"same_variadic_result_vvv",
244*3766ba44SKasper Nielsen                                        [SameVariadicResultSize]> {
245*3766ba44SKasper Nielsen  let results = (outs Variadic<AnyType>:$variadic1, Variadic<AnyType>:$variadic2,
246*3766ba44SKasper Nielsen                 Variadic<AnyType>:$variadic3);
247*3766ba44SKasper Nielsen}
248*3766ba44SKasper Nielsen
249*3766ba44SKasper Nielsendef SameVariadicResultSizeOpFFV : TestOp<"same_variadic_result_ffv",
250*3766ba44SKasper Nielsen                                        [SameVariadicResultSize]> {
251*3766ba44SKasper Nielsen  let results = (outs AnyType:$non_variadic1, AnyType:$non_variadic2,
252*3766ba44SKasper Nielsen                 Variadic<AnyType>:$variadic);
253*3766ba44SKasper Nielsen}
254*3766ba44SKasper Nielsen
255*3766ba44SKasper Nielsendef SameVariadicResultSizeOpVVF : TestOp<"same_variadic_result_vvf",
256*3766ba44SKasper Nielsen                                        [SameVariadicResultSize]> {
257*3766ba44SKasper Nielsen  let results = (outs Variadic<AnyType>:$variadic1, Variadic<AnyType>:$variadic2,
258*3766ba44SKasper Nielsen                 AnyType:$non_variadic);
259*3766ba44SKasper Nielsen}
260*3766ba44SKasper Nielsen
261*3766ba44SKasper Nielsendef SameVariadicResultSizeOpFVFVF : TestOp<"same_variadic_result_fvfvf",
262*3766ba44SKasper Nielsen                                          [SameVariadicResultSize]> {
263*3766ba44SKasper Nielsen  let results = (outs AnyType:$non_variadic1, Variadic<AnyType>:$variadic1,
264*3766ba44SKasper Nielsen                 AnyType:$non_variadic2, Variadic<AnyType>:$variadic2,
265*3766ba44SKasper Nielsen                 AnyType:$non_variadic3);
266*3766ba44SKasper Nielsen}
267*3766ba44SKasper Nielsen
2689f3f6d7bSStella Laurenzo#endif // PYTHON_TEST_OPS
269