#include <arm_compute/runtime/CL/functions/CLFullyConnectedLayer.h>
#include <arm_compute/runtime/CL/functions/CLSoftmaxLayer.h>
+#include "internal/kernel/acl_cl/ConcatLayer.h"
+
#include "internal/Padding.h"
#include "internal/Model.h"
Stage StageGenerator::generate(const ::internal::tflite::op::Concat::Node &node)
{
- throw std::runtime_error{"NYI - StageGenerator::generate for 'Concat'"};
+ const ::internal::tflite::operand::Index ofm_index{node.param().ofm_index};
+ const ::internal::tflite::operand::Index axis_index{node.param().axis_index};
+
+ struct Param
+ {
+ int32_t output_index;
+ std::vector<int32_t> input_indexes;
+
+ int32_t axis;
+ };
+
+ Param param;
+
+ param.output_index = node.param().ofm_index;
+ param.input_indexes = node.param().ifm_indexes;
+ param.axis = _ctx.at(axis_index).asScalar<int32_t>();
+
+ VERBOSE(Concat) << param.axis << std::endl;
- return [](IExecutionBuilder &builder) {
- // NOTE arm_compute does not have Concat operation
- // TODO Implement
+ auto tensors = _tensor_builder;
+
+ return [tensors, param](IExecutionBuilder &builder) {
+ auto output_alloc = tensors->at(::internal::tflite::operand::Index{param.output_index}).get();
+
+ std::vector<::arm_compute::ICLTensor *> input_allocs;
+ for (auto ifm_ind : param.input_indexes)
+ {
+ input_allocs.emplace_back(tensors->at(::internal::tflite::operand::Index{ifm_ind}).get());
+ }
+
+ std::unique_ptr<::internal::kernel::acl_cl::ConcatLayer> fn{
+ new ::internal::kernel::acl_cl::ConcatLayer};
+
+ fn->configure(input_allocs, param.axis, output_alloc);
+
+ builder.append(std::move(fn));
};
}