2 * Copyright (c) 2020 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.
22 namespace circletensordump
25 bool is_valid(const circle::OperatorCode *opcode)
27 circle::BuiltinOperator code = opcode->builtin_code();
28 return (circle::BuiltinOperator_MIN <= code && code <= circle::BuiltinOperator_MAX);
31 bool is_custom(const circle::OperatorCode *opcode)
33 circle::BuiltinOperator code = opcode->builtin_code();
34 return (code == circle::BuiltinOperator_CUSTOM);
37 std::string opcode_name(const circle::OperatorCode *opcode)
41 if (!is_valid(opcode))
43 std::ostringstream oss;
48 if (is_custom(opcode))
50 if (!opcode->custom_code())
51 return "(invalid custom)";
53 std::string custom_op = "CUSTOM(";
54 custom_op += opcode->custom_code()->c_str();
59 circle::BuiltinOperator code = opcode->builtin_code();
60 return circle::EnumNameBuiltinOperator(code);
63 const char *tensor_type(const circle::Tensor *tensor)
65 return circle::EnumNameTensorType(tensor->type());
68 const char *tensor_name(const circle::Tensor *tensor)
70 static const char *kEmptyTensorName = "(noname)";
72 auto name = tensor->name();
76 return kEmptyTensorName;
79 Reader::Reader(const circle::Model *model)
81 _subgraphs = model->subgraphs();
82 _buffers = model->buffers();
84 auto opcodes = model->operator_codes();
85 for (const ::circle::OperatorCode *opcode : *opcodes)
87 _op_codes.push_back(opcode);
91 size_t Reader::buffer_info(uint32_t buf_idx, const uint8_t **buff_data)
93 if (buff_data != nullptr)
101 if (auto *buffer = (*_buffers)[buf_idx])
103 if (auto *array = buffer->data())
105 if (size_t size = array->size())
107 if (buff_data != nullptr)
109 *buff_data = reinterpret_cast<const uint8_t *>(array->data());
119 circle::BuiltinOperator Reader::builtin_code(const circle::Operator *op) const
121 uint32_t index = op->opcode_index();
122 assert(index < _op_codes.size());
123 const circle::OperatorCode *opcode = _op_codes.at(index);
125 return opcode->builtin_code();
128 std::string Reader::opcode_name(const circle::Operator *op) const
130 uint32_t index = op->opcode_index();
131 assert(index < _op_codes.size());
132 const circle::OperatorCode *opcode = _op_codes.at(index);
134 if (!is_valid(opcode))
136 std::ostringstream oss;
137 oss << "(invalid: " << index << ")";
141 return circletensordump::opcode_name(opcode);
144 bool Reader::select_subgraph(uint32_t sgindex)
147 _operators = nullptr;
152 if (_subgraphs->Length() <= sgindex)
158 const circle::SubGraph *subgraph = (*_subgraphs)[sgindex];
160 _tensors = subgraph->tensors();
161 _operators = subgraph->operators();
163 _inputs = as_index_vector(subgraph->inputs());
164 _outputs = as_index_vector(subgraph->outputs());
169 } // namespace circletensordump