• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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