c263aef2be5234988d3a1cb1cb36a8afe2f0cc56
[platform/core/ml/nnfw.git] / runtime / onert / core / include / backend / BackendContext.h
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __ONERT_BACKEND_BACKEND_CONTEXT_H__
18 #define __ONERT_BACKEND_BACKEND_CONTEXT_H__
19
20 #include <memory>
21 #include "ir/Graph.h"
22
23 namespace onert
24 {
25 namespace backend
26 {
27
28 class Backend;
29 class IConstantInitializer;
30 class IKernelGenerator;
31 class ITensorRegister;
32 struct ITensorBuilder;
33 struct IOptimizer;
34
35 class BackendContext
36 {
37 public:
38   struct OperationInfo
39   {
40     ir::OperationIndex index;
41     ir::Layout layout;
42
43     OperationInfo(ir::OperationIndex index, ir::Layout layout) : index{index}, layout{layout} {}
44   };
45
46 public:
47   BackendContext(const Backend *backend, const ir::Graph *graph,
48                  std::shared_ptr<ITensorBuilder> tensor_builder = nullptr,
49                  std::shared_ptr<IConstantInitializer> constant_initializer = nullptr,
50                  std::shared_ptr<IKernelGenerator> kernel_gen = nullptr,
51                  std::shared_ptr<ITensorRegister> tensor_register = nullptr,
52                  std::shared_ptr<IOptimizer> optimizer = nullptr)
53       : _backend{backend}, _graph{graph}, tensor_builder{tensor_builder},
54         constant_initializer{constant_initializer}, kernel_gen{kernel_gen},
55         tensor_register{tensor_register}, optimizer{optimizer}
56   {
57   }
58
59   virtual ~BackendContext() = default;
60
61   void initialize(const std::vector<OperationInfo> &operation_list,
62                   const std::vector<ir::OperandIndex> &operand_list);
63   void initConsts();
64
65   const Backend *backend() const { return _backend; }
66   const ir::Graph *graph() const { return _graph; }
67   const std::vector<OperationInfo> &operation_list() { return _operation_list; }
68   const std::vector<ir::OperandIndex> &operand_list() { return _operand_list; }
69
70 private:
71   const Backend *_backend{nullptr};
72   const ir::Graph *_graph{nullptr};
73   std::vector<OperationInfo> _operation_list;
74   std::vector<ir::OperandIndex> _operand_list;
75
76 public:
77   std::shared_ptr<ITensorBuilder> tensor_builder;
78   std::shared_ptr<IConstantInitializer> constant_initializer;
79   std::shared_ptr<IKernelGenerator> kernel_gen;
80   std::shared_ptr<ITensorRegister> tensor_register;
81   std::shared_ptr<IOptimizer> optimizer;
82 };
83
84 using BackendContexts = std::unordered_map<const Backend *, std::unique_ptr<BackendContext>>;
85
86 } // namespace backend
87 } // namespace onert
88
89 #endif // __ONERT_BACKEND_BACKEND_CONTEXT_H__