diff options
Diffstat (limited to 'compiler/circlechef')
-rw-r--r-- | compiler/circlechef/circle/CMakeLists.txt | 1 | ||||
-rw-r--r-- | compiler/circlechef/circle/src/Convert.cpp | 3 | ||||
-rw-r--r-- | compiler/circlechef/core/CMakeLists.txt | 22 | ||||
-rw-r--r-- | compiler/circlechef/core/src/Convert.cpp | 2 | ||||
-rw-r--r-- | compiler/circlechef/core/src/Convert.test.cpp | 57 | ||||
-rw-r--r-- | compiler/circlechef/core/src/ModelChef.cpp | 13 | ||||
-rw-r--r-- | compiler/circlechef/core/src/Op/BCQFullyConnected.cpp | 4 | ||||
-rw-r--r-- | compiler/circlechef/core/src/Op/BCQGather.cpp | 2 | ||||
-rw-r--r-- | compiler/circlechef/core/src/Op/BatchMatMul.cpp | 4 | ||||
-rw-r--r-- | compiler/circlechef/proto/circlechef.proto | 1 | ||||
-rw-r--r-- | compiler/circlechef/tests/short_int_datatype/test.recipe | 32 | ||||
-rw-r--r-- | compiler/circlechef/tests/short_int_datatype/test.reverse | 0 | ||||
-rw-r--r-- | compiler/circlechef/tools/console/CMakeLists.txt | 9 | ||||
-rw-r--r-- | compiler/circlechef/tools/console/Driver.cpp | 10 | ||||
-rw-r--r-- | compiler/circlechef/tools/console/Driver.test.cpp | 41 | ||||
-rw-r--r-- | compiler/circlechef/tools/file/Driver.cpp | 4 | ||||
-rw-r--r-- | compiler/circlechef/tools/reverse/Driver.cpp | 4 |
17 files changed, 187 insertions, 22 deletions
diff --git a/compiler/circlechef/circle/CMakeLists.txt b/compiler/circlechef/circle/CMakeLists.txt index 2ca016b84..98a284c30 100644 --- a/compiler/circlechef/circle/CMakeLists.txt +++ b/compiler/circlechef/circle/CMakeLists.txt @@ -5,6 +5,5 @@ target_include_directories(circlechef_circle PUBLIC include) target_include_directories(circlechef_circle PRIVATE src) target_link_libraries(circlechef_circle circlechef_proto) target_link_libraries(circlechef_circle mio_circle) -target_link_libraries(circlechef_circle stdex) target_link_libraries(circlechef_circle cwrap) target_link_libraries(circlechef_circle souschef) diff --git a/compiler/circlechef/circle/src/Convert.cpp b/compiler/circlechef/circle/src/Convert.cpp index 77614d9b5..248687fed 100644 --- a/compiler/circlechef/circle/src/Convert.cpp +++ b/compiler/circlechef/circle/src/Convert.cpp @@ -33,10 +33,11 @@ circlechef::TensorType as_circlechef_type(const circle::TensorType type) return circlechef::UINT8; case circle::TensorType_BOOL: return circlechef::BOOL; + case circle::TensorType_INT16: + return circlechef::INT16; // TODO handle other types // TensorType_FLOAT16 // TensorType_STRING - // TensorType_INT16 // TensorType_COMPLEX64 default: throw std::runtime_error{"unsupported tensor type"}; diff --git a/compiler/circlechef/core/CMakeLists.txt b/compiler/circlechef/core/CMakeLists.txt index 54b3ea53d..0e8f47483 100644 --- a/compiler/circlechef/core/CMakeLists.txt +++ b/compiler/circlechef/core/CMakeLists.txt @@ -1,9 +1,23 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") +file(GLOB_RECURSE TESTS "src/*.test.cpp") +list(REMOVE_ITEM SOURCES ${TESTS}) add_library(circlechef_core STATIC ${SOURCES}) target_include_directories(circlechef_core PUBLIC include) target_include_directories(circlechef_core PRIVATE src) -target_link_libraries(circlechef_core circlechef_proto) -target_link_libraries(circlechef_core circlechef_log) -target_link_libraries(circlechef_core mio_circle) -target_link_libraries(circlechef_core souschef) +target_link_libraries(circlechef_core PUBLIC circlechef_proto) +target_link_libraries(circlechef_core PUBLIC circlechef_log) +target_link_libraries(circlechef_core PUBLIC mio_circle) +target_link_libraries(circlechef_core PUBLIC souschef) +target_link_libraries(circlechef_core PRIVATE nncc_coverage) + +if(NOT ENABLE_TEST) + return() +endif(NOT ENABLE_TEST) + +nnas_find_package(GTest REQUIRED) + +GTest_AddTest(circlechef_core_test ${TESTS}) +target_include_directories(circlechef_core_test PRIVATE src) +target_link_libraries(circlechef_core_test circlechef_core) +target_link_libraries(circlechef_core_test nncc_coverage) diff --git a/compiler/circlechef/core/src/Convert.cpp b/compiler/circlechef/core/src/Convert.cpp index 2db0a6212..d9bbd6e50 100644 --- a/compiler/circlechef/core/src/Convert.cpp +++ b/compiler/circlechef/core/src/Convert.cpp @@ -64,6 +64,8 @@ circle::TensorType as_circle_tensortype(const circlechef::TensorType &value) return circle::TensorType_INT64; case circlechef::BOOL: return circle::TensorType_BOOL; + case circlechef::INT16: + return circle::TensorType_INT16; default: break; } diff --git a/compiler/circlechef/core/src/Convert.test.cpp b/compiler/circlechef/core/src/Convert.test.cpp new file mode 100644 index 000000000..b17f5df44 --- /dev/null +++ b/compiler/circlechef/core/src/Convert.test.cpp @@ -0,0 +1,57 @@ +/* + * 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 "Convert.h" + +#include <gtest/gtest.h> + +TEST(ConvertTest, as_circle_padding) +{ + ASSERT_EQ(circle::Padding_SAME, as_circle_padding(circlechef::SAME)); + ASSERT_EQ(circle::Padding_VALID, as_circle_padding(circlechef::VALID)); +} + +TEST(ConvertTest, as_circle_padding_NEG) +{ + EXPECT_THROW(as_circle_padding(static_cast<circlechef::Padding>(99)), std::runtime_error); +} + +TEST(ConvertTest, as_circle_activation) +{ + ASSERT_EQ(circle::ActivationFunctionType_NONE, as_circle_activation(circlechef::NONE)); + ASSERT_EQ(circle::ActivationFunctionType_RELU, as_circle_activation(circlechef::RELU)); + ASSERT_EQ(circle::ActivationFunctionType_RELU6, as_circle_activation(circlechef::RELU6)); +} + +TEST(ConvertTest, as_circle_activation_NEG) +{ + EXPECT_THROW(as_circle_activation(static_cast<circlechef::Activation>(99)), std::runtime_error); +} + +TEST(ConvertTest, as_circle_tensortype) +{ + ASSERT_EQ(circle::TensorType_FLOAT32, as_circle_tensortype(circlechef::FLOAT32)); + ASSERT_EQ(circle::TensorType_INT32, as_circle_tensortype(circlechef::INT32)); + ASSERT_EQ(circle::TensorType_UINT8, as_circle_tensortype(circlechef::UINT8)); + ASSERT_EQ(circle::TensorType_INT64, as_circle_tensortype(circlechef::INT64)); + ASSERT_EQ(circle::TensorType_BOOL, as_circle_tensortype(circlechef::BOOL)); + ASSERT_EQ(circle::TensorType_INT16, as_circle_tensortype(circlechef::INT16)); +} + +TEST(ConvertTest, as_circle_tensortype_NEG) +{ + EXPECT_THROW(as_circle_tensortype(static_cast<circlechef::TensorType>(99)), std::runtime_error); +} diff --git a/compiler/circlechef/core/src/ModelChef.cpp b/compiler/circlechef/core/src/ModelChef.cpp index 4f25d62c0..d7101f618 100644 --- a/compiler/circlechef/core/src/ModelChef.cpp +++ b/compiler/circlechef/core/src/ModelChef.cpp @@ -51,7 +51,7 @@ class GeneratedModelImpl final : public circlechef::GeneratedModel::Impl { public: GeneratedModelImpl(std::unique_ptr<flatbuffers::FlatBufferBuilder> &&builder) - : _builder{std::move(builder)} + : _builder{std::move(builder)} { // DO NOTHING } @@ -90,6 +90,7 @@ DataChefRegistry &data_chef_registry(const circlechef::TensorType &type) static DataChefRegistry fp32; static DataChefRegistry u8; static DataChefRegistry boolean; + static DataChefRegistry s16; switch (type) { @@ -103,6 +104,8 @@ DataChefRegistry &data_chef_registry(const circlechef::TensorType &type) return u8; case circlechef::BOOL: return boolean; + case circlechef::INT16: + return s16; default: break; } @@ -489,7 +492,7 @@ GeneratedModel cook(const ::circlechef::ModelRecipe &model_recipe) // Initialize Data Chef Registry #define DATA_CHEF(TYPE, NAME, FACTORY_CLASS) \ data_chef_registry(::circlechef::TYPE) \ - .add(#NAME, std::unique_ptr<FACTORY_CLASS>(new FACTORY_CLASS())); + .add(#NAME, std::unique_ptr<FACTORY_CLASS>(new FACTORY_CLASS())); #include <souschef/DataChef.def> #undef DATA_CHEF @@ -497,7 +500,7 @@ GeneratedModel cook(const ::circlechef::ModelRecipe &model_recipe) // Create FlatBufferBuilder // auto flatbuffer_builder = - std::unique_ptr<flatbuffers::FlatBufferBuilder>(new flatbuffers::FlatBufferBuilder(1024)); + std::unique_ptr<flatbuffers::FlatBufferBuilder>(new flatbuffers::FlatBufferBuilder(1024)); // Operand-related std::vector<flatbuffers::Offset<::circle::Buffer>> buffer_vec; @@ -510,7 +513,7 @@ GeneratedModel cook(const ::circlechef::ModelRecipe &model_recipe) // Create OperatorCode with Builtin Operator std::map<circle::BuiltinOperator, int32_t> builtin_code_map = - gather_builtincode_map(model_recipe); + gather_builtincode_map(model_recipe); for (auto const &opcode : builtin_code_map) { circle::OperatorCodeBuilder code_builder{*flatbuffer_builder}; @@ -592,7 +595,7 @@ GeneratedModel cook(const ::circlechef::ModelRecipe &model_recipe) // Return "GenerateModel" return GeneratedModel{ - std::unique_ptr<GeneratedModelImpl>(new GeneratedModelImpl(std::move(flatbuffer_builder)))}; + std::unique_ptr<GeneratedModelImpl>(new GeneratedModelImpl(std::move(flatbuffer_builder)))}; } } // namespace circlechef diff --git a/compiler/circlechef/core/src/Op/BCQFullyConnected.cpp b/compiler/circlechef/core/src/Op/BCQFullyConnected.cpp index 4c82c52cc..497cbb86b 100644 --- a/compiler/circlechef/core/src/Op/BCQFullyConnected.cpp +++ b/compiler/circlechef/core/src/Op/BCQFullyConnected.cpp @@ -26,9 +26,9 @@ flatbuffers::Offset<void> BCQFullyConnectedChef::value(flatbuffers::FlatBufferBu circle::BCQFullyConnectedOptionsBuilder bcq_fully_connected_options_builder{fbb}; bcq_fully_connected_options_builder.add_weights_hidden_size( - operation.bcq_fully_connected_options().weights_hidden_size()); + operation.bcq_fully_connected_options().weights_hidden_size()); bcq_fully_connected_options_builder.add_fused_activation_function( - as_circle_activation(operation.bcq_fully_connected_options().activation())); + as_circle_activation(operation.bcq_fully_connected_options().activation())); return bcq_fully_connected_options_builder.Finish().Union(); } diff --git a/compiler/circlechef/core/src/Op/BCQGather.cpp b/compiler/circlechef/core/src/Op/BCQGather.cpp index 08f6f611f..3b343ee66 100644 --- a/compiler/circlechef/core/src/Op/BCQGather.cpp +++ b/compiler/circlechef/core/src/Op/BCQGather.cpp @@ -24,7 +24,7 @@ flatbuffers::Offset<void> BCQGatherChef::value(flatbuffers::FlatBufferBuilder &f circle::BCQGatherOptionsBuilder bcq_gather_options_builder{fbb}; bcq_gather_options_builder.add_input_hidden_size( - operation.bcq_gather_options().input_hidden_size()); + operation.bcq_gather_options().input_hidden_size()); bcq_gather_options_builder.add_axis(operation.bcq_gather_options().axis()); return bcq_gather_options_builder.Finish().Union(); diff --git a/compiler/circlechef/core/src/Op/BatchMatMul.cpp b/compiler/circlechef/core/src/Op/BatchMatMul.cpp index d98c0801a..645571abe 100644 --- a/compiler/circlechef/core/src/Op/BatchMatMul.cpp +++ b/compiler/circlechef/core/src/Op/BatchMatMul.cpp @@ -24,9 +24,9 @@ flatbuffers::Offset<void> BatchMatMulChef::value(flatbuffers::FlatBufferBuilder circle::BatchMatMulOptionsBuilder batch_matmul_options_options_builder{fbb}; batch_matmul_options_options_builder.add_adjoint_lhs( - operation.batch_matmul_options().adjoint_lhs()); + operation.batch_matmul_options().adjoint_lhs()); batch_matmul_options_options_builder.add_adjoint_rhs( - operation.batch_matmul_options().adjoint_rhs()); + operation.batch_matmul_options().adjoint_rhs()); return batch_matmul_options_options_builder.Finish().Union(); } diff --git a/compiler/circlechef/proto/circlechef.proto b/compiler/circlechef/proto/circlechef.proto index 83d2dfe9c..1c14b97ff 100644 --- a/compiler/circlechef/proto/circlechef.proto +++ b/compiler/circlechef/proto/circlechef.proto @@ -19,6 +19,7 @@ enum TensorType { UINT8 = 3; INT64 = 4; BOOL = 6; + INT16 = 7; } message TensorShape { diff --git a/compiler/circlechef/tests/short_int_datatype/test.recipe b/compiler/circlechef/tests/short_int_datatype/test.recipe new file mode 100644 index 000000000..e0f582527 --- /dev/null +++ b/compiler/circlechef/tests/short_int_datatype/test.recipe @@ -0,0 +1,32 @@ +operand { + name: "ifm1" + type: INT16 + shape { dim: 1 dim: 4 dim: 4 dim: 3 } +} +operand { + name: "constant" + type: INT16 + shape { dim: 1 dim: 4 dim: 3 dim: 4 } + filler { + tag: "gaussian" + arg: "3.0" + arg: "10.0" + } +} +operand { + name: "ofm" + type: INT16 + shape { dim: 1 dim: 4 dim: 4 dim: 4 } +} +operation { + type: "BatchMatMul" + input: "ifm1" + input: "constant" + output: "ofm" + batch_matmul_options { + adjoint_lhs: false + adjoint_rhs: false + } +} +input: "ifm1" +output: "ofm" diff --git a/compiler/circlechef/tests/short_int_datatype/test.reverse b/compiler/circlechef/tests/short_int_datatype/test.reverse new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/compiler/circlechef/tests/short_int_datatype/test.reverse diff --git a/compiler/circlechef/tools/console/CMakeLists.txt b/compiler/circlechef/tools/console/CMakeLists.txt index 10168fca3..faf0a94f0 100644 --- a/compiler/circlechef/tools/console/CMakeLists.txt +++ b/compiler/circlechef/tools/console/CMakeLists.txt @@ -1,3 +1,12 @@ add_executable(circlechef Driver.cpp) target_link_libraries(circlechef circlechef_core) target_link_libraries(circlechef safemain) + +if(NOT ENABLE_TEST) + return() +endif(NOT ENABLE_TEST) + +nnas_find_package(GTest REQUIRED) + +GTest_AddTest(circlechef_test Driver.test.cpp Driver.cpp) +target_link_libraries(circlechef_test circlechef_core) diff --git a/compiler/circlechef/tools/console/Driver.cpp b/compiler/circlechef/tools/console/Driver.cpp index 0909f5927..6aa4c3cc5 100644 --- a/compiler/circlechef/tools/console/Driver.cpp +++ b/compiler/circlechef/tools/console/Driver.cpp @@ -22,7 +22,7 @@ #include <iostream> -int entry(int argc, char **argv) +int entry_stream(std::istream &is) { int32_t model_version = 1; @@ -30,7 +30,7 @@ int entry(int argc, char **argv) // Read a model recipe from standard input { - google::protobuf::io::IstreamInputStream iis{&std::cin}; + google::protobuf::io::IstreamInputStream iis{&is}; if (!google::protobuf::TextFormat::Parse(&iis, &model_recipe)) { std::cerr << "ERROR: Failed to parse recipe" << std::endl; @@ -56,3 +56,9 @@ int entry(int argc, char **argv) return 0; } + +int entry(int, char **) +{ + // forward to entry_stream + return entry_stream(std::cin); +} diff --git a/compiler/circlechef/tools/console/Driver.test.cpp b/compiler/circlechef/tools/console/Driver.test.cpp new file mode 100644 index 000000000..d8e4e657e --- /dev/null +++ b/compiler/circlechef/tools/console/Driver.test.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 <gtest/gtest.h> + +// entry function to test from Driver.cpp +int entry_stream(std::istream &is); + +TEST(CircleChefDriverTest, entry_empty_NEG) +{ + std::istringstream empty_input(""); + + ASSERT_EQ(0, entry_stream(empty_input)); +} + +TEST(CircleChefDriverTest, entry_invaid_NEG) +{ + std::istringstream empty_input("invalid: input"); + + ASSERT_NE(0, entry_stream(empty_input)); +} + +TEST(CircleChefDriverTest, entry_invaid_version_NEG) +{ + std::istringstream empty_input("version: 9999"); + + ASSERT_NE(0, entry_stream(empty_input)); +} diff --git a/compiler/circlechef/tools/file/Driver.cpp b/compiler/circlechef/tools/file/Driver.cpp index bcc0c7ae9..76d0f3f7f 100644 --- a/compiler/circlechef/tools/file/Driver.cpp +++ b/compiler/circlechef/tools/file/Driver.cpp @@ -29,8 +29,8 @@ int entry(int argc, char **argv) { arser::Arser arser; arser.add_argument("recipe") - .type(arser::DataType::STR) - .help("Source recipe file path to convert"); + .type(arser::DataType::STR) + .help("Source recipe file path to convert"); arser.add_argument("circle").type(arser::DataType::STR).help("Target circle file path"); try diff --git a/compiler/circlechef/tools/reverse/Driver.cpp b/compiler/circlechef/tools/reverse/Driver.cpp index 8a2b85fc7..639e0af6f 100644 --- a/compiler/circlechef/tools/reverse/Driver.cpp +++ b/compiler/circlechef/tools/reverse/Driver.cpp @@ -26,8 +26,8 @@ int entry(int argc, char **argv) { arser::Arser arser; arser.add_argument("circle") - .type(arser::DataType::STR) - .help("Source circle file path to convert"); + .type(arser::DataType::STR) + .help("Source circle file path to convert"); arser.add_argument("recipe").type(arser::DataType::STR).help("Target recipe file path"); try |