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