From ca848f50a292d902b0cdd11702aebff5eb35bf8d Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EC=B1=84=EC=84=B1=EC=9A=B0/On-Device=20Lab=28SR=29/Enginee?= =?utf8?q?r/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Tue, 22 Oct 2019 10:26:38 +0900 Subject: [PATCH] [exo] Support TensorConstantPad operation (#8309) * [exo] Support TensorConstantPad operation This commit supports TensorConstantPad operation in exo. Signed-off-by: seongwoo * change vector declaration method. --- compiler/exo/src/TFLite/TFLOperationExporter.cpp | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/compiler/exo/src/TFLite/TFLOperationExporter.cpp b/compiler/exo/src/TFLite/TFLOperationExporter.cpp index 3024a79..e7edaf8 100644 --- a/compiler/exo/src/TFLite/TFLOperationExporter.cpp +++ b/compiler/exo/src/TFLite/TFLOperationExporter.cpp @@ -99,6 +99,7 @@ public: void visit(loco::EltwiseSqrt *) final; void visit(loco::FixedReshape *) final; void visit(loco::TensorBroadcast *) final; + void visit(loco::TensorConstantPad *) final; void visit(locoex::COpCall *); @@ -916,6 +917,53 @@ void OperationExporter::visit(loco::TensorBroadcast *) throw std::runtime_error("TensorBroadcast should not exist in the graph"); } +void OperationExporter::visit(loco::TensorConstantPad *node) +{ + uint32_t op_idx = gd.registerBuiltinOpcode(tflite::BuiltinOperator_PAD); + + // make padding attribute an input + auto padding = node->padding(); + // get padding vector size + int32_t padding_vec_size = padding->rank(); + // get byte size of vector + size_t padding_vec_byte_size = padding_vec_size * sizeof(int32_t) * 2; // [rank, 2] + // create vector for data + std::vector padding_vec_data(padding_vec_size * 2); + // set data + for (int32_t i = 0; i < padding_vec_size; i++) + { + padding_vec_data.at(i * 2) = padding->front(i); + padding_vec_data.at(i * 2 + 1) = padding->back(i); + } + // create FlatBuffer vector + auto padding_vec_ptr = builder.CreateVector(reinterpret_cast(padding_vec_data.data()), + padding_vec_byte_size); + + // create buffer + auto padding_buffer_ptr = CreateBuffer(builder, padding_vec_ptr); + // get buffer id + const auto padding_buffer_id = static_cast(gd._buffers.size()); + + gd._buffers.push_back(padding_buffer_ptr); + + // create padding shape vector + auto padding_shape_vec_ptr = builder.CreateVector(std::vector{padding_vec_size, 2}); + // create tensor + auto padding_tensor_ptr = + CreateTensor(builder, padding_shape_vec_ptr, TensorType_INT32, padding_buffer_id); + // get tensor id + const auto padding_tensor_id = static_cast(gd._tensors.size()); + + gd._tensors.push_back(padding_tensor_ptr); + + std::vector inputs_vec{get_tensor_index(node->input()), padding_tensor_id}; + std::vector outputs_vec{get_tensor_index(static_cast(node))}; + auto inputs = builder.CreateVector(inputs_vec); + auto outputs = builder.CreateVector(outputs_vec); + auto op_offset = CreateOperator(builder, op_idx, inputs, outputs); + gd._operators.push_back(op_offset); +} + inline flatbuffers::Offset> CreateCOpCallOptions(flatbuffers::FlatBufferBuilder &fbb, locoex::COpCall *copCall) { -- 2.7.4