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 circle_node = loco::must_cast<const luci::CircleNode *>(node);
65 if (const auto builder = create_builder(circle_node))
67 if (!builder->validate(circle_node))
69 s.state(locop::NodeDesc::State::Invalid);
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)));
78 builder->build_attributes(circle_node, s);
79 builder->update_status(s);
81 s.opname(circle_opname(circle_node->opcode()));
82 s.comments().append("[" + circle_node->name() + "] = " + ptr_to_str(node));
88 // When SummaryBuilder is not implemented, return false
93 bool CircleNodeSummaryBuilder::validate(const luci::CircleNode *) { return true; }
95 std::vector<std::string> CircleNodeSummaryBuilder::get_input_names(const luci::CircleNode *)
97 // Return empty names for default
98 return std::vector<std::string>();
101 void CircleNodeSummaryBuilder::build_attributes(const luci::CircleNode *, locop::NodeSummary &)
103 // Do nothing for default
106 void CircleNodeSummaryBuilder::update_status(locop::NodeSummary &s)
108 s.state(locop::NodeDesc::State::Complete);
111 std::unique_ptr<CircleNodeSummaryBuilder>
112 CircleNodeSummaryBuilder::create_builder(const luci::CircleNode *node)
114 switch (node->opcode())
116 #define CIRCLE_NODE(OPCODE, CLASS) \
117 case luci::CircleOpcode::OPCODE: \
119 return std::make_unique<CLASS>(); \
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)
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)