genMVETwiddleCoefs.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. import numpy as np
  2. import math
  3. import argparse
  4. import sys
  5. import struct
  6. sys.path.append("PatternGeneration")
  7. import Tools
  8. # Force to f16 value
  9. def f16(x):
  10. return struct.unpack('<e', struct.pack('<e', x))[0]
  11. # Force to f32 value
  12. def f32(x):
  13. return struct.unpack('<f', struct.pack('<f', x))[0]
  14. parser = argparse.ArgumentParser(description='Generate C arrays')
  15. parser.add_argument('-f', nargs='?',type = str, default="../Source/CommonTables/arm_mve_tables.c", help="C File path")
  16. parser.add_argument('-f16', nargs='?',type = str, default="../Source/CommonTables/arm_mve_tables_f16.c", help="C File path")
  17. parser.add_argument('-he', nargs='?',type = str, default="../Include/arm_mve_tables.h", help="H File path")
  18. parser.add_argument('-he16', nargs='?',type = str, default="../Include/arm_mve_tables_f16.h", help="H File path")
  19. args = parser.parse_args()
  20. COLLIM = 80
  21. condition="""#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_%s_%d) || defined(ARM_TABLE_TWIDDLECOEF_%s_%d)
  22. """
  23. F32 = 1
  24. F16 = 2
  25. Q31 = 3
  26. Q15 = 4
  27. Q7 = 5
  28. def printCUInt32Array(f,name,arr):
  29. nb = 0
  30. print("uint32_t %s[%d]={" % (name,len(arr)),file=f)
  31. for d in arr:
  32. val = "%d," % d
  33. nb = nb + len(val)
  34. if nb > COLLIM:
  35. print("",file=f)
  36. nb = len(val)
  37. print(val,end="",file=f)
  38. print("};\n",file=f)
  39. def printCFloat32Array(f,name,arr):
  40. nb = 0
  41. print("float32_t %s[%d]={" % (name,len(arr)),file=f)
  42. for d in arr:
  43. val = "%.20ff," % f32(d)
  44. nb = nb + len(val)
  45. if nb > COLLIM:
  46. print("",file=f)
  47. nb = len(val)
  48. print(val,end="",file=f)
  49. print("};\n",file=f)
  50. def printCFloat16Array(f,name,arr):
  51. nb = 0
  52. print("float16_t %s[%d]={" % (name,len(arr)),file=f)
  53. for d in arr:
  54. val = "(float16_t)%.13ff," % f16(d)
  55. nb = nb + len(val)
  56. if nb > COLLIM:
  57. print("",file=f)
  58. nb = len(val)
  59. print(val,end="",file=f)
  60. print("};\n",file=f)
  61. def printCQ31Array(f,name,arr):
  62. nb = 0
  63. print("q31_t %s[%d]={" % (name,len(arr)),file=f)
  64. for d in arr:
  65. val = "%s," % Tools.to_q31(d)
  66. nb = nb + len(val)
  67. if nb > COLLIM:
  68. print("",file=f)
  69. nb = len(val)
  70. print(val,end="",file=f)
  71. print("};\n",file=f)
  72. def printCQ15Array(f,name,arr):
  73. nb = 0
  74. print("q15_t %s[%d]={" % (name,len(arr)),file=f)
  75. for d in arr:
  76. val = "%s," % Tools.to_q15(d)
  77. nb = nb + len(val)
  78. if nb > COLLIM:
  79. print("",file=f)
  80. nb = len(val)
  81. print(val,end="",file=f)
  82. print("};\n",file=f)
  83. def printCQ7Array(f,name,arr):
  84. nb = 0
  85. print("q7_t %s[%d]={" % (name,len(arr)),file=f)
  86. for d in arr:
  87. val = "%s," % Tools.to_q7(d)
  88. nb = nb + len(val)
  89. if nb > COLLIM:
  90. print("",file=f)
  91. nb = len(val)
  92. print(val,end="",file=f)
  93. print("};\n",file=f)
  94. def printHUInt32Array(f,name,arr):
  95. print("extern uint32_t %s[%d];" % (name,len(arr)),file=f)
  96. def printHFloat32Array(f,name,arr):
  97. print("extern float32_t %s[%d];" % (name,len(arr)),file=f)
  98. def printHFloat16Array(f,name,arr):
  99. print("extern float16_t %s[%d];" % (name,len(arr)),file=f)
  100. def printHQ31Array(f,name,arr):
  101. print("extern q31_t %s[%d];" % (name,len(arr)),file=f)
  102. def printHQ15Array(f,name,arr):
  103. print("extern q15_t %s[%d];" % (name,len(arr)),file=f)
  104. def printHQ7Array(f,name,arr):
  105. print("extern q7_t %s[%d];" % (name,len(arr)),file=f)
  106. def twiddle(n):
  107. a=2.0*math.pi*np.linspace(0,n,num=n,endpoint=False)/n
  108. c=np.cos(a)
  109. s=np.sin(a)
  110. r = np.empty((c.size + s.size,), dtype=c.dtype)
  111. r[0::2] = c
  112. r[1::2] = s
  113. return(r)
  114. def reorderTwiddle(theType,conjugate,f,h,n):
  115. numStages = 6
  116. coefs= twiddle(n)
  117. if n == 4096:
  118. numStages = 6
  119. arraySize = 1364
  120. if n == 1024:
  121. numStages = 5
  122. arraySize = 340
  123. if n == 256:
  124. numStages = 4
  125. arraySize = 84
  126. if n == 64:
  127. numStages = 3
  128. arraySize = 20
  129. if n == 16:
  130. numStages = 2
  131. arraySize = 4
  132. incr = 1
  133. nbOfElt = n
  134. maxNb = 0
  135. tab1 = np.zeros(2*arraySize)
  136. tab2 = np.zeros(2*arraySize)
  137. tab3 = np.zeros(2*arraySize)
  138. tab1Index=0
  139. tab2Index=0
  140. tab3Index=0
  141. tab1Offset = np.zeros(numStages)
  142. tab2Offset = np.zeros(numStages)
  143. tab3Offset = np.zeros(numStages)
  144. for stage in range(0,numStages-1):
  145. nbOfElt = nbOfElt >> 2
  146. pVectCoef1 = 0
  147. pVectCoef2 = 0
  148. pVectCoef3 = 0
  149. tab1Offset[stage] = tab1Index
  150. tab2Offset[stage] = tab2Index
  151. tab3Offset[stage] = tab3Index
  152. for i in range(0,nbOfElt):
  153. tab1[tab1Index] = coefs[pVectCoef1]
  154. if not conjugate:
  155. tab1[tab1Index + 1] = coefs[pVectCoef1 + 1]
  156. else:
  157. tab1[tab1Index + 1] = -coefs[pVectCoef1 + 1]
  158. tab1Index = tab1Index + 2
  159. pVectCoef1 = pVectCoef1 + (incr * 1 * 2)
  160. tab2[tab2Index] = coefs[pVectCoef2]
  161. if not conjugate:
  162. tab2[tab2Index + 1] = coefs[pVectCoef2 + 1]
  163. else:
  164. tab2[tab2Index + 1] = -coefs[pVectCoef2 + 1]
  165. tab2Index = tab2Index + 2
  166. pVectCoef2 = pVectCoef2 + (incr * 2 * 2)
  167. tab3[tab3Index] = coefs[pVectCoef3]
  168. if not conjugate:
  169. tab3[tab3Index + 1] = coefs[pVectCoef3 + 1]
  170. else:
  171. tab3[tab3Index + 1] = -coefs[pVectCoef3 + 1]
  172. tab3Index = tab3Index + 2
  173. pVectCoef3 = pVectCoef3 + (incr * 3 * 2)
  174. maxNb = maxNb + 1
  175. incr = 4 * incr
  176. # F32 SECTION FOR THIS FFT LENGTH
  177. if theType == F32:
  178. print(condition % ("F32",n, "F32",n << 1),file=f)
  179. print(condition % ("F32",n, "F32",n << 1),file=h)
  180. printCUInt32Array(f,"rearranged_twiddle_tab_stride1_arr_%d_f32" % n,list(tab1Offset))
  181. printHUInt32Array(h,"rearranged_twiddle_tab_stride1_arr_%d_f32" % n,list(tab1Offset))
  182. printCUInt32Array(f,"rearranged_twiddle_tab_stride2_arr_%d_f32" % n,list(tab2Offset))
  183. printHUInt32Array(h,"rearranged_twiddle_tab_stride2_arr_%d_f32" % n,list(tab2Offset))
  184. printCUInt32Array(f,"rearranged_twiddle_tab_stride3_arr_%d_f32" % n,list(tab3Offset))
  185. printHUInt32Array(h,"rearranged_twiddle_tab_stride3_arr_%d_f32" % n,list(tab3Offset))
  186. printCFloat32Array(f,"rearranged_twiddle_stride1_%d_f32" % n,list(tab1))
  187. printHFloat32Array(h,"rearranged_twiddle_stride1_%d_f32" % n,list(tab1))
  188. printCFloat32Array(f,"rearranged_twiddle_stride2_%d_f32" % n,list(tab2))
  189. printHFloat32Array(h,"rearranged_twiddle_stride2_%d_f32" % n,list(tab2))
  190. printCFloat32Array(f,"rearranged_twiddle_stride3_%d_f32" % n,list(tab3))
  191. printHFloat32Array(h,"rearranged_twiddle_stride3_%d_f32" % n,list(tab3))
  192. print("#endif\n",file=f)
  193. print("#endif\n",file=h)
  194. # F16 SECTION FOR THIS FFT LENGTH
  195. if theType == F16:
  196. print(condition % ("F16",n, "F16",n << 1),file=f)
  197. print(condition % ("F16",n, "F16",n << 1),file=h)
  198. printCUInt32Array(f,"rearranged_twiddle_tab_stride1_arr_%d_f16" % n,list(tab1Offset))
  199. printHUInt32Array(h,"rearranged_twiddle_tab_stride1_arr_%d_f16" % n,list(tab1Offset))
  200. printCUInt32Array(f,"rearranged_twiddle_tab_stride2_arr_%d_f16" % n,list(tab2Offset))
  201. printHUInt32Array(h,"rearranged_twiddle_tab_stride2_arr_%d_f16" % n,list(tab2Offset))
  202. printCUInt32Array(f,"rearranged_twiddle_tab_stride3_arr_%d_f16" % n,list(tab3Offset))
  203. printHUInt32Array(h,"rearranged_twiddle_tab_stride3_arr_%d_f16" % n,list(tab3Offset))
  204. printCFloat16Array(f,"rearranged_twiddle_stride1_%d_f16" % n,list(tab1))
  205. printHFloat16Array(h,"rearranged_twiddle_stride1_%d_f16" % n,list(tab1))
  206. printCFloat16Array(f,"rearranged_twiddle_stride2_%d_f16" % n,list(tab2))
  207. printHFloat16Array(h,"rearranged_twiddle_stride2_%d_f16" % n,list(tab2))
  208. printCFloat16Array(f,"rearranged_twiddle_stride3_%d_f16" % n,list(tab3))
  209. printHFloat16Array(h,"rearranged_twiddle_stride3_%d_f16" % n,list(tab3))
  210. print("#endif\n",file=f)
  211. print("#endif\n",file=h)
  212. # Q31 SECTION FOR THIS FFT LENGTH
  213. if theType == Q31:
  214. print(condition % ("Q31",n, "Q31",n << 1),file=f)
  215. print(condition % ("Q31",n, "Q31",n << 1),file=h)
  216. printCUInt32Array(f,"rearranged_twiddle_tab_stride1_arr_%d_q31" % n,list(tab1Offset))
  217. printHUInt32Array(h,"rearranged_twiddle_tab_stride1_arr_%d_q31" % n,list(tab1Offset))
  218. printCUInt32Array(f,"rearranged_twiddle_tab_stride2_arr_%d_q31" % n,list(tab2Offset))
  219. printHUInt32Array(h,"rearranged_twiddle_tab_stride2_arr_%d_q31" % n,list(tab2Offset))
  220. printCUInt32Array(f,"rearranged_twiddle_tab_stride3_arr_%d_q31" % n,list(tab3Offset))
  221. printHUInt32Array(h,"rearranged_twiddle_tab_stride3_arr_%d_q31" % n,list(tab3Offset))
  222. printCQ31Array(f,"rearranged_twiddle_stride1_%d_q31" % n,list(tab1))
  223. printHQ31Array(h,"rearranged_twiddle_stride1_%d_q31" % n,list(tab1))
  224. printCQ31Array(f,"rearranged_twiddle_stride2_%d_q31" % n,list(tab2))
  225. printHQ31Array(h,"rearranged_twiddle_stride2_%d_q31" % n,list(tab2))
  226. printCQ31Array(f,"rearranged_twiddle_stride3_%d_q31" % n,list(tab3))
  227. printHQ31Array(h,"rearranged_twiddle_stride3_%d_q31" % n,list(tab3))
  228. print("#endif\n",file=f)
  229. print("#endif\n",file=h)
  230. # Q15 SECTION FOR THIS FFT LENGTH
  231. if theType == Q15:
  232. print(condition % ("Q15",n, "Q15",n << 1),file=f)
  233. print(condition % ("Q15",n, "Q15",n << 1),file=h)
  234. printCUInt32Array(f,"rearranged_twiddle_tab_stride1_arr_%d_q15" % n,list(tab1Offset))
  235. printHUInt32Array(h,"rearranged_twiddle_tab_stride1_arr_%d_q15" % n,list(tab1Offset))
  236. printCUInt32Array(f,"rearranged_twiddle_tab_stride2_arr_%d_q15" % n,list(tab2Offset))
  237. printHUInt32Array(h,"rearranged_twiddle_tab_stride2_arr_%d_q15" % n,list(tab2Offset))
  238. printCUInt32Array(f,"rearranged_twiddle_tab_stride3_arr_%d_q15" % n,list(tab3Offset))
  239. printHUInt32Array(h,"rearranged_twiddle_tab_stride3_arr_%d_q15" % n,list(tab3Offset))
  240. printCQ15Array(f,"rearranged_twiddle_stride1_%d_q15" % n,list(tab1))
  241. printHQ15Array(h,"rearranged_twiddle_stride1_%d_q15" % n,list(tab1))
  242. printCQ15Array(f,"rearranged_twiddle_stride2_%d_q15" % n,list(tab2))
  243. printHQ15Array(h,"rearranged_twiddle_stride2_%d_q15" % n,list(tab2))
  244. printCQ15Array(f,"rearranged_twiddle_stride3_%d_q15" % n,list(tab3))
  245. printHQ15Array(h,"rearranged_twiddle_stride3_%d_q15" % n,list(tab3))
  246. print("#endif\n",file=f)
  247. print("#endif\n",file=h)
  248. #test = twiddle(16)
  249. #printCFloat32Array("Test",list(test))
  250. cheader="""/* ----------------------------------------------------------------------
  251. * Project: CMSIS DSP Library
  252. * Title: arm_mve_tables%s.c
  253. * Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc
  254. * used for MVE implementation only
  255. *
  256. * @version V1.10.0
  257. * @date 04 October 2021
  258. *
  259. * Target Processor: Cortex-M and Cortex-A cores
  260. * -------------------------------------------------------------------- */
  261. /*
  262. * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
  263. *
  264. * SPDX-License-Identifier: Apache-2.0
  265. *
  266. * Licensed under the Apache License, Version 2.0 (the License); you may
  267. * not use this file except in compliance with the License.
  268. * You may obtain a copy of the License at
  269. *
  270. * www.apache.org/licenses/LICENSE-2.0
  271. *
  272. * Unless required by applicable law or agreed to in writing, software
  273. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  274. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  275. * See the License for the specific language governing permissions and
  276. * limitations under the License.
  277. */
  278. #include "arm_math_types%s.h"
  279. """
  280. cifdeMVEF="""
  281. #if defined(%s) && !defined(ARM_MATH_AUTOVECTORIZE)
  282. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
  283. """
  284. cfooterMVEF="""
  285. #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
  286. #endif /* defined(%s) && !defined(ARM_MATH_AUTOVECTORIZE) */
  287. """
  288. cifdeMVEI="""
  289. #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
  290. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
  291. """
  292. cfooterMVEI="""
  293. #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
  294. #endif /* defined(ARM_MATH_MVEI) */
  295. """
  296. hheader="""/* ----------------------------------------------------------------------
  297. * Project: CMSIS DSP Library
  298. * Title: arm_mve_tables%s.h
  299. * Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc
  300. * used for MVE implementation only
  301. *
  302. * @version V1.10.0
  303. * @date 04 October 2021
  304. *
  305. * Target Processor: Cortex-M and Cortex-A cores
  306. * -------------------------------------------------------------------- */
  307. /*
  308. * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
  309. *
  310. * SPDX-License-Identifier: Apache-2.0
  311. *
  312. * Licensed under the Apache License, Version 2.0 (the License); you may
  313. * not use this file except in compliance with the License.
  314. * You may obtain a copy of the License at
  315. *
  316. * www.apache.org/licenses/LICENSE-2.0
  317. *
  318. * Unless required by applicable law or agreed to in writing, software
  319. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  320. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  321. * See the License for the specific language governing permissions and
  322. * limitations under the License.
  323. */
  324. #ifndef _ARM_MVE_TABLES_%sH
  325. #define _ARM_MVE_TABLES_%sH
  326. #include "arm_math_types%s.h"
  327. #ifdef __cplusplus
  328. extern "C"
  329. {
  330. #endif
  331. """
  332. hifdefMVEF="""
  333. #if defined(%s) && !defined(ARM_MATH_AUTOVECTORIZE)
  334. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
  335. """
  336. hfooterMVEF="""
  337. #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
  338. #endif /* defined(%s) && !defined(ARM_MATH_AUTOVECTORIZE) */
  339. """
  340. hifdefMVEI="""
  341. #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
  342. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
  343. """
  344. hfooterMVEI="""
  345. #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
  346. #endif /* defined(ARM_MATH_MVEI) */
  347. """
  348. hfooter="""
  349. #ifdef __cplusplus
  350. }
  351. #endif
  352. #endif /*_ARM_MVE_TABLES_%sH*/
  353. """
  354. with open(args.f16,'w') as f:
  355. with open(args.he16,'w') as h:
  356. print(cheader % ("_f16","_f16"),file=f)
  357. print(hheader % ("_f16","F16_","F16_","_f16"),file=h)
  358. print("#if defined(ARM_FLOAT16_SUPPORTED)",file=f)
  359. print(cifdeMVEF % ("ARM_MATH_MVE_FLOAT16",),file=f)
  360. print(hifdefMVEF % "ARM_MATH_MVE_FLOAT16",file=h)
  361. reorderTwiddle(F16,False,f,h,16)
  362. reorderTwiddle(F16,False,f,h,64)
  363. reorderTwiddle(F16,False,f,h,256)
  364. reorderTwiddle(F16,False,f,h,1024)
  365. reorderTwiddle(F16,False,f,h,4096)
  366. print(cfooterMVEF % ("ARM_MATH_MVE_FLOAT16"),file=f)
  367. print(hfooterMVEF % "ARM_MATH_MVE_FLOAT16",file=h)
  368. print("#endif /* if defined(ARM_FLOAT16_SUPPORTED) */",file=f)
  369. print(hfooter % "F16_",file=h)
  370. with open(args.f,'w') as f:
  371. with open(args.he,'w') as h:
  372. print(cheader % ("",""),file=f)
  373. print(hheader % ("","","",""),file=h)
  374. print(cifdeMVEF % ("ARM_MATH_MVEF",),file=f)
  375. print(hifdefMVEF % "ARM_MATH_MVEF",file=h)
  376. reorderTwiddle(F32,False,f,h,16)
  377. reorderTwiddle(F32,False,f,h,64)
  378. reorderTwiddle(F32,False,f,h,256)
  379. reorderTwiddle(F32,False,f,h,1024)
  380. reorderTwiddle(F32,False,f,h,4096)
  381. print(cfooterMVEF % ("ARM_MATH_MVEF"),file=f)
  382. print(hfooterMVEF % "ARM_MATH_MVEF",file=h)
  383. print(cifdeMVEI,file=f)
  384. print(hifdefMVEI,file=h)
  385. reorderTwiddle(Q31,True,f,h,16)
  386. reorderTwiddle(Q31,True,f,h,64)
  387. reorderTwiddle(Q31,True,f,h,256)
  388. reorderTwiddle(Q31,True,f,h,1024)
  389. reorderTwiddle(Q31,True,f,h,4096)
  390. print(cfooterMVEI,file=f)
  391. print(hfooterMVEI,file=h)
  392. print(cifdeMVEI,file=f)
  393. print(hifdefMVEI,file=h)
  394. reorderTwiddle(Q15,True,f,h,16)
  395. reorderTwiddle(Q15,True,f,h,64)
  396. reorderTwiddle(Q15,True,f,h,256)
  397. reorderTwiddle(Q15,True,f,h,1024)
  398. reorderTwiddle(Q15,True,f,h,4096)
  399. print(cfooterMVEI,file=f)
  400. print(hfooterMVEI,file=h)
  401. #print(cifdeMVEI,file=f)
  402. #print(hifdefMVEI,file=h)
  403. #reorderTwiddle(Q7,True,f,h,16)
  404. #reorderTwiddle(Q7,True,f,h,64)
  405. #reorderTwiddle(Q7,True,f,h,256)
  406. #reorderTwiddle(Q7,True,f,h,1024)
  407. #reorderTwiddle(Q7,True,f,h,4096)
  408. #print(cfooterMVEI,file=f)
  409. #print(hfooterMVEI,file=h)
  410. print(hfooter % "",file=h)