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
@@ -41,8 +41,8 @@ data_independent_timing: true
41
41
  operation(): |
42
42
  check_f_ok($encoding);
43
43
 
44
- Bits<32> sp_value_a = f[fs1][31:0];
45
- Bits<32> sp_value_b = f[fs2][31:0];
44
+ Bits<32> sp_value_a = F[fs1][31:0];
45
+ Bits<32> sp_value_b = F[fs2][31:0];
46
46
 
47
47
  if (is_sp_nan?(sp_value_a) || is_sp_nan?(sp_value_b)) {
48
48
  if (is_sp_signaling_nan?(sp_value_a) || is_sp_signaling_nan?(sp_value_b)) {
@@ -50,11 +50,11 @@ operation(): |
50
50
  }
51
51
  # If both are NaN, return canonical NaN; otherwise return the non-NaN operand
52
52
  if (is_sp_nan?(sp_value_a) && is_sp_nan?(sp_value_b)) {
53
- f[fd] = SP_CANONICAL_NAN;
53
+ F[fd] = SP_CANONICAL_NAN;
54
54
  } else if (is_sp_nan?(sp_value_a)) {
55
- f[fd] = sp_value_b;
55
+ F[fd] = sp_value_b;
56
56
  } else {
57
- f[fd] = sp_value_a;
57
+ F[fd] = sp_value_a;
58
58
  }
59
59
  } else {
60
60
  Boolean sign_a = sp_value_a[31] == 1;
@@ -66,6 +66,6 @@ operation(): |
66
66
  } else {
67
67
  a_lt_b = (sp_value_a != sp_value_b) && (sign_a != (sp_value_a < sp_value_b));
68
68
  }
69
- f[fd] = a_lt_b ? sp_value_b : sp_value_a;
69
+ F[fd] = a_lt_b ? sp_value_b : sp_value_a;
70
70
  }
71
71
  mark_f_state_dirty();
@@ -41,8 +41,8 @@ data_independent_timing: true
41
41
  operation(): |
42
42
  check_f_ok($encoding);
43
43
 
44
- Bits<32> sp_value_a = f[fs1][31:0];
45
- Bits<32> sp_value_b = f[fs2][31:0];
44
+ Bits<32> sp_value_a = F[fs1][31:0];
45
+ Bits<32> sp_value_b = F[fs2][31:0];
46
46
 
47
47
  if (is_sp_nan?(sp_value_a) || is_sp_nan?(sp_value_b)) {
48
48
  if (is_sp_signaling_nan?(sp_value_a) || is_sp_signaling_nan?(sp_value_b)) {
@@ -50,11 +50,11 @@ operation(): |
50
50
  }
51
51
  # If both are NaN, return canonical NaN; otherwise return the non-NaN operand
52
52
  if (is_sp_nan?(sp_value_a) && is_sp_nan?(sp_value_b)) {
53
- f[fd] = SP_CANONICAL_NAN;
53
+ F[fd] = SP_CANONICAL_NAN;
54
54
  } else if (is_sp_nan?(sp_value_a)) {
55
- f[fd] = sp_value_b;
55
+ F[fd] = sp_value_b;
56
56
  } else {
57
- f[fd] = sp_value_a;
57
+ F[fd] = sp_value_a;
58
58
  }
59
59
  } else {
60
60
  Boolean sign_a = sp_value_a[31] == 1;
@@ -66,6 +66,6 @@ operation(): |
66
66
  } else {
67
67
  a_lt_b = (sp_value_a != sp_value_b) && (sign_a != (sp_value_a < sp_value_b));
68
68
  }
69
- f[fd] = a_lt_b ? sp_value_a : sp_value_b;
69
+ F[fd] = a_lt_b ? sp_value_a : sp_value_b;
70
70
  }
71
71
  mark_f_state_dirty();
@@ -35,5 +35,5 @@ data_independent_timing: true
35
35
  operation(): |
36
36
  check_f_ok($encoding);
37
37
  RoundingMode mode = rm_to_mode(rm, $encoding);
38
- f[fd] = f32_muladd(f[fs1], f[fs2], f[fs3], F32MulAddOp::Softfloat_mulAdd_subC, mode);
38
+ F[fd] = f32_muladd(F[fs1], F[fs2], F[fs3], F32MulAddOp::Softfloat_mulAdd_subC, mode);
39
39
  mark_f_state_dirty();
@@ -34,5 +34,5 @@ data_independent_timing: true
34
34
  operation(): |
35
35
  check_f_ok($encoding);
36
36
  RoundingMode mode = rm_to_mode(rm, $encoding);
37
- f[fd] = f32_mul(f[fs1], f[fs2], mode);
37
+ F[fd] = f32_mul(F[fs1], F[fs2], mode);
38
38
  mark_f_state_dirty();
@@ -34,9 +34,9 @@ operation(): |
34
34
  Bits<32> sp_value = X[xs1][31:0];
35
35
 
36
36
  if (implemented?(ExtensionName::D)) {
37
- f[fd] = nan_box(32, 64, sp_value);
37
+ F[fd] = nan_box(32, 64, sp_value);
38
38
  } else {
39
- f[fd] = sp_value;
39
+ F[fd] = sp_value;
40
40
  }
41
41
 
42
42
  mark_f_state_dirty();
@@ -32,4 +32,4 @@ data_independent_timing: true
32
32
  operation(): |
33
33
  check_f_ok($encoding);
34
34
 
35
- X[xd] = sext(f[fs1][31:0], 32);
35
+ X[xd] = sext(F[fs1][31:0], 32);
@@ -38,6 +38,6 @@ operation(): |
38
38
  RoundingMode mode = rm_to_mode(rm, $encoding);
39
39
  # fnmadd: -(fs1 * fs2) - fs3 = -(fs1 * fs2) + (-fs3)
40
40
  # Negate fs3 by flipping its sign bit, then use subProd op
41
- Bits<32> fs3_negated = f[fs3][31:0] ^ 32'h80000000;
42
- f[fd] = f32_muladd(f[fs1], f[fs2], fs3_negated, F32MulAddOp::Softfloat_mulAdd_subProd, mode);
41
+ Bits<32> fs3_negated = F[fs3][31:0] ^ 32'h80000000;
42
+ F[fd] = f32_muladd(F[fs1], F[fs2], fs3_negated, F32MulAddOp::Softfloat_mulAdd_subProd, mode);
43
43
  mark_f_state_dirty();
@@ -36,5 +36,5 @@ data_independent_timing: true
36
36
  operation(): |
37
37
  check_f_ok($encoding);
38
38
  RoundingMode mode = rm_to_mode(rm, $encoding);
39
- f[fd] = f32_muladd(f[fs1], f[fs2], f[fs3], F32MulAddOp::Softfloat_mulAdd_subProd, mode);
39
+ F[fd] = f32_muladd(F[fs1], F[fs2], F[fs3], F32MulAddOp::Softfloat_mulAdd_subProd, mode);
40
40
  mark_f_state_dirty();
@@ -34,17 +34,17 @@ access:
34
34
  data_independent_timing: true
35
35
  pseudoinstructions:
36
36
  - when: (fs2 == fs1)
37
- to: fmv.s fd,fs1
37
+ to: fmv.s fd, fs1
38
38
 
39
39
  operation(): |
40
40
  check_f_ok($encoding);
41
41
 
42
- Bits<32> sp_value = {f[fs2][31], f[fs1][30:0]};
42
+ Bits<32> sp_value = {F[fs2][31], F[fs1][30:0]};
43
43
 
44
44
  if (implemented?(ExtensionName::D)) {
45
- f[fd] = nan_box(32, 64, sp_value);
45
+ F[fd] = nan_box(32, 64, sp_value);
46
46
  } else {
47
- f[fd] = sp_value;
47
+ F[fd] = sp_value;
48
48
  }
49
49
 
50
50
  mark_f_state_dirty();
@@ -38,12 +38,12 @@ pseudoinstructions:
38
38
  operation(): |
39
39
  check_f_ok($encoding);
40
40
 
41
- Bits<32> sp_value = {~f[fs2][31], f[fs1][30:0]};
41
+ Bits<32> sp_value = {~F[fs2][31], F[fs1][30:0]};
42
42
 
43
43
  if (implemented?(ExtensionName::D)) {
44
- f[fd] = nan_box(32, 64, sp_value);
44
+ F[fd] = nan_box(32, 64, sp_value);
45
45
  } else {
46
- f[fd] = sp_value;
46
+ F[fd] = sp_value;
47
47
  }
48
48
 
49
49
  mark_f_state_dirty();
@@ -33,16 +33,16 @@ access:
33
33
  data_independent_timing: true
34
34
  pseudoinstructions:
35
35
  - when: (fs2 == fs1)
36
- to: fabs.s fd,fs1
36
+ to: fabs.s fd, fs1
37
37
  operation(): |
38
38
  check_f_ok($encoding);
39
39
 
40
- Bits<32> sp_value = {f[fs1][31] ^ f[fs2][31], f[fs1][30:0]};
40
+ Bits<32> sp_value = {F[fs1][31] ^ F[fs2][31], F[fs1][30:0]};
41
41
 
42
42
  if (implemented?(ExtensionName::D)) {
43
- f[fd] = nan_box(32, 64, sp_value);
43
+ F[fd] = nan_box(32, 64, sp_value);
44
44
  } else {
45
- f[fd] = sp_value;
45
+ F[fd] = sp_value;
46
46
  }
47
47
 
48
48
  mark_f_state_dirty();
@@ -31,5 +31,5 @@ data_independent_timing: true
31
31
  operation(): |
32
32
  check_f_ok($encoding);
33
33
  RoundingMode mode = rm_to_mode(rm, $encoding);
34
- f[fd] = f32_sqrt(f[fs1], mode);
34
+ F[fd] = f32_sqrt(F[fs1], mode);
35
35
  mark_f_state_dirty();
@@ -33,4 +33,4 @@ data_independent_timing: true
33
33
  operation(): |
34
34
  check_f_ok($encoding);
35
35
  RoundingMode mode = rm_to_mode(rm, $encoding);
36
- f[fd] = f32_sub(f[fs1], f[fs2], mode);
36
+ F[fd] = f32_sub(F[fs1], F[fs2], mode);
@@ -35,4 +35,4 @@ operation(): |
35
35
 
36
36
  XReg virtual_address = X[xs1] + $signed(imm);
37
37
 
38
- write_memory(32, virtual_address, f[fs2][31:0], $encoding);
38
+ write_memory(32, virtual_address, F[fs2][31:0], $encoding);
@@ -33,5 +33,5 @@ pseudoinstructions:
33
33
  - when: (xd == 0 && xs1 == 0 && imm == 0)
34
34
  to: nop
35
35
  - when: imm == 0
36
- to: mv xd,xs1
36
+ to: mv xd, xs1
37
37
  operation(): X[xd] = X[xs1] + $signed(imm);
@@ -33,6 +33,6 @@ access:
33
33
  data_independent_timing: true
34
34
  pseudoinstructions:
35
35
  - when: imm == 0
36
- to: sext.w xd,xs1
36
+ to: sext.w xd, xs1
37
37
  operation(): |
38
38
  X[xd] = $signed((X[xs1] + $signed(imm))[31:0]);
@@ -29,5 +29,5 @@ access:
29
29
  data_independent_timing: true
30
30
  pseudoinstructions:
31
31
  - when: imm == 255
32
- to: zext.b xd,xs1
32
+ to: zext.b xd, xs1
33
33
  operation(): X[xd] = X[xs1] & $signed(imm);
@@ -34,7 +34,7 @@ access:
34
34
  vu: always
35
35
  pseudoinstructions:
36
36
  - when: xs2 == 0
37
- to: beqz xs1,imm
37
+ to: beqz xs1, imm
38
38
  operation(): |
39
39
  XReg lhs = X[xs1];
40
40
  XReg rhs = X[xs2];
@@ -34,9 +34,11 @@ access:
34
34
  vu: always
35
35
  pseudoinstructions:
36
36
  - when: xs1 == 0
37
- to: blez xs2,imm
37
+ to: blez xs2, imm
38
38
  - when: xs2 == 0
39
- to: bgez xs1,imm
39
+ to: bgez xs1, imm
40
+ - when: "true"
41
+ to: ble xs2, xs1, imm
40
42
  operation(): |
41
43
  XReg lhs = X[xs1];
42
44
  XReg rhs = X[xs2];
@@ -32,6 +32,9 @@ access:
32
32
  u: always
33
33
  vs: always
34
34
  vu: always
35
+ pseudoinstructions:
36
+ - when: "true"
37
+ to: bleu xs2, xs1, imm
35
38
  operation(): |
36
39
  XReg lhs = X[xs1];
37
40
  XReg rhs = X[xs2];
@@ -34,9 +34,11 @@ access:
34
34
  vu: always
35
35
  pseudoinstructions:
36
36
  - when: xs2 == 0
37
- to: bltz xs1,imm
37
+ to: bltz xs1, imm
38
38
  - when: xs1 == 0
39
- to: bgtz xs2,imm
39
+ to: bgtz xs2, imm
40
+ - when: "true"
41
+ to: bgt xs2, xs1, imm
40
42
  operation(): |
41
43
  XReg lhs = X[xs1];
42
44
  XReg rhs = X[xs2];
@@ -32,6 +32,9 @@ access:
32
32
  u: always
33
33
  vs: always
34
34
  vu: always
35
+ pseudoinstructions:
36
+ - when: "true"
37
+ to: bgtu xs2, xs1, imm
35
38
  operation(): |
36
39
  XReg lhs = X[xs1];
37
40
  XReg rhs = X[xs2];
@@ -34,7 +34,7 @@ access:
34
34
  vu: always
35
35
  pseudoinstructions:
36
36
  - when: xs2 == 0
37
- to: bnez xs1,imm
37
+ to: bnez xs1, imm
38
38
  operation(): |
39
39
  XReg lhs = X[xs1];
40
40
  XReg rhs = X[xs2];
@@ -31,9 +31,9 @@ access:
31
31
  data_independent_timing: true
32
32
  pseudoinstructions:
33
33
  - when: xs2 == 0
34
- to: sltz xd,xs1
34
+ to: sltz xd, xs1
35
35
  - when: xs1 == 0
36
- to: sgtz xd,xs2
36
+ to: sgtz xd, xs2
37
37
  operation(): |
38
38
  XReg src1 = X[xs1];
39
39
  XReg src2 = X[xs2];
@@ -35,7 +35,7 @@ access:
35
35
  data_independent_timing: true
36
36
  pseudoinstructions:
37
37
  - when: imm == 1
38
- to: seqz xd,xs1
38
+ to: seqz xd, xs1
39
39
  operation(): |
40
40
  Bits<MXLEN> sign_extend_imm = $signed(imm);
41
41
  X[xd] = (X[xs1] < sign_extend_imm) ? 1 : 0;
@@ -31,6 +31,6 @@ access:
31
31
  data_independent_timing: true
32
32
  pseudoinstructions:
33
33
  - when: xs1 == 0
34
- to: snez xd,xs2
34
+ to: snez xd, xs2
35
35
  operation(): |
36
36
  X[xd] = (X[xs1] < X[xs2]) ? 1 : 0;
@@ -29,7 +29,7 @@ access:
29
29
  data_independent_timing: true
30
30
  pseudoinstructions:
31
31
  - when: xs1 == 0
32
- to: neg xd,xs2
32
+ to: neg xd, xs2
33
33
  operation(): |
34
34
  XReg t0 = X[xs1];
35
35
  XReg t1 = X[xs2];
@@ -33,7 +33,7 @@ access:
33
33
  data_independent_timing: true
34
34
  pseudoinstructions:
35
35
  - when: xs1 == 0
36
- to: negw xd,xs2
36
+ to: negw xd, xs2
37
37
  operation(): |
38
38
  Bits<32> t0 = X[xs1][31:0];
39
39
  Bits<32> t1 = X[xs2][31:0];
@@ -31,5 +31,5 @@ access:
31
31
  data_independent_timing: true
32
32
  pseudoinstructions:
33
33
  - when: $signed(imm) == -1
34
- to: not xd,xs1
34
+ to: not xd, xs1
35
35
  operation(): X[xd] = X[xs1] ^ $signed(imm);
@@ -50,22 +50,3 @@ operation(): |
50
50
  XReg src2 = X[xs2];
51
51
 
52
52
  X[xd] = (src1 * src2)[MXLEN-1:0];
53
-
54
- cert_normative_rules:
55
- - id: inst.mul.encoding
56
- name: Encoding
57
- description: Encoding of `mul` instruction
58
- doc_links:
59
- - manual:inst:mul:encoding
60
- - id: inst.mul.basic_op
61
- name: Basic operation
62
- description: Basic operation of `mul` instruction
63
- doc_links:
64
- - manual:inst:mul:operation
65
- - id: inst.mul.ill_exc_misa_M_disabled
66
- name: Illegal instruction exception when misa.M is 0
67
- description: |
68
- An illegal instruction exception is raised when the instruction is executed
69
- and `misa.M` is 0.
70
- doc_links:
71
- - manual:csr:misa:disabling-extension
@@ -32,5 +32,5 @@ access:
32
32
  data_independent_timing: false
33
33
  pseudoinstructions:
34
34
  - when: (fs2 == fs1)
35
- to: fmv.q fd,fs1
35
+ to: fmv.q fd, fs1
36
36
  operation(): |
@@ -133,7 +133,7 @@ operation(): |
133
133
  CSR[mstatus].SPIE = 1;
134
134
  CSR[mstatus].SPP = 2'b00;
135
135
  $pc = $bits(CSR[sepc]);
136
- } else {
136
+ } else if (implemented?(ExtensionName::H)) {
137
137
  if (CSR[mstatus].TSR == 1'b1) {
138
138
  raise (ExceptionCode::IllegalInstruction, mode(), $encoding);
139
139
  }
@@ -141,4 +141,6 @@ operation(): |
141
141
  CSR[vsstatus].SIE = CSR[vsstatus].SPIE;
142
142
  CSR[vsstatus].SPIE = 1;
143
143
  $pc = $bits(CSR[vsepc]);
144
+ } else {
145
+ unreachable();
144
146
  }
@@ -47,11 +47,7 @@ operation(): |
47
47
  for (U32 i = CSR[vstart].VALUE; i < CSR[vl].VALUE; i++) {
48
48
  U32 start_bit_pos = i * state.sew;
49
49
  U32 end_bit_pos = start_bit_pos + state.sew - 1;
50
- v[vd] = {
51
- v[vd][VLEN-1:end_bit_pos + 1],
52
- (v[vs2])[end_bit_pos:start_bit_pos] + (v[vs1])[end_bit_pos:start_bit_pos],
53
- v[vd][start_bit_pos-1:0]
54
- };
50
+ V[vd][end_bit_pos:start_bit_pos] = V[vs2][end_bit_pos:start_bit_pos] + V[vs1][end_bit_pos:start_bit_pos];
55
51
  }
56
52
 
57
53
  CSR[vstart].VALUE = 0;
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: vs2 == vs1
34
+ to: vfneg.v vd, vs2
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: vs2 == vs1
34
+ to: vfabs.v vd, vs2
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -25,5 +25,8 @@ access:
25
25
  u: always
26
26
  vs: always
27
27
  vu: always
28
+ pseudoinstructions:
29
+ - when: "true"
30
+ to: vl1r.v vd, (xs1)
28
31
  data_independent_timing: false
29
32
  operation(): |
@@ -25,5 +25,8 @@ access:
25
25
  u: always
26
26
  vs: always
27
27
  vu: always
28
+ pseudoinstructions:
29
+ - when: "true"
30
+ to: vl2r.v vd, (xs1)
28
31
  data_independent_timing: false
29
32
  operation(): |
@@ -25,5 +25,8 @@ access:
25
25
  u: always
26
26
  vs: always
27
27
  vu: always
28
+ pseudoinstructions:
29
+ - when: "true"
30
+ to: vl4r.v vd, (xs1)
28
31
  data_independent_timing: false
29
32
  operation(): |
@@ -25,5 +25,8 @@ access:
25
25
  u: always
26
26
  vs: always
27
27
  vu: always
28
+ pseudoinstructions:
29
+ - when: "true"
30
+ to: vl8r.v vd, (xs1)
28
31
  data_independent_timing: false
29
32
  operation(): |
@@ -31,13 +31,8 @@ data_independent_timing: false
31
31
  operation(): |
32
32
  XReg virtual_address = X[xs1];
33
33
  # "A simple in-order implementation can ignore the settings and simply execute all vector instructions using the undisturbed policy"
34
- for (U32 i = 0; i < CSR[vl].VALUE; i++) {
35
- U32 start_bit_pos = (CSR[vstart].VALUE + i) * 8;
34
+ for (U32 i = CSR[vstart].VALUE; i < CSR[vl].VALUE; i++) {
35
+ U32 start_bit_pos = i * 8;
36
36
  U32 end_bit_pos = start_bit_pos + 7;
37
- v[vd] = {
38
- v[vd][VLEN-1:end_bit_pos + 1],
39
- sext(read_memory(8, virtual_address, $encoding), 8),
40
- v[vd][start_bit_pos-1:0]
41
- };
42
- virtual_address = virtual_address + 1;
37
+ V[vd][end_bit_pos:start_bit_pos] = read_memory(8, virtual_address + i, $encoding)[7:0];
43
38
  }
@@ -27,5 +27,8 @@ access:
27
27
  u: always
28
28
  vs: always
29
29
  vu: always
30
+ pseudoinstructions:
31
+ - when: vs2 == vs1
32
+ to: vmmv.m vd, vs2
30
33
  data_independent_timing: false
31
34
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: "true"
34
+ to: vmfge.vv vd, vs1, vs2, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: "true"
34
+ to: vmfgt.vv vd, vs1, vs2, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -27,5 +27,8 @@ access:
27
27
  u: always
28
28
  vs: always
29
29
  vu: always
30
+ pseudoinstructions:
31
+ - when: vs2 == vs1
32
+ to: vmnot.m vd, vs2
30
33
  data_independent_timing: false
31
34
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: imm < 5'b11111
34
+ to: vmsge.vi vd, vs2, imm+1, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: imm < 5'b11111
34
+ to: vmsgeu.vi vd, vs2, imm+1, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: imm < 5'b11111
34
+ to: vmslt.vi vd, vs2, imm+1, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: "true"
34
+ to: vmsge.vv vd, vs1, vs2, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: imm < 5'b11111
34
+ to: vmsltu.vi vd, vs2, imm+1, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: "true"
34
+ to: vmsgeu.vv vd, vs1, vs2, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: "true"
34
+ to: vmsgt.vv vd, vs1, vs2, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -29,5 +29,8 @@ access:
29
29
  u: always
30
30
  vs: always
31
31
  vu: always
32
+ pseudoinstructions:
33
+ - when: "true"
34
+ to: vmsgtu.vv vd, vs1, vs2, vm
32
35
  data_independent_timing: false
33
36
  operation(): |
@@ -54,19 +54,8 @@ operation(): |
54
54
  U32 start_bit_pos = i * state.sew;
55
55
  U32 end_bit_pos = start_bit_pos + state.sew - 1;
56
56
 
57
- # Write the sign-extended immediate (truncated to SEW bits) to the element,
58
- # guarding against invalid bit-slice ranges at vector register boundaries
59
- if (start_bit_pos == 0) {
60
- if (end_bit_pos == VLEN - 1) {
61
- v[vd] = sext_imm[state.sew-1:0];
62
- } else {
63
- v[vd] = {v[vd][VLEN-1:end_bit_pos + 1], sext_imm[state.sew-1:0]};
64
- }
65
- } else if (end_bit_pos == VLEN - 1) {
66
- v[vd] = {sext_imm[state.sew-1:0], v[vd][start_bit_pos-1:0]};
67
- } else {
68
- v[vd] = {v[vd][VLEN-1:end_bit_pos + 1], sext_imm[state.sew-1:0], v[vd][start_bit_pos-1:0]};
69
- }
57
+ # Write the sign-extended immediate (truncated to SEW bits) to the element
58
+ V[vd][end_bit_pos:start_bit_pos] = sext_imm[state.sew-1:0];
70
59
  }
71
60
 
72
61
  CSR[vstart].VALUE = 0;