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

94 lines
3.1 KiB
C++

//
// PassRegistry.cpp
// MNNConverter
//
// Created by MNN on b'2020/12/07'.
// Copyright © 2018, Alibaba Group Holding Limited
//
#include <string>
#include <unordered_map>
#include "MNN/MNNDefine.h"
#include "converter/source/optimizer/passes/PassRegistry.hpp"
namespace MNN {
namespace passes {
// All registered passes.
static std::unordered_map<std::string, std::unique_ptr<Pass>>*
AllRegisteredPasses() {
static std::unordered_map<std::string, \
std::unique_ptr<Pass>> g_registered_passes;
return &g_registered_passes;
}
// All registered pass managers.
static std::vector<std::unique_ptr<PassManager>>* AllRegisteredPassManagers() {
static std::vector<std::unique_ptr<PassManager>> g_registered_pass_managers;
return &g_registered_pass_managers;
}
/*static*/ PassManager* PassManagerRegistry::GetPassManager(int index) {
auto* g_registered_pass_managers = AllRegisteredPassManagers();
MNN_CHECK(index < g_registered_pass_managers->size(),
"The pass manager index is out of bounds.");
return (*g_registered_pass_managers)[index].get();
}
/*static*/ std::vector<PassManager*> PassManagerRegistry::GetAllPassManagers() {
std::vector<PassManager*> pass_managers;
for (auto& pm : *(AllRegisteredPassManagers())) {
pass_managers.push_back(pm.get());
}
return pass_managers;
}
/*static*/ void PassManagerRegistry::AddPassManager(const PassManager& pm) {
auto* g_registered_pass_managers = AllRegisteredPassManagers();
g_registered_pass_managers->emplace_back(new PassManager(pm));
}
/*static*/ void PassRegistry::AddPass(std::unique_ptr<Pass>&& pass) {
auto* g_registered_passes = AllRegisteredPasses();
g_registered_passes->emplace(pass->name(), std::move(pass));
}
/*static*/ Pass* PassRegistry::GetPass(const std::string& pass_name) {
auto* g_registered_passes = AllRegisteredPasses();
const auto& it = g_registered_passes->find(pass_name);
if (it != g_registered_passes->end()) {
return it->second.get();
}
return nullptr;
}
RewritePassRegistry::RewritePassRegistry(const std::string& pass_name)
: pass_name_(pass_name) {
std::unique_ptr<Pass> pass(new RewritePass(pass_name));
PassRegistry::AddPass(std::move(pass));
}
RewritePass* GetRewritePassByName(const std::string& pass_name) {
Pass* pass = PassRegistry::GetPass(pass_name);
MNN_CHECK(pass, "Pass has not been setup.");
if (pass->type() != Pass::PassType::kRewrite) {
MNN_ERROR("Pass %s is registered but not rewrite pass.",
pass_name.c_str());
}
RewritePass *rewrite_pass = static_cast<RewritePass*>(pass);
return rewrite_pass;
}
void RewritePassRegistry::SetVerify(RewritePassRegistry::FuncType verify_fn) {
auto *rewrite_pass = GetRewritePassByName(pass_name_);
rewrite_pass->SetVerify(verify_fn);
}
void RewritePassRegistry::SetRewrite(RewritePassRegistry::FuncType rewrite_fn) {
auto *rewrite_pass = GetRewritePassByName(pass_name_);
rewrite_pass->SetRewrite(rewrite_fn);
}
} // namespace passes
} // namespace MNN