cpuinfo.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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_rv32imafd,
  35. cpu_rv32ec,
  36. cpu_rv32gc,
  37. cpu_rv32gcb
  38. );
  39. tfputype =
  40. (fpu_none,
  41. fpu_libgcc,
  42. fpu_soft,
  43. fpu_fd
  44. );
  45. tcontrollertype =
  46. (ct_none,
  47. ct_fe310g000,
  48. ct_fe310g002,
  49. ct_hifive1,
  50. ct_hifive1revb,
  51. ct_redfive,
  52. ct_redfivething,
  53. ct_gd32vf103c4,
  54. ct_gd32vf103c6,
  55. ct_gd32vf103c8,
  56. ct_gd32vf103cb,
  57. ct_gd32vf103r4,
  58. ct_gd32vf103r6,
  59. ct_gd32vf103r8,
  60. ct_gd32vf103rb,
  61. ct_gd32vf103t4,
  62. ct_gd32vf103t6,
  63. ct_gd32vf103t8,
  64. ct_gd32vf103tb,
  65. ct_gd32vf103v8,
  66. ct_gd32vf103vb,
  67. ct_ch32v303cb,
  68. ct_ch32v303rb,
  69. ct_ch32v303rc,
  70. ct_ch32v303vc,
  71. ct_ch32v305fb,
  72. ct_ch32v305rb,
  73. ct_ch32v307rc,
  74. ct_ch32v307wc,
  75. ct_ch32V307vc,
  76. ct_esp32c2,
  77. ct_esp32c3,
  78. ct_esp32c6,
  79. ct_CH32V0x,
  80. ct_CH32Vxxxx6,
  81. ct_CH32Vxxxx8,
  82. ct_CH32VxxxxB,
  83. ct_CH32VxxxxC
  84. );
  85. tcontrollerdatatype = record
  86. controllertypestr, controllerunitstr: string[20];
  87. cputype: tcputype; fputype: tfputype;
  88. flashbase, flashsize, srambase, sramsize, eeprombase, eepromsize, bootbase, bootsize: dword;
  89. end;
  90. Const
  91. { Is there support for dealing with multiple microcontrollers available }
  92. { for this platform? }
  93. ControllerSupport = true;
  94. { We know that there are fields after sramsize
  95. but we don't care about this warning }
  96. {$PUSH}
  97. {$WARN 3177 OFF}
  98. embedded_controllers : array [tcontrollertype] of tcontrollerdatatype =
  99. (
  100. (controllertypestr:'' ; controllerunitstr:''; cputype:cpu_none; fputype:fpu_none; flashbase:0; flashsize:0; srambase:0; sramsize:0),
  101. (controllertypestr:'FE310G000' ; controllerunitstr:'FE310G000'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20400000; flashsize:$01000000; srambase:$80000000; sramsize:$00004000),
  102. (controllertypestr:'FE310G002' ; controllerunitstr:'FE310G002'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20010000; flashsize:$00400000; srambase:$80000000; sramsize:$00004000),
  103. (controllertypestr:'HIFIVE1' ; controllerunitstr:'FE310G000'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20400000; flashsize:$01000000; srambase:$80000000; sramsize:$00004000),
  104. (controllertypestr:'HIFIVE1REVB' ; controllerunitstr:'FE310G002'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20010000; flashsize:$00400000; srambase:$80000000; sramsize:$00004000),
  105. (controllertypestr:'REDFIVE' ; controllerunitstr:'FE310G002'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20010000; flashsize:$00400000; srambase:$80000000; sramsize:$00004000),
  106. (controllertypestr:'REDFIVETHING'; controllerunitstr:'FE310G002'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$20010000; flashsize:$02400000; srambase:$80000000; sramsize:$00004000),
  107. (controllertypestr:'GD32VF103C4' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001800),
  108. (controllertypestr:'GD32VF103C6' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
  109. (controllertypestr:'GD32VF103C8' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
  110. (controllertypestr:'GD32VF103CB' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  111. (controllertypestr:'GD32VF103R4' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001800),
  112. (controllertypestr:'GD32VF103R6' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
  113. (controllertypestr:'GD32VF103R8' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
  114. (controllertypestr:'GD32VF103RB' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  115. (controllertypestr:'GD32VF103T4' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001800),
  116. (controllertypestr:'GD32VF103T6' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
  117. (controllertypestr:'GD32VF103T8' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
  118. (controllertypestr:'GD32VF103TB' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  119. (controllertypestr:'GD32VF103V8' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
  120. (controllertypestr:'GD32VF103VB' ; controllerunitstr:'GD32VF103XX'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  121. (controllertypestr:'CH32V303CB'; controllerunitstr:'CH32V303'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  122. (controllertypestr:'CH32V303RB'; controllerunitstr:'CH32V303'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  123. (controllertypestr:'CH32V303RC'; controllerunitstr:'CH32V303'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  124. (controllertypestr:'CH32V303VC'; controllerunitstr:'CH32V303'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  125. (controllertypestr:'CH32V305FB'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  126. (controllertypestr:'CH32V305RB'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00008000),
  127. (controllertypestr:'CH32V307RC'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  128. (controllertypestr:'CH32V307WC'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  129. (controllertypestr:'CH32V307VC'; controllerunitstr:'CH32V307'; cputype:cpu_rv32imac; fputype:fpu_fd; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
  130. (controllertypestr:'ESP32C2'; controllerunitstr:'ESP32C2'; cputype:cpu_rv32imc; fputype:fpu_none; flashbase:$00000000; flashsize:4*1024*1024; srambase:$20000000; sramsize:272*1024),
  131. (controllertypestr:'ESP32C3'; controllerunitstr:'ESP32C3'; cputype:cpu_rv32imc; fputype:fpu_none; flashbase:$00000000; flashsize:4*1024*1024; srambase:$20000000; sramsize:400*1024),
  132. (controllertypestr:'ESP32C6'; controllerunitstr:'ESP32C6'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:4*1024*1024; srambase:$20000000; sramsize:512*1024),
  133. (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),
  134. (controllertypestr:'CH32VXXXX6' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
  135. (controllertypestr:'CH32VXXXX8' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:$00010000; srambase:$20000000; sramsize:$00008000),
  136. (controllertypestr:'CH32VXXXXB' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:$00020000; srambase:$20000000; sramsize:$00010000),
  137. (controllertypestr:'CH32VXXXXC' ; controllerunitstr:'CH32VxBootstrap'; cputype:cpu_rv32imac; fputype:fpu_none; flashbase:$00000000; flashsize:$00040000; srambase:$20000000; sramsize:$00020000)
  138. );
  139. {$POP}
  140. { calling conventions supported by the code generator }
  141. supported_calling_conventions : tproccalloptions = [
  142. pocall_internproc,
  143. pocall_safecall,
  144. pocall_stdcall,
  145. { the difference to stdcall is only the name mangling }
  146. pocall_cdecl,
  147. { the difference to stdcall is only the name mangling }
  148. pocall_cppdecl,
  149. { pass all const records by reference }
  150. pocall_mwpascal
  151. ];
  152. cputypestr : array[tcputype] of string[10] = ('',
  153. 'RV32IMAC',
  154. 'RV32IMA',
  155. 'RV32IM',
  156. 'RV32I',
  157. 'RV32E',
  158. 'RV32IMC',
  159. 'RV32IMAFDC',
  160. 'RV32IMAFD',
  161. 'RV32EC',
  162. 'RV32GC',
  163. 'RV32GCB'
  164. );
  165. fputypestr : array[tfputype] of string[8] = (
  166. 'LIBGCC',
  167. 'NONE',
  168. 'SOFT',
  169. 'FD'
  170. );
  171. { Supported optimizations, only used for information }
  172. supported_optimizerswitches = genericlevel1optimizerswitches+
  173. genericlevel2optimizerswitches+
  174. genericlevel3optimizerswitches-
  175. { no need to write info about those }
  176. [cs_opt_level1,cs_opt_level2,cs_opt_level3]+
  177. [{$ifndef llvm}cs_opt_regvar,{$endif}cs_opt_loopunroll,cs_opt_nodecse,
  178. cs_opt_tailrecursion,cs_opt_reorder_fields,cs_opt_fastmath,
  179. cs_opt_stackframe];
  180. level1optimizerswitches = genericlevel1optimizerswitches;
  181. level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches + [{$ifndef llvm}cs_opt_regvar,{$endif}cs_opt_nodecse,cs_opt_tailrecursion,cs_opt_consts];
  182. level3optimizerswitches = genericlevel3optimizerswitches + level2optimizerswitches;
  183. level4optimizerswitches = genericlevel4optimizerswitches + level3optimizerswitches + [cs_opt_stackframe];
  184. type
  185. tcpuflags =
  186. (CPURV_HAS_MUL,
  187. CPURV_HAS_ATOMIC,
  188. CPURV_HAS_COMPACT,
  189. CPURV_HAS_16REGISTERS,
  190. CPURV_HAS_ZBA,
  191. CPURV_HAS_ZBB,
  192. CPURV_HAS_ZBC,
  193. CPURV_HAS_ZBS,
  194. CPURV_HAS_CSR_INSTRUCTIONS, { extension Zicsr }
  195. CPURV_HAS_FETCH_FENCE, { extension Zifencei }
  196. CPURV_HAS_F,
  197. CPURV_HAS_D,
  198. CPURV_HAS_Q,
  199. CPURV_HAS_ZFH,
  200. CPURV_HAS_ZFHMIN,
  201. CPURV_HAS_ZFA,
  202. CPURV_HAS_ZFINX,
  203. CPURV_HAS_ZDINX,
  204. CPURV_HAS_ZHINX,
  205. CPURV_HAS_ZHINXMIN,
  206. CPURV_HAS_ZICOND,
  207. CPURV_HAS_ZMMUL
  208. );
  209. const
  210. cpu_capabilities : array[tcputype] of set of tcpuflags =
  211. ( { cpu_none } [],
  212. { cpu_rv32imac } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_COMPACT],
  213. { cpu_rv32ima } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC],
  214. { cpu_rv32im } [CPURV_HAS_MUL],
  215. { cpu_rv32i } [],
  216. { cpu_rv32e } [CPURV_HAS_16REGISTERS],
  217. { cpu_rv32imc } [CPURV_HAS_MUL,CPURV_HAS_COMPACT],
  218. { cpu_rv32imafdc} [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_COMPACT,CPURV_HAS_F,CPURV_HAS_D],
  219. { cpu_rv32imafd } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_F,CPURV_HAS_D],
  220. { cpu_rv32ec } [CPURV_HAS_16REGISTERS,CPURV_HAS_COMPACT],
  221. { cpu_rv32gc } [CPURV_HAS_MUL,CPURV_HAS_ATOMIC,CPURV_HAS_COMPACT,CPURV_HAS_F,CPURV_HAS_D],
  222. { 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]
  223. );
  224. Implementation
  225. end.