blob: 2f5a56d88d603b9566f78dba9e6f75fdc4715416 [file] [log] [blame]
Cathal Corbett9c9d5b92022-08-17 17:30:16 +01001//
2// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include <Layer.hpp>
7
8#include <tosaCommon/TosaMappings.hpp>
9
10#include <doctest/doctest.h>
11
12using namespace armnn;
13using namespace tosa;
14
15void AssertTosaOneToOneMappingBasicBlock(TosaSerializationBasicBlock* basicBlock,
16 std::vector<int32_t> shape,
17 uint32_t numInputs,
18 uint32_t numOutputs,
19 Op tosaOp,
20 std::string operatorString,
21 DType dataType = DType_FLOAT)
22{
23 std::string blockStr = operatorString + "_block_";
24 ARMNN_ASSERT(basicBlock->GetName().find(blockStr) != std::string::npos);
25 ARMNN_ASSERT(basicBlock->GetInputs().size() == numInputs);
26 ARMNN_ASSERT(basicBlock->GetOutputs().size() == numOutputs);
27 ARMNN_ASSERT(basicBlock->GetOperators().size() == 1);
28 ARMNN_ASSERT(basicBlock->GetTensors().size() == (numInputs + numOutputs));
29
30 TosaSerializationOperator* op = basicBlock->GetOperators().at(0);
31 ARMNN_ASSERT(op->GetInputTensorNames().size() == numInputs);
32 ARMNN_ASSERT(op->GetOutputTensorNames().size() == numOutputs);
33
34 for (uint32_t i = 0; i < numInputs; i++)
35 {
36 std::basic_string<char> blockInputName = basicBlock->GetInputs()[i];
37 std::basic_string<char> operatorInputName = op->GetInputTensorNames()[i];
38 std::basic_string<char> tensorName = basicBlock->GetTensors()[i]->GetName();
39
40 std::string opStr = operatorString + "_input" + std::to_string(i) + "_";
41
42 ARMNN_ASSERT(blockInputName == operatorInputName);
43 ARMNN_ASSERT(tensorName == operatorInputName);
44 ARMNN_ASSERT(blockInputName.find(opStr) != std::string::npos);
45 }
46
47 for (uint32_t i = 0; i < numOutputs; i++)
48 {
49 std::basic_string<char> blockOutputName = basicBlock->GetOutputs()[i];
50 std::basic_string<char> operatorOutputName = op->GetOutputTensorNames()[i];
51 std::basic_string<char> tensorName = basicBlock->GetTensors()[numInputs + i]->GetName();
52
53 std::string opStr = operatorString + "_output" + std::to_string(i) + "_";
54
55 ARMNN_ASSERT(blockOutputName == operatorOutputName);
56 ARMNN_ASSERT(tensorName == operatorOutputName);
57 ARMNN_ASSERT(blockOutputName.find(opStr) != std::string::npos);
58 }
59
60 ARMNN_ASSERT(op->GetAttributeType() == Attribute_NONE);
61 ARMNN_ASSERT(op->GetOp() == tosaOp);
62
63 TosaSerializationTensor* tensor0 = basicBlock->GetTensors()[0];
64 ARMNN_ASSERT(tensor0->GetDtype() == dataType);
65 ARMNN_ASSERT(tensor0->GetData().size() == 0);
66 ARMNN_ASSERT(tensor0->GetShape() == shape);
67}
68
69TEST_SUITE("TosaOperatorMappingOneToOneTests")
70{
71TEST_CASE("GetTosaMapping_AdditionLayer")
72{
73 TensorInfo info = TensorInfo({ 1, 2, 4, 2 }, DataType::Float32, 0.0f, 0, true);
74 TosaSerializationBasicBlock* basicBlock =
75 GetTosaMapping(LayerType::Addition, {&info, &info}, {&info}, BaseDescriptor());
76 AssertTosaOneToOneMappingBasicBlock(basicBlock, { 1, 2, 4, 2 }, 2, 1, Op::Op_ADD, "Op_ADD");
77}
78
79TEST_CASE("GetTosaMappingFromLayer_AdditionLayer")
80{
81 IRuntime::CreationOptions options;
82 IRuntimePtr runtime(IRuntime::Create(options));
83
84 // Builds up the structure of the network.
85 INetworkPtr net(INetwork::Create());
86
87 IConnectableLayer* input0 = net->AddInputLayer(0, "input0");
88 IConnectableLayer* input1 = net->AddInputLayer(1, "input1");
89 IConnectableLayer* add = net->AddAdditionLayer("add");
90 IConnectableLayer* output = net->AddOutputLayer(0, "output");
91
92 input0->GetOutputSlot(0).Connect(add->GetInputSlot(0));
93 input1->GetOutputSlot(0).Connect(add->GetInputSlot(1));
94 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
95
96 TensorInfo info = TensorInfo({ 1, 2, 4, 2 }, DataType::Float32, 0.0f, 0, true);
97
98 input0->GetOutputSlot(0).SetTensorInfo(info);
99 input1->GetOutputSlot(0).SetTensorInfo(info);
100 add->GetOutputSlot(0).SetTensorInfo(info);
101
102 TosaSerializationBasicBlock* basicBlock =
103 GetTosaMappingFromLayer(PolymorphicDowncast<Layer*>(add));
104 AssertTosaOneToOneMappingBasicBlock(basicBlock, { 1, 2, 4, 2 }, 2, 1, Op::Op_ADD, "Op_ADD");
105}
106
107TEST_CASE("GetTosaMapping_Unimplemented")
108{
109 TosaSerializationBasicBlock* basicBlock =
110 GetTosaMapping(LayerType::UnidirectionalSequenceLstm, {}, {}, BaseDescriptor());
111
112 ARMNN_ASSERT(basicBlock->GetName() == "");
113 ARMNN_ASSERT(basicBlock->GetTensors().size() == 0);
114 ARMNN_ASSERT(basicBlock->GetOperators().size() == 1);
115 ARMNN_ASSERT(basicBlock->GetInputs().size() == 0);
116 ARMNN_ASSERT(basicBlock->GetOutputs().size() == 0);
117
118 TosaSerializationOperator* op = basicBlock->GetOperators()[0];
119 ARMNN_ASSERT(op->GetAttributeType() == Attribute_NONE);
120 ARMNN_ASSERT(op->GetOp() == tosa::Op_UNKNOWN);
121 ARMNN_ASSERT(op->GetInputTensorNames().size() == 0);
122 ARMNN_ASSERT(op->GetOutputTensorNames().size() == 0);
123}
124}