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