* limitations under the License.
*/
+#include <cassert>
#include <iostream>
#include <memory>
{
template <>
-Offset<MetaDataBufferLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec)
+void Offset<MetaDataBufferLink>::build(FlatBufBuilder &fb,
+ const TFLFlatBufVec *tflite_flatbuffer_vec)
{
if (tflite_flatbuffer_vec == nullptr)
return;
}
template <>
-Offset<BufferLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec)
+void Offset<BufferLink>::build(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec)
{
std::vector<flatbuffers::Offset<circle::Buffer>> buffers_vec;
}
template <>
-Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec)
+void Offset<SubGraphLink>::build(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec)
{
std::vector<flatbuffers::Offset<circle::SubGraph>> subgprahs_vec;
_circle_flatbuffer_vec_offset = fb->CreateVector(subgprahs_vec);
}
+tflite::BuiltinOperator builtin_code_neutral(const tflite::OperatorCode *opcode)
+{
+ assert(opcode != nullptr);
+ int8_t dp_code = opcode->deprecated_builtin_code();
+ // 127 is max of int8_t which is upper bound of v3 builtin_code
+ // NOTE TensorFlow uses 'BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES' for 127
+ if (dp_code < 127 && dp_code >= 0)
+ return tflite::BuiltinOperator(dp_code);
+ return opcode->builtin_code();
+}
+
template <>
-Offset<OperatorCodeLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec)
+void Offset<OperatorCodeLink>::build(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec)
{
std::vector<flatbuffers::Offset<circle::OperatorCode>> operator_code_vec;
{
auto custom_code = fb->CreateString(it->custom_code());
circle::OperatorCodeBuilder operator_code_builder{*fb};
- operator_code_builder.add_builtin_code(get_circle_builtin_code(it->builtin_code()));
+ // TODO support circle deprecated_builtin_code
+ auto bt_code = builtin_code_neutral(it);
+ operator_code_builder.add_builtin_code(get_circle_builtin_code(bt_code));
operator_code_builder.add_custom_code(custom_code);
operator_code_builder.add_version(it->version());
auto code = operator_code_builder.Finish();
_circle_flatbuffer_vec_offset = fb->CreateVector(operator_code_vec);
}
-CircleModel::CircleModel(FlatBufBuilder &fb, TFLModel &model)
- : _version{0}, _description{fb->CreateString("nnpackage")}, _fb{fb}
+CircleModel::CircleModel(FlatBufBuilder &fb, const tflite::Model *tfl_model)
+ : _version{0}, _description{fb->CreateString("ONE-tflite2circle")}, _fb{fb}
{
- const tflite::Model *tfl_model = model.load_model();
- // verify flatbuffers
- flatbuffers::Verifier verifier{reinterpret_cast<const uint8_t *>(model._data.data()),
- model._data.size()};
- if (!tflite::VerifyModelBuffer(verifier))
- {
- throw std::runtime_error("Failed to verify tflite");
- }
+ _operator_codes_offset = std::make_unique<Offset<OperatorCodeLink>>(fb);
+ _subGraphs_offset = std::make_unique<Offset<SubGraphLink>>(fb);
+ _buffers_offset = std::make_unique<Offset<BufferLink>>(fb);
+ _metadata_buffer_offset = std::make_unique<Offset<MetaDataBufferLink>>(fb);
+
+ _operator_codes_offset->build(fb, tfl_model->operator_codes());
+ _subGraphs_offset->build(fb, tfl_model->subgraphs());
+ _buffers_offset->build(fb, tfl_model->buffers());
+ _metadata_buffer_offset->build(fb, tfl_model->metadata_buffer());
- _operator_codes_offset =
- std::make_unique<Offset<OperatorCodeLink>>(fb, tfl_model->operator_codes());
- _subGraphs_offset = std::make_unique<Offset<SubGraphLink>>(fb, tfl_model->subgraphs());
- _buffers_offset = std::make_unique<Offset<BufferLink>>(fb, tfl_model->buffers());
- _metadata_buffer_offset =
- std::make_unique<Offset<MetaDataBufferLink>>(fb, tfl_model->metadata_buffer());
model_build();
}