| // Copyright 2023 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 | |
| #include "iree/compiler/PluginAPI/Client.h" | |
| #include "mlir/Conversion/Passes.h" | |
| #include "mlir/Dialect/Tosa/IR/TosaOps.h" | |
| #include "mlir/Dialect/Tosa/Transforms/Passes.h" | |
| #include "mlir/IR/BuiltinOps.h" | |
| #include "mlir/Pass/PassManager.h" | |
| #include "compiler/plugins/input/TOSA/InputConversion/Passes.h" | |
| namespace mlir::iree_compiler { | |
| namespace { | |
| // TOSA (Tensor Operator Set Architecture) support plugin. | |
| // * https://www.mlplatform.org/tosa | |
| // * https://mlir.llvm.org/docs/Dialects/TOSA/ | |
| // | |
| // The TOSA plugin provides dialects, passes and opt-in options. | |
| // Therefore, it is appropriate for default activation. | |
| struct TOSASession | |
| : public PluginSession<TOSASession, EmptyPluginOptions, | |
| PluginActivationPolicy::DefaultActivated> { | |
| static void registerPasses() { | |
| registerTOSAConversionPasses(); | |
| registerTosaToArith(); | |
| registerTosaToLinalg(); | |
| registerTosaToTensor(); | |
| } | |
| void onRegisterDialects(DialectRegistry ®istry) override { | |
| registry.insert<tosa::TosaDialect>(); | |
| } | |
| bool extendCustomInputConversionPassPipeline( | |
| OpPassManager &passManager, std::string_view typeMnemonic) override { | |
| if (typeMnemonic == "tosa") { | |
| buildTOSAInputConversionPassPipeline(passManager); | |
| return true; | |
| } | |
| return false; | |
| } | |
| void populateCustomInputConversionTypes(StringSet<> &typeMnemonics) override { | |
| typeMnemonics.insert("tosa"); | |
| } | |
| void populateDetectedCustomInputConversionTypes( | |
| ModuleOp &module, StringSet<> &typeMnemonics) override { | |
| auto *ctx = module.getContext(); | |
| const Dialect *tosaDialect = ctx->getLoadedDialect("tosa"); | |
| module.walk([&](Operation *op) { | |
| Dialect *d = op->getDialect(); | |
| if (d == tosaDialect) { | |
| typeMnemonics.insert("tosa"); | |
| return WalkResult::interrupt(); | |
| } | |
| return WalkResult::advance(); | |
| }); | |
| } | |
| }; | |
| } // namespace | |
| } // namespace mlir::iree_compiler | |
| extern "C" bool iree_register_compiler_plugin_input_tosa( | |
| mlir::iree_compiler::PluginRegistrar *registrar) { | |
| registrar->registerPlugin<::mlir::iree_compiler::TOSASession>("input_tosa"); | |
| return true; | |
| } |