BasicMaths.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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 writeTests(config,format):
  8. NBSAMPLES=256
  9. data1=np.random.randn(NBSAMPLES)
  10. data2=np.random.randn(NBSAMPLES)
  11. data3=np.random.randn(1)
  12. data1 = Tools.normalize(data1)
  13. data2 = Tools.normalize(data2)
  14. config.writeInput(1, data1)
  15. config.writeInput(2, data2)
  16. ref = data1 + data2
  17. config.writeReference(1, ref)
  18. ref = data1 - data2
  19. config.writeReference(2, ref)
  20. ref = data1 * data2
  21. config.writeReference(3, ref)
  22. ref = -data1
  23. config.writeReference(4, ref)
  24. ref = data1 + 0.5
  25. config.writeReference(5, ref)
  26. ref = data1 * 0.5
  27. config.writeReference(6, ref)
  28. nb = Tools.loopnb(format,Tools.TAILONLY)
  29. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
  30. if format == 31 or format == 15:
  31. if format==31:
  32. ref = ref / 2**15 # Because CMSIS format is 16.48
  33. if format==15:
  34. ref = ref / 2**33 # Because CMSIS format is 34.30
  35. config.writeReferenceQ63(7, ref)
  36. elif format == 7:
  37. ref = ref / 2**17 # Because CMSIS format is 18.14
  38. config.writeReferenceQ31(7, ref)
  39. else:
  40. config.writeReference(7, ref)
  41. nb = Tools.loopnb(format,Tools.BODYONLY)
  42. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
  43. if format == 31 or format == 15:
  44. if format==31:
  45. ref = ref / 2**15 # Because CMSIS format is 16.48
  46. if format==15:
  47. ref = ref / 2**33 # Because CMSIS format is 34.30
  48. config.writeReferenceQ63(8, ref)
  49. elif format == 7:
  50. ref = ref / 2**17 # Because CMSIS format is 18.14
  51. config.writeReferenceQ31(8, ref)
  52. else:
  53. config.writeReference(8, ref)
  54. nb = Tools.loopnb(format,Tools.BODYANDTAIL)
  55. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
  56. if format == 31 or format == 15:
  57. if format==31:
  58. ref = ref / 2**15 # Because CMSIS format is 16.48
  59. if format==15:
  60. ref = ref / 2**33 # Because CMSIS format is 34.30
  61. config.writeReferenceQ63(9, ref)
  62. elif format == 7:
  63. ref = ref / 2**17 # Because CMSIS format is 18.14
  64. config.writeReferenceQ31(9, ref)
  65. else:
  66. config.writeReference(9, ref)
  67. ref = abs(data1)
  68. config.writeReference(10, ref)
  69. ref = np.array([np.dot(data1 ,data2)])
  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(11, ref)
  76. elif format == 7:
  77. ref = ref / 2**17 # Because CMSIS format is 18.14
  78. config.writeReferenceQ31(11, ref)
  79. else:
  80. config.writeReference(11, ref)
  81. return(11)
  82. def writeTestsWithSat(config,format):
  83. if format == 31:
  84. NBSAMPLES=9
  85. if format == 15:
  86. NBSAMPLES=17
  87. if format == 7:
  88. NBSAMPLES=33
  89. nb = writeTests(config,format)
  90. data1 = np.full(NBSAMPLES, 2**format - 1)
  91. data1[1::2] = 2
  92. data2 = np.full(NBSAMPLES, -2**format)
  93. data2[1::2] = -2
  94. datar=np.random.randn(NBSAMPLES)
  95. datar = Tools.normalize(datar)
  96. datar = datar / 3.0 # Because used to test shift of 2 without saturation
  97. config.writeInput(nb+1, datar)
  98. if format == 31:
  99. config.writeInputS32(nb+1,data1-1,"MaxPosInput")
  100. config.writeInputS32(nb+1,data2+1,"MaxNegInput")
  101. config.writeInputS32(nb+1,data2,"MaxNeg2Input")
  102. if format == 15:
  103. config.writeInputS16(nb+1,data1-1,"MaxPosInput")
  104. config.writeInputS16(nb+1,data2+1,"MaxNegInput")
  105. config.writeInputS16(nb+1,data2,"MaxNeg2Input")
  106. if format == 7:
  107. config.writeInputS8(nb+1,data1-1,"MaxPosInput")
  108. config.writeInputS8(nb+1,data2+1,"MaxNegInput")
  109. config.writeInputS8(nb+1,data2,"MaxNeg2Input")
  110. d1 = 1.0*(data1-1) / 2**format
  111. d2 = 1.0*(data2+1) / 2**format
  112. d3 = 1.0*(data2) / 2**format
  113. ref = d1 + d1
  114. config.writeReference(nb+1, ref,"PosSat")
  115. ref = d2 + d2
  116. config.writeReference(nb+2, ref,"NegSat")
  117. d1 = 1.0*(data1-1) / 2**format
  118. d2 = 1.0*(data2+1) / 2**format
  119. ref = d1 - d2
  120. config.writeReference(nb+3, ref,"PosSat")
  121. ref = d2 - d1
  122. config.writeReference(nb+4, ref,"NegSat")
  123. ref = d3*d3
  124. config.writeReference(nb+5, ref,"PosSat")
  125. ref = -d3
  126. config.writeReference(nb+6, ref,"PosSat")
  127. ref = d1 + 0.9
  128. config.writeReference(nb+7, ref,"PosSat")
  129. ref = d2 - 0.9
  130. config.writeReference(nb+8, ref,"NegSat")
  131. ref = d3 * d3[0]
  132. config.writeReference(nb+9, ref,"PosSat")
  133. ref = datar * 2.0
  134. config.writeReference(nb+10, ref,"Shift")
  135. ref = d1 * 2.0
  136. config.writeReference(nb+11, ref,"Shift")
  137. ref = d2 * 2.0
  138. config.writeReference(nb+12, ref,"Shift")
  139. return(nb+13)
  140. def writeTests2(config,format):
  141. NBSAMPLES = Tools.loopnb(format,Tools.BODYANDTAIL)
  142. nb = writeTestsWithSat(config,format)
  143. if format == 31:
  144. maxVal = 0x7fffffff
  145. if format == 15:
  146. maxVal = 0x7fff
  147. if format == 7:
  148. maxVal = 0x7f
  149. minVal = -maxVal-1
  150. data1 = np.random.randint(minVal, maxVal, size=NBSAMPLES)
  151. data2 = np.random.randint(minVal, maxVal, size=NBSAMPLES)
  152. if format == 31:
  153. config.writeInputS32(nb,data1,"BitwiseInput")
  154. config.writeInputS32(nb+1,data2,"BitwiseInput")
  155. if format == 15:
  156. config.writeInputS16(nb,data1,"BitwiseInput")
  157. config.writeInputS16(nb+1,data2,"BitwiseInput")
  158. if format == 7:
  159. config.writeInputS8(nb,data1,"BitwiseInput")
  160. config.writeInputS8(nb+1,data2,"BitwiseInput")
  161. ref = np.bitwise_and(data1, data2)
  162. if format == 31:
  163. config.writeReferenceS32(nb, ref, "And")
  164. if format == 15:
  165. config.writeReferenceS16(nb, ref, "And")
  166. if format == 7:
  167. config.writeReferenceS8(nb, ref, "And")
  168. ref = np.bitwise_or(data1, data2)
  169. if format == 31:
  170. config.writeReferenceS32(nb+1, ref, "Or")
  171. if format == 15:
  172. config.writeReferenceS16(nb+1, ref, "Or")
  173. if format == 7:
  174. config.writeReferenceS8(nb+1, ref, "Or")
  175. ref = np.invert(data1)
  176. if format == 31:
  177. config.writeReferenceS32(nb+2, ref, "Not")
  178. if format == 15:
  179. config.writeReferenceS16(nb+2, ref, "Not")
  180. if format == 7:
  181. config.writeReferenceS8(nb+2, ref, "Not")
  182. ref = np.bitwise_xor(data1, data2)
  183. if format == 31:
  184. config.writeReferenceS32(nb+3, ref, "Xor")
  185. if format == 15:
  186. config.writeReferenceS16(nb+3, ref, "Xor")
  187. if format == 7:
  188. config.writeReferenceS8(nb+3, ref, "Xor")
  189. def generatePatterns():
  190. PATTERNDIR = os.path.join("Patterns","DSP","BasicMaths","BasicMaths")
  191. PARAMDIR = os.path.join("Parameters","DSP","BasicMaths","BasicMaths")
  192. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  193. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  194. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  195. configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7")
  196. writeTests(configf32,0)
  197. writeTests2(configq31,31)
  198. writeTests2(configq15,15)
  199. writeTests2(configq7,7)
  200. # Params just as example
  201. someLists=[[1,3,5],[1,3,5],[1,3,5]]
  202. r=np.array([element for element in itertools.product(*someLists)])
  203. configf32.writeParam(1, r.reshape(81))
  204. if __name__ == '__main__':
  205. generatePatterns()