diff options
Diffstat (limited to 'compiler/tflite2circle')
42 files changed, 796 insertions, 176 deletions
diff --git a/compiler/tflite2circle/CMakeLists.txt b/compiler/tflite2circle/CMakeLists.txt index b1d1f6149..73639f390 100644 --- a/compiler/tflite2circle/CMakeLists.txt +++ b/compiler/tflite2circle/CMakeLists.txt @@ -1,8 +1,8 @@ nnas_include(TargetRequire) unset(REQUIRED_TARGETS) -list(APPEND REQUIRED_TARGETS mio_tflite) -list(APPEND REQUIRED_TARGETS mio_circle) +list(APPEND REQUIRED_TARGETS mio_tflite2121) +list(APPEND REQUIRED_TARGETS mio_circle06) TargetRequire_Return(${REQUIRED_TARGETS}) set(DRIVER "driver/Driver.cpp") @@ -11,9 +11,12 @@ add_executable(tflite2circle ${DRIVER} ${SOURCES}) target_include_directories(tflite2circle PRIVATE include) target_include_directories(tflite2circle PRIVATE src) target_link_libraries(tflite2circle arser) +target_link_libraries(tflite2circle foder) target_link_libraries(tflite2circle safemain) -target_link_libraries(tflite2circle mio_tflite) -target_link_libraries(tflite2circle mio_circle) +target_link_libraries(tflite2circle mio_tflite2121) +target_link_libraries(tflite2circle mio_tflite2121_helper) +target_link_libraries(tflite2circle mio_circle06) target_link_libraries(tflite2circle vconone) +target_link_libraries(tflite2circle nncc_coverage) install(TARGETS tflite2circle DESTINATION bin) diff --git a/compiler/tflite2circle/driver/Driver.cpp b/compiler/tflite2circle/driver/Driver.cpp index 2f11e0a13..6afe1b0f2 100644 --- a/compiler/tflite2circle/driver/Driver.cpp +++ b/compiler/tflite2circle/driver/Driver.cpp @@ -36,18 +36,11 @@ int entry(int argc, char **argv) { arser::Arser arser{"tflite2circle is a Tensorflow lite to circle model converter"}; - arser.add_argument("--version") - .nargs(0) - .required(false) - .default_value(false) - .help("Show version information and exit") - .exit_with(print_version); - - arser.add_argument("tflite") - .nargs(1) - .type(arser::DataType::STR) - .help("Source tflite file path to convert"); - arser.add_argument("circle").nargs(1).type(arser::DataType::STR).help("Target circle file path"); + arser::Helper::add_version(arser, print_version); + arser::Helper::add_verbose(arser); + + arser.add_argument("tflite").help("Source tflite file path to convert"); + arser.add_argument("circle").help("Target circle file path"); try { @@ -55,7 +48,7 @@ int entry(int argc, char **argv) } catch (const std::runtime_error &err) { - std::cout << err.what() << std::endl; + std::cerr << err.what() << std::endl; std::cout << arser; return 255; } @@ -64,9 +57,9 @@ int entry(int argc, char **argv) std::string circle_path = arser.get<std::string>("circle"); // read tflite file tflite2circle::TFLModel tfl_model(tfl_path); - if (!tfl_model.is_valid()) + if (not tfl_model.verify_data()) { - std::cerr << "ERROR: Failed to load tflite '" << tfl_path << "'" << std::endl; + std::cerr << "ERROR: Failed to verify tflite '" << tfl_path << "'" << std::endl; return 255; } @@ -74,7 +67,10 @@ int entry(int argc, char **argv) auto flatbuffer_builder = std::make_unique<flatbuffers::FlatBufferBuilder>(1024); // convert tflite to circle - tflite2circle::CircleModel circle_model{flatbuffer_builder, tfl_model}; + tflite2circle::CircleModel circle_model{flatbuffer_builder}; + + circle_model.load_offsets(tfl_model.get_model()); + circle_model.model_build(); std::ofstream outfile{circle_path, std::ios::binary}; diff --git a/compiler/tflite2circle/include/CircleModel.h b/compiler/tflite2circle/include/CircleModel.h index e1e35d8ff..189cfaff2 100644 --- a/compiler/tflite2circle/include/CircleModel.h +++ b/compiler/tflite2circle/include/CircleModel.h @@ -60,16 +60,26 @@ template <typename T> class Offset private: using TFLFlatBufVec = flatbuffers::Vector<typename T::TFL>; using CIRFlatBufVecOffset = flatbuffers::Offset<flatbuffers::Vector<typename T::CIR>>; + using SignatureDefs = flatbuffers::Vector<flatbuffers::Offset<::tflite::SignatureDef>>; public: Offset(void) = delete; - Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec); + Offset(FlatBufBuilder &fb) : _fb{fb} {}; + +public: + void set_signature_defs(const SignatureDefs *offset) { _tfl_signature_def_offsets = offset; } + +public: + void build(const TFLFlatBufVec *tflite_flatbuffer_vec); public: CIRFlatBufVecOffset offset(void) const { return _circle_flatbuffer_vec_offset; } private: + FlatBufBuilder &_fb; CIRFlatBufVecOffset _circle_flatbuffer_vec_offset; + // TODO revise this when Circle supports SignatureDef + const SignatureDefs *_tfl_signature_def_offsets = nullptr; }; class CircleModel @@ -79,9 +89,10 @@ private: public: CircleModel(void) = delete; - CircleModel(FlatBufBuilder &fb, TFLModel &tfl_model); + CircleModel(FlatBufBuilder &fb); public: + void load_offsets(const tflite::Model *tfl_model); void model_build(void) const; const char *base(void) const; size_t size(void) const; diff --git a/compiler/tflite2circle/include/TFLModel.h b/compiler/tflite2circle/include/TFLModel.h index e53d62749..507667bb9 100644 --- a/compiler/tflite2circle/include/TFLModel.h +++ b/compiler/tflite2circle/include/TFLModel.h @@ -37,15 +37,14 @@ public: TFLModel(const std::string &path); public: - bool is_valid(void) { return _valid; } + const tflite::Model *get_model(void); -private: - const tflite::Model *load_model(void); +public: + bool verify_data(void); private: std::ifstream _infile; DataBuffer _data; - bool _valid; friend class CircleModel; }; diff --git a/compiler/tflite2circle/requires.cmake b/compiler/tflite2circle/requires.cmake index 837c287b6..c5528c28a 100644 --- a/compiler/tflite2circle/requires.cmake +++ b/compiler/tflite2circle/requires.cmake @@ -1,5 +1,6 @@ require("arser") -require("mio-tflite") -require("mio-circle") +require("foder") +require("mio-tflite2121") +require("mio-circle06") require("safemain") require("vconone") diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions.h index 680118618..5ed88ce02 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions.h +++ b/compiler/tflite2circle/src/BuildBuiltinOptions.h @@ -26,22 +26,27 @@ #include "BuildBuiltinOptions/ArgMinOptions.h" #include "BuildBuiltinOptions/BatchMatMulOptions.h" #include "BuildBuiltinOptions/BatchToSpaceNDOptions.h" +#include "BuildBuiltinOptions/BidirectionalSequenceLSTMOptions.h" #include "BuildBuiltinOptions/CastOptions.h" #include "BuildBuiltinOptions/ConcatenationOptions.h" #include "BuildBuiltinOptions/Conv2DOptions.h" #include "BuildBuiltinOptions/CosOptions.h" +#include "BuildBuiltinOptions/DensifyOptions.h" #include "BuildBuiltinOptions/DepthToSpaceOptions.h" #include "BuildBuiltinOptions/DepthwiseConv2DOptions.h" +#include "BuildBuiltinOptions/DequantizeOptions.h" #include "BuildBuiltinOptions/DivOptions.h" #include "BuildBuiltinOptions/EqualOptions.h" #include "BuildBuiltinOptions/ExpandDimsOptions.h" #include "BuildBuiltinOptions/ExpOptions.h" +#include "BuildBuiltinOptions/FakeQuantOptions.h" #include "BuildBuiltinOptions/FillOptions.h" #include "BuildBuiltinOptions/FloorDivOptions.h" #include "BuildBuiltinOptions/FloorModOptions.h" #include "BuildBuiltinOptions/FullyConnectedOptions.h" #include "BuildBuiltinOptions/GatherOptions.h" #include "BuildBuiltinOptions/GatherNdOptions.h" +#include "BuildBuiltinOptions/GeluOptions.h" #include "BuildBuiltinOptions/GreaterOptions.h" #include "BuildBuiltinOptions/GreaterEqualOptions.h" #include "BuildBuiltinOptions/IfOptions.h" @@ -100,10 +105,12 @@ #include "BuildBuiltinOptions/SqueezeOptions.h" #include "BuildBuiltinOptions/StridedSliceOptions.h" #include "BuildBuiltinOptions/SubOptions.h" +#include "BuildBuiltinOptions/SVDFOptions.h" #include "BuildBuiltinOptions/TileOptions.h" #include "BuildBuiltinOptions/TopKV2Options.h" #include "BuildBuiltinOptions/TransposeOptions.h" #include "BuildBuiltinOptions/TransposeConvOptions.h" +#include "BuildBuiltinOptions/UnidirectionalSequenceLSTMOptions.h" #include "BuildBuiltinOptions/UniqueOptions.h" #include "BuildBuiltinOptions/UnpackOptions.h" #include "BuildBuiltinOptions/WhereOptions.h" diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/AddOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/AddOptions.cpp index f93a0f21f..5bdb1020a 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/AddOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/AddOptions.cpp @@ -29,7 +29,7 @@ flatbuffers::Offset<circle::AddOptions> build_circle_AddOptions(flatbuffers::Fla assert(tflite_builtin_options); circle::AddOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMaxOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMaxOptions.cpp index 0ccdde4cb..ac0044a8f 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMaxOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMaxOptions.cpp @@ -29,7 +29,7 @@ build_circle_ArgMaxOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Ope assert(tflite_builtin_options); circle::ArgMaxOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_output_type( - get_circle_tensortype(tflite_builtin_options->output_type())); + get_circle_tensortype(tflite_builtin_options->output_type())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.cpp index 204558df8..3011c8b65 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.cpp @@ -29,7 +29,7 @@ build_circle_ArgMinOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Ope assert(tflite_builtin_options); circle::ArgMinOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_output_type( - get_circle_tensortype(tflite_builtin_options->output_type())); + get_circle_tensortype(tflite_builtin_options->output_type())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/BidirectionalSequenceLSTMOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/BidirectionalSequenceLSTMOptions.cpp new file mode 100644 index 000000000..2a6cf171b --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/BidirectionalSequenceLSTMOptions.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BidirectionalSequenceLSTMOptions.h" +#include "DataLookup.h" + +#include <cassert> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::BidirectionalSequenceLSTMOptions> +build_circle_BidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_BidirectionalSequenceLSTMOptions(); + circle::BidirectionalSequenceLSTMOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_fused_activation_function( + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + builtin_options_builder.add_cell_clip(tflite_builtin_options->cell_clip()); + builtin_options_builder.add_proj_clip(tflite_builtin_options->proj_clip()); + builtin_options_builder.add_time_major(tflite_builtin_options->time_major()); + builtin_options_builder.add_merge_outputs(tflite_builtin_options->merge_outputs()); + builtin_options_builder.add_asymmetric_quantize_inputs( + tflite_builtin_options->asymmetric_quantize_inputs()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/BidirectionalSequenceLSTMOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/BidirectionalSequenceLSTMOptions.h new file mode 100644 index 000000000..7b77b1cea --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/BidirectionalSequenceLSTMOptions.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_BIDIRECTIONALSEQUENCE_LSTM_OPTIONS_H__ +#define __BBO_BIDIRECTIONALSEQUENCE_LSTM_OPTIONS_H__ + +#include <mio/tflite/schema_generated.h> +#include <mio/circle/schema_generated.h> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::BidirectionalSequenceLSTMOptions> +build_circle_BidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_BIDIRECTIONALSEQUENCE_LSTM_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/CastOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/CastOptions.cpp index bc1445248..0f2422c05 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/CastOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/CastOptions.cpp @@ -31,9 +31,9 @@ build_circle_CastOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Opera circle::CastOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_in_data_type( - get_circle_tensortype(tflite_builtin_options->in_data_type())); + get_circle_tensortype(tflite_builtin_options->in_data_type())); builtin_options_builder.add_out_data_type( - get_circle_tensortype(tflite_builtin_options->out_data_type())); + get_circle_tensortype(tflite_builtin_options->out_data_type())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ConcatenationOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ConcatenationOptions.cpp index 933e7cf66..becc63bf6 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/ConcatenationOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ConcatenationOptions.cpp @@ -30,7 +30,7 @@ build_circle_ConcatenationOptions(flatbuffers::FlatBufferBuilder &fb, const tfli circle::ConcatenationOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_axis(tflite_builtin_options->axis()); builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/Conv2DOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/Conv2DOptions.cpp index ace63dd26..ec0cffeda 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/Conv2DOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/Conv2DOptions.cpp @@ -32,7 +32,7 @@ build_circle_Conv2DOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Ope builtin_options_builder.add_stride_w(tflite_builtin_options->stride_w()); builtin_options_builder.add_stride_h(tflite_builtin_options->stride_h()); builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); builtin_options_builder.add_dilation_w_factor(tflite_builtin_options->dilation_w_factor()); builtin_options_builder.add_dilation_h_factor(tflite_builtin_options->dilation_h_factor()); return builtin_options_builder.Finish(); diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/DensifyOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/DensifyOptions.cpp new file mode 100644 index 000000000..4e5863576 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/DensifyOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DensifyOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::DensifyOptions> +build_circle_DensifyOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::DensifyOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/DensifyOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/DensifyOptions.h new file mode 100644 index 000000000..b6126c4e2 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/DensifyOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_DENSIFY_OPTIONS_H__ +#define __BBO_DENSIFY_OPTIONS_H__ + +#include <mio/tflite/schema_generated.h> +#include <mio/circle/schema_generated.h> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::DensifyOptions> +build_circle_DensifyOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_DENSIFY_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/DepthwiseConv2DOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/DepthwiseConv2DOptions.cpp index 2aa35abc6..910a6ead9 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/DepthwiseConv2DOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/DepthwiseConv2DOptions.cpp @@ -33,7 +33,7 @@ build_circle_DepthwiseConv2DOptions(flatbuffers::FlatBufferBuilder &fb, const tf builtin_options_builder.add_stride_h(tflite_builtin_options->stride_h()); builtin_options_builder.add_depth_multiplier(tflite_builtin_options->depth_multiplier()); builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); builtin_options_builder.add_dilation_w_factor(tflite_builtin_options->dilation_w_factor()); builtin_options_builder.add_dilation_h_factor(tflite_builtin_options->dilation_h_factor()); return builtin_options_builder.Finish(); diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/DequantizeOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/DequantizeOptions.cpp new file mode 100644 index 000000000..eeacece6a --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/DequantizeOptions.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DequantizeOptions.h" +#include "DataLookup.h" + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::DequantizeOptions> +build_circle_DequantizeOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::DequantizeOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/DequantizeOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/DequantizeOptions.h new file mode 100644 index 000000000..1cb9f9c1a --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/DequantizeOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_DEQUANTIZE_OPTIONS_H__ +#define __BBO_DEQUANTIZE_OPTIONS_H__ + +#include <mio/tflite/schema_generated.h> +#include <mio/circle/schema_generated.h> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::DequantizeOptions> +build_circle_DequantizeOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_DEQUANTIZE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/DivOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/DivOptions.cpp index 4272fe144..3678928a5 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/DivOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/DivOptions.cpp @@ -29,7 +29,7 @@ flatbuffers::Offset<circle::DivOptions> build_circle_DivOptions(flatbuffers::Fla assert(tflite_builtin_options); circle::DivOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/FakeQuantOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/FakeQuantOptions.cpp new file mode 100644 index 000000000..e38600f82 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/FakeQuantOptions.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FillOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::FakeQuantOptions> +build_circle_FakeQuantOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_FakeQuantOptions(); + assert(tflite_builtin_options); + circle::FakeQuantOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_min(tflite_builtin_options->min()); + builtin_options_builder.add_max(tflite_builtin_options->max()); + builtin_options_builder.add_num_bits(tflite_builtin_options->num_bits()); + builtin_options_builder.add_narrow_range(tflite_builtin_options->narrow_range()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/FakeQuantOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/FakeQuantOptions.h new file mode 100644 index 000000000..1f5f12b86 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/FakeQuantOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_FAKEQUANT_OPTIONS_H__ +#define __BBO_FAKEQUANT_OPTIONS_H__ + +#include <mio/tflite/schema_generated.h> +#include <mio/circle/schema_generated.h> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::FillOptions> +build_circle_FakeQuantOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_FAKEQUANT_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/FullyConnectedOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/FullyConnectedOptions.cpp index 098a96a40..27410012d 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/FullyConnectedOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/FullyConnectedOptions.cpp @@ -29,14 +29,15 @@ build_circle_FullyConnectedOptions(flatbuffers::FlatBufferBuilder &fb, const tfl assert(tflite_builtin_options); circle::FullyConnectedOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); // Get FullyConnectedOptionsWeightsFormat auto tflite_weight_format = tflite_builtin_options->weights_format(); if (tflite_weight_format == tflite::FullyConnectedOptionsWeightsFormat_DEFAULT) builtin_options_builder.add_weights_format(circle::FullyConnectedOptionsWeightsFormat_DEFAULT); else if (tflite_weight_format == tflite::FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8) builtin_options_builder.add_weights_format( - circle::FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8); + circle::FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8); + builtin_options_builder.add_keep_num_dims(tflite_builtin_options->keep_num_dims()); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/GeluOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/GeluOptions.cpp new file mode 100644 index 000000000..92fcd6083 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/GeluOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GeluOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::GeluOptions> +build_circle_GeluOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto *tflite_builtin_options = op->builtin_options_as_GeluOptions(); + assert(tflite_builtin_options); + circle::GeluOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_approximate(tflite_builtin_options->approximate()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/GeluOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/GeluOptions.h new file mode 100644 index 000000000..76955d795 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/GeluOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_GELU_OPTIONS_H__ +#define __BBO_GELU_OPTIONS_H__ + +#include <mio/tflite/schema_generated.h> +#include <mio/circle/schema_generated.h> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::GeluOptions> +build_circle_GeluOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_GELU_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.cpp index d58aed83d..f5121a811 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.cpp @@ -29,7 +29,7 @@ build_circle_L2NormOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Ope assert(tflite_builtin_options); circle::L2NormOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.cpp index d2d2888f2..db88d3e82 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.cpp @@ -25,8 +25,6 @@ namespace tflite2circle flatbuffers::Offset<circle::MaximumMinimumOptions> build_circle_MaximumMinimumOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) { - auto tflite_builtin_options = op->builtin_options_as_MaximumMinimumOptions(); - assert(tflite_builtin_options); circle::MaximumMinimumOptionsBuilder builtin_options_builder{fb}; return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MulOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/MulOptions.cpp index 009daea8b..3d4b9deb5 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/MulOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MulOptions.cpp @@ -29,7 +29,7 @@ flatbuffers::Offset<circle::MulOptions> build_circle_MulOptions(flatbuffers::Fla assert(tflite_builtin_options); circle::MulOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/Pool2DOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/Pool2DOptions.cpp index 6b0bd1288..d796eadfa 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/Pool2DOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/Pool2DOptions.cpp @@ -34,7 +34,7 @@ build_circle_Pool2DOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Ope builtin_options_builder.add_filter_width(tflite_builtin_options->filter_width()); builtin_options_builder.add_filter_height(tflite_builtin_options->filter_height()); builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SVDFOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SVDFOptions.cpp new file mode 100644 index 000000000..e23738a69 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SVDFOptions.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SVDFOptions.h" +#include "DataLookup.h" + +#include <cassert> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::SVDFOptions> +build_circle_SVDFOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto *tflite_builtin_options = op->builtin_options_as_SVDFOptions(); + assert(tflite_builtin_options); + + circle::SVDFOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_rank(tflite_builtin_options->rank()); + builtin_options_builder.add_asymmetric_quantize_inputs( + tflite_builtin_options->asymmetric_quantize_inputs()); + builtin_options_builder.add_fused_activation_function( + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SVDFOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SVDFOptions.h new file mode 100644 index 000000000..2ddbd3911 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SVDFOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SVDF_OPTIONS_H__ +#define __BBO_SVDF_OPTIONS_H__ + +#include <mio/tflite/schema_generated.h> +#include <mio/circle/schema_generated.h> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::SVDFOptions> +build_circle_SVDFOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SVDF_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SubOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SubOptions.cpp index 2e55f4dab..982f3fd68 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/SubOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SubOptions.cpp @@ -29,7 +29,7 @@ flatbuffers::Offset<circle::SubOptions> build_circle_SubOptions(flatbuffers::Fla assert(tflite_builtin_options); circle::SubOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_fused_activation_function( - get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.cpp index 301f2c421..0873170f7 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.cpp @@ -31,6 +31,8 @@ build_circle_TransposeConvOptions(flatbuffers::FlatBufferBuilder &fb, const tfli builtin_options_builder.add_padding(get_circle_padding(tflite_builtin_options->padding())); builtin_options_builder.add_stride_w(tflite_builtin_options->stride_w()); builtin_options_builder.add_stride_h(tflite_builtin_options->stride_h()); + builtin_options_builder.add_fused_activation_function( + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/UnidirectionalSequenceLSTMOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/UnidirectionalSequenceLSTMOptions.cpp new file mode 100644 index 000000000..6e8143be9 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/UnidirectionalSequenceLSTMOptions.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "UnidirectionalSequenceLSTMOptions.h" +#include "DataLookup.h" + +#include <cassert> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::UnidirectionalSequenceLSTMOptions> +build_circle_UnidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_UnidirectionalSequenceLSTMOptions(); + circle::UnidirectionalSequenceLSTMOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_fused_activation_function( + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + builtin_options_builder.add_cell_clip(tflite_builtin_options->cell_clip()); + builtin_options_builder.add_proj_clip(tflite_builtin_options->proj_clip()); + builtin_options_builder.add_time_major(tflite_builtin_options->time_major()); + builtin_options_builder.add_asymmetric_quantize_inputs( + tflite_builtin_options->asymmetric_quantize_inputs()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/UnidirectionalSequenceLSTMOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/UnidirectionalSequenceLSTMOptions.h new file mode 100644 index 000000000..2be0efbc2 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/UnidirectionalSequenceLSTMOptions.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_UNIDIRECTIONALSEQUENCELSTM_OPTIONS_H__ +#define __BBO_UNIDIRECTIONALSEQUENCELSTM_OPTIONS_H__ + +#include <mio/tflite/schema_generated.h> +#include <mio/circle/schema_generated.h> + +namespace tflite2circle +{ + +flatbuffers::Offset<circle::UnidirectionalSequenceLSTMOptions> +build_circle_UnidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_UNIDIRECTIONALSEQUENCELSTM_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.cpp index 96ddc15ad..f7ddeffcb 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.cpp @@ -29,7 +29,7 @@ build_circle_UniqueOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Ope assert(tflite_builtin_options); circle::UniqueOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_idx_out_type( - get_circle_tensortype(tflite_builtin_options->idx_out_type())); + get_circle_tensortype(tflite_builtin_options->idx_out_type())); return builtin_options_builder.Finish(); } diff --git a/compiler/tflite2circle/src/CircleModel.cpp b/compiler/tflite2circle/src/CircleModel.cpp index 14c44cb36..899bc84f7 100644 --- a/compiler/tflite2circle/src/CircleModel.cpp +++ b/compiler/tflite2circle/src/CircleModel.cpp @@ -14,27 +14,29 @@ * limitations under the License. */ +#include <cassert> #include <iostream> +#include <map> #include <memory> #include "CircleModel.h" #include "DataLookup.h" +#include <mio_tflite2121/Helper.h> + namespace tflite2circle { -template <> -Offset<MetaDataBufferLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec) +template <> void Offset<MetaDataBufferLink>::build(const TFLFlatBufVec *tflite_flatbuffer_vec) { if (tflite_flatbuffer_vec == nullptr) return; std::vector<int32_t> metadata_buffer_vec{tflite_flatbuffer_vec->begin(), tflite_flatbuffer_vec->end()}; - _circle_flatbuffer_vec_offset = fb->CreateVector(metadata_buffer_vec); + _circle_flatbuffer_vec_offset = _fb->CreateVector(metadata_buffer_vec); } -template <> -Offset<BufferLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec) +template <> void Offset<BufferLink>::build(const TFLFlatBufVec *tflite_flatbuffer_vec) { std::vector<flatbuffers::Offset<circle::Buffer>> buffers_vec; @@ -44,21 +46,22 @@ Offset<BufferLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatb if (it->data()) { std::vector<uint8_t> data_vec{it->data()->begin(), it->data()->end()}; - buffer_data = fb->CreateVector(data_vec); + buffer_data = _fb->CreateVector(data_vec); } - circle::BufferBuilder circle_buffer_builder{*fb}; + circle::BufferBuilder circle_buffer_builder{*_fb}; circle_buffer_builder.add_data(buffer_data); auto circle_buffers = circle_buffer_builder.Finish(); buffers_vec.emplace_back(circle_buffers); } - _circle_flatbuffer_vec_offset = fb->CreateVector(buffers_vec); + _circle_flatbuffer_vec_offset = _fb->CreateVector(buffers_vec); } -template <> -Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec) +template <> void Offset<SubGraphLink>::build(const TFLFlatBufVec *tflite_flatbuffer_vec) { std::vector<flatbuffers::Offset<circle::SubGraph>> subgprahs_vec; + int32_t subgraph_index = 0; + for (auto it_sg : *tflite_flatbuffer_vec) { // tensors of subgraph @@ -72,12 +75,12 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla if (it->shape()) { auto shape_vec = std::vector<int32_t>({it->shape()->begin(), it->shape()->end()}); - shape = fb->CreateVector(shape_vec); + shape = _fb->CreateVector(shape_vec); } // name flatbuffers::Offset<flatbuffers::String> name; if (it->name()) - name = fb->CreateString(it->name()->str()); + name = _fb->CreateString(it->name()->str()); // quantization flatbuffers::Offset<circle::QuantizationParameters> quantization; if (it->quantization()) @@ -98,8 +101,8 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla auto rmax = it->quantization()->max(); tfmin = std::vector<float>{rmin->begin(), rmin->end()}; tfmax = std::vector<float>{rmax->begin(), rmax->end()}; - min = fb->CreateVector(tfmin); - max = fb->CreateVector(tfmax); + min = _fb->CreateVector(tfmin); + max = _fb->CreateVector(tfmax); } if (it->quantization()->scale() && it->quantization()->zero_point()) @@ -108,11 +111,11 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla auto rz = it->quantization()->zero_point(); tfscale = std::vector<float>{rs->begin(), rs->end()}; tfzerop = std::vector<int64_t>{rz->begin(), rz->end()}; - scale = fb->CreateVector(tfscale); - zero_point = fb->CreateVector(tfzerop); + scale = _fb->CreateVector(tfscale); + zero_point = _fb->CreateVector(tfzerop); } - quantization = circle::CreateQuantizationParameters(*fb, min, max, scale, zero_point, + quantization = circle::CreateQuantizationParameters(*_fb, min, max, scale, zero_point, circle::QuantizationDetails_NONE, 0, quantized_dimension); } @@ -126,14 +129,14 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla flatbuffers::Offset<flatbuffers::Vector<int32_t>> traversal_order; flatbuffers::Offset<flatbuffers::Vector<int32_t>> block_map; flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<circle::DimensionMetadata>>> - dim_metadata; + dim_metadata; // traversal_order if (it->sparsity()->traversal_order()) { auto traversal_order_vec = std::vector<int32_t>{ - it->sparsity()->traversal_order()->begin(), it->sparsity()->traversal_order()->end()}; - traversal_order = fb->CreateVector(traversal_order_vec); + it->sparsity()->traversal_order()->begin(), it->sparsity()->traversal_order()->end()}; + traversal_order = _fb->CreateVector(traversal_order_vec); } // block_map @@ -141,7 +144,7 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla { auto block_map_vec = std::vector<int32_t>{it->sparsity()->block_map()->begin(), it->sparsity()->block_map()->end()}; - block_map = fb->CreateVector(block_map_vec); + block_map = _fb->CreateVector(block_map_vec); } // dim_metadata @@ -152,18 +155,18 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla // array_segments auto tflite_array_segments_type = it->array_segments_type(); auto circle_array_segments = - get_circle_sparse_index_vector(*fb, it, tflite_array_segments_type); + get_circle_sparse_index_vector(*_fb, it->array_segments(), tflite_array_segments_type); auto circle_array_segments_type = - get_circle_sparse_index_vector_type(tflite_array_segments_type); + get_circle_sparse_index_vector_type(tflite_array_segments_type); // array_indices auto tflite_array_indices_type = it->array_indices_type(); auto circle_array_indices = - get_circle_sparse_index_vector(*fb, it, tflite_array_indices_type); + get_circle_sparse_index_vector(*_fb, it->array_indices(), tflite_array_indices_type); auto circle_array_indices_type = - get_circle_sparse_index_vector_type(tflite_array_indices_type); + get_circle_sparse_index_vector_type(tflite_array_indices_type); - auto circle_dim_metadata_builder = circle::DimensionMetadataBuilder{*fb}; + auto circle_dim_metadata_builder = circle::DimensionMetadataBuilder{*_fb}; circle_dim_metadata_builder.add_format(get_circle_dimension_type(it->format())); circle_dim_metadata_builder.add_dense_size(it->dense_size()); @@ -174,9 +177,9 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla auto dim_metadata = circle_dim_metadata_builder.Finish(); dim_metadata_vec.emplace_back(dim_metadata); } - dim_metadata = fb->CreateVector(dim_metadata_vec); + dim_metadata = _fb->CreateVector(dim_metadata_vec); - sparsity = circle::CreateSparsityParameters(*fb, traversal_order, block_map, dim_metadata); + sparsity = circle::CreateSparsityParameters(*_fb, traversal_order, block_map, dim_metadata); } // shape signature @@ -184,11 +187,11 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla if (it->shape_signature()) { auto shape_signature_vec = - std::vector<int32_t>({it->shape_signature()->begin(), it->shape_signature()->end()}); - shape_signature = fb->CreateVector(shape_signature_vec); + std::vector<int32_t>({it->shape_signature()->begin(), it->shape_signature()->end()}); + shape_signature = _fb->CreateVector(shape_signature_vec); } - circle::TensorBuilder tensor_builder{*fb}; + circle::TensorBuilder tensor_builder{*_fb}; tensor_builder.add_shape(shape); tensor_builder.add_type(get_circle_tensortype(it->type())); tensor_builder.add_buffer(it->buffer()); @@ -200,67 +203,120 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla auto tensor = tensor_builder.Finish(); tensor_vec.emplace_back(tensor); } - auto circle_tensors = fb->CreateVector(tensor_vec); + auto circle_tensors = _fb->CreateVector(tensor_vec); // inputs of subgraph auto tflite_inputs = it_sg->inputs(); std::vector<int32_t> input_vec{tflite_inputs->begin(), tflite_inputs->end()}; - auto circle_inputs = fb->CreateVector(input_vec); + // apply signature_def to input tensor index so that input orders follow like tensorflow lite + // interpreter._get_full_signature_list() method, which is ordered(sorted) in name + // NOTE we do not need this when circle format supports signature_def + if (_tfl_signature_def_offsets != nullptr) + { + for (auto it_signdef : *_tfl_signature_def_offsets) + { + if (it_signdef->subgraph_index() == subgraph_index) + { + auto inputs = it_signdef->inputs(); + assert(inputs->size() == input_vec.size()); + + std::map<std::string, uint32_t> map_name_index; + for (auto it_tm : *inputs) + { + map_name_index[it_tm->name()->str()] = it_tm->tensor_index(); + } + uint32_t input_vec_idx = 0; + for (auto &item : map_name_index) + { + input_vec[input_vec_idx++] = item.second; + } + } + } + } + + auto circle_inputs = _fb->CreateVector(input_vec); // outputs of subgraph auto tflite_outputs = it_sg->outputs(); std::vector<int32_t> output_vec{tflite_outputs->begin(), tflite_outputs->end()}; - auto circle_outputs = fb->CreateVector(output_vec); + if (_tfl_signature_def_offsets != nullptr) + { + // apply SignatureDef + for (auto it_signdef : *_tfl_signature_def_offsets) + { + if (it_signdef->subgraph_index() == subgraph_index) + { + auto outputs = it_signdef->outputs(); + assert(outputs->size() == output_vec.size()); + + std::map<std::string, uint32_t> map_name_index; + for (auto it_tm : *outputs) + { + map_name_index[it_tm->name()->str()] = it_tm->tensor_index(); + } + uint32_t output_vec_idx = 0; + for (auto &item : map_name_index) + { + output_vec[output_vec_idx++] = item.second; + } + } + } + } + + auto circle_outputs = _fb->CreateVector(output_vec); // operators of subgraph std::vector<flatbuffers::Offset<circle::Operator>> operator_vec; auto tflite_operators = it_sg->operators(); - for (auto it : *tflite_operators) + if (tflite_operators != nullptr) { - // inputs - std::vector<int32_t> input_vec{it->inputs()->begin(), it->inputs()->end()}; - auto circle_inputs = fb->CreateVector(input_vec); - // outputs - std::vector<int32_t> output_vec{it->outputs()->begin(), it->outputs()->end()}; - auto circle_outputs = fb->CreateVector(output_vec); - // builtin options - auto circle_builtin_options = get_circle_builtin_options(*fb, it); - auto circle_builtin_options_type = get_circle_builtin_options_type(it); - // custom options - flatbuffers::Offset<flatbuffers::Vector<uint8_t>> circle_custom_options; - if (it->custom_options()) + for (auto it : *tflite_operators) { - std::vector<uint8_t> custom_options_vec{it->custom_options()->begin(), - it->custom_options()->end()}; - circle_custom_options = fb->CreateVector(custom_options_vec); + // inputs + std::vector<int32_t> input_vec{it->inputs()->begin(), it->inputs()->end()}; + auto circle_inputs = _fb->CreateVector(input_vec); + // outputs + std::vector<int32_t> output_vec{it->outputs()->begin(), it->outputs()->end()}; + auto circle_outputs = _fb->CreateVector(output_vec); + // builtin options + auto circle_builtin_options = get_circle_builtin_options(*_fb, it); + auto circle_builtin_options_type = get_circle_builtin_options_type(it); + // custom options + flatbuffers::Offset<flatbuffers::Vector<uint8_t>> circle_custom_options; + if (it->custom_options()) + { + std::vector<uint8_t> custom_options_vec{it->custom_options()->begin(), + it->custom_options()->end()}; + circle_custom_options = _fb->CreateVector(custom_options_vec); + } + // custom options format + // TODO Make get_circle_custom_options_format + assert(it->custom_options_format() == tflite::CustomOptionsFormat_FLEXBUFFERS); + auto circle_custom_options_format = circle::CustomOptionsFormat_FLEXBUFFERS; + + circle::OperatorBuilder operator_builder{*_fb}; + operator_builder.add_opcode_index(it->opcode_index()); + operator_builder.add_inputs(circle_inputs); + operator_builder.add_outputs(circle_outputs); + operator_builder.add_builtin_options(circle_builtin_options); + operator_builder.add_builtin_options_type(circle_builtin_options_type); + operator_builder.add_custom_options(circle_custom_options); + operator_builder.add_custom_options_format(circle_custom_options_format); + // TODO mutating_variable_inputs + auto opeartor = operator_builder.Finish(); + operator_vec.emplace_back(opeartor); } - // custom options format - // TODO Make get_circle_custom_options_format - assert(it->custom_options_format() == tflite::CustomOptionsFormat_FLEXBUFFERS); - auto circle_custom_options_format = circle::CustomOptionsFormat_FLEXBUFFERS; - - circle::OperatorBuilder operator_builder{*fb}; - operator_builder.add_opcode_index(it->opcode_index()); - operator_builder.add_inputs(circle_inputs); - operator_builder.add_outputs(circle_outputs); - operator_builder.add_builtin_options(circle_builtin_options); - operator_builder.add_builtin_options_type(circle_builtin_options_type); - operator_builder.add_custom_options(circle_custom_options); - operator_builder.add_custom_options_format(circle_custom_options_format); - // TODO mutating_variable_inputs - auto opeartor = operator_builder.Finish(); - operator_vec.emplace_back(opeartor); } - auto circle_operators = fb->CreateVector(operator_vec); + auto circle_operators = _fb->CreateVector(operator_vec); // name of subgraph - auto subgraphs_name = fb->CreateString(it_sg->name()); + auto subgraphs_name = _fb->CreateString(it_sg->name()); // subgraphs - auto circle_subgraph_builder = circle::SubGraphBuilder{*fb}; + auto circle_subgraph_builder = circle::SubGraphBuilder{*_fb}; circle_subgraph_builder.add_tensors(circle_tensors); circle_subgraph_builder.add_inputs(circle_inputs); @@ -271,47 +327,75 @@ Offset<SubGraphLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla auto circle_subgraph = circle_subgraph_builder.Finish(); subgprahs_vec.emplace_back(circle_subgraph); + + // next subgraph + subgraph_index = subgraph_index + 1; } - _circle_flatbuffer_vec_offset = fb->CreateVector(subgprahs_vec); + _circle_flatbuffer_vec_offset = _fb->CreateVector(subgprahs_vec); } -template <> -Offset<OperatorCodeLink>::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_flatbuffer_vec) +template <> void Offset<OperatorCodeLink>::build(const TFLFlatBufVec *tflite_flatbuffer_vec) { std::vector<flatbuffers::Offset<circle::OperatorCode>> operator_code_vec; for (auto it : *tflite_flatbuffer_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())); + auto custom_code = _fb->CreateString(it->custom_code()); + circle::OperatorCodeBuilder operator_code_builder{*_fb}; + auto de_code = it->deprecated_builtin_code(); + auto bt_code = it->builtin_code(); + + // There are two builtin codes (deprecated_builtin, (extended) builtin) + // deprecated builtin code uses 0~126 + // extended builtin code uses 127~ + // NOTE 127 = BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES + if (de_code >= 0 and de_code < 127) + { + // Use deprecated builtin opcode. + auto cir_de_code = get_circle_builtin_code(de_code); + auto cir_bt_code = get_circle_builtin_code(bt_code); + // correct bt_code where bt_code == 0 for old tflite format + if (cir_bt_code == 0) + cir_bt_code = static_cast<circle::BuiltinOperator>(cir_de_code); + operator_code_builder.add_deprecated_builtin_code(cir_de_code); + operator_code_builder.add_builtin_code(cir_bt_code); + } + else + { + // Use extended builtin opcode + // Set 127 (PLACEHOLDER_FOR_GREATER_OP_CODES) for deprecated builtin code + auto cir_bt_code = get_circle_builtin_code(bt_code); + operator_code_builder.add_deprecated_builtin_code( + tflite::BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES); + operator_code_builder.add_builtin_code(cir_bt_code); + } operator_code_builder.add_custom_code(custom_code); operator_code_builder.add_version(it->version()); auto code = operator_code_builder.Finish(); operator_code_vec.emplace_back(code); } - _circle_flatbuffer_vec_offset = fb->CreateVector(operator_code_vec); + _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) + : _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("ERROR: Failed to verify tflite"); - } + // NOTHING TODO +} + +void CircleModel::load_offsets(const tflite::Model *tfl_model) +{ + _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); + + _subGraphs_offset->set_signature_defs(tfl_model->signature_defs()); - _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(); + _operator_codes_offset->build(tfl_model->operator_codes()); + _subGraphs_offset->build(tfl_model->subgraphs()); + _buffers_offset->build(tfl_model->buffers()); + _metadata_buffer_offset->build(tfl_model->metadata_buffer()); } void CircleModel::model_build(void) const diff --git a/compiler/tflite2circle/src/DataLookup.cpp b/compiler/tflite2circle/src/DataLookup.cpp index 75504b062..c16e60196 100644 --- a/compiler/tflite2circle/src/DataLookup.cpp +++ b/compiler/tflite2circle/src/DataLookup.cpp @@ -34,6 +34,29 @@ circle::BuiltinOperator get_circle_builtin_code(tflite::BuiltinOperator tfl_bop) } } +int8_t get_circle_builtin_code(int8_t tfl_bop_i8) +{ + return get_circle_builtin_code(static_cast<int32_t>(tfl_bop_i8)); +} + +int32_t get_circle_builtin_code(int32_t tfl_bop_i32) +{ + tflite::BuiltinOperator tfl_bop = static_cast<tflite::BuiltinOperator>(tfl_bop_i32); + + switch (tfl_bop) + { +#define TFL_OPERATOR(OP) \ + case tflite::BuiltinOperator_##OP: \ + return static_cast<int32_t>(circle::BuiltinOperator_##OP); +#include "TFLOperator.lst" +#undef TFL_OPERATOR + case tflite::BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES: + return static_cast<int32_t>(circle::BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES); + default: + throw std::runtime_error("tflite2circle: wrong op"); + } +} + circle::TensorType get_circle_tensortype(tflite::TensorType tfl_tt) { switch (tfl_tt) @@ -137,8 +160,7 @@ circle::DimensionType get_circle_dimension_type(tflite::DimensionType tfl_dim_ty } flatbuffers::Offset<void> -get_circle_sparse_index_vector(flatbuffers::FlatBufferBuilder &fb, - const tflite::DimensionMetadata *dm, +get_circle_sparse_index_vector(flatbuffers::FlatBufferBuilder &fb, const void *v_array, const tflite::SparseIndexVector &tfl_sparse_index_vector_type) { switch (tfl_sparse_index_vector_type) @@ -147,9 +169,9 @@ get_circle_sparse_index_vector(flatbuffers::FlatBufferBuilder &fb, return flatbuffers::Offset<void>(); case tflite::SparseIndexVector_Int32Vector: { + const tflite::Int32Vector *i32_array = static_cast<const tflite::Int32Vector *>(v_array); auto values_vec_int32 = - std::vector<int32_t>{dm->array_segments_as_Int32Vector()->values()->begin(), - dm->array_segments_as_Int32Vector()->values()->end()}; + std::vector<int32_t>{i32_array->values()->begin(), i32_array->values()->end()}; auto values_int32 = fb.CreateVector(values_vec_int32); circle::Int32VectorBuilder int32_vector_builder{fb}; int32_vector_builder.add_values(values_int32); @@ -157,9 +179,9 @@ get_circle_sparse_index_vector(flatbuffers::FlatBufferBuilder &fb, } case tflite::SparseIndexVector_Uint16Vector: { + const tflite::Uint16Vector *u16_array = static_cast<const tflite::Uint16Vector *>(v_array); auto values_vec_uint16 = - std::vector<uint16_t>{dm->array_segments_as_Uint16Vector()->values()->begin(), - dm->array_segments_as_Uint16Vector()->values()->end()}; + std::vector<uint16_t>{u16_array->values()->begin(), u16_array->values()->end()}; auto values_uint16 = fb.CreateVector(values_vec_uint16); circle::Uint16VectorBuilder uint16_vector_builder{fb}; uint16_vector_builder.add_values(values_uint16); @@ -167,9 +189,9 @@ get_circle_sparse_index_vector(flatbuffers::FlatBufferBuilder &fb, } case tflite::SparseIndexVector_Uint8Vector: { + const tflite::Uint8Vector *u8_array = static_cast<const tflite::Uint8Vector *>(v_array); auto values_vec_uint8 = - std::vector<uint8_t>{dm->array_segments_as_Uint8Vector()->values()->begin(), - dm->array_segments_as_Uint8Vector()->values()->end()}; + std::vector<uint8_t>{u8_array->values()->begin(), u8_array->values()->end()}; auto values_uint8 = fb.CreateVector(values_vec_uint8); circle::Uint8VectorBuilder uint8_vector_builder{fb}; uint8_vector_builder.add_values(values_uint8); diff --git a/compiler/tflite2circle/src/DataLookup.h b/compiler/tflite2circle/src/DataLookup.h index 26ad74666..f346b01f4 100644 --- a/compiler/tflite2circle/src/DataLookup.h +++ b/compiler/tflite2circle/src/DataLookup.h @@ -27,19 +27,22 @@ namespace tflite2circle * @brief Returns circle builtin_code according to tflite. * * @note You can see a list of currently supported BuiltinOperator in TFLOperator.lst file. -*/ + */ circle::BuiltinOperator get_circle_builtin_code(tflite::BuiltinOperator tfl_bop); +int8_t get_circle_builtin_code(int8_t tfl_bop_i8); +int32_t get_circle_builtin_code(int32_t tfl_bop_i32); + /** * @brief Returns circle TensorType according to tflite. * * @note You can see a list of currently supported TensorType in TFLTensorType.lst file. -*/ + */ circle::TensorType get_circle_tensortype(tflite::TensorType tfl_tt); /** * @brief Returns circle Padding enum according to tflite. -*/ + */ circle::Padding get_circle_padding(tflite::Padding tfl_p); /** @@ -47,7 +50,7 @@ circle::Padding get_circle_padding(tflite::Padding tfl_p); * * @note You can see a list of currently supported ActivationFunctionType in * TFLActivationFunctionType.lst file. -*/ + */ circle::ActivationFunctionType get_circle_activation_function_type(tflite::ActivationFunctionType tfl_aft); @@ -60,7 +63,7 @@ get_circle_activation_function_type(tflite::ActivationFunctionType tfl_aft); * This function calls the build_circle_##BuiltinOptions internally(e.g. * build_circle_AbsOptions, build_circle_AddOptions, etc.), so refer to it for a more * detailed implementation. -*/ + */ flatbuffers::Offset<void> get_circle_builtin_options(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); @@ -68,30 +71,29 @@ flatbuffers::Offset<void> get_circle_builtin_options(flatbuffers::FlatBufferBuil * @brief Returns circle builtin_options_type according to tflite. * * @note You can see a list of currently supported BuiltinOptions in TFLBuiltinOptions.lst file. -*/ + */ circle::BuiltinOptions get_circle_builtin_options_type(const tflite::Operator *op); /** * @brief Returns circle MirrorPadMode according to tflite. -*/ + */ circle::MirrorPadMode get_circle_mirrorpad_mode(tflite::MirrorPadMode tfl_mode); /** * @brief Returns circle DimensionType according to tflite. -*/ + */ circle::DimensionType get_circle_dimension_type(tflite::DimensionType tfl_dim_type); /** * @brief Returns circle SparseIndexVector according to tflite. -*/ + */ flatbuffers::Offset<void> -get_circle_sparse_index_vector(flatbuffers::FlatBufferBuilder &fb, - const tflite::DimensionMetadata *dm, +get_circle_sparse_index_vector(flatbuffers::FlatBufferBuilder &fb, const void *values, const tflite::SparseIndexVector &tfl_sparse_index_vector_type); /** * @brief Returns circle SparseIndexVector type according to tflite. -*/ + */ circle::SparseIndexVector get_circle_sparse_index_vector_type(const tflite::SparseIndexVector &tfl_sparse_index_vector_type); diff --git a/compiler/tflite2circle/src/TFLBuiltinOptions.lst b/compiler/tflite2circle/src/TFLBuiltinOptions.lst index 22b59863b..ac77c9abf 100644 --- a/compiler/tflite2circle/src/TFLBuiltinOptions.lst +++ b/compiler/tflite2circle/src/TFLBuiltinOptions.lst @@ -9,7 +9,7 @@ TFL_BUILTIN_OPTIONS(DepthwiseConv2DOptions) //TFL_BUILTIN_OPTIONS(ConcatEmbeddingsOptions) //TFL_BUILTIN_OPTIONS(LSHProjectionOptions) TFL_BUILTIN_OPTIONS(Pool2DOptions) -//TFL_BUILTIN_OPTIONS(SVDFOptions) +TFL_BUILTIN_OPTIONS(SVDFOptions) //TFL_BUILTIN_OPTIONS(RNNOptions) TFL_BUILTIN_OPTIONS(FullyConnectedOptions) TFL_BUILTIN_OPTIONS(SoftmaxOptions) @@ -28,6 +28,7 @@ TFL_BUILTIN_OPTIONS(MulOptions) TFL_BUILTIN_OPTIONS(PadOptions) TFL_BUILTIN_OPTIONS(PadV2Options) TFL_BUILTIN_OPTIONS(GatherOptions) +TFL_BUILTIN_OPTIONS(GeluOptions) TFL_BUILTIN_OPTIONS(BatchToSpaceNDOptions) TFL_BUILTIN_OPTIONS(SpaceToBatchNDOptions) TFL_BUILTIN_OPTIONS(TransposeOptions) @@ -42,7 +43,7 @@ TFL_BUILTIN_OPTIONS(TopKV2Options) TFL_BUILTIN_OPTIONS(SplitOptions) TFL_BUILTIN_OPTIONS(LogSoftmaxOptions) TFL_BUILTIN_OPTIONS(CastOptions) -//TFL_BUILTIN_OPTIONS(DequantizeOptions) +TFL_BUILTIN_OPTIONS(DequantizeOptions) TFL_BUILTIN_OPTIONS(MaximumMinimumOptions) TFL_BUILTIN_OPTIONS(ArgMaxOptions) TFL_BUILTIN_OPTIONS(LessOptions) @@ -63,7 +64,7 @@ TFL_BUILTIN_OPTIONS(NotEqualOptions) TFL_BUILTIN_OPTIONS(ShapeOptions) TFL_BUILTIN_OPTIONS(PowOptions) TFL_BUILTIN_OPTIONS(ArgMinOptions) -//TFL_BUILTIN_OPTIONS(FakeQuantOptions) +TFL_BUILTIN_OPTIONS(FakeQuantOptions) TFL_BUILTIN_OPTIONS(PackOptions) TFL_BUILTIN_OPTIONS(LogicalOrOptions) TFL_BUILTIN_OPTIONS(OneHotOptions) @@ -74,9 +75,9 @@ TFL_BUILTIN_OPTIONS(FloorDivOptions) TFL_BUILTIN_OPTIONS(SquareOptions) TFL_BUILTIN_OPTIONS(ZerosLikeOptions) TFL_BUILTIN_OPTIONS(FillOptions) -//TFL_BUILTIN_OPTIONS(BidirectionalSequenceLSTMOptions) +TFL_BUILTIN_OPTIONS(BidirectionalSequenceLSTMOptions) //TFL_BUILTIN_OPTIONS(BidirectionalSequenceRNNOptions) -//TFL_BUILTIN_OPTIONS(UnidirectionalSequenceLSTMOptions) +TFL_BUILTIN_OPTIONS(UnidirectionalSequenceLSTMOptions) TFL_BUILTIN_OPTIONS(FloorModOptions) TFL_BUILTIN_OPTIONS(RangeOptions) TFL_BUILTIN_OPTIONS(ResizeNearestNeighborOptions) @@ -106,3 +107,4 @@ TFL_BUILTIN_OPTIONS(RankOptions) TFL_BUILTIN_OPTIONS(ScatterNdOptions) TFL_BUILTIN_OPTIONS(SegmentSumOptions) TFL_BUILTIN_OPTIONS(BatchMatMulOptions) +TFL_BUILTIN_OPTIONS(DensifyOptions) diff --git a/compiler/tflite2circle/src/TFLModel.cpp b/compiler/tflite2circle/src/TFLModel.cpp index 33f11fb83..470b1aec7 100644 --- a/compiler/tflite2circle/src/TFLModel.cpp +++ b/compiler/tflite2circle/src/TFLModel.cpp @@ -16,6 +16,8 @@ #include <iostream> +#include <foder/FileLoader.h> + #include "TFLModel.h" namespace tflite2circle @@ -23,21 +25,21 @@ namespace tflite2circle TFLModel::TFLModel(const std::string &path) { - _infile.open(path, std::ios::binary | std::ios::in); - _valid = _infile.good(); + foder::FileLoader file_loader{path}; + _data = file_loader.load(); } -const tflite::Model *TFLModel::load_model(void) +bool TFLModel::verify_data(void) { - assert(_valid == true); - _infile.seekg(0, std::ios::end); - auto fileSize = _infile.tellg(); - _infile.seekg(0, std::ios::beg); - _data.resize(fileSize); - _infile.read(_data.data(), fileSize); - _infile.close(); - - return tflite::GetModel(_data.data()); + // verify flatbuffers + flatbuffers::Verifier verifier{reinterpret_cast<const uint8_t *>(_data.data()), _data.size()}; + if (not tflite::VerifyModelBuffer(verifier)) + { + return false; + } + return true; } +const tflite::Model *TFLModel::get_model(void) { return tflite::GetModel(_data.data()); } + } // namespace tflite2circle diff --git a/compiler/tflite2circle/src/TFLOperator.lst b/compiler/tflite2circle/src/TFLOperator.lst index 942c846c7..b7db49b0a 100644 --- a/compiler/tflite2circle/src/TFLOperator.lst +++ b/compiler/tflite2circle/src/TFLOperator.lst @@ -131,3 +131,24 @@ TFL_OPERATOR(SELECT_V2) TFL_OPERATOR(DENSIFY) TFL_OPERATOR(SEGMENT_SUM) TFL_OPERATOR(BATCH_MATMUL) +// PLACEHOLDER_FOR_GREATER_OP_CODES = 127 +TFL_OPERATOR(CUMSUM) +TFL_OPERATOR(CALL_ONCE) +TFL_OPERATOR(BROADCAST_TO) +TFL_OPERATOR(RFFT2D) +TFL_OPERATOR(CONV_3D) +TFL_OPERATOR(IMAG) +TFL_OPERATOR(REAL) +TFL_OPERATOR(COMPLEX_ABS) +TFL_OPERATOR(HASHTABLE) +TFL_OPERATOR(HASHTABLE_FIND) +TFL_OPERATOR(HASHTABLE_IMPORT) +TFL_OPERATOR(HASHTABLE_SIZE) +TFL_OPERATOR(REDUCE_ALL) +TFL_OPERATOR(CONV_3D_TRANSPOSE) +TFL_OPERATOR(VAR_HANDLE) +TFL_OPERATOR(READ_VARIABLE) +TFL_OPERATOR(ASSIGN_VARIABLE) +TFL_OPERATOR(BROADCAST_ARGS) +TFL_OPERATOR(RANDOM_STANDARD_NORMAL) +TFL_OPERATOR(GELU) |