genMVETwiddleCoefs.py 17 KB

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