278 lines · plain
1//===-- python_test_ops.td - Python test Op definitions ----*- tablegen -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef PYTHON_TEST_OPS10#define PYTHON_TEST_OPS11 12include "mlir/IR/AttrTypeBase.td"13include "mlir/IR/OpBase.td"14include "mlir/Interfaces/InferTypeOpInterface.td"15 16def Python_Test_Dialect : Dialect {17 let name = "python_test";18 let cppNamespace = "python_test";19 20 let useDefaultTypePrinterParser = 1;21 let useDefaultAttributePrinterParser = 1;22}23 24class TestType<string name, string typeMnemonic>25 : TypeDef<Python_Test_Dialect, name> {26 let mnemonic = typeMnemonic;27}28 29class TestAttr<string name, string attrMnemonic>30 : AttrDef<Python_Test_Dialect, name> {31 let mnemonic = attrMnemonic;32}33 34class TestOp<string mnemonic, list<Trait> traits = []>35 : Op<Python_Test_Dialect, mnemonic, traits> {36 let assemblyFormat = "operands attr-dict functional-type(operands, results)";37}38 39//===----------------------------------------------------------------------===//40// Type definitions.41//===----------------------------------------------------------------------===//42 43def TestType : TestType<"TestType", "test_type">;44 45//===----------------------------------------------------------------------===//46// Attribute definitions.47//===----------------------------------------------------------------------===//48 49def TestAttr : TestAttr<"TestAttr", "test_attr">;50 51//===----------------------------------------------------------------------===//52// Operation definitions.53//===----------------------------------------------------------------------===//54 55def AttributedOp : TestOp<"attributed_op"> {56 let arguments = (ins I32Attr:$mandatory_i32,57 OptionalAttr<I32Attr>:$optional_i32,58 UnitAttr:$unit);59}60 61def CustomAttributedOp : TestOp<"custom_attributed_op"> {62 let arguments = (ins TestAttr:$test_attr);63}64 65def AttributesOp : TestOp<"attributes_op"> {66 let arguments = (ins67 AffineMapArrayAttr:$x_affinemaparr,68 AffineMapAttr:$x_affinemap,69 ArrayAttr:$x_arr,70 BoolArrayAttr:$x_boolarr,71 BoolAttr:$x_bool,72 DenseBoolArrayAttr:$x_dboolarr,73 DenseF32ArrayAttr:$x_df32arr,74 DenseF64ArrayAttr:$x_df64arr,75 DenseI16ArrayAttr:$x_df16arr,76 DenseI32ArrayAttr:$x_di32arr,77 DenseI64ArrayAttr:$x_di64arr,78 DenseI8ArrayAttr:$x_di8arr,79 DictArrayAttr:$x_dictarr,80 DictionaryAttr:$x_dict,81 F32ArrayAttr:$x_f32arr,82 F32Attr:$x_f32,83 F64ArrayAttr:$x_f64arr,84 F64Attr:$x_f64,85 F64ElementsAttr:$x_f64elems,86 FlatSymbolRefArrayAttr:$x_flatsymrefarr,87 FlatSymbolRefAttr:$x_flatsymref,88 I16Attr:$x_i16,89 I1Attr:$x_i1,90 I32ArrayAttr:$x_i32arr,91 I32Attr:$x_i32,92 I32ElementsAttr:$x_i32elems,93 I64ArrayAttr:$x_i64arr,94 I64Attr:$x_i64,95 I64ElementsAttr:$x_i64elems,96 I64SmallVectorArrayAttr:$x_i64svecarr,97 I8Attr:$x_i8,98 IndexAttr:$x_idx,99 IndexElementsAttr:$x_idxelems,100 IndexListArrayAttr:$x_idxlistarr,101 SI16Attr:$x_si16,102 SI1Attr:$x_si1,103 SI32Attr:$x_si32,104 SI64Attr:$x_si64,105 SI8Attr:$x_si8,106 StrArrayAttr:$x_strarr,107 StrAttr:$x_str,108 SymbolNameAttr:$x_sym,109 SymbolRefArrayAttr:$x_symrefarr,110 SymbolRefAttr:$x_symref,111 TypeArrayAttr:$x_typearr,112 TypeAttr:$x_type,113 UI16Attr:$x_ui16,114 UI1Attr:$x_ui1,115 UI32Attr:$x_ui32,116 UI64Attr:$x_ui64,117 UI8Attr:$x_ui8,118 UnitAttr:$x_unit119 );120}121 122def PropertyOp : TestOp<"property_op"> {123 let arguments = (ins I32Attr:$property,124 I32:$idx);125}126 127def DummyOp : TestOp<"dummy_op"> {128}129 130def InferResultsOp : TestOp<"infer_results_op", [InferTypeOpInterface]> {131 let arguments = (ins);132 let results = (outs AnyInteger:$single, AnyInteger:$doubled);133 134 let extraClassDeclaration = [{135 static ::llvm::LogicalResult inferReturnTypes(136 ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location,137 ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes,138 ::mlir::OpaqueProperties,139 ::mlir::RegionRange regions,140 ::llvm::SmallVectorImpl<::mlir::Type> &inferredReturnTypes) {141 ::mlir::Builder b(context);142 inferredReturnTypes.push_back(b.getI32Type());143 inferredReturnTypes.push_back(b.getI64Type());144 return ::mlir::success();145 }146 }];147}148 149def I32OrF32 : TypeConstraint<Or<[I32.predicate, F32.predicate]>,150 "i32 or f32">;151 152def InferResultsVariadicInputsOp : TestOp<"infer_results_variadic_inputs_op",153 [InferTypeOpInterface, AttrSizedOperandSegments]> {154 let arguments = (ins Optional<I64>:$single, Optional<I64>:$doubled);155 let results = (outs I32OrF32:$res);156 157 let extraClassDeclaration = [{158 static ::llvm::LogicalResult inferReturnTypes(159 ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location,160 ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes,161 ::mlir::OpaqueProperties,162 ::mlir::RegionRange regions,163 ::llvm::SmallVectorImpl<::mlir::Type> &inferredReturnTypes) {164 ::mlir::Builder b(context);165 if (operands.size() == 1)166 inferredReturnTypes.push_back(b.getI32Type());167 else if (operands.size() == 2)168 inferredReturnTypes.push_back(b.getF32Type());169 return ::mlir::success();170 }171 }];172}173 174// If all result types are buildable, the InferTypeOpInterface is implied and is175// autogenerated by C++ ODS.176def InferResultsImpliedOp : TestOp<"infer_results_implied_op"> {177 let results = (outs I32:$integer, F64:$flt, Index:$index);178}179 180def InferShapedTypeComponentsOp : TestOp<"infer_shaped_type_components_op",181 [DeclareOpInterfaceMethods<InferShapedTypeOpInterface,182 ["inferReturnTypeComponents"]>]> {183 let arguments = (ins AnyTensor:$operand);184 let results = (outs AnyTensor:$result);185 186 let extraClassDefinition = [{187 ::llvm::LogicalResult $cppClass::inferReturnTypeComponents(188 ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location,189 ::mlir::ValueShapeRange operands, ::mlir::DictionaryAttr attributes,190 ::mlir::OpaqueProperties properties, ::mlir::RegionRange regions,191 ::llvm::SmallVectorImpl<192 ::mlir::ShapedTypeComponents>& inferredShapedTypeComponents) {193 $cppClass::Adaptor adaptor(operands, attributes, properties, regions);194 auto operandType =195 ::llvm::cast<::mlir::ShapedType>(adaptor.getOperand().getType());196 if (operandType.hasRank()) {197 inferredShapedTypeComponents.emplace_back(operandType.getShape(),198 operandType.getElementType());199 } else {200 inferredShapedTypeComponents.emplace_back(operandType.getElementType());201 }202 return ::mlir::success();203 }204 }];205}206 207def SameOperandAndResultTypeOp : TestOp<"same_operand_and_result_type_op",208 [SameOperandsAndResultType]> {209 let arguments = (ins Variadic<AnyType>);210 let results = (outs AnyType:$one, AnyType:$two);211}212 213def FirstAttrDeriveTypeAttrOp : TestOp<"first_attr_derive_type_attr_op",214 [FirstAttrDerivedResultType]> {215 let arguments = (ins AnyType:$input, TypeAttr:$type);216 let results = (outs AnyType:$one, AnyType:$two);217}218 219def FirstAttrDeriveAttrOp : TestOp<"first_attr_derive_attr_op",220 [FirstAttrDerivedResultType]> {221 let arguments = (ins AnyAttr:$iattr);222 let results = (outs AnyType:$one, AnyType:$two, AnyType:$three);223}224 225def OptionalOperandOp : TestOp<"optional_operand_op"> {226 let arguments = (ins Optional<AnyType>:$input);227 let results = (outs I32:$result);228}229 230def SameVariadicOperandSizeOp : TestOp<"same_variadic_operand",231 [SameVariadicOperandSize]> {232 let arguments = (ins Variadic<AnyType>:$variadic1, AnyType:$non_variadic,233 Variadic<AnyType>:$variadic2);234}235 236// Check different arrangements of variadic groups237def SameVariadicResultSizeOpVFV : TestOp<"same_variadic_result_vfv",238 [SameVariadicResultSize]> {239 let results = (outs Variadic<AnyType>:$variadic1, AnyType:$non_variadic,240 Variadic<AnyType>:$variadic2);241}242 243def SameVariadicResultSizeOpVVV : TestOp<"same_variadic_result_vvv",244 [SameVariadicResultSize]> {245 let results = (outs Variadic<AnyType>:$variadic1, Variadic<AnyType>:$variadic2,246 Variadic<AnyType>:$variadic3);247}248 249def SameVariadicResultSizeOpFFV : TestOp<"same_variadic_result_ffv",250 [SameVariadicResultSize]> {251 let results = (outs AnyType:$non_variadic1, AnyType:$non_variadic2,252 Variadic<AnyType>:$variadic);253}254 255def SameVariadicResultSizeOpVVF : TestOp<"same_variadic_result_vvf",256 [SameVariadicResultSize]> {257 let results = (outs Variadic<AnyType>:$variadic1, Variadic<AnyType>:$variadic2,258 AnyType:$non_variadic);259}260 261def SameVariadicResultSizeOpFVFVF : TestOp<"same_variadic_result_fvfvf",262 [SameVariadicResultSize]> {263 let results = (outs AnyType:$non_variadic1, Variadic<AnyType>:$variadic1,264 AnyType:$non_variadic2, Variadic<AnyType>:$variadic2,265 AnyType:$non_variadic3);266}267 268def ResultsVariadicOp : TestOp<"results_variadic"> {269 let results = (outs Variadic<AnyType>:$res);270}271 272def VariadicAndNormalRegionOp : TestOp<"variadic_and_normal_region"> {273 let regions = (region AnyRegion:$region, VariadicRegion<AnyRegion>:$variadic);274 let assemblyFormat = "$region $variadic attr-dict";275}276 277#endif // PYTHON_TEST_OPS278