BasicMaths.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. import os.path
  2. import numpy as np
  3. import itertools
  4. import Tools
  5. # Those patterns are used for tests and benchmarks.
  6. # For tests, there is the need to add tests for saturation
  7. def clipTest(config,format,nb):
  8. config.setOverwrite(True)
  9. minValues=[-0.5,-0.5,0.1]
  10. maxValues=[-0.1, 0.5,0.5]
  11. testSamples=np.arange(-0.9,0.9,0.1)
  12. config.writeInput(nb, testSamples)
  13. i=0
  14. for (mi,ma) in zip(minValues,maxValues):
  15. ref = list(np.clip(testSamples,mi,ma))
  16. config.writeReference(nb+i, ref)
  17. i = i + 1
  18. config.setOverwrite(False)
  19. return(i)
  20. def writeTests(config,format):
  21. NBSAMPLES=256
  22. data1=np.random.randn(NBSAMPLES)
  23. data2=np.random.randn(NBSAMPLES)
  24. data3=np.random.randn(1)
  25. data1 = Tools.normalize(data1)
  26. data2 = Tools.normalize(data2)
  27. # temp for debug of f16
  28. config.writeInput(1, data1)
  29. config.writeInput(2, data2)
  30. ref = data1 + data2
  31. config.writeReference(1, ref)
  32. ref = data1 - data2
  33. config.writeReference(2, ref)
  34. ref = data1 * data2
  35. config.writeReference(3, ref)
  36. ref = -data1
  37. config.writeReference(4, ref)
  38. ref = data1 + 0.5
  39. config.writeReference(5, ref)
  40. ref = data1 * 0.5
  41. config.writeReference(6, ref)
  42. nb = Tools.loopnb(format,Tools.TAILONLY)
  43. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
  44. if format == 31 or format == 15:
  45. if format==31:
  46. ref = ref / 2**15 # Because CMSIS format is 16.48
  47. if format==15:
  48. ref = ref / 2**33 # Because CMSIS format is 34.30
  49. config.writeReferenceQ63(7, ref)
  50. elif format == 7:
  51. ref = ref / 2**17 # Because CMSIS format is 18.14
  52. config.writeReferenceQ31(7, ref)
  53. else:
  54. config.writeReference(7, ref)
  55. nb = Tools.loopnb(format,Tools.BODYONLY)
  56. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
  57. if format == 31 or format == 15:
  58. if format==31:
  59. ref = ref / 2**15 # Because CMSIS format is 16.48
  60. if format==15:
  61. ref = ref / 2**33 # Because CMSIS format is 34.30
  62. config.writeReferenceQ63(8, ref)
  63. elif format == 7:
  64. ref = ref / 2**17 # Because CMSIS format is 18.14
  65. config.writeReferenceQ31(8, ref)
  66. else:
  67. config.writeReference(8, ref)
  68. nb = Tools.loopnb(format,Tools.BODYANDTAIL)
  69. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
  70. if format == 31 or format == 15:
  71. if format==31:
  72. ref = ref / 2**15 # Because CMSIS format is 16.48
  73. if format==15:
  74. ref = ref / 2**33 # Because CMSIS format is 34.30
  75. config.writeReferenceQ63(9, ref)
  76. elif format == 7:
  77. ref = ref / 2**17 # Because CMSIS format is 18.14
  78. config.writeReferenceQ31(9, ref)
  79. else:
  80. config.writeReference(9, ref)
  81. ref = abs(data1)
  82. config.writeReference(10, ref)
  83. ref = np.array([np.dot(data1 ,data2)])
  84. if format == 31 or format == 15:
  85. if format==31:
  86. ref = ref / 2**15 # Because CMSIS format is 16.48
  87. if format==15:
  88. ref = ref / 2**33 # Because CMSIS format is 34.30
  89. config.writeReferenceQ63(11, ref)
  90. elif format == 7:
  91. ref = ref / 2**17 # Because CMSIS format is 18.14
  92. config.writeReferenceQ31(11, ref)
  93. else:
  94. config.writeReference(11, ref)
  95. # This function is used in other test functions for q31 and q15
  96. # So we can't add tests here for q15 and q31.
  97. # But we can for f32:
  98. if format == Tools.F32 or format==Tools.F16:
  99. clipTest(config,format,12)
  100. return(13)
  101. return(11)
  102. def writeTestsWithSat(config,format):
  103. if format == 31:
  104. NBSAMPLES=9
  105. if format == 15:
  106. NBSAMPLES=17
  107. if format == 7:
  108. NBSAMPLES=33
  109. nb = writeTests(config,format)
  110. data1 = np.full(NBSAMPLES, 2**format - 1)
  111. data1[1::2] = 2
  112. data2 = np.full(NBSAMPLES, -2**format)
  113. data2[1::2] = -2
  114. datar=np.random.randn(NBSAMPLES)
  115. datar = Tools.normalize(datar)
  116. datar = datar / 3.0 # Because used to test shift of 2 without saturation
  117. config.writeInput(nb+1, datar)
  118. if format == 31:
  119. config.writeInputS32(nb+1,data1-1,"MaxPosInput")
  120. config.writeInputS32(nb+1,data2+1,"MaxNegInput")
  121. config.writeInputS32(nb+1,data2,"MaxNeg2Input")
  122. if format == 15:
  123. config.writeInputS16(nb+1,data1-1,"MaxPosInput")
  124. config.writeInputS16(nb+1,data2+1,"MaxNegInput")
  125. config.writeInputS16(nb+1,data2,"MaxNeg2Input")
  126. if format == 7:
  127. config.writeInputS8(nb+1,data1-1,"MaxPosInput")
  128. config.writeInputS8(nb+1,data2+1,"MaxNegInput")
  129. config.writeInputS8(nb+1,data2,"MaxNeg2Input")
  130. d1 = 1.0*(data1-1) / 2**format
  131. d2 = 1.0*(data2+1) / 2**format
  132. d3 = 1.0*(data2) / 2**format
  133. ref = d1 + d1
  134. config.writeReference(nb+1, ref,"PosSat")
  135. ref = d2 + d2
  136. config.writeReference(nb+2, ref,"NegSat")
  137. d1 = 1.0*(data1-1) / 2**format
  138. d2 = 1.0*(data2+1) / 2**format
  139. ref = d1 - d2
  140. config.writeReference(nb+3, ref,"PosSat")
  141. ref = d2 - d1
  142. config.writeReference(nb+4, ref,"NegSat")
  143. ref = d3*d3
  144. config.writeReference(nb+5, ref,"PosSat")
  145. ref = -d3
  146. config.writeReference(nb+6, ref,"PosSat")
  147. ref = d1 + 0.9
  148. config.writeReference(nb+7, ref,"PosSat")
  149. ref = d2 - 0.9
  150. config.writeReference(nb+8, ref,"NegSat")
  151. ref = d3 * d3[0]
  152. config.writeReference(nb+9, ref,"PosSat")
  153. ref = datar * 2.0
  154. config.writeReference(nb+10, ref,"Shift")
  155. ref = d1 * 2.0
  156. config.writeReference(nb+11, ref,"Shift")
  157. ref = d2 * 2.0
  158. config.writeReference(nb+12, ref,"Shift")
  159. return(nb+13)
  160. def writeTests2(config,format):
  161. NBSAMPLES = Tools.loopnb(format,Tools.BODYANDTAIL)
  162. nb = writeTestsWithSat(config,format)
  163. if format == 31:
  164. maxVal = 0x7fffffff
  165. if format == 15:
  166. maxVal = 0x7fff
  167. if format == 7:
  168. maxVal = 0x7f
  169. minVal = -maxVal-1
  170. data1 = np.random.randint(minVal, maxVal, size=NBSAMPLES)
  171. data2 = np.random.randint(minVal, maxVal, size=NBSAMPLES)
  172. if format == 31:
  173. config.writeInputS32(nb,data1,"BitwiseInput")
  174. config.writeInputS32(nb+1,data2,"BitwiseInput")
  175. if format == 15:
  176. config.writeInputS16(nb,data1,"BitwiseInput")
  177. config.writeInputS16(nb+1,data2,"BitwiseInput")
  178. if format == 7:
  179. config.writeInputS8(nb,data1,"BitwiseInput")
  180. config.writeInputS8(nb+1,data2,"BitwiseInput")
  181. ref = np.bitwise_and(data1, data2)
  182. if format == 31:
  183. config.writeReferenceS32(nb, ref, "And")
  184. if format == 15:
  185. config.writeReferenceS16(nb, ref, "And")
  186. if format == 7:
  187. config.writeReferenceS8(nb, ref, "And")
  188. ref = np.bitwise_or(data1, data2)
  189. if format == 31:
  190. config.writeReferenceS32(nb+1, ref, "Or")
  191. if format == 15:
  192. config.writeReferenceS16(nb+1, ref, "Or")
  193. if format == 7:
  194. config.writeReferenceS8(nb+1, ref, "Or")
  195. ref = np.invert(data1)
  196. if format == 31:
  197. config.writeReferenceS32(nb+2, ref, "Not")
  198. if format == 15:
  199. config.writeReferenceS16(nb+2, ref, "Not")
  200. if format == 7:
  201. config.writeReferenceS8(nb+2, ref, "Not")
  202. ref = np.bitwise_xor(data1, data2)
  203. if format == 31:
  204. config.writeReferenceS32(nb+3, ref, "Xor")
  205. if format == 15:
  206. config.writeReferenceS16(nb+3, ref, "Xor")
  207. if format == 7:
  208. config.writeReferenceS8(nb+3, ref, "Xor")
  209. clipTest(config,format,nb+4)
  210. def generatePatterns():
  211. PATTERNDIR = os.path.join("Patterns","DSP","BasicMaths","BasicMaths")
  212. PARAMDIR = os.path.join("Parameters","DSP","BasicMaths","BasicMaths")
  213. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  214. configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
  215. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  216. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  217. configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7")
  218. configf32.setOverwrite(False)
  219. configf16.setOverwrite(False)
  220. configq31.setOverwrite(False)
  221. configq15.setOverwrite(False)
  222. configq7.setOverwrite(False)
  223. writeTests(configf32,0)
  224. writeTests(configf16,16)
  225. writeTests2(configq31,31)
  226. writeTests2(configq15,15)
  227. writeTests2(configq7,7)
  228. # Params just as example
  229. someLists=[[1,3,5],[1,3,5],[1,3,5]]
  230. r=np.array([element for element in itertools.product(*someLists)])
  231. configf32.writeParam(1, r.reshape(81))
  232. if __name__ == '__main__':
  233. generatePatterns()