summaryrefslogtreecommitdiff
path: root/compiler/tflchef/tools
diff options
context:
space:
mode:
authorChunseok Lee <chunseok.lee@samsung.com>2020-04-23 14:45:49 +0900
committerChunseok Lee <chunseok.lee@samsung.com>2020-04-23 14:45:49 +0900
commite2ef8438a24f7c56a0744eb579a6e293ee2fbf8e (patch)
tree44a1a7951d168dd4370e13593ed03f4bc6d920c5 /compiler/tflchef/tools
parent302e6564a7a76109e1178207e44e45a58631c477 (diff)
downloadnnfw-e2ef8438a24f7c56a0744eb579a6e293ee2fbf8e.tar.gz
nnfw-e2ef8438a24f7c56a0744eb579a6e293ee2fbf8e.tar.bz2
nnfw-e2ef8438a24f7c56a0744eb579a6e293ee2fbf8e.zip
Imported Upstream version 1.4.0upstream/1.4.0submit/tizen/20200423.054851
Diffstat (limited to 'compiler/tflchef/tools')
-rw-r--r--compiler/tflchef/tools/CMakeLists.txt6
-rw-r--r--compiler/tflchef/tools/console/CMakeLists.txt3
-rw-r--r--compiler/tflchef/tools/console/Driver.cpp58
-rw-r--r--compiler/tflchef/tools/file/CMakeLists.txt3
-rw-r--r--compiler/tflchef/tools/file/Driver.cpp72
-rw-r--r--compiler/tflchef/tools/reverse/CMakeLists.txt3
-rw-r--r--compiler/tflchef/tools/reverse/Driver.cpp64
7 files changed, 209 insertions, 0 deletions
diff --git a/compiler/tflchef/tools/CMakeLists.txt b/compiler/tflchef/tools/CMakeLists.txt
new file mode 100644
index 000000000..92e3a6e6e
--- /dev/null
+++ b/compiler/tflchef/tools/CMakeLists.txt
@@ -0,0 +1,6 @@
+# Console-based tool (tflchef)
+add_subdirectory(console)
+# File-based tool (tflchef-file)
+add_subdirectory(file)
+# Reverse tool to generate recipe from tflite (tflchef-reverse)
+add_subdirectory(reverse)
diff --git a/compiler/tflchef/tools/console/CMakeLists.txt b/compiler/tflchef/tools/console/CMakeLists.txt
new file mode 100644
index 000000000..d9160c3a2
--- /dev/null
+++ b/compiler/tflchef/tools/console/CMakeLists.txt
@@ -0,0 +1,3 @@
+add_executable(tflchef Driver.cpp)
+target_link_libraries(tflchef tflchef_core)
+target_link_libraries(tflchef safemain)
diff --git a/compiler/tflchef/tools/console/Driver.cpp b/compiler/tflchef/tools/console/Driver.cpp
new file mode 100644
index 000000000..d6f7ba1ae
--- /dev/null
+++ b/compiler/tflchef/tools/console/Driver.cpp
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2018 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 "tflchef/ModelChef.h"
+
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/text_format.h>
+
+#include <iostream>
+
+int entry(int argc, char **argv)
+{
+ int32_t model_version = 1;
+
+ ::tflchef::ModelRecipe model_recipe;
+
+ // Read a model recipe from standard input
+ {
+ google::protobuf::io::IstreamInputStream iis{&std::cin};
+ if (!google::protobuf::TextFormat::Parse(&iis, &model_recipe))
+ {
+ std::cerr << "ERROR: Failed to parse recipe" << std::endl;
+ return 255;
+ }
+
+ if (model_recipe.has_version())
+ {
+ model_version = model_recipe.version();
+ }
+ }
+
+ if (model_version > 1)
+ {
+ std::cerr << "ERROR: Unsupported recipe version: " << model_version << std::endl;
+ return 255;
+ }
+
+ auto generated_model = tflchef::cook(model_recipe);
+
+ // Write a generated model into standard output
+ std::cout.write(generated_model.base(), generated_model.size());
+
+ return 0;
+}
diff --git a/compiler/tflchef/tools/file/CMakeLists.txt b/compiler/tflchef/tools/file/CMakeLists.txt
new file mode 100644
index 000000000..477b7d974
--- /dev/null
+++ b/compiler/tflchef/tools/file/CMakeLists.txt
@@ -0,0 +1,3 @@
+add_executable(tflchef-file Driver.cpp)
+target_link_libraries(tflchef-file tflchef_core)
+target_link_libraries(tflchef-file safemain)
diff --git a/compiler/tflchef/tools/file/Driver.cpp b/compiler/tflchef/tools/file/Driver.cpp
new file mode 100644
index 000000000..3ef701910
--- /dev/null
+++ b/compiler/tflchef/tools/file/Driver.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2018 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 "tflchef/ModelChef.h"
+
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/text_format.h>
+
+#include <fstream>
+#include <iostream>
+
+int entry(int argc, char **argv)
+{
+ if (argc != 3)
+ {
+ std::cerr << "ERROR: Failed to parse arguments" << std::endl;
+ std::cerr << std::endl;
+ std::cerr << "USAGE: " << argv[0] << " [recipe] [output]" << std::endl;
+ return 255;
+ }
+
+ int32_t model_version = 1;
+
+ ::tflchef::ModelRecipe model_recipe;
+
+ // Load model recipe from a file
+ {
+ std::ifstream is{argv[1]};
+ google::protobuf::io::IstreamInputStream iis{&is};
+ if (!google::protobuf::TextFormat::Parse(&iis, &model_recipe))
+ {
+ std::cerr << "ERROR: Failed to parse recipe '" << argv[1] << "'" << std::endl;
+ return 255;
+ }
+
+ if (model_recipe.has_version())
+ {
+ model_version = model_recipe.version();
+ }
+ }
+
+ if (model_version > 1)
+ {
+ std::cerr << "ERROR: Unsupported recipe version: " << model_version << ", '" << argv[1] << "'"
+ << std::endl;
+ return 255;
+ }
+
+ auto generated_model = tflchef::cook(model_recipe);
+
+ // Dump generated model into a file
+ {
+ std::ofstream os{argv[2], std::ios::binary};
+ os.write(generated_model.base(), generated_model.size());
+ }
+
+ return 0;
+}
diff --git a/compiler/tflchef/tools/reverse/CMakeLists.txt b/compiler/tflchef/tools/reverse/CMakeLists.txt
new file mode 100644
index 000000000..63cb36c06
--- /dev/null
+++ b/compiler/tflchef/tools/reverse/CMakeLists.txt
@@ -0,0 +1,3 @@
+add_executable(tflchef-reverse Driver.cpp)
+target_link_libraries(tflchef-reverse tflchef_tflite)
+target_link_libraries(tflchef-reverse safemain)
diff --git a/compiler/tflchef/tools/reverse/Driver.cpp b/compiler/tflchef/tools/reverse/Driver.cpp
new file mode 100644
index 000000000..549756463
--- /dev/null
+++ b/compiler/tflchef/tools/reverse/Driver.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2018 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 <tflchef/RawModel.h>
+#include <tflchef/RecipeChef.h>
+
+#include <memory>
+#include <iostream>
+
+int entry(int argc, char **argv)
+{
+ if (argc != 3)
+ {
+ std::cerr << "ERROR: Failed to parse arguments" << std::endl;
+ std::cerr << std::endl;
+ std::cerr << "USAGE: " << argv[0] << " [tflite] [output]" << std::endl;
+ return 255;
+ }
+
+ // Load TF lite model from a tflite file
+ std::unique_ptr<tflchef::RawModel> rawmodel = tflchef::load_tflite(argv[1]);
+ if (rawmodel == nullptr)
+ {
+ std::cerr << "ERROR: Failed to load tflite '" << argv[1] << "'" << std::endl;
+ return 255;
+ }
+
+ const tflite::Model *tflmodel = rawmodel->model();
+ if (tflmodel == nullptr)
+ {
+ std::cerr << "ERROR: Failed to load tflite '" << argv[1] << "'" << std::endl;
+ return 255;
+ }
+
+ // Generate ModelRecipe recipe
+ std::unique_ptr<tflchef::ModelRecipe> recipe = tflchef::generate_recipe(tflmodel);
+ if (recipe.get() == nullptr)
+ {
+ std::cerr << "ERROR: Failed to generate recipe" << std::endl;
+ return 255;
+ }
+
+ // Save to a file
+ bool result = tflchef::write_recipe(argv[2], recipe);
+ if (!result)
+ {
+ std::cerr << "ERROR: Failed to write to recipe '" << argv[2] << "'" << std::endl;
+ return 255;
+ }
+ return 0;
+}