1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef CPP_ABCKIT_GRAPH_IMPL_H
17 #define CPP_ABCKIT_GRAPH_IMPL_H
18
19 #include <cstdint>
20 #include "./graph.h"
21 #include "./dynamic_isa.h"
22 #include "basic_block.h"
23 #include "config.h"
24
25 // NOLINTBEGIN(performance-unnecessary-value-param)
26
27 namespace abckit {
28
DynIsa()29 inline DynamicIsa Graph::DynIsa() const
30 {
31 return DynamicIsa(*this);
32 }
33
GetIsa()34 inline AbckitIsaType Graph::GetIsa() const
35 {
36 const ApiConfig *conf = GetApiConfig();
37 AbckitIsaType type = conf->cGapi_->gGetIsa(GetResource());
38 CheckError(conf);
39 return type;
40 }
41
GetStartBb()42 inline BasicBlock Graph::GetStartBb() const
43 {
44 const ApiConfig *conf = GetApiConfig();
45 AbckitBasicBlock *bb = conf->cGapi_->gGetStartBasicBlock(GetResource());
46 CheckError(conf);
47 return BasicBlock(bb, conf, this);
48 }
49
GetEndBb()50 inline BasicBlock Graph::GetEndBb() const
51 {
52 const ApiConfig *conf = GetApiConfig();
53 AbckitBasicBlock *bb = conf->cGapi_->gGetEndBasicBlock(GetResource());
54 CheckError(conf);
55 return BasicBlock(bb, conf, this);
56 }
57
GetNumBbs()58 inline uint32_t Graph::GetNumBbs() const
59 {
60 const ApiConfig *conf = GetApiConfig();
61 uint32_t bbs = conf->cGapi_->gGetNumberOfBasicBlocks(GetResource());
62 CheckError(conf);
63 return bbs;
64 }
65
66 // CC-OFFNXT(G.FUD.06) perf critical
GetBlocksRPO()67 inline std::vector<BasicBlock> Graph::GetBlocksRPO() const
68 {
69 std::vector<BasicBlock> blocks;
70 Payload<std::vector<BasicBlock> *> payload {&blocks, GetApiConfig(), this};
71
72 GetApiConfig()->cGapi_->gVisitBlocksRpo(GetResource(), &payload, [](AbckitBasicBlock *bb, void *data) {
73 const auto &payload = *static_cast<Payload<std::vector<BasicBlock> *> *>(data);
74 payload.data->push_back(BasicBlock(bb, payload.config, payload.resource));
75 return true;
76 });
77
78 CheckError(GetApiConfig());
79
80 return blocks;
81 }
82
83 // CC-OFFNXT(G.FUD.06) perf critical
EnumerateBasicBlocksRpo(const std::function<bool (BasicBlock)> & cb)84 inline const Graph &Graph::EnumerateBasicBlocksRpo(const std::function<bool(BasicBlock)> &cb) const
85 {
86 Payload<const std::function<void(BasicBlock)> &> payload {cb, GetApiConfig(), this};
87
88 GetApiConfig()->cGapi_->gVisitBlocksRpo(GetResource(), &payload, [](AbckitBasicBlock *bb, void *data) -> bool {
89 const auto &payload = *static_cast<Payload<const std::function<void(BasicBlock)> &> *>(data);
90 payload.data(BasicBlock(bb, payload.config, payload.resource));
91 return true;
92 });
93 CheckError(GetApiConfig());
94 return *this;
95 }
96
GetBasicBlock(uint32_t bbId)97 inline BasicBlock Graph::GetBasicBlock(uint32_t bbId) const
98 {
99 AbckitBasicBlock *bb = GetApiConfig()->cGapi_->gGetBasicBlock(GetResource(), bbId);
100 CheckError(GetApiConfig());
101 return BasicBlock(bb, GetApiConfig(), this);
102 }
103
GetParameter(uint32_t index)104 inline Instruction Graph::GetParameter(uint32_t index) const
105 {
106 AbckitInst *inst = GetApiConfig()->cGapi_->gGetParameter(GetResource(), index);
107 CheckError(GetApiConfig());
108 return Instruction(inst, GetApiConfig(), this);
109 }
110
GetNumberOfParameters()111 inline uint32_t Graph::GetNumberOfParameters() const
112 {
113 uint32_t number = GetApiConfig()->cGapi_->gGetNumberOfParameters(GetResource());
114 CheckError(GetApiConfig());
115 return number;
116 }
117
InsertTryCatch(BasicBlock tryBegin,BasicBlock tryEnd,BasicBlock catchBegin,BasicBlock catchEnd)118 inline const Graph &Graph::InsertTryCatch(BasicBlock tryBegin, BasicBlock tryEnd, BasicBlock catchBegin,
119 BasicBlock catchEnd) const
120 {
121 const ApiConfig *conf = GetApiConfig();
122 conf->cGapi_->gInsertTryCatch(tryBegin.GetView(), tryEnd.GetView(), catchBegin.GetView(), catchEnd.GetView());
123 CheckError(conf);
124 return *this;
125 }
126
Dump(int32_t fd)127 inline const Graph &Graph::Dump(int32_t fd) const
128 {
129 const ApiConfig *conf = GetApiConfig();
130 conf->cGapi_->gDump(GetResource(), fd);
131 CheckError(conf);
132 return *this;
133 }
134
FindOrCreateConstantI32(int32_t val)135 inline Instruction Graph::FindOrCreateConstantI32(int32_t val) const
136 {
137 AbckitInst *inst = GetApiConfig()->cGapi_->gFindOrCreateConstantI32(GetResource(), val);
138 CheckError(GetApiConfig());
139 return Instruction(inst, GetApiConfig(), this);
140 }
141
FindOrCreateConstantI64(int64_t val)142 inline Instruction Graph::FindOrCreateConstantI64(int64_t val) const
143 {
144 AbckitInst *inst = GetApiConfig()->cGapi_->gFindOrCreateConstantI64(GetResource(), val);
145 CheckError(GetApiConfig());
146 return Instruction(inst, GetApiConfig(), this);
147 }
148
FindOrCreateConstantU64(uint64_t val)149 inline Instruction Graph::FindOrCreateConstantU64(uint64_t val) const
150 {
151 AbckitInst *inst = GetApiConfig()->cGapi_->gFindOrCreateConstantU64(GetResource(), val);
152 CheckError(GetApiConfig());
153 return Instruction(inst, GetApiConfig(), this);
154 }
155
FindOrCreateConstantF64(double val)156 inline Instruction Graph::FindOrCreateConstantF64(double val) const
157 {
158 AbckitInst *inst = GetApiConfig()->cGapi_->gFindOrCreateConstantF64(GetResource(), val);
159 CheckError(GetApiConfig());
160 return Instruction(inst, GetApiConfig(), this);
161 }
162
CreateEmptyBb()163 inline BasicBlock Graph::CreateEmptyBb() const
164 {
165 const ApiConfig *conf = GetApiConfig();
166 AbckitBasicBlock *bb = conf->cGapi_->bbCreateEmpty(GetResource());
167 CheckError(conf);
168 return BasicBlock(bb, conf, this);
169 }
170
RunPassRemoveUnreachableBlocks()171 inline const Graph &Graph::RunPassRemoveUnreachableBlocks() const
172 {
173 const ApiConfig *conf = GetApiConfig();
174 conf->cGapi_->gRunPassRemoveUnreachableBlocks(GetResource());
175 CheckError(conf);
176 return *this;
177 }
178
179 } // namespace abckit
180
181 // NOLINTEND(performance-unnecessary-value-param)
182
183 #endif // CPP_ABCKIT_GRAPH_IMPL_H
184