BasicMaths.py 8.8 KB

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