BasicMaths.py 7.5 KB

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