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/Bindings/Python/Attributes.td" 149f3f6d7bSStella Laurenzoinclude "mlir/IR/OpBase.td" 1514c92070SAlex Zinenkoinclude "mlir/Interfaces/InferTypeOpInterface.td" 169f3f6d7bSStella Laurenzo 179f3f6d7bSStella Laurenzodef Python_Test_Dialect : Dialect { 189f3f6d7bSStella Laurenzo let name = "python_test"; 1914c92070SAlex Zinenko let cppNamespace = "python_test"; 20*4957518eSMogball 21*4957518eSMogball let useDefaultTypePrinterParser = 1; 22*4957518eSMogball let useDefaultAttributePrinterParser = 1; 239f3f6d7bSStella Laurenzo} 2489a92fb3SAlex Zinenko 2589a92fb3SAlex Zinenkoclass TestType<string name, string typeMnemonic> 2689a92fb3SAlex Zinenko : TypeDef<Python_Test_Dialect, name> { 2789a92fb3SAlex Zinenko let mnemonic = typeMnemonic; 2889a92fb3SAlex Zinenko} 2989a92fb3SAlex Zinenko 3089a92fb3SAlex Zinenkoclass TestAttr<string name, string attrMnemonic> 3189a92fb3SAlex Zinenko : AttrDef<Python_Test_Dialect, name> { 3289a92fb3SAlex Zinenko let mnemonic = attrMnemonic; 3389a92fb3SAlex Zinenko} 3489a92fb3SAlex Zinenko 35697a5036SSanjoy Dasclass TestOp<string mnemonic, list<Trait> traits = []> 369f3f6d7bSStella Laurenzo : Op<Python_Test_Dialect, mnemonic, traits>; 379f3f6d7bSStella Laurenzo 3889a92fb3SAlex Zinenko//===----------------------------------------------------------------------===// 3989a92fb3SAlex Zinenko// Type definitions. 4089a92fb3SAlex Zinenko//===----------------------------------------------------------------------===// 4189a92fb3SAlex Zinenko 4289a92fb3SAlex Zinenkodef TestType : TestType<"TestType", "test_type">; 4389a92fb3SAlex Zinenko 4489a92fb3SAlex Zinenko//===----------------------------------------------------------------------===// 4589a92fb3SAlex Zinenko// Attribute definitions. 4689a92fb3SAlex Zinenko//===----------------------------------------------------------------------===// 4789a92fb3SAlex Zinenko 4889a92fb3SAlex Zinenkodef TestAttr : TestAttr<"TestAttr", "test_attr">; 4989a92fb3SAlex Zinenko 5089a92fb3SAlex Zinenko//===----------------------------------------------------------------------===// 5189a92fb3SAlex Zinenko// Operation definitions. 5289a92fb3SAlex Zinenko//===----------------------------------------------------------------------===// 5389a92fb3SAlex Zinenko 549f3f6d7bSStella Laurenzodef AttributedOp : TestOp<"attributed_op"> { 559f3f6d7bSStella Laurenzo let arguments = (ins I32Attr:$mandatory_i32, 569f3f6d7bSStella Laurenzo OptionalAttr<I32Attr>:$optional_i32, 579f3f6d7bSStella Laurenzo UnitAttr:$unit); 589f3f6d7bSStella Laurenzo} 599f3f6d7bSStella Laurenzo 60b4c93eceSJohn Demmedef PropertyOp : TestOp<"property_op"> { 61b4c93eceSJohn Demme let arguments = (ins I32Attr:$property, 62b4c93eceSJohn Demme I32:$idx); 63b4c93eceSJohn Demme} 64b4c93eceSJohn Demme 6514c92070SAlex Zinenkodef DummyOp : TestOp<"dummy_op"> { 6614c92070SAlex Zinenko} 6714c92070SAlex Zinenko 6814c92070SAlex Zinenkodef InferResultsOp : TestOp<"infer_results_op", [InferTypeOpInterface]> { 6914c92070SAlex Zinenko let arguments = (ins); 7014c92070SAlex Zinenko let results = (outs AnyInteger:$single, AnyInteger:$doubled); 7114c92070SAlex Zinenko 7214c92070SAlex Zinenko let extraClassDeclaration = [{ 7314c92070SAlex Zinenko static ::mlir::LogicalResult inferReturnTypes( 7414c92070SAlex Zinenko ::mlir::MLIRContext *context, ::llvm::Optional<::mlir::Location> location, 7514c92070SAlex Zinenko ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, 7614c92070SAlex Zinenko ::mlir::RegionRange regions, 7714c92070SAlex Zinenko ::llvm::SmallVectorImpl<::mlir::Type> &inferredReturnTypes) { 7814c92070SAlex Zinenko ::mlir::Builder b(context); 7914c92070SAlex Zinenko inferredReturnTypes.push_back(b.getI32Type()); 8014c92070SAlex Zinenko inferredReturnTypes.push_back(b.getI64Type()); 8114c92070SAlex Zinenko return ::mlir::success(); 8214c92070SAlex Zinenko } 8314c92070SAlex Zinenko }]; 8414c92070SAlex Zinenko} 8514c92070SAlex Zinenko 862995d29bSAlex Zinenko// If all result types are buildable, the InferTypeOpInterface is implied and is 872995d29bSAlex Zinenko// autogenerated by C++ ODS. 882995d29bSAlex Zinenkodef InferResultsImpliedOp : TestOp<"infer_results_implied_op"> { 892995d29bSAlex Zinenko let results = (outs I32:$integer, F64:$flt, Index:$index); 902995d29bSAlex Zinenko} 912995d29bSAlex Zinenko 922995d29bSAlex Zinenkodef SameOperandAndResultTypeOp : TestOp<"same_operand_and_result_type_op", 932995d29bSAlex Zinenko [SameOperandsAndResultType]> { 942995d29bSAlex Zinenko let arguments = (ins Variadic<AnyType>); 952995d29bSAlex Zinenko let results = (outs AnyType:$one, AnyType:$two); 962995d29bSAlex Zinenko} 972995d29bSAlex Zinenko 982995d29bSAlex Zinenkodef FirstAttrDeriveTypeAttrOp : TestOp<"first_attr_derive_type_attr_op", 992995d29bSAlex Zinenko [FirstAttrDerivedResultType]> { 1002995d29bSAlex Zinenko let arguments = (ins AnyType:$input, TypeAttr:$type); 1012995d29bSAlex Zinenko let results = (outs AnyType:$one, AnyType:$two); 1022995d29bSAlex Zinenko} 1032995d29bSAlex Zinenko 1042995d29bSAlex Zinenkodef FirstAttrDeriveAttrOp : TestOp<"first_attr_derive_attr_op", 1052995d29bSAlex Zinenko [FirstAttrDerivedResultType]> { 1062995d29bSAlex Zinenko let arguments = (ins AnyAttr:$iattr); 1072995d29bSAlex Zinenko let results = (outs AnyType:$one, AnyType:$two, AnyType:$three); 1082995d29bSAlex Zinenko} 1092995d29bSAlex Zinenko 11054c99842SMichal Terepetadef OptionalOperandOp : TestOp<"optional_operand_op"> { 11154c99842SMichal Terepeta let arguments = (ins Optional<AnyType>:$input); 11254c99842SMichal Terepeta let results = (outs I32:$result); 11354c99842SMichal Terepeta} 11454c99842SMichal Terepeta 1159f3f6d7bSStella Laurenzo#endif // PYTHON_TEST_OPS 116