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