cpuinfo.pas 13 KB

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