cpuinfo.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. {
  2. Copyright (c) 1998-2002 by the Free Pascal development team
  3. Basic Processor information for the Risc-V32
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. Unit CPUInfo;
  11. {$i fpcdefs.inc}
  12. Interface
  13. uses
  14. globtype;
  15. Type
  16. bestreal = double;
  17. bestrealrec = TDoubleRec;
  18. ts32real = single;
  19. ts64real = double;
  20. ts80real = extended;
  21. ts128real = extended;
  22. ts64comp = comp;
  23. pbestreal=^bestreal;
  24. { possible supported processors for this target }
  25. tcputype =
  26. (cpu_none,
  27. cpu_rv32imac,
  28. cpu_rv32ima,
  29. cpu_rv32im,
  30. cpu_rv32i,
  31. cpu_rv32e,
  32. cpu_rv32imc,
  33. cpu_rv32imafdc,
  34. cpu_rv32imaf,
  35. cpu_rv32imafd,
  36. cpu_rv32ec,
  37. cpu_rv32gc,
  38. cpu_rv32gcb
  39. );
  40. tfputype =
  41. (fpu_none,
  42. fpu_libgcc,
  43. fpu_soft,
  44. fpu_fd
  45. );
  46. tcontrollertype =
  47. (ct_none,
  48. ct_fe310g000,
  49. ct_fe310g002,
  50. ct_hifive1,
  51. ct_hifive1revb,
  52. ct_redfive,
  53. ct_redfivething,
  54. ct_gd32vf103c4,
  55. ct_gd32vf103c6,
  56. ct_gd32vf103c8,
  57. ct_gd32vf103cb,
  58. ct_gd32vf103r4,
  59. ct_gd32vf103r6,
  60. ct_gd32vf103r8,
  61. ct_gd32vf103rb,
  62. ct_gd32vf103t4,
  63. ct_gd32vf103t6,
  64. ct_gd32vf103t8,
  65. ct_gd32vf103tb,
  66. ct_gd32vf103v8,
  67. ct_gd32vf103vb,
  68. ct_ch32v303cb,
  69. ct_ch32v303rb,
  70. ct_ch32v303rc,
  71. ct_ch32v303vc,
  72. ct_ch32v305fb,
  73. ct_ch32v305rb,
  74. ct_ch32v307rc,
  75. ct_ch32v307wc,
  76. ct_ch32V307vc,
  77. ct_esp32c2,
  78. ct_esp32c3,
  79. ct_esp32c6,
  80. ct_CH32V0x,
  81. ct_CH32Vxxxx6,
  82. ct_CH32Vxxxx8,
  83. ct_CH32VxxxxB,
  84. ct_CH32VxxxxC
  85. );
  86. tcontrollerdatatype = record
  87. controllertypestr, controllerunitstr: string[20];
  88. cputype: tcputype; fputype: tfputype;
  89. flashbase, flashsize, srambase, sramsize, eeprombase, eepromsize, bootbase, bootsize: dword;
  90. end;
  91. Const
  92. { Is there support for dealing with multiple microcontrollers available }
  93. { for this platform? }
  94. ControllerSupport = true;
  95. { We know that there are fields after sramsize
  96. but we don't care about this warning }
  97. {$PUSH}
  98. {$WARN 3177 OFF}
  99. embedded_controllers : array [tcontrollertype] of tcontrollerdatatype =
  100. (
  101. (controllertypestr:'' ; controllerunitstr:''; cputype:cpu_none; fputype:fpu_none; flashbase:0; flashsize:0; srambase:0; sramsize:0),
  102. (controllertypestr:'FE310G000' ; controllerunitstr:'FE310G000'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20400000; flashsize:$01000000; srambase:$80000000; sramsize:$00004000),
  103. (controllertypestr:'FE310G002' ; controllerunitstr:'FE310G002'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20010000; flashsize:$00400000; srambase:$80000000; sramsize:$00004000),
  104. (controllertypestr:'HIFIVE1' ; controllerunitstr:'FE310G000'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20400000; flashsize:$01000000; srambase:$80000000; sramsize:$00004000),
  105. (controllertypestr:'HIFIVE1REVB' ; controllerunitstr:'FE310G002'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20010000; flashsize:$00400000; srambase:$80000000; sramsize:$00004000),
  106. (controllertypestr:'REDFIVE' ; controllerunitstr:'FE310G002'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20010000; flashsize:$00400000; srambase:$80000000; sramsize:$00004000),
  107. (controllertypestr:'REDFIVETHING'; controllerunitstr:'FE310G002'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20010000; flashsize:$02400000; srambase:$80000000; sramsize:$00004000),
  108. (controllertypestr:'GD32VF103C4' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001800),
  109. (controllertypestr:'GD32VF103C6' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
  110. (controllertypestr:'GD32VF103C8' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
  111. (controllertypestr:'GD32VF103CB' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  112. (controllertypestr:'GD32VF103R4' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001800),
  113. (controllertypestr:'GD32VF103R6' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
  114. (controllertypestr:'GD32VF103R8' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
  115. (controllertypestr:'GD32VF103RB' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  116. (controllertypestr:'GD32VF103T4' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001800),
  117. (controllertypestr:'GD32VF103T6' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
  118. (controllertypestr:'GD32VF103T8' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
  119. (controllertypestr:'GD32VF103TB' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  120. (controllertypestr:'GD32VF103V8' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
  121. (controllertypestr:'GD32VF103VB' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  122. (controllertypestr:'CH32V303CB'; controllerunitstr:'CH32V303'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  123. (controllertypestr:'CH32V303RB'; controllerunitstr:'CH32V303'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  124. (controllertypestr:'CH32V303RC'; controllerunitstr:'CH32V303'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  125. (controllertypestr:'CH32V303VC'; controllerunitstr:'CH32V303'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  126. (controllertypestr:'CH32V305FB'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  127. (controllertypestr:'CH32V305RB'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  128. (controllertypestr:'CH32V307RC'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  129. (controllertypestr:'CH32V307WC'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  130. (controllertypestr:'CH32V307VC'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  131. (controllertypestr:'ESP32C2'; controllerunitstr:'ESP32C2'; cputype:cpu_rv32imc; fputype:fpu_none; flashbase:$00000000; flashsize:4*1024*1024; srambase:$20000000; sramsize:272*1024),
  132. (controllertypestr:'ESP32C3'; controllerunitstr:'ESP32C3'; cputype:cpu_rv32imc; fputype:fpu_none; flashbase:$00000000; flashsize:4*1024*1024; srambase:$20000000; sramsize:400*1024),
  133. (controllertypestr:'ESP32C6'; controllerunitstr:'ESP32C6'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:4*1024*1024; srambase:$20000000; sramsize:512*1024),
  134. (controllertypestr:'CH32V0X' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32e; fputype:fpu_none; flashbase:$00000000; flashsize:$00004000; srambase:$20000000; sramsize:$00000800; eeprombase:0; eepromsize:0;BootBase:$1FFFF000; BootSize:1920),
  135. (controllertypestr:'CH32VXXXX6' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
  136. (controllertypestr:'CH32VXXXX8' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:$00010000; srambase:$20000000; sramsize:$00008000),
  137. (controllertypestr:'CH32VXXXXB' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00010000),
  138. (controllertypestr:'CH32VXXXXC' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00020000)
  139. );
  140. {$POP}
  141. { calling conventions supported by the code generator }
  142. supported_calling_conventions : tproccalloptions = [
  143. pocall_internproc,
  144. pocall_safecall,
  145. pocall_stdcall,
  146. { the difference to stdcall is only the name mangling }
  147. pocall_cdecl,
  148. { the difference to stdcall is only the name mangling }
  149. pocall_cppdecl,
  150. { pass all const records by reference }
  151. pocall_mwpascal
  152. ];
  153. cputypestr : array[tcputype] of string[10] = ('',
  154. 'RV32IMAC',
  155. 'RV32IMA',
  156. 'RV32IM',
  157. 'RV32I',
  158. 'RV32E',
  159. 'RV32IMC',
  160. 'RV32IMAFDC',
  161. 'RV32IMAF',
  162. 'RV32IMAFD',
  163. 'RV32EC',
  164. 'RV32GC',
  165. 'RV32GCB'
  166. );
  167. fputypestr : array[tfputype] of string[8] = (
  168. 'LIBGCC',
  169. 'NONE',
  170. 'SOFT',
  171. 'FD'
  172. );
  173. { Supported optimizations, only used for information }
  174. supported_optimizerswitches = genericlevel1optimizerswitches+
  175. genericlevel2optimizerswitches+
  176. genericlevel3optimizerswitches-
  177. { no need to write info about those }
  178. [cs_opt_level1,cs_opt_level2,cs_opt_level3]+
  179. [{$ifndef llvm}cs_opt_regvar,{$endif}cs_opt_loopunroll,cs_opt_nodecse,
  180. cs_opt_tailrecursion,cs_opt_reorder_fields,cs_opt_fastmath,
  181. cs_opt_stackframe];
  182. level1optimizerswitches = genericlevel1optimizerswitches;
  183. level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches + [{$ifndef llvm}cs_opt_regvar,{$endif}cs_opt_nodecse,cs_opt_tailrecursion,cs_opt_consts];
  184. level3optimizerswitches = genericlevel3optimizerswitches + level2optimizerswitches;
  185. level4optimizerswitches = genericlevel4optimizerswitches + level3optimizerswitches + [cs_opt_stackframe];
  186. type
  187. tcpuflags =
  188. (CPURV_HAS_MUL,
  189. CPURV_HAS_ATOMIC,
  190. CPURV_HAS_COMPACT,
  191. CPURV_HAS_16REGISTERS,
  192. CPURV_HAS_ZBA,
  193. CPURV_HAS_ZBB,
  194. CPURV_HAS_ZBC,
  195. CPURV_HAS_ZBS,
  196. CPURV_HAS_ZBKB,
  197. CPURV_HAS_ZBKC,
  198. CPURV_HAS_ZBKX,
  199. CPURV_HAS_CSR_INSTRUCTIONS, { extension Zicsr }
  200. CPURV_HAS_FETCH_FENCE, { extension Zifencei }
  201. CPURV_HAS_F,
  202. CPURV_HAS_D,
  203. CPURV_HAS_Q,
  204. CPURV_HAS_ZFH,
  205. CPURV_HAS_ZFHMIN,
  206. CPURV_HAS_ZFA,
  207. CPURV_HAS_ZFINX,
  208. CPURV_HAS_ZDINX,
  209. CPURV_HAS_ZHINX,
  210. CPURV_HAS_ZHINXMIN,
  211. CPURV_HAS_ZICOND,
  212. CPURV_HAS_ZMMUL
  213. );
  214. const
  215. cpu_capabilities : array[tcputype] of set of tcpuflags =
  216. ( { cpu_none } [],
  217. { cpu_rv32imac } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_COMPACT],
  218. { cpu_rv32ima } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC],
  219. { cpu_rv32im } [CPURV_HAS_MUL],
  220. { cpu_rv32i } [],
  221. { cpu_rv32e } [CPURV_HAS_16REGISTERS],
  222. { cpu_rv32imc } [CPURV_HAS_MUL,CPURV_HAS_COMPACT],
  223. { cpu_rv32imafdc} [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_COMPACT,CPURV_HAS_F,CPURV_HAS_D],
  224. { cpu_rv32imaf } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_F],
  225. { cpu_rv32imafd } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_F,CPURV_HAS_D],
  226. { cpu_rv32ec } [CPURV_HAS_16REGISTERS,CPURV_HAS_COMPACT],
  227. { cpu_rv32gc } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_COMPACT,CPURV_HAS_F,CPURV_HAS_D],
  228. { cpu_rv32gc } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_COMPACT,CPURV_HAS_F,CPURV_HAS_D,CPURV_HAS_ZBA,CPURV_HAS_ZBB,CPURV_HAS_ZBS]
  229. );
  230. Implementation
  231. end.