12{
13 auto numInputs = inputs.size();
14 std::vector<std::string> inputNames;
15 inputNames.reserve(numInputs);
16 std::string outputName = std::string("output0_");
18
19
20 if (layer == nullptr)
21 {
22 for (uint32_t i = 0; i < numInputs; ++i)
23 {
24 inputNames.push_back("input_"+ std::to_string(i));
25 }
26 }
27
28
29 else
30 {
31
32 for (uint32_t i = 0; i < numInputs; ++i)
33 {
35 inputNames.push_back(inputName);
36 }
37
38
40 }
41
42 auto axis =
static_cast<int32_t
>(concatDescriptor->
GetConcatAxis());
43 TosaAxisAttribute attribute(axis);
44
45 TosaSerializationOperator* op = new TosaSerializationOperator(Op_CONCAT,
46 Attribute_AxisAttribute,
47 &attribute,
48 inputNames,
49 {outputName});
50
51 std::vector<TosaSerializationTensor*> tensors;
52 tensors.reserve(numInputs + 1);
53 for (uint32_t i = 0; i < numInputs; ++i)
54 {
55
56
57 if(inputNames[i].find("input") != std::string::npos)
58 {
60 DType inputDType =
ArmNNToDType(inputs[i]->GetDataType());
61 tensors.push_back(new TosaSerializationTensor(inputNames[i], inputShape, inputDType, {}));
62 }
63 }
64
66 DType outputDType0 =
ArmNNToDType(outputs[0]->GetDataType());
67
68 TosaSerializationTensor* outputTensor0 = new TosaSerializationTensor(outputName, outputShape0, outputDType0, {});
69 tensors.push_back(outputTensor0);
70
71
72
73 return new TosaSerializationBasicBlock(blockName,
75 {op},
76 tensors,
77 inputNames,
78 {outputName});
79}
std::string GenerateUniqueOutputName(const Layer &layer, uint32_t layerSlot=0)
const std::string mainName
DType ArmNNToDType(const DataType &type)
std::string GenerateUniqueInputName(const armnn::InputSlot &slot)
std::string GetUniqueTosaMappingID()
std::vector< int32_t > GetTosaTensorShape(const TensorShape &shape)
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
unsigned int GetConcatAxis() const
Get the concatenation axis value.