cpuinfo.pas 12 KB

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