1import os.path
2import numpy as np
3import itertools
4import Tools
5
6
7# Those patterns are used for tests and benchmarks.
8# For tests, there is the need to add tests for saturation
9def clipTest(config,format,nb):
10    NBSAMPLESBASE=256
11    #config.setOverwrite(True)
12    minValues=[-0.5,-0.5,0.1]
13    maxValues=[-0.1, 0.5,0.5]
14    nbSamples=[NBSAMPLESBASE+Tools.loopnb(format,Tools.TAILONLY)
15              ,NBSAMPLESBASE+Tools.loopnb(format,Tools.BODYONLY)
16              ,NBSAMPLESBASE+Tools.loopnb(format,Tools.BODYANDTAIL)
17              ]
18
19    maxLength = max(nbSamples)
20    minBound=-0.9
21    maxBound=0.9
22    testSamples=np.linspace(minBound,maxBound,maxLength)
23    config.writeInput(nb, testSamples)
24
25    i=0
26    for (mi,ma,nbForTest) in zip(minValues,maxValues,nbSamples):
27      ref = list(np.clip(testSamples[0:nbForTest],mi,ma))
28      config.writeReference(nb+i, ref)
29      i = i + 1
30
31
32
33    #config.setOverwrite(False)
34
35    return(i)
36
37def writeTests(config,format):
38    NBSAMPLES=256
39
40    data1=np.random.randn(NBSAMPLES)
41    data2=np.random.randn(NBSAMPLES)
42    data3=np.random.randn(1)
43
44    data1 = Tools.normalize(data1)
45    data2 = Tools.normalize(data2)
46
47    # temp for debug of f16
48    config.writeInput(1, data1)
49    config.writeInput(2, data2)
50
51    ref = data1 + data2
52    config.writeReference(1, ref)
53
54    ref = data1 - data2
55    config.writeReference(2, ref)
56
57    ref = data1 * data2
58    config.writeReference(3, ref)
59
60    ref = -data1
61    config.writeReference(4, ref)
62
63    ref = data1 + 0.5
64    config.writeReference(5, ref)
65
66    ref = data1 * 0.5
67    config.writeReference(6, ref)
68
69
70
71    nb = Tools.loopnb(format,Tools.TAILONLY)
72    ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
73
74    if format == 31 or format == 15:
75       if format==31:
76          ref = ref / 2**15 # Because CMSIS format is 16.48
77       if format==15:
78          ref = ref / 2**33 # Because CMSIS format is 34.30
79       config.writeReferenceQ63(7, ref)
80    elif format == 7:
81       ref = ref / 2**17 # Because CMSIS format is 18.14
82       config.writeReferenceQ31(7, ref)
83    else:
84       config.writeReference(7, ref)
85
86    nb = Tools.loopnb(format,Tools.BODYONLY)
87    ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
88
89    if format == 31 or format == 15:
90       if format==31:
91          ref = ref / 2**15 # Because CMSIS format is 16.48
92       if format==15:
93          ref = ref / 2**33 # Because CMSIS format is 34.30
94       config.writeReferenceQ63(8, ref)
95    elif format == 7:
96       ref = ref / 2**17 # Because CMSIS format is 18.14
97       config.writeReferenceQ31(8, ref)
98    else:
99       config.writeReference(8, ref)
100
101    nb = Tools.loopnb(format,Tools.BODYANDTAIL)
102    ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
103
104    if format == 31 or format == 15:
105       if format==31:
106          ref = ref / 2**15 # Because CMSIS format is 16.48
107       if format==15:
108          ref = ref / 2**33 # Because CMSIS format is 34.30
109       config.writeReferenceQ63(9, ref)
110    elif format == 7:
111       ref = ref / 2**17 # Because CMSIS format is 18.14
112       config.writeReferenceQ31(9, ref)
113    else:
114       config.writeReference(9, ref)
115
116    ref = abs(data1)
117    config.writeReference(10, ref)
118
119    ref = np.array([np.dot(data1 ,data2)])
120    if format == 31 or format == 15:
121       if format==31:
122          ref = ref / 2**15 # Because CMSIS format is 16.48
123       if format==15:
124          ref = ref / 2**33 # Because CMSIS format is 34.30
125       config.writeReferenceQ63(11, ref)
126    elif format == 7:
127       ref = ref / 2**17 # Because CMSIS format is 18.14
128       config.writeReferenceQ31(11, ref)
129    else:
130       config.writeReference(11, ref)
131
132    # This function is used in other test functions for q31 and q15
133    # So we can't add tests here for q15 and q31.
134    # But we can for f32:
135    if format == Tools.F64 or format == Tools.F32 or format==Tools.F16:
136       clipTest(config,format,12)
137       return(13)
138
139    return(11)
140
141
142def writeTestsWithSat(config,format):
143    if format == 31:
144       NBSAMPLES=9
145
146    if format == 15:
147       NBSAMPLES=17
148
149    if format == 7:
150       NBSAMPLES=33
151
152    nb = writeTests(config,format)
153
154    data1 = np.full(NBSAMPLES, 2**format - 1)
155    data1[1::2] = 2
156    data2 = np.full(NBSAMPLES, -2**format)
157    data2[1::2] = -2
158
159    datar=np.random.randn(NBSAMPLES)
160    datar = Tools.normalize(datar)
161    datar = datar / 3.0 # Because used to test shift of 2 without saturation
162
163    config.writeInput(nb+1, datar)
164
165    if format == 31:
166       config.writeInputS32(nb+1,data1-1,"MaxPosInput")
167       config.writeInputS32(nb+1,data2+1,"MaxNegInput")
168       config.writeInputS32(nb+1,data2,"MaxNeg2Input")
169
170    if format == 15:
171       config.writeInputS16(nb+1,data1-1,"MaxPosInput")
172       config.writeInputS16(nb+1,data2+1,"MaxNegInput")
173       config.writeInputS16(nb+1,data2,"MaxNeg2Input")
174
175    if format == 7:
176       config.writeInputS8(nb+1,data1-1,"MaxPosInput")
177       config.writeInputS8(nb+1,data2+1,"MaxNegInput")
178       config.writeInputS8(nb+1,data2,"MaxNeg2Input")
179
180    d1 = 1.0*(data1-1) / 2**format
181    d2 = 1.0*(data2+1) / 2**format
182    d3 = 1.0*(data2) / 2**format
183
184    ref = d1 + d1
185    config.writeReference(nb+1, ref,"PosSat")
186    ref = d2 + d2
187    config.writeReference(nb+2, ref,"NegSat")
188
189    d1 = 1.0*(data1-1) / 2**format
190    d2 = 1.0*(data2+1) / 2**format
191    ref = d1 - d2
192    config.writeReference(nb+3, ref,"PosSat")
193
194    ref = d2 - d1
195    config.writeReference(nb+4, ref,"NegSat")
196
197    ref = d3*d3
198    config.writeReference(nb+5, ref,"PosSat")
199
200    ref = -d3
201    config.writeReference(nb+6, ref,"PosSat")
202
203    ref = d1 + 0.9
204    config.writeReference(nb+7, ref,"PosSat")
205    ref = d2 - 0.9
206    config.writeReference(nb+8, ref,"NegSat")
207
208    ref = d3 * d3[0]
209    config.writeReference(nb+9, ref,"PosSat")
210
211    ref = datar * 2.0
212    config.writeReference(nb+10, ref,"Shift")
213
214    ref = d1 * 2.0
215    config.writeReference(nb+11, ref,"Shift")
216
217    ref = d2 * 2.0
218    config.writeReference(nb+12, ref,"Shift")
219
220    return(nb+13)
221
222
223def writeTests2(config,format):
224
225    NBSAMPLES = Tools.loopnb(format,Tools.BODYANDTAIL)
226
227    nb = writeTestsWithSat(config,format)
228
229    if format == 31:
230       maxVal = 0x7fffffff
231    if format == 15:
232       maxVal = 0x7fff
233    if format == 7:
234       maxVal = 0x7f
235
236    minVal = -maxVal-1
237
238    data1 = np.random.randint(minVal, maxVal, size=NBSAMPLES)
239    data2 = np.random.randint(minVal, maxVal, size=NBSAMPLES)
240
241    if format == 31:
242       config.writeInputS32(nb,data1,"BitwiseInput")
243       config.writeInputS32(nb+1,data2,"BitwiseInput")
244
245    if format == 15:
246       config.writeInputS16(nb,data1,"BitwiseInput")
247       config.writeInputS16(nb+1,data2,"BitwiseInput")
248
249    if format == 7:
250       config.writeInputS8(nb,data1,"BitwiseInput")
251       config.writeInputS8(nb+1,data2,"BitwiseInput")
252
253    ref = np.bitwise_and(data1, data2)
254
255    if format == 31:
256      config.writeReferenceS32(nb, ref, "And")
257
258    if format == 15:
259      config.writeReferenceS16(nb, ref, "And")
260
261    if format == 7:
262      config.writeReferenceS8(nb, ref, "And")
263
264    ref = np.bitwise_or(data1, data2)
265
266    if format == 31:
267      config.writeReferenceS32(nb+1, ref, "Or")
268
269    if format == 15:
270      config.writeReferenceS16(nb+1, ref, "Or")
271
272    if format == 7:
273      config.writeReferenceS8(nb+1, ref, "Or")
274
275    ref = np.invert(data1)
276
277    if format == 31:
278      config.writeReferenceS32(nb+2, ref, "Not")
279
280    if format == 15:
281      config.writeReferenceS16(nb+2, ref, "Not")
282
283    if format == 7:
284      config.writeReferenceS8(nb+2, ref, "Not")
285
286    ref = np.bitwise_xor(data1, data2)
287
288    if format == 31:
289      config.writeReferenceS32(nb+3, ref, "Xor")
290
291    if format == 15:
292      config.writeReferenceS16(nb+3, ref, "Xor")
293
294    if format == 7:
295      config.writeReferenceS8(nb+3, ref, "Xor")
296
297    clipTest(config,format,nb+4)
298
299
300def generatePatterns():
301    PATTERNDIR = os.path.join("Patterns","DSP","BasicMaths","BasicMaths")
302    PARAMDIR = os.path.join("Parameters","DSP","BasicMaths","BasicMaths")
303
304    configf64=Tools.Config(PATTERNDIR,PARAMDIR,"f64")
305    configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
306    configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
307    configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
308    configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
309    configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7")
310
311    configf32.setOverwrite(False)
312    configf16.setOverwrite(False)
313    configq31.setOverwrite(False)
314    configq15.setOverwrite(False)
315    configq7.setOverwrite(False)
316
317    writeTests(configf64,Tools.F64)
318    writeTests(configf32,0)
319    writeTests(configf16,16)
320
321    writeTests2(configq31,31)
322    writeTests2(configq15,15)
323    writeTests2(configq7,7)
324
325
326    # Params just as example
327    someLists=[[1,3,5],[1,3,5],[1,3,5]]
328
329    r=np.array([element for element in itertools.product(*someLists)])
330    configf32.writeParam(1, r.reshape(81))
331
332if __name__ == '__main__':
333  generatePatterns()
334