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