18{
20 "ConvertSplitToTosaOperator: Split must have only one input" );
21
23 "ConvertSplitToTosaOperator: Split must have at least one output" );
24
25 if (!inputs[0]->GetShape().AreAllDimensionsSpecified())
26 {
27 throw armnn::Exception(
"ConvertSplitToTosaOperator: Dynamic input dimensions are unsupported.");
28 }
29
30 std::string inputName = std::string("input_");
31 std::vector<std::string> outputNames;
33
34 unsigned int numSplit = splitDescriptor->
GetNumViews();
35
36
37 if(layer != nullptr)
38 {
40
41 for (unsigned int i=0; i < numSplit; ++i)
42 {
43
45 outputNames.push_back(outputName);
46 }
47 }
48 else
49 {
50 for (unsigned int i=0; i < numSplit; ++i)
51 {
52
53 std::string outputName = "output" + std::to_string(i) + "_";
54 outputNames.push_back(outputName);
55 }
56 }
57
58
59 std::set<unsigned int> splitAxis =
ComputeSplitAxis(*splitDescriptor, inputs[0]->GetShape());
60 if (splitAxis.size() != 1)
61 {
63 }
64 uint32_t axis = *splitAxis.begin();
65
66 std::vector<TosaSerializationOperator*> ops;
67 std::vector<int32_t> beginVals(inputs[0]->GetNumDimensions(), 0);
68 for (unsigned int i = 0; i < numSplit; ++i)
69 {
71 TosaSliceAttribute attribute(beginVals, sizeVals);
72 auto* op = new TosaSerializationOperator(Op_SLICE,
73 Attribute_SliceAttribute,
74 &attribute,
75 {inputName},
76 {outputNames[i]});
77
78 ops.push_back(op);
79
80
81 beginVals[axis] += sizeVals[axis];
82 }
83
84 std::vector<TosaSerializationTensor*> tensors;
85
86
87
88 if(inputName.find("input_") != std::string::npos)
89 {
91 DType inputDType =
ArmNNToDType(inputs[0]->GetDataType());
92
93 tensors.push_back(new TosaSerializationTensor(inputName, inputShape, inputDType, {}));
94 }
95
96 DType outputDType =
ArmNNToDType(outputs[0]->GetDataType());
97 for (unsigned int i = 0; i < numSplit; ++i)
98 {
100 tensors.push_back(new TosaSerializationTensor(outputNames[i], outputShape, outputDType, {}));
101 }
102
103
104
105 return new TosaSerializationBasicBlock(blockName,
107 ops,
108 tensors,
109 {inputName},
110 outputNames);
111}
#define ARMNN_THROW_INVALIDARG_MSG_IF_FALSE(_cond, _str)
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)
Base class for all ArmNN exceptions so that users can filter to just those.
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
std::set< unsigned int > ComputeSplitAxis(const armnn::SplitterDescriptor &desc, const TensorShape &input)
Calculates the axis values for split operation.
uint32_t GetNumViews() const
Get the number of views.