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