2 * Copyright (c) 2022 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 #include "CircleNodeSummaryBuilder.h"
18 #include "CircleNodeSummaryBuilders.h"
20 #include <luci/IR/CircleDialect.h>
27 std::string circle_opname(luci::CircleOpcode opcode)
29 static const std::string prefix{"circle."};
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>
44 return prefix + "Invalid";
52 bool CircleNodeSummaryBuilder::build(const loco::Node *node, const locop::SymbolTable *tbl,
53 locop::NodeSummary &s)
55 if (node->dialect() != luci::CircleDialect::get())
58 auto ptr_to_str = [](const void *ptr) {
64 auto shape_to_str = [](const luci::CircleNode *node) {
67 for (uint32_t i = 0; i < node->rank(); ++i)
71 ss << (node->dim(i).known() ? node->dim(i).value() : -1);
77 auto circle_node = loco::must_cast<const luci::CircleNode *>(node);
78 if (const auto builder = create_builder(circle_node))
80 if (!builder->validate(circle_node))
82 s.state(locop::NodeDesc::State::Invalid);
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)));
91 builder->build_attributes(circle_node, s);
92 builder->update_status(s);
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));
102 // When SummaryBuilder is not implemented, return false
107 bool CircleNodeSummaryBuilder::validate(const luci::CircleNode *) { return true; }
109 std::vector<std::string> CircleNodeSummaryBuilder::get_input_names(const luci::CircleNode *)
111 // Return empty names for default
112 return std::vector<std::string>();
115 void CircleNodeSummaryBuilder::build_attributes(const luci::CircleNode *, locop::NodeSummary &)
117 // Do nothing for default
120 void CircleNodeSummaryBuilder::update_status(locop::NodeSummary &s)
122 s.state(locop::NodeDesc::State::Complete);
125 std::unique_ptr<CircleNodeSummaryBuilder>
126 CircleNodeSummaryBuilder::create_builder(const luci::CircleNode *node)
128 switch (node->opcode())
130 #define CIRCLE_NODE(OPCODE, CLASS) \
131 case luci::CircleOpcode::OPCODE: \
133 return std::make_unique<CLASS>(); \
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)
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)