| // Copyright 2025 The IREE Authors | |
| // | |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // RUN: iree-tblgen --gen-dialect-json %s \ | |
| // RUN: -I %S/../../compiler/src \ | |
| // RUN: -I %S/../../third_party/llvm-project/mlir/include \ | |
| // RUN: -I %S/../../../+_repo_rules+llvm-project/mlir/include \ | |
| // RUN: | FileCheck %s | |
| include "mlir/IR/OpBase.td" | |
| include "mlir/IR/AttrTypeBase.td" | |
| include "mlir/IR/OpAsmInterface.td" | |
| include "iree/compiler/Utils/DocMetadata.td" | |
| //===----------------------------------------------------------------------===// | |
| // Test Dialect Definition | |
| //===----------------------------------------------------------------------===// | |
| def TestDialect : Dialect { | |
| let name = "test"; | |
| let cppNamespace = "::mlir::iree_compiler::test"; | |
| let summary = "Test dialect for iree-tblgen JSON generation."; | |
| let description = [{ | |
| This dialect is used to test the JSON documentation generation | |
| functionality of iree-tblgen, including support for docMetadata. | |
| }]; | |
| } | |
| // CHECK: "dialects": { | |
| // CHECK-NEXT: "test": { | |
| // CHECK-NEXT: "cppClassName": "TestDialect" | |
| // CHECK: "summary": "Test dialect for iree-tblgen JSON generation." | |
| //===----------------------------------------------------------------------===// | |
| // Base Classes with docMetadata support | |
| //===----------------------------------------------------------------------===// | |
| class Test_Op<string mnemonic, list<Trait> traits = []> : | |
| Op<TestDialect, mnemonic, traits> { | |
| // Optional documentation metadata for rich doc generation. | |
| Util_OpDocMetadata docMetadata = ?; | |
| } | |
| class Test_TypeDef<string name, list<Trait> traits = []> | |
| : TypeDef<TestDialect, name, traits> { | |
| // Optional documentation metadata for rich doc generation. | |
| Util_TypeDocMetadata docMetadata = ?; | |
| } | |
| class Test_AttrDef<string name, list<Trait> traits = []> | |
| : AttrDef<TestDialect, name, traits> { | |
| // Optional documentation metadata for rich doc generation. | |
| Util_AttrDocMetadata docMetadata = ?; | |
| } | |
| class Test_OpInterface<string name> : OpInterface<name> { | |
| // Optional documentation metadata for rich doc generation. | |
| Util_InterfaceDocMetadata docMetadata = ?; | |
| } | |
| //===----------------------------------------------------------------------===// | |
| // Test Operation | |
| //===----------------------------------------------------------------------===// | |
| def Test_FooOpDocMetadata : Util_OpDocMetadata { | |
| let testFile = "test/foo_test.mlir"; | |
| let exampleRefs = ["@basicExample", "@advancedExample"]; | |
| let relatedOps = ["test.bar", "test.baz"]; | |
| let tags = ["experimental", "test"]; | |
| } | |
| def Test_FooOp : Test_Op<"foo", []> { | |
| let summary = "A test operation."; | |
| let description = [{ | |
| This operation is used to test JSON generation | |
| with multiple lines of description text. | |
| }]; | |
| let arguments = (ins | |
| AnyType:$input, | |
| I32Attr:$count | |
| ); | |
| let results = (outs | |
| AnyType:$output | |
| ); | |
| let docMetadata = Test_FooOpDocMetadata; | |
| } | |
| // CHECK: "name": "test.foo" | |
| // CHECK-NEXT: "dialect": "test" | |
| // CHECK-NEXT: "cppClassName": "FooOp" | |
| // CHECK: "metadata": { | |
| // CHECK: "testFile": "{{.+}}foo_test.mlir" | |
| // CHECK: "exampleRefs": [ | |
| // CHECK-NEXT: "@basicExample" | |
| // CHECK: "tags": [ | |
| // CHECK-NEXT: "experimental" | |
| //===----------------------------------------------------------------------===// | |
| // Test Type | |
| //===----------------------------------------------------------------------===// | |
| def Test_CustomTypeDocMetadata : Util_TypeDocMetadata { | |
| let category = "Test Types"; | |
| let relatedTypes = ["test.other"]; | |
| let testFile = "test/custom_type_test.mlir"; | |
| let exampleRefs = ["@typeExample"]; | |
| let tags = ["test"]; | |
| } | |
| def Test_CustomType : Test_TypeDef<"Custom"> { | |
| let mnemonic = "custom"; | |
| let summary = "A custom test type."; | |
| let description = [{ | |
| This type is used to test type definition | |
| JSON generation with docMetadata support. | |
| }]; | |
| let assemblyFormat = ""; | |
| let docMetadata = Test_CustomTypeDocMetadata; | |
| } | |
| // CHECK: "name": "Test_CustomType" | |
| // CHECK-NEXT: "dialect": "test" | |
| // CHECK-NEXT: "cppClassName": "CustomType" | |
| // CHECK: "metadata": { | |
| // CHECK: "category": "Test Types" | |
| // CHECK: "relatedTypes": [ | |
| // CHECK-NEXT: "test.other" | |
| // CHECK: "testFile": "{{.+}}custom_type_test.mlir" | |
| // CHECK: "exampleRefs": [ | |
| // CHECK-NEXT: "@typeExample" | |
| // CHECK: "tags": [ | |
| // CHECK-NEXT: "test" | |
| //===----------------------------------------------------------------------===// | |
| // Test Attribute | |
| //===----------------------------------------------------------------------===// | |
| def Test_CustomAttrDocMetadata : Util_AttrDocMetadata { | |
| let category = "Test Attributes"; | |
| let relatedAttrs = ["test.other_attr"]; | |
| let testFile = "test/custom_attr_test.mlir"; | |
| let exampleRefs = ["@attrExample"]; | |
| let tags = ["test"]; | |
| } | |
| def Test_CustomAttr : Test_AttrDef<"Custom"> { | |
| let mnemonic = "custom"; | |
| let summary = "A custom test attribute."; | |
| let description = [{ | |
| This attribute is used to test attribute definition | |
| JSON generation with docMetadata support. | |
| }]; | |
| let parameters = (ins | |
| "int64_t":$value | |
| ); | |
| let assemblyFormat = "`<` $value `>`"; | |
| let docMetadata = Test_CustomAttrDocMetadata; | |
| } | |
| // CHECK: "name": "Test_CustomAttr" | |
| // CHECK-NEXT: "dialect": "test" | |
| // CHECK-NEXT: "cppClassName": "CustomAttr" | |
| // CHECK: "metadata": { | |
| // CHECK: "category": "Test Attributes" | |
| // CHECK: "relatedAttrs": [ | |
| // CHECK-NEXT: "test.other_attr" | |
| // CHECK: "testFile": "{{.+}}custom_attr_test.mlir" | |
| // CHECK: "exampleRefs": [ | |
| // CHECK-NEXT: "@attrExample" | |
| // CHECK: "tags": [ | |
| // CHECK-NEXT: "test" | |
| //===----------------------------------------------------------------------===// | |
| // Test Interface | |
| //===----------------------------------------------------------------------===// | |
| def Test_FooInterfaceDocMetadata : Util_InterfaceDocMetadata { | |
| let category = "Test Interfaces"; | |
| let relatedInterfaces = ["test.bar_interface"]; | |
| let testFile = "test/interface_test.mlir"; | |
| let exampleRefs = ["@interfaceExample"]; | |
| let tags = ["test"]; | |
| } | |
| def Test_FooInterface : Test_OpInterface<"FooOpInterface"> { | |
| let description = [{ | |
| This interface is used to test interface JSON generation | |
| with docMetadata support. | |
| }]; | |
| let methods = [ | |
| InterfaceMethod< | |
| "Get the foo value", | |
| "int64_t", "getFoo", (ins) | |
| >, | |
| ]; | |
| let docMetadata = Test_FooInterfaceDocMetadata; | |
| } | |
| // CHECK: "name": "Test_FooInterface" | |
| // CHECK-NEXT: "cppClassName": "FooOpInterface" | |
| // CHECK: "metadata": { | |
| // CHECK: "category": "Test Interfaces" | |
| // CHECK: "relatedInterfaces": [ | |
| // CHECK-NEXT: "test.bar_interface" | |
| // CHECK: "testFile": "{{.+}}interface_test.mlir" | |
| // CHECK: "exampleRefs": [ | |
| // CHECK-NEXT: "@interfaceExample" | |
| // CHECK: "tags": [ | |
| // CHECK-NEXT: "test" |