2 * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef __CIRCLE_CLONE_NODE_H__
18 #define __CIRCLE_CLONE_NODE_H__
20 #include <luci/IR/CircleNodes.h>
22 #include <luci/IR/CircleNodeVisitor.h>
39 template <CN ct> class CloneNodeLet;
41 template <> class CloneNodeLet<CN::ABC> final : public luci::CircleNodeVisitor<luci::CircleNode *>
44 CloneNodeLet(loco::Graph *graph) : _graph(graph){};
47 luci::CircleNode *visit(const luci::CircleAbs *) final;
48 luci::CircleNode *visit(const luci::CircleAdd *) final;
49 luci::CircleNode *visit(const luci::CircleAddN *) final;
50 luci::CircleNode *visit(const luci::CircleArgMax *) final;
51 luci::CircleNode *visit(const luci::CircleArgMin *) final;
52 luci::CircleNode *visit(const luci::CircleAveragePool2D *) final;
53 luci::CircleNode *visit(const luci::CircleBatchMatMul *) final;
54 luci::CircleNode *visit(const luci::CircleBatchToSpaceND *) final;
55 luci::CircleNode *visit(const luci::CircleCast *) final;
56 luci::CircleNode *visit(const luci::CircleCeil *) final;
57 luci::CircleNode *visit(const luci::CircleConcatenation *) final;
58 luci::CircleNode *visit(const luci::CircleConst *) final;
59 luci::CircleNode *visit(const luci::CircleConv2D *) final;
60 luci::CircleNode *visit(const luci::CircleCos *) final;
61 luci::CircleNode *visit(const luci::CircleCustom *) final;
63 luci::CircleNode *visit(const luci::CircleNode *) final { return nullptr; }
66 loco::Graph *_graph = nullptr;
69 template <> class CloneNodeLet<CN::DEF> final : public luci::CircleNodeVisitor<luci::CircleNode *>
72 CloneNodeLet(loco::Graph *graph) : _graph(graph){};
75 luci::CircleNode *visit(const luci::CircleDensify *) final;
76 luci::CircleNode *visit(const luci::CircleDepthToSpace *) final;
77 luci::CircleNode *visit(const luci::CircleDepthwiseConv2D *) final;
78 luci::CircleNode *visit(const luci::CircleDequantize *) final;
79 luci::CircleNode *visit(const luci::CircleDiv *) final;
80 luci::CircleNode *visit(const luci::CircleElu *) final;
81 luci::CircleNode *visit(const luci::CircleEqual *) final;
82 luci::CircleNode *visit(const luci::CircleExp *) final;
83 luci::CircleNode *visit(const luci::CircleExpandDims *) final;
84 luci::CircleNode *visit(const luci::CircleFakeQuant *) final;
85 luci::CircleNode *visit(const luci::CircleFill *) final;
86 luci::CircleNode *visit(const luci::CircleFloor *) final;
87 luci::CircleNode *visit(const luci::CircleFloorDiv *) final;
88 luci::CircleNode *visit(const luci::CircleFloorMod *) final;
89 luci::CircleNode *visit(const luci::CircleFullyConnected *) final;
91 luci::CircleNode *visit(const luci::CircleNode *) final { return nullptr; }
94 loco::Graph *_graph = nullptr;
97 template <> class CloneNodeLet<CN::GHIJ> final : public luci::CircleNodeVisitor<luci::CircleNode *>
100 CloneNodeLet(loco::Graph *graph) : _graph(graph){};
103 luci::CircleNode *visit(const luci::CircleGather *) final;
104 luci::CircleNode *visit(const luci::CircleGatherNd *) final;
105 luci::CircleNode *visit(const luci::CircleGreater *) final;
106 luci::CircleNode *visit(const luci::CircleGreaterEqual *) final;
107 luci::CircleNode *visit(const luci::CircleIf *) final;
109 luci::CircleNode *visit(const luci::CircleNode *) final { return nullptr; }
112 loco::Graph *_graph = nullptr;
115 template <> class CloneNodeLet<CN::KLMN> final : public luci::CircleNodeVisitor<luci::CircleNode *>
118 CloneNodeLet(loco::Graph *graph) : _graph(graph){};
121 luci::CircleNode *visit(const luci::CircleL2Normalize *) final;
122 luci::CircleNode *visit(const luci::CircleL2Pool2D *) final;
123 luci::CircleNode *visit(const luci::CircleLeakyRelu *) final;
124 luci::CircleNode *visit(const luci::CircleLess *) final;
125 luci::CircleNode *visit(const luci::CircleLessEqual *) final;
126 luci::CircleNode *visit(const luci::CircleLocalResponseNormalization *) final;
127 luci::CircleNode *visit(const luci::CircleLog *) final;
128 luci::CircleNode *visit(const luci::CircleLogicalAnd *) final;
129 luci::CircleNode *visit(const luci::CircleLogicalNot *) final;
130 luci::CircleNode *visit(const luci::CircleLogicalOr *) final;
131 luci::CircleNode *visit(const luci::CircleLogistic *) final;
132 luci::CircleNode *visit(const luci::CircleLogSoftmax *) final;
133 luci::CircleNode *visit(const luci::CircleMatrixDiag *) final;
134 luci::CircleNode *visit(const luci::CircleMatrixSetDiag *) final;
135 luci::CircleNode *visit(const luci::CircleMaximum *) final;
136 luci::CircleNode *visit(const luci::CircleMaxPool2D *) final;
137 luci::CircleNode *visit(const luci::CircleMean *) final;
138 luci::CircleNode *visit(const luci::CircleMinimum *) final;
139 luci::CircleNode *visit(const luci::CircleMirrorPad *) final;
140 luci::CircleNode *visit(const luci::CircleMul *) final;
141 luci::CircleNode *visit(const luci::CircleNeg *) final;
142 luci::CircleNode *visit(const luci::CircleNonMaxSuppressionV4 *) final;
143 luci::CircleNode *visit(const luci::CircleNonMaxSuppressionV5 *) final;
144 luci::CircleNode *visit(const luci::CircleNotEqual *) final;
146 luci::CircleNode *visit(const luci::CircleNode *) final { return nullptr; }
149 loco::Graph *_graph = nullptr;
152 template <> class CloneNodeLet<CN::OPQR> final : public luci::CircleNodeVisitor<luci::CircleNode *>
155 CloneNodeLet(loco::Graph *graph) : _graph(graph){};
158 luci::CircleNode *visit(const luci::CircleOneHot *) final;
159 luci::CircleNode *visit(const luci::CirclePack *) final;
160 luci::CircleNode *visit(const luci::CirclePad *) final;
161 luci::CircleNode *visit(const luci::CirclePadV2 *) final;
162 luci::CircleNode *visit(const luci::CirclePow *) final;
163 luci::CircleNode *visit(const luci::CirclePRelu *) final;
164 luci::CircleNode *visit(const luci::CircleQuantize *) final;
165 luci::CircleNode *visit(const luci::CircleRange *) final;
166 luci::CircleNode *visit(const luci::CircleRank *) final;
167 luci::CircleNode *visit(const luci::CircleReduceAny *) final;
168 luci::CircleNode *visit(const luci::CircleReduceMax *) final;
169 luci::CircleNode *visit(const luci::CircleReduceMin *) final;
170 luci::CircleNode *visit(const luci::CircleReduceProd *) final;
171 luci::CircleNode *visit(const luci::CircleRelu *) final;
172 luci::CircleNode *visit(const luci::CircleRelu6 *) final;
173 luci::CircleNode *visit(const luci::CircleReluN1To1 *) final;
174 luci::CircleNode *visit(const luci::CircleReshape *) final;
175 luci::CircleNode *visit(const luci::CircleResizeBilinear *) final;
176 luci::CircleNode *visit(const luci::CircleResizeNearestNeighbor *) final;
177 luci::CircleNode *visit(const luci::CircleReverseSequence *) final;
178 luci::CircleNode *visit(const luci::CircleReverseV2 *) final;
179 luci::CircleNode *visit(const luci::CircleRound *) final;
180 luci::CircleNode *visit(const luci::CircleRsqrt *) final;
182 luci::CircleNode *visit(const luci::CircleNode *) final { return nullptr; }
185 loco::Graph *_graph = nullptr;
188 template <> class CloneNodeLet<CN::STUV> final : public luci::CircleNodeVisitor<luci::CircleNode *>
191 CloneNodeLet(loco::Graph *graph) : _graph(graph){};
194 luci::CircleNode *visit(const luci::CircleScatterNd *) final;
195 luci::CircleNode *visit(const luci::CircleSegmentSum *) final;
196 luci::CircleNode *visit(const luci::CircleSelect *) final;
197 luci::CircleNode *visit(const luci::CircleSelectV2 *) final;
198 luci::CircleNode *visit(const luci::CircleShape *) final;
199 luci::CircleNode *visit(const luci::CircleSin *) final;
200 luci::CircleNode *visit(const luci::CircleSlice *) final;
201 luci::CircleNode *visit(const luci::CircleSoftmax *) final;
202 luci::CircleNode *visit(const luci::CircleSpaceToBatchND *) final;
203 luci::CircleNode *visit(const luci::CircleSpaceToDepth *) final;
204 luci::CircleNode *visit(const luci::CircleSparseToDense *) final;
205 luci::CircleNode *visit(const luci::CircleSplit *) final;
206 luci::CircleNode *visit(const luci::CircleSplitV *) final;
207 luci::CircleNode *visit(const luci::CircleSqrt *) final;
208 luci::CircleNode *visit(const luci::CircleSquare *) final;
209 luci::CircleNode *visit(const luci::CircleSquaredDifference *) final;
210 luci::CircleNode *visit(const luci::CircleSqueeze *) final;
211 luci::CircleNode *visit(const luci::CircleStridedSlice *) final;
212 luci::CircleNode *visit(const luci::CircleSVDF *) final;
213 luci::CircleNode *visit(const luci::CircleSub *) final;
214 luci::CircleNode *visit(const luci::CircleSum *) final;
215 luci::CircleNode *visit(const luci::CircleTanh *) final;
216 luci::CircleNode *visit(const luci::CircleTile *) final;
217 luci::CircleNode *visit(const luci::CircleTopKV2 *) final;
218 luci::CircleNode *visit(const luci::CircleTranspose *) final;
219 luci::CircleNode *visit(const luci::CircleTransposeConv *) final;
220 luci::CircleNode *visit(const luci::CircleUnidirectionalSequenceLSTM *) final;
221 luci::CircleNode *visit(const luci::CircleUnique *) final;
222 luci::CircleNode *visit(const luci::CircleUnpack *) final;
224 luci::CircleNode *visit(const luci::CircleNode *) final { return nullptr; }
227 loco::Graph *_graph = nullptr;
230 template <> class CloneNodeLet<CN::WXYZ> final : public luci::CircleNodeVisitor<luci::CircleNode *>
233 CloneNodeLet(loco::Graph *graph) : _graph(graph){};
236 luci::CircleNode *visit(const luci::CircleWhere *) final;
237 luci::CircleNode *visit(const luci::CircleWhile *) final;
238 luci::CircleNode *visit(const luci::CircleZerosLike *) final;
240 luci::CircleNode *visit(const luci::CircleNode *) final { return nullptr; }
243 loco::Graph *_graph = nullptr;
246 class CloneNode final : public luci::CircleNodeVisitor<luci::CircleNode *>
249 CloneNode(loco::Graph *graph) : _graph(graph){};
253 luci::CircleNode *visit(const luci::CircleBCQFullyConnected *) final;
254 luci::CircleNode *visit(const luci::CircleBCQGather *) final;
255 luci::CircleNode *visit(const luci::CircleInstanceNorm *) final;
257 // NOTE CircleInput and CircleOutput are not handled here as these need
258 // link with graph I/O
261 luci::CircleNode *visit(const luci::CircleCustomOut *) final;
262 luci::CircleNode *visit(const luci::CircleIfOut *) final;
263 // luci::CircleNode *visit(const luci::CircleInput *) final;
264 luci::CircleNode *visit(const luci::CircleNonMaxSuppressionV4Out *) final;
265 luci::CircleNode *visit(const luci::CircleNonMaxSuppressionV5Out *) final;
266 // luci::CircleNode *visit(const luci::CircleOutput *) final;
267 luci::CircleNode *visit(const luci::CircleOutputDummy *) final;
268 luci::CircleNode *visit(const luci::CircleOutputExclude *) final;
269 luci::CircleNode *visit(const luci::CircleSplitOut *) final;
270 luci::CircleNode *visit(const luci::CircleSplitVOut *) final;
271 luci::CircleNode *visit(const luci::CircleTopKV2Out *) final;
272 luci::CircleNode *visit(const luci::CircleUniqueOut *) final;
273 luci::CircleNode *visit(const luci::CircleUnpackOut *) final;
274 luci::CircleNode *visit(const luci::CircleVariable *) final;
275 luci::CircleNode *visit(const luci::CircleWhileOut *) final;
277 // Handle in CircleNode
278 luci::CircleNode *visit(const luci::CircleNode *) final;
280 // NOTE CircleNodeVisitor will throw if not supported here
283 loco::Graph *_graph = nullptr;
288 #endif // __CIRCLE_CLONE_NODE_H__