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.
- checksums.yaml +4 -4
- data/.data/cfgs/example_rv64_with_overlay.yaml +5 -2
- data/.data/cfgs/mc100-32-full-example.yaml +1 -0
- data/.data/cfgs/profile/README.adoc +10 -0
- data/.data/cfgs/profile/RVA20S64.yaml +26 -6
- data/.data/cfgs/profile/RVA20U64.yaml +18 -4
- data/.data/cfgs/profile/RVA22S64.yaml +27 -7
- data/.data/cfgs/profile/RVA22U64.yaml +18 -4
- data/.data/cfgs/profile/RVA23S64.yaml +61 -7
- data/.data/cfgs/profile/RVA23U64.yaml +36 -4
- data/.data/cfgs/profile/RVB23S64.yaml +27 -7
- data/.data/cfgs/profile/RVB23U64.yaml +18 -4
- data/.data/cfgs/profile/RVI20U32.yaml +10 -4
- data/.data/cfgs/profile/RVI20U64.yaml +10 -4
- data/.data/cfgs/qc_iu.yaml +4 -1
- data/.data/cfgs/rv32-riscv-tests.yaml +2 -1
- data/.data/cfgs/rv32-vector.yaml +2 -1
- data/.data/cfgs/rv64-riscv-tests.yaml +2 -1
- data/.data/cfgs/rv64-vector.yaml +2 -1
- data/.data/spec/custom/isa/qc_iu/csr/Smrnmi/mnepc.yaml +17 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqccmi/qc.itba.yaml +45 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqccmi/qc.itdec.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/csr/jvt.yaml +11 -0
- data/.data/spec/custom/isa/qc_iu/csr/mepc.yaml +16 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqccmi.yaml +219 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqccmt.yaml +127 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmi/qc.cm.ilut.yaml +153 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmt/qc.cm.jalt.yaml +84 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmt/qc.cm.jt.yaml +60 -0
- data/.data/spec/custom/isa/qc_iu/isa/globals.isa +112 -0
- data/.data/spec/schemas/config_schema.json +219 -26
- data/.data/spec/schemas/csr_schema.json +0 -6
- data/.data/spec/schemas/ext_schema.json +80 -24
- data/.data/spec/schemas/inst_schema.json +0 -3
- data/.data/spec/schemas/profile_release_schema.json +1 -1
- data/.data/spec/schemas/profile_schema.json +0 -3
- data/.data/spec/schemas/register_file_schema.json +8 -3
- data/.data/spec/schemas/schema_defs.json +8 -27
- data/.data/spec/std/isa/csr/I/pmpcfg0.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg1.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg10.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg11.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg12.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg13.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg14.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg15.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg2.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg3.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg4.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg5.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg6.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg7.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfg8.yaml +8 -8
- data/.data/spec/std/isa/csr/I/pmpcfg9.yaml +4 -4
- data/.data/spec/std/isa/csr/I/pmpcfgN.layout +1 -1
- data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.layout +6 -2
- data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.yaml +6 -2
- data/.data/spec/std/isa/csr/hstatus.yaml +16 -0
- data/.data/spec/std/isa/csr/mcycleh.yaml +1 -1
- data/.data/spec/std/isa/csr/misa.yaml +0 -12
- data/.data/spec/std/isa/csr/mstatus.yaml +38 -0
- data/.data/spec/std/isa/csr/mstatush.yaml +17 -15
- data/.data/spec/std/isa/csr/senvcfg.yaml +16 -0
- data/.data/spec/std/isa/csr/sstatus.yaml +12 -0
- data/.data/spec/std/isa/csr/vsstatus.yaml +24 -0
- data/.data/spec/std/isa/ext/A.yaml +5 -7
- data/.data/spec/std/isa/ext/S.yaml +12 -0
- data/.data/spec/std/isa/ext/Smpmpmt.yaml +52 -0
- data/.data/spec/std/isa/ext/Sv32.yaml +7 -19
- data/.data/spec/std/isa/ext/Sv39.yaml +7 -19
- data/.data/spec/std/isa/ext/Sv48.yaml +4 -20
- data/.data/spec/std/isa/ext/Sv57.yaml +4 -20
- data/.data/spec/std/isa/ext/Svukte.yaml +71 -0
- data/.data/spec/std/isa/ext/Zawrs.yaml +1 -1
- data/.data/spec/std/isa/ext/Zihpm.yaml +0 -12
- data/.data/spec/std/isa/inst/C/c.addi.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.addi16sp.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.addiw.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.andi.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.ldsp.yaml +1 -1
- data/.data/spec/std/isa/inst/C/c.li.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.lui.yaml +1 -0
- data/.data/spec/std/isa/inst/C/c.mv.yaml +1 -1
- data/.data/spec/std/isa/inst/C/c.sdsp.yaml +1 -1
- data/.data/spec/std/isa/inst/D/fsgnj.d.yaml +3 -0
- data/.data/spec/std/isa/inst/D/fsgnjn.d.yaml +3 -0
- data/.data/spec/std/isa/inst/D/fsgnjx.d.yaml +3 -0
- data/.data/spec/std/isa/inst/F/fadd.s.yaml +5 -5
- data/.data/spec/std/isa/inst/F/fclass.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fcvt.l.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.lu.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.s.l.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.s.lu.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.s.w.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.s.wu.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.w.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fcvt.wu.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fdiv.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/feq.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fle.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fleq.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/flt.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fltq.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/flw.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fmadd.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fmax.s.yaml +6 -6
- data/.data/spec/std/isa/inst/F/fmin.s.yaml +6 -6
- data/.data/spec/std/isa/inst/F/fmsub.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fmul.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fmv.w.x.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fmv.x.w.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fnmadd.s.yaml +2 -2
- data/.data/spec/std/isa/inst/F/fnmsub.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fsgnj.s.yaml +4 -4
- data/.data/spec/std/isa/inst/F/fsgnjn.s.yaml +3 -3
- data/.data/spec/std/isa/inst/F/fsgnjx.s.yaml +4 -4
- data/.data/spec/std/isa/inst/F/fsqrt.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fsub.s.yaml +1 -1
- data/.data/spec/std/isa/inst/F/fsw.yaml +1 -1
- data/.data/spec/std/isa/inst/I/addi.yaml +1 -1
- data/.data/spec/std/isa/inst/I/addiw.yaml +1 -1
- data/.data/spec/std/isa/inst/I/andi.yaml +1 -1
- data/.data/spec/std/isa/inst/I/beq.yaml +1 -1
- data/.data/spec/std/isa/inst/I/bge.yaml +4 -2
- data/.data/spec/std/isa/inst/I/bgeu.yaml +3 -0
- data/.data/spec/std/isa/inst/I/blt.yaml +4 -2
- data/.data/spec/std/isa/inst/I/bltu.yaml +3 -0
- data/.data/spec/std/isa/inst/I/bne.yaml +1 -1
- data/.data/spec/std/isa/inst/I/slt.yaml +2 -2
- data/.data/spec/std/isa/inst/I/sltiu.yaml +1 -1
- data/.data/spec/std/isa/inst/I/sltu.yaml +1 -1
- data/.data/spec/std/isa/inst/I/sub.yaml +1 -1
- data/.data/spec/std/isa/inst/I/subw.yaml +1 -1
- data/.data/spec/std/isa/inst/I/xori.yaml +1 -1
- data/.data/spec/std/isa/inst/M/mul.yaml +0 -19
- data/.data/spec/std/isa/inst/Q/fsgnj.q.yaml +1 -1
- data/.data/spec/std/isa/inst/S/sret.yaml +3 -1
- data/.data/spec/std/isa/inst/V/vadd.vv.yaml +1 -5
- data/.data/spec/std/isa/inst/V/vfsgnjn.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vfsgnjx.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vl1re8.v.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vl2re8.v.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vl4re8.v.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vl8re8.v.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vle8.v.yaml +3 -8
- data/.data/spec/std/isa/inst/V/vmand.mm.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmfle.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmflt.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmnand.mm.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsgt.vi.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsgtu.vi.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsle.vi.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsle.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsleu.vi.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsleu.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmslt.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmsltu.vv.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmv.v.i.yaml +2 -13
- data/.data/spec/std/isa/inst/V/vmv.x.s.yaml +1 -1
- data/.data/spec/std/isa/inst/V/vmxnor.mm.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vmxor.mm.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vnsrl.wx.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vrsub.vx.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vse8.v.yaml +3 -4
- data/.data/spec/std/isa/inst/V/vwadd.vx.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vwaddu.vx.yaml +3 -0
- data/.data/spec/std/isa/inst/V/vxor.vi.yaml +4 -0
- data/.data/spec/std/isa/inst/Zalasr/lSIZE.AQRL.layout +40 -5
- data/.data/spec/std/isa/inst/Zalasr/lb.aq.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lb.aqrl.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/ld.aq.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/ld.aqrl.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lh.aq.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lh.aqrl.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lw.aq.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/lw.aqrl.yaml +17 -1
- data/.data/spec/std/isa/inst/Zalasr/sSIZE.AQRL.layout +46 -5
- data/.data/spec/std/isa/inst/Zalasr/sb.aqrl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sb.rl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sd.aqrl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sd.rl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sh.aqrl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sh.rl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sw.aqrl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zalasr/sw.rl.yaml +16 -1
- data/.data/spec/std/isa/inst/Zbkb/packw.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcd/c.fld.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcd/c.fldsp.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcd/c.fsdsp.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcf/c.flwsp.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcf/c.fswsp.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcmp/cm.pop.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcmp/cm.popret.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcmp/cm.popretz.yaml +1 -1
- data/.data/spec/std/isa/inst/Zcmp/cm.push.yaml +2 -3
- data/.data/spec/std/isa/inst/Zfa/fround.s.yaml +1 -1
- data/.data/spec/std/isa/inst/Zfh/fcvt.h.s.yaml +6 -6
- data/.data/spec/std/isa/inst/Zfh/fcvt.s.h.yaml +5 -5
- data/.data/spec/std/isa/inst/Zfh/flh.yaml +1 -1
- data/.data/spec/std/isa/inst/Zfh/fmv.h.x.yaml +1 -1
- data/.data/spec/std/isa/inst/Zfh/fmv.x.h.yaml +1 -1
- data/.data/spec/std/isa/inst/Zfh/fsh.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrc.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrci.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrs.yaml +2 -2
- data/.data/spec/std/isa/inst/Zicsr/csrrsi.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrw.yaml +1 -1
- data/.data/spec/std/isa/inst/Zicsr/csrrwi.yaml +1 -1
- data/.data/spec/std/isa/isa/builtin_functions.idl +17 -0
- data/.data/spec/std/isa/isa/fp.idl +1 -5
- data/.data/spec/std/isa/isa/globals.isa +45 -14
- data/.data/spec/std/isa/isa/vec.idl +1 -2
- data/.data/spec/std/isa/manual_version/isa/20240411/isa_20240411.yaml +5 -5
- data/.data/spec/std/isa/param/COUNTINHIBIT_EN.yaml +8 -2
- data/.data/spec/std/isa/param/JVT_BASE_MASK.yaml +1 -1
- data/.data/spec/std/isa/param/MCOUNTINHIBIT_IMPLEMENTED.yaml +25 -0
- data/.data/spec/std/isa/param/MTVEC_MODES.yaml +10 -3
- data/.data/spec/std/isa/param/VLEN.yaml +2 -0
- data/.data/spec/std/isa/profile/RVA20S64.yaml +11 -4
- data/.data/spec/std/isa/profile/RVA20U64.yaml +14 -5
- data/.data/spec/std/isa/profile/RVA22S64.yaml +14 -3
- data/.data/spec/std/isa/profile/RVA22U64.yaml +8 -1
- data/.data/spec/std/isa/profile/RVA23S64.yaml +13 -0
- data/.data/spec/std/isa/profile/RVA23U64.yaml +15 -1
- data/.data/spec/std/isa/profile/RVB23S64.yaml +15 -3
- data/.data/spec/std/isa/profile/RVB23U64.yaml +8 -1
- data/.data/spec/std/isa/profile/RVI20U32.yaml +8 -1
- data/.data/spec/std/isa/profile/RVI20U64.yaml +7 -0
- data/.data/spec/std/isa/register_file/F.yaml +3 -2
- data/.data/spec/std/isa/register_file/V.yaml +2 -2
- data/.data/spec/std/isa/register_file/X.yaml +2 -1
- data/lib/udb/architecture.rb +4 -25
- data/lib/udb/cfg_arch.rb +171 -59
- data/lib/udb/cli.rb +10 -1
- data/lib/udb/condition.rb +38 -37
- data/lib/udb/config.rb +72 -6
- data/lib/udb/logic.rb +29 -56
- data/lib/udb/obj/csr.rb +23 -5
- data/lib/udb/obj/csr_field.rb +36 -21
- data/lib/udb/obj/database_obj.rb +2 -5
- data/lib/udb/obj/extension.rb +0 -3
- data/lib/udb/obj/instruction.rb +1 -4
- data/lib/udb/obj/portfolio.rb +75 -20
- data/lib/udb/obj/profile.rb +0 -4
- data/lib/udb/obj/register_file.rb +63 -2
- data/lib/udb/portfolio_design.rb +3 -6
- data/lib/udb/resolver.rb +84 -23
- data/lib/udb/version.rb +1 -1
- data/lib/udb/version_spec.rb +8 -0
- data/lib/udb/z3.rb +23 -0
- data/lib/udb.rb +0 -3
- metadata +25 -37
- data/.data/cfgs/profile/RVA23M64.yaml +0 -159
- data/.data/cfgs/profile/RVB23M64.yaml +0 -149
- data/.data/spec/schemas/proc_cert_class_schema.json +0 -35
- data/.data/spec/schemas/proc_cert_model_schema.json +0 -336
- data/.data/spec/std/isa/proc_cert_class/AC.yaml +0 -13
- data/.data/spec/std/isa/proc_cert_class/MC.yaml +0 -13
- data/.data/spec/std/isa/proc_cert_class/RVI.yaml +0 -16
- data/.data/spec/std/isa/proc_cert_model/AC100.yaml +0 -72
- data/.data/spec/std/isa/proc_cert_model/AC200.yaml +0 -58
- data/.data/spec/std/isa/proc_cert_model/MC100-32.yaml +0 -155
- data/.data/spec/std/isa/proc_cert_model/MC100-64.yaml +0 -21
- data/.data/spec/std/isa/proc_cert_model/MC200-32.yaml +0 -60
- data/.data/spec/std/isa/proc_cert_model/MC200-64.yaml +0 -21
- data/.data/spec/std/isa/proc_cert_model/MC300-32.yaml +0 -40
- data/.data/spec/std/isa/proc_cert_model/MC300-64.yaml +0 -21
- data/.data/spec/std/isa/proc_cert_model/RVI20-32.yaml +0 -39
- data/.data/spec/std/isa/proc_cert_model/RVI20-64.yaml +0 -19
- data/.data/spec/std/isa/profile/RVA23M64.yaml +0 -24
- data/.data/spec/std/isa/profile/RVB23M64.yaml +0 -86
- data/lib/udb/cert_normative_rule.rb +0 -41
- data/lib/udb/obj/certifiable_obj.rb +0 -21
- data/lib/udb/obj/certificate.rb +0 -230
- 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 =
|
|
45
|
-
Bits<32> sp_value_b =
|
|
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
|
-
|
|
53
|
+
F[fd] = SP_CANONICAL_NAN;
|
|
54
54
|
} else if (is_sp_nan?(sp_value_a)) {
|
|
55
|
-
|
|
55
|
+
F[fd] = sp_value_b;
|
|
56
56
|
} else {
|
|
57
|
-
|
|
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
|
-
|
|
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 =
|
|
45
|
-
Bits<32> sp_value_b =
|
|
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
|
-
|
|
53
|
+
F[fd] = SP_CANONICAL_NAN;
|
|
54
54
|
} else if (is_sp_nan?(sp_value_a)) {
|
|
55
|
-
|
|
55
|
+
F[fd] = sp_value_b;
|
|
56
56
|
} else {
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
38
|
+
F[fd] = f32_muladd(F[fs1], F[fs2], F[fs3], F32MulAddOp::Softfloat_mulAdd_subC, mode);
|
|
39
39
|
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
|
-
|
|
37
|
+
F[fd] = nan_box(32, 64, sp_value);
|
|
38
38
|
} else {
|
|
39
|
-
|
|
39
|
+
F[fd] = sp_value;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
mark_f_state_dirty();
|
|
@@ -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 =
|
|
42
|
-
|
|
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
|
-
|
|
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 = {
|
|
42
|
+
Bits<32> sp_value = {F[fs2][31], F[fs1][30:0]};
|
|
43
43
|
|
|
44
44
|
if (implemented?(ExtensionName::D)) {
|
|
45
|
-
|
|
45
|
+
F[fd] = nan_box(32, 64, sp_value);
|
|
46
46
|
} else {
|
|
47
|
-
|
|
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 = {~
|
|
41
|
+
Bits<32> sp_value = {~F[fs2][31], F[fs1][30:0]};
|
|
42
42
|
|
|
43
43
|
if (implemented?(ExtensionName::D)) {
|
|
44
|
-
|
|
44
|
+
F[fd] = nan_box(32, 64, sp_value);
|
|
45
45
|
} else {
|
|
46
|
-
|
|
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 = {
|
|
40
|
+
Bits<32> sp_value = {F[fs1][31] ^ F[fs2][31], F[fs1][30:0]};
|
|
41
41
|
|
|
42
42
|
if (implemented?(ExtensionName::D)) {
|
|
43
|
-
|
|
43
|
+
F[fd] = nan_box(32, 64, sp_value);
|
|
44
44
|
} else {
|
|
45
|
-
|
|
45
|
+
F[fd] = sp_value;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
mark_f_state_dirty();
|
|
@@ -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];
|
|
@@ -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];
|
|
@@ -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
|
|
@@ -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
|
-
|
|
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;
|
|
@@ -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 =
|
|
35
|
-
U32 start_bit_pos =
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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
|
-
|
|
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;
|