1 /*
2  * SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates <open-source-office@arm.com>
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Licensed under the Apache License, Version 2.0 (the License); you may
7  * not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #include <stdlib.h>
20 
21 #include <arm_nnfunctions.h>
22 #include <unity.h>
23 
24 #include "../TestData/transpose_3dim/test_data.h"
25 #include "../TestData/transpose_3dim2/test_data.h"
26 #include "../TestData/transpose_chwn/test_data.h"
27 #include "../TestData/transpose_default/test_data.h"
28 #include "../TestData/transpose_matrix/test_data.h"
29 #include "../TestData/transpose_nchw/test_data.h"
30 #include "../TestData/transpose_ncwh/test_data.h"
31 #include "../TestData/transpose_nhcw/test_data.h"
32 #include "../TestData/transpose_nwhc/test_data.h"
33 #include "../TestData/transpose_wchn/test_data.h"
34 #include "../Utils/validate.h"
35 
transpose_default_arm_transpose_s8(void)36 void transpose_default_arm_transpose_s8(void)
37 {
38     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
39     int8_t output_data[TRANSPOSE_DEFAULT_SIZE] = {0};
40     int8_t *output_ptr = output_data;
41 
42     const cmsis_nn_dims input_dims = TRANSPOSE_DEFAULT_IN_DIM;
43     const cmsis_nn_dims output_dims = TRANSPOSE_DEFAULT_OUT_DIM;
44 
45     const int8_t *input_data = transpose_default_input_tensor;
46     const int8_t *const output_ref = transpose_default_output;
47     const int32_t output_ref_size = TRANSPOSE_DEFAULT_SIZE;
48 
49     const uint32_t perm[TRANSPOSE_DEFAULT_PERM_SIZE] = TRANSPOSE_DEFAULT_PERM;
50     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_DEFAULT_PERM_SIZE, perm};
51 
52     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
53 
54     TEST_ASSERT_EQUAL(expected, result);
55     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
56 }
57 
transpose_nhcw_arm_transpose_s8(void)58 void transpose_nhcw_arm_transpose_s8(void)
59 {
60     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
61     int8_t output_data[TRANSPOSE_NHCW_SIZE] = {0};
62     int8_t *output_ptr = output_data;
63 
64     const cmsis_nn_dims input_dims = TRANSPOSE_NHCW_IN_DIM;
65     const cmsis_nn_dims output_dims = TRANSPOSE_NHCW_OUT_DIM;
66 
67     const int8_t *input_data = transpose_nhcw_input_tensor;
68     const int8_t *const output_ref = transpose_nhcw_output;
69     const int32_t output_ref_size = TRANSPOSE_NHCW_SIZE;
70 
71     const uint32_t perm[TRANSPOSE_NHCW_PERM_SIZE] = TRANSPOSE_NHCW_PERM;
72     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_NHCW_PERM_SIZE, perm};
73 
74     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
75 
76     TEST_ASSERT_EQUAL(expected, result);
77     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
78 }
79 
transpose_wchn_arm_transpose_s8(void)80 void transpose_wchn_arm_transpose_s8(void)
81 {
82     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
83     int8_t output_data[TRANSPOSE_WCHN_SIZE] = {0};
84     int8_t *output_ptr = output_data;
85 
86     const cmsis_nn_dims input_dims = TRANSPOSE_WCHN_IN_DIM;
87     const cmsis_nn_dims output_dims = TRANSPOSE_WCHN_OUT_DIM;
88 
89     const int8_t *input_data = transpose_wchn_input_tensor;
90     const int8_t *const output_ref = transpose_wchn_output;
91     const int32_t output_ref_size = TRANSPOSE_WCHN_SIZE;
92 
93     const uint32_t perm[TRANSPOSE_WCHN_PERM_SIZE] = TRANSPOSE_WCHN_PERM;
94     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_WCHN_PERM_SIZE, perm};
95 
96     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
97 
98     TEST_ASSERT_EQUAL(expected, result);
99     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
100 }
101 
transpose_nchw_arm_transpose_s8(void)102 void transpose_nchw_arm_transpose_s8(void)
103 {
104     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
105     int8_t output_data[TRANSPOSE_NCHW_SIZE] = {0};
106     int8_t *output_ptr = output_data;
107 
108     const cmsis_nn_dims input_dims = TRANSPOSE_NCHW_IN_DIM;
109     const cmsis_nn_dims output_dims = TRANSPOSE_NCHW_OUT_DIM;
110 
111     const int8_t *input_data = transpose_nchw_input_tensor;
112     const int8_t *const output_ref = transpose_nchw_output;
113     const int32_t output_ref_size = TRANSPOSE_NCHW_SIZE;
114 
115     const uint32_t perm[TRANSPOSE_NCHW_PERM_SIZE] = TRANSPOSE_NCHW_PERM;
116     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_NCHW_PERM_SIZE, perm};
117 
118     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
119 
120     TEST_ASSERT_EQUAL(expected, result);
121     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
122 }
123 
transpose_chwn_arm_transpose_s8(void)124 void transpose_chwn_arm_transpose_s8(void)
125 {
126     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
127     int8_t output_data[TRANSPOSE_CHWN_SIZE] = {0};
128     int8_t *output_ptr = output_data;
129 
130     const cmsis_nn_dims input_dims = TRANSPOSE_CHWN_IN_DIM;
131     const cmsis_nn_dims output_dims = TRANSPOSE_CHWN_OUT_DIM;
132 
133     const int8_t *input_data = transpose_chwn_input_tensor;
134     const int8_t *const output_ref = transpose_chwn_output;
135     const int32_t output_ref_size = TRANSPOSE_CHWN_SIZE;
136 
137     const uint32_t perm[TRANSPOSE_CHWN_PERM_SIZE] = TRANSPOSE_CHWN_PERM;
138     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_CHWN_PERM_SIZE, perm};
139 
140     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
141 
142     TEST_ASSERT_EQUAL(expected, result);
143     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
144 }
145 
transpose_matrix_arm_transpose_s8(void)146 void transpose_matrix_arm_transpose_s8(void)
147 {
148     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
149     int8_t output_data[TRANSPOSE_MATRIX_SIZE] = {0};
150     int8_t *output_ptr = output_data;
151 
152     const cmsis_nn_dims input_dims = TRANSPOSE_MATRIX_IN_DIM;
153     const cmsis_nn_dims output_dims = TRANSPOSE_MATRIX_OUT_DIM;
154 
155     const int8_t *input_data = transpose_matrix_input_tensor;
156     const int8_t *const output_ref = transpose_matrix_output;
157     const int32_t output_ref_size = TRANSPOSE_MATRIX_SIZE;
158 
159     const uint32_t perm[TRANSPOSE_MATRIX_PERM_SIZE] = TRANSPOSE_MATRIX_PERM;
160     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_MATRIX_PERM_SIZE, perm};
161 
162     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
163 
164     TEST_ASSERT_EQUAL(expected, result);
165     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
166 }
167 
transpose_ncwh_arm_transpose_s8(void)168 void transpose_ncwh_arm_transpose_s8(void)
169 {
170     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
171     int8_t output_data[TRANSPOSE_NCWH_SIZE] = {0};
172     int8_t *output_ptr = output_data;
173 
174     const cmsis_nn_dims input_dims = TRANSPOSE_NCWH_IN_DIM;
175     const cmsis_nn_dims output_dims = TRANSPOSE_NCWH_OUT_DIM;
176 
177     const int8_t *input_data = transpose_ncwh_input_tensor;
178     const int8_t *const output_ref = transpose_ncwh_output;
179     const int32_t output_ref_size = TRANSPOSE_NCWH_SIZE;
180 
181     const uint32_t perm[TRANSPOSE_NCWH_PERM_SIZE] = TRANSPOSE_NCWH_PERM;
182     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_NCWH_PERM_SIZE, perm};
183 
184     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
185 
186     TEST_ASSERT_EQUAL(expected, result);
187     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
188 }
189 
transpose_nwhc_arm_transpose_s8(void)190 void transpose_nwhc_arm_transpose_s8(void)
191 {
192     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
193     int8_t output_data[TRANSPOSE_NWHC_SIZE] = {0};
194     int8_t *output_ptr = output_data;
195 
196     const cmsis_nn_dims input_dims = TRANSPOSE_NWHC_IN_DIM;
197     const cmsis_nn_dims output_dims = TRANSPOSE_NWHC_OUT_DIM;
198 
199     const int8_t *input_data = transpose_nwhc_input_tensor;
200     const int8_t *const output_ref = transpose_nwhc_output;
201     const int32_t output_ref_size = TRANSPOSE_NWHC_SIZE;
202 
203     const uint32_t perm[TRANSPOSE_NWHC_PERM_SIZE] = TRANSPOSE_NWHC_PERM;
204     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_NWHC_PERM_SIZE, perm};
205 
206     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
207 
208     TEST_ASSERT_EQUAL(expected, result);
209     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
210 }
211 
transpose_3dim_arm_transpose_s8(void)212 void transpose_3dim_arm_transpose_s8(void)
213 {
214     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
215     int8_t output_data[TRANSPOSE_3DIM_SIZE] = {0};
216     int8_t *output_ptr = output_data;
217 
218     const cmsis_nn_dims input_dims = TRANSPOSE_3DIM_IN_DIM;
219     const cmsis_nn_dims output_dims = TRANSPOSE_3DIM_OUT_DIM;
220 
221     const int8_t *input_data = transpose_3dim_input_tensor;
222     const int8_t *const output_ref = transpose_3dim_output;
223     const int32_t output_ref_size = TRANSPOSE_3DIM_SIZE;
224 
225     const uint32_t perm[TRANSPOSE_3DIM_PERM_SIZE] = TRANSPOSE_3DIM_PERM;
226     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_3DIM_PERM_SIZE, perm};
227 
228     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
229 
230     TEST_ASSERT_EQUAL(expected, result);
231     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
232 }
233 
transpose_3dim2_arm_transpose_s8(void)234 void transpose_3dim2_arm_transpose_s8(void)
235 {
236     const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
237     int8_t output_data[TRANSPOSE_3DIM2_SIZE] = {0};
238     int8_t *output_ptr = output_data;
239 
240     const cmsis_nn_dims input_dims = TRANSPOSE_3DIM2_IN_DIM;
241     const cmsis_nn_dims output_dims = TRANSPOSE_3DIM2_OUT_DIM;
242 
243     const int8_t *input_data = transpose_3dim2_input_tensor;
244     const int8_t *const output_ref = transpose_3dim2_output;
245     const int32_t output_ref_size = TRANSPOSE_3DIM2_SIZE;
246 
247     const uint32_t perm[TRANSPOSE_3DIM2_PERM_SIZE] = TRANSPOSE_3DIM2_PERM;
248     const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_3DIM2_PERM_SIZE, perm};
249 
250     arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
251 
252     TEST_ASSERT_EQUAL(expected, result);
253     TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
254 }
255