| // Copyright 2019 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 |
| |
| #ifndef IREE_SAMPLES_CUSTOM_MODULES_DIALECT_CUSTOM_OPS |
| #define IREE_SAMPLES_CUSTOM_MODULES_DIALECT_CUSTOM_OPS |
| |
| include "iree/compiler/Dialect/HAL/IR/HALBase.td" |
| include "iree/compiler/Dialect/Util/IR/UtilBase.td" |
| include "mlir/Interfaces/SideEffectInterfaces.td" |
| |
| def CUSTOM_Dialect : Dialect { |
| let name = "custom"; |
| let cppNamespace = "::mlir::iree_compiler::IREE::Custom"; |
| |
| let summary = [{ |
| A custom dialect demonstrating custom ops and implementations. |
| }]; |
| let description = [{ |
| The ops in this dialect are lowered to vm.imports as described in the |
| `custom_modules/dialect/custom.imports.mlir` file and the implementations |
| are provided by the `custom_modules/native_module.cc` file. |
| }]; |
| } |
| |
| def CUSTOM_Message : DialectType< |
| CUSTOM_Dialect, |
| CPred<"$_self.isa<IREE::Custom::MessageType>()">, |
| "message"> { |
| let description = [{ |
| A string message that can be printed. These types will be reference counted |
| at runtime and must derive from iree_vm_ref_t but otherwise can be whatever |
| the dialect wants. |
| }]; |
| } |
| |
| def CUSTOM_TensorToMessageOp : Op<CUSTOM_Dialect, "tensor_to_message"> { |
| let summary = [{formats tensor contents as a message}]; |
| let description = [{ |
| Formats the tensor using the IREE buffer printer to have a shape/type and |
| the contents as a string. |
| |
| This demonstrates handling tensor->buffer conversion through the HAL layer. |
| This op (tensor_to_message) is only used prior to translation and instances |
| of it will be converted to the lower-level HAL-based buffer_to_message op. |
| }]; |
| |
| let arguments = (ins |
| AnyTensor:$operand |
| ); |
| let results = (outs |
| CUSTOM_Message:$result |
| ); |
| } |
| |
| def CUSTOM_BufferToMessageOp : Op<CUSTOM_Dialect, "buffer_to_message"> { |
| let summary = [{formats buffer contents as a message}]; |
| let description = [{ |
| Formats the tensor using the IREE buffer printer to have a shape/type and |
| the contents as a string. |
| }]; |
| |
| let arguments = (ins |
| HAL_BufferView:$buffer_view |
| ); |
| let results = (outs |
| CUSTOM_Message:$result |
| ); |
| } |
| |
| def CUSTOM_MessageToTensorOp : Op<CUSTOM_Dialect, "message_to_tensor"> { |
| let summary = [{parses message contents as a tensor}]; |
| let description = [{ |
| Parses the message containing a IREE buffer parser-formatted tensor. |
| }]; |
| |
| let arguments = (ins |
| CUSTOM_Message:$message |
| ); |
| let results = (outs |
| AnyTensor:$result |
| ); |
| } |
| |
| def CUSTOM_MessageToBufferOp : Op<CUSTOM_Dialect, "message_to_buffer"> { |
| let summary = [{parses message contents as a buffer}]; |
| let description = [{ |
| Parses the message containing a IREE buffer parser-formatted tensor. |
| }]; |
| |
| let arguments = (ins |
| CUSTOM_Message:$message |
| ); |
| let results = (outs |
| HAL_BufferView:$result |
| ); |
| } |
| |
| def CUSTOM_PrintOp : Op<CUSTOM_Dialect, "print"> { |
| let summary = [{prints a message zero or more times}]; |
| let description = [{ |
| Prints the input message zero or more times with a newline inbetween. |
| |
| This demonstrates passing arguments from the application (the original |
| message). |
| }]; |
| |
| let arguments = (ins |
| CUSTOM_Message:$message, |
| I32:$count |
| ); |
| } |
| |
| def CUSTOM_ReverseOp : Op<CUSTOM_Dialect, "reverse", [NoSideEffect]> { |
| let summary = [{reverses the characters in the given the message}]; |
| let description = [{ |
| Reverses the message characters and returns the new value. |
| |
| This demonstrates allocating new values from within the op implementation |
| (the reversed result). Note that this op (as well as the vm.import) are |
| marked with NoSideEffect/nosideeffect to enable additional compiler |
| optimization. |
| }]; |
| |
| let arguments = (ins |
| CUSTOM_Message:$operand |
| ); |
| let results = (outs |
| CUSTOM_Message:$result |
| ); |
| } |
| |
| def CUSTOM_GetUniqueMessageOp : Op<CUSTOM_Dialect, "get_unique_message", [NoSideEffect]> { |
| let summary = [{returns a per-context unique message}]; |
| let description = [{ |
| Returns a unique message allocated per context using the module. |
| |
| This demonstrates context-specific global storage. Mutation methods could |
| exist that update the global storage as desired. |
| }]; |
| |
| let results = (outs |
| CUSTOM_Message:$result |
| ); |
| } |
| |
| #endif // IREE_SAMPLES_CUSTOM_MODULES_DIALECT_CUSTOM_OPS |