udb 0.1.9 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/.data/cfgs/example_rv64_with_overlay.yaml +5 -2
  3. data/.data/cfgs/mc100-32-full-example.yaml +1 -0
  4. data/.data/cfgs/profile/README.adoc +10 -0
  5. data/.data/cfgs/profile/RVA20S64.yaml +26 -6
  6. data/.data/cfgs/profile/RVA20U64.yaml +18 -4
  7. data/.data/cfgs/profile/RVA22S64.yaml +27 -7
  8. data/.data/cfgs/profile/RVA22U64.yaml +18 -4
  9. data/.data/cfgs/profile/RVA23S64.yaml +61 -7
  10. data/.data/cfgs/profile/RVA23U64.yaml +36 -4
  11. data/.data/cfgs/profile/RVB23S64.yaml +27 -7
  12. data/.data/cfgs/profile/RVB23U64.yaml +18 -4
  13. data/.data/cfgs/profile/RVI20U32.yaml +10 -4
  14. data/.data/cfgs/profile/RVI20U64.yaml +10 -4
  15. data/.data/cfgs/qc_iu.yaml +4 -1
  16. data/.data/cfgs/rv32-riscv-tests.yaml +2 -1
  17. data/.data/cfgs/rv32-vector.yaml +2 -1
  18. data/.data/cfgs/rv64-riscv-tests.yaml +2 -1
  19. data/.data/cfgs/rv64-vector.yaml +2 -1
  20. data/.data/spec/custom/isa/qc_iu/csr/Smrnmi/mnepc.yaml +17 -0
  21. data/.data/spec/custom/isa/qc_iu/csr/Xqccmi/qc.itba.yaml +45 -0
  22. data/.data/spec/custom/isa/qc_iu/csr/Xqccmi/qc.itdec.yaml +39 -0
  23. data/.data/spec/custom/isa/qc_iu/csr/jvt.yaml +11 -0
  24. data/.data/spec/custom/isa/qc_iu/csr/mepc.yaml +16 -0
  25. data/.data/spec/custom/isa/qc_iu/ext/Xqccmi.yaml +219 -0
  26. data/.data/spec/custom/isa/qc_iu/ext/Xqccmt.yaml +127 -0
  27. data/.data/spec/custom/isa/qc_iu/inst/Xqccmi/qc.cm.ilut.yaml +153 -0
  28. data/.data/spec/custom/isa/qc_iu/inst/Xqccmt/qc.cm.jalt.yaml +84 -0
  29. data/.data/spec/custom/isa/qc_iu/inst/Xqccmt/qc.cm.jt.yaml +60 -0
  30. data/.data/spec/custom/isa/qc_iu/isa/globals.isa +112 -0
  31. data/.data/spec/schemas/config_schema.json +219 -26
  32. data/.data/spec/schemas/csr_schema.json +0 -6
  33. data/.data/spec/schemas/ext_schema.json +80 -24
  34. data/.data/spec/schemas/inst_schema.json +0 -3
  35. data/.data/spec/schemas/profile_release_schema.json +1 -1
  36. data/.data/spec/schemas/profile_schema.json +0 -3
  37. data/.data/spec/schemas/register_file_schema.json +8 -3
  38. data/.data/spec/schemas/schema_defs.json +8 -27
  39. data/.data/spec/std/isa/csr/I/pmpcfg0.yaml +8 -8
  40. data/.data/spec/std/isa/csr/I/pmpcfg1.yaml +4 -4
  41. data/.data/spec/std/isa/csr/I/pmpcfg10.yaml +8 -8
  42. data/.data/spec/std/isa/csr/I/pmpcfg11.yaml +4 -4
  43. data/.data/spec/std/isa/csr/I/pmpcfg12.yaml +8 -8
  44. data/.data/spec/std/isa/csr/I/pmpcfg13.yaml +4 -4
  45. data/.data/spec/std/isa/csr/I/pmpcfg14.yaml +8 -8
  46. data/.data/spec/std/isa/csr/I/pmpcfg15.yaml +4 -4
  47. data/.data/spec/std/isa/csr/I/pmpcfg2.yaml +8 -8
  48. data/.data/spec/std/isa/csr/I/pmpcfg3.yaml +4 -4
  49. data/.data/spec/std/isa/csr/I/pmpcfg4.yaml +8 -8
  50. data/.data/spec/std/isa/csr/I/pmpcfg5.yaml +4 -4
  51. data/.data/spec/std/isa/csr/I/pmpcfg6.yaml +8 -8
  52. data/.data/spec/std/isa/csr/I/pmpcfg7.yaml +4 -4
  53. data/.data/spec/std/isa/csr/I/pmpcfg8.yaml +8 -8
  54. data/.data/spec/std/isa/csr/I/pmpcfg9.yaml +4 -4
  55. data/.data/spec/std/isa/csr/I/pmpcfgN.layout +1 -1
  56. data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.layout +6 -2
  57. data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.yaml +6 -2
  58. data/.data/spec/std/isa/csr/hstatus.yaml +16 -0
  59. data/.data/spec/std/isa/csr/mcycleh.yaml +1 -1
  60. data/.data/spec/std/isa/csr/misa.yaml +0 -12
  61. data/.data/spec/std/isa/csr/mstatus.yaml +38 -0
  62. data/.data/spec/std/isa/csr/mstatush.yaml +17 -15
  63. data/.data/spec/std/isa/csr/senvcfg.yaml +16 -0
  64. data/.data/spec/std/isa/csr/sstatus.yaml +12 -0
  65. data/.data/spec/std/isa/csr/vsstatus.yaml +24 -0
  66. data/.data/spec/std/isa/ext/A.yaml +5 -7
  67. data/.data/spec/std/isa/ext/S.yaml +12 -0
  68. data/.data/spec/std/isa/ext/Smpmpmt.yaml +52 -0
  69. data/.data/spec/std/isa/ext/Sv32.yaml +7 -19
  70. data/.data/spec/std/isa/ext/Sv39.yaml +7 -19
  71. data/.data/spec/std/isa/ext/Sv48.yaml +4 -20
  72. data/.data/spec/std/isa/ext/Sv57.yaml +4 -20
  73. data/.data/spec/std/isa/ext/Svukte.yaml +71 -0
  74. data/.data/spec/std/isa/ext/Zawrs.yaml +1 -1
  75. data/.data/spec/std/isa/ext/Zihpm.yaml +0 -12
  76. data/.data/spec/std/isa/inst/C/c.addi.yaml +1 -0
  77. data/.data/spec/std/isa/inst/C/c.addi16sp.yaml +1 -0
  78. data/.data/spec/std/isa/inst/C/c.addiw.yaml +1 -0
  79. data/.data/spec/std/isa/inst/C/c.andi.yaml +1 -0
  80. data/.data/spec/std/isa/inst/C/c.ldsp.yaml +1 -1
  81. data/.data/spec/std/isa/inst/C/c.li.yaml +1 -0
  82. data/.data/spec/std/isa/inst/C/c.lui.yaml +1 -0
  83. data/.data/spec/std/isa/inst/C/c.mv.yaml +1 -1
  84. data/.data/spec/std/isa/inst/C/c.sdsp.yaml +1 -1
  85. data/.data/spec/std/isa/inst/D/fsgnj.d.yaml +3 -0
  86. data/.data/spec/std/isa/inst/D/fsgnjn.d.yaml +3 -0
  87. data/.data/spec/std/isa/inst/D/fsgnjx.d.yaml +3 -0
  88. data/.data/spec/std/isa/inst/F/fadd.s.yaml +5 -5
  89. data/.data/spec/std/isa/inst/F/fclass.s.yaml +2 -2
  90. data/.data/spec/std/isa/inst/F/fcvt.l.s.yaml +1 -1
  91. data/.data/spec/std/isa/inst/F/fcvt.lu.s.yaml +1 -1
  92. data/.data/spec/std/isa/inst/F/fcvt.s.l.yaml +1 -1
  93. data/.data/spec/std/isa/inst/F/fcvt.s.lu.yaml +1 -1
  94. data/.data/spec/std/isa/inst/F/fcvt.s.w.yaml +1 -1
  95. data/.data/spec/std/isa/inst/F/fcvt.s.wu.yaml +1 -1
  96. data/.data/spec/std/isa/inst/F/fcvt.w.s.yaml +1 -1
  97. data/.data/spec/std/isa/inst/F/fcvt.wu.s.yaml +1 -1
  98. data/.data/spec/std/isa/inst/F/fdiv.s.yaml +1 -1
  99. data/.data/spec/std/isa/inst/F/feq.s.yaml +2 -2
  100. data/.data/spec/std/isa/inst/F/fle.s.yaml +2 -2
  101. data/.data/spec/std/isa/inst/F/fleq.s.yaml +2 -2
  102. data/.data/spec/std/isa/inst/F/flt.s.yaml +2 -2
  103. data/.data/spec/std/isa/inst/F/fltq.s.yaml +2 -2
  104. data/.data/spec/std/isa/inst/F/flw.yaml +2 -2
  105. data/.data/spec/std/isa/inst/F/fmadd.s.yaml +1 -1
  106. data/.data/spec/std/isa/inst/F/fmax.s.yaml +6 -6
  107. data/.data/spec/std/isa/inst/F/fmin.s.yaml +6 -6
  108. data/.data/spec/std/isa/inst/F/fmsub.s.yaml +1 -1
  109. data/.data/spec/std/isa/inst/F/fmul.s.yaml +1 -1
  110. data/.data/spec/std/isa/inst/F/fmv.w.x.yaml +2 -2
  111. data/.data/spec/std/isa/inst/F/fmv.x.w.yaml +1 -1
  112. data/.data/spec/std/isa/inst/F/fnmadd.s.yaml +2 -2
  113. data/.data/spec/std/isa/inst/F/fnmsub.s.yaml +1 -1
  114. data/.data/spec/std/isa/inst/F/fsgnj.s.yaml +4 -4
  115. data/.data/spec/std/isa/inst/F/fsgnjn.s.yaml +3 -3
  116. data/.data/spec/std/isa/inst/F/fsgnjx.s.yaml +4 -4
  117. data/.data/spec/std/isa/inst/F/fsqrt.s.yaml +1 -1
  118. data/.data/spec/std/isa/inst/F/fsub.s.yaml +1 -1
  119. data/.data/spec/std/isa/inst/F/fsw.yaml +1 -1
  120. data/.data/spec/std/isa/inst/I/addi.yaml +1 -1
  121. data/.data/spec/std/isa/inst/I/addiw.yaml +1 -1
  122. data/.data/spec/std/isa/inst/I/andi.yaml +1 -1
  123. data/.data/spec/std/isa/inst/I/beq.yaml +1 -1
  124. data/.data/spec/std/isa/inst/I/bge.yaml +4 -2
  125. data/.data/spec/std/isa/inst/I/bgeu.yaml +3 -0
  126. data/.data/spec/std/isa/inst/I/blt.yaml +4 -2
  127. data/.data/spec/std/isa/inst/I/bltu.yaml +3 -0
  128. data/.data/spec/std/isa/inst/I/bne.yaml +1 -1
  129. data/.data/spec/std/isa/inst/I/slt.yaml +2 -2
  130. data/.data/spec/std/isa/inst/I/sltiu.yaml +1 -1
  131. data/.data/spec/std/isa/inst/I/sltu.yaml +1 -1
  132. data/.data/spec/std/isa/inst/I/sub.yaml +1 -1
  133. data/.data/spec/std/isa/inst/I/subw.yaml +1 -1
  134. data/.data/spec/std/isa/inst/I/xori.yaml +1 -1
  135. data/.data/spec/std/isa/inst/M/mul.yaml +0 -19
  136. data/.data/spec/std/isa/inst/Q/fsgnj.q.yaml +1 -1
  137. data/.data/spec/std/isa/inst/S/sret.yaml +3 -1
  138. data/.data/spec/std/isa/inst/V/vadd.vv.yaml +1 -5
  139. data/.data/spec/std/isa/inst/V/vfsgnjn.vv.yaml +3 -0
  140. data/.data/spec/std/isa/inst/V/vfsgnjx.vv.yaml +3 -0
  141. data/.data/spec/std/isa/inst/V/vl1re8.v.yaml +3 -0
  142. data/.data/spec/std/isa/inst/V/vl2re8.v.yaml +3 -0
  143. data/.data/spec/std/isa/inst/V/vl4re8.v.yaml +3 -0
  144. data/.data/spec/std/isa/inst/V/vl8re8.v.yaml +3 -0
  145. data/.data/spec/std/isa/inst/V/vle8.v.yaml +3 -8
  146. data/.data/spec/std/isa/inst/V/vmand.mm.yaml +3 -0
  147. data/.data/spec/std/isa/inst/V/vmfle.vv.yaml +3 -0
  148. data/.data/spec/std/isa/inst/V/vmflt.vv.yaml +3 -0
  149. data/.data/spec/std/isa/inst/V/vmnand.mm.yaml +3 -0
  150. data/.data/spec/std/isa/inst/V/vmsgt.vi.yaml +3 -0
  151. data/.data/spec/std/isa/inst/V/vmsgtu.vi.yaml +3 -0
  152. data/.data/spec/std/isa/inst/V/vmsle.vi.yaml +3 -0
  153. data/.data/spec/std/isa/inst/V/vmsle.vv.yaml +3 -0
  154. data/.data/spec/std/isa/inst/V/vmsleu.vi.yaml +3 -0
  155. data/.data/spec/std/isa/inst/V/vmsleu.vv.yaml +3 -0
  156. data/.data/spec/std/isa/inst/V/vmslt.vv.yaml +3 -0
  157. data/.data/spec/std/isa/inst/V/vmsltu.vv.yaml +3 -0
  158. data/.data/spec/std/isa/inst/V/vmv.v.i.yaml +2 -13
  159. data/.data/spec/std/isa/inst/V/vmv.x.s.yaml +1 -1
  160. data/.data/spec/std/isa/inst/V/vmxnor.mm.yaml +3 -0
  161. data/.data/spec/std/isa/inst/V/vmxor.mm.yaml +3 -0
  162. data/.data/spec/std/isa/inst/V/vnsrl.wx.yaml +3 -0
  163. data/.data/spec/std/isa/inst/V/vrsub.vx.yaml +3 -0
  164. data/.data/spec/std/isa/inst/V/vse8.v.yaml +3 -4
  165. data/.data/spec/std/isa/inst/V/vwadd.vx.yaml +3 -0
  166. data/.data/spec/std/isa/inst/V/vwaddu.vx.yaml +3 -0
  167. data/.data/spec/std/isa/inst/V/vxor.vi.yaml +4 -0
  168. data/.data/spec/std/isa/inst/Zalasr/lSIZE.AQRL.layout +40 -5
  169. data/.data/spec/std/isa/inst/Zalasr/lb.aq.yaml +17 -1
  170. data/.data/spec/std/isa/inst/Zalasr/lb.aqrl.yaml +17 -1
  171. data/.data/spec/std/isa/inst/Zalasr/ld.aq.yaml +17 -1
  172. data/.data/spec/std/isa/inst/Zalasr/ld.aqrl.yaml +17 -1
  173. data/.data/spec/std/isa/inst/Zalasr/lh.aq.yaml +17 -1
  174. data/.data/spec/std/isa/inst/Zalasr/lh.aqrl.yaml +17 -1
  175. data/.data/spec/std/isa/inst/Zalasr/lw.aq.yaml +17 -1
  176. data/.data/spec/std/isa/inst/Zalasr/lw.aqrl.yaml +17 -1
  177. data/.data/spec/std/isa/inst/Zalasr/sSIZE.AQRL.layout +46 -5
  178. data/.data/spec/std/isa/inst/Zalasr/sb.aqrl.yaml +16 -1
  179. data/.data/spec/std/isa/inst/Zalasr/sb.rl.yaml +16 -1
  180. data/.data/spec/std/isa/inst/Zalasr/sd.aqrl.yaml +16 -1
  181. data/.data/spec/std/isa/inst/Zalasr/sd.rl.yaml +16 -1
  182. data/.data/spec/std/isa/inst/Zalasr/sh.aqrl.yaml +16 -1
  183. data/.data/spec/std/isa/inst/Zalasr/sh.rl.yaml +16 -1
  184. data/.data/spec/std/isa/inst/Zalasr/sw.aqrl.yaml +16 -1
  185. data/.data/spec/std/isa/inst/Zalasr/sw.rl.yaml +16 -1
  186. data/.data/spec/std/isa/inst/Zbkb/packw.yaml +1 -1
  187. data/.data/spec/std/isa/inst/Zcd/c.fld.yaml +1 -1
  188. data/.data/spec/std/isa/inst/Zcd/c.fldsp.yaml +1 -1
  189. data/.data/spec/std/isa/inst/Zcd/c.fsdsp.yaml +1 -1
  190. data/.data/spec/std/isa/inst/Zcf/c.flwsp.yaml +1 -1
  191. data/.data/spec/std/isa/inst/Zcf/c.fswsp.yaml +1 -1
  192. data/.data/spec/std/isa/inst/Zcmp/cm.pop.yaml +1 -1
  193. data/.data/spec/std/isa/inst/Zcmp/cm.popret.yaml +1 -1
  194. data/.data/spec/std/isa/inst/Zcmp/cm.popretz.yaml +1 -1
  195. data/.data/spec/std/isa/inst/Zcmp/cm.push.yaml +2 -3
  196. data/.data/spec/std/isa/inst/Zfa/fround.s.yaml +1 -1
  197. data/.data/spec/std/isa/inst/Zfh/fcvt.h.s.yaml +6 -6
  198. data/.data/spec/std/isa/inst/Zfh/fcvt.s.h.yaml +5 -5
  199. data/.data/spec/std/isa/inst/Zfh/flh.yaml +1 -1
  200. data/.data/spec/std/isa/inst/Zfh/fmv.h.x.yaml +1 -1
  201. data/.data/spec/std/isa/inst/Zfh/fmv.x.h.yaml +1 -1
  202. data/.data/spec/std/isa/inst/Zfh/fsh.yaml +1 -1
  203. data/.data/spec/std/isa/inst/Zicsr/csrrc.yaml +1 -1
  204. data/.data/spec/std/isa/inst/Zicsr/csrrci.yaml +1 -1
  205. data/.data/spec/std/isa/inst/Zicsr/csrrs.yaml +2 -2
  206. data/.data/spec/std/isa/inst/Zicsr/csrrsi.yaml +1 -1
  207. data/.data/spec/std/isa/inst/Zicsr/csrrw.yaml +1 -1
  208. data/.data/spec/std/isa/inst/Zicsr/csrrwi.yaml +1 -1
  209. data/.data/spec/std/isa/isa/builtin_functions.idl +17 -0
  210. data/.data/spec/std/isa/isa/fp.idl +1 -5
  211. data/.data/spec/std/isa/isa/globals.isa +45 -14
  212. data/.data/spec/std/isa/isa/vec.idl +1 -2
  213. data/.data/spec/std/isa/manual_version/isa/20240411/isa_20240411.yaml +5 -5
  214. data/.data/spec/std/isa/param/COUNTINHIBIT_EN.yaml +8 -2
  215. data/.data/spec/std/isa/param/JVT_BASE_MASK.yaml +1 -1
  216. data/.data/spec/std/isa/param/MCOUNTINHIBIT_IMPLEMENTED.yaml +25 -0
  217. data/.data/spec/std/isa/param/MTVEC_MODES.yaml +10 -3
  218. data/.data/spec/std/isa/param/VLEN.yaml +2 -0
  219. data/.data/spec/std/isa/profile/RVA20S64.yaml +11 -4
  220. data/.data/spec/std/isa/profile/RVA20U64.yaml +14 -5
  221. data/.data/spec/std/isa/profile/RVA22S64.yaml +14 -3
  222. data/.data/spec/std/isa/profile/RVA22U64.yaml +8 -1
  223. data/.data/spec/std/isa/profile/RVA23S64.yaml +13 -0
  224. data/.data/spec/std/isa/profile/RVA23U64.yaml +15 -1
  225. data/.data/spec/std/isa/profile/RVB23S64.yaml +15 -3
  226. data/.data/spec/std/isa/profile/RVB23U64.yaml +8 -1
  227. data/.data/spec/std/isa/profile/RVI20U32.yaml +8 -1
  228. data/.data/spec/std/isa/profile/RVI20U64.yaml +7 -0
  229. data/.data/spec/std/isa/register_file/F.yaml +3 -2
  230. data/.data/spec/std/isa/register_file/V.yaml +2 -2
  231. data/.data/spec/std/isa/register_file/X.yaml +2 -1
  232. data/lib/udb/architecture.rb +4 -25
  233. data/lib/udb/cfg_arch.rb +171 -59
  234. data/lib/udb/cli.rb +10 -1
  235. data/lib/udb/condition.rb +38 -37
  236. data/lib/udb/config.rb +72 -6
  237. data/lib/udb/logic.rb +29 -56
  238. data/lib/udb/obj/csr.rb +23 -5
  239. data/lib/udb/obj/csr_field.rb +36 -21
  240. data/lib/udb/obj/database_obj.rb +2 -5
  241. data/lib/udb/obj/extension.rb +0 -3
  242. data/lib/udb/obj/instruction.rb +1 -4
  243. data/lib/udb/obj/portfolio.rb +75 -20
  244. data/lib/udb/obj/profile.rb +0 -4
  245. data/lib/udb/obj/register_file.rb +63 -2
  246. data/lib/udb/portfolio_design.rb +3 -6
  247. data/lib/udb/resolver.rb +84 -23
  248. data/lib/udb/version.rb +1 -1
  249. data/lib/udb/version_spec.rb +8 -0
  250. data/lib/udb/z3.rb +23 -0
  251. data/lib/udb.rb +0 -3
  252. metadata +25 -37
  253. data/.data/cfgs/profile/RVA23M64.yaml +0 -159
  254. data/.data/cfgs/profile/RVB23M64.yaml +0 -149
  255. data/.data/spec/schemas/proc_cert_class_schema.json +0 -35
  256. data/.data/spec/schemas/proc_cert_model_schema.json +0 -336
  257. data/.data/spec/std/isa/proc_cert_class/AC.yaml +0 -13
  258. data/.data/spec/std/isa/proc_cert_class/MC.yaml +0 -13
  259. data/.data/spec/std/isa/proc_cert_class/RVI.yaml +0 -16
  260. data/.data/spec/std/isa/proc_cert_model/AC100.yaml +0 -72
  261. data/.data/spec/std/isa/proc_cert_model/AC200.yaml +0 -58
  262. data/.data/spec/std/isa/proc_cert_model/MC100-32.yaml +0 -155
  263. data/.data/spec/std/isa/proc_cert_model/MC100-64.yaml +0 -21
  264. data/.data/spec/std/isa/proc_cert_model/MC200-32.yaml +0 -60
  265. data/.data/spec/std/isa/proc_cert_model/MC200-64.yaml +0 -21
  266. data/.data/spec/std/isa/proc_cert_model/MC300-32.yaml +0 -40
  267. data/.data/spec/std/isa/proc_cert_model/MC300-64.yaml +0 -21
  268. data/.data/spec/std/isa/proc_cert_model/RVI20-32.yaml +0 -39
  269. data/.data/spec/std/isa/proc_cert_model/RVI20-64.yaml +0 -19
  270. data/.data/spec/std/isa/profile/RVA23M64.yaml +0 -24
  271. data/.data/spec/std/isa/profile/RVB23M64.yaml +0 -86
  272. data/lib/udb/cert_normative_rule.rb +0 -41
  273. data/lib/udb/obj/certifiable_obj.rb +0 -21
  274. data/lib/udb/obj/certificate.rb +0 -230
  275. data/lib/udb/proc_cert_design.rb +0 -77
@@ -0,0 +1,153 @@
1
+ # Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
2
+ # SPDX-License-Identifier: BSD-3-Clause-Clear
3
+
4
+ # yaml-language-server: $schema=../../../../../schemas/inst_schema.json
5
+
6
+ $schema: "inst_schema.json#"
7
+ kind: instruction
8
+ name: qc.cm.ilut
9
+ long_name: Instruction Lookup Table Execute
10
+ description: |
11
+ Fetch and execute the instruction(s) packed in the ILUT entry at index `ilut_index`.
12
+
13
+ The ILUT base address is held in `qc.itba.base` (shifted left by 6 to form a
14
+ 64-byte-aligned byte address). The first `qc.itdec.dec` entries are 64-bit
15
+ double entries; all remaining entries are 32-bit single entries.
16
+
17
+ Entry address calculation:
18
+ - If `ilut_index` < `qc.itdec.dec`: `entry_addr = (qc.itba.BASE << 6) + ilut_index * 8`
19
+ - Otherwise: `entry_addr = (qc.itba.BASE << 6) + qc.itdec.DEC * 8 + (ilut_index - qc.itdec.DEC) * 4`
20
+
21
+ Each entry may contain one or two packed RISC-V instructions. The first
22
+ instruction begins at bit 0 of the entry. Its size is determined by the
23
+ standard RISC-V instruction-length encoding (16-bit, 32-bit, or 48-bit).
24
+ If bits remain after the first instruction and the next 16 bits are not
25
+ `c.nop` (16'h0001), a second instruction is present and is also executed.
26
+
27
+ PC-relative instructions (`auipc`, branches, and jumps) are not permitted
28
+ inside ILUT entries. Hardware detects such instructions during decode and
29
+ raises an IllegalInstruction exception.
30
+
31
+ On an exception caused by the second instruction, hardware sets bit 0 of
32
+ `mepc` to indicate that the fault originated from the second instruction
33
+ within the entry.
34
+
35
+ See the Xqccmi extension description for full details on entry layout,
36
+ dual-instruction packing, exception handling, and restrictions.
37
+ definedBy:
38
+ extension:
39
+ name: Xqccmi
40
+ assembly: ilut_index
41
+ encoding:
42
+ match: 001-----------00
43
+ variables:
44
+ - name: ilut_index
45
+ location: 12-2
46
+ access:
47
+ s: always
48
+ u: always
49
+ vs: always
50
+ vu: always
51
+ operation(): |
52
+ # Read the double-entry count (N = number of 64-bit double entries)
53
+ XReg N = {21'b0, CSR[qc.itdec].dec};
54
+
55
+ # Compute the byte address of the ILUT entry
56
+ XReg base_addr = CSR[qc.itba].base << 6;
57
+ XReg entry_addr;
58
+ Boolean is_double;
59
+
60
+ if (ilut_index < N) {
61
+ entry_addr = base_addr + (ilut_index * 8);
62
+ is_double = true;
63
+ } else {
64
+ entry_addr = base_addr + (N * 8) + ((ilut_index - N) * 4);
65
+ is_double = false;
66
+ }
67
+
68
+ # Translate the entry address (instruction fetch)
69
+ TranslationResult result;
70
+ if (CSR[misa].S == 1) {
71
+ result = translate(entry_addr, MemoryOperation::Fetch, mode(), $encoding);
72
+ } else {
73
+ result.paddr = entry_addr;
74
+ }
75
+
76
+ # Access check for instruction fetch
77
+ access_check(result.paddr, is_double ? 8 : 4, $pc, MemoryOperation::Fetch, ExceptionCode::InstructionAccessFault, mode());
78
+
79
+ # Read the entry from physical memory.
80
+ # For a 32-bit entry, read 32 bits. For a 64-bit double entry, read two
81
+ # consecutive 32-bit words (entry_lo = bits[31:0], entry_hi = bits[63:32]).
82
+ XReg entry_lo = read_physical_memory(32, result.paddr);
83
+ XReg entry_hi = 32'b0;
84
+ if (is_double) {
85
+ entry_hi = read_physical_memory(32, result.paddr + 4);
86
+ }
87
+
88
+ # Determine the size of the first instruction using RISC-V length encoding:
89
+ # bits[1:0] != 2'b11 -> 16-bit instruction
90
+ # bits[1:0] == 2'b11 and bits[4:2] != 3'b111 -> 32-bit instruction
91
+ # bits[1:0] == 2'b11 and bits[4:2] == 3'b111 -> 48-bit instruction
92
+ Boolean has_second_inst = false; # true if this entry contains a second packed instruction
93
+
94
+ if (entry_lo[1:0] != 2'b11) {
95
+ # 16-bit first instruction; second instruction is in entry_lo[31:16]
96
+ Bits<16> second_lo = entry_lo[31:16];
97
+ if (second_lo != 16'h0001) {
98
+ has_second_inst = true;
99
+ }
100
+ } else if (entry_lo[4:2] != 3'b111) {
101
+ # 32-bit first instruction
102
+ if (is_double) {
103
+ # Second instruction starts at entry_hi[15:0]
104
+ Bits<16> second_lo = entry_hi[15:0];
105
+ if (second_lo != 16'h0001) {
106
+ has_second_inst = true;
107
+ }
108
+ }
109
+ # No room for a second instruction in a 32-bit entry after a 32-bit first
110
+ } else {
111
+ # 48-bit first instruction
112
+ if (!is_double) {
113
+ # 48-bit instruction does not fit in a 32-bit entry
114
+ executing_second_inst = false;
115
+ raise_ilut(ExceptionCode::IllegalInstruction, $encoding);
116
+ }
117
+ # No room for a second instruction after a 48-bit first in a 64-bit entry
118
+ }
119
+
120
+ # PC-relative instruction check:
121
+ # Hardware detects auipc, branches, and jump instructions during decode
122
+ # and raises an IllegalInstruction exception before any instruction executes.
123
+ # mepc bit 0 reflects which slot contained the forbidden instruction.
124
+ if (is_pc_relative_inst?(entry_lo)) {
125
+ executing_second_inst = false;
126
+ raise_ilut(ExceptionCode::IllegalInstruction, $encoding);
127
+ }
128
+ if (has_second_inst) {
129
+ Bits<32> second_inst;
130
+ if (entry_lo[1:0] != 2'b11) {
131
+ second_inst = {16'b0, entry_lo[31:16]};
132
+ } else {
133
+ second_inst = {16'b0, entry_hi[15:0]};
134
+ }
135
+ if (is_pc_relative_inst?(second_inst)) {
136
+ executing_second_inst = true;
137
+ raise_ilut(ExceptionCode::IllegalInstruction, $encoding);
138
+ }
139
+ }
140
+
141
+ # Execute the first instruction from the ILUT entry.
142
+ # IDL cannot express dynamic instruction dispatch; actual execution is implementation-defined.
143
+ # Any exception raised must call raise_ilut() with executing_second_inst = false (mepc bit 0 = 0).
144
+ executing_second_inst = false;
145
+ unpredictable("TO-DO: execute first ILUT instruction");
146
+
147
+ # Execute the second instruction from the ILUT entry, if present.
148
+ # Any exception raised must call raise_ilut() with executing_second_inst = true (mepc bit 0 = 1).
149
+ if (has_second_inst) {
150
+ executing_second_inst = true;
151
+ unpredictable("TO-DO: execute second ILUT instruction");
152
+ executing_second_inst = false;
153
+ }
@@ -0,0 +1,84 @@
1
+ # Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
2
+ # SPDX-License-Identifier: BSD-3-Clause-Clear
3
+
4
+ # yaml-language-server: $schema=../../../../../schemas/inst_schema.json
5
+
6
+ $schema: "inst_schema.json#"
7
+ kind: instruction
8
+ name: qc.cm.jalt
9
+ long_name: Jump Via Table with Link to ra or t0
10
+ description: |
11
+ Read an address from the Jump Vector Table and jump to it, linking to either
12
+ `ra` (x1) or `t0` (x5) depending on bit 0 of the table entry.
13
+
14
+ Bit 0 of the jump table entry is used as metadata:
15
+
16
+ * Bit 0 = 0: save return address in `ra` (x1)
17
+ * Bit 0 = 1: save return address in `t0` (x5)
18
+
19
+ The actual jump target always has bit 0 cleared:
20
+ `target = {entry[XLEN-1:1], 1'b0}`
21
+
22
+ Instruction encoded in the same encoding space as cm.jalt (Zcmt).
23
+ Xqccmt and Zcmt are mutually exclusive extensions.
24
+ definedBy:
25
+ extension:
26
+ name: Xqccmt
27
+ assembly: index_7_5, index_4_0
28
+ encoding:
29
+ match: 101000--------10
30
+ variables:
31
+ - name: index_7_5
32
+ location: 9-7
33
+ not: 0
34
+ - name: index_4_0
35
+ location: 6-2
36
+ access:
37
+ s: always
38
+ u: always
39
+ vs: always
40
+ vu: always
41
+ operation(): |
42
+ # Ensure JVT readable
43
+ check_zcmt_enabled($encoding);
44
+
45
+ if (CSR[jvt].MODE != 0) {
46
+ raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
47
+ }
48
+
49
+ # Skip over _this_ 16-bit instruction
50
+ XReg return_addr = $pc + 2;
51
+
52
+ XReg jump_table_base = { CSR[jvt].BASE, 6'b000000 };
53
+ XReg index = { index_7_5, index_4_0 };
54
+ XReg virtual_address = jump_table_base + index `* (xlen() / 8);
55
+ XReg entry;
56
+ TranslationResult result;
57
+
58
+ # TODO: Correct this check when we figure out what MISA can do
59
+ if (CSR[misa].S == 1) {
60
+ result = translate(virtual_address, MemoryOperation::Fetch, mode(), $encoding);
61
+ } else {
62
+ result.paddr = virtual_address;
63
+ }
64
+
65
+ # may raise an exception
66
+ access_check(result.paddr, xlen(), $pc, MemoryOperation::Fetch, ExceptionCode::InstructionAccessFault, mode());
67
+
68
+ if (xlen() == 32) {
69
+ entry = read_physical_memory(32, result.paddr);
70
+ } else {
71
+ entry = read_physical_memory(64, result.paddr);
72
+ }
73
+
74
+ # Bit 0 of entry is metadata: 0 = link to ra (x1), 1 = link to t0 (x5)
75
+ if (entry[0] == 1'b1) {
76
+ X[5] = return_addr; # t0
77
+ } else {
78
+ X[1] = return_addr; # ra
79
+ }
80
+
81
+ # Jump target always has bit 0 cleared
82
+ XReg addr = entry & $signed(2'b10);
83
+
84
+ jump(addr);
@@ -0,0 +1,60 @@
1
+ # Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
2
+ # SPDX-License-Identifier: BSD-3-Clause-Clear
3
+
4
+ # yaml-language-server: $schema=../../../../../schemas/inst_schema.json
5
+
6
+ $schema: "inst_schema.json#"
7
+ kind: instruction
8
+ name: qc.cm.jt
9
+ long_name: Jump Via Table
10
+ description: |
11
+ Read an address from the Jump Vector Table and jump to it.
12
+ Instruction encoded in the same encoding space as cm.jt (Zcmt).
13
+ Xqccmt and Zcmt are mutually exclusive extensions.
14
+ definedBy:
15
+ extension:
16
+ name: Xqccmt
17
+ assembly: index
18
+ encoding:
19
+ match: 101000000-----10
20
+ variables:
21
+ - name: index
22
+ location: 6-2
23
+ access:
24
+ s: always
25
+ u: always
26
+ vs: always
27
+ vu: always
28
+ operation(): |
29
+ # Ensure JVT readable
30
+ check_zcmt_enabled($encoding);
31
+
32
+ if (CSR[jvt].MODE != 0) {
33
+ raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
34
+ }
35
+
36
+ XReg jump_table_base = { CSR[jvt].BASE, 6'b000000 };
37
+ XReg virtual_address = jump_table_base + index `* (xlen() / 8);
38
+ XReg addr;
39
+ TranslationResult result;
40
+
41
+ # TODO: Correct this check when we figure out what MISA can do
42
+ if (CSR[misa].S == 1) {
43
+ result = translate(virtual_address, MemoryOperation::Fetch, mode(), $encoding);
44
+ } else {
45
+ result.paddr = virtual_address;
46
+ }
47
+
48
+ # may raise an exception
49
+ access_check(result.paddr, xlen(), $pc, MemoryOperation::Fetch, ExceptionCode::InstructionAccessFault, mode());
50
+
51
+ if (xlen() == 32) {
52
+ addr = read_physical_memory(32, result.paddr);
53
+ } else {
54
+ addr = read_physical_memory(64, result.paddr);
55
+ }
56
+
57
+ # Ensure low-order bit is clear
58
+ addr = addr & $signed(2'b10);
59
+
60
+ jump(addr);
@@ -58,6 +58,118 @@ builtin function sync_write_after_read_device {
58
58
  }
59
59
  }
60
60
 
61
+ # Global flag: true while the second packed instruction in an ILUT entry is executing.
62
+ # Set by qc.cm.ilut before executing the second slot; cleared after. Used by raise_ilut()
63
+ # to encode the faulting slot into mepc bit 0.
64
+ Boolean executing_second_inst = false;
65
+
66
+ # Simplified precise-exception raise for qc_iu (M-mode only).
67
+ # Identical to raise_precise except mepc.PC (or mnepc.PC for a double-trap)
68
+ # captures bit 0 from executing_second_inst, allowing the trap handler to
69
+ # distinguish first- vs second-instruction faults within an ILUT entry.
70
+ # This function must be called for any exception raised by an ILUT-executed
71
+ # instruction (first or second slot). The executing_second_inst flag must be set
72
+ # before calling: false for the first instruction, true for the second.
73
+ function raise_ilut {
74
+ arguments ExceptionCode exception_code, XReg tval
75
+ description {
76
+ Raise a precise exception for an ILUT-executed instruction.
77
+ Sets mepc.PC = $pc | (executing_second_inst ? 1 : 0) so that the trap handler
78
+ can determine whether the fault came from the first or second packed
79
+ instruction in the ILUT entry. For a double-trap, sets mnepc.PC instead.
80
+ Only the M-mode handling path is included because qc_iu is M-mode only.
81
+ }
82
+ body {
83
+ Bits<1> slot_bit = executing_second_inst ? 1'b1 : 1'b0;
84
+
85
+ # qc_iu is M-mode only; no S/H/VS/VU delegation logic needed.
86
+ if (implemented?(ExtensionName::Smrnmi) && CSR[mnstatus].NMIE == 1'b0) {
87
+ # Double-trap: use mnepc
88
+ CSR[mnepc].PC = $pc | slot_bit;
89
+ } else {
90
+ CSR[mepc].PC = $pc | slot_bit;
91
+ }
92
+
93
+ if (!mtval_readonly?()) {
94
+ CSR[mtval].VALUE = mtval_for(exception_code, tval);
95
+ }
96
+
97
+ $pc = {CSR[mtvec].BASE, 2'b00};
98
+ CSR[mcause].INT = 1'b0;
99
+ CSR[mcause].CODE = $bits(exception_code);
100
+
101
+ set_mode(PrivilegeMode::M);
102
+ abort_current_instruction();
103
+ }
104
+ }
105
+
106
+ function is_pc_relative_inst? {
107
+ returns Boolean
108
+ arguments Bits<32> inst
109
+ description {
110
+ Returns true if +inst+ is a PC-relative instruction (auipc, branch, jump, or
111
+ compressed PC-relative jump (jal/c.j/c.jal), or compressed branch) that is
112
+ forbidden inside an ILUT entry. Register-indirect jumps (jalr, c.jr, c.jalr)
113
+ are NOT PC-relative and are permitted inside ILUT entries.
114
+ For 16-bit compressed instructions, only the lower 16 bits of +inst+ are examined.
115
+ For 48-bit Xqci instructions, only the lower 32 bits are passed here (the upper
116
+ 16 bits are in a separate word and are not needed for this check).
117
+ }
118
+ body {
119
+ if (inst[1:0] != 2'b11) {
120
+ # 16-bit compressed instruction: examine only the lower 16 bits
121
+ Bits<16> cinst = inst[15:0];
122
+ # c.j: funct3=101, op=01
123
+ if (cinst[15:13] == 3'b101 && cinst[1:0] == 2'b01) {
124
+ return true;
125
+ }
126
+ # c.jal: funct3=001, op=01
127
+ if (cinst[15:13] == 3'b001 && cinst[1:0] == 2'b01) {
128
+ return true;
129
+ }
130
+ # c.beqz: funct3=110, op=01
131
+ if (cinst[15:13] == 3'b110 && cinst[1:0] == 2'b01) {
132
+ return true;
133
+ }
134
+ # c.bnez: funct3=111, op=01
135
+ if (cinst[15:13] == 3'b111 && cinst[1:0] == 2'b01) {
136
+ return true;
137
+ }
138
+ return false;
139
+ } else {
140
+ # 32-bit (or 48-bit) instruction: check opcode field bits[6:0]
141
+ Bits<7> opcode = inst[6:0];
142
+ # auipc
143
+ if (opcode == 7'b0010111) {
144
+ return true;
145
+ }
146
+ # jal
147
+ if (opcode == 7'b1101111) {
148
+ return true;
149
+ }
150
+ # branches
151
+ if (opcode == 7'b1100011) {
152
+ return true;
153
+ }
154
+ # 48-bit Xqci PC-relative instructions (inst[4:2]==3'b111 indicates 48-bit length)
155
+ if (inst[4:2] == 3'b111) {
156
+ # All Xqci 48-bit PC-relative instructions use opcode 7'b0011111
157
+ if (opcode == 7'b0011111) {
158
+ # qc.e.j / qc.e.jal: funct3=000, inst[24:20]==5'b00000
159
+ if (inst[14:12] == 3'b000 && inst[24:20] == 5'b00000) {
160
+ return true;
161
+ }
162
+ # qc.e.beqi/bnei/blti/bgei/bltui/bgeui: funct3=100, inst[24:23]==2'b11
163
+ if (inst[14:12] == 3'b100 && inst[24:23] == 2'b11) {
164
+ return true;
165
+ }
166
+ }
167
+ }
168
+ return false;
169
+ }
170
+ }
171
+ }
172
+
61
173
  function get_and_validate_stack_pointer {
62
174
  returns XReg
63
175
  arguments XReg sp, Bits<INSTR_ENC_SIZE> encoding