Imported Upstream version 1.21.0
[platform/core/ml/nnfw.git] / compiler / luci / logex / src / CircleNodeSummaryBuilder.cpp
1 /*
2  * Copyright (c) 2022 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 #include "CircleNodeSummaryBuilder.h"
18 #include "CircleNodeSummaryBuilders.h"
19
20 #include <luci/IR/CircleDialect.h>
21
22 #include <memory>
23
24 namespace
25 {
26
27 std::string circle_opname(luci::CircleOpcode opcode)
28 {
29   static const std::string prefix{"circle."};
30
31   switch (opcode)
32   {
33 #define CIRCLE_NODE(OPCODE, CLASS) \
34   case luci::CircleOpcode::OPCODE: \
35     return prefix + #OPCODE;
36 #define CIRCLE_VNODE CIRCLE_NODE
37 #include <luci/IR/CircleNodes.lst>
38 #undef CIRCLE_VNODE
39 #undef CIRCLE_NODE
40     default:
41       break;
42   };
43
44   return prefix + "Invalid";
45 }
46
47 } // namespace
48
49 namespace luci
50 {
51
52 bool CircleNodeSummaryBuilder::build(const loco::Node *node, const locop::SymbolTable *tbl,
53                                      locop::NodeSummary &s)
54 {
55   if (node->dialect() != luci::CircleDialect::get())
56     return false;
57
58   auto ptr_to_str = [](const void *ptr) {
59     std::stringstream ss;
60     ss << ptr;
61     return ss.str();
62   };
63
64   auto circle_node = loco::must_cast<const luci::CircleNode *>(node);
65   if (const auto builder = create_builder(circle_node))
66   {
67     if (!builder->validate(circle_node))
68     {
69       s.state(locop::NodeDesc::State::Invalid);
70       return false;
71     }
72
73     auto input_names = builder->get_input_names(circle_node);
74     assert(node->arity() == input_names.size());
75     for (uint32_t i = 0; i < node->arity(); ++i)
76       s.args().append(input_names.at(i), tbl->lookup(node->arg(i)));
77
78     builder->build_attributes(circle_node, s);
79     builder->update_status(s);
80
81     s.opname(circle_opname(circle_node->opcode()));
82     s.comments().append("[" + circle_node->name() + "] = " + ptr_to_str(node));
83
84     return true;
85   }
86   else
87   {
88     // When SummaryBuilder is not implemented, return false
89     return false;
90   }
91 }
92
93 bool CircleNodeSummaryBuilder::validate(const luci::CircleNode *) { return true; }
94
95 std::vector<std::string> CircleNodeSummaryBuilder::get_input_names(const luci::CircleNode *)
96 {
97   // Return empty names for default
98   return std::vector<std::string>();
99 }
100
101 void CircleNodeSummaryBuilder::build_attributes(const luci::CircleNode *, locop::NodeSummary &)
102 {
103   // Do nothing for default
104 }
105
106 void CircleNodeSummaryBuilder::update_status(locop::NodeSummary &s)
107 {
108   s.state(locop::NodeDesc::State::Complete);
109 }
110
111 std::unique_ptr<CircleNodeSummaryBuilder>
112 CircleNodeSummaryBuilder::create_builder(const luci::CircleNode *node)
113 {
114   switch (node->opcode())
115   {
116 #define CIRCLE_NODE(OPCODE, CLASS)    \
117   case luci::CircleOpcode::OPCODE:    \
118   {                                   \
119     return std::make_unique<CLASS>(); \
120   }
121
122     CIRCLE_NODE(ABS, CircleAbsSummaryBuilder)
123     CIRCLE_NODE(ADD, CircleAddSummaryBuilder)
124     CIRCLE_NODE(ADD_N, CircleAddNSummaryBuilder)
125     CIRCLE_NODE(ARG_MAX, CircleArgMaxSummaryBuilder)
126     CIRCLE_NODE(ARG_MIN, CircleArgMinSummaryBuilder)
127     CIRCLE_NODE(AVERAGE_POOL_2D, CircleAveragePool2DSummaryBuilder)
128     CIRCLE_NODE(BATCH_MATMUL, CircleBatchMatMulSummaryBuilder)
129     CIRCLE_NODE(BATCH_TO_SPACE_ND, CircleBatchToSpaceNDSummaryBuilder)
130     CIRCLE_NODE(BCQ_FULLY_CONNECTED, CircleBCQFullyConnectedSummaryBuilder)
131     CIRCLE_NODE(BCQ_GATHER, CircleBCQGatherSummaryBuilder)
132     CIRCLE_NODE(BIDIRECTIONAL_SEQUENCE_LSTM, CircleBidirectionalSequenceLSTMSummaryBuilder)
133     CIRCLE_NODE(CAST, CircleCastSummaryBuilder)
134     CIRCLE_NODE(CEIL, CircleCeilSummaryBuilder)
135     CIRCLE_NODE(CONCATENATION, CircleConcatenationSummaryBuilder)
136     CIRCLE_NODE(CIRCLECONST, CircleConstSummaryBuilder)
137     CIRCLE_NODE(CONV_2D, CircleConv2DSummaryBuilder)
138     CIRCLE_NODE(COS, CircleCosSummaryBuilder)
139     CIRCLE_NODE(CUSTOM, CircleCustomSummaryBuilder)
140     CIRCLE_NODE(DENSIFY, CircleDensifySummaryBuilder)
141     CIRCLE_NODE(DEPTH_TO_SPACE, CircleDepthToSpaceSummaryBuilder)
142     CIRCLE_NODE(DEPTHWISE_CONV_2D, CircleDepthwiseConv2DSummaryBuilder)
143     CIRCLE_NODE(DEQUANTIZE, CircleDequantizeSummaryBuilder)
144     CIRCLE_NODE(DIV, CircleDivSummaryBuilder)
145     CIRCLE_NODE(ELU, CircleEluSummaryBuilder)
146     CIRCLE_NODE(EQUAL, CircleEqualSummaryBuilder)
147     CIRCLE_NODE(EXP, CircleExpSummaryBuilder)
148     CIRCLE_NODE(EXPAND_DIMS, CircleExpandDimsSummaryBuilder)
149     CIRCLE_NODE(FAKE_QUANT, CircleFakeQuantSummaryBuilder)
150     CIRCLE_NODE(FILL, CircleFillSummaryBuilder)
151     CIRCLE_NODE(FLOOR, CircleFloorSummaryBuilder)
152     CIRCLE_NODE(FLOOR_DIV, CircleFloorDivSummaryBuilder)
153     CIRCLE_NODE(FLOOR_MOD, CircleFloorModSummaryBuilder)
154     CIRCLE_NODE(FULLY_CONNECTED, CircleFullyConnectedSummaryBuilder)
155     CIRCLE_NODE(GATHER, CircleGatherSummaryBuilder)
156     CIRCLE_NODE(GATHER_ND, CircleGatherNdSummaryBuilder)
157     CIRCLE_NODE(GREATER, CircleGreaterSummaryBuilder)
158     CIRCLE_NODE(GREATER_EQUAL, CircleGreaterEqualSummaryBuilder)
159     CIRCLE_NODE(IF, CircleIfSummaryBuilder)
160     CIRCLE_NODE(INSTANCE_NORM, CircleInstanceNormSummaryBuilder)
161     CIRCLE_NODE(L2_NORMALIZATION, CircleL2NormalizeSummaryBuilder)
162     CIRCLE_NODE(L2_POOL_2D, CircleL2Pool2DSummaryBuilder)
163     CIRCLE_NODE(LEAKY_RELU, CircleLeakyReluSummaryBuilder)
164     CIRCLE_NODE(LESS, CircleLessSummaryBuilder)
165     CIRCLE_NODE(LESS_EQUAL, CircleLessEqualSummaryBuilder)
166     CIRCLE_NODE(LOCAL_RESPONSE_NORMALIZATION, CircleLocalResponseNormalizationSummaryBuilder)
167     CIRCLE_NODE(LOG, CircleLogSummaryBuilder)
168     CIRCLE_NODE(LOGICAL_AND, CircleLogicalAndSummaryBuilder)
169     CIRCLE_NODE(LOGICAL_NOT, CircleLogicalNotSummaryBuilder)
170     CIRCLE_NODE(LOGICAL_OR, CircleLogicalOrSummaryBuilder)
171     CIRCLE_NODE(LOGISTIC, CircleLogisticSummaryBuilder)
172     CIRCLE_NODE(LOG_SOFTMAX, CircleLogSoftmaxSummaryBuilder)
173     CIRCLE_NODE(MATRIX_DIAG, CircleMatrixDiagSummaryBuilder)
174     CIRCLE_NODE(MATRIX_SET_DIAG, CircleMatrixSetDiagSummaryBuilder)
175     CIRCLE_NODE(MAXIMUM, CircleMaximumSummaryBuilder)
176     CIRCLE_NODE(MAX_POOL_2D, CircleMaxPool2DSummaryBuilder)
177     CIRCLE_NODE(MEAN, CircleMeanSummaryBuilder)
178     CIRCLE_NODE(MINIMUM, CircleMinimumSummaryBuilder)
179     CIRCLE_NODE(MIRROR_PAD, CircleMirrorPadSummaryBuilder)
180     CIRCLE_NODE(MUL, CircleMulSummaryBuilder)
181     CIRCLE_NODE(NEG, CircleNegSummaryBuilder)
182     CIRCLE_NODE(NON_MAX_SUPPRESSION_V4, CircleNonMaxSuppressionV4SummaryBuilder)
183     CIRCLE_NODE(NON_MAX_SUPPRESSION_V5, CircleNonMaxSuppressionV5SummaryBuilder)
184     CIRCLE_NODE(NOT_EQUAL, CircleNotEqualSummaryBuilder)
185     CIRCLE_NODE(ONE_HOT, CircleOneHotSummaryBuilder)
186     CIRCLE_NODE(PACK, CirclePackSummaryBuilder)
187     CIRCLE_NODE(PAD, CirclePadSummaryBuilder)
188     CIRCLE_NODE(PADV2, CirclePadV2SummaryBuilder)
189     CIRCLE_NODE(POW, CirclePowSummaryBuilder)
190     CIRCLE_NODE(PRELU, CirclePReluSummaryBuilder)
191     CIRCLE_NODE(QUANTIZE, CircleQuantizeSummaryBuilder)
192     CIRCLE_NODE(RANGE, CircleRangeSummaryBuilder)
193     CIRCLE_NODE(RANK, CircleRankSummaryBuilder)
194     CIRCLE_NODE(REDUCE_ANY, CircleReduceAnySummaryBuilder)
195     CIRCLE_NODE(REDUCE_MAX, CircleReduceMaxSummaryBuilder)
196     CIRCLE_NODE(REDUCE_MIN, CircleReduceMinSummaryBuilder)
197     CIRCLE_NODE(REDUCE_PROD, CircleReduceProdSummaryBuilder)
198     CIRCLE_NODE(RELU, CircleReluSummaryBuilder)
199     CIRCLE_NODE(RELU6, CircleRelu6SummaryBuilder)
200     CIRCLE_NODE(RELU_N1_TO_1, CircleReluN1To1SummaryBuilder)
201     CIRCLE_NODE(RESHAPE, CircleReshapeSummaryBuilder)
202     CIRCLE_NODE(RESIZE_BILINEAR, CircleResizeBilinearSummaryBuilder)
203     CIRCLE_NODE(RESIZE_NEAREST_NEIGHBOR, CircleResizeNearestNeighborSummaryBuilder)
204     CIRCLE_NODE(REVERSE_SEQUENCE, CircleReverseSequenceSummaryBuilder)
205     CIRCLE_NODE(REVERSE_V2, CircleReverseV2SummaryBuilder)
206     CIRCLE_NODE(ROUND, CircleRoundSummaryBuilder)
207     CIRCLE_NODE(RSQRT, CircleRsqrtSummaryBuilder)
208     CIRCLE_NODE(SCATTER_ND, CircleScatterNdSummaryBuilder)
209     CIRCLE_NODE(SEGMENT_SUM, CircleSegmentSumSummaryBuilder)
210     CIRCLE_NODE(SELECT, CircleSelectSummaryBuilder)
211     CIRCLE_NODE(SELECT_V2, CircleSelectV2SummaryBuilder)
212     CIRCLE_NODE(SHAPE, CircleShapeSummaryBuilder)
213     CIRCLE_NODE(SIN, CircleSinSummaryBuilder)
214     CIRCLE_NODE(SLICE, CircleSliceSummaryBuilder)
215     CIRCLE_NODE(SOFTMAX, CircleSoftmaxSummaryBuilder)
216     CIRCLE_NODE(SPACE_TO_BATCH_ND, CircleSpaceToBatchNDSummaryBuilder)
217     CIRCLE_NODE(SPACE_TO_DEPTH, CircleSpaceToDepthSummaryBuilder)
218     CIRCLE_NODE(SPARSE_TO_DENSE, CircleSparseToDenseSummaryBuilder)
219     CIRCLE_NODE(SPLIT, CircleSplitSummaryBuilder)
220     CIRCLE_NODE(SPLIT_V, CircleSplitVSummaryBuilder)
221     CIRCLE_NODE(SQRT, CircleSqrtSummaryBuilder)
222     CIRCLE_NODE(SQUARE, CircleSquareSummaryBuilder)
223     CIRCLE_NODE(SQUARED_DIFFERENCE, CircleSquaredDifferenceSummaryBuilder)
224     CIRCLE_NODE(SQUEEZE, CircleSqueezeSummaryBuilder)
225     CIRCLE_NODE(STRIDED_SLICE, CircleStridedSliceSummaryBuilder)
226     CIRCLE_NODE(SUB, CircleSubSummaryBuilder)
227     CIRCLE_NODE(SUM, CircleSumSummaryBuilder)
228     CIRCLE_NODE(SVDF, CircleSVDFSummaryBuilder)
229     CIRCLE_NODE(TANH, CircleTanhSummaryBuilder)
230     CIRCLE_NODE(TILE, CircleTileSummaryBuilder)
231     CIRCLE_NODE(TOPK_V2, CircleTopKV2SummaryBuilder)
232     CIRCLE_NODE(TRANSPOSE, CircleTransposeSummaryBuilder)
233     CIRCLE_NODE(TRANSPOSE_CONV, CircleTransposeConvSummaryBuilder)
234     CIRCLE_NODE(UNIDIRECTIONAL_SEQUENCE_LSTM, CircleUnidirectionalSequenceLSTMSummaryBuilder)
235     CIRCLE_NODE(UNIQUE, CircleUniqueSummaryBuilder)
236     CIRCLE_NODE(UNPACK, CircleUnpackSummaryBuilder)
237     CIRCLE_NODE(WHERE, CircleWhereSummaryBuilder)
238     CIRCLE_NODE(WHILE, CircleWhileSummaryBuilder)
239     CIRCLE_NODE(ZEROS_LIKE, CircleZerosLikeSummaryBuilder)
240
241     CIRCLE_NODE(CIRCLEBIDIRECTIONAL_SEQUENCE_LSTM_OUT,
242                 CircleBidirectionalSequenceLSTMOutSummaryBuilder)
243     CIRCLE_NODE(CIRCLECUSTOMOUT, CircleCustomOutSummaryBuilder)
244     CIRCLE_NODE(CIRCLEIFOUT, CircleIfOutSummaryBuilder)
245     CIRCLE_NODE(CIRCLEINPUT, CircleInputSummaryBuilder)
246     CIRCLE_NODE(CIRCLENONMAXSUPPRESSIONV4OUT, CircleNonMaxSuppressionV4OutSummaryBuilder)
247     CIRCLE_NODE(CIRCLENONMAXSUPPRESSIONV5OUT, CircleNonMaxSuppressionV5OutSummaryBuilder)
248     CIRCLE_NODE(CIRCLEOUTPUT, CircleOutputSummaryBuilder)
249     CIRCLE_NODE(CIRCLEOUTPUTDUMMY, CircleOutputDummySummaryBuilder)
250     CIRCLE_NODE(CIRCLEOUTPUTEXCLUDE, CircleOutputExcludeSummaryBuilder)
251     CIRCLE_NODE(CIRCLESPLITOUT, CircleSplitOutSummaryBuilder)
252     CIRCLE_NODE(CIRCLESPLITVOUT, CircleSplitVOutSummaryBuilder)
253     CIRCLE_NODE(CIRCLETOPKV2OUT, CircleTopKV2OutSummaryBuilder)
254     CIRCLE_NODE(CIRCLEUNIQUEOUT, CircleUniqueOutSummaryBuilder)
255     CIRCLE_NODE(CIRCLEUNPACKOUT, CircleUnpackOutSummaryBuilder)
256     CIRCLE_NODE(CIRCLEVARIABLE, CircleVariableSummaryBuilder)
257     CIRCLE_NODE(CIRCLEWHILEOUT, CircleWhileOutSummaryBuilder)
258
259     default:
260       return nullptr;
261
262 #undef CIRCLE_NODE
263   }
264 }
265
266 } // namespace luci