#include "exec/interface/IFunction.h"
#include "backend/interface/ITensorBuilder.h"
+#include "backend/interface/IStage.h"
#include "model/operation/NodeVisitor.h"
+#include "cpp14/memory.h"
+
+// TODO Remove dependencies for below two headers
+#include "backend/AtomicStage.h"
+// for Subgraph
+//#include "backend/StageSequence.h"
struct IExecutionBuilder
{
virtual void append(std::unique_ptr<::neurun::exec::IFunction> &&f) = 0;
};
-// TODO: Replace as IStage
-using Stage = std::function<void(IExecutionBuilder &)>;
-
namespace neurun
{
namespace backend
virtual void visit(const model::operation::Subgraph &) override {}
protected:
- void returnStage(const Stage &stage) { _return = stage; }
+ void returnStage(const StageFn fn)
+ {
+ assert(_return);
+ *_return << fn;
+ }
public:
- Stage generate(const model::operation::Node &node)
+ std::unique_ptr<IStage> generate(const model::operation::Node &node)
{
+ // TODO Consider Subgraph and
+ // remove directly dependency for classes not interface
+ _return = nnfw::cpp14::make_unique<AtomicStage>();
node.accept(std::move(*this));
- return _return;
+ return std::move(_return);
}
private:
- Stage _return = nullptr;
+ std::unique_ptr<IStage> _return = nullptr;
};
} // namespace backend
namespace compiler
{
-void PlanBuilder::addStage(const Stage &stage) { _stages.emplace_back(stage); }
+void PlanBuilder::addStage(std::unique_ptr<backend::IStage> stage)
+{
+ _stages.emplace_back(std::move(stage));
+}
void PlanBuilder::finalize(const backend::TensorBuilderSet &tensor_builders)
{
for (const auto &stage : _stages)
{
- stage(execution_builder);
+ (*stage)(execution_builder);
}
// Allocate Tensor Memory for cl_tensors
#include "compiler/operation/Sequence.h"
#include "backend/interface/IStageGenerator.h"
#include "backend/interface/ITensorBuilder.h"
+#include "backend/interface/IStage.h"
namespace neurun
{
}
public:
- void addStage(const Stage &stage);
+ void addStage(std::unique_ptr<backend::IStage> stage);
public:
// TODO Remove the argument `tensor_builders`
operation::Sequence &_operations;
private:
- std::vector<Stage> _stages;
+ std::vector<std::unique_ptr<backend::IStage>> _stages;
};
} // namepsace compiler