1 #include "BinaryTestsQ7.h"
2 #include <stdio.h>
3 #include "Error.h"
4
5 #define SNR_THRESHOLD 20
6
7 /*
8
9 Reference patterns are generated with
10 a double precision computation.
11
12 */
13 #define ABS_ERROR_Q7 ((q7_t)5)
14
15 #define ABS_ERROR_Q63 ((q63_t)(1<<16))
16
17
18
19 /* Upper bound of maximum matrix dimension used by Python */
20 #define MAXMATRIXDIM 47
21
checkInnerTail(q7_t * b)22 static void checkInnerTail(q7_t *b)
23 {
24 ASSERT_TRUE(b[0] == 0);
25 ASSERT_TRUE(b[1] == 0);
26 ASSERT_TRUE(b[2] == 0);
27 ASSERT_TRUE(b[3] == 0);
28 ASSERT_TRUE(b[4] == 0);
29 ASSERT_TRUE(b[5] == 0);
30 ASSERT_TRUE(b[6] == 0);
31 ASSERT_TRUE(b[7] == 0);
32 ASSERT_TRUE(b[8] == 0);
33 ASSERT_TRUE(b[9] == 0);
34 ASSERT_TRUE(b[10] == 0);
35 ASSERT_TRUE(b[11] == 0);
36 ASSERT_TRUE(b[12] == 0);
37 ASSERT_TRUE(b[13] == 0);
38 ASSERT_TRUE(b[14] == 0);
39 ASSERT_TRUE(b[15] == 0);
40
41 }
42
43 #define LOADDATA2() \
44 const q7_t *inp1=input1.ptr(); \
45 const q7_t *inp2=input2.ptr(); \
46 \
47 q7_t *ap=a.ptr(); \
48 q7_t *bp=b.ptr(); \
49 \
50 q7_t *outp=output.ptr(); \
51 q7_t *tmpPtr=tmp.ptr(); \
52 int16_t *dimsp = dims.ptr(); \
53 int nbMatrixes = dims.nbSamples() / 3;\
54 int rows,internal,columns; \
55 int i;
56
57
58 #define PREPAREDATA2() \
59 in1.numRows=rows; \
60 in1.numCols=internal; \
61 memcpy((void*)ap,(const void*)inp1,2*sizeof(q7_t)*rows*internal);\
62 in1.pData = ap; \
63 \
64 in2.numRows=internal; \
65 in2.numCols=columns; \
66 memcpy((void*)bp,(const void*)inp2,2*sizeof(q7_t)*internal*columns);\
67 in2.pData = bp; \
68 \
69 out.numRows=rows; \
70 out.numCols=columns; \
71 out.pData = outp;
72
73
74
75
test_mat_mult_q7()76 void BinaryTestsQ7::test_mat_mult_q7()
77 {
78 LOADDATA2();
79 arm_status status;
80
81 for(i=0;i < nbMatrixes ; i ++)
82 {
83 rows = *dimsp++;
84 internal = *dimsp++;
85 columns = *dimsp++;
86
87 PREPAREDATA2();
88 memset(tmpPtr,0,sizeof(q7_t)*internal*columns + 16);
89 checkInnerTail(tmpPtr + internal*columns);
90
91 status=arm_mat_mult_q7(&this->in1,&this->in2,&this->out,tmpPtr);
92 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
93
94 outp += (rows * columns);
95 checkInnerTail(outp);
96 checkInnerTail(tmpPtr + internal*columns);
97 }
98
99 ASSERT_EMPTY_TAIL(output);
100
101 ASSERT_SNR(output,ref,(q7_t)SNR_THRESHOLD);
102
103 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q7);
104
105 }
106
107
108
109
110
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)111 void BinaryTestsQ7::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
112 {
113
114
115 (void)params;
116 switch(id)
117 {
118 case TEST_MAT_MULT_Q7_1:
119 input1.reload(BinaryTestsQ7::INPUTS1_Q7_ID,mgr);
120 input2.reload(BinaryTestsQ7::INPUTS2_Q7_ID,mgr);
121 dims.reload(BinaryTestsQ7::DIMSBINARY1_S16_ID,mgr);
122
123 ref.reload(BinaryTestsQ7::REFMUL1_Q7_ID,mgr);
124
125 output.create(ref.nbSamples(),BinaryTestsQ7::OUT_Q7_ID,mgr);
126 a.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ7::TMPA_Q7_ID,mgr);
127 b.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ7::TMPB_Q7_ID,mgr);
128 tmp.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ7::TMP_Q7_ID,mgr);
129 break;
130
131
132
133 }
134
135
136
137 }
138
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)139 void BinaryTestsQ7::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
140 {
141 (void)id;
142 output.dump(mgr);
143 }
144