Files
2026-07-13 13:33:03 +08:00

86 lines
2.4 KiB
C++

//
// PassRegistry.hpp
// MNNConverter
//
// Created by MNN on b'2020/12/07'.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifndef MNN_CONVERTER_PASSES_PASS_REGISTRY_HPP_
#define MNN_CONVERTER_PASSES_PASS_REGISTRY_HPP_
#include <string>
#include "converter/source/optimizer/passes/Pass.hpp"
namespace MNN {
namespace passes {
class MNN_PUBLIC PassRegistry {
public:
static Pass* GetPass(const std::string& name);
static void AddPass(std::unique_ptr<Pass>&& pass);
};
class MNN_PUBLIC PassManagerRegistry {
public:
static PassManager* GetPassManager(int index);
static std::vector<PassManager*> GetAllPassManagers();
static void AddPassManager(const PassManager& pm);
};
class MNN_PUBLIC RewritePassRegistry {
public:
RewritePassRegistry(const std::string& name);
using FuncType = std::function<bool(PassContext* context)>;
void SetVerify(FuncType verify_fn);
void SetRewrite(FuncType rewrite_fn);
private:
std::string pass_name_;
};
class MNN_PUBLIC RewritePassRegistryHelper {
public:
RewritePassRegistryHelper(const std::string& name)
: registry_(new RewritePassRegistry(name)) {}
virtual ~RewritePassRegistryHelper() = default;
template <typename FuncType, \
typename std::enable_if< \
std::is_function<FuncType>::value> * = nullptr>
RewritePassRegistryHelper&& Verify(FuncType verify_fn) {
registry_->SetVerify(verify_fn);
return std::move(*this);
}
template <typename FuncType, \
typename std::enable_if< \
std::is_function<FuncType>::value> * = nullptr>
RewritePassRegistryHelper&& Rewrite(FuncType rewrite_fn) {
registry_->SetRewrite(rewrite_fn);
return std::move(*this);
}
private:
std::shared_ptr<RewritePassRegistry> registry_;
};
} // namespace passes
} // namespace MNN
// REGISTER_REWRITE_PASS(FuseLayerNorm) \
// .Verify([](PassContext* context){ return false; }) \
// .Rewrite([](PassContext* context) { return false; });
#define REGISTER_REWRITE_PASS(pass) \
static auto _rewrite_pass_registry_helper_##pass##_ = \
MNN::passes::RewritePassRegistryHelper(#pass)
#define REGISTER_PASS_MANAGER(pass_manager) \
PassManagerRegistry::AddPassManager(pass_manager);
#endif // MNN_CONVERTER_PASSES_PASS_REGISTRY_HPP_