udb 0.1.0

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 (2654) hide show
  1. checksums.yaml +7 -0
  2. data/.data/cfgs/MC100-32.yaml +23 -0
  3. data/.data/cfgs/_.yaml +8 -0
  4. data/.data/cfgs/example_rv64_with_overlay.yaml +618 -0
  5. data/.data/cfgs/mc100-32-full-example.yaml +91 -0
  6. data/.data/cfgs/memmap.json +76 -0
  7. data/.data/cfgs/prm_demo_rv32.yaml +28 -0
  8. data/.data/cfgs/profile/RVA20S64.yaml +73 -0
  9. data/.data/cfgs/profile/RVA20U64.yaml +53 -0
  10. data/.data/cfgs/profile/RVA22S64.yaml +123 -0
  11. data/.data/cfgs/profile/RVA22U64.yaml +85 -0
  12. data/.data/cfgs/profile/RVA23M64.yaml +161 -0
  13. data/.data/cfgs/profile/RVA23S64.yaml +151 -0
  14. data/.data/cfgs/profile/RVA23U64.yaml +131 -0
  15. data/.data/cfgs/profile/RVB23M64.yaml +151 -0
  16. data/.data/cfgs/profile/RVB23S64.yaml +147 -0
  17. data/.data/cfgs/profile/RVB23U64.yaml +141 -0
  18. data/.data/cfgs/profile/RVI20U32.yaml +41 -0
  19. data/.data/cfgs/profile/RVI20U64.yaml +41 -0
  20. data/.data/cfgs/qc_iu.yaml +153 -0
  21. data/.data/cfgs/regress.yaml +9 -0
  22. data/.data/cfgs/rv32-riscv-tests.yaml +208 -0
  23. data/.data/cfgs/rv32-vector.yaml +246 -0
  24. data/.data/cfgs/rv32.yaml +15 -0
  25. data/.data/cfgs/rv64-riscv-tests.yaml +202 -0
  26. data/.data/cfgs/rv64-vector.yaml +245 -0
  27. data/.data/cfgs/rv64.yaml +14 -0
  28. data/.data/spec/custom/isa/example/csr/marchid.yaml +8 -0
  29. data/.data/spec/custom/isa/example/csr/mcustom0.yaml +18 -0
  30. data/.data/spec/custom/isa/example/ext/Xcustom.yaml +15 -0
  31. data/.data/spec/custom/isa/qc_iu/csr/Xqci/gen_mcliciX.rb +188 -0
  32. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mcause.yaml +85 -0
  33. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie0.yaml +181 -0
  34. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie1.yaml +181 -0
  35. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie2.yaml +181 -0
  36. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie3.yaml +181 -0
  37. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie4.yaml +181 -0
  38. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie5.yaml +181 -0
  39. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie6.yaml +181 -0
  40. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie7.yaml +181 -0
  41. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl00.yaml +62 -0
  42. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl01.yaml +62 -0
  43. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl02.yaml +62 -0
  44. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl03.yaml +62 -0
  45. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl04.yaml +62 -0
  46. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl05.yaml +62 -0
  47. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl06.yaml +62 -0
  48. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl07.yaml +62 -0
  49. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl08.yaml +62 -0
  50. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl09.yaml +62 -0
  51. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl10.yaml +62 -0
  52. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl11.yaml +62 -0
  53. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl12.yaml +62 -0
  54. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl13.yaml +62 -0
  55. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl14.yaml +62 -0
  56. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl15.yaml +62 -0
  57. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl16.yaml +62 -0
  58. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl17.yaml +62 -0
  59. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl18.yaml +62 -0
  60. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl19.yaml +62 -0
  61. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl20.yaml +62 -0
  62. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl21.yaml +62 -0
  63. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl22.yaml +62 -0
  64. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl23.yaml +62 -0
  65. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl24.yaml +62 -0
  66. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl25.yaml +62 -0
  67. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl26.yaml +62 -0
  68. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl27.yaml +62 -0
  69. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl28.yaml +62 -0
  70. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl29.yaml +62 -0
  71. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl30.yaml +62 -0
  72. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl31.yaml +62 -0
  73. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip0.yaml +181 -0
  74. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip1.yaml +181 -0
  75. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip2.yaml +181 -0
  76. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip3.yaml +181 -0
  77. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip4.yaml +181 -0
  78. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip5.yaml +181 -0
  79. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip6.yaml +181 -0
  80. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip7.yaml +181 -0
  81. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mmcr.yaml +42 -0
  82. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mntvec.yaml +28 -0
  83. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mstkbottomaddr.yaml +33 -0
  84. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mstktopaddr.yaml +33 -0
  85. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mthreadptr.yaml +27 -0
  86. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpendaddr0.yaml +27 -0
  87. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpendaddr1.yaml +27 -0
  88. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpendaddr2.yaml +27 -0
  89. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpendaddr3.yaml +27 -0
  90. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpstartaddr0.yaml +27 -0
  91. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpstartaddr1.yaml +27 -0
  92. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpstartaddr2.yaml +27 -0
  93. data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpstartaddr3.yaml +27 -0
  94. data/.data/spec/custom/isa/qc_iu/exception_code/ExecWatchpoint.yaml +13 -0
  95. data/.data/spec/custom/isa/qc_iu/exception_code/IllegalStackPointer.yaml +13 -0
  96. data/.data/spec/custom/isa/qc_iu/exception_code/ReadWatchpoint.yaml +13 -0
  97. data/.data/spec/custom/isa/qc_iu/exception_code/SpOutOfRange.yaml +13 -0
  98. data/.data/spec/custom/isa/qc_iu/exception_code/WriteWatchpoint.yaml +13 -0
  99. data/.data/spec/custom/isa/qc_iu/ext/Xqccmp.yaml +160 -0
  100. data/.data/spec/custom/isa/qc_iu/ext/Xqci.yaml +778 -0
  101. data/.data/spec/custom/isa/qc_iu/ext/Xqcia.yaml +111 -0
  102. data/.data/spec/custom/isa/qc_iu/ext/Xqciac.yaml +66 -0
  103. data/.data/spec/custom/isa/qc_iu/ext/Xqcibi.yaml +50 -0
  104. data/.data/spec/custom/isa/qc_iu/ext/Xqcibm.yaml +146 -0
  105. data/.data/spec/custom/isa/qc_iu/ext/Xqcicli.yaml +57 -0
  106. data/.data/spec/custom/isa/qc_iu/ext/Xqcicm.yaml +50 -0
  107. data/.data/spec/custom/isa/qc_iu/ext/Xqcics.yaml +44 -0
  108. data/.data/spec/custom/isa/qc_iu/ext/Xqcicsr.yaml +68 -0
  109. data/.data/spec/custom/isa/qc_iu/ext/Xqciint.yaml +173 -0
  110. data/.data/spec/custom/isa/qc_iu/ext/Xqciio.yaml +32 -0
  111. data/.data/spec/custom/isa/qc_iu/ext/Xqcilb.yaml +46 -0
  112. data/.data/spec/custom/isa/qc_iu/ext/Xqcili.yaml +49 -0
  113. data/.data/spec/custom/isa/qc_iu/ext/Xqcilia.yaml +47 -0
  114. data/.data/spec/custom/isa/qc_iu/ext/Xqcilo.yaml +59 -0
  115. data/.data/spec/custom/isa/qc_iu/ext/Xqcilsm.yaml +94 -0
  116. data/.data/spec/custom/isa/qc_iu/ext/Xqcisim.yaml +48 -0
  117. data/.data/spec/custom/isa/qc_iu/ext/Xqcisls.yaml +44 -0
  118. data/.data/spec/custom/isa/qc_iu/ext/Xqcisync.yaml +62 -0
  119. data/.data/spec/custom/isa/qc_iu/inst/C/c.slli.yaml +6 -0
  120. data/.data/spec/custom/isa/qc_iu/inst/C/c.srai.yaml +5 -0
  121. data/.data/spec/custom/isa/qc_iu/inst/C/c.srli.yaml +5 -0
  122. data/.data/spec/custom/isa/qc_iu/inst/I/slti.yaml +15 -0
  123. data/.data/spec/custom/isa/qc_iu/inst/I/sltiu.yaml +8 -0
  124. data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.mva01s.yaml +36 -0
  125. data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.mvsa01.yaml +38 -0
  126. data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.pop.yaml +87 -0
  127. data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.popret.yaml +88 -0
  128. data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.popretz.yaml +88 -0
  129. data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.push.yaml +87 -0
  130. data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.pushfp.yaml +89 -0
  131. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.addsat.yaml +51 -0
  132. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.addusat.yaml +44 -0
  133. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.beqi.yaml +40 -0
  134. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.bgei.yaml +40 -0
  135. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.bgeui.yaml +40 -0
  136. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.blti.yaml +40 -0
  137. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.bltui.yaml +40 -0
  138. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.bnei.yaml +40 -0
  139. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.brev32.yaml +41 -0
  140. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.bexti.yaml +36 -0
  141. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.bseti.yaml +36 -0
  142. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.clrint.yaml +36 -0
  143. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.delay.yaml +31 -0
  144. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.di.yaml +30 -0
  145. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.dir.yaml +36 -0
  146. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.ei.yaml +30 -0
  147. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.eir.yaml +35 -0
  148. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.extu.yaml +36 -0
  149. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mienter.nest.yaml +61 -0
  150. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mienter.yaml +59 -0
  151. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mileaveret.yaml +106 -0
  152. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mnret.yaml +50 -0
  153. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mret.yaml +53 -0
  154. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.muliadd.yaml +37 -0
  155. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mveqz.yaml +35 -0
  156. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.ptrace.yaml +31 -0
  157. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.setint.yaml +36 -0
  158. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.sync.yaml +46 -0
  159. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.syncr.yaml +46 -0
  160. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.syncwf.yaml +46 -0
  161. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.syncwl.yaml +46 -0
  162. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.clo.yaml +38 -0
  163. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.clrinti.yaml +35 -0
  164. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.compress2.yaml +37 -0
  165. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.compress3.yaml +37 -0
  166. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.csrrwr.yaml +52 -0
  167. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.csrrwri.yaml +48 -0
  168. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.cto.yaml +38 -0
  169. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.addai.yaml +33 -0
  170. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.addi.yaml +37 -0
  171. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.andai.yaml +33 -0
  172. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.andi.yaml +37 -0
  173. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.beqi.yaml +40 -0
  174. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.bgei.yaml +40 -0
  175. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.bgeui.yaml +40 -0
  176. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.blti.yaml +40 -0
  177. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.bltui.yaml +40 -0
  178. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.bnei.yaml +40 -0
  179. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.j.yaml +32 -0
  180. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.jal.yaml +35 -0
  181. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lb.yaml +37 -0
  182. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lbu.yaml +37 -0
  183. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lh.yaml +37 -0
  184. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lhu.yaml +37 -0
  185. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.li.yaml +33 -0
  186. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lw.yaml +37 -0
  187. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.orai.yaml +33 -0
  188. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.ori.yaml +37 -0
  189. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.sb.yaml +36 -0
  190. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.sh.yaml +36 -0
  191. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.sw.yaml +36 -0
  192. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.xorai.yaml +33 -0
  193. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.xori.yaml +37 -0
  194. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.expand2.yaml +39 -0
  195. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.expand3.yaml +39 -0
  196. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ext.yaml +42 -0
  197. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extd.yaml +42 -0
  198. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdpr.yaml +49 -0
  199. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdprh.yaml +49 -0
  200. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdr.yaml +49 -0
  201. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdu.yaml +42 -0
  202. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdupr.yaml +49 -0
  203. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extduprh.yaml +49 -0
  204. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdur.yaml +49 -0
  205. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extu.yaml +41 -0
  206. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insb.yaml +42 -0
  207. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbh.yaml +51 -0
  208. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbhr.yaml +53 -0
  209. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbi.yaml +43 -0
  210. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbpr.yaml +47 -0
  211. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbprh.yaml +47 -0
  212. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbr.yaml +47 -0
  213. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbri.yaml +48 -0
  214. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.inw.yaml +38 -0
  215. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.li.yaml +33 -0
  216. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lieq.yaml +41 -0
  217. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lieqi.yaml +40 -0
  218. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lige.yaml +41 -0
  219. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ligei.yaml +40 -0
  220. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ligeu.yaml +41 -0
  221. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ligeui.yaml +40 -0
  222. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lilt.yaml +41 -0
  223. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lilti.yaml +40 -0
  224. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.liltu.yaml +41 -0
  225. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.liltui.yaml +40 -0
  226. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.line.yaml +41 -0
  227. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.linei.yaml +40 -0
  228. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrb.yaml +40 -0
  229. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrbu.yaml +39 -0
  230. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrh.yaml +40 -0
  231. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrhu.yaml +39 -0
  232. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrw.yaml +39 -0
  233. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lwm.yaml +46 -0
  234. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lwmi.yaml +45 -0
  235. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.muliadd.yaml +37 -0
  236. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mveq.yaml +42 -0
  237. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mveqi.yaml +41 -0
  238. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvge.yaml +42 -0
  239. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvgei.yaml +41 -0
  240. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvgeu.yaml +42 -0
  241. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvgeui.yaml +41 -0
  242. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvlt.yaml +42 -0
  243. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvlti.yaml +41 -0
  244. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvltu.yaml +42 -0
  245. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvltui.yaml +41 -0
  246. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvne.yaml +42 -0
  247. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvnei.yaml +41 -0
  248. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.norm.yaml +41 -0
  249. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.normeu.yaml +40 -0
  250. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.normu.yaml +40 -0
  251. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.outw.yaml +38 -0
  252. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pcoredump.yaml +32 -0
  253. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pexit.yaml +33 -0
  254. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ppreg.yaml +33 -0
  255. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ppregs.yaml +31 -0
  256. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pputc.yaml +33 -0
  257. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pputci.yaml +33 -0
  258. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pputs.yaml +34 -0
  259. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.psyscall.yaml +34 -0
  260. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.psyscalli.yaml +34 -0
  261. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selecteqi.yaml +44 -0
  262. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectieq.yaml +44 -0
  263. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectieqi.yaml +43 -0
  264. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectiieq.yaml +43 -0
  265. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectiine.yaml +43 -0
  266. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectine.yaml +44 -0
  267. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectinei.yaml +43 -0
  268. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectnei.yaml +44 -0
  269. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.setinti.yaml +35 -0
  270. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.setwm.yaml +45 -0
  271. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.setwmi.yaml +44 -0
  272. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.shladd.yaml +43 -0
  273. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.shlsat.yaml +48 -0
  274. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.shlusat.yaml +45 -0
  275. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.srb.yaml +39 -0
  276. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.srh.yaml +39 -0
  277. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.srw.yaml +39 -0
  278. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.subsat.yaml +53 -0
  279. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.subusat.yaml +37 -0
  280. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.swm.yaml +46 -0
  281. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.swmi.yaml +45 -0
  282. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.sync.yaml +34 -0
  283. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.syncr.yaml +34 -0
  284. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.syncwf.yaml +34 -0
  285. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.syncwl.yaml +34 -0
  286. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.wrap.yaml +43 -0
  287. data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.wrapi.yaml +47 -0
  288. data/.data/spec/custom/isa/qc_iu/isa/globals.isa +83 -0
  289. data/.data/spec/custom/isa/regress/manual_version/isa/regress/isa_regress.yaml +222 -0
  290. data/.data/spec/schemas/README.adoc +87 -0
  291. data/.data/spec/schemas/config_schema.json +198 -0
  292. data/.data/spec/schemas/csr_schema.json +319 -0
  293. data/.data/spec/schemas/exception_code_schema.json +33 -0
  294. data/.data/spec/schemas/ext_schema.json +168 -0
  295. data/.data/spec/schemas/inst_opcode_schema.json +37 -0
  296. data/.data/spec/schemas/inst_schema.json +503 -0
  297. data/.data/spec/schemas/inst_subtype_schema.json +190 -0
  298. data/.data/spec/schemas/inst_type_schema.json +69 -0
  299. data/.data/spec/schemas/inst_var_schema.json +93 -0
  300. data/.data/spec/schemas/inst_var_type_schema.json +45 -0
  301. data/.data/spec/schemas/inst_variable_metadatas.json +10 -0
  302. data/.data/spec/schemas/interrupt_code_schema.json +33 -0
  303. data/.data/spec/schemas/json-schema-draft-07.json +242 -0
  304. data/.data/spec/schemas/manual_schema.json +44 -0
  305. data/.data/spec/schemas/manual_version_schema.json +129 -0
  306. data/.data/spec/schemas/mmr_schema.json +74 -0
  307. data/.data/spec/schemas/non_isa_schema.json +102 -0
  308. data/.data/spec/schemas/param_schema.json +48 -0
  309. data/.data/spec/schemas/prm_schema.json +203 -0
  310. data/.data/spec/schemas/proc_cert_class_schema.json +35 -0
  311. data/.data/spec/schemas/proc_cert_model_schema.json +336 -0
  312. data/.data/spec/schemas/profile_family_schema.json +54 -0
  313. data/.data/spec/schemas/profile_release_schema.json +22 -0
  314. data/.data/spec/schemas/profile_schema.json +139 -0
  315. data/.data/spec/schemas/register_file_schema.json +123 -0
  316. data/.data/spec/schemas/schema_defs.json +905 -0
  317. data/.data/spec/std/isa/README.adoc +295 -0
  318. data/.data/spec/std/isa/csr/F/fcsr.yaml +190 -0
  319. data/.data/spec/std/isa/csr/F/fflags.yaml +95 -0
  320. data/.data/spec/std/isa/csr/F/frm.yaml +57 -0
  321. data/.data/spec/std/isa/csr/H/hcounteren.layout +178 -0
  322. data/.data/spec/std/isa/csr/H/hcounteren.yaml +1215 -0
  323. data/.data/spec/std/isa/csr/H/henvcfg.yaml +307 -0
  324. data/.data/spec/std/isa/csr/H/henvcfgh.yaml +120 -0
  325. data/.data/spec/std/isa/csr/H/hgatp.yaml +242 -0
  326. data/.data/spec/std/isa/csr/H/htimedelta.yaml +32 -0
  327. data/.data/spec/std/isa/csr/H/htimedeltah.yaml +32 -0
  328. data/.data/spec/std/isa/csr/H/htinst.yaml +50 -0
  329. data/.data/spec/std/isa/csr/H/htval.yaml +42 -0
  330. data/.data/spec/std/isa/csr/H/mtinst.yaml +50 -0
  331. data/.data/spec/std/isa/csr/H/mtval2.yaml +43 -0
  332. data/.data/spec/std/isa/csr/H/vsatp.yaml +149 -0
  333. data/.data/spec/std/isa/csr/I/mcounteren.layout +192 -0
  334. data/.data/spec/std/isa/csr/I/mcounteren.yaml +1061 -0
  335. data/.data/spec/std/isa/csr/I/pmpaddr0.yaml +79 -0
  336. data/.data/spec/std/isa/csr/I/pmpaddr1.yaml +79 -0
  337. data/.data/spec/std/isa/csr/I/pmpaddr10.yaml +79 -0
  338. data/.data/spec/std/isa/csr/I/pmpaddr11.yaml +79 -0
  339. data/.data/spec/std/isa/csr/I/pmpaddr12.yaml +79 -0
  340. data/.data/spec/std/isa/csr/I/pmpaddr13.yaml +79 -0
  341. data/.data/spec/std/isa/csr/I/pmpaddr14.yaml +79 -0
  342. data/.data/spec/std/isa/csr/I/pmpaddr15.yaml +79 -0
  343. data/.data/spec/std/isa/csr/I/pmpaddr16.yaml +79 -0
  344. data/.data/spec/std/isa/csr/I/pmpaddr17.yaml +79 -0
  345. data/.data/spec/std/isa/csr/I/pmpaddr18.yaml +79 -0
  346. data/.data/spec/std/isa/csr/I/pmpaddr19.yaml +79 -0
  347. data/.data/spec/std/isa/csr/I/pmpaddr2.yaml +79 -0
  348. data/.data/spec/std/isa/csr/I/pmpaddr20.yaml +79 -0
  349. data/.data/spec/std/isa/csr/I/pmpaddr21.yaml +79 -0
  350. data/.data/spec/std/isa/csr/I/pmpaddr22.yaml +79 -0
  351. data/.data/spec/std/isa/csr/I/pmpaddr23.yaml +79 -0
  352. data/.data/spec/std/isa/csr/I/pmpaddr24.yaml +79 -0
  353. data/.data/spec/std/isa/csr/I/pmpaddr25.yaml +79 -0
  354. data/.data/spec/std/isa/csr/I/pmpaddr26.yaml +79 -0
  355. data/.data/spec/std/isa/csr/I/pmpaddr27.yaml +79 -0
  356. data/.data/spec/std/isa/csr/I/pmpaddr28.yaml +79 -0
  357. data/.data/spec/std/isa/csr/I/pmpaddr29.yaml +79 -0
  358. data/.data/spec/std/isa/csr/I/pmpaddr3.yaml +79 -0
  359. data/.data/spec/std/isa/csr/I/pmpaddr30.yaml +79 -0
  360. data/.data/spec/std/isa/csr/I/pmpaddr31.yaml +79 -0
  361. data/.data/spec/std/isa/csr/I/pmpaddr32.yaml +79 -0
  362. data/.data/spec/std/isa/csr/I/pmpaddr33.yaml +79 -0
  363. data/.data/spec/std/isa/csr/I/pmpaddr34.yaml +79 -0
  364. data/.data/spec/std/isa/csr/I/pmpaddr35.yaml +79 -0
  365. data/.data/spec/std/isa/csr/I/pmpaddr36.yaml +79 -0
  366. data/.data/spec/std/isa/csr/I/pmpaddr37.yaml +79 -0
  367. data/.data/spec/std/isa/csr/I/pmpaddr38.yaml +79 -0
  368. data/.data/spec/std/isa/csr/I/pmpaddr39.yaml +79 -0
  369. data/.data/spec/std/isa/csr/I/pmpaddr4.yaml +79 -0
  370. data/.data/spec/std/isa/csr/I/pmpaddr40.yaml +79 -0
  371. data/.data/spec/std/isa/csr/I/pmpaddr41.yaml +79 -0
  372. data/.data/spec/std/isa/csr/I/pmpaddr42.yaml +79 -0
  373. data/.data/spec/std/isa/csr/I/pmpaddr43.yaml +79 -0
  374. data/.data/spec/std/isa/csr/I/pmpaddr44.yaml +79 -0
  375. data/.data/spec/std/isa/csr/I/pmpaddr45.yaml +79 -0
  376. data/.data/spec/std/isa/csr/I/pmpaddr46.yaml +79 -0
  377. data/.data/spec/std/isa/csr/I/pmpaddr47.yaml +79 -0
  378. data/.data/spec/std/isa/csr/I/pmpaddr48.yaml +79 -0
  379. data/.data/spec/std/isa/csr/I/pmpaddr49.yaml +79 -0
  380. data/.data/spec/std/isa/csr/I/pmpaddr5.yaml +79 -0
  381. data/.data/spec/std/isa/csr/I/pmpaddr50.yaml +79 -0
  382. data/.data/spec/std/isa/csr/I/pmpaddr51.yaml +79 -0
  383. data/.data/spec/std/isa/csr/I/pmpaddr52.yaml +79 -0
  384. data/.data/spec/std/isa/csr/I/pmpaddr53.yaml +79 -0
  385. data/.data/spec/std/isa/csr/I/pmpaddr54.yaml +79 -0
  386. data/.data/spec/std/isa/csr/I/pmpaddr55.yaml +79 -0
  387. data/.data/spec/std/isa/csr/I/pmpaddr56.yaml +79 -0
  388. data/.data/spec/std/isa/csr/I/pmpaddr57.yaml +79 -0
  389. data/.data/spec/std/isa/csr/I/pmpaddr58.yaml +79 -0
  390. data/.data/spec/std/isa/csr/I/pmpaddr59.yaml +79 -0
  391. data/.data/spec/std/isa/csr/I/pmpaddr6.yaml +79 -0
  392. data/.data/spec/std/isa/csr/I/pmpaddr60.yaml +79 -0
  393. data/.data/spec/std/isa/csr/I/pmpaddr61.yaml +79 -0
  394. data/.data/spec/std/isa/csr/I/pmpaddr62.yaml +79 -0
  395. data/.data/spec/std/isa/csr/I/pmpaddr63.yaml +79 -0
  396. data/.data/spec/std/isa/csr/I/pmpaddr7.yaml +79 -0
  397. data/.data/spec/std/isa/csr/I/pmpaddr8.yaml +79 -0
  398. data/.data/spec/std/isa/csr/I/pmpaddr9.yaml +79 -0
  399. data/.data/spec/std/isa/csr/I/pmpaddrN.layout +81 -0
  400. data/.data/spec/std/isa/csr/I/pmpcfg0.yaml +493 -0
  401. data/.data/spec/std/isa/csr/I/pmpcfg1.yaml +255 -0
  402. data/.data/spec/std/isa/csr/I/pmpcfg10.yaml +493 -0
  403. data/.data/spec/std/isa/csr/I/pmpcfg11.yaml +255 -0
  404. data/.data/spec/std/isa/csr/I/pmpcfg12.yaml +493 -0
  405. data/.data/spec/std/isa/csr/I/pmpcfg13.yaml +255 -0
  406. data/.data/spec/std/isa/csr/I/pmpcfg14.yaml +493 -0
  407. data/.data/spec/std/isa/csr/I/pmpcfg15.yaml +255 -0
  408. data/.data/spec/std/isa/csr/I/pmpcfg2.yaml +493 -0
  409. data/.data/spec/std/isa/csr/I/pmpcfg3.yaml +255 -0
  410. data/.data/spec/std/isa/csr/I/pmpcfg4.yaml +493 -0
  411. data/.data/spec/std/isa/csr/I/pmpcfg5.yaml +255 -0
  412. data/.data/spec/std/isa/csr/I/pmpcfg6.yaml +493 -0
  413. data/.data/spec/std/isa/csr/I/pmpcfg7.yaml +255 -0
  414. data/.data/spec/std/isa/csr/I/pmpcfg8.yaml +493 -0
  415. data/.data/spec/std/isa/csr/I/pmpcfg9.yaml +255 -0
  416. data/.data/spec/std/isa/csr/I/pmpcfgN.layout +90 -0
  417. data/.data/spec/std/isa/csr/S/scounteren.layout +103 -0
  418. data/.data/spec/std/isa/csr/S/scounteren.yaml +692 -0
  419. data/.data/spec/std/isa/csr/Smcntrpmf/mcyclecfg.yaml +97 -0
  420. data/.data/spec/std/isa/csr/Smcntrpmf/mcyclecfgh.yaml +69 -0
  421. data/.data/spec/std/isa/csr/Smcntrpmf/minstretcfg.yaml +94 -0
  422. data/.data/spec/std/isa/csr/Smcntrpmf/minstretcfgh.yaml +69 -0
  423. data/.data/spec/std/isa/csr/Smcsrind/mireg.yaml +63 -0
  424. data/.data/spec/std/isa/csr/Smcsrind/mireg2.yaml +63 -0
  425. data/.data/spec/std/isa/csr/Smcsrind/mireg3.yaml +63 -0
  426. data/.data/spec/std/isa/csr/Smcsrind/mireg4.yaml +63 -0
  427. data/.data/spec/std/isa/csr/Smcsrind/mireg5.yaml +63 -0
  428. data/.data/spec/std/isa/csr/Smcsrind/mireg6.yaml +63 -0
  429. data/.data/spec/std/isa/csr/Smcsrind/miselect.yaml +47 -0
  430. data/.data/spec/std/isa/csr/Smcsrind/sireg.yaml +63 -0
  431. data/.data/spec/std/isa/csr/Smcsrind/sireg2.yaml +63 -0
  432. data/.data/spec/std/isa/csr/Smcsrind/sireg3.yaml +63 -0
  433. data/.data/spec/std/isa/csr/Smcsrind/sireg4.yaml +63 -0
  434. data/.data/spec/std/isa/csr/Smcsrind/sireg5.yaml +63 -0
  435. data/.data/spec/std/isa/csr/Smcsrind/sireg6.yaml +63 -0
  436. data/.data/spec/std/isa/csr/Smcsrind/siselect.yaml +41 -0
  437. data/.data/spec/std/isa/csr/Smcsrind/vsireg.yaml +63 -0
  438. data/.data/spec/std/isa/csr/Smcsrind/vsireg2.yaml +62 -0
  439. data/.data/spec/std/isa/csr/Smcsrind/vsireg3.yaml +61 -0
  440. data/.data/spec/std/isa/csr/Smcsrind/vsireg4.yaml +61 -0
  441. data/.data/spec/std/isa/csr/Smcsrind/vsireg5.yaml +62 -0
  442. data/.data/spec/std/isa/csr/Smcsrind/vsireg6.yaml +62 -0
  443. data/.data/spec/std/isa/csr/Smcsrind/vsiselect.yaml +47 -0
  444. data/.data/spec/std/isa/csr/Smctr/mctrctl.yaml +223 -0
  445. data/.data/spec/std/isa/csr/Smctr/sctrctl.yaml +224 -0
  446. data/.data/spec/std/isa/csr/Smctr/vsctrctl.yaml +228 -0
  447. data/.data/spec/std/isa/csr/Smrnmi/mncause.yaml +49 -0
  448. data/.data/spec/std/isa/csr/Smrnmi/mnepc.yaml +54 -0
  449. data/.data/spec/std/isa/csr/Smrnmi/mnscratch.yaml +26 -0
  450. data/.data/spec/std/isa/csr/Smrnmi/mnstatus.yaml +109 -0
  451. data/.data/spec/std/isa/csr/Sscofpmf/scountovf.layout +64 -0
  452. data/.data/spec/std/isa/csr/Sscofpmf/scountovf.yaml +455 -0
  453. data/.data/spec/std/isa/csr/Ssqosid/srmcfg.yaml +116 -0
  454. data/.data/spec/std/isa/csr/V/vcsr.yaml +36 -0
  455. data/.data/spec/std/isa/csr/V/vl.yaml +33 -0
  456. data/.data/spec/std/isa/csr/V/vlenb.yaml +27 -0
  457. data/.data/spec/std/isa/csr/V/vstart.yaml +81 -0
  458. data/.data/spec/std/isa/csr/V/vtype.yaml +125 -0
  459. data/.data/spec/std/isa/csr/V/vxrm.yaml +48 -0
  460. data/.data/spec/std/isa/csr/V/vxsat.yaml +33 -0
  461. data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.layout +86 -0
  462. data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.yaml +507 -0
  463. data/.data/spec/std/isa/csr/Zihpm/hpmcounter10.yaml +67 -0
  464. data/.data/spec/std/isa/csr/Zihpm/hpmcounter10h.yaml +69 -0
  465. data/.data/spec/std/isa/csr/Zihpm/hpmcounter11.yaml +67 -0
  466. data/.data/spec/std/isa/csr/Zihpm/hpmcounter11h.yaml +69 -0
  467. data/.data/spec/std/isa/csr/Zihpm/hpmcounter12.yaml +67 -0
  468. data/.data/spec/std/isa/csr/Zihpm/hpmcounter12h.yaml +69 -0
  469. data/.data/spec/std/isa/csr/Zihpm/hpmcounter13.yaml +67 -0
  470. data/.data/spec/std/isa/csr/Zihpm/hpmcounter13h.yaml +69 -0
  471. data/.data/spec/std/isa/csr/Zihpm/hpmcounter14.yaml +67 -0
  472. data/.data/spec/std/isa/csr/Zihpm/hpmcounter14h.yaml +69 -0
  473. data/.data/spec/std/isa/csr/Zihpm/hpmcounter15.yaml +67 -0
  474. data/.data/spec/std/isa/csr/Zihpm/hpmcounter15h.yaml +69 -0
  475. data/.data/spec/std/isa/csr/Zihpm/hpmcounter16.yaml +67 -0
  476. data/.data/spec/std/isa/csr/Zihpm/hpmcounter16h.yaml +69 -0
  477. data/.data/spec/std/isa/csr/Zihpm/hpmcounter17.yaml +67 -0
  478. data/.data/spec/std/isa/csr/Zihpm/hpmcounter17h.yaml +69 -0
  479. data/.data/spec/std/isa/csr/Zihpm/hpmcounter18.yaml +67 -0
  480. data/.data/spec/std/isa/csr/Zihpm/hpmcounter18h.yaml +69 -0
  481. data/.data/spec/std/isa/csr/Zihpm/hpmcounter19.yaml +67 -0
  482. data/.data/spec/std/isa/csr/Zihpm/hpmcounter19h.yaml +69 -0
  483. data/.data/spec/std/isa/csr/Zihpm/hpmcounter20.yaml +67 -0
  484. data/.data/spec/std/isa/csr/Zihpm/hpmcounter20h.yaml +69 -0
  485. data/.data/spec/std/isa/csr/Zihpm/hpmcounter21.yaml +67 -0
  486. data/.data/spec/std/isa/csr/Zihpm/hpmcounter21h.yaml +69 -0
  487. data/.data/spec/std/isa/csr/Zihpm/hpmcounter22.yaml +67 -0
  488. data/.data/spec/std/isa/csr/Zihpm/hpmcounter22h.yaml +69 -0
  489. data/.data/spec/std/isa/csr/Zihpm/hpmcounter23.yaml +67 -0
  490. data/.data/spec/std/isa/csr/Zihpm/hpmcounter23h.yaml +69 -0
  491. data/.data/spec/std/isa/csr/Zihpm/hpmcounter24.yaml +67 -0
  492. data/.data/spec/std/isa/csr/Zihpm/hpmcounter24h.yaml +69 -0
  493. data/.data/spec/std/isa/csr/Zihpm/hpmcounter25.yaml +67 -0
  494. data/.data/spec/std/isa/csr/Zihpm/hpmcounter25h.yaml +69 -0
  495. data/.data/spec/std/isa/csr/Zihpm/hpmcounter26.yaml +67 -0
  496. data/.data/spec/std/isa/csr/Zihpm/hpmcounter26h.yaml +69 -0
  497. data/.data/spec/std/isa/csr/Zihpm/hpmcounter27.yaml +67 -0
  498. data/.data/spec/std/isa/csr/Zihpm/hpmcounter27h.yaml +69 -0
  499. data/.data/spec/std/isa/csr/Zihpm/hpmcounter28.yaml +67 -0
  500. data/.data/spec/std/isa/csr/Zihpm/hpmcounter28h.yaml +69 -0
  501. data/.data/spec/std/isa/csr/Zihpm/hpmcounter29.yaml +67 -0
  502. data/.data/spec/std/isa/csr/Zihpm/hpmcounter29h.yaml +69 -0
  503. data/.data/spec/std/isa/csr/Zihpm/hpmcounter3.yaml +67 -0
  504. data/.data/spec/std/isa/csr/Zihpm/hpmcounter30.yaml +67 -0
  505. data/.data/spec/std/isa/csr/Zihpm/hpmcounter30h.yaml +69 -0
  506. data/.data/spec/std/isa/csr/Zihpm/hpmcounter31.yaml +67 -0
  507. data/.data/spec/std/isa/csr/Zihpm/hpmcounter31h.yaml +69 -0
  508. data/.data/spec/std/isa/csr/Zihpm/hpmcounter3h.yaml +69 -0
  509. data/.data/spec/std/isa/csr/Zihpm/hpmcounter4.yaml +67 -0
  510. data/.data/spec/std/isa/csr/Zihpm/hpmcounter4h.yaml +69 -0
  511. data/.data/spec/std/isa/csr/Zihpm/hpmcounter5.yaml +67 -0
  512. data/.data/spec/std/isa/csr/Zihpm/hpmcounter5h.yaml +69 -0
  513. data/.data/spec/std/isa/csr/Zihpm/hpmcounter6.yaml +67 -0
  514. data/.data/spec/std/isa/csr/Zihpm/hpmcounter6h.yaml +69 -0
  515. data/.data/spec/std/isa/csr/Zihpm/hpmcounter7.yaml +67 -0
  516. data/.data/spec/std/isa/csr/Zihpm/hpmcounter7h.yaml +69 -0
  517. data/.data/spec/std/isa/csr/Zihpm/hpmcounter8.yaml +67 -0
  518. data/.data/spec/std/isa/csr/Zihpm/hpmcounter8h.yaml +69 -0
  519. data/.data/spec/std/isa/csr/Zihpm/hpmcounter9.yaml +67 -0
  520. data/.data/spec/std/isa/csr/Zihpm/hpmcounter9h.yaml +69 -0
  521. data/.data/spec/std/isa/csr/Zihpm/hpmcounterN.layout +65 -0
  522. data/.data/spec/std/isa/csr/Zihpm/hpmcounterNh.layout +67 -0
  523. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter10.yaml +106 -0
  524. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter10h.yaml +85 -0
  525. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter11.yaml +106 -0
  526. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter11h.yaml +85 -0
  527. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter12.yaml +106 -0
  528. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter12h.yaml +85 -0
  529. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter13.yaml +106 -0
  530. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter13h.yaml +85 -0
  531. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter14.yaml +106 -0
  532. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter14h.yaml +85 -0
  533. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter15.yaml +106 -0
  534. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter15h.yaml +85 -0
  535. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter16.yaml +106 -0
  536. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter16h.yaml +85 -0
  537. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter17.yaml +106 -0
  538. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter17h.yaml +85 -0
  539. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter18.yaml +106 -0
  540. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter18h.yaml +85 -0
  541. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter19.yaml +106 -0
  542. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter19h.yaml +85 -0
  543. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter20.yaml +106 -0
  544. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter20h.yaml +85 -0
  545. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter21.yaml +106 -0
  546. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter21h.yaml +85 -0
  547. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter22.yaml +106 -0
  548. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter22h.yaml +85 -0
  549. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter23.yaml +106 -0
  550. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter23h.yaml +85 -0
  551. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter24.yaml +106 -0
  552. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter24h.yaml +85 -0
  553. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter25.yaml +106 -0
  554. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter25h.yaml +85 -0
  555. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter26.yaml +106 -0
  556. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter26h.yaml +85 -0
  557. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter27.yaml +106 -0
  558. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter27h.yaml +85 -0
  559. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter28.yaml +106 -0
  560. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter28h.yaml +85 -0
  561. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter29.yaml +106 -0
  562. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter29h.yaml +85 -0
  563. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter3.yaml +106 -0
  564. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter30.yaml +106 -0
  565. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter30h.yaml +85 -0
  566. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter31.yaml +106 -0
  567. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter31h.yaml +85 -0
  568. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter3h.yaml +85 -0
  569. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter4.yaml +106 -0
  570. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter4h.yaml +85 -0
  571. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter5.yaml +106 -0
  572. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter5h.yaml +85 -0
  573. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter6.yaml +106 -0
  574. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter6h.yaml +85 -0
  575. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter7.yaml +106 -0
  576. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter7h.yaml +85 -0
  577. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter8.yaml +106 -0
  578. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter8h.yaml +85 -0
  579. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter9.yaml +106 -0
  580. data/.data/spec/std/isa/csr/Zihpm/mhpmcounter9h.yaml +85 -0
  581. data/.data/spec/std/isa/csr/Zihpm/mhpmcounterN.layout +104 -0
  582. data/.data/spec/std/isa/csr/Zihpm/mhpmcounterNh.layout +83 -0
  583. data/.data/spec/std/isa/csr/Zihpm/mhpmevent10.yaml +170 -0
  584. data/.data/spec/std/isa/csr/Zihpm/mhpmevent10h.yaml +163 -0
  585. data/.data/spec/std/isa/csr/Zihpm/mhpmevent11.yaml +170 -0
  586. data/.data/spec/std/isa/csr/Zihpm/mhpmevent11h.yaml +163 -0
  587. data/.data/spec/std/isa/csr/Zihpm/mhpmevent12.yaml +170 -0
  588. data/.data/spec/std/isa/csr/Zihpm/mhpmevent12h.yaml +163 -0
  589. data/.data/spec/std/isa/csr/Zihpm/mhpmevent13.yaml +170 -0
  590. data/.data/spec/std/isa/csr/Zihpm/mhpmevent13h.yaml +163 -0
  591. data/.data/spec/std/isa/csr/Zihpm/mhpmevent14.yaml +170 -0
  592. data/.data/spec/std/isa/csr/Zihpm/mhpmevent14h.yaml +163 -0
  593. data/.data/spec/std/isa/csr/Zihpm/mhpmevent15.yaml +170 -0
  594. data/.data/spec/std/isa/csr/Zihpm/mhpmevent15h.yaml +163 -0
  595. data/.data/spec/std/isa/csr/Zihpm/mhpmevent16.yaml +170 -0
  596. data/.data/spec/std/isa/csr/Zihpm/mhpmevent16h.yaml +163 -0
  597. data/.data/spec/std/isa/csr/Zihpm/mhpmevent17.yaml +170 -0
  598. data/.data/spec/std/isa/csr/Zihpm/mhpmevent17h.yaml +163 -0
  599. data/.data/spec/std/isa/csr/Zihpm/mhpmevent18.yaml +170 -0
  600. data/.data/spec/std/isa/csr/Zihpm/mhpmevent18h.yaml +163 -0
  601. data/.data/spec/std/isa/csr/Zihpm/mhpmevent19.yaml +170 -0
  602. data/.data/spec/std/isa/csr/Zihpm/mhpmevent19h.yaml +163 -0
  603. data/.data/spec/std/isa/csr/Zihpm/mhpmevent20.yaml +170 -0
  604. data/.data/spec/std/isa/csr/Zihpm/mhpmevent20h.yaml +163 -0
  605. data/.data/spec/std/isa/csr/Zihpm/mhpmevent21.yaml +170 -0
  606. data/.data/spec/std/isa/csr/Zihpm/mhpmevent21h.yaml +163 -0
  607. data/.data/spec/std/isa/csr/Zihpm/mhpmevent22.yaml +170 -0
  608. data/.data/spec/std/isa/csr/Zihpm/mhpmevent22h.yaml +163 -0
  609. data/.data/spec/std/isa/csr/Zihpm/mhpmevent23.yaml +170 -0
  610. data/.data/spec/std/isa/csr/Zihpm/mhpmevent23h.yaml +163 -0
  611. data/.data/spec/std/isa/csr/Zihpm/mhpmevent24.yaml +170 -0
  612. data/.data/spec/std/isa/csr/Zihpm/mhpmevent24h.yaml +163 -0
  613. data/.data/spec/std/isa/csr/Zihpm/mhpmevent25.yaml +170 -0
  614. data/.data/spec/std/isa/csr/Zihpm/mhpmevent25h.yaml +163 -0
  615. data/.data/spec/std/isa/csr/Zihpm/mhpmevent26.yaml +170 -0
  616. data/.data/spec/std/isa/csr/Zihpm/mhpmevent26h.yaml +163 -0
  617. data/.data/spec/std/isa/csr/Zihpm/mhpmevent27.yaml +170 -0
  618. data/.data/spec/std/isa/csr/Zihpm/mhpmevent27h.yaml +163 -0
  619. data/.data/spec/std/isa/csr/Zihpm/mhpmevent28.yaml +170 -0
  620. data/.data/spec/std/isa/csr/Zihpm/mhpmevent28h.yaml +163 -0
  621. data/.data/spec/std/isa/csr/Zihpm/mhpmevent29.yaml +170 -0
  622. data/.data/spec/std/isa/csr/Zihpm/mhpmevent29h.yaml +163 -0
  623. data/.data/spec/std/isa/csr/Zihpm/mhpmevent3.yaml +170 -0
  624. data/.data/spec/std/isa/csr/Zihpm/mhpmevent30.yaml +170 -0
  625. data/.data/spec/std/isa/csr/Zihpm/mhpmevent30h.yaml +163 -0
  626. data/.data/spec/std/isa/csr/Zihpm/mhpmevent31.yaml +170 -0
  627. data/.data/spec/std/isa/csr/Zihpm/mhpmevent31h.yaml +163 -0
  628. data/.data/spec/std/isa/csr/Zihpm/mhpmevent3h.yaml +163 -0
  629. data/.data/spec/std/isa/csr/Zihpm/mhpmevent4.yaml +170 -0
  630. data/.data/spec/std/isa/csr/Zihpm/mhpmevent4h.yaml +163 -0
  631. data/.data/spec/std/isa/csr/Zihpm/mhpmevent5.yaml +170 -0
  632. data/.data/spec/std/isa/csr/Zihpm/mhpmevent5h.yaml +163 -0
  633. data/.data/spec/std/isa/csr/Zihpm/mhpmevent6.yaml +170 -0
  634. data/.data/spec/std/isa/csr/Zihpm/mhpmevent6h.yaml +163 -0
  635. data/.data/spec/std/isa/csr/Zihpm/mhpmevent7.yaml +170 -0
  636. data/.data/spec/std/isa/csr/Zihpm/mhpmevent7h.yaml +163 -0
  637. data/.data/spec/std/isa/csr/Zihpm/mhpmevent8.yaml +170 -0
  638. data/.data/spec/std/isa/csr/Zihpm/mhpmevent8h.yaml +163 -0
  639. data/.data/spec/std/isa/csr/Zihpm/mhpmevent9.yaml +170 -0
  640. data/.data/spec/std/isa/csr/Zihpm/mhpmevent9h.yaml +163 -0
  641. data/.data/spec/std/isa/csr/Zihpm/mhpmeventN.layout +168 -0
  642. data/.data/spec/std/isa/csr/Zihpm/mhpmeventNh.layout +161 -0
  643. data/.data/spec/std/isa/csr/cycle.yaml +79 -0
  644. data/.data/spec/std/isa/csr/cycleh.yaml +86 -0
  645. data/.data/spec/std/isa/csr/dcsr.yaml +293 -0
  646. data/.data/spec/std/isa/csr/dpc.yaml +45 -0
  647. data/.data/spec/std/isa/csr/dscratch0.yaml +28 -0
  648. data/.data/spec/std/isa/csr/dscratch1.yaml +28 -0
  649. data/.data/spec/std/isa/csr/hcontext.yaml +64 -0
  650. data/.data/spec/std/isa/csr/hedeleg.yaml +243 -0
  651. data/.data/spec/std/isa/csr/hedelegh.yaml +23 -0
  652. data/.data/spec/std/isa/csr/hstateen0.yaml +220 -0
  653. data/.data/spec/std/isa/csr/hstateen0h.yaml +159 -0
  654. data/.data/spec/std/isa/csr/hstateen1.yaml +70 -0
  655. data/.data/spec/std/isa/csr/hstateen1h.yaml +47 -0
  656. data/.data/spec/std/isa/csr/hstateen2.yaml +70 -0
  657. data/.data/spec/std/isa/csr/hstateen2h.yaml +47 -0
  658. data/.data/spec/std/isa/csr/hstateen3.yaml +70 -0
  659. data/.data/spec/std/isa/csr/hstateen3h.yaml +47 -0
  660. data/.data/spec/std/isa/csr/hstatus.yaml +246 -0
  661. data/.data/spec/std/isa/csr/instret.yaml +77 -0
  662. data/.data/spec/std/isa/csr/instreth.yaml +81 -0
  663. data/.data/spec/std/isa/csr/jvt.yaml +89 -0
  664. data/.data/spec/std/isa/csr/marchid.yaml +58 -0
  665. data/.data/spec/std/isa/csr/mcause.yaml +94 -0
  666. data/.data/spec/std/isa/csr/mconfigptr.yaml +61 -0
  667. data/.data/spec/std/isa/csr/mcontext.yaml +55 -0
  668. data/.data/spec/std/isa/csr/mcycle.yaml +67 -0
  669. data/.data/spec/std/isa/csr/mcycleh.yaml +40 -0
  670. data/.data/spec/std/isa/csr/medeleg.yaml +672 -0
  671. data/.data/spec/std/isa/csr/medelegh.yaml +22 -0
  672. data/.data/spec/std/isa/csr/menvcfg.yaml +305 -0
  673. data/.data/spec/std/isa/csr/menvcfgh.yaml +59 -0
  674. data/.data/spec/std/isa/csr/mepc.yaml +54 -0
  675. data/.data/spec/std/isa/csr/mhartid.yaml +26 -0
  676. data/.data/spec/std/isa/csr/mideleg.yaml +204 -0
  677. data/.data/spec/std/isa/csr/mie.yaml +105 -0
  678. data/.data/spec/std/isa/csr/mimpid.yaml +41 -0
  679. data/.data/spec/std/isa/csr/minstret.yaml +54 -0
  680. data/.data/spec/std/isa/csr/minstreth.yaml +39 -0
  681. data/.data/spec/std/isa/csr/mip.yaml +434 -0
  682. data/.data/spec/std/isa/csr/misa.yaml +263 -0
  683. data/.data/spec/std/isa/csr/mscontext.yaml +42 -0
  684. data/.data/spec/std/isa/csr/mscratch.yaml +24 -0
  685. data/.data/spec/std/isa/csr/mseccfg.yaml +25 -0
  686. data/.data/spec/std/isa/csr/mseccfgh.yaml +28 -0
  687. data/.data/spec/std/isa/csr/mstateen0.yaml +182 -0
  688. data/.data/spec/std/isa/csr/mstateen0h.yaml +151 -0
  689. data/.data/spec/std/isa/csr/mstateen1.yaml +65 -0
  690. data/.data/spec/std/isa/csr/mstateen1h.yaml +37 -0
  691. data/.data/spec/std/isa/csr/mstateen2.yaml +65 -0
  692. data/.data/spec/std/isa/csr/mstateen2h.yaml +37 -0
  693. data/.data/spec/std/isa/csr/mstateen3.yaml +65 -0
  694. data/.data/spec/std/isa/csr/mstateen3h.yaml +37 -0
  695. data/.data/spec/std/isa/csr/mstatus.yaml +626 -0
  696. data/.data/spec/std/isa/csr/mstatush.yaml +88 -0
  697. data/.data/spec/std/isa/csr/mtval.yaml +105 -0
  698. data/.data/spec/std/isa/csr/mtvec.yaml +111 -0
  699. data/.data/spec/std/isa/csr/mvendorid.yaml +28 -0
  700. data/.data/spec/std/isa/csr/satp.yaml +184 -0
  701. data/.data/spec/std/isa/csr/scause.yaml +96 -0
  702. data/.data/spec/std/isa/csr/schema.adoc +223 -0
  703. data/.data/spec/std/isa/csr/scontext.yaml +52 -0
  704. data/.data/spec/std/isa/csr/senvcfg.yaml +157 -0
  705. data/.data/spec/std/isa/csr/sepc.yaml +51 -0
  706. data/.data/spec/std/isa/csr/sie.yaml +49 -0
  707. data/.data/spec/std/isa/csr/sip.yaml +160 -0
  708. data/.data/spec/std/isa/csr/sscratch.yaml +23 -0
  709. data/.data/spec/std/isa/csr/sstateen0.yaml +134 -0
  710. data/.data/spec/std/isa/csr/sstateen1.yaml +96 -0
  711. data/.data/spec/std/isa/csr/sstateen2.yaml +96 -0
  712. data/.data/spec/std/isa/csr/sstateen3.yaml +96 -0
  713. data/.data/spec/std/isa/csr/sstatus.yaml +149 -0
  714. data/.data/spec/std/isa/csr/stval.yaml +103 -0
  715. data/.data/spec/std/isa/csr/stvec.yaml +54 -0
  716. data/.data/spec/std/isa/csr/tdata1.yaml +68 -0
  717. data/.data/spec/std/isa/csr/tdata2.yaml +32 -0
  718. data/.data/spec/std/isa/csr/tdata3.yaml +32 -0
  719. data/.data/spec/std/isa/csr/time.yaml +89 -0
  720. data/.data/spec/std/isa/csr/timeh.yaml +90 -0
  721. data/.data/spec/std/isa/csr/tselect.yaml +36 -0
  722. data/.data/spec/std/isa/csr/vscause.yaml +97 -0
  723. data/.data/spec/std/isa/csr/vsepc.yaml +52 -0
  724. data/.data/spec/std/isa/csr/vsstatus.yaml +232 -0
  725. data/.data/spec/std/isa/csr/vstval.yaml +105 -0
  726. data/.data/spec/std/isa/csr/vstvec.yaml +55 -0
  727. data/.data/spec/std/isa/exception_code/Breakpoint.yaml +13 -0
  728. data/.data/spec/std/isa/exception_code/DoubleTrap.yaml +13 -0
  729. data/.data/spec/std/isa/exception_code/HardwareError.yaml +14 -0
  730. data/.data/spec/std/isa/exception_code/IllegalInstruction.yaml +13 -0
  731. data/.data/spec/std/isa/exception_code/InstructionAccessFault.yaml +13 -0
  732. data/.data/spec/std/isa/exception_code/InstructionAddressMisaligned.yaml +13 -0
  733. data/.data/spec/std/isa/exception_code/InstructionGuestPageFault.yaml +13 -0
  734. data/.data/spec/std/isa/exception_code/InstructionPageFault.yaml +13 -0
  735. data/.data/spec/std/isa/exception_code/LoadAccessFault.yaml +13 -0
  736. data/.data/spec/std/isa/exception_code/LoadAddressMisaligned.yaml +13 -0
  737. data/.data/spec/std/isa/exception_code/LoadGuestPageFault.yaml +13 -0
  738. data/.data/spec/std/isa/exception_code/LoadPageFault.yaml +13 -0
  739. data/.data/spec/std/isa/exception_code/Mcall.yaml +13 -0
  740. data/.data/spec/std/isa/exception_code/Scall.yaml +13 -0
  741. data/.data/spec/std/isa/exception_code/SoftwareCheck.yaml +14 -0
  742. data/.data/spec/std/isa/exception_code/StoreAmoAccessFault.yaml +13 -0
  743. data/.data/spec/std/isa/exception_code/StoreAmoAddressMisaligned.yaml +13 -0
  744. data/.data/spec/std/isa/exception_code/StoreAmoGuestPageFault.yaml +13 -0
  745. data/.data/spec/std/isa/exception_code/StoreAmoPageFault.yaml +13 -0
  746. data/.data/spec/std/isa/exception_code/Ucall.yaml +13 -0
  747. data/.data/spec/std/isa/exception_code/VScall.yaml +13 -0
  748. data/.data/spec/std/isa/exception_code/VirtualInstruction.yaml +13 -0
  749. data/.data/spec/std/isa/ext/A.yaml +79 -0
  750. data/.data/spec/std/isa/ext/B.yaml +41 -0
  751. data/.data/spec/std/isa/ext/C.yaml +318 -0
  752. data/.data/spec/std/isa/ext/D.yaml +109 -0
  753. data/.data/spec/std/isa/ext/F.yaml +243 -0
  754. data/.data/spec/std/isa/ext/H.yaml +126 -0
  755. data/.data/spec/std/isa/ext/I.yaml +18 -0
  756. data/.data/spec/std/isa/ext/M.yaml +26 -0
  757. data/.data/spec/std/isa/ext/Q.yaml +26 -0
  758. data/.data/spec/std/isa/ext/S.yaml +41 -0
  759. data/.data/spec/std/isa/ext/Sdext.yaml +16 -0
  760. data/.data/spec/std/isa/ext/Sdtrig.yaml +33 -0
  761. data/.data/spec/std/isa/ext/Sha.yaml +69 -0
  762. data/.data/spec/std/isa/ext/Shcounterenw.yaml +29 -0
  763. data/.data/spec/std/isa/ext/Shgatpa.yaml +42 -0
  764. data/.data/spec/std/isa/ext/Shtvala.yaml +29 -0
  765. data/.data/spec/std/isa/ext/Shvsatpa.yaml +19 -0
  766. data/.data/spec/std/isa/ext/Shvstvala.yaml +61 -0
  767. data/.data/spec/std/isa/ext/Shvstvecd.yaml +26 -0
  768. data/.data/spec/std/isa/ext/Sm.yaml +104 -0
  769. data/.data/spec/std/isa/ext/Smaia.yaml +16 -0
  770. data/.data/spec/std/isa/ext/Smcdeleg.yaml +40 -0
  771. data/.data/spec/std/isa/ext/Smcntrpmf.yaml +16 -0
  772. data/.data/spec/std/isa/ext/Smcsrind.yaml +45 -0
  773. data/.data/spec/std/isa/ext/Smctr.yaml +58 -0
  774. data/.data/spec/std/isa/ext/Smdbltrp.yaml +25 -0
  775. data/.data/spec/std/isa/ext/Smepmp.yaml +36 -0
  776. data/.data/spec/std/isa/ext/Smhpm.yaml +29 -0
  777. data/.data/spec/std/isa/ext/Smmpm.yaml +16 -0
  778. data/.data/spec/std/isa/ext/Smnpm.yaml +17 -0
  779. data/.data/spec/std/isa/ext/Smpmp.yaml +42 -0
  780. data/.data/spec/std/isa/ext/Smrnmi.yaml +24 -0
  781. data/.data/spec/std/isa/ext/Smstateen.yaml +28 -0
  782. data/.data/spec/std/isa/ext/Ssaia.yaml +20 -0
  783. data/.data/spec/std/isa/ext/Ssccfg.yaml +16 -0
  784. data/.data/spec/std/isa/ext/Ssccptr.yaml +26 -0
  785. data/.data/spec/std/isa/ext/Sscofpmf.yaml +19 -0
  786. data/.data/spec/std/isa/ext/Sscounterenw.yaml +30 -0
  787. data/.data/spec/std/isa/ext/Sscsrind.yaml +48 -0
  788. data/.data/spec/std/isa/ext/Ssctr.yaml +23 -0
  789. data/.data/spec/std/isa/ext/Ssdbltrp.yaml +25 -0
  790. data/.data/spec/std/isa/ext/Ssnpm.yaml +17 -0
  791. data/.data/spec/std/isa/ext/Sspm.yaml +23 -0
  792. data/.data/spec/std/isa/ext/Ssqosid.yaml +40 -0
  793. data/.data/spec/std/isa/ext/Ssstateen.yaml +31 -0
  794. data/.data/spec/std/isa/ext/Ssstrict.yaml +52 -0
  795. data/.data/spec/std/isa/ext/Sstc.yaml +16 -0
  796. data/.data/spec/std/isa/ext/Sstvala.yaml +57 -0
  797. data/.data/spec/std/isa/ext/Sstvecd.yaml +29 -0
  798. data/.data/spec/std/isa/ext/Sstvecv.yaml +30 -0
  799. data/.data/spec/std/isa/ext/Ssu32xl.yaml +22 -0
  800. data/.data/spec/std/isa/ext/Ssu64xl.yaml +23 -0
  801. data/.data/spec/std/isa/ext/Ssube.yaml +25 -0
  802. data/.data/spec/std/isa/ext/Supm.yaml +23 -0
  803. data/.data/spec/std/isa/ext/Sv32.yaml +34 -0
  804. data/.data/spec/std/isa/ext/Sv39.yaml +34 -0
  805. data/.data/spec/std/isa/ext/Sv48.yaml +34 -0
  806. data/.data/spec/std/isa/ext/Sv57.yaml +34 -0
  807. data/.data/spec/std/isa/ext/Svade.yaml +53 -0
  808. data/.data/spec/std/isa/ext/Svadu.yaml +136 -0
  809. data/.data/spec/std/isa/ext/Svbare.yaml +28 -0
  810. data/.data/spec/std/isa/ext/Svinval.yaml +86 -0
  811. data/.data/spec/std/isa/ext/Svnapot.yaml +183 -0
  812. data/.data/spec/std/isa/ext/Svpbmt.yaml +29 -0
  813. data/.data/spec/std/isa/ext/Svrsw60t59b.yaml +39 -0
  814. data/.data/spec/std/isa/ext/Svvptc.yaml +37 -0
  815. data/.data/spec/std/isa/ext/U.yaml +17 -0
  816. data/.data/spec/std/isa/ext/V.yaml +21 -0
  817. data/.data/spec/std/isa/ext/Xmock.yaml +30 -0
  818. data/.data/spec/std/isa/ext/Za128rs.yaml +30 -0
  819. data/.data/spec/std/isa/ext/Za64rs.yaml +32 -0
  820. data/.data/spec/std/isa/ext/Zaamo.yaml +136 -0
  821. data/.data/spec/std/isa/ext/Zabha.yaml +19 -0
  822. data/.data/spec/std/isa/ext/Zacas.yaml +19 -0
  823. data/.data/spec/std/isa/ext/Zalasr.yaml +16 -0
  824. data/.data/spec/std/isa/ext/Zalrsc.yaml +316 -0
  825. data/.data/spec/std/isa/ext/Zama16b.yaml +24 -0
  826. data/.data/spec/std/isa/ext/Zawrs.yaml +25 -0
  827. data/.data/spec/std/isa/ext/Zba.yaml +66 -0
  828. data/.data/spec/std/isa/ext/Zbb.yaml +54 -0
  829. data/.data/spec/std/isa/ext/Zbc.yaml +54 -0
  830. data/.data/spec/std/isa/ext/Zbkb.yaml +18 -0
  831. data/.data/spec/std/isa/ext/Zbkc.yaml +23 -0
  832. data/.data/spec/std/isa/ext/Zbkx.yaml +24 -0
  833. data/.data/spec/std/isa/ext/Zbs.yaml +59 -0
  834. data/.data/spec/std/isa/ext/Zca.yaml +46 -0
  835. data/.data/spec/std/isa/ext/Zcb.yaml +45 -0
  836. data/.data/spec/std/isa/ext/Zcd.yaml +47 -0
  837. data/.data/spec/std/isa/ext/Zce.yaml +99 -0
  838. data/.data/spec/std/isa/ext/Zcf.yaml +46 -0
  839. data/.data/spec/std/isa/ext/Zclsd.yaml +28 -0
  840. data/.data/spec/std/isa/ext/Zcmop.yaml +58 -0
  841. data/.data/spec/std/isa/ext/Zcmp.yaml +100 -0
  842. data/.data/spec/std/isa/ext/Zcmt.yaml +75 -0
  843. data/.data/spec/std/isa/ext/Zdinx.yaml +49 -0
  844. data/.data/spec/std/isa/ext/Zfa.yaml +24 -0
  845. data/.data/spec/std/isa/ext/Zfbfmin.yaml +27 -0
  846. data/.data/spec/std/isa/ext/Zfh.yaml +24 -0
  847. data/.data/spec/std/isa/ext/Zfhmin.yaml +55 -0
  848. data/.data/spec/std/isa/ext/Zfinx.yaml +56 -0
  849. data/.data/spec/std/isa/ext/Zhinx.yaml +26 -0
  850. data/.data/spec/std/isa/ext/Zhinxmin.yaml +29 -0
  851. data/.data/spec/std/isa/ext/Zic64b.yaml +31 -0
  852. data/.data/spec/std/isa/ext/Zicbom.yaml +15 -0
  853. data/.data/spec/std/isa/ext/Zicbop.yaml +15 -0
  854. data/.data/spec/std/isa/ext/Zicboz.yaml +15 -0
  855. data/.data/spec/std/isa/ext/Ziccamoa.yaml +19 -0
  856. data/.data/spec/std/isa/ext/Ziccamoc.yaml +23 -0
  857. data/.data/spec/std/isa/ext/Ziccif.yaml +21 -0
  858. data/.data/spec/std/isa/ext/Zicclsm.yaml +31 -0
  859. data/.data/spec/std/isa/ext/Ziccrse.yaml +19 -0
  860. data/.data/spec/std/isa/ext/Zicfilp.yaml +16 -0
  861. data/.data/spec/std/isa/ext/Zicfiss.yaml +16 -0
  862. data/.data/spec/std/isa/ext/Zicntr.yaml +20 -0
  863. data/.data/spec/std/isa/ext/Zicond.yaml +24 -0
  864. data/.data/spec/std/isa/ext/Zicsr.yaml +15 -0
  865. data/.data/spec/std/isa/ext/Zifencei.yaml +75 -0
  866. data/.data/spec/std/isa/ext/Zihintntl.yaml +201 -0
  867. data/.data/spec/std/isa/ext/Zihintpause.yaml +76 -0
  868. data/.data/spec/std/isa/ext/Zihpm.yaml +18 -0
  869. data/.data/spec/std/isa/ext/Zilsd.yaml +20 -0
  870. data/.data/spec/std/isa/ext/Zimop.yaml +70 -0
  871. data/.data/spec/std/isa/ext/Zk.yaml +42 -0
  872. data/.data/spec/std/isa/ext/Zkn.yaml +57 -0
  873. data/.data/spec/std/isa/ext/Zknd.yaml +19 -0
  874. data/.data/spec/std/isa/ext/Zkne.yaml +19 -0
  875. data/.data/spec/std/isa/ext/Zknh.yaml +19 -0
  876. data/.data/spec/std/isa/ext/Zkr.yaml +20 -0
  877. data/.data/spec/std/isa/ext/Zks.yaml +53 -0
  878. data/.data/spec/std/isa/ext/Zksed.yaml +20 -0
  879. data/.data/spec/std/isa/ext/Zksh.yaml +19 -0
  880. data/.data/spec/std/isa/ext/Zkt.yaml +365 -0
  881. data/.data/spec/std/isa/ext/Zmmul.yaml +28 -0
  882. data/.data/spec/std/isa/ext/Ztso.yaml +23 -0
  883. data/.data/spec/std/isa/ext/Zvbb.yaml +20 -0
  884. data/.data/spec/std/isa/ext/Zvbc.yaml +19 -0
  885. data/.data/spec/std/isa/ext/Zve32f.yaml +34 -0
  886. data/.data/spec/std/isa/ext/Zve32x.yaml +38 -0
  887. data/.data/spec/std/isa/ext/Zve64d.yaml +35 -0
  888. data/.data/spec/std/isa/ext/Zve64f.yaml +33 -0
  889. data/.data/spec/std/isa/ext/Zve64x.yaml +35 -0
  890. data/.data/spec/std/isa/ext/Zvfbfmin.yaml +23 -0
  891. data/.data/spec/std/isa/ext/Zvfbfwma.yaml +23 -0
  892. data/.data/spec/std/isa/ext/Zvfh.yaml +43 -0
  893. data/.data/spec/std/isa/ext/Zvfhmin.yaml +26 -0
  894. data/.data/spec/std/isa/ext/Zvkb.yaml +16 -0
  895. data/.data/spec/std/isa/ext/Zvkg.yaml +26 -0
  896. data/.data/spec/std/isa/ext/Zvkn.yaml +32 -0
  897. data/.data/spec/std/isa/ext/Zvknc.yaml +27 -0
  898. data/.data/spec/std/isa/ext/Zvkned.yaml +22 -0
  899. data/.data/spec/std/isa/ext/Zvkng.yaml +27 -0
  900. data/.data/spec/std/isa/ext/Zvknha.yaml +17 -0
  901. data/.data/spec/std/isa/ext/Zvknhb.yaml +21 -0
  902. data/.data/spec/std/isa/ext/Zvks.yaml +32 -0
  903. data/.data/spec/std/isa/ext/Zvksc.yaml +27 -0
  904. data/.data/spec/std/isa/ext/Zvksed.yaml +24 -0
  905. data/.data/spec/std/isa/ext/Zvksg.yaml +27 -0
  906. data/.data/spec/std/isa/ext/Zvksh.yaml +20 -0
  907. data/.data/spec/std/isa/ext/Zvkt.yaml +28 -0
  908. data/.data/spec/std/isa/ext/Zvl1024b.yaml +30 -0
  909. data/.data/spec/std/isa/ext/Zvl128b.yaml +31 -0
  910. data/.data/spec/std/isa/ext/Zvl256b.yaml +30 -0
  911. data/.data/spec/std/isa/ext/Zvl32b.yaml +28 -0
  912. data/.data/spec/std/isa/ext/Zvl512b.yaml +30 -0
  913. data/.data/spec/std/isa/ext/Zvl64b.yaml +31 -0
  914. data/.data/spec/std/isa/inst/B/andn.yaml +69 -0
  915. data/.data/spec/std/isa/inst/B/clmul.yaml +66 -0
  916. data/.data/spec/std/isa/inst/B/clmulh.yaml +66 -0
  917. data/.data/spec/std/isa/inst/B/orn.yaml +68 -0
  918. data/.data/spec/std/isa/inst/B/rev8.yaml +77 -0
  919. data/.data/spec/std/isa/inst/B/rol.yaml +70 -0
  920. data/.data/spec/std/isa/inst/B/rolw.yaml +65 -0
  921. data/.data/spec/std/isa/inst/B/ror.yaml +70 -0
  922. data/.data/spec/std/isa/inst/B/rori.yaml +66 -0
  923. data/.data/spec/std/isa/inst/B/roriw.yaml +58 -0
  924. data/.data/spec/std/isa/inst/B/rorw.yaml +65 -0
  925. data/.data/spec/std/isa/inst/B/xnor.yaml +68 -0
  926. data/.data/spec/std/isa/inst/C/c.add.yaml +52 -0
  927. data/.data/spec/std/isa/inst/C/c.addi.yaml +38 -0
  928. data/.data/spec/std/isa/inst/C/c.addi16sp.yaml +36 -0
  929. data/.data/spec/std/isa/inst/C/c.addi4spn.yaml +38 -0
  930. data/.data/spec/std/isa/inst/C/c.addiw.yaml +39 -0
  931. data/.data/spec/std/isa/inst/C/c.addw.yaml +55 -0
  932. data/.data/spec/std/isa/inst/C/c.and.yaml +64 -0
  933. data/.data/spec/std/isa/inst/C/c.andi.yaml +53 -0
  934. data/.data/spec/std/isa/inst/C/c.beqz.yaml +75 -0
  935. data/.data/spec/std/isa/inst/C/c.bnez.yaml +75 -0
  936. data/.data/spec/std/isa/inst/C/c.ebreak.yaml +53 -0
  937. data/.data/spec/std/isa/inst/C/c.j.yaml +34 -0
  938. data/.data/spec/std/isa/inst/C/c.jal.yaml +39 -0
  939. data/.data/spec/std/isa/inst/C/c.jalr.yaml +37 -0
  940. data/.data/spec/std/isa/inst/C/c.jr.yaml +33 -0
  941. data/.data/spec/std/isa/inst/C/c.ld.yaml +101 -0
  942. data/.data/spec/std/isa/inst/C/c.ldsp.yaml +64 -0
  943. data/.data/spec/std/isa/inst/C/c.li.yaml +36 -0
  944. data/.data/spec/std/isa/inst/C/c.lui.yaml +38 -0
  945. data/.data/spec/std/isa/inst/C/c.lw.yaml +74 -0
  946. data/.data/spec/std/isa/inst/C/c.lwsp.yaml +41 -0
  947. data/.data/spec/std/isa/inst/C/c.mv.yaml +48 -0
  948. data/.data/spec/std/isa/inst/C/c.nop.yaml +26 -0
  949. data/.data/spec/std/isa/inst/C/c.or.yaml +64 -0
  950. data/.data/spec/std/isa/inst/C/c.sd.yaml +67 -0
  951. data/.data/spec/std/isa/inst/C/c.sdsp.yaml +63 -0
  952. data/.data/spec/std/isa/inst/C/c.slli.yaml +65 -0
  953. data/.data/spec/std/isa/inst/C/c.srai.yaml +66 -0
  954. data/.data/spec/std/isa/inst/C/c.srli.yaml +66 -0
  955. data/.data/spec/std/isa/inst/C/c.sub.yaml +64 -0
  956. data/.data/spec/std/isa/inst/C/c.subw.yaml +55 -0
  957. data/.data/spec/std/isa/inst/C/c.sw.yaml +41 -0
  958. data/.data/spec/std/isa/inst/C/c.swsp.yaml +39 -0
  959. data/.data/spec/std/isa/inst/C/c.xor.yaml +64 -0
  960. data/.data/spec/std/isa/inst/D/fadd.d.yaml +36 -0
  961. data/.data/spec/std/isa/inst/D/fclass.d.yaml +53 -0
  962. data/.data/spec/std/isa/inst/D/fcvt.d.l.yaml +36 -0
  963. data/.data/spec/std/isa/inst/D/fcvt.d.lu.yaml +36 -0
  964. data/.data/spec/std/isa/inst/D/fcvt.d.s.yaml +36 -0
  965. data/.data/spec/std/isa/inst/D/fcvt.d.w.yaml +35 -0
  966. data/.data/spec/std/isa/inst/D/fcvt.d.wu.yaml +35 -0
  967. data/.data/spec/std/isa/inst/D/fcvt.l.d.yaml +36 -0
  968. data/.data/spec/std/isa/inst/D/fcvt.lu.d.yaml +36 -0
  969. data/.data/spec/std/isa/inst/D/fcvt.s.d.yaml +36 -0
  970. data/.data/spec/std/isa/inst/D/fcvt.w.d.yaml +34 -0
  971. data/.data/spec/std/isa/inst/D/fcvt.wu.d.yaml +34 -0
  972. data/.data/spec/std/isa/inst/D/fcvtmod.w.d.yaml +42 -0
  973. data/.data/spec/std/isa/inst/D/fdiv.d.yaml +36 -0
  974. data/.data/spec/std/isa/inst/D/feq.d.yaml +34 -0
  975. data/.data/spec/std/isa/inst/D/fld.yaml +34 -0
  976. data/.data/spec/std/isa/inst/D/fle.d.yaml +34 -0
  977. data/.data/spec/std/isa/inst/D/fleq.d.yaml +34 -0
  978. data/.data/spec/std/isa/inst/D/fli.d.yaml +32 -0
  979. data/.data/spec/std/isa/inst/D/flt.d.yaml +34 -0
  980. data/.data/spec/std/isa/inst/D/fltq.d.yaml +34 -0
  981. data/.data/spec/std/isa/inst/D/fmadd.d.yaml +37 -0
  982. data/.data/spec/std/isa/inst/D/fmax.d.yaml +36 -0
  983. data/.data/spec/std/isa/inst/D/fmaxm.d.yaml +34 -0
  984. data/.data/spec/std/isa/inst/D/fmin.d.yaml +36 -0
  985. data/.data/spec/std/isa/inst/D/fminm.d.yaml +34 -0
  986. data/.data/spec/std/isa/inst/D/fmsub.d.yaml +37 -0
  987. data/.data/spec/std/isa/inst/D/fmul.d.yaml +37 -0
  988. data/.data/spec/std/isa/inst/D/fmv.d.x.yaml +32 -0
  989. data/.data/spec/std/isa/inst/D/fmv.x.d.yaml +32 -0
  990. data/.data/spec/std/isa/inst/D/fmvh.x.d.yaml +35 -0
  991. data/.data/spec/std/isa/inst/D/fmvp.d.x.yaml +37 -0
  992. data/.data/spec/std/isa/inst/D/fnmadd.d.yaml +38 -0
  993. data/.data/spec/std/isa/inst/D/fnmsub.d.yaml +38 -0
  994. data/.data/spec/std/isa/inst/D/fround.d.yaml +38 -0
  995. data/.data/spec/std/isa/inst/D/froundnx.d.yaml +34 -0
  996. data/.data/spec/std/isa/inst/D/fsd.yaml +33 -0
  997. data/.data/spec/std/isa/inst/D/fsgnj.d.yaml +36 -0
  998. data/.data/spec/std/isa/inst/D/fsgnjn.d.yaml +36 -0
  999. data/.data/spec/std/isa/inst/D/fsgnjx.d.yaml +36 -0
  1000. data/.data/spec/std/isa/inst/D/fsqrt.d.yaml +35 -0
  1001. data/.data/spec/std/isa/inst/D/fsub.d.yaml +36 -0
  1002. data/.data/spec/std/isa/inst/F/fadd.s.yaml +63 -0
  1003. data/.data/spec/std/isa/inst/F/fclass.s.yaml +90 -0
  1004. data/.data/spec/std/isa/inst/F/fcvt.l.s.yaml +56 -0
  1005. data/.data/spec/std/isa/inst/F/fcvt.lu.s.yaml +56 -0
  1006. data/.data/spec/std/isa/inst/F/fcvt.s.l.yaml +56 -0
  1007. data/.data/spec/std/isa/inst/F/fcvt.s.lu.yaml +55 -0
  1008. data/.data/spec/std/isa/inst/F/fcvt.s.w.yaml +67 -0
  1009. data/.data/spec/std/isa/inst/F/fcvt.s.wu.yaml +66 -0
  1010. data/.data/spec/std/isa/inst/F/fcvt.w.s.yaml +85 -0
  1011. data/.data/spec/std/isa/inst/F/fcvt.wu.s.yaml +83 -0
  1012. data/.data/spec/std/isa/inst/F/fdiv.s.yaml +60 -0
  1013. data/.data/spec/std/isa/inst/F/feq.s.yaml +68 -0
  1014. data/.data/spec/std/isa/inst/F/fle.s.yaml +68 -0
  1015. data/.data/spec/std/isa/inst/F/fleq.s.yaml +50 -0
  1016. data/.data/spec/std/isa/inst/F/flt.s.yaml +70 -0
  1017. data/.data/spec/std/isa/inst/F/fltq.s.yaml +50 -0
  1018. data/.data/spec/std/isa/inst/F/flw.yaml +80 -0
  1019. data/.data/spec/std/isa/inst/F/fmadd.s.yaml +63 -0
  1020. data/.data/spec/std/isa/inst/F/fmax.s.yaml +59 -0
  1021. data/.data/spec/std/isa/inst/F/fmin.s.yaml +59 -0
  1022. data/.data/spec/std/isa/inst/F/fmsub.s.yaml +63 -0
  1023. data/.data/spec/std/isa/inst/F/fmul.s.yaml +60 -0
  1024. data/.data/spec/std/isa/inst/F/fmv.w.x.yaml +55 -0
  1025. data/.data/spec/std/isa/inst/F/fmv.x.w.yaml +48 -0
  1026. data/.data/spec/std/isa/inst/F/fnmadd.s.yaml +64 -0
  1027. data/.data/spec/std/isa/inst/F/fnmsub.s.yaml +64 -0
  1028. data/.data/spec/std/isa/inst/F/fsgnj.s.yaml +68 -0
  1029. data/.data/spec/std/isa/inst/F/fsgnjn.s.yaml +67 -0
  1030. data/.data/spec/std/isa/inst/F/fsgnjx.s.yaml +66 -0
  1031. data/.data/spec/std/isa/inst/F/fsqrt.s.yaml +53 -0
  1032. data/.data/spec/std/isa/inst/F/fsub.s.yaml +61 -0
  1033. data/.data/spec/std/isa/inst/F/fsw.yaml +82 -0
  1034. data/.data/spec/std/isa/inst/H/hfence.gvma.yaml +33 -0
  1035. data/.data/spec/std/isa/inst/H/hfence.vvma.yaml +34 -0
  1036. data/.data/spec/std/isa/inst/H/hlv.b.yaml +30 -0
  1037. data/.data/spec/std/isa/inst/H/hlv.bu.yaml +30 -0
  1038. data/.data/spec/std/isa/inst/H/hlv.d.yaml +32 -0
  1039. data/.data/spec/std/isa/inst/H/hlv.h.yaml +30 -0
  1040. data/.data/spec/std/isa/inst/H/hlv.hu.yaml +30 -0
  1041. data/.data/spec/std/isa/inst/H/hlv.w.yaml +30 -0
  1042. data/.data/spec/std/isa/inst/H/hlv.wu.yaml +32 -0
  1043. data/.data/spec/std/isa/inst/H/hlvx.hu.yaml +32 -0
  1044. data/.data/spec/std/isa/inst/H/hlvx.wu.yaml +32 -0
  1045. data/.data/spec/std/isa/inst/H/hsv.b.yaml +30 -0
  1046. data/.data/spec/std/isa/inst/H/hsv.d.yaml +32 -0
  1047. data/.data/spec/std/isa/inst/H/hsv.h.yaml +30 -0
  1048. data/.data/spec/std/isa/inst/H/hsv.w.yaml +30 -0
  1049. data/.data/spec/std/isa/inst/I/add.yaml +68 -0
  1050. data/.data/spec/std/isa/inst/I/addi.yaml +58 -0
  1051. data/.data/spec/std/isa/inst/I/addiw.yaml +50 -0
  1052. data/.data/spec/std/isa/inst/I/addw.yaml +57 -0
  1053. data/.data/spec/std/isa/inst/I/and.yaml +61 -0
  1054. data/.data/spec/std/isa/inst/I/andi.yaml +54 -0
  1055. data/.data/spec/std/isa/inst/I/auipc.yaml +47 -0
  1056. data/.data/spec/std/isa/inst/I/beq.yaml +82 -0
  1057. data/.data/spec/std/isa/inst/I/bge.yaml +84 -0
  1058. data/.data/spec/std/isa/inst/I/bgeu.yaml +79 -0
  1059. data/.data/spec/std/isa/inst/I/blt.yaml +84 -0
  1060. data/.data/spec/std/isa/inst/I/bltu.yaml +79 -0
  1061. data/.data/spec/std/isa/inst/I/bne.yaml +82 -0
  1062. data/.data/spec/std/isa/inst/I/ebreak.yaml +50 -0
  1063. data/.data/spec/std/isa/inst/I/ecall.yaml +81 -0
  1064. data/.data/spec/std/isa/inst/I/fence.tso.yaml +52 -0
  1065. data/.data/spec/std/isa/inst/I/fence.yaml +224 -0
  1066. data/.data/spec/std/isa/inst/I/jal.yaml +69 -0
  1067. data/.data/spec/std/isa/inst/I/jalr.yaml +79 -0
  1068. data/.data/spec/std/isa/inst/I/lb.yaml +68 -0
  1069. data/.data/spec/std/isa/inst/I/lbu.yaml +68 -0
  1070. data/.data/spec/std/isa/inst/I/ld.yaml +98 -0
  1071. data/.data/spec/std/isa/inst/I/lh.yaml +68 -0
  1072. data/.data/spec/std/isa/inst/I/lhu.yaml +68 -0
  1073. data/.data/spec/std/isa/inst/I/lui.yaml +45 -0
  1074. data/.data/spec/std/isa/inst/I/lw.yaml +68 -0
  1075. data/.data/spec/std/isa/inst/I/lwu.yaml +70 -0
  1076. data/.data/spec/std/isa/inst/I/mret.yaml +61 -0
  1077. data/.data/spec/std/isa/inst/I/or.yaml +61 -0
  1078. data/.data/spec/std/isa/inst/I/ori.yaml +56 -0
  1079. data/.data/spec/std/isa/inst/I/sb.yaml +82 -0
  1080. data/.data/spec/std/isa/inst/I/sd.yaml +110 -0
  1081. data/.data/spec/std/isa/inst/I/sh.yaml +82 -0
  1082. data/.data/spec/std/isa/inst/I/sll.yaml +67 -0
  1083. data/.data/spec/std/isa/inst/I/slli.yaml +66 -0
  1084. data/.data/spec/std/isa/inst/I/slliw.yaml +53 -0
  1085. data/.data/spec/std/isa/inst/I/sllw.yaml +53 -0
  1086. data/.data/spec/std/isa/inst/I/slt.yaml +72 -0
  1087. data/.data/spec/std/isa/inst/I/slti.yaml +54 -0
  1088. data/.data/spec/std/isa/inst/I/sltiu.yaml +62 -0
  1089. data/.data/spec/std/isa/inst/I/sltu.yaml +67 -0
  1090. data/.data/spec/std/isa/inst/I/sra.yaml +67 -0
  1091. data/.data/spec/std/isa/inst/I/srai.yaml +68 -0
  1092. data/.data/spec/std/isa/inst/I/sraiw.yaml +54 -0
  1093. data/.data/spec/std/isa/inst/I/sraw.yaml +56 -0
  1094. data/.data/spec/std/isa/inst/I/srl.yaml +67 -0
  1095. data/.data/spec/std/isa/inst/I/srli.yaml +65 -0
  1096. data/.data/spec/std/isa/inst/I/srliw.yaml +55 -0
  1097. data/.data/spec/std/isa/inst/I/srlw.yaml +53 -0
  1098. data/.data/spec/std/isa/inst/I/sub.yaml +67 -0
  1099. data/.data/spec/std/isa/inst/I/subw.yaml +60 -0
  1100. data/.data/spec/std/isa/inst/I/sw.yaml +82 -0
  1101. data/.data/spec/std/isa/inst/I/wfi.yaml +131 -0
  1102. data/.data/spec/std/isa/inst/I/xor.yaml +61 -0
  1103. data/.data/spec/std/isa/inst/I/xori.yaml +56 -0
  1104. data/.data/spec/std/isa/inst/M/div.yaml +82 -0
  1105. data/.data/spec/std/isa/inst/M/divu.yaml +71 -0
  1106. data/.data/spec/std/isa/inst/M/divuw.yaml +78 -0
  1107. data/.data/spec/std/isa/inst/M/divw.yaml +85 -0
  1108. data/.data/spec/std/isa/inst/M/mul.yaml +95 -0
  1109. data/.data/spec/std/isa/inst/M/mulh.yaml +80 -0
  1110. data/.data/spec/std/isa/inst/M/mulhsu.yaml +77 -0
  1111. data/.data/spec/std/isa/inst/M/mulhu.yaml +76 -0
  1112. data/.data/spec/std/isa/inst/M/mulw.yaml +79 -0
  1113. data/.data/spec/std/isa/inst/M/rem.yaml +76 -0
  1114. data/.data/spec/std/isa/inst/M/remu.yaml +66 -0
  1115. data/.data/spec/std/isa/inst/M/remuw.yaml +79 -0
  1116. data/.data/spec/std/isa/inst/M/remw.yaml +84 -0
  1117. data/.data/spec/std/isa/inst/Q/fadd.q.yaml +34 -0
  1118. data/.data/spec/std/isa/inst/Q/fclass.q.yaml +53 -0
  1119. data/.data/spec/std/isa/inst/Q/fcvt.d.q.yaml +31 -0
  1120. data/.data/spec/std/isa/inst/Q/fcvt.h.q.yaml +33 -0
  1121. data/.data/spec/std/isa/inst/Q/fcvt.l.q.yaml +33 -0
  1122. data/.data/spec/std/isa/inst/Q/fcvt.lu.q.yaml +33 -0
  1123. data/.data/spec/std/isa/inst/Q/fcvt.q.d.yaml +31 -0
  1124. data/.data/spec/std/isa/inst/Q/fcvt.q.h.yaml +33 -0
  1125. data/.data/spec/std/isa/inst/Q/fcvt.q.l.yaml +33 -0
  1126. data/.data/spec/std/isa/inst/Q/fcvt.q.lu.yaml +33 -0
  1127. data/.data/spec/std/isa/inst/Q/fcvt.q.s.yaml +31 -0
  1128. data/.data/spec/std/isa/inst/Q/fcvt.q.w.yaml +31 -0
  1129. data/.data/spec/std/isa/inst/Q/fcvt.q.wu.yaml +31 -0
  1130. data/.data/spec/std/isa/inst/Q/fcvt.s.q.yaml +31 -0
  1131. data/.data/spec/std/isa/inst/Q/fcvt.w.q.yaml +31 -0
  1132. data/.data/spec/std/isa/inst/Q/fcvt.wu.q.yaml +31 -0
  1133. data/.data/spec/std/isa/inst/Q/fdiv.q.yaml +40 -0
  1134. data/.data/spec/std/isa/inst/Q/feq.q.yaml +37 -0
  1135. data/.data/spec/std/isa/inst/Q/fle.q.yaml +37 -0
  1136. data/.data/spec/std/isa/inst/Q/fleq.q.yaml +38 -0
  1137. data/.data/spec/std/isa/inst/Q/fli.q.yaml +33 -0
  1138. data/.data/spec/std/isa/inst/Q/flq.yaml +37 -0
  1139. data/.data/spec/std/isa/inst/Q/flt.q.yaml +38 -0
  1140. data/.data/spec/std/isa/inst/Q/fltq.q.yaml +38 -0
  1141. data/.data/spec/std/isa/inst/Q/fmadd.q.yaml +40 -0
  1142. data/.data/spec/std/isa/inst/Q/fmax.q.yaml +35 -0
  1143. data/.data/spec/std/isa/inst/Q/fmaxm.q.yaml +38 -0
  1144. data/.data/spec/std/isa/inst/Q/fmin.q.yaml +35 -0
  1145. data/.data/spec/std/isa/inst/Q/fminm.q.yaml +38 -0
  1146. data/.data/spec/std/isa/inst/Q/fmsub.q.yaml +36 -0
  1147. data/.data/spec/std/isa/inst/Q/fmul.q.yaml +33 -0
  1148. data/.data/spec/std/isa/inst/Q/fmvh.x.q.yaml +37 -0
  1149. data/.data/spec/std/isa/inst/Q/fmvp.q.x.yaml +39 -0
  1150. data/.data/spec/std/isa/inst/Q/fnmadd.q.yaml +37 -0
  1151. data/.data/spec/std/isa/inst/Q/fnmsub.q.yaml +37 -0
  1152. data/.data/spec/std/isa/inst/Q/fround.q.yaml +38 -0
  1153. data/.data/spec/std/isa/inst/Q/froundnx.q.yaml +34 -0
  1154. data/.data/spec/std/isa/inst/Q/fsgnj.q.yaml +36 -0
  1155. data/.data/spec/std/isa/inst/Q/fsgnjn.q.yaml +36 -0
  1156. data/.data/spec/std/isa/inst/Q/fsgnjx.q.yaml +36 -0
  1157. data/.data/spec/std/isa/inst/Q/fsq.yaml +36 -0
  1158. data/.data/spec/std/isa/inst/Q/fsqrt.q.yaml +31 -0
  1159. data/.data/spec/std/isa/inst/Q/fsub.q.yaml +34 -0
  1160. data/.data/spec/std/isa/inst/README.md +78 -0
  1161. data/.data/spec/std/isa/inst/S/sfence.vma.yaml +331 -0
  1162. data/.data/spec/std/isa/inst/S/sret.yaml +166 -0
  1163. data/.data/spec/std/isa/inst/Sdext/dret.yaml +25 -0
  1164. data/.data/spec/std/isa/inst/Smdbltrp/sctrclr.yaml +47 -0
  1165. data/.data/spec/std/isa/inst/Smrnmi/mnret.yaml +51 -0
  1166. data/.data/spec/std/isa/inst/Svinval/hinval.gvma.yaml +91 -0
  1167. data/.data/spec/std/isa/inst/Svinval/hinval.vvma.yaml +91 -0
  1168. data/.data/spec/std/isa/inst/Svinval/sfence.inval.ir.yaml +44 -0
  1169. data/.data/spec/std/isa/inst/Svinval/sfence.w.inval.yaml +45 -0
  1170. data/.data/spec/std/isa/inst/Svinval/sinval.vma.yaml +102 -0
  1171. data/.data/spec/std/isa/inst/V/vaadd.vv.yaml +116 -0
  1172. data/.data/spec/std/isa/inst/V/vaadd.vx.yaml +125 -0
  1173. data/.data/spec/std/isa/inst/V/vaaddu.vv.yaml +116 -0
  1174. data/.data/spec/std/isa/inst/V/vaaddu.vx.yaml +125 -0
  1175. data/.data/spec/std/isa/inst/V/vadc.vim.yaml +75 -0
  1176. data/.data/spec/std/isa/inst/V/vadc.vvm.yaml +76 -0
  1177. data/.data/spec/std/isa/inst/V/vadc.vxm.yaml +76 -0
  1178. data/.data/spec/std/isa/inst/V/vadd.vi.yaml +101 -0
  1179. data/.data/spec/std/isa/inst/V/vadd.vv.yaml +158 -0
  1180. data/.data/spec/std/isa/inst/V/vadd.vx.yaml +117 -0
  1181. data/.data/spec/std/isa/inst/V/vand.vi.yaml +101 -0
  1182. data/.data/spec/std/isa/inst/V/vand.vv.yaml +134 -0
  1183. data/.data/spec/std/isa/inst/V/vand.vx.yaml +117 -0
  1184. data/.data/spec/std/isa/inst/V/vasub.vv.yaml +116 -0
  1185. data/.data/spec/std/isa/inst/V/vasub.vx.yaml +125 -0
  1186. data/.data/spec/std/isa/inst/V/vasubu.vv.yaml +116 -0
  1187. data/.data/spec/std/isa/inst/V/vasubu.vx.yaml +125 -0
  1188. data/.data/spec/std/isa/inst/V/vcompress.vm.yaml +85 -0
  1189. data/.data/spec/std/isa/inst/V/vcpop.m.yaml +31 -0
  1190. data/.data/spec/std/isa/inst/V/vdiv.vv.yaml +116 -0
  1191. data/.data/spec/std/isa/inst/V/vdiv.vx.yaml +125 -0
  1192. data/.data/spec/std/isa/inst/V/vdivu.vv.yaml +116 -0
  1193. data/.data/spec/std/isa/inst/V/vdivu.vx.yaml +125 -0
  1194. data/.data/spec/std/isa/inst/V/vfadd.vf.yaml +92 -0
  1195. data/.data/spec/std/isa/inst/V/vfadd.vv.yaml +81 -0
  1196. data/.data/spec/std/isa/inst/V/vfclass.v.yaml +97 -0
  1197. data/.data/spec/std/isa/inst/V/vfcvt.f.x.v.yaml +122 -0
  1198. data/.data/spec/std/isa/inst/V/vfcvt.f.xu.v.yaml +122 -0
  1199. data/.data/spec/std/isa/inst/V/vfcvt.rtz.x.f.v.yaml +122 -0
  1200. data/.data/spec/std/isa/inst/V/vfcvt.rtz.xu.f.v.yaml +122 -0
  1201. data/.data/spec/std/isa/inst/V/vfcvt.x.f.v.yaml +122 -0
  1202. data/.data/spec/std/isa/inst/V/vfcvt.xu.f.v.yaml +122 -0
  1203. data/.data/spec/std/isa/inst/V/vfdiv.vf.yaml +92 -0
  1204. data/.data/spec/std/isa/inst/V/vfdiv.vv.yaml +81 -0
  1205. data/.data/spec/std/isa/inst/V/vfirst.m.yaml +66 -0
  1206. data/.data/spec/std/isa/inst/V/vfmacc.vf.yaml +80 -0
  1207. data/.data/spec/std/isa/inst/V/vfmacc.vv.yaml +80 -0
  1208. data/.data/spec/std/isa/inst/V/vfmadd.vf.yaml +80 -0
  1209. data/.data/spec/std/isa/inst/V/vfmadd.vv.yaml +80 -0
  1210. data/.data/spec/std/isa/inst/V/vfmax.vf.yaml +92 -0
  1211. data/.data/spec/std/isa/inst/V/vfmax.vv.yaml +81 -0
  1212. data/.data/spec/std/isa/inst/V/vfmerge.vfm.yaml +78 -0
  1213. data/.data/spec/std/isa/inst/V/vfmin.vf.yaml +92 -0
  1214. data/.data/spec/std/isa/inst/V/vfmin.vv.yaml +81 -0
  1215. data/.data/spec/std/isa/inst/V/vfmsac.vf.yaml +80 -0
  1216. data/.data/spec/std/isa/inst/V/vfmsac.vv.yaml +80 -0
  1217. data/.data/spec/std/isa/inst/V/vfmsub.vf.yaml +80 -0
  1218. data/.data/spec/std/isa/inst/V/vfmsub.vv.yaml +80 -0
  1219. data/.data/spec/std/isa/inst/V/vfmul.vf.yaml +92 -0
  1220. data/.data/spec/std/isa/inst/V/vfmul.vv.yaml +81 -0
  1221. data/.data/spec/std/isa/inst/V/vfmv.f.s.yaml +58 -0
  1222. data/.data/spec/std/isa/inst/V/vfmv.s.f.yaml +71 -0
  1223. data/.data/spec/std/isa/inst/V/vfmv.v.f.yaml +64 -0
  1224. data/.data/spec/std/isa/inst/V/vfncvt.f.f.w.yaml +145 -0
  1225. data/.data/spec/std/isa/inst/V/vfncvt.f.x.w.yaml +145 -0
  1226. data/.data/spec/std/isa/inst/V/vfncvt.f.xu.w.yaml +145 -0
  1227. data/.data/spec/std/isa/inst/V/vfncvt.rod.f.f.w.yaml +145 -0
  1228. data/.data/spec/std/isa/inst/V/vfncvt.rtz.x.f.w.yaml +145 -0
  1229. data/.data/spec/std/isa/inst/V/vfncvt.rtz.xu.f.w.yaml +145 -0
  1230. data/.data/spec/std/isa/inst/V/vfncvt.x.f.w.yaml +145 -0
  1231. data/.data/spec/std/isa/inst/V/vfncvt.xu.f.w.yaml +145 -0
  1232. data/.data/spec/std/isa/inst/V/vfnmacc.vf.yaml +80 -0
  1233. data/.data/spec/std/isa/inst/V/vfnmacc.vv.yaml +80 -0
  1234. data/.data/spec/std/isa/inst/V/vfnmadd.vf.yaml +80 -0
  1235. data/.data/spec/std/isa/inst/V/vfnmadd.vv.yaml +80 -0
  1236. data/.data/spec/std/isa/inst/V/vfnmsac.vf.yaml +80 -0
  1237. data/.data/spec/std/isa/inst/V/vfnmsac.vv.yaml +80 -0
  1238. data/.data/spec/std/isa/inst/V/vfnmsub.vf.yaml +80 -0
  1239. data/.data/spec/std/isa/inst/V/vfnmsub.vv.yaml +80 -0
  1240. data/.data/spec/std/isa/inst/V/vfrdiv.vf.yaml +92 -0
  1241. data/.data/spec/std/isa/inst/V/vfrec7.v.yaml +97 -0
  1242. data/.data/spec/std/isa/inst/V/vfredmax.vs.yaml +50 -0
  1243. data/.data/spec/std/isa/inst/V/vfredmin.vs.yaml +50 -0
  1244. data/.data/spec/std/isa/inst/V/vfredosum.vs.yaml +50 -0
  1245. data/.data/spec/std/isa/inst/V/vfredusum.vs.yaml +50 -0
  1246. data/.data/spec/std/isa/inst/V/vfrsqrt7.v.yaml +97 -0
  1247. data/.data/spec/std/isa/inst/V/vfrsub.vf.yaml +92 -0
  1248. data/.data/spec/std/isa/inst/V/vfsgnj.vf.yaml +92 -0
  1249. data/.data/spec/std/isa/inst/V/vfsgnj.vv.yaml +81 -0
  1250. data/.data/spec/std/isa/inst/V/vfsgnjn.vf.yaml +92 -0
  1251. data/.data/spec/std/isa/inst/V/vfsgnjn.vv.yaml +81 -0
  1252. data/.data/spec/std/isa/inst/V/vfsgnjx.vf.yaml +92 -0
  1253. data/.data/spec/std/isa/inst/V/vfsgnjx.vv.yaml +81 -0
  1254. data/.data/spec/std/isa/inst/V/vfslide1down.vf.yaml +92 -0
  1255. data/.data/spec/std/isa/inst/V/vfslide1up.vf.yaml +92 -0
  1256. data/.data/spec/std/isa/inst/V/vfsqrt.v.yaml +97 -0
  1257. data/.data/spec/std/isa/inst/V/vfsub.vf.yaml +92 -0
  1258. data/.data/spec/std/isa/inst/V/vfsub.vv.yaml +81 -0
  1259. data/.data/spec/std/isa/inst/V/vfwadd.vf.yaml +80 -0
  1260. data/.data/spec/std/isa/inst/V/vfwadd.vv.yaml +81 -0
  1261. data/.data/spec/std/isa/inst/V/vfwadd.wf.yaml +78 -0
  1262. data/.data/spec/std/isa/inst/V/vfwadd.wv.yaml +79 -0
  1263. data/.data/spec/std/isa/inst/V/vfwcvt.f.f.v.yaml +137 -0
  1264. data/.data/spec/std/isa/inst/V/vfwcvt.f.x.v.yaml +137 -0
  1265. data/.data/spec/std/isa/inst/V/vfwcvt.f.xu.v.yaml +137 -0
  1266. data/.data/spec/std/isa/inst/V/vfwcvt.rtz.x.f.v.yaml +137 -0
  1267. data/.data/spec/std/isa/inst/V/vfwcvt.rtz.xu.f.v.yaml +137 -0
  1268. data/.data/spec/std/isa/inst/V/vfwcvt.x.f.v.yaml +137 -0
  1269. data/.data/spec/std/isa/inst/V/vfwcvt.xu.f.v.yaml +137 -0
  1270. data/.data/spec/std/isa/inst/V/vfwmacc.vf.yaml +81 -0
  1271. data/.data/spec/std/isa/inst/V/vfwmacc.vv.yaml +82 -0
  1272. data/.data/spec/std/isa/inst/V/vfwmsac.vf.yaml +81 -0
  1273. data/.data/spec/std/isa/inst/V/vfwmsac.vv.yaml +82 -0
  1274. data/.data/spec/std/isa/inst/V/vfwmul.vf.yaml +80 -0
  1275. data/.data/spec/std/isa/inst/V/vfwmul.vv.yaml +81 -0
  1276. data/.data/spec/std/isa/inst/V/vfwnmacc.vf.yaml +81 -0
  1277. data/.data/spec/std/isa/inst/V/vfwnmacc.vv.yaml +82 -0
  1278. data/.data/spec/std/isa/inst/V/vfwnmsac.vf.yaml +81 -0
  1279. data/.data/spec/std/isa/inst/V/vfwnmsac.vv.yaml +82 -0
  1280. data/.data/spec/std/isa/inst/V/vfwredosum.vs.yaml +50 -0
  1281. data/.data/spec/std/isa/inst/V/vfwredusum.vs.yaml +50 -0
  1282. data/.data/spec/std/isa/inst/V/vfwsub.vf.yaml +80 -0
  1283. data/.data/spec/std/isa/inst/V/vfwsub.vv.yaml +81 -0
  1284. data/.data/spec/std/isa/inst/V/vfwsub.wf.yaml +78 -0
  1285. data/.data/spec/std/isa/inst/V/vfwsub.wv.yaml +79 -0
  1286. data/.data/spec/std/isa/inst/V/vid.v.yaml +61 -0
  1287. data/.data/spec/std/isa/inst/V/viota.m.yaml +69 -0
  1288. data/.data/spec/std/isa/inst/V/vl1re16.v.yaml +29 -0
  1289. data/.data/spec/std/isa/inst/V/vl1re32.v.yaml +29 -0
  1290. data/.data/spec/std/isa/inst/V/vl1re64.v.yaml +29 -0
  1291. data/.data/spec/std/isa/inst/V/vl1re8.v.yaml +29 -0
  1292. data/.data/spec/std/isa/inst/V/vl2re16.v.yaml +29 -0
  1293. data/.data/spec/std/isa/inst/V/vl2re32.v.yaml +29 -0
  1294. data/.data/spec/std/isa/inst/V/vl2re64.v.yaml +29 -0
  1295. data/.data/spec/std/isa/inst/V/vl2re8.v.yaml +29 -0
  1296. data/.data/spec/std/isa/inst/V/vl4re16.v.yaml +29 -0
  1297. data/.data/spec/std/isa/inst/V/vl4re32.v.yaml +29 -0
  1298. data/.data/spec/std/isa/inst/V/vl4re64.v.yaml +29 -0
  1299. data/.data/spec/std/isa/inst/V/vl4re8.v.yaml +29 -0
  1300. data/.data/spec/std/isa/inst/V/vl8re16.v.yaml +29 -0
  1301. data/.data/spec/std/isa/inst/V/vl8re32.v.yaml +29 -0
  1302. data/.data/spec/std/isa/inst/V/vl8re64.v.yaml +29 -0
  1303. data/.data/spec/std/isa/inst/V/vl8re8.v.yaml +29 -0
  1304. data/.data/spec/std/isa/inst/V/vle16.v.yaml +52 -0
  1305. data/.data/spec/std/isa/inst/V/vle16ff.v.yaml +52 -0
  1306. data/.data/spec/std/isa/inst/V/vle32.v.yaml +52 -0
  1307. data/.data/spec/std/isa/inst/V/vle32ff.v.yaml +52 -0
  1308. data/.data/spec/std/isa/inst/V/vle64.v.yaml +52 -0
  1309. data/.data/spec/std/isa/inst/V/vle64ff.v.yaml +52 -0
  1310. data/.data/spec/std/isa/inst/V/vle8.v.yaml +64 -0
  1311. data/.data/spec/std/isa/inst/V/vle8ff.v.yaml +52 -0
  1312. data/.data/spec/std/isa/inst/V/vlm.v.yaml +48 -0
  1313. data/.data/spec/std/isa/inst/V/vloxei16.v.yaml +54 -0
  1314. data/.data/spec/std/isa/inst/V/vloxei32.v.yaml +54 -0
  1315. data/.data/spec/std/isa/inst/V/vloxei64.v.yaml +54 -0
  1316. data/.data/spec/std/isa/inst/V/vloxei8.v.yaml +54 -0
  1317. data/.data/spec/std/isa/inst/V/vloxseg2ei16.v.yaml +33 -0
  1318. data/.data/spec/std/isa/inst/V/vloxseg2ei32.v.yaml +33 -0
  1319. data/.data/spec/std/isa/inst/V/vloxseg2ei64.v.yaml +33 -0
  1320. data/.data/spec/std/isa/inst/V/vloxseg2ei8.v.yaml +33 -0
  1321. data/.data/spec/std/isa/inst/V/vloxseg3ei16.v.yaml +33 -0
  1322. data/.data/spec/std/isa/inst/V/vloxseg3ei32.v.yaml +33 -0
  1323. data/.data/spec/std/isa/inst/V/vloxseg3ei64.v.yaml +33 -0
  1324. data/.data/spec/std/isa/inst/V/vloxseg3ei8.v.yaml +33 -0
  1325. data/.data/spec/std/isa/inst/V/vloxseg4ei16.v.yaml +33 -0
  1326. data/.data/spec/std/isa/inst/V/vloxseg4ei32.v.yaml +33 -0
  1327. data/.data/spec/std/isa/inst/V/vloxseg4ei64.v.yaml +33 -0
  1328. data/.data/spec/std/isa/inst/V/vloxseg4ei8.v.yaml +33 -0
  1329. data/.data/spec/std/isa/inst/V/vloxseg5ei16.v.yaml +33 -0
  1330. data/.data/spec/std/isa/inst/V/vloxseg5ei32.v.yaml +33 -0
  1331. data/.data/spec/std/isa/inst/V/vloxseg5ei64.v.yaml +33 -0
  1332. data/.data/spec/std/isa/inst/V/vloxseg5ei8.v.yaml +33 -0
  1333. data/.data/spec/std/isa/inst/V/vloxseg6ei16.v.yaml +33 -0
  1334. data/.data/spec/std/isa/inst/V/vloxseg6ei32.v.yaml +33 -0
  1335. data/.data/spec/std/isa/inst/V/vloxseg6ei64.v.yaml +33 -0
  1336. data/.data/spec/std/isa/inst/V/vloxseg6ei8.v.yaml +33 -0
  1337. data/.data/spec/std/isa/inst/V/vloxseg7ei16.v.yaml +33 -0
  1338. data/.data/spec/std/isa/inst/V/vloxseg7ei32.v.yaml +33 -0
  1339. data/.data/spec/std/isa/inst/V/vloxseg7ei64.v.yaml +33 -0
  1340. data/.data/spec/std/isa/inst/V/vloxseg7ei8.v.yaml +33 -0
  1341. data/.data/spec/std/isa/inst/V/vloxseg8ei16.v.yaml +33 -0
  1342. data/.data/spec/std/isa/inst/V/vloxseg8ei32.v.yaml +33 -0
  1343. data/.data/spec/std/isa/inst/V/vloxseg8ei64.v.yaml +33 -0
  1344. data/.data/spec/std/isa/inst/V/vloxseg8ei8.v.yaml +33 -0
  1345. data/.data/spec/std/isa/inst/V/vlse16.v.yaml +54 -0
  1346. data/.data/spec/std/isa/inst/V/vlse32.v.yaml +54 -0
  1347. data/.data/spec/std/isa/inst/V/vlse64.v.yaml +54 -0
  1348. data/.data/spec/std/isa/inst/V/vlse8.v.yaml +54 -0
  1349. data/.data/spec/std/isa/inst/V/vlseg2e16.v.yaml +31 -0
  1350. data/.data/spec/std/isa/inst/V/vlseg2e16ff.v.yaml +31 -0
  1351. data/.data/spec/std/isa/inst/V/vlseg2e32.v.yaml +31 -0
  1352. data/.data/spec/std/isa/inst/V/vlseg2e32ff.v.yaml +31 -0
  1353. data/.data/spec/std/isa/inst/V/vlseg2e64.v.yaml +31 -0
  1354. data/.data/spec/std/isa/inst/V/vlseg2e64ff.v.yaml +31 -0
  1355. data/.data/spec/std/isa/inst/V/vlseg2e8.v.yaml +31 -0
  1356. data/.data/spec/std/isa/inst/V/vlseg2e8ff.v.yaml +31 -0
  1357. data/.data/spec/std/isa/inst/V/vlseg3e16.v.yaml +31 -0
  1358. data/.data/spec/std/isa/inst/V/vlseg3e16ff.v.yaml +31 -0
  1359. data/.data/spec/std/isa/inst/V/vlseg3e32.v.yaml +31 -0
  1360. data/.data/spec/std/isa/inst/V/vlseg3e32ff.v.yaml +31 -0
  1361. data/.data/spec/std/isa/inst/V/vlseg3e64.v.yaml +31 -0
  1362. data/.data/spec/std/isa/inst/V/vlseg3e64ff.v.yaml +31 -0
  1363. data/.data/spec/std/isa/inst/V/vlseg3e8.v.yaml +31 -0
  1364. data/.data/spec/std/isa/inst/V/vlseg3e8ff.v.yaml +31 -0
  1365. data/.data/spec/std/isa/inst/V/vlseg4e16.v.yaml +31 -0
  1366. data/.data/spec/std/isa/inst/V/vlseg4e16ff.v.yaml +31 -0
  1367. data/.data/spec/std/isa/inst/V/vlseg4e32.v.yaml +31 -0
  1368. data/.data/spec/std/isa/inst/V/vlseg4e32ff.v.yaml +31 -0
  1369. data/.data/spec/std/isa/inst/V/vlseg4e64.v.yaml +31 -0
  1370. data/.data/spec/std/isa/inst/V/vlseg4e64ff.v.yaml +31 -0
  1371. data/.data/spec/std/isa/inst/V/vlseg4e8.v.yaml +31 -0
  1372. data/.data/spec/std/isa/inst/V/vlseg4e8ff.v.yaml +31 -0
  1373. data/.data/spec/std/isa/inst/V/vlseg5e16.v.yaml +31 -0
  1374. data/.data/spec/std/isa/inst/V/vlseg5e16ff.v.yaml +31 -0
  1375. data/.data/spec/std/isa/inst/V/vlseg5e32.v.yaml +31 -0
  1376. data/.data/spec/std/isa/inst/V/vlseg5e32ff.v.yaml +31 -0
  1377. data/.data/spec/std/isa/inst/V/vlseg5e64.v.yaml +31 -0
  1378. data/.data/spec/std/isa/inst/V/vlseg5e64ff.v.yaml +31 -0
  1379. data/.data/spec/std/isa/inst/V/vlseg5e8.v.yaml +31 -0
  1380. data/.data/spec/std/isa/inst/V/vlseg5e8ff.v.yaml +31 -0
  1381. data/.data/spec/std/isa/inst/V/vlseg6e16.v.yaml +31 -0
  1382. data/.data/spec/std/isa/inst/V/vlseg6e16ff.v.yaml +31 -0
  1383. data/.data/spec/std/isa/inst/V/vlseg6e32.v.yaml +31 -0
  1384. data/.data/spec/std/isa/inst/V/vlseg6e32ff.v.yaml +31 -0
  1385. data/.data/spec/std/isa/inst/V/vlseg6e64.v.yaml +31 -0
  1386. data/.data/spec/std/isa/inst/V/vlseg6e64ff.v.yaml +31 -0
  1387. data/.data/spec/std/isa/inst/V/vlseg6e8.v.yaml +31 -0
  1388. data/.data/spec/std/isa/inst/V/vlseg6e8ff.v.yaml +31 -0
  1389. data/.data/spec/std/isa/inst/V/vlseg7e16.v.yaml +31 -0
  1390. data/.data/spec/std/isa/inst/V/vlseg7e16ff.v.yaml +31 -0
  1391. data/.data/spec/std/isa/inst/V/vlseg7e32.v.yaml +31 -0
  1392. data/.data/spec/std/isa/inst/V/vlseg7e32ff.v.yaml +31 -0
  1393. data/.data/spec/std/isa/inst/V/vlseg7e64.v.yaml +31 -0
  1394. data/.data/spec/std/isa/inst/V/vlseg7e64ff.v.yaml +31 -0
  1395. data/.data/spec/std/isa/inst/V/vlseg7e8.v.yaml +31 -0
  1396. data/.data/spec/std/isa/inst/V/vlseg7e8ff.v.yaml +31 -0
  1397. data/.data/spec/std/isa/inst/V/vlseg8e16.v.yaml +31 -0
  1398. data/.data/spec/std/isa/inst/V/vlseg8e16ff.v.yaml +31 -0
  1399. data/.data/spec/std/isa/inst/V/vlseg8e32.v.yaml +31 -0
  1400. data/.data/spec/std/isa/inst/V/vlseg8e32ff.v.yaml +31 -0
  1401. data/.data/spec/std/isa/inst/V/vlseg8e64.v.yaml +31 -0
  1402. data/.data/spec/std/isa/inst/V/vlseg8e64ff.v.yaml +31 -0
  1403. data/.data/spec/std/isa/inst/V/vlseg8e8.v.yaml +31 -0
  1404. data/.data/spec/std/isa/inst/V/vlseg8e8ff.v.yaml +31 -0
  1405. data/.data/spec/std/isa/inst/V/vlsseg2e16.v.yaml +33 -0
  1406. data/.data/spec/std/isa/inst/V/vlsseg2e32.v.yaml +33 -0
  1407. data/.data/spec/std/isa/inst/V/vlsseg2e64.v.yaml +33 -0
  1408. data/.data/spec/std/isa/inst/V/vlsseg2e8.v.yaml +33 -0
  1409. data/.data/spec/std/isa/inst/V/vlsseg3e16.v.yaml +33 -0
  1410. data/.data/spec/std/isa/inst/V/vlsseg3e32.v.yaml +33 -0
  1411. data/.data/spec/std/isa/inst/V/vlsseg3e64.v.yaml +33 -0
  1412. data/.data/spec/std/isa/inst/V/vlsseg3e8.v.yaml +33 -0
  1413. data/.data/spec/std/isa/inst/V/vlsseg4e16.v.yaml +33 -0
  1414. data/.data/spec/std/isa/inst/V/vlsseg4e32.v.yaml +33 -0
  1415. data/.data/spec/std/isa/inst/V/vlsseg4e64.v.yaml +33 -0
  1416. data/.data/spec/std/isa/inst/V/vlsseg4e8.v.yaml +33 -0
  1417. data/.data/spec/std/isa/inst/V/vlsseg5e16.v.yaml +33 -0
  1418. data/.data/spec/std/isa/inst/V/vlsseg5e32.v.yaml +33 -0
  1419. data/.data/spec/std/isa/inst/V/vlsseg5e64.v.yaml +33 -0
  1420. data/.data/spec/std/isa/inst/V/vlsseg5e8.v.yaml +33 -0
  1421. data/.data/spec/std/isa/inst/V/vlsseg6e16.v.yaml +33 -0
  1422. data/.data/spec/std/isa/inst/V/vlsseg6e32.v.yaml +33 -0
  1423. data/.data/spec/std/isa/inst/V/vlsseg6e64.v.yaml +33 -0
  1424. data/.data/spec/std/isa/inst/V/vlsseg6e8.v.yaml +33 -0
  1425. data/.data/spec/std/isa/inst/V/vlsseg7e16.v.yaml +33 -0
  1426. data/.data/spec/std/isa/inst/V/vlsseg7e32.v.yaml +33 -0
  1427. data/.data/spec/std/isa/inst/V/vlsseg7e64.v.yaml +33 -0
  1428. data/.data/spec/std/isa/inst/V/vlsseg7e8.v.yaml +33 -0
  1429. data/.data/spec/std/isa/inst/V/vlsseg8e16.v.yaml +33 -0
  1430. data/.data/spec/std/isa/inst/V/vlsseg8e32.v.yaml +33 -0
  1431. data/.data/spec/std/isa/inst/V/vlsseg8e64.v.yaml +33 -0
  1432. data/.data/spec/std/isa/inst/V/vlsseg8e8.v.yaml +33 -0
  1433. data/.data/spec/std/isa/inst/V/vluxei16.v.yaml +54 -0
  1434. data/.data/spec/std/isa/inst/V/vluxei32.v.yaml +54 -0
  1435. data/.data/spec/std/isa/inst/V/vluxei64.v.yaml +54 -0
  1436. data/.data/spec/std/isa/inst/V/vluxei8.v.yaml +54 -0
  1437. data/.data/spec/std/isa/inst/V/vluxseg2ei16.v.yaml +33 -0
  1438. data/.data/spec/std/isa/inst/V/vluxseg2ei32.v.yaml +33 -0
  1439. data/.data/spec/std/isa/inst/V/vluxseg2ei64.v.yaml +33 -0
  1440. data/.data/spec/std/isa/inst/V/vluxseg2ei8.v.yaml +33 -0
  1441. data/.data/spec/std/isa/inst/V/vluxseg3ei16.v.yaml +33 -0
  1442. data/.data/spec/std/isa/inst/V/vluxseg3ei32.v.yaml +33 -0
  1443. data/.data/spec/std/isa/inst/V/vluxseg3ei64.v.yaml +33 -0
  1444. data/.data/spec/std/isa/inst/V/vluxseg3ei8.v.yaml +33 -0
  1445. data/.data/spec/std/isa/inst/V/vluxseg4ei16.v.yaml +33 -0
  1446. data/.data/spec/std/isa/inst/V/vluxseg4ei32.v.yaml +33 -0
  1447. data/.data/spec/std/isa/inst/V/vluxseg4ei64.v.yaml +33 -0
  1448. data/.data/spec/std/isa/inst/V/vluxseg4ei8.v.yaml +33 -0
  1449. data/.data/spec/std/isa/inst/V/vluxseg5ei16.v.yaml +33 -0
  1450. data/.data/spec/std/isa/inst/V/vluxseg5ei32.v.yaml +33 -0
  1451. data/.data/spec/std/isa/inst/V/vluxseg5ei64.v.yaml +33 -0
  1452. data/.data/spec/std/isa/inst/V/vluxseg5ei8.v.yaml +33 -0
  1453. data/.data/spec/std/isa/inst/V/vluxseg6ei16.v.yaml +33 -0
  1454. data/.data/spec/std/isa/inst/V/vluxseg6ei32.v.yaml +33 -0
  1455. data/.data/spec/std/isa/inst/V/vluxseg6ei64.v.yaml +33 -0
  1456. data/.data/spec/std/isa/inst/V/vluxseg6ei8.v.yaml +33 -0
  1457. data/.data/spec/std/isa/inst/V/vluxseg7ei16.v.yaml +33 -0
  1458. data/.data/spec/std/isa/inst/V/vluxseg7ei32.v.yaml +33 -0
  1459. data/.data/spec/std/isa/inst/V/vluxseg7ei64.v.yaml +33 -0
  1460. data/.data/spec/std/isa/inst/V/vluxseg7ei8.v.yaml +33 -0
  1461. data/.data/spec/std/isa/inst/V/vluxseg8ei16.v.yaml +33 -0
  1462. data/.data/spec/std/isa/inst/V/vluxseg8ei32.v.yaml +33 -0
  1463. data/.data/spec/std/isa/inst/V/vluxseg8ei64.v.yaml +33 -0
  1464. data/.data/spec/std/isa/inst/V/vluxseg8ei8.v.yaml +33 -0
  1465. data/.data/spec/std/isa/inst/V/vmacc.vv.yaml +74 -0
  1466. data/.data/spec/std/isa/inst/V/vmacc.vx.yaml +74 -0
  1467. data/.data/spec/std/isa/inst/V/vmadc.vi.yaml +69 -0
  1468. data/.data/spec/std/isa/inst/V/vmadc.vim.yaml +70 -0
  1469. data/.data/spec/std/isa/inst/V/vmadc.vv.yaml +70 -0
  1470. data/.data/spec/std/isa/inst/V/vmadc.vvm.yaml +71 -0
  1471. data/.data/spec/std/isa/inst/V/vmadc.vx.yaml +70 -0
  1472. data/.data/spec/std/isa/inst/V/vmadc.vxm.yaml +71 -0
  1473. data/.data/spec/std/isa/inst/V/vmadd.vv.yaml +74 -0
  1474. data/.data/spec/std/isa/inst/V/vmadd.vx.yaml +74 -0
  1475. data/.data/spec/std/isa/inst/V/vmand.mm.yaml +75 -0
  1476. data/.data/spec/std/isa/inst/V/vmandn.mm.yaml +31 -0
  1477. data/.data/spec/std/isa/inst/V/vmax.vv.yaml +134 -0
  1478. data/.data/spec/std/isa/inst/V/vmax.vx.yaml +117 -0
  1479. data/.data/spec/std/isa/inst/V/vmaxu.vv.yaml +134 -0
  1480. data/.data/spec/std/isa/inst/V/vmaxu.vx.yaml +117 -0
  1481. data/.data/spec/std/isa/inst/V/vmerge.vim.yaml +76 -0
  1482. data/.data/spec/std/isa/inst/V/vmerge.vvm.yaml +76 -0
  1483. data/.data/spec/std/isa/inst/V/vmerge.vxm.yaml +76 -0
  1484. data/.data/spec/std/isa/inst/V/vmfeq.vf.yaml +79 -0
  1485. data/.data/spec/std/isa/inst/V/vmfeq.vv.yaml +77 -0
  1486. data/.data/spec/std/isa/inst/V/vmfge.vf.yaml +79 -0
  1487. data/.data/spec/std/isa/inst/V/vmfgt.vf.yaml +79 -0
  1488. data/.data/spec/std/isa/inst/V/vmfle.vf.yaml +79 -0
  1489. data/.data/spec/std/isa/inst/V/vmfle.vv.yaml +77 -0
  1490. data/.data/spec/std/isa/inst/V/vmflt.vf.yaml +79 -0
  1491. data/.data/spec/std/isa/inst/V/vmflt.vv.yaml +77 -0
  1492. data/.data/spec/std/isa/inst/V/vmfne.vf.yaml +79 -0
  1493. data/.data/spec/std/isa/inst/V/vmfne.vv.yaml +77 -0
  1494. data/.data/spec/std/isa/inst/V/vmin.vv.yaml +134 -0
  1495. data/.data/spec/std/isa/inst/V/vmin.vx.yaml +117 -0
  1496. data/.data/spec/std/isa/inst/V/vminu.vv.yaml +134 -0
  1497. data/.data/spec/std/isa/inst/V/vminu.vx.yaml +117 -0
  1498. data/.data/spec/std/isa/inst/V/vmnand.mm.yaml +75 -0
  1499. data/.data/spec/std/isa/inst/V/vmnor.mm.yaml +75 -0
  1500. data/.data/spec/std/isa/inst/V/vmor.mm.yaml +75 -0
  1501. data/.data/spec/std/isa/inst/V/vmorn.mm.yaml +31 -0
  1502. data/.data/spec/std/isa/inst/V/vmsbc.vv.yaml +70 -0
  1503. data/.data/spec/std/isa/inst/V/vmsbc.vvm.yaml +71 -0
  1504. data/.data/spec/std/isa/inst/V/vmsbc.vx.yaml +70 -0
  1505. data/.data/spec/std/isa/inst/V/vmsbc.vxm.yaml +71 -0
  1506. data/.data/spec/std/isa/inst/V/vmsbf.m.yaml +69 -0
  1507. data/.data/spec/std/isa/inst/V/vmseq.vi.yaml +77 -0
  1508. data/.data/spec/std/isa/inst/V/vmseq.vv.yaml +77 -0
  1509. data/.data/spec/std/isa/inst/V/vmseq.vx.yaml +79 -0
  1510. data/.data/spec/std/isa/inst/V/vmsgt.vi.yaml +77 -0
  1511. data/.data/spec/std/isa/inst/V/vmsgt.vx.yaml +79 -0
  1512. data/.data/spec/std/isa/inst/V/vmsgtu.vi.yaml +77 -0
  1513. data/.data/spec/std/isa/inst/V/vmsgtu.vx.yaml +79 -0
  1514. data/.data/spec/std/isa/inst/V/vmsif.m.yaml +69 -0
  1515. data/.data/spec/std/isa/inst/V/vmsle.vi.yaml +77 -0
  1516. data/.data/spec/std/isa/inst/V/vmsle.vv.yaml +77 -0
  1517. data/.data/spec/std/isa/inst/V/vmsle.vx.yaml +79 -0
  1518. data/.data/spec/std/isa/inst/V/vmsleu.vi.yaml +77 -0
  1519. data/.data/spec/std/isa/inst/V/vmsleu.vv.yaml +77 -0
  1520. data/.data/spec/std/isa/inst/V/vmsleu.vx.yaml +79 -0
  1521. data/.data/spec/std/isa/inst/V/vmslt.vv.yaml +77 -0
  1522. data/.data/spec/std/isa/inst/V/vmslt.vx.yaml +79 -0
  1523. data/.data/spec/std/isa/inst/V/vmsltu.vv.yaml +77 -0
  1524. data/.data/spec/std/isa/inst/V/vmsltu.vx.yaml +79 -0
  1525. data/.data/spec/std/isa/inst/V/vmsne.vi.yaml +77 -0
  1526. data/.data/spec/std/isa/inst/V/vmsne.vv.yaml +77 -0
  1527. data/.data/spec/std/isa/inst/V/vmsne.vx.yaml +79 -0
  1528. data/.data/spec/std/isa/inst/V/vmsof.m.yaml +73 -0
  1529. data/.data/spec/std/isa/inst/V/vmul.vv.yaml +116 -0
  1530. data/.data/spec/std/isa/inst/V/vmul.vx.yaml +125 -0
  1531. data/.data/spec/std/isa/inst/V/vmulh.vv.yaml +116 -0
  1532. data/.data/spec/std/isa/inst/V/vmulh.vx.yaml +125 -0
  1533. data/.data/spec/std/isa/inst/V/vmulhsu.vv.yaml +116 -0
  1534. data/.data/spec/std/isa/inst/V/vmulhsu.vx.yaml +125 -0
  1535. data/.data/spec/std/isa/inst/V/vmulhu.vv.yaml +116 -0
  1536. data/.data/spec/std/isa/inst/V/vmulhu.vx.yaml +125 -0
  1537. data/.data/spec/std/isa/inst/V/vmv.s.x.yaml +70 -0
  1538. data/.data/spec/std/isa/inst/V/vmv.v.i.yaml +105 -0
  1539. data/.data/spec/std/isa/inst/V/vmv.v.v.yaml +62 -0
  1540. data/.data/spec/std/isa/inst/V/vmv.v.x.yaml +62 -0
  1541. data/.data/spec/std/isa/inst/V/vmv.x.s.yaml +64 -0
  1542. data/.data/spec/std/isa/inst/V/vmv1r.v.yaml +62 -0
  1543. data/.data/spec/std/isa/inst/V/vmv2r.v.yaml +62 -0
  1544. data/.data/spec/std/isa/inst/V/vmv4r.v.yaml +62 -0
  1545. data/.data/spec/std/isa/inst/V/vmv8r.v.yaml +62 -0
  1546. data/.data/spec/std/isa/inst/V/vmxnor.mm.yaml +75 -0
  1547. data/.data/spec/std/isa/inst/V/vmxor.mm.yaml +75 -0
  1548. data/.data/spec/std/isa/inst/V/vnclip.wi.yaml +87 -0
  1549. data/.data/spec/std/isa/inst/V/vnclip.wv.yaml +87 -0
  1550. data/.data/spec/std/isa/inst/V/vnclip.wx.yaml +87 -0
  1551. data/.data/spec/std/isa/inst/V/vnclipu.wi.yaml +87 -0
  1552. data/.data/spec/std/isa/inst/V/vnclipu.wv.yaml +87 -0
  1553. data/.data/spec/std/isa/inst/V/vnclipu.wx.yaml +87 -0
  1554. data/.data/spec/std/isa/inst/V/vnmsac.vv.yaml +74 -0
  1555. data/.data/spec/std/isa/inst/V/vnmsac.vx.yaml +74 -0
  1556. data/.data/spec/std/isa/inst/V/vnmsub.vv.yaml +74 -0
  1557. data/.data/spec/std/isa/inst/V/vnmsub.vx.yaml +74 -0
  1558. data/.data/spec/std/isa/inst/V/vnsra.wi.yaml +86 -0
  1559. data/.data/spec/std/isa/inst/V/vnsra.wv.yaml +86 -0
  1560. data/.data/spec/std/isa/inst/V/vnsra.wx.yaml +86 -0
  1561. data/.data/spec/std/isa/inst/V/vnsrl.wi.yaml +86 -0
  1562. data/.data/spec/std/isa/inst/V/vnsrl.wv.yaml +86 -0
  1563. data/.data/spec/std/isa/inst/V/vnsrl.wx.yaml +86 -0
  1564. data/.data/spec/std/isa/inst/V/vor.vi.yaml +101 -0
  1565. data/.data/spec/std/isa/inst/V/vor.vv.yaml +134 -0
  1566. data/.data/spec/std/isa/inst/V/vor.vx.yaml +117 -0
  1567. data/.data/spec/std/isa/inst/V/vredand.vs.yaml +81 -0
  1568. data/.data/spec/std/isa/inst/V/vredmax.vs.yaml +81 -0
  1569. data/.data/spec/std/isa/inst/V/vredmaxu.vs.yaml +81 -0
  1570. data/.data/spec/std/isa/inst/V/vredmin.vs.yaml +81 -0
  1571. data/.data/spec/std/isa/inst/V/vredminu.vs.yaml +81 -0
  1572. data/.data/spec/std/isa/inst/V/vredor.vs.yaml +81 -0
  1573. data/.data/spec/std/isa/inst/V/vredsum.vs.yaml +81 -0
  1574. data/.data/spec/std/isa/inst/V/vredxor.vs.yaml +81 -0
  1575. data/.data/spec/std/isa/inst/V/vrem.vv.yaml +116 -0
  1576. data/.data/spec/std/isa/inst/V/vrem.vx.yaml +125 -0
  1577. data/.data/spec/std/isa/inst/V/vremu.vv.yaml +116 -0
  1578. data/.data/spec/std/isa/inst/V/vremu.vx.yaml +125 -0
  1579. data/.data/spec/std/isa/inst/V/vrgather.vi.yaml +87 -0
  1580. data/.data/spec/std/isa/inst/V/vrgather.vv.yaml +134 -0
  1581. data/.data/spec/std/isa/inst/V/vrgather.vx.yaml +87 -0
  1582. data/.data/spec/std/isa/inst/V/vrgatherei16.vv.yaml +134 -0
  1583. data/.data/spec/std/isa/inst/V/vrsub.vi.yaml +101 -0
  1584. data/.data/spec/std/isa/inst/V/vrsub.vx.yaml +117 -0
  1585. data/.data/spec/std/isa/inst/V/vs1r.v.yaml +29 -0
  1586. data/.data/spec/std/isa/inst/V/vs2r.v.yaml +29 -0
  1587. data/.data/spec/std/isa/inst/V/vs4r.v.yaml +29 -0
  1588. data/.data/spec/std/isa/inst/V/vs8r.v.yaml +29 -0
  1589. data/.data/spec/std/isa/inst/V/vsadd.vi.yaml +101 -0
  1590. data/.data/spec/std/isa/inst/V/vsadd.vv.yaml +134 -0
  1591. data/.data/spec/std/isa/inst/V/vsadd.vx.yaml +117 -0
  1592. data/.data/spec/std/isa/inst/V/vsaddu.vi.yaml +101 -0
  1593. data/.data/spec/std/isa/inst/V/vsaddu.vv.yaml +134 -0
  1594. data/.data/spec/std/isa/inst/V/vsaddu.vx.yaml +117 -0
  1595. data/.data/spec/std/isa/inst/V/vsbc.vvm.yaml +76 -0
  1596. data/.data/spec/std/isa/inst/V/vsbc.vxm.yaml +76 -0
  1597. data/.data/spec/std/isa/inst/V/vse16.v.yaml +52 -0
  1598. data/.data/spec/std/isa/inst/V/vse32.v.yaml +52 -0
  1599. data/.data/spec/std/isa/inst/V/vse64.v.yaml +52 -0
  1600. data/.data/spec/std/isa/inst/V/vse8.v.yaml +60 -0
  1601. data/.data/spec/std/isa/inst/V/vsetivli.yaml +122 -0
  1602. data/.data/spec/std/isa/inst/V/vsetvl.yaml +147 -0
  1603. data/.data/spec/std/isa/inst/V/vsetvli.yaml +174 -0
  1604. data/.data/spec/std/isa/inst/V/vsext.vf2.yaml +75 -0
  1605. data/.data/spec/std/isa/inst/V/vsext.vf4.yaml +75 -0
  1606. data/.data/spec/std/isa/inst/V/vsext.vf8.yaml +75 -0
  1607. data/.data/spec/std/isa/inst/V/vslide1down.vx.yaml +125 -0
  1608. data/.data/spec/std/isa/inst/V/vslide1up.vx.yaml +125 -0
  1609. data/.data/spec/std/isa/inst/V/vslidedown.vi.yaml +87 -0
  1610. data/.data/spec/std/isa/inst/V/vslidedown.vx.yaml +87 -0
  1611. data/.data/spec/std/isa/inst/V/vslideup.vi.yaml +87 -0
  1612. data/.data/spec/std/isa/inst/V/vslideup.vx.yaml +87 -0
  1613. data/.data/spec/std/isa/inst/V/vsll.vi.yaml +101 -0
  1614. data/.data/spec/std/isa/inst/V/vsll.vv.yaml +134 -0
  1615. data/.data/spec/std/isa/inst/V/vsll.vx.yaml +117 -0
  1616. data/.data/spec/std/isa/inst/V/vsm.v.yaml +48 -0
  1617. data/.data/spec/std/isa/inst/V/vsmul.vv.yaml +134 -0
  1618. data/.data/spec/std/isa/inst/V/vsmul.vx.yaml +117 -0
  1619. data/.data/spec/std/isa/inst/V/vsoxei16.v.yaml +54 -0
  1620. data/.data/spec/std/isa/inst/V/vsoxei32.v.yaml +54 -0
  1621. data/.data/spec/std/isa/inst/V/vsoxei64.v.yaml +54 -0
  1622. data/.data/spec/std/isa/inst/V/vsoxei8.v.yaml +54 -0
  1623. data/.data/spec/std/isa/inst/V/vsoxseg2ei16.v.yaml +33 -0
  1624. data/.data/spec/std/isa/inst/V/vsoxseg2ei32.v.yaml +33 -0
  1625. data/.data/spec/std/isa/inst/V/vsoxseg2ei64.v.yaml +33 -0
  1626. data/.data/spec/std/isa/inst/V/vsoxseg2ei8.v.yaml +33 -0
  1627. data/.data/spec/std/isa/inst/V/vsoxseg3ei16.v.yaml +33 -0
  1628. data/.data/spec/std/isa/inst/V/vsoxseg3ei32.v.yaml +33 -0
  1629. data/.data/spec/std/isa/inst/V/vsoxseg3ei64.v.yaml +33 -0
  1630. data/.data/spec/std/isa/inst/V/vsoxseg3ei8.v.yaml +33 -0
  1631. data/.data/spec/std/isa/inst/V/vsoxseg4ei16.v.yaml +33 -0
  1632. data/.data/spec/std/isa/inst/V/vsoxseg4ei32.v.yaml +33 -0
  1633. data/.data/spec/std/isa/inst/V/vsoxseg4ei64.v.yaml +33 -0
  1634. data/.data/spec/std/isa/inst/V/vsoxseg4ei8.v.yaml +33 -0
  1635. data/.data/spec/std/isa/inst/V/vsoxseg5ei16.v.yaml +33 -0
  1636. data/.data/spec/std/isa/inst/V/vsoxseg5ei32.v.yaml +33 -0
  1637. data/.data/spec/std/isa/inst/V/vsoxseg5ei64.v.yaml +33 -0
  1638. data/.data/spec/std/isa/inst/V/vsoxseg5ei8.v.yaml +33 -0
  1639. data/.data/spec/std/isa/inst/V/vsoxseg6ei16.v.yaml +33 -0
  1640. data/.data/spec/std/isa/inst/V/vsoxseg6ei32.v.yaml +33 -0
  1641. data/.data/spec/std/isa/inst/V/vsoxseg6ei64.v.yaml +33 -0
  1642. data/.data/spec/std/isa/inst/V/vsoxseg6ei8.v.yaml +33 -0
  1643. data/.data/spec/std/isa/inst/V/vsoxseg7ei16.v.yaml +33 -0
  1644. data/.data/spec/std/isa/inst/V/vsoxseg7ei32.v.yaml +33 -0
  1645. data/.data/spec/std/isa/inst/V/vsoxseg7ei64.v.yaml +33 -0
  1646. data/.data/spec/std/isa/inst/V/vsoxseg7ei8.v.yaml +33 -0
  1647. data/.data/spec/std/isa/inst/V/vsoxseg8ei16.v.yaml +33 -0
  1648. data/.data/spec/std/isa/inst/V/vsoxseg8ei32.v.yaml +33 -0
  1649. data/.data/spec/std/isa/inst/V/vsoxseg8ei64.v.yaml +33 -0
  1650. data/.data/spec/std/isa/inst/V/vsoxseg8ei8.v.yaml +33 -0
  1651. data/.data/spec/std/isa/inst/V/vsra.vi.yaml +101 -0
  1652. data/.data/spec/std/isa/inst/V/vsra.vv.yaml +134 -0
  1653. data/.data/spec/std/isa/inst/V/vsra.vx.yaml +117 -0
  1654. data/.data/spec/std/isa/inst/V/vsrl.vi.yaml +101 -0
  1655. data/.data/spec/std/isa/inst/V/vsrl.vv.yaml +134 -0
  1656. data/.data/spec/std/isa/inst/V/vsrl.vx.yaml +117 -0
  1657. data/.data/spec/std/isa/inst/V/vsse16.v.yaml +54 -0
  1658. data/.data/spec/std/isa/inst/V/vsse32.v.yaml +54 -0
  1659. data/.data/spec/std/isa/inst/V/vsse64.v.yaml +54 -0
  1660. data/.data/spec/std/isa/inst/V/vsse8.v.yaml +54 -0
  1661. data/.data/spec/std/isa/inst/V/vsseg2e16.v.yaml +31 -0
  1662. data/.data/spec/std/isa/inst/V/vsseg2e32.v.yaml +31 -0
  1663. data/.data/spec/std/isa/inst/V/vsseg2e64.v.yaml +31 -0
  1664. data/.data/spec/std/isa/inst/V/vsseg2e8.v.yaml +31 -0
  1665. data/.data/spec/std/isa/inst/V/vsseg3e16.v.yaml +31 -0
  1666. data/.data/spec/std/isa/inst/V/vsseg3e32.v.yaml +31 -0
  1667. data/.data/spec/std/isa/inst/V/vsseg3e64.v.yaml +31 -0
  1668. data/.data/spec/std/isa/inst/V/vsseg3e8.v.yaml +31 -0
  1669. data/.data/spec/std/isa/inst/V/vsseg4e16.v.yaml +31 -0
  1670. data/.data/spec/std/isa/inst/V/vsseg4e32.v.yaml +31 -0
  1671. data/.data/spec/std/isa/inst/V/vsseg4e64.v.yaml +31 -0
  1672. data/.data/spec/std/isa/inst/V/vsseg4e8.v.yaml +31 -0
  1673. data/.data/spec/std/isa/inst/V/vsseg5e16.v.yaml +31 -0
  1674. data/.data/spec/std/isa/inst/V/vsseg5e32.v.yaml +31 -0
  1675. data/.data/spec/std/isa/inst/V/vsseg5e64.v.yaml +31 -0
  1676. data/.data/spec/std/isa/inst/V/vsseg5e8.v.yaml +31 -0
  1677. data/.data/spec/std/isa/inst/V/vsseg6e16.v.yaml +31 -0
  1678. data/.data/spec/std/isa/inst/V/vsseg6e32.v.yaml +31 -0
  1679. data/.data/spec/std/isa/inst/V/vsseg6e64.v.yaml +31 -0
  1680. data/.data/spec/std/isa/inst/V/vsseg6e8.v.yaml +31 -0
  1681. data/.data/spec/std/isa/inst/V/vsseg7e16.v.yaml +31 -0
  1682. data/.data/spec/std/isa/inst/V/vsseg7e32.v.yaml +31 -0
  1683. data/.data/spec/std/isa/inst/V/vsseg7e64.v.yaml +31 -0
  1684. data/.data/spec/std/isa/inst/V/vsseg7e8.v.yaml +31 -0
  1685. data/.data/spec/std/isa/inst/V/vsseg8e16.v.yaml +31 -0
  1686. data/.data/spec/std/isa/inst/V/vsseg8e32.v.yaml +31 -0
  1687. data/.data/spec/std/isa/inst/V/vsseg8e64.v.yaml +31 -0
  1688. data/.data/spec/std/isa/inst/V/vsseg8e8.v.yaml +31 -0
  1689. data/.data/spec/std/isa/inst/V/vssra.vi.yaml +101 -0
  1690. data/.data/spec/std/isa/inst/V/vssra.vv.yaml +134 -0
  1691. data/.data/spec/std/isa/inst/V/vssra.vx.yaml +117 -0
  1692. data/.data/spec/std/isa/inst/V/vssrl.vi.yaml +101 -0
  1693. data/.data/spec/std/isa/inst/V/vssrl.vv.yaml +134 -0
  1694. data/.data/spec/std/isa/inst/V/vssrl.vx.yaml +117 -0
  1695. data/.data/spec/std/isa/inst/V/vssseg2e16.v.yaml +33 -0
  1696. data/.data/spec/std/isa/inst/V/vssseg2e32.v.yaml +33 -0
  1697. data/.data/spec/std/isa/inst/V/vssseg2e64.v.yaml +33 -0
  1698. data/.data/spec/std/isa/inst/V/vssseg2e8.v.yaml +33 -0
  1699. data/.data/spec/std/isa/inst/V/vssseg3e16.v.yaml +33 -0
  1700. data/.data/spec/std/isa/inst/V/vssseg3e32.v.yaml +33 -0
  1701. data/.data/spec/std/isa/inst/V/vssseg3e64.v.yaml +33 -0
  1702. data/.data/spec/std/isa/inst/V/vssseg3e8.v.yaml +33 -0
  1703. data/.data/spec/std/isa/inst/V/vssseg4e16.v.yaml +33 -0
  1704. data/.data/spec/std/isa/inst/V/vssseg4e32.v.yaml +33 -0
  1705. data/.data/spec/std/isa/inst/V/vssseg4e64.v.yaml +33 -0
  1706. data/.data/spec/std/isa/inst/V/vssseg4e8.v.yaml +33 -0
  1707. data/.data/spec/std/isa/inst/V/vssseg5e16.v.yaml +33 -0
  1708. data/.data/spec/std/isa/inst/V/vssseg5e32.v.yaml +33 -0
  1709. data/.data/spec/std/isa/inst/V/vssseg5e64.v.yaml +33 -0
  1710. data/.data/spec/std/isa/inst/V/vssseg5e8.v.yaml +33 -0
  1711. data/.data/spec/std/isa/inst/V/vssseg6e16.v.yaml +33 -0
  1712. data/.data/spec/std/isa/inst/V/vssseg6e32.v.yaml +33 -0
  1713. data/.data/spec/std/isa/inst/V/vssseg6e64.v.yaml +33 -0
  1714. data/.data/spec/std/isa/inst/V/vssseg6e8.v.yaml +33 -0
  1715. data/.data/spec/std/isa/inst/V/vssseg7e16.v.yaml +33 -0
  1716. data/.data/spec/std/isa/inst/V/vssseg7e32.v.yaml +33 -0
  1717. data/.data/spec/std/isa/inst/V/vssseg7e64.v.yaml +33 -0
  1718. data/.data/spec/std/isa/inst/V/vssseg7e8.v.yaml +33 -0
  1719. data/.data/spec/std/isa/inst/V/vssseg8e16.v.yaml +33 -0
  1720. data/.data/spec/std/isa/inst/V/vssseg8e32.v.yaml +33 -0
  1721. data/.data/spec/std/isa/inst/V/vssseg8e64.v.yaml +33 -0
  1722. data/.data/spec/std/isa/inst/V/vssseg8e8.v.yaml +33 -0
  1723. data/.data/spec/std/isa/inst/V/vssub.vv.yaml +134 -0
  1724. data/.data/spec/std/isa/inst/V/vssub.vx.yaml +117 -0
  1725. data/.data/spec/std/isa/inst/V/vssubu.vv.yaml +134 -0
  1726. data/.data/spec/std/isa/inst/V/vssubu.vx.yaml +117 -0
  1727. data/.data/spec/std/isa/inst/V/vsub.vv.yaml +134 -0
  1728. data/.data/spec/std/isa/inst/V/vsub.vx.yaml +117 -0
  1729. data/.data/spec/std/isa/inst/V/vsuxei16.v.yaml +54 -0
  1730. data/.data/spec/std/isa/inst/V/vsuxei32.v.yaml +54 -0
  1731. data/.data/spec/std/isa/inst/V/vsuxei64.v.yaml +54 -0
  1732. data/.data/spec/std/isa/inst/V/vsuxei8.v.yaml +54 -0
  1733. data/.data/spec/std/isa/inst/V/vsuxseg2ei16.v.yaml +33 -0
  1734. data/.data/spec/std/isa/inst/V/vsuxseg2ei32.v.yaml +33 -0
  1735. data/.data/spec/std/isa/inst/V/vsuxseg2ei64.v.yaml +33 -0
  1736. data/.data/spec/std/isa/inst/V/vsuxseg2ei8.v.yaml +33 -0
  1737. data/.data/spec/std/isa/inst/V/vsuxseg3ei16.v.yaml +33 -0
  1738. data/.data/spec/std/isa/inst/V/vsuxseg3ei32.v.yaml +33 -0
  1739. data/.data/spec/std/isa/inst/V/vsuxseg3ei64.v.yaml +33 -0
  1740. data/.data/spec/std/isa/inst/V/vsuxseg3ei8.v.yaml +33 -0
  1741. data/.data/spec/std/isa/inst/V/vsuxseg4ei16.v.yaml +33 -0
  1742. data/.data/spec/std/isa/inst/V/vsuxseg4ei32.v.yaml +33 -0
  1743. data/.data/spec/std/isa/inst/V/vsuxseg4ei64.v.yaml +33 -0
  1744. data/.data/spec/std/isa/inst/V/vsuxseg4ei8.v.yaml +33 -0
  1745. data/.data/spec/std/isa/inst/V/vsuxseg5ei16.v.yaml +33 -0
  1746. data/.data/spec/std/isa/inst/V/vsuxseg5ei32.v.yaml +33 -0
  1747. data/.data/spec/std/isa/inst/V/vsuxseg5ei64.v.yaml +33 -0
  1748. data/.data/spec/std/isa/inst/V/vsuxseg5ei8.v.yaml +33 -0
  1749. data/.data/spec/std/isa/inst/V/vsuxseg6ei16.v.yaml +33 -0
  1750. data/.data/spec/std/isa/inst/V/vsuxseg6ei32.v.yaml +33 -0
  1751. data/.data/spec/std/isa/inst/V/vsuxseg6ei64.v.yaml +33 -0
  1752. data/.data/spec/std/isa/inst/V/vsuxseg6ei8.v.yaml +33 -0
  1753. data/.data/spec/std/isa/inst/V/vsuxseg7ei16.v.yaml +33 -0
  1754. data/.data/spec/std/isa/inst/V/vsuxseg7ei32.v.yaml +33 -0
  1755. data/.data/spec/std/isa/inst/V/vsuxseg7ei64.v.yaml +33 -0
  1756. data/.data/spec/std/isa/inst/V/vsuxseg7ei8.v.yaml +33 -0
  1757. data/.data/spec/std/isa/inst/V/vsuxseg8ei16.v.yaml +33 -0
  1758. data/.data/spec/std/isa/inst/V/vsuxseg8ei32.v.yaml +33 -0
  1759. data/.data/spec/std/isa/inst/V/vsuxseg8ei64.v.yaml +33 -0
  1760. data/.data/spec/std/isa/inst/V/vsuxseg8ei8.v.yaml +33 -0
  1761. data/.data/spec/std/isa/inst/V/vwadd.vv.yaml +83 -0
  1762. data/.data/spec/std/isa/inst/V/vwadd.vx.yaml +82 -0
  1763. data/.data/spec/std/isa/inst/V/vwadd.wv.yaml +79 -0
  1764. data/.data/spec/std/isa/inst/V/vwadd.wx.yaml +78 -0
  1765. data/.data/spec/std/isa/inst/V/vwaddu.vv.yaml +83 -0
  1766. data/.data/spec/std/isa/inst/V/vwaddu.vx.yaml +82 -0
  1767. data/.data/spec/std/isa/inst/V/vwaddu.wv.yaml +79 -0
  1768. data/.data/spec/std/isa/inst/V/vwaddu.wx.yaml +78 -0
  1769. data/.data/spec/std/isa/inst/V/vwmacc.vv.yaml +79 -0
  1770. data/.data/spec/std/isa/inst/V/vwmacc.vx.yaml +79 -0
  1771. data/.data/spec/std/isa/inst/V/vwmaccsu.vv.yaml +79 -0
  1772. data/.data/spec/std/isa/inst/V/vwmaccsu.vx.yaml +79 -0
  1773. data/.data/spec/std/isa/inst/V/vwmaccu.vv.yaml +79 -0
  1774. data/.data/spec/std/isa/inst/V/vwmaccu.vx.yaml +79 -0
  1775. data/.data/spec/std/isa/inst/V/vwmaccus.vx.yaml +79 -0
  1776. data/.data/spec/std/isa/inst/V/vwmul.vv.yaml +83 -0
  1777. data/.data/spec/std/isa/inst/V/vwmul.vx.yaml +82 -0
  1778. data/.data/spec/std/isa/inst/V/vwmulsu.vv.yaml +83 -0
  1779. data/.data/spec/std/isa/inst/V/vwmulsu.vx.yaml +82 -0
  1780. data/.data/spec/std/isa/inst/V/vwmulu.vv.yaml +83 -0
  1781. data/.data/spec/std/isa/inst/V/vwmulu.vx.yaml +82 -0
  1782. data/.data/spec/std/isa/inst/V/vwredsum.vs.yaml +79 -0
  1783. data/.data/spec/std/isa/inst/V/vwredsumu.vs.yaml +79 -0
  1784. data/.data/spec/std/isa/inst/V/vwsub.vv.yaml +83 -0
  1785. data/.data/spec/std/isa/inst/V/vwsub.vx.yaml +82 -0
  1786. data/.data/spec/std/isa/inst/V/vwsub.wv.yaml +79 -0
  1787. data/.data/spec/std/isa/inst/V/vwsub.wx.yaml +78 -0
  1788. data/.data/spec/std/isa/inst/V/vwsubu.vv.yaml +83 -0
  1789. data/.data/spec/std/isa/inst/V/vwsubu.vx.yaml +82 -0
  1790. data/.data/spec/std/isa/inst/V/vwsubu.wv.yaml +79 -0
  1791. data/.data/spec/std/isa/inst/V/vwsubu.wx.yaml +78 -0
  1792. data/.data/spec/std/isa/inst/V/vxor.vi.yaml +101 -0
  1793. data/.data/spec/std/isa/inst/V/vxor.vv.yaml +134 -0
  1794. data/.data/spec/std/isa/inst/V/vxor.vx.yaml +117 -0
  1795. data/.data/spec/std/isa/inst/V/vzext.vf2.yaml +75 -0
  1796. data/.data/spec/std/isa/inst/V/vzext.vf4.yaml +75 -0
  1797. data/.data/spec/std/isa/inst/V/vzext.vf8.yaml +75 -0
  1798. data/.data/spec/std/isa/inst/Zaamo/amoadd.SIZE.AQRL.layout +181 -0
  1799. data/.data/spec/std/isa/inst/Zaamo/amoadd.d.aq.yaml +145 -0
  1800. data/.data/spec/std/isa/inst/Zaamo/amoadd.d.aqrl.yaml +147 -0
  1801. data/.data/spec/std/isa/inst/Zaamo/amoadd.d.rl.yaml +145 -0
  1802. data/.data/spec/std/isa/inst/Zaamo/amoadd.d.yaml +143 -0
  1803. data/.data/spec/std/isa/inst/Zaamo/amoadd.w.aq.yaml +143 -0
  1804. data/.data/spec/std/isa/inst/Zaamo/amoadd.w.aqrl.yaml +145 -0
  1805. data/.data/spec/std/isa/inst/Zaamo/amoadd.w.rl.yaml +143 -0
  1806. data/.data/spec/std/isa/inst/Zaamo/amoadd.w.yaml +141 -0
  1807. data/.data/spec/std/isa/inst/Zaamo/amoand.SIZE.AQRL.layout +181 -0
  1808. data/.data/spec/std/isa/inst/Zaamo/amoand.d.aq.yaml +145 -0
  1809. data/.data/spec/std/isa/inst/Zaamo/amoand.d.aqrl.yaml +147 -0
  1810. data/.data/spec/std/isa/inst/Zaamo/amoand.d.rl.yaml +145 -0
  1811. data/.data/spec/std/isa/inst/Zaamo/amoand.d.yaml +143 -0
  1812. data/.data/spec/std/isa/inst/Zaamo/amoand.w.aq.yaml +143 -0
  1813. data/.data/spec/std/isa/inst/Zaamo/amoand.w.aqrl.yaml +145 -0
  1814. data/.data/spec/std/isa/inst/Zaamo/amoand.w.rl.yaml +143 -0
  1815. data/.data/spec/std/isa/inst/Zaamo/amoand.w.yaml +141 -0
  1816. data/.data/spec/std/isa/inst/Zaamo/amomax.SIZE.AQRL.layout +181 -0
  1817. data/.data/spec/std/isa/inst/Zaamo/amomax.d.aq.yaml +145 -0
  1818. data/.data/spec/std/isa/inst/Zaamo/amomax.d.aqrl.yaml +147 -0
  1819. data/.data/spec/std/isa/inst/Zaamo/amomax.d.rl.yaml +145 -0
  1820. data/.data/spec/std/isa/inst/Zaamo/amomax.d.yaml +143 -0
  1821. data/.data/spec/std/isa/inst/Zaamo/amomax.w.aq.yaml +143 -0
  1822. data/.data/spec/std/isa/inst/Zaamo/amomax.w.aqrl.yaml +145 -0
  1823. data/.data/spec/std/isa/inst/Zaamo/amomax.w.rl.yaml +143 -0
  1824. data/.data/spec/std/isa/inst/Zaamo/amomax.w.yaml +141 -0
  1825. data/.data/spec/std/isa/inst/Zaamo/amomaxu.SIZE.AQRL.layout +181 -0
  1826. data/.data/spec/std/isa/inst/Zaamo/amomaxu.d.aq.yaml +145 -0
  1827. data/.data/spec/std/isa/inst/Zaamo/amomaxu.d.aqrl.yaml +147 -0
  1828. data/.data/spec/std/isa/inst/Zaamo/amomaxu.d.rl.yaml +145 -0
  1829. data/.data/spec/std/isa/inst/Zaamo/amomaxu.d.yaml +143 -0
  1830. data/.data/spec/std/isa/inst/Zaamo/amomaxu.w.aq.yaml +143 -0
  1831. data/.data/spec/std/isa/inst/Zaamo/amomaxu.w.aqrl.yaml +145 -0
  1832. data/.data/spec/std/isa/inst/Zaamo/amomaxu.w.rl.yaml +143 -0
  1833. data/.data/spec/std/isa/inst/Zaamo/amomaxu.w.yaml +141 -0
  1834. data/.data/spec/std/isa/inst/Zaamo/amomin.SIZE.AQRL.layout +181 -0
  1835. data/.data/spec/std/isa/inst/Zaamo/amomin.d.aq.yaml +145 -0
  1836. data/.data/spec/std/isa/inst/Zaamo/amomin.d.aqrl.yaml +147 -0
  1837. data/.data/spec/std/isa/inst/Zaamo/amomin.d.rl.yaml +145 -0
  1838. data/.data/spec/std/isa/inst/Zaamo/amomin.d.yaml +143 -0
  1839. data/.data/spec/std/isa/inst/Zaamo/amomin.w.aq.yaml +143 -0
  1840. data/.data/spec/std/isa/inst/Zaamo/amomin.w.aqrl.yaml +145 -0
  1841. data/.data/spec/std/isa/inst/Zaamo/amomin.w.rl.yaml +143 -0
  1842. data/.data/spec/std/isa/inst/Zaamo/amomin.w.yaml +141 -0
  1843. data/.data/spec/std/isa/inst/Zaamo/amominu.SIZE.AQRL.layout +181 -0
  1844. data/.data/spec/std/isa/inst/Zaamo/amominu.d.aq.yaml +145 -0
  1845. data/.data/spec/std/isa/inst/Zaamo/amominu.d.aqrl.yaml +147 -0
  1846. data/.data/spec/std/isa/inst/Zaamo/amominu.d.rl.yaml +145 -0
  1847. data/.data/spec/std/isa/inst/Zaamo/amominu.d.yaml +143 -0
  1848. data/.data/spec/std/isa/inst/Zaamo/amominu.w.aq.yaml +143 -0
  1849. data/.data/spec/std/isa/inst/Zaamo/amominu.w.aqrl.yaml +145 -0
  1850. data/.data/spec/std/isa/inst/Zaamo/amominu.w.rl.yaml +143 -0
  1851. data/.data/spec/std/isa/inst/Zaamo/amominu.w.yaml +141 -0
  1852. data/.data/spec/std/isa/inst/Zaamo/amoor.SIZE.AQRL.layout +181 -0
  1853. data/.data/spec/std/isa/inst/Zaamo/amoor.d.aq.yaml +145 -0
  1854. data/.data/spec/std/isa/inst/Zaamo/amoor.d.aqrl.yaml +147 -0
  1855. data/.data/spec/std/isa/inst/Zaamo/amoor.d.rl.yaml +145 -0
  1856. data/.data/spec/std/isa/inst/Zaamo/amoor.d.yaml +143 -0
  1857. data/.data/spec/std/isa/inst/Zaamo/amoor.w.aq.yaml +143 -0
  1858. data/.data/spec/std/isa/inst/Zaamo/amoor.w.aqrl.yaml +145 -0
  1859. data/.data/spec/std/isa/inst/Zaamo/amoor.w.rl.yaml +143 -0
  1860. data/.data/spec/std/isa/inst/Zaamo/amoor.w.yaml +141 -0
  1861. data/.data/spec/std/isa/inst/Zaamo/amoswap.SIZE.AQRL.layout +180 -0
  1862. data/.data/spec/std/isa/inst/Zaamo/amoswap.d.aq.yaml +144 -0
  1863. data/.data/spec/std/isa/inst/Zaamo/amoswap.d.aqrl.yaml +146 -0
  1864. data/.data/spec/std/isa/inst/Zaamo/amoswap.d.rl.yaml +144 -0
  1865. data/.data/spec/std/isa/inst/Zaamo/amoswap.d.yaml +142 -0
  1866. data/.data/spec/std/isa/inst/Zaamo/amoswap.w.aq.yaml +142 -0
  1867. data/.data/spec/std/isa/inst/Zaamo/amoswap.w.aqrl.yaml +144 -0
  1868. data/.data/spec/std/isa/inst/Zaamo/amoswap.w.rl.yaml +142 -0
  1869. data/.data/spec/std/isa/inst/Zaamo/amoswap.w.yaml +140 -0
  1870. data/.data/spec/std/isa/inst/Zaamo/amoxor.SIZE.AQRL.layout +181 -0
  1871. data/.data/spec/std/isa/inst/Zaamo/amoxor.d.aq.yaml +145 -0
  1872. data/.data/spec/std/isa/inst/Zaamo/amoxor.d.aqrl.yaml +147 -0
  1873. data/.data/spec/std/isa/inst/Zaamo/amoxor.d.rl.yaml +145 -0
  1874. data/.data/spec/std/isa/inst/Zaamo/amoxor.d.yaml +143 -0
  1875. data/.data/spec/std/isa/inst/Zaamo/amoxor.w.aq.yaml +143 -0
  1876. data/.data/spec/std/isa/inst/Zaamo/amoxor.w.aqrl.yaml +145 -0
  1877. data/.data/spec/std/isa/inst/Zaamo/amoxor.w.rl.yaml +143 -0
  1878. data/.data/spec/std/isa/inst/Zaamo/amoxor.w.yaml +141 -0
  1879. data/.data/spec/std/isa/inst/Zabha/amoadd.b.aq.yaml +143 -0
  1880. data/.data/spec/std/isa/inst/Zabha/amoadd.b.aqrl.yaml +145 -0
  1881. data/.data/spec/std/isa/inst/Zabha/amoadd.b.rl.yaml +143 -0
  1882. data/.data/spec/std/isa/inst/Zabha/amoadd.b.yaml +141 -0
  1883. data/.data/spec/std/isa/inst/Zabha/amoadd.h.aq.yaml +143 -0
  1884. data/.data/spec/std/isa/inst/Zabha/amoadd.h.aqrl.yaml +145 -0
  1885. data/.data/spec/std/isa/inst/Zabha/amoadd.h.rl.yaml +143 -0
  1886. data/.data/spec/std/isa/inst/Zabha/amoadd.h.yaml +141 -0
  1887. data/.data/spec/std/isa/inst/Zabha/amoand.b.aq.yaml +143 -0
  1888. data/.data/spec/std/isa/inst/Zabha/amoand.b.aqrl.yaml +145 -0
  1889. data/.data/spec/std/isa/inst/Zabha/amoand.b.rl.yaml +143 -0
  1890. data/.data/spec/std/isa/inst/Zabha/amoand.b.yaml +141 -0
  1891. data/.data/spec/std/isa/inst/Zabha/amoand.h.aq.yaml +143 -0
  1892. data/.data/spec/std/isa/inst/Zabha/amoand.h.aqrl.yaml +145 -0
  1893. data/.data/spec/std/isa/inst/Zabha/amoand.h.rl.yaml +143 -0
  1894. data/.data/spec/std/isa/inst/Zabha/amoand.h.yaml +141 -0
  1895. data/.data/spec/std/isa/inst/Zabha/amocas.b.aq.yaml +135 -0
  1896. data/.data/spec/std/isa/inst/Zabha/amocas.b.aqrl.yaml +137 -0
  1897. data/.data/spec/std/isa/inst/Zabha/amocas.b.rl.yaml +135 -0
  1898. data/.data/spec/std/isa/inst/Zabha/amocas.b.yaml +133 -0
  1899. data/.data/spec/std/isa/inst/Zabha/amocas.h.aq.yaml +135 -0
  1900. data/.data/spec/std/isa/inst/Zabha/amocas.h.aqrl.yaml +137 -0
  1901. data/.data/spec/std/isa/inst/Zabha/amocas.h.rl.yaml +135 -0
  1902. data/.data/spec/std/isa/inst/Zabha/amocas.h.yaml +133 -0
  1903. data/.data/spec/std/isa/inst/Zabha/amomax.b.aq.yaml +143 -0
  1904. data/.data/spec/std/isa/inst/Zabha/amomax.b.aqrl.yaml +145 -0
  1905. data/.data/spec/std/isa/inst/Zabha/amomax.b.rl.yaml +143 -0
  1906. data/.data/spec/std/isa/inst/Zabha/amomax.b.yaml +141 -0
  1907. data/.data/spec/std/isa/inst/Zabha/amomax.h.aq.yaml +143 -0
  1908. data/.data/spec/std/isa/inst/Zabha/amomax.h.aqrl.yaml +145 -0
  1909. data/.data/spec/std/isa/inst/Zabha/amomax.h.rl.yaml +143 -0
  1910. data/.data/spec/std/isa/inst/Zabha/amomax.h.yaml +141 -0
  1911. data/.data/spec/std/isa/inst/Zabha/amomaxu.b.aq.yaml +143 -0
  1912. data/.data/spec/std/isa/inst/Zabha/amomaxu.b.aqrl.yaml +145 -0
  1913. data/.data/spec/std/isa/inst/Zabha/amomaxu.b.rl.yaml +143 -0
  1914. data/.data/spec/std/isa/inst/Zabha/amomaxu.b.yaml +141 -0
  1915. data/.data/spec/std/isa/inst/Zabha/amomaxu.h.aq.yaml +143 -0
  1916. data/.data/spec/std/isa/inst/Zabha/amomaxu.h.aqrl.yaml +145 -0
  1917. data/.data/spec/std/isa/inst/Zabha/amomaxu.h.rl.yaml +143 -0
  1918. data/.data/spec/std/isa/inst/Zabha/amomaxu.h.yaml +141 -0
  1919. data/.data/spec/std/isa/inst/Zabha/amomin.b.aq.yaml +143 -0
  1920. data/.data/spec/std/isa/inst/Zabha/amomin.b.aqrl.yaml +145 -0
  1921. data/.data/spec/std/isa/inst/Zabha/amomin.b.rl.yaml +143 -0
  1922. data/.data/spec/std/isa/inst/Zabha/amomin.b.yaml +141 -0
  1923. data/.data/spec/std/isa/inst/Zabha/amomin.h.aq.yaml +143 -0
  1924. data/.data/spec/std/isa/inst/Zabha/amomin.h.aqrl.yaml +145 -0
  1925. data/.data/spec/std/isa/inst/Zabha/amomin.h.rl.yaml +143 -0
  1926. data/.data/spec/std/isa/inst/Zabha/amomin.h.yaml +141 -0
  1927. data/.data/spec/std/isa/inst/Zabha/amominu.b.aq.yaml +143 -0
  1928. data/.data/spec/std/isa/inst/Zabha/amominu.b.aqrl.yaml +145 -0
  1929. data/.data/spec/std/isa/inst/Zabha/amominu.b.rl.yaml +143 -0
  1930. data/.data/spec/std/isa/inst/Zabha/amominu.b.yaml +141 -0
  1931. data/.data/spec/std/isa/inst/Zabha/amominu.h.aq.yaml +143 -0
  1932. data/.data/spec/std/isa/inst/Zabha/amominu.h.aqrl.yaml +145 -0
  1933. data/.data/spec/std/isa/inst/Zabha/amominu.h.rl.yaml +143 -0
  1934. data/.data/spec/std/isa/inst/Zabha/amominu.h.yaml +141 -0
  1935. data/.data/spec/std/isa/inst/Zabha/amoor.b.aq.yaml +143 -0
  1936. data/.data/spec/std/isa/inst/Zabha/amoor.b.aqrl.yaml +145 -0
  1937. data/.data/spec/std/isa/inst/Zabha/amoor.b.rl.yaml +143 -0
  1938. data/.data/spec/std/isa/inst/Zabha/amoor.b.yaml +141 -0
  1939. data/.data/spec/std/isa/inst/Zabha/amoor.h.aq.yaml +143 -0
  1940. data/.data/spec/std/isa/inst/Zabha/amoor.h.aqrl.yaml +145 -0
  1941. data/.data/spec/std/isa/inst/Zabha/amoor.h.rl.yaml +143 -0
  1942. data/.data/spec/std/isa/inst/Zabha/amoor.h.yaml +141 -0
  1943. data/.data/spec/std/isa/inst/Zabha/amoswap.b.aq.yaml +142 -0
  1944. data/.data/spec/std/isa/inst/Zabha/amoswap.b.aqrl.yaml +144 -0
  1945. data/.data/spec/std/isa/inst/Zabha/amoswap.b.rl.yaml +142 -0
  1946. data/.data/spec/std/isa/inst/Zabha/amoswap.b.yaml +140 -0
  1947. data/.data/spec/std/isa/inst/Zabha/amoswap.h.aq.yaml +142 -0
  1948. data/.data/spec/std/isa/inst/Zabha/amoswap.h.aqrl.yaml +144 -0
  1949. data/.data/spec/std/isa/inst/Zabha/amoswap.h.rl.yaml +142 -0
  1950. data/.data/spec/std/isa/inst/Zabha/amoswap.h.yaml +140 -0
  1951. data/.data/spec/std/isa/inst/Zabha/amoxor.b.aq.yaml +143 -0
  1952. data/.data/spec/std/isa/inst/Zabha/amoxor.b.aqrl.yaml +145 -0
  1953. data/.data/spec/std/isa/inst/Zabha/amoxor.b.rl.yaml +143 -0
  1954. data/.data/spec/std/isa/inst/Zabha/amoxor.b.yaml +141 -0
  1955. data/.data/spec/std/isa/inst/Zabha/amoxor.h.aq.yaml +143 -0
  1956. data/.data/spec/std/isa/inst/Zabha/amoxor.h.aqrl.yaml +145 -0
  1957. data/.data/spec/std/isa/inst/Zabha/amoxor.h.rl.yaml +143 -0
  1958. data/.data/spec/std/isa/inst/Zabha/amoxor.h.yaml +141 -0
  1959. data/.data/spec/std/isa/inst/Zacas/amocas.SIZE.AQRL.layout +174 -0
  1960. data/.data/spec/std/isa/inst/Zacas/amocas.d.aq.yaml +135 -0
  1961. data/.data/spec/std/isa/inst/Zacas/amocas.d.aqrl.yaml +137 -0
  1962. data/.data/spec/std/isa/inst/Zacas/amocas.d.rl.yaml +135 -0
  1963. data/.data/spec/std/isa/inst/Zacas/amocas.d.yaml +133 -0
  1964. data/.data/spec/std/isa/inst/Zacas/amocas.q.aq.yaml +137 -0
  1965. data/.data/spec/std/isa/inst/Zacas/amocas.q.aqrl.yaml +139 -0
  1966. data/.data/spec/std/isa/inst/Zacas/amocas.q.rl.yaml +137 -0
  1967. data/.data/spec/std/isa/inst/Zacas/amocas.q.yaml +135 -0
  1968. data/.data/spec/std/isa/inst/Zacas/amocas.w.aq.yaml +135 -0
  1969. data/.data/spec/std/isa/inst/Zacas/amocas.w.aqrl.yaml +137 -0
  1970. data/.data/spec/std/isa/inst/Zacas/amocas.w.rl.yaml +135 -0
  1971. data/.data/spec/std/isa/inst/Zacas/amocas.w.yaml +133 -0
  1972. data/.data/spec/std/isa/inst/Zalasr/lSIZE.AQRL.layout +80 -0
  1973. data/.data/spec/std/isa/inst/Zalasr/lb.aq.yaml +65 -0
  1974. data/.data/spec/std/isa/inst/Zalasr/lb.aqrl.yaml +65 -0
  1975. data/.data/spec/std/isa/inst/Zalasr/ld.aq.yaml +65 -0
  1976. data/.data/spec/std/isa/inst/Zalasr/ld.aqrl.yaml +65 -0
  1977. data/.data/spec/std/isa/inst/Zalasr/lh.aq.yaml +65 -0
  1978. data/.data/spec/std/isa/inst/Zalasr/lh.aqrl.yaml +65 -0
  1979. data/.data/spec/std/isa/inst/Zalasr/lw.aq.yaml +65 -0
  1980. data/.data/spec/std/isa/inst/Zalasr/lw.aqrl.yaml +65 -0
  1981. data/.data/spec/std/isa/inst/Zalasr/sSIZE.AQRL.layout +95 -0
  1982. data/.data/spec/std/isa/inst/Zalasr/sb.aqrl.yaml +80 -0
  1983. data/.data/spec/std/isa/inst/Zalasr/sb.rl.yaml +80 -0
  1984. data/.data/spec/std/isa/inst/Zalasr/sd.aqrl.yaml +80 -0
  1985. data/.data/spec/std/isa/inst/Zalasr/sd.rl.yaml +80 -0
  1986. data/.data/spec/std/isa/inst/Zalasr/sh.aqrl.yaml +80 -0
  1987. data/.data/spec/std/isa/inst/Zalasr/sh.rl.yaml +80 -0
  1988. data/.data/spec/std/isa/inst/Zalasr/sw.aqrl.yaml +80 -0
  1989. data/.data/spec/std/isa/inst/Zalasr/sw.rl.yaml +80 -0
  1990. data/.data/spec/std/isa/inst/Zalrsc/lr.SIZE.AQRL.layout +205 -0
  1991. data/.data/spec/std/isa/inst/Zalrsc/lr.d.aq.yaml +151 -0
  1992. data/.data/spec/std/isa/inst/Zalrsc/lr.d.aqrl.yaml +151 -0
  1993. data/.data/spec/std/isa/inst/Zalrsc/lr.d.rl.yaml +151 -0
  1994. data/.data/spec/std/isa/inst/Zalrsc/lr.d.yaml +151 -0
  1995. data/.data/spec/std/isa/inst/Zalrsc/lr.w.aq.yaml +158 -0
  1996. data/.data/spec/std/isa/inst/Zalrsc/lr.w.aqrl.yaml +158 -0
  1997. data/.data/spec/std/isa/inst/Zalrsc/lr.w.rl.yaml +158 -0
  1998. data/.data/spec/std/isa/inst/Zalrsc/lr.w.yaml +158 -0
  1999. data/.data/spec/std/isa/inst/Zalrsc/sc.SIZE.AQRL.layout +288 -0
  2000. data/.data/spec/std/isa/inst/Zalrsc/sc.d.aq.yaml +245 -0
  2001. data/.data/spec/std/isa/inst/Zalrsc/sc.d.aqrl.yaml +245 -0
  2002. data/.data/spec/std/isa/inst/Zalrsc/sc.d.rl.yaml +245 -0
  2003. data/.data/spec/std/isa/inst/Zalrsc/sc.d.yaml +245 -0
  2004. data/.data/spec/std/isa/inst/Zalrsc/sc.w.aq.yaml +247 -0
  2005. data/.data/spec/std/isa/inst/Zalrsc/sc.w.aqrl.yaml +247 -0
  2006. data/.data/spec/std/isa/inst/Zalrsc/sc.w.rl.yaml +247 -0
  2007. data/.data/spec/std/isa/inst/Zalrsc/sc.w.yaml +247 -0
  2008. data/.data/spec/std/isa/inst/Zawrs/wrs.nto.yaml +77 -0
  2009. data/.data/spec/std/isa/inst/Zawrs/wrs.sto.yaml +57 -0
  2010. data/.data/spec/std/isa/inst/Zba/add.uw.yaml +63 -0
  2011. data/.data/spec/std/isa/inst/Zba/sh1add.uw.yaml +59 -0
  2012. data/.data/spec/std/isa/inst/Zba/sh1add.yaml +54 -0
  2013. data/.data/spec/std/isa/inst/Zba/sh2add.uw.yaml +59 -0
  2014. data/.data/spec/std/isa/inst/Zba/sh2add.yaml +54 -0
  2015. data/.data/spec/std/isa/inst/Zba/sh3add.uw.yaml +59 -0
  2016. data/.data/spec/std/isa/inst/Zba/sh3add.yaml +54 -0
  2017. data/.data/spec/std/isa/inst/Zba/slli.uw.yaml +54 -0
  2018. data/.data/spec/std/isa/inst/Zbb/clz.yaml +54 -0
  2019. data/.data/spec/std/isa/inst/Zbb/clzw.yaml +55 -0
  2020. data/.data/spec/std/isa/inst/Zbb/cpop.yaml +69 -0
  2021. data/.data/spec/std/isa/inst/Zbb/cpopw.yaml +71 -0
  2022. data/.data/spec/std/isa/inst/Zbb/ctz.yaml +59 -0
  2023. data/.data/spec/std/isa/inst/Zbb/ctzw.yaml +57 -0
  2024. data/.data/spec/std/isa/inst/Zbb/max.yaml +71 -0
  2025. data/.data/spec/std/isa/inst/Zbb/maxu.yaml +63 -0
  2026. data/.data/spec/std/isa/inst/Zbb/min.yaml +63 -0
  2027. data/.data/spec/std/isa/inst/Zbb/minu.yaml +63 -0
  2028. data/.data/spec/std/isa/inst/Zbb/orc.b.yaml +59 -0
  2029. data/.data/spec/std/isa/inst/Zbb/sext.b.yaml +55 -0
  2030. data/.data/spec/std/isa/inst/Zbb/sext.h.yaml +55 -0
  2031. data/.data/spec/std/isa/inst/Zbb/zext.h.yaml +69 -0
  2032. data/.data/spec/std/isa/inst/Zbc/clmulr.yaml +61 -0
  2033. data/.data/spec/std/isa/inst/Zbkb/brev8.yaml +51 -0
  2034. data/.data/spec/std/isa/inst/Zbkb/pack.yaml +34 -0
  2035. data/.data/spec/std/isa/inst/Zbkb/packh.yaml +31 -0
  2036. data/.data/spec/std/isa/inst/Zbkb/packw.yaml +36 -0
  2037. data/.data/spec/std/isa/inst/Zbkb/unzip.yaml +53 -0
  2038. data/.data/spec/std/isa/inst/Zbkb/zip.yaml +53 -0
  2039. data/.data/spec/std/isa/inst/Zbkx/xperm4.yaml +64 -0
  2040. data/.data/spec/std/isa/inst/Zbkx/xperm8.yaml +64 -0
  2041. data/.data/spec/std/isa/inst/Zbs/bclr.yaml +59 -0
  2042. data/.data/spec/std/isa/inst/Zbs/bclri.yaml +69 -0
  2043. data/.data/spec/std/isa/inst/Zbs/bext.yaml +59 -0
  2044. data/.data/spec/std/isa/inst/Zbs/bexti.yaml +69 -0
  2045. data/.data/spec/std/isa/inst/Zbs/binv.yaml +59 -0
  2046. data/.data/spec/std/isa/inst/Zbs/binvi.yaml +69 -0
  2047. data/.data/spec/std/isa/inst/Zbs/bset.yaml +59 -0
  2048. data/.data/spec/std/isa/inst/Zbs/bseti.yaml +69 -0
  2049. data/.data/spec/std/isa/inst/Zcb/c.lbu.yaml +72 -0
  2050. data/.data/spec/std/isa/inst/Zcb/c.lh.yaml +73 -0
  2051. data/.data/spec/std/isa/inst/Zcb/c.lhu.yaml +73 -0
  2052. data/.data/spec/std/isa/inst/Zcb/c.mul.yaml +53 -0
  2053. data/.data/spec/std/isa/inst/Zcb/c.not.yaml +45 -0
  2054. data/.data/spec/std/isa/inst/Zcb/c.sb.yaml +39 -0
  2055. data/.data/spec/std/isa/inst/Zcb/c.sext.b.yaml +60 -0
  2056. data/.data/spec/std/isa/inst/Zcb/c.sext.h.yaml +60 -0
  2057. data/.data/spec/std/isa/inst/Zcb/c.sh.yaml +40 -0
  2058. data/.data/spec/std/isa/inst/Zcb/c.zext.b.yaml +60 -0
  2059. data/.data/spec/std/isa/inst/Zcb/c.zext.h.yaml +60 -0
  2060. data/.data/spec/std/isa/inst/Zcb/c.zext.w.yaml +61 -0
  2061. data/.data/spec/std/isa/inst/Zcd/c.fld.yaml +41 -0
  2062. data/.data/spec/std/isa/inst/Zcd/c.fldsp.yaml +42 -0
  2063. data/.data/spec/std/isa/inst/Zcd/c.fsd.yaml +41 -0
  2064. data/.data/spec/std/isa/inst/Zcd/c.fsdsp.yaml +42 -0
  2065. data/.data/spec/std/isa/inst/Zcf/c.flw.yaml +41 -0
  2066. data/.data/spec/std/isa/inst/Zcf/c.flwsp.yaml +42 -0
  2067. data/.data/spec/std/isa/inst/Zcf/c.fsw.yaml +41 -0
  2068. data/.data/spec/std/isa/inst/Zcf/c.fswsp.yaml +42 -0
  2069. data/.data/spec/std/isa/inst/Zcmop/c.mop.1.yaml +31 -0
  2070. data/.data/spec/std/isa/inst/Zcmop/c.mop.11.yaml +31 -0
  2071. data/.data/spec/std/isa/inst/Zcmop/c.mop.13.yaml +31 -0
  2072. data/.data/spec/std/isa/inst/Zcmop/c.mop.15.yaml +31 -0
  2073. data/.data/spec/std/isa/inst/Zcmop/c.mop.3.yaml +31 -0
  2074. data/.data/spec/std/isa/inst/Zcmop/c.mop.5.yaml +31 -0
  2075. data/.data/spec/std/isa/inst/Zcmop/c.mop.7.yaml +31 -0
  2076. data/.data/spec/std/isa/inst/Zcmop/c.mop.9.yaml +31 -0
  2077. data/.data/spec/std/isa/inst/Zcmop/c.mop.N.layout +45 -0
  2078. data/.data/spec/std/isa/inst/Zcmp/cm.mva01s.yaml +36 -0
  2079. data/.data/spec/std/isa/inst/Zcmp/cm.mvsa01.yaml +38 -0
  2080. data/.data/spec/std/isa/inst/Zcmp/cm.pop.yaml +86 -0
  2081. data/.data/spec/std/isa/inst/Zcmp/cm.popret.yaml +87 -0
  2082. data/.data/spec/std/isa/inst/Zcmp/cm.popretz.yaml +88 -0
  2083. data/.data/spec/std/isa/inst/Zcmp/cm.push.yaml +87 -0
  2084. data/.data/spec/std/isa/inst/Zcmt/cm.jalt.yaml +65 -0
  2085. data/.data/spec/std/isa/inst/Zcmt/cm.jt.yaml +60 -0
  2086. data/.data/spec/std/isa/inst/Zfa/fli.s.yaml +74 -0
  2087. data/.data/spec/std/isa/inst/Zfa/fmaxm.s.yaml +55 -0
  2088. data/.data/spec/std/isa/inst/Zfa/fminm.s.yaml +55 -0
  2089. data/.data/spec/std/isa/inst/Zfa/fround.s.yaml +63 -0
  2090. data/.data/spec/std/isa/inst/Zfa/froundnx.s.yaml +53 -0
  2091. data/.data/spec/std/isa/inst/Zfbfmin/fcvt.bf16.s.yaml +31 -0
  2092. data/.data/spec/std/isa/inst/Zfbfmin/fcvt.s.bf16.yaml +31 -0
  2093. data/.data/spec/std/isa/inst/Zfh/fadd.h.yaml +35 -0
  2094. data/.data/spec/std/isa/inst/Zfh/fclass.h.yaml +31 -0
  2095. data/.data/spec/std/isa/inst/Zfh/fcvt.d.h.yaml +37 -0
  2096. data/.data/spec/std/isa/inst/Zfh/fcvt.h.d.yaml +37 -0
  2097. data/.data/spec/std/isa/inst/Zfh/fcvt.h.l.yaml +35 -0
  2098. data/.data/spec/std/isa/inst/Zfh/fcvt.h.lu.yaml +35 -0
  2099. data/.data/spec/std/isa/inst/Zfh/fcvt.h.s.yaml +94 -0
  2100. data/.data/spec/std/isa/inst/Zfh/fcvt.h.w.yaml +33 -0
  2101. data/.data/spec/std/isa/inst/Zfh/fcvt.h.wu.yaml +33 -0
  2102. data/.data/spec/std/isa/inst/Zfh/fcvt.l.h.yaml +35 -0
  2103. data/.data/spec/std/isa/inst/Zfh/fcvt.lu.h.yaml +35 -0
  2104. data/.data/spec/std/isa/inst/Zfh/fcvt.s.h.yaml +91 -0
  2105. data/.data/spec/std/isa/inst/Zfh/fcvt.w.h.yaml +33 -0
  2106. data/.data/spec/std/isa/inst/Zfh/fcvt.wu.h.yaml +33 -0
  2107. data/.data/spec/std/isa/inst/Zfh/fdiv.h.yaml +35 -0
  2108. data/.data/spec/std/isa/inst/Zfh/feq.h.yaml +33 -0
  2109. data/.data/spec/std/isa/inst/Zfh/fle.h.yaml +33 -0
  2110. data/.data/spec/std/isa/inst/Zfh/fleq.h.yaml +33 -0
  2111. data/.data/spec/std/isa/inst/Zfh/flh.yaml +78 -0
  2112. data/.data/spec/std/isa/inst/Zfh/fli.h.yaml +31 -0
  2113. data/.data/spec/std/isa/inst/Zfh/flt.h.yaml +33 -0
  2114. data/.data/spec/std/isa/inst/Zfh/fltq.h.yaml +33 -0
  2115. data/.data/spec/std/isa/inst/Zfh/fmadd.h.yaml +37 -0
  2116. data/.data/spec/std/isa/inst/Zfh/fmax.h.yaml +33 -0
  2117. data/.data/spec/std/isa/inst/Zfh/fmaxm.h.yaml +33 -0
  2118. data/.data/spec/std/isa/inst/Zfh/fmin.h.yaml +33 -0
  2119. data/.data/spec/std/isa/inst/Zfh/fminm.h.yaml +33 -0
  2120. data/.data/spec/std/isa/inst/Zfh/fmsub.h.yaml +37 -0
  2121. data/.data/spec/std/isa/inst/Zfh/fmul.h.yaml +35 -0
  2122. data/.data/spec/std/isa/inst/Zfh/fmv.h.x.yaml +51 -0
  2123. data/.data/spec/std/isa/inst/Zfh/fmv.x.h.yaml +51 -0
  2124. data/.data/spec/std/isa/inst/Zfh/fnmadd.h.yaml +37 -0
  2125. data/.data/spec/std/isa/inst/Zfh/fnmsub.h.yaml +37 -0
  2126. data/.data/spec/std/isa/inst/Zfh/fround.h.yaml +33 -0
  2127. data/.data/spec/std/isa/inst/Zfh/froundnx.h.yaml +33 -0
  2128. data/.data/spec/std/isa/inst/Zfh/fsgnj.h.yaml +33 -0
  2129. data/.data/spec/std/isa/inst/Zfh/fsgnjn.h.yaml +33 -0
  2130. data/.data/spec/std/isa/inst/Zfh/fsgnjx.h.yaml +33 -0
  2131. data/.data/spec/std/isa/inst/Zfh/fsh.yaml +89 -0
  2132. data/.data/spec/std/isa/inst/Zfh/fsqrt.h.yaml +33 -0
  2133. data/.data/spec/std/isa/inst/Zfh/fsub.h.yaml +35 -0
  2134. data/.data/spec/std/isa/inst/Zicbom/cbo.clean.yaml +77 -0
  2135. data/.data/spec/std/isa/inst/Zicbom/cbo.flush.yaml +75 -0
  2136. data/.data/spec/std/isa/inst/Zicbom/cbo.inval.yaml +116 -0
  2137. data/.data/spec/std/isa/inst/Zicbop/prefetch.i.yaml +34 -0
  2138. data/.data/spec/std/isa/inst/Zicbop/prefetch.r.yaml +34 -0
  2139. data/.data/spec/std/isa/inst/Zicbop/prefetch.w.yaml +34 -0
  2140. data/.data/spec/std/isa/inst/Zicboz/cbo.zero.yaml +107 -0
  2141. data/.data/spec/std/isa/inst/Zicfilp/lpad.yaml +28 -0
  2142. data/.data/spec/std/isa/inst/Zicfiss/ssamoswap.d.yaml +35 -0
  2143. data/.data/spec/std/isa/inst/Zicfiss/ssamoswap.w.yaml +35 -0
  2144. data/.data/spec/std/isa/inst/Zicfiss/sspopchk.x1.yaml +25 -0
  2145. data/.data/spec/std/isa/inst/Zicfiss/sspopchk.x5.yaml +25 -0
  2146. data/.data/spec/std/isa/inst/Zicfiss/sspush.x1.yaml +25 -0
  2147. data/.data/spec/std/isa/inst/Zicfiss/sspush.x5.yaml +25 -0
  2148. data/.data/spec/std/isa/inst/Zicfiss/ssrdp.yaml +28 -0
  2149. data/.data/spec/std/isa/inst/Zicond/czero.eqz.yaml +50 -0
  2150. data/.data/spec/std/isa/inst/Zicond/czero.nez.yaml +50 -0
  2151. data/.data/spec/std/isa/inst/Zicsr/csrrc.yaml +68 -0
  2152. data/.data/spec/std/isa/inst/Zicsr/csrrci.yaml +62 -0
  2153. data/.data/spec/std/isa/inst/Zicsr/csrrs.yaml +114 -0
  2154. data/.data/spec/std/isa/inst/Zicsr/csrrsi.yaml +62 -0
  2155. data/.data/spec/std/isa/inst/Zicsr/csrrw.yaml +90 -0
  2156. data/.data/spec/std/isa/inst/Zicsr/csrrwi.yaml +88 -0
  2157. data/.data/spec/std/isa/inst/Zifencei/fence.i.yaml +65 -0
  2158. data/.data/spec/std/isa/inst/Zihintntl/c.ntl.all.yaml +27 -0
  2159. data/.data/spec/std/isa/inst/Zihintntl/c.ntl.p1.yaml +27 -0
  2160. data/.data/spec/std/isa/inst/Zihintntl/c.ntl.pall.yaml +27 -0
  2161. data/.data/spec/std/isa/inst/Zihintntl/c.ntl.s1.yaml +27 -0
  2162. data/.data/spec/std/isa/inst/Zihintntl/ntl.all.yaml +25 -0
  2163. data/.data/spec/std/isa/inst/Zihintntl/ntl.p1.yaml +25 -0
  2164. data/.data/spec/std/isa/inst/Zihintntl/ntl.pall.yaml +25 -0
  2165. data/.data/spec/std/isa/inst/Zihintntl/ntl.s1.yaml +25 -0
  2166. data/.data/spec/std/isa/inst/Zihintpause/pause.yaml +76 -0
  2167. data/.data/spec/std/isa/inst/Zimop/mop.r.0.yaml +36 -0
  2168. data/.data/spec/std/isa/inst/Zimop/mop.r.1.yaml +36 -0
  2169. data/.data/spec/std/isa/inst/Zimop/mop.r.10.yaml +36 -0
  2170. data/.data/spec/std/isa/inst/Zimop/mop.r.11.yaml +36 -0
  2171. data/.data/spec/std/isa/inst/Zimop/mop.r.12.yaml +36 -0
  2172. data/.data/spec/std/isa/inst/Zimop/mop.r.13.yaml +36 -0
  2173. data/.data/spec/std/isa/inst/Zimop/mop.r.14.yaml +36 -0
  2174. data/.data/spec/std/isa/inst/Zimop/mop.r.15.yaml +36 -0
  2175. data/.data/spec/std/isa/inst/Zimop/mop.r.16.yaml +36 -0
  2176. data/.data/spec/std/isa/inst/Zimop/mop.r.17.yaml +36 -0
  2177. data/.data/spec/std/isa/inst/Zimop/mop.r.18.yaml +36 -0
  2178. data/.data/spec/std/isa/inst/Zimop/mop.r.19.yaml +36 -0
  2179. data/.data/spec/std/isa/inst/Zimop/mop.r.2.yaml +36 -0
  2180. data/.data/spec/std/isa/inst/Zimop/mop.r.20.yaml +36 -0
  2181. data/.data/spec/std/isa/inst/Zimop/mop.r.21.yaml +36 -0
  2182. data/.data/spec/std/isa/inst/Zimop/mop.r.22.yaml +36 -0
  2183. data/.data/spec/std/isa/inst/Zimop/mop.r.23.yaml +36 -0
  2184. data/.data/spec/std/isa/inst/Zimop/mop.r.24.yaml +36 -0
  2185. data/.data/spec/std/isa/inst/Zimop/mop.r.25.yaml +36 -0
  2186. data/.data/spec/std/isa/inst/Zimop/mop.r.26.yaml +36 -0
  2187. data/.data/spec/std/isa/inst/Zimop/mop.r.27.yaml +36 -0
  2188. data/.data/spec/std/isa/inst/Zimop/mop.r.28.yaml +40 -0
  2189. data/.data/spec/std/isa/inst/Zimop/mop.r.29.yaml +36 -0
  2190. data/.data/spec/std/isa/inst/Zimop/mop.r.3.yaml +36 -0
  2191. data/.data/spec/std/isa/inst/Zimop/mop.r.30.yaml +36 -0
  2192. data/.data/spec/std/isa/inst/Zimop/mop.r.31.yaml +36 -0
  2193. data/.data/spec/std/isa/inst/Zimop/mop.r.4.yaml +36 -0
  2194. data/.data/spec/std/isa/inst/Zimop/mop.r.5.yaml +36 -0
  2195. data/.data/spec/std/isa/inst/Zimop/mop.r.6.yaml +36 -0
  2196. data/.data/spec/std/isa/inst/Zimop/mop.r.7.yaml +36 -0
  2197. data/.data/spec/std/isa/inst/Zimop/mop.r.8.yaml +36 -0
  2198. data/.data/spec/std/isa/inst/Zimop/mop.r.9.yaml +36 -0
  2199. data/.data/spec/std/isa/inst/Zimop/mop.r.N.layout +58 -0
  2200. data/.data/spec/std/isa/inst/Zimop/mop.rr.0.yaml +39 -0
  2201. data/.data/spec/std/isa/inst/Zimop/mop.rr.1.yaml +39 -0
  2202. data/.data/spec/std/isa/inst/Zimop/mop.rr.2.yaml +39 -0
  2203. data/.data/spec/std/isa/inst/Zimop/mop.rr.3.yaml +39 -0
  2204. data/.data/spec/std/isa/inst/Zimop/mop.rr.4.yaml +39 -0
  2205. data/.data/spec/std/isa/inst/Zimop/mop.rr.5.yaml +39 -0
  2206. data/.data/spec/std/isa/inst/Zimop/mop.rr.6.yaml +39 -0
  2207. data/.data/spec/std/isa/inst/Zimop/mop.rr.7.yaml +42 -0
  2208. data/.data/spec/std/isa/inst/Zimop/mop.rr.N.layout +58 -0
  2209. data/.data/spec/std/isa/inst/Zkn/aes64ks1i.yaml +37 -0
  2210. data/.data/spec/std/isa/inst/Zkn/aes64ks2.yaml +36 -0
  2211. data/.data/spec/std/isa/inst/Zknd/aes32dsi.yaml +37 -0
  2212. data/.data/spec/std/isa/inst/Zknd/aes32dsmi.yaml +38 -0
  2213. data/.data/spec/std/isa/inst/Zknd/aes64ds.yaml +34 -0
  2214. data/.data/spec/std/isa/inst/Zknd/aes64dsm.yaml +34 -0
  2215. data/.data/spec/std/isa/inst/Zknd/aes64im.yaml +33 -0
  2216. data/.data/spec/std/isa/inst/Zkne/aes32esi.yaml +35 -0
  2217. data/.data/spec/std/isa/inst/Zkne/aes32esmi.yaml +35 -0
  2218. data/.data/spec/std/isa/inst/Zkne/aes64es.yaml +34 -0
  2219. data/.data/spec/std/isa/inst/Zkne/aes64esm.yaml +34 -0
  2220. data/.data/spec/std/isa/inst/Zknh/sha256sig0.yaml +29 -0
  2221. data/.data/spec/std/isa/inst/Zknh/sha256sig1.yaml +29 -0
  2222. data/.data/spec/std/isa/inst/Zknh/sha256sum0.yaml +29 -0
  2223. data/.data/spec/std/isa/inst/Zknh/sha256sum1.yaml +29 -0
  2224. data/.data/spec/std/isa/inst/Zknh/sha512sig0.yaml +31 -0
  2225. data/.data/spec/std/isa/inst/Zknh/sha512sig0h.yaml +33 -0
  2226. data/.data/spec/std/isa/inst/Zknh/sha512sig0l.yaml +33 -0
  2227. data/.data/spec/std/isa/inst/Zknh/sha512sig1.yaml +31 -0
  2228. data/.data/spec/std/isa/inst/Zknh/sha512sig1h.yaml +33 -0
  2229. data/.data/spec/std/isa/inst/Zknh/sha512sig1l.yaml +33 -0
  2230. data/.data/spec/std/isa/inst/Zknh/sha512sum0.yaml +31 -0
  2231. data/.data/spec/std/isa/inst/Zknh/sha512sum0r.yaml +33 -0
  2232. data/.data/spec/std/isa/inst/Zknh/sha512sum1.yaml +31 -0
  2233. data/.data/spec/std/isa/inst/Zknh/sha512sum1r.yaml +33 -0
  2234. data/.data/spec/std/isa/inst/Zks/sm3p0.yaml +29 -0
  2235. data/.data/spec/std/isa/inst/Zks/sm3p1.yaml +29 -0
  2236. data/.data/spec/std/isa/inst/Zks/sm4ed.yaml +33 -0
  2237. data/.data/spec/std/isa/inst/Zks/sm4ks.yaml +33 -0
  2238. data/.data/spec/std/isa/inst/Zvbb/vandn.vv.yaml +33 -0
  2239. data/.data/spec/std/isa/inst/Zvbb/vandn.vx.yaml +33 -0
  2240. data/.data/spec/std/isa/inst/Zvbb/vbrev.v.yaml +31 -0
  2241. data/.data/spec/std/isa/inst/Zvbb/vbrev8.v.yaml +31 -0
  2242. data/.data/spec/std/isa/inst/Zvbb/vclz.v.yaml +31 -0
  2243. data/.data/spec/std/isa/inst/Zvbb/vcpop.v.yaml +31 -0
  2244. data/.data/spec/std/isa/inst/Zvbb/vctz.v.yaml +31 -0
  2245. data/.data/spec/std/isa/inst/Zvbb/vrev8.v.yaml +31 -0
  2246. data/.data/spec/std/isa/inst/Zvbb/vrol.vv.yaml +33 -0
  2247. data/.data/spec/std/isa/inst/Zvbb/vrol.vx.yaml +33 -0
  2248. data/.data/spec/std/isa/inst/Zvbb/vror.vi.yaml +33 -0
  2249. data/.data/spec/std/isa/inst/Zvbb/vror.vv.yaml +33 -0
  2250. data/.data/spec/std/isa/inst/Zvbb/vror.vx.yaml +33 -0
  2251. data/.data/spec/std/isa/inst/Zvbb/vwsll.vi.yaml +33 -0
  2252. data/.data/spec/std/isa/inst/Zvbb/vwsll.vv.yaml +33 -0
  2253. data/.data/spec/std/isa/inst/Zvbb/vwsll.vx.yaml +33 -0
  2254. data/.data/spec/std/isa/inst/Zvbc/vclmul.vv.yaml +33 -0
  2255. data/.data/spec/std/isa/inst/Zvbc/vclmul.vx.yaml +33 -0
  2256. data/.data/spec/std/isa/inst/Zvbc/vclmulh.vv.yaml +33 -0
  2257. data/.data/spec/std/isa/inst/Zvbc/vclmulh.vx.yaml +33 -0
  2258. data/.data/spec/std/isa/inst/Zvfbfmin/vfncvtbf16.f.f.w.yaml +31 -0
  2259. data/.data/spec/std/isa/inst/Zvfbfmin/vfwcvtbf16.f.f.v.yaml +31 -0
  2260. data/.data/spec/std/isa/inst/Zvfbfwma/vfwmaccbf16.vf.yaml +33 -0
  2261. data/.data/spec/std/isa/inst/Zvfbfwma/vfwmaccbf16.vv.yaml +33 -0
  2262. data/.data/spec/std/isa/inst/Zvkg/vghsh.vv.yaml +31 -0
  2263. data/.data/spec/std/isa/inst/Zvkg/vgmul.vv.yaml +29 -0
  2264. data/.data/spec/std/isa/inst/Zvkned/vaesdf.vs.yaml +29 -0
  2265. data/.data/spec/std/isa/inst/Zvkned/vaesdf.vv.yaml +29 -0
  2266. data/.data/spec/std/isa/inst/Zvkned/vaesdm.vs.yaml +29 -0
  2267. data/.data/spec/std/isa/inst/Zvkned/vaesdm.vv.yaml +29 -0
  2268. data/.data/spec/std/isa/inst/Zvkned/vaesef.vs.yaml +29 -0
  2269. data/.data/spec/std/isa/inst/Zvkned/vaesef.vv.yaml +29 -0
  2270. data/.data/spec/std/isa/inst/Zvkned/vaesem.vs.yaml +29 -0
  2271. data/.data/spec/std/isa/inst/Zvkned/vaesem.vv.yaml +29 -0
  2272. data/.data/spec/std/isa/inst/Zvkned/vaeskf1.vi.yaml +31 -0
  2273. data/.data/spec/std/isa/inst/Zvkned/vaeskf2.vi.yaml +31 -0
  2274. data/.data/spec/std/isa/inst/Zvkned/vaesz.vs.yaml +29 -0
  2275. data/.data/spec/std/isa/inst/Zvknha/vsha2ch.vv.yaml +31 -0
  2276. data/.data/spec/std/isa/inst/Zvknha/vsha2cl.vv.yaml +31 -0
  2277. data/.data/spec/std/isa/inst/Zvknha/vsha2ms.vv.yaml +31 -0
  2278. data/.data/spec/std/isa/inst/Zvks/vsm3c.vi.yaml +31 -0
  2279. data/.data/spec/std/isa/inst/Zvks/vsm3me.vv.yaml +31 -0
  2280. data/.data/spec/std/isa/inst/Zvks/vsm4k.vi.yaml +31 -0
  2281. data/.data/spec/std/isa/inst/Zvks/vsm4r.vs.yaml +29 -0
  2282. data/.data/spec/std/isa/inst/Zvks/vsm4r.vv.yaml +31 -0
  2283. data/.data/spec/std/isa/inst_opcode/OP-32.yaml +12 -0
  2284. data/.data/spec/std/isa/inst_opcode/OP.yaml +12 -0
  2285. data/.data/spec/std/isa/inst_subtype/I/I-x-x.yaml +21 -0
  2286. data/.data/spec/std/isa/inst_subtype/R/R-x.yaml +21 -0
  2287. data/.data/spec/std/isa/inst_type/I.yaml +22 -0
  2288. data/.data/spec/std/isa/inst_type/R.yaml +24 -0
  2289. data/.data/spec/std/isa/inst_var/I-imm.yaml +12 -0
  2290. data/.data/spec/std/isa/inst_var/xd.yaml +12 -0
  2291. data/.data/spec/std/isa/inst_var/xs1.yaml +12 -0
  2292. data/.data/spec/std/isa/inst_var/xs2.yaml +12 -0
  2293. data/.data/spec/std/isa/inst_var_type/imm.yaml +9 -0
  2294. data/.data/spec/std/isa/inst_var_type/x_dst_reg.yaml +11 -0
  2295. data/.data/spec/std/isa/inst_var_type/x_src_reg.yaml +11 -0
  2296. data/.data/spec/std/isa/interrupt_code/LocalCounterOverflow.yaml +14 -0
  2297. data/.data/spec/std/isa/interrupt_code/MachineExternal.yaml +13 -0
  2298. data/.data/spec/std/isa/interrupt_code/MachineSoftware.yaml +13 -0
  2299. data/.data/spec/std/isa/interrupt_code/MachineTimer.yaml +13 -0
  2300. data/.data/spec/std/isa/interrupt_code/SupervisorExternal.yaml +13 -0
  2301. data/.data/spec/std/isa/interrupt_code/SupervisorGuestExternal.yaml +13 -0
  2302. data/.data/spec/std/isa/interrupt_code/SupervisorSoftware.yaml +13 -0
  2303. data/.data/spec/std/isa/interrupt_code/SupervisorTimer.yaml +13 -0
  2304. data/.data/spec/std/isa/interrupt_code/VirtualSupervisorExternal.yaml +13 -0
  2305. data/.data/spec/std/isa/interrupt_code/VirtualSupervisorSoftware.yaml +13 -0
  2306. data/.data/spec/std/isa/interrupt_code/VirtualSupervisorTimer.yaml +13 -0
  2307. data/.data/spec/std/isa/isa/builtin_functions.idl +671 -0
  2308. data/.data/spec/std/isa/isa/fetch.idl +74 -0
  2309. data/.data/spec/std/isa/isa/fp.idl +1238 -0
  2310. data/.data/spec/std/isa/isa/globals.isa +3124 -0
  2311. data/.data/spec/std/isa/isa/interrupts.idl +391 -0
  2312. data/.data/spec/std/isa/isa/util.idl +224 -0
  2313. data/.data/spec/std/isa/isa/vec.idl +55 -0
  2314. data/.data/spec/std/isa/manual/isa.yaml +16 -0
  2315. data/.data/spec/std/isa/manual_version/isa/20240411/isa_20240411.yaml +222 -0
  2316. data/.data/spec/std/isa/param/ARCH_ID_VALUE.yaml +32 -0
  2317. data/.data/spec/std/isa/param/ASID_WIDTH.yaml +23 -0
  2318. data/.data/spec/std/isa/param/CACHE_BLOCK_SIZE.yaml +22 -0
  2319. data/.data/spec/std/isa/param/CONFIG_PTR_ADDRESS.yaml +28 -0
  2320. data/.data/spec/std/isa/param/COUNTINHIBIT_EN.yaml +30 -0
  2321. data/.data/spec/std/isa/param/DBG_HCONTEXT_WIDTH.yaml +18 -0
  2322. data/.data/spec/std/isa/param/DBG_SCONTEXT_WIDTH.yaml +18 -0
  2323. data/.data/spec/std/isa/param/DCSR_MPRVEN_TYPE.yaml +23 -0
  2324. data/.data/spec/std/isa/param/DCSR_STEPIE_TYPE.yaml +23 -0
  2325. data/.data/spec/std/isa/param/DCSR_STOPCOUNT_TYPE.yaml +23 -0
  2326. data/.data/spec/std/isa/param/DCSR_STOPTIME_TYPE.yaml +23 -0
  2327. data/.data/spec/std/isa/param/ELEN.yaml +20 -0
  2328. data/.data/spec/std/isa/param/FOLLOW_VTYPE_RESET_RECOMMENDATION.yaml +18 -0
  2329. data/.data/spec/std/isa/param/FORCE_UPGRADE_CBO_INVAL_TO_FLUSH.yaml +20 -0
  2330. data/.data/spec/std/isa/param/GSTAGE_MODE_BARE.yaml +24 -0
  2331. data/.data/spec/std/isa/param/HCONTEXT_AVAILABLE.yaml +19 -0
  2332. data/.data/spec/std/isa/param/HCOUNTENABLE_EN.yaml +27 -0
  2333. data/.data/spec/std/isa/param/HPM_COUNTER_EN.yaml +29 -0
  2334. data/.data/spec/std/isa/param/HPM_EVENTS.yaml +23 -0
  2335. data/.data/spec/std/isa/param/HSTATEEN_AIA_TYPE.yaml +34 -0
  2336. data/.data/spec/std/isa/param/HSTATEEN_CONTEXT_TYPE.yaml +35 -0
  2337. data/.data/spec/std/isa/param/HSTATEEN_CSRIND_TYPE.yaml +34 -0
  2338. data/.data/spec/std/isa/param/HSTATEEN_ENVCFG_TYPE.yaml +36 -0
  2339. data/.data/spec/std/isa/param/HSTATEEN_IMSIC_TYPE.yaml +34 -0
  2340. data/.data/spec/std/isa/param/HSTATEEN_JVT_TYPE.yaml +33 -0
  2341. data/.data/spec/std/isa/param/HW_MSTATUS_FS_DIRTY_UPDATE.yaml +30 -0
  2342. data/.data/spec/std/isa/param/HW_MSTATUS_VS_DIRTY_UPDATE.yaml +30 -0
  2343. data/.data/spec/std/isa/param/IGNORE_INVALID_VSATP_MODE_WRITES_WHEN_V_EQ_ZERO.yaml +18 -0
  2344. data/.data/spec/std/isa/param/IMPRECISE_VECTOR_TRAP_SETTABLE.yaml +19 -0
  2345. data/.data/spec/std/isa/param/IMP_ID_VALUE.yaml +25 -0
  2346. data/.data/spec/std/isa/param/JVT_BASE_MASK.yaml +28 -0
  2347. data/.data/spec/std/isa/param/JVT_BASE_TYPE.yaml +20 -0
  2348. data/.data/spec/std/isa/param/JVT_READ_ONLY.yaml +16 -0
  2349. data/.data/spec/std/isa/param/LEGAL_VSTART.yaml +21 -0
  2350. data/.data/spec/std/isa/param/LRSC_FAIL_ON_NON_EXACT_LRSC.yaml +18 -0
  2351. data/.data/spec/std/isa/param/LRSC_FAIL_ON_VA_SYNONYM.yaml +17 -0
  2352. data/.data/spec/std/isa/param/LRSC_MISALIGNED_BEHAVIOR.yaml +24 -0
  2353. data/.data/spec/std/isa/param/LRSC_RESERVATION_STRATEGY.yaml +26 -0
  2354. data/.data/spec/std/isa/param/MARCHID_IMPLEMENTED.yaml +17 -0
  2355. data/.data/spec/std/isa/param/MCID_WIDTH.yaml +19 -0
  2356. data/.data/spec/std/isa/param/MCONTEXT_AVAILABLE.yaml +16 -0
  2357. data/.data/spec/std/isa/param/MCOUNTENABLE_EN.yaml +32 -0
  2358. data/.data/spec/std/isa/param/MCTRCTL_CORSWAPINH_IMPLEMENTED.yaml +18 -0
  2359. data/.data/spec/std/isa/param/MCTRCTL_CUSTOM_IMPLEMENTED.yaml +18 -0
  2360. data/.data/spec/std/isa/param/MCTRCTL_DIRCALLINH_IMPLEMENTED.yaml +18 -0
  2361. data/.data/spec/std/isa/param/MCTRCTL_DIRJMPINH_IMPLEMENTED.yaml +18 -0
  2362. data/.data/spec/std/isa/param/MCTRCTL_DIRLJMPINH_IMPLEMENTED.yaml +18 -0
  2363. data/.data/spec/std/isa/param/MCTRCTL_EXCINH_IMPLEMENTED.yaml +18 -0
  2364. data/.data/spec/std/isa/param/MCTRCTL_INDCALLINH_IMPLEMENTED.yaml +18 -0
  2365. data/.data/spec/std/isa/param/MCTRCTL_INDJMPINH_IMPLEMENTED.yaml +18 -0
  2366. data/.data/spec/std/isa/param/MCTRCTL_INDLJMPINH_IMPLEMENTED.yaml +18 -0
  2367. data/.data/spec/std/isa/param/MCTRCTL_INTRINH_IMPLEMENTED.yaml +18 -0
  2368. data/.data/spec/std/isa/param/MCTRCTL_MTE_IMPLEMENTED.yaml +18 -0
  2369. data/.data/spec/std/isa/param/MCTRCTL_NTBREN_IMPLEMENTED.yaml +18 -0
  2370. data/.data/spec/std/isa/param/MCTRCTL_RASEMU_IMPLEMENTED.yaml +18 -0
  2371. data/.data/spec/std/isa/param/MCTRCTL_RETINH_IMPLEMENTED.yaml +18 -0
  2372. data/.data/spec/std/isa/param/MCTRCTL_STE_IMPLEMENTED.yaml +18 -0
  2373. data/.data/spec/std/isa/param/MCTRCTL_TKBRINH_IMPLEMENTED.yaml +18 -0
  2374. data/.data/spec/std/isa/param/MCTRCTL_TRETINH_IMPLEMENTED.yaml +18 -0
  2375. data/.data/spec/std/isa/param/MIMPID_IMPLEMENTED.yaml +17 -0
  2376. data/.data/spec/std/isa/param/MISALIGNED_AMO.yaml +17 -0
  2377. data/.data/spec/std/isa/param/MISALIGNED_LDST.yaml +18 -0
  2378. data/.data/spec/std/isa/param/MISALIGNED_LDST_EXCEPTION_PRIORITY.yaml +39 -0
  2379. data/.data/spec/std/isa/param/MISALIGNED_MAX_ATOMICITY_GRANULE_SIZE.yaml +40 -0
  2380. data/.data/spec/std/isa/param/MISALIGNED_SPLIT_STRATEGY.yaml +29 -0
  2381. data/.data/spec/std/isa/param/MISA_CSR_IMPLEMENTED.yaml +23 -0
  2382. data/.data/spec/std/isa/param/MOCK_1_BIT_INT.yaml +17 -0
  2383. data/.data/spec/std/isa/param/MOCK_25_BIT_INT.yaml +17 -0
  2384. data/.data/spec/std/isa/param/MOCK_2_BIT_INT.yaml +17 -0
  2385. data/.data/spec/std/isa/param/MOCK_32_BIT_INT.yaml +17 -0
  2386. data/.data/spec/std/isa/param/MOCK_64_BIT_INT.yaml +17 -0
  2387. data/.data/spec/std/isa/param/MOCK_ARRAY_BOOL_ARRAY_OF_8_FIRST_2_FALSE.yaml +22 -0
  2388. data/.data/spec/std/isa/param/MOCK_ARRAY_INT_ENUM.yaml +23 -0
  2389. data/.data/spec/std/isa/param/MOCK_ARRAY_MAX_ONLY.yaml +21 -0
  2390. data/.data/spec/std/isa/param/MOCK_ARRAY_MIN_ONLY.yaml +21 -0
  2391. data/.data/spec/std/isa/param/MOCK_ARRAY_STRING_ENUM1.yaml +21 -0
  2392. data/.data/spec/std/isa/param/MOCK_ARRAY_STRING_ENUM2.yaml +21 -0
  2393. data/.data/spec/std/isa/param/MOCK_BOOL_1.yaml +15 -0
  2394. data/.data/spec/std/isa/param/MOCK_BOOL_2.yaml +15 -0
  2395. data/.data/spec/std/isa/param/MOCK_ENUM_2_INTS.yaml +18 -0
  2396. data/.data/spec/std/isa/param/MOCK_ENUM_2_STRINGS.yaml +18 -0
  2397. data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_1023.yaml +17 -0
  2398. data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_127.yaml +17 -0
  2399. data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_128.yaml +17 -0
  2400. data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_2.yaml +17 -0
  2401. data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_999.yaml +17 -0
  2402. data/.data/spec/std/isa/param/MOCK_INT_RANGE_1000_TO_2048.yaml +17 -0
  2403. data/.data/spec/std/isa/param/MOCK_INT_RANGE_1_TO_128.yaml +17 -0
  2404. data/.data/spec/std/isa/param/MSTATEEN_AIA_TYPE.yaml +27 -0
  2405. data/.data/spec/std/isa/param/MSTATEEN_CONTEXT_TYPE.yaml +26 -0
  2406. data/.data/spec/std/isa/param/MSTATEEN_CSRIND_TYPE.yaml +26 -0
  2407. data/.data/spec/std/isa/param/MSTATEEN_ENVCFG_TYPE.yaml +26 -0
  2408. data/.data/spec/std/isa/param/MSTATEEN_IMSIC_TYPE.yaml +27 -0
  2409. data/.data/spec/std/isa/param/MSTATEEN_JVT_TYPE.yaml +27 -0
  2410. data/.data/spec/std/isa/param/MSTATUS_FS_LEGAL_VALUES.yaml +41 -0
  2411. data/.data/spec/std/isa/param/MSTATUS_TVM_IMPLEMENTED.yaml +18 -0
  2412. data/.data/spec/std/isa/param/MSTATUS_VS_LEGAL_VALUES.yaml +45 -0
  2413. data/.data/spec/std/isa/param/MTVAL_WIDTH.yaml +88 -0
  2414. data/.data/spec/std/isa/param/MTVEC_ACCESS.yaml +24 -0
  2415. data/.data/spec/std/isa/param/MTVEC_BASE_ALIGNMENT_DIRECT.yaml +96 -0
  2416. data/.data/spec/std/isa/param/MTVEC_BASE_ALIGNMENT_VECTORED.yaml +96 -0
  2417. data/.data/spec/std/isa/param/MTVEC_ILLEGAL_WRITE_BEHAVIOR.yaml +25 -0
  2418. data/.data/spec/std/isa/param/MTVEC_MODES.yaml +35 -0
  2419. data/.data/spec/std/isa/param/MUTABLE_MISA_A.yaml +19 -0
  2420. data/.data/spec/std/isa/param/MUTABLE_MISA_B.yaml +18 -0
  2421. data/.data/spec/std/isa/param/MUTABLE_MISA_C.yaml +21 -0
  2422. data/.data/spec/std/isa/param/MUTABLE_MISA_D.yaml +21 -0
  2423. data/.data/spec/std/isa/param/MUTABLE_MISA_F.yaml +21 -0
  2424. data/.data/spec/std/isa/param/MUTABLE_MISA_H.yaml +26 -0
  2425. data/.data/spec/std/isa/param/MUTABLE_MISA_M.yaml +21 -0
  2426. data/.data/spec/std/isa/param/MUTABLE_MISA_Q.yaml +21 -0
  2427. data/.data/spec/std/isa/param/MUTABLE_MISA_S.yaml +26 -0
  2428. data/.data/spec/std/isa/param/MUTABLE_MISA_U.yaml +21 -0
  2429. data/.data/spec/std/isa/param/MUTABLE_MISA_V.yaml +17 -0
  2430. data/.data/spec/std/isa/param/MXLEN.yaml +54 -0
  2431. data/.data/spec/std/isa/param/M_MODE_ENDIANNESS.yaml +26 -0
  2432. data/.data/spec/std/isa/param/NUM_EXTERNAL_GUEST_INTERRUPTS.yaml +24 -0
  2433. data/.data/spec/std/isa/param/NUM_PMP_ENTRIES.yaml +42 -0
  2434. data/.data/spec/std/isa/param/PHYS_ADDR_WIDTH.yaml +24 -0
  2435. data/.data/spec/std/isa/param/PMA_GRANULARITY.yaml +21 -0
  2436. data/.data/spec/std/isa/param/PMLEN.yaml +20 -0
  2437. data/.data/spec/std/isa/param/PMP_GRANULARITY.yaml +25 -0
  2438. data/.data/spec/std/isa/param/PRECISE_SYNCHRONOUS_EXCEPTIONS.yaml +17 -0
  2439. data/.data/spec/std/isa/param/RCID_WIDTH.yaml +19 -0
  2440. data/.data/spec/std/isa/param/REPORT_CAUSE_IN_MTVAL_ON_LANDING_PAD_SOFTWARE_CHECK.yaml +18 -0
  2441. data/.data/spec/std/isa/param/REPORT_CAUSE_IN_MTVAL_ON_SHADOW_STACK_SOFTWARE_CHECK.yaml +18 -0
  2442. data/.data/spec/std/isa/param/REPORT_CAUSE_IN_STVAL_ON_LANDING_PAD_SOFTWARE_CHECK.yaml +18 -0
  2443. data/.data/spec/std/isa/param/REPORT_CAUSE_IN_STVAL_ON_SHADOW_STACK_SOFTWARE_CHECK.yaml +18 -0
  2444. data/.data/spec/std/isa/param/REPORT_CAUSE_IN_VSTVAL_ON_LANDING_PAD_SOFTWARE_CHECK.yaml +18 -0
  2445. data/.data/spec/std/isa/param/REPORT_CAUSE_IN_VSTVAL_ON_SHADOW_STACK_SOFTWARE_CHECK.yaml +18 -0
  2446. data/.data/spec/std/isa/param/REPORT_ENCODING_IN_MTVAL_ON_ILLEGAL_INSTRUCTION.yaml +21 -0
  2447. data/.data/spec/std/isa/param/REPORT_ENCODING_IN_STVAL_ON_ILLEGAL_INSTRUCTION.yaml +19 -0
  2448. data/.data/spec/std/isa/param/REPORT_ENCODING_IN_VSTVAL_ON_ILLEGAL_INSTRUCTION.yaml +19 -0
  2449. data/.data/spec/std/isa/param/REPORT_ENCODING_IN_VSTVAL_ON_VIRTUAL_INSTRUCTION.yaml +19 -0
  2450. data/.data/spec/std/isa/param/REPORT_GPA_IN_HTVAL_ON_GUEST_PAGE_FAULT.yaml +19 -0
  2451. data/.data/spec/std/isa/param/REPORT_GPA_IN_TVAL_ON_INSTRUCTION_GUEST_PAGE_FAULT.yaml +18 -0
  2452. data/.data/spec/std/isa/param/REPORT_GPA_IN_TVAL_ON_INTERMEDIATE_GUEST_PAGE_FAULT.yaml +19 -0
  2453. data/.data/spec/std/isa/param/REPORT_GPA_IN_TVAL_ON_LOAD_GUEST_PAGE_FAULT.yaml +18 -0
  2454. data/.data/spec/std/isa/param/REPORT_GPA_IN_TVAL_ON_STORE_AMO_GUEST_PAGE_FAULT.yaml +18 -0
  2455. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_BREAKPOINT.yaml +23 -0
  2456. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_INSTRUCTION_ACCESS_FAULT.yaml +21 -0
  2457. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_INSTRUCTION_MISALIGNED.yaml +21 -0
  2458. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_INSTRUCTION_PAGE_FAULT.yaml +20 -0
  2459. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_LOAD_ACCESS_FAULT.yaml +21 -0
  2460. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_LOAD_MISALIGNED.yaml +21 -0
  2461. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_LOAD_PAGE_FAULT.yaml +19 -0
  2462. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_STORE_AMO_ACCESS_FAULT.yaml +21 -0
  2463. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_STORE_AMO_MISALIGNED.yaml +21 -0
  2464. data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_STORE_AMO_PAGE_FAULT.yaml +19 -0
  2465. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_BREAKPOINT.yaml +20 -0
  2466. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_INSTRUCTION_ACCESS_FAULT.yaml +20 -0
  2467. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_INSTRUCTION_MISALIGNED.yaml +21 -0
  2468. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_INSTRUCTION_PAGE_FAULT.yaml +20 -0
  2469. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_LOAD_ACCESS_FAULT.yaml +19 -0
  2470. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_LOAD_MISALIGNED.yaml +20 -0
  2471. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_LOAD_PAGE_FAULT.yaml +19 -0
  2472. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_STORE_AMO_ACCESS_FAULT.yaml +19 -0
  2473. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_STORE_AMO_MISALIGNED.yaml +20 -0
  2474. data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_STORE_AMO_PAGE_FAULT.yaml +19 -0
  2475. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_BREAKPOINT.yaml +20 -0
  2476. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_ACCESS_FAULT.yaml +20 -0
  2477. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_MISALIGNED.yaml +21 -0
  2478. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_PAGE_FAULT.yaml +20 -0
  2479. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_LOAD_ACCESS_FAULT.yaml +19 -0
  2480. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_LOAD_MISALIGNED.yaml +20 -0
  2481. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_LOAD_PAGE_FAULT.yaml +19 -0
  2482. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_STORE_AMO_ACCESS_FAULT.yaml +19 -0
  2483. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_STORE_AMO_MISALIGNED.yaml +20 -0
  2484. data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_STORE_AMO_PAGE_FAULT.yaml +19 -0
  2485. data/.data/spec/std/isa/param/RESERVED_VSET_X0X0_VILL_SET.yaml +21 -0
  2486. data/.data/spec/std/isa/param/RESERVED_VSET_X0X0_VLMAX_CHANGE.yaml +20 -0
  2487. data/.data/spec/std/isa/param/RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX.yaml +17 -0
  2488. data/.data/spec/std/isa/param/SATP_MODE_BARE.yaml +17 -0
  2489. data/.data/spec/std/isa/param/SCOUNTENABLE_EN.yaml +46 -0
  2490. data/.data/spec/std/isa/param/SEW_MIN.yaml +27 -0
  2491. data/.data/spec/std/isa/param/SSTATEEN_JVT_TYPE.yaml +37 -0
  2492. data/.data/spec/std/isa/param/STVAL_WIDTH.yaml +19 -0
  2493. data/.data/spec/std/isa/param/STVEC_MODE_DIRECT.yaml +21 -0
  2494. data/.data/spec/std/isa/param/STVEC_MODE_VECTORED.yaml +19 -0
  2495. data/.data/spec/std/isa/param/SUPPORT_FRACTIONAL_LMUL_BEYOND_REQUIRED.yaml +21 -0
  2496. data/.data/spec/std/isa/param/SV32X4_TRANSLATION.yaml +24 -0
  2497. data/.data/spec/std/isa/param/SV32_VSMODE_TRANSLATION.yaml +27 -0
  2498. data/.data/spec/std/isa/param/SV39X4_TRANSLATION.yaml +23 -0
  2499. data/.data/spec/std/isa/param/SV39_VSMODE_TRANSLATION.yaml +27 -0
  2500. data/.data/spec/std/isa/param/SV48X4_TRANSLATION.yaml +27 -0
  2501. data/.data/spec/std/isa/param/SV48_VSMODE_TRANSLATION.yaml +27 -0
  2502. data/.data/spec/std/isa/param/SV57X4_TRANSLATION.yaml +25 -0
  2503. data/.data/spec/std/isa/param/SV57_VSMODE_TRANSLATION.yaml +27 -0
  2504. data/.data/spec/std/isa/param/SXLEN.yaml +31 -0
  2505. data/.data/spec/std/isa/param/S_MODE_ENDIANNESS.yaml +25 -0
  2506. data/.data/spec/std/isa/param/TIME_CSR_IMPLEMENTED.yaml +28 -0
  2507. data/.data/spec/std/isa/param/TINST_VALUE_ON_BREAKPOINT.yaml +23 -0
  2508. data/.data/spec/std/isa/param/TINST_VALUE_ON_FINAL_INSTRUCTION_GUEST_PAGE_FAULT.yaml +23 -0
  2509. data/.data/spec/std/isa/param/TINST_VALUE_ON_FINAL_LOAD_GUEST_PAGE_FAULT.yaml +27 -0
  2510. data/.data/spec/std/isa/param/TINST_VALUE_ON_FINAL_STORE_AMO_GUEST_PAGE_FAULT.yaml +27 -0
  2511. data/.data/spec/std/isa/param/TINST_VALUE_ON_INSTRUCTION_ADDRESS_MISALIGNED.yaml +23 -0
  2512. data/.data/spec/std/isa/param/TINST_VALUE_ON_LOAD_ACCESS_FAULT.yaml +25 -0
  2513. data/.data/spec/std/isa/param/TINST_VALUE_ON_LOAD_ADDRESS_MISALIGNED.yaml +25 -0
  2514. data/.data/spec/std/isa/param/TINST_VALUE_ON_LOAD_PAGE_FAULT.yaml +25 -0
  2515. data/.data/spec/std/isa/param/TINST_VALUE_ON_MCALL.yaml +23 -0
  2516. data/.data/spec/std/isa/param/TINST_VALUE_ON_SCALL.yaml +23 -0
  2517. data/.data/spec/std/isa/param/TINST_VALUE_ON_STORE_AMO_ACCESS_FAULT.yaml +25 -0
  2518. data/.data/spec/std/isa/param/TINST_VALUE_ON_STORE_AMO_ADDRESS_MISALIGNED.yaml +25 -0
  2519. data/.data/spec/std/isa/param/TINST_VALUE_ON_STORE_AMO_PAGE_FAULT.yaml +25 -0
  2520. data/.data/spec/std/isa/param/TINST_VALUE_ON_UCALL.yaml +23 -0
  2521. data/.data/spec/std/isa/param/TINST_VALUE_ON_VIRTUAL_INSTRUCTION.yaml +23 -0
  2522. data/.data/spec/std/isa/param/TINST_VALUE_ON_VSCALL.yaml +23 -0
  2523. data/.data/spec/std/isa/param/TRAP_ON_EBREAK.yaml +17 -0
  2524. data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_M.yaml +17 -0
  2525. data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_S.yaml +20 -0
  2526. data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_U.yaml +20 -0
  2527. data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_VS.yaml +20 -0
  2528. data/.data/spec/std/isa/param/TRAP_ON_ILLEGAL_WLRL.yaml +21 -0
  2529. data/.data/spec/std/isa/param/TRAP_ON_RESERVED_INSTRUCTION.yaml +24 -0
  2530. data/.data/spec/std/isa/param/TRAP_ON_SFENCE_VMA_WHEN_SATP_MODE_IS_READ_ONLY.yaml +31 -0
  2531. data/.data/spec/std/isa/param/TRAP_ON_UNIMPLEMENTED_CSR.yaml +21 -0
  2532. data/.data/spec/std/isa/param/TRAP_ON_UNIMPLEMENTED_INSTRUCTION.yaml +23 -0
  2533. data/.data/spec/std/isa/param/UXLEN.yaml +31 -0
  2534. data/.data/spec/std/isa/param/U_MODE_ENDIANNESS.yaml +25 -0
  2535. data/.data/spec/std/isa/param/VECTOR_FF_NO_EXCEPTION_TRIM.yaml +19 -0
  2536. data/.data/spec/std/isa/param/VECTOR_FF_SEG_EXCEPTION_PARTIAL_LOAD.yaml +22 -0
  2537. data/.data/spec/std/isa/param/VECTOR_FF_UPDATE_PAST_TRIM.yaml +22 -0
  2538. data/.data/spec/std/isa/param/VECTOR_LOAD_PAST_TRAP.yaml +19 -0
  2539. data/.data/spec/std/isa/param/VECTOR_LOAD_SEG_FF_OVERWRITE_ELEMENTS_AFTER_FAULT.yaml +21 -0
  2540. data/.data/spec/std/isa/param/VECTOR_LS_INDEX_MAX_EEW.yaml +28 -0
  2541. data/.data/spec/std/isa/param/VECTOR_LS_MISALIGNED_LEGAL.yaml +19 -0
  2542. data/.data/spec/std/isa/param/VECTOR_LS_SEG_PARTIAL_ACCESS.yaml +19 -0
  2543. data/.data/spec/std/isa/param/VECTOR_LS_WHOLEREG_MISALIGNED_LEGAL.yaml +20 -0
  2544. data/.data/spec/std/isa/param/VENDOR_ID_BANK.yaml +20 -0
  2545. data/.data/spec/std/isa/param/VENDOR_ID_OFFSET.yaml +18 -0
  2546. data/.data/spec/std/isa/param/VFREDUSUM_FINAL_NODE_ELEMENT_BEHAVIOR.yaml +20 -0
  2547. data/.data/spec/std/isa/param/VFREDUSUM_INACTIVE_NODE_ELEMENT_BEHAVIOR.yaml +21 -0
  2548. data/.data/spec/std/isa/param/VFREDUSUM_NAN.yaml +22 -0
  2549. data/.data/spec/std/isa/param/VFREDUSUM_NODE_ROUNDING_BEHAVIOR.yaml +23 -0
  2550. data/.data/spec/std/isa/param/VILL_SET_ON_RESERVED_VTYPE.yaml +20 -0
  2551. data/.data/spec/std/isa/param/VLEN.yaml +20 -0
  2552. data/.data/spec/std/isa/param/VMID_WIDTH.yaml +25 -0
  2553. data/.data/spec/std/isa/param/VSSTAGE_MODE_BARE.yaml +24 -0
  2554. data/.data/spec/std/isa/param/VSSTATUS_VS_EXISTS.yaml +19 -0
  2555. data/.data/spec/std/isa/param/VSTVEC_MODE_DIRECT.yaml +21 -0
  2556. data/.data/spec/std/isa/param/VSTVEC_MODE_VECTORED.yaml +21 -0
  2557. data/.data/spec/std/isa/param/VSXLEN.yaml +33 -0
  2558. data/.data/spec/std/isa/param/VS_MODE_ENDIANNESS.yaml +25 -0
  2559. data/.data/spec/std/isa/param/VUXLEN.yaml +30 -0
  2560. data/.data/spec/std/isa/param/VU_MODE_ENDIANNESS.yaml +25 -0
  2561. data/.data/spec/std/isa/proc_cert_class/AC.yaml +13 -0
  2562. data/.data/spec/std/isa/proc_cert_class/MC.yaml +13 -0
  2563. data/.data/spec/std/isa/proc_cert_class/MockProcessor.yaml +13 -0
  2564. data/.data/spec/std/isa/proc_cert_class/RVI.yaml +16 -0
  2565. data/.data/spec/std/isa/proc_cert_model/AC100.yaml +72 -0
  2566. data/.data/spec/std/isa/proc_cert_model/AC200.yaml +58 -0
  2567. data/.data/spec/std/isa/proc_cert_model/MC100-32.yaml +155 -0
  2568. data/.data/spec/std/isa/proc_cert_model/MC100-64.yaml +21 -0
  2569. data/.data/spec/std/isa/proc_cert_model/MC200-32.yaml +60 -0
  2570. data/.data/spec/std/isa/proc_cert_model/MC200-64.yaml +21 -0
  2571. data/.data/spec/std/isa/proc_cert_model/MC300-32.yaml +40 -0
  2572. data/.data/spec/std/isa/proc_cert_model/MC300-64.yaml +21 -0
  2573. data/.data/spec/std/isa/proc_cert_model/RVI20-32.yaml +39 -0
  2574. data/.data/spec/std/isa/proc_cert_model/RVI20-64.yaml +19 -0
  2575. data/.data/spec/std/isa/profile/RVA20S64.yaml +76 -0
  2576. data/.data/spec/std/isa/profile/RVA20U64.yaml +108 -0
  2577. data/.data/spec/std/isa/profile/RVA22S64.yaml +80 -0
  2578. data/.data/spec/std/isa/profile/RVA22U64.yaml +140 -0
  2579. data/.data/spec/std/isa/profile/RVA23M64.yaml +24 -0
  2580. data/.data/spec/std/isa/profile/RVA23S64.yaml +55 -0
  2581. data/.data/spec/std/isa/profile/RVA23U64.yaml +70 -0
  2582. data/.data/spec/std/isa/profile/RVB23M64.yaml +89 -0
  2583. data/.data/spec/std/isa/profile/RVB23S64.yaml +299 -0
  2584. data/.data/spec/std/isa/profile/RVB23U64.yaml +273 -0
  2585. data/.data/spec/std/isa/profile/RVI20U32.yaml +83 -0
  2586. data/.data/spec/std/isa/profile/RVI20U64.yaml +12 -0
  2587. data/.data/spec/std/isa/profile_family/Mock.yaml +24 -0
  2588. data/.data/spec/std/isa/profile_family/RVA.yaml +154 -0
  2589. data/.data/spec/std/isa/profile_family/RVB.yaml +59 -0
  2590. data/.data/spec/std/isa/profile_family/RVI.yaml +37 -0
  2591. data/.data/spec/std/isa/profile_release/RVA20.yaml +44 -0
  2592. data/.data/spec/std/isa/profile_release/RVA22.yaml +44 -0
  2593. data/.data/spec/std/isa/profile_release/RVA23.yaml +40 -0
  2594. data/.data/spec/std/isa/profile_release/RVB23.yaml +40 -0
  2595. data/.data/spec/std/isa/profile_release/RVI20.yaml +31 -0
  2596. data/.data/spec/std/isa/prose/interrupts.adoc +185 -0
  2597. data/.data/spec/std/isa/register_file/F.yaml +165 -0
  2598. data/.data/spec/std/isa/register_file/V.yaml +146 -0
  2599. data/.data/spec/std/isa/register_file/X.yaml +201 -0
  2600. data/LICENSE +26 -0
  2601. data/bin/udb +11 -0
  2602. data/ext/udb_download/extconf.rb +238 -0
  2603. data/lib/tapioca/dsl/compilers/cfg_arch_compiler.rb +38 -0
  2604. data/lib/udb/EQNTOTT_VERSION +1 -0
  2605. data/lib/udb/ESPRESSO_VERSION +1 -0
  2606. data/lib/udb/MUST_VERSION +1 -0
  2607. data/lib/udb/Z3_VERSION +1 -0
  2608. data/lib/udb/architecture.rb +345 -0
  2609. data/lib/udb/cert_normative_rule.rb +41 -0
  2610. data/lib/udb/cfg_arch.rb +1679 -0
  2611. data/lib/udb/cli.rb +424 -0
  2612. data/lib/udb/condition.rb +2143 -0
  2613. data/lib/udb/config.rb +363 -0
  2614. data/lib/udb/dep_paths.rb +109 -0
  2615. data/lib/udb/dep_versions.rb +12 -0
  2616. data/lib/udb/doc_link.rb +49 -0
  2617. data/lib/udb/eqn.rb +204 -0
  2618. data/lib/udb/eqn_parser.rb +804 -0
  2619. data/lib/udb/external_documentation_renderer.rb +466 -0
  2620. data/lib/udb/idl/condition_to_udb.rb +386 -0
  2621. data/lib/udb/log.rb +147 -0
  2622. data/lib/udb/logic.rb +3636 -0
  2623. data/lib/udb/obj/certifiable_obj.rb +21 -0
  2624. data/lib/udb/obj/certificate.rb +230 -0
  2625. data/lib/udb/obj/csr.rb +603 -0
  2626. data/lib/udb/obj/csr_field.rb +877 -0
  2627. data/lib/udb/obj/database_obj.rb +556 -0
  2628. data/lib/udb/obj/exception_code.rb +98 -0
  2629. data/lib/udb/obj/extension.rb +1734 -0
  2630. data/lib/udb/obj/has_fields.rb +151 -0
  2631. data/lib/udb/obj/instruction.rb +1328 -0
  2632. data/lib/udb/obj/manual.rb +208 -0
  2633. data/lib/udb/obj/mmr.rb +104 -0
  2634. data/lib/udb/obj/non_isa_specification.rb +382 -0
  2635. data/lib/udb/obj/parameter.rb +148 -0
  2636. data/lib/udb/obj/portfolio.rb +972 -0
  2637. data/lib/udb/obj/prm.rb +52 -0
  2638. data/lib/udb/obj/profile.rb +284 -0
  2639. data/lib/udb/obj/register_file.rb +118 -0
  2640. data/lib/udb/portfolio_design.rb +256 -0
  2641. data/lib/udb/presence.rb +101 -0
  2642. data/lib/udb/prm_generator.rb +763 -0
  2643. data/lib/udb/proc_cert_design.rb +77 -0
  2644. data/lib/udb/resolver.rb +425 -0
  2645. data/lib/udb/schema.rb +305 -0
  2646. data/lib/udb/version.rb +8 -0
  2647. data/lib/udb/version_spec.rb +334 -0
  2648. data/lib/udb/yaml/comment_parser.rb +422 -0
  2649. data/lib/udb/yaml/preserving_emitter.rb +339 -0
  2650. data/lib/udb/yaml/yaml_resolver.rb +1039 -0
  2651. data/lib/udb/z3.rb +1218 -0
  2652. data/lib/udb/z3_loader.rb +97 -0
  2653. data/lib/udb.rb +25 -0
  2654. metadata +3125 -0
data/lib/udb/logic.rb ADDED
@@ -0,0 +1,3636 @@
1
+ # Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
2
+ # SPDX-License-Identifier: BSD-3-Clause-Clear
3
+
4
+ # typed: true
5
+ # frozen_string_literal: true
6
+
7
+ require "numbers_and_words"
8
+ require "open3"
9
+ require "tempfile"
10
+ require "treetop"
11
+
12
+ require "idlc/symbol_table"
13
+ require "udb/eqn"
14
+ require "udb/version_spec"
15
+ require "udb/z3"
16
+ require "udb/dep_paths"
17
+
18
+ # Implements the LogicNode class, which is used to test for satisfiability/equality/etc of logic
19
+ #
20
+ # LogicNode isn't meant to used by the "public" API. It is used by the Condition classes, which
21
+ # correspond to concepts in the UDB data
22
+ #
23
+ # @see Condition
24
+ module Udb
25
+ # node types in a boolean logic tree
26
+ class LogicNodeType < T::Enum
27
+ enums do
28
+ True = new
29
+ False = new
30
+ Term = new
31
+ Not = new
32
+ And = new
33
+ Or = new
34
+ Xor = new
35
+ None = new
36
+ If = new
37
+ end
38
+ end
39
+
40
+ class XlenTerm
41
+ extend T::Sig
42
+ include Comparable
43
+
44
+ attr_reader :xlen
45
+
46
+ sig { params(xlen: Integer).void }
47
+ def initialize(xlen)
48
+ @xlen = xlen
49
+ @to_s = "xlen=#{@xlen}".freeze
50
+ @to_h = {
51
+ "xlen" => @xlen
52
+ }.freeze
53
+ @hash = to_s.hash
54
+ end
55
+
56
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(Condition) }
57
+ def to_condition(cfg_arch)
58
+ Condition.new({ "xlen" => @xlen }, cfg_arch)
59
+ end
60
+
61
+ sig { override.returns(String).checked(:never) }
62
+ def to_s
63
+ @to_s
64
+ end
65
+
66
+ sig { params(solver: Z3Solver).returns(Z3::BoolExpr).checked(:never) }
67
+ def to_z3(solver)
68
+ solver.xlen == @xlen
69
+ end
70
+
71
+ sig { returns(String) }
72
+ def to_s_pretty = to_s
73
+
74
+ sig { returns(String) }
75
+ def to_asciidoc = "xlen+++()+++ == #{@xlen}"
76
+
77
+ sig { returns(T::Hash[String, Integer]) }
78
+ def to_h
79
+ @to_h
80
+ end
81
+
82
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(String) }
83
+ def to_idl(cfg_arch)
84
+ "(xlen() == #{@xlen})"
85
+ end
86
+
87
+ sig {
88
+ override
89
+ .params(other: T.untyped)
90
+ .returns(T.nilable(Integer))
91
+ .checked(:never)
92
+ }
93
+ def <=>(other)
94
+ return nil unless other.is_a?(XlenTerm)
95
+
96
+ @xlen <=> other.xlen
97
+ end
98
+
99
+ # hash and eql? must be implemented to use XlenTerm as a Hash key
100
+ sig { override.returns(Integer).checked(:never) }
101
+ def hash = @hash
102
+
103
+ sig {
104
+ override
105
+ .params(other: T.untyped)
106
+ .returns(T::Boolean)
107
+ .checked(:never)
108
+ }
109
+ def eql?(other)
110
+ (self <=> other) == 0
111
+ end
112
+ end
113
+
114
+ # a terminal for an Extension with a version specifier (a-la an ExtensionRequirement)
115
+ # we don't use ExtensionRequirement for terminals just to keep LogicNode independent of the rest of UDB
116
+ class ExtensionTerm
117
+ extend T::Sig
118
+ include Comparable
119
+
120
+ class ComparisonOp < T::Enum
121
+ include Comparable
122
+
123
+ def eql?(other)
124
+ (self <=> other) == 0
125
+ end
126
+
127
+ def hash = serialize.hash
128
+
129
+ enums do
130
+ Equal = new("=")
131
+ GreaterThanOrEqual = new(">=")
132
+ GreaterThan = new(">")
133
+ LessThanOrEqual = new("<=")
134
+ LessThan = new("<")
135
+ Compatible = new("~>")
136
+ end
137
+ end
138
+
139
+ sig { returns(String) }
140
+ attr_reader :name
141
+
142
+ sig { returns(VersionSpec) }
143
+ attr_reader :version
144
+
145
+ sig { returns(ComparisonOp) }
146
+ def comparison = @op
147
+
148
+ sig { params(name: String, op: T.any(ComparisonOp, String), ver: T.any(String, VersionSpec)).void }
149
+ def initialize(name, op, ver)
150
+ @name = name
151
+ @op = T.let(
152
+ if op.is_a?(String)
153
+ ComparisonOp.deserialize(op)
154
+ else
155
+ op
156
+ end,
157
+
158
+ ComparisonOp)
159
+ @version = ver.is_a?(String) ? VersionSpec.new(ver) : ver
160
+ end
161
+
162
+ sig { returns(T::Boolean) }
163
+ def matches_any_version?
164
+ @op == ComparisonOp::Equal && @version == VersionSpec.new("0")
165
+ end
166
+
167
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(ExtensionRequirement) }
168
+ def to_ext_req(cfg_arch)
169
+ cfg_arch.extension_requirement(@name, "#{@op.serialize} #{@version}")
170
+ end
171
+
172
+
173
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(ExtensionVersion) }
174
+ def to_ext_ver(cfg_arch)
175
+ raise "Not an extension version" unless @op == ComparisonOp::Equal
176
+
177
+ cfg_arch.extension_version(@name, @version.to_s)
178
+ end
179
+
180
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(Condition) }
181
+ def to_condition(cfg_arch)
182
+ Condition.new({ "extension" => { "name" => name, "version" => "#{@op.serialize} #{@version}" } }, cfg_arch)
183
+ end
184
+
185
+ sig { override.returns(String).checked(:never) }
186
+ def to_s
187
+ @to_s ||= "#{@name}#{@op.serialize}#{@version}"
188
+ end
189
+
190
+ sig { returns(String) }
191
+ def to_s_pretty
192
+ "Extension #{@name}, version #{@version}"
193
+ end
194
+
195
+ sig { returns(T::Hash[String, String]) }
196
+ def to_h
197
+ {
198
+ "name" => @name,
199
+ "version" => "#{@op.serialize} #{@version}"
200
+ }
201
+ end
202
+
203
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(String) }
204
+ def to_idl(cfg_arch)
205
+ if @op == ComparisonOp::GreaterThanOrEqual && @version.eql?("0")
206
+ "implemented?(ExtensionName::#{@name})"
207
+ else
208
+ "implemented_version?(ExtensionName::#{@name}, \"#{@op.serialize} #{@version}\")"
209
+ end
210
+ end
211
+
212
+ sig { returns(RequirementSpec).checked(:never) }
213
+ def requirement_spec
214
+ @requirement_spec ||= RequirementSpec.new("#{@op.serialize} #{@version}")
215
+ end
216
+
217
+ sig { params(solver: Z3Solver, cfg_arch: ConfiguredArchitecture).returns(Z3::BoolExpr).checked(:never) }
218
+ def to_z3(solver, cfg_arch)
219
+ ext = solver.ext_req(name, requirement_spec, cfg_arch)
220
+ ext.term
221
+ end
222
+
223
+ # return the minimum version possible that would satisfy this term
224
+ def min_possible_version
225
+ case @op
226
+ when ComparisonOp::Equal, ComparisonOp::GreaterThanOrEqual, ComparisonOp::Compatible
227
+ @version
228
+ when ComparisonOp::GreaterThan
229
+ @version.increment_patch
230
+ when ComparisonOp::LessThanOrEqual, ComparisonOp::LessThan
231
+ VersionSpec.new("0")
232
+ else
233
+ T.absurd(@op)
234
+ end
235
+ end
236
+
237
+ # return the maximum version possible that would satisfy this term
238
+ sig { returns(VersionSpec) }
239
+ def max_possible_version
240
+ case @op
241
+ when ComparisonOp::Equal, ComparisonOp::LessThanOrEqual, ComparisonOp::Compatible
242
+ @version
243
+ when ComparisonOp::LessThan
244
+ if @version.zero?
245
+ nil
246
+ else
247
+ @version.decrement_patch
248
+ end
249
+ when ComparisonOp::GreaterThanOrEqual, ComparisonOp::GreaterThan
250
+ VersionSpec.new("0")
251
+ else
252
+ T.absurd(@op)
253
+ end
254
+ end
255
+
256
+ sig {
257
+ override
258
+ .params(other: T.untyped)
259
+ .returns(T.nilable(Integer))
260
+ .checked(:never)
261
+ }
262
+ def <=>(other)
263
+ return nil unless other.is_a?(ExtensionTerm)
264
+
265
+ other_ext = other
266
+ if @op == ComparisonOp::Equal && other_ext.comparison == ComparisonOp::Equal
267
+ if @name == other_ext.name
268
+ T.must(@version <=> other_ext.version)
269
+ else
270
+ T.must(@name <=> other_ext.name)
271
+ end
272
+ else
273
+ if @name == other_ext.name
274
+ if min_possible_version == other_ext.min_possible_version
275
+ max_possible_version <=> other_ext.max_possible_version
276
+ else
277
+ min_possible_version <=> other_ext.min_possible_version
278
+ end
279
+ else
280
+ T.must(@name <=> other_ext.name)
281
+ end
282
+ end
283
+ end
284
+
285
+ # hash and eql? must be implemented to use ExtensionTerm as a Hash key
286
+ sig { override.returns(Integer).checked(:never) }
287
+ def hash = @hash ||= to_s.hash
288
+
289
+ sig {
290
+ override
291
+ .params(other: T.untyped)
292
+ .returns(T::Boolean)
293
+ .checked(:never)
294
+ }
295
+ def eql?(other)
296
+ (self <=> other) == 0
297
+ end
298
+
299
+ end
300
+
301
+ # a terminal for a Parameter test (e.g., MXLEN == 32)
302
+ class ParameterTerm
303
+ extend T::Sig
304
+ include Comparable
305
+
306
+ class ParameterComparisonType < T::Enum
307
+ enums do
308
+ Equal = new("equal")
309
+ NotEqual = new("notEqual")
310
+ LessThan = new("lessThan")
311
+ GreaterThan = new("greaterThan")
312
+ LessThanOrEqual = new("lessThanOrEqual")
313
+ GreaterThanOrEqual = new("greaterThanOrEqual")
314
+ Includes = new("includes")
315
+ OneOf = new("oneOf")
316
+ end
317
+ end
318
+
319
+ ValueType = T.type_alias { T.any(Integer, String, T::Boolean, T::Array[T.any(Integer, String)]) }
320
+
321
+ sig { params(yaml: T::Hash[String, T.untyped]).void }
322
+ def initialize(yaml)
323
+ @yaml = yaml
324
+ end
325
+
326
+ sig { returns(String) }
327
+ def name = @yaml.fetch("name")
328
+
329
+ sig { returns(String) }
330
+ def reason = @yaml.fetch("reason")
331
+
332
+ sig { returns(T.nilable(Integer)) }
333
+ def index = @yaml["index"]
334
+
335
+ sig { returns(T.nilable(T::Boolean)) }
336
+ def size = @yaml["size"]
337
+
338
+ sig { returns(T::Boolean) }
339
+ def array_comparison? = @yaml.key?("index") || @yaml.key?("size") || @yaml.key?("includes")
340
+
341
+ sig { returns(ValueType) }
342
+ def comparison_value
343
+ @yaml.fetch(comparison_type.serialize)
344
+ end
345
+
346
+ # return a negated version of self, or nil if no simple negation exists
347
+ sig { returns(T.nilable(ParameterTerm)) }
348
+ def negate
349
+ if @yaml.key?("equal")
350
+ new_yaml = @yaml.dup
351
+ new_yaml["notEqual"] = @yaml["equal"]
352
+ new_yaml.delete("equal")
353
+ ParameterTerm.new(new_yaml)
354
+ elsif @yaml.key?("notEqual")
355
+ new_yaml = @yaml.dup
356
+ new_yaml["equal"] = @yaml["notEqual"]
357
+ new_yaml.delete("notEqual")
358
+ ParameterTerm.new(new_yaml)
359
+ elsif @yaml.key?("lessThan")
360
+ new_yaml = @yaml.dup
361
+ new_yaml["greaterThanOrEqual"] = @yaml["lessThan"]
362
+ new_yaml.delete("lessThan")
363
+ ParameterTerm.new(new_yaml)
364
+ elsif @yaml.key?("greaterThan")
365
+ new_yaml = @yaml.dup
366
+ new_yaml["lessThanOrEqual"] = @yaml["greaterThan"]
367
+ new_yaml.delete("greaterThan")
368
+ ParameterTerm.new(new_yaml)
369
+ elsif @yaml.key?("lessThanOrEqual")
370
+ new_yaml = @yaml.dup
371
+ new_yaml["greaterThan"] = @yaml["lessThanOrEqual"]
372
+ new_yaml.delete("lessThanOrEqual")
373
+ ParameterTerm.new(new_yaml)
374
+ elsif @yaml.key?("greaterThanOrEqual")
375
+ new_yaml = @yaml.dup
376
+ new_yaml["lessThan"] = @yaml["greaterThanOrEqual"]
377
+ new_yaml.delete("greaterThanOrEqual")
378
+ ParameterTerm.new(new_yaml)
379
+ elsif @yaml.key?("includes")
380
+ nil
381
+ elsif @yaml.key?("oneOf")
382
+ nil
383
+ else
384
+ raise "No comparison found in [#{@yaml.keys}]"
385
+ end
386
+ end
387
+
388
+ sig { returns(ParameterComparisonType) }
389
+ def comparison_type
390
+ if @yaml.key?("equal")
391
+ ParameterComparisonType::Equal
392
+ elsif @yaml.key?("notEqual")
393
+ ParameterComparisonType::NotEqual
394
+ elsif @yaml.key?("lessThan")
395
+ ParameterComparisonType::LessThan
396
+ elsif @yaml.key?("greaterThan")
397
+ ParameterComparisonType::GreaterThan
398
+ elsif @yaml.key?("lessThanOrEqual")
399
+ ParameterComparisonType::LessThanOrEqual
400
+ elsif @yaml.key?("greaterThanOrEqual")
401
+ ParameterComparisonType::GreaterThanOrEqual
402
+ elsif @yaml.key?("includes")
403
+ ParameterComparisonType::Includes
404
+ elsif @yaml.key?("oneOf")
405
+ ParameterComparisonType::OneOf
406
+ else
407
+ raise "No comparison found in [#{@yaml.keys}]"
408
+ end
409
+ end
410
+
411
+ sig { params(solver: Z3Solver, cfg_arch: ConfiguredArchitecture).returns(Z3::BoolExpr) }
412
+ def to_z3(solver, cfg_arch)
413
+ t = comparison_type
414
+ e = T.let(
415
+ solver.param(name, T.must(cfg_arch.param(name)).schema.to_h),
416
+ T.any(Z3ParameterTerm, Z3::BitvecExpr, Z3::IntExpr, Z3::BoolExpr)
417
+ )
418
+ if @yaml.key?("size")
419
+ e = T.cast(e, Z3ParameterTerm).size_term
420
+ elsif @yaml.key?("index")
421
+ e = T.cast(e, Z3ParameterTerm)[@yaml.fetch("index")]
422
+ end
423
+ if @yaml.key?("range")
424
+ msb, lsb = @yaml.fetch("range").split("-").map(&:to_i)
425
+ e = T.cast(e, Z3ParameterTerm).extract(msb, lsb)
426
+ end
427
+ case t
428
+ when ParameterComparisonType::Equal
429
+ e == @yaml["equal"]
430
+ when ParameterComparisonType::NotEqual
431
+ e != @yaml["notEqual"]
432
+ when ParameterComparisonType::LessThan
433
+ T.cast(e, T.any(Z3ParameterTerm, Z3::BitvecExpr, Z3::IntExpr)) < @yaml["lessThan"]
434
+ when ParameterComparisonType::GreaterThan
435
+ T.cast(e, T.any(Z3ParameterTerm, Z3::BitvecExpr, Z3::IntExpr)) > @yaml["greaterThan"]
436
+ when ParameterComparisonType::LessThanOrEqual
437
+ T.cast(e, T.any(Z3ParameterTerm, Z3::BitvecExpr, Z3::IntExpr)) <= @yaml["lessThanOrEqual"]
438
+ when ParameterComparisonType::GreaterThanOrEqual
439
+ T.cast(e, T.any(Z3ParameterTerm, Z3::BitvecExpr, Z3::IntExpr)) >= @yaml["greaterThanOrEqual"]
440
+ when ParameterComparisonType::Includes
441
+ T.cast(e, Z3ParameterTerm).has_value?(@yaml["includes"])
442
+ when ParameterComparisonType::OneOf
443
+ expr = e == @yaml["oneOf"][0]
444
+ @yaml["oneOf"][1..].each do |v|
445
+ expr = expr | (e == v)
446
+ end
447
+ expr
448
+ else
449
+ T.absurd(t)
450
+ end
451
+ end
452
+
453
+ sig { params(value: T.untyped).returns(SatisfiedResult) }
454
+ def eval_value(value)
455
+ t = comparison_type
456
+ case t
457
+ when ParameterComparisonType::Equal
458
+ (value == @yaml["equal"]) ? SatisfiedResult::Yes : SatisfiedResult::No
459
+ when ParameterComparisonType::NotEqual
460
+ (value != @yaml["notEqual"]) ? SatisfiedResult::Yes : SatisfiedResult::No
461
+ when ParameterComparisonType::LessThan
462
+ (value < @yaml["lessThan"]) ? SatisfiedResult::Yes : SatisfiedResult::No
463
+ when ParameterComparisonType::GreaterThan
464
+ (value > @yaml["greaterThan"]) ? SatisfiedResult::Yes : SatisfiedResult::No
465
+ when ParameterComparisonType::LessThanOrEqual
466
+ (value <= @yaml["lessThanOrEqual"]) ? SatisfiedResult::Yes : SatisfiedResult::No
467
+ when ParameterComparisonType::GreaterThanOrEqual
468
+ (value >= @yaml["greaterThanOrEqual"]) ? SatisfiedResult::Yes : SatisfiedResult::No
469
+ when ParameterComparisonType::Includes
470
+ (value.include?(@yaml["includes"])) ? SatisfiedResult::Yes : SatisfiedResult::No
471
+ when ParameterComparisonType::OneOf
472
+ (@yaml["oneOf"].include?(value)) ? SatisfiedResult::Yes : SatisfiedResult::No
473
+ else
474
+ T.absurd(t)
475
+ end
476
+ end
477
+
478
+ sig { params(param_values: T::Hash[String, T.untyped]).returns(SatisfiedResult) }
479
+ def _eval(param_values)
480
+ val = param_values[name]
481
+
482
+ # don't have the value, so can't say either way
483
+ return SatisfiedResult::Maybe if val.nil?
484
+
485
+ if val.is_a?(Array)
486
+ raise "Missing index, includes, or size key in #{@yaml}" unless array_comparison?
487
+
488
+ if @yaml.key?("index")
489
+ raise "Index out of range" if T.cast(@yaml.fetch("index"), Integer) >= T.cast(val, Array).size
490
+
491
+ value = val.fetch(@yaml.fetch("index"))
492
+ eval_value(value)
493
+ elsif @yaml.key?("includes")
494
+ eval_value(val)
495
+ elsif @yaml.key?("size")
496
+ value = val.size
497
+ eval_value(value)
498
+ else
499
+ raise "unreachable"
500
+ end
501
+ elsif val.is_a?(Integer)
502
+ if @yaml.key?("range")
503
+ msb, lsb = @yaml.fetch("range").split("-").map(&:to_i)
504
+ eval_value((val >> lsb) & (1 << (msb - lsb)))
505
+ else
506
+ eval_value(val)
507
+ end
508
+ else
509
+ eval_value(val)
510
+ end
511
+ end
512
+
513
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(SatisfiedResult) }
514
+ def eval(cfg_arch)
515
+ p = cfg_arch.param(name)
516
+
517
+ # we know nothing at all about this param. it might not even be valid
518
+ return SatisfiedResult::No if p.nil?
519
+
520
+ # since conditions are involved in ConfiguredArchitecture creation
521
+ # (to, for example, determine the list of implemented extensions)
522
+ # we use the parameter values directly from the config instead of the symtab
523
+ # (which may not be constructed yet)
524
+ _eval(cfg_arch.config.param_values)
525
+ end
526
+
527
+ sig { params(param_values: T::Hash[String, T.untyped]).returns(SatisfiedResult) }
528
+ def partial_eval(param_values) = _eval(param_values)
529
+
530
+ sig { returns(T::Hash[String, T.untyped]) }
531
+ def to_h
532
+ if @yaml.key?("oneOf")
533
+ excl_terms = @yaml["oneOf"].size.times.map do |i|
534
+ els = [
535
+ { "param" => { "name" => @yaml["name"], "equal" => @yaml.fetch("oneOf").fetch(i) } }
536
+ ]
537
+ els += @yaml.fetch("oneOf").size.times.select { |j| j != i }.map do |j|
538
+ { "param" => { "name" => @yaml["name"], "notEqual" => @yaml.fetch("oneOf").fetch(j) } }
539
+ end
540
+ { "allOf" => els }
541
+ end
542
+ {
543
+ "anyOf" => excl_terms
544
+ }
545
+ else
546
+ @yaml
547
+ end
548
+ end
549
+
550
+ sig { returns(LogicNode) }
551
+ def to_logic_node
552
+ LogicNode.new(LogicNodeType::Term, [self])
553
+ end
554
+
555
+ sig { params(cfg_arch: T.nilable(ConfiguredArchitecture)).returns(String) }
556
+ def to_idl(cfg_arch)
557
+ t = comparison_type
558
+ case t
559
+ when ParameterComparisonType::Equal
560
+ if comparison_value.is_a?(String)
561
+ "(#{param_to_s}==\"#{comparison_value}\")"
562
+ else
563
+ "(#{param_to_s}==#{comparison_value})"
564
+ end
565
+ when ParameterComparisonType::NotEqual
566
+ if comparison_value.is_a?(String)
567
+ "(#{param_to_s}!=\"#{comparison_value}\")"
568
+ else
569
+ "(#{param_to_s}!=#{comparison_value})"
570
+ end
571
+ when ParameterComparisonType::LessThan
572
+ "(#{param_to_s}<#{comparison_value})"
573
+ when ParameterComparisonType::GreaterThan
574
+ "(#{param_to_s}>#{comparison_value})"
575
+ when ParameterComparisonType::LessThanOrEqual
576
+ "(#{param_to_s}<=#{comparison_value})"
577
+ when ParameterComparisonType::GreaterThanOrEqual
578
+ "(#{param_to_s}>=#{comparison_value})"
579
+ when ParameterComparisonType::Includes
580
+ "$array_includes?(#{param_to_s}, #{comparison_value})"
581
+ when ParameterComparisonType::OneOf
582
+ # construct XOR out of AND and OR
583
+ # e.g.,
584
+ # a XOR B XOR C = (a AND !b AND !c) OR (!a AND b AND !c) OR (!a AND !b AND c)
585
+ terms =
586
+ T.cast(comparison_value, T::Array[T.any(Integer, String)]).map do |v|
587
+ v.is_a?(String) ? "(#{param_to_s}==\"#{v}\")" : "(#{param_to_s}==#{v})"
588
+ end
589
+ excl_terms = terms.size.times.map do |i|
590
+ "(#{terms[i]} && #{terms.size.times.select { |j| j != i }.map { |j| "!#{terms[j]}" }.join(" && ")})"
591
+ end
592
+ "(#{excl_terms.join(" || ")})"
593
+ else
594
+ T.absurd(t)
595
+ end
596
+ end
597
+
598
+ def to_asciidoc
599
+ padoc =
600
+ index.nil? \
601
+ ? name
602
+ : "#{name}[#{index}]"
603
+ type = comparison_type
604
+ case type
605
+ when ParameterTerm::ParameterComparisonType::Equal
606
+ "`#{padoc}` == #{comparison_value}"
607
+ when ParameterTerm::ParameterComparisonType::NotEqual
608
+ "`#{padoc}` != #{comparison_value}"
609
+ when ParameterTerm::ParameterComparisonType::LessThan
610
+ "`#{padoc}` < #{comparison_value}"
611
+ when ParameterTerm::ParameterComparisonType::GreaterThan
612
+ "`#{padoc}` > #{comparison_value}"
613
+ when ParameterTerm::ParameterComparisonType::LessThanOrEqual
614
+ "`#{padoc}` <= #{comparison_value}"
615
+ when ParameterTerm::ParameterComparisonType::GreaterThanOrEqual
616
+ "`#{padoc}` >= #{comparison_value}"
617
+ when ParameterTerm::ParameterComparisonType::Includes
618
+ "#{comparison_value} in `#{padoc}`"
619
+ when ParameterTerm::ParameterComparisonType::OneOf
620
+ "`#{padoc}` in [#{@yaml["oneOf"].join(", ")}]"
621
+ else
622
+ T.absurd(type)
623
+ end
624
+ end
625
+
626
+ sig { returns(String) }
627
+ def param_to_s
628
+ if !index.nil?
629
+ "#{name}[#{index}]"
630
+ elsif !size.nil?
631
+ "$array_size(#{name})"
632
+ elsif @yaml.key?("range")
633
+ msb, lsb = @yaml.fetch("range").split("-").map(&:to_i)
634
+ "#{name}[#{msb}:#{lsb}]"
635
+ else
636
+ name
637
+ end
638
+ end
639
+
640
+ sig { override.returns(String) }
641
+ def to_s
642
+ # just return IDL
643
+ to_idl(nil)
644
+ end
645
+
646
+ sig { returns(String) }
647
+ def to_s_pretty
648
+ t = comparison_type
649
+ i = index
650
+ if i.nil?
651
+ case t
652
+ when ParameterComparisonType::Equal
653
+ "Paremeter #{@name} equals #{comparison_value}"
654
+ when ParameterComparisonType::NotEqual
655
+ "Paremeter #{@name} does not equal #{comparison_value}"
656
+ when ParameterComparisonType::LessThan
657
+ "Paremeter #{@name} is less than #{comparison_value}"
658
+ when ParameterComparisonType::GreaterThan
659
+ "Paremeter #{@name} is greater than #{comparison_value}"
660
+ when ParameterComparisonType::LessThanOrEqual
661
+ "Paremeter #{@name} is less than or equal to #{comparison_value}"
662
+ when ParameterComparisonType::GreaterThanOrEqual
663
+ "Paremeter #{@name} is greater than or equal to #{comparison_value}"
664
+ when ParameterComparisonType::Includes
665
+ "Paremeter #{@name} (an array) includes the value #{comparison_value}"
666
+ when ParameterComparisonType::OneOf
667
+ "Paremeter #{@name} is one of the following values: #{comparison_value}"
668
+ else
669
+ T.absurd(t)
670
+ end
671
+ else
672
+ case t
673
+ when ParameterComparisonType::Equal
674
+ "The #{i.to_words(ordinal: true, remove_hyphen: true)} element of paremeter #{@name} equals #{comparison_value}"
675
+ when ParameterComparisonType::NotEqual
676
+ "The #{i.to_words(ordinal: true, remove_hyphen: true)} element of paremeter #{@name} does not equal #{comparison_value}"
677
+ when ParameterComparisonType::LessThan
678
+ "The #{i.to_words(ordinal: true, remove_hyphen: true)} element of paremeter #{@name} is less than #{comparison_value}"
679
+ when ParameterComparisonType::GreaterThan
680
+ "The #{i.to_words(ordinal: true, remove_hyphen: true)} element of paremeter #{@name} is greater than #{comparison_value}"
681
+ when ParameterComparisonType::LessThanOrEqual
682
+ "The #{i.to_words(ordinal: true, remove_hyphen: true)} element of paremeter #{@name} is less than or equal to #{comparison_value}"
683
+ when ParameterComparisonType::GreaterThanOrEqual
684
+ "The #{i.to_words(ordinal: true, remove_hyphen: true)} element of paremeter #{@name} is greater than or equal to #{comparison_value}"
685
+ when ParameterComparisonType::Includes
686
+ raise "Cannot occur"
687
+ when ParameterComparisonType::OneOf
688
+ "The #{i.to_words(ordinal: true, remove_hyphen: true)} element of paremeter #{@name} equals on of the following values: #{comparison_value}"
689
+ else
690
+ T.absurd(t)
691
+ end
692
+ end
693
+ end
694
+
695
+ sig { returns(T::Boolean) }
696
+ def param_is_array?
697
+ @yaml.keys.any? { |k| ["index", "includes", "size"].include?(k) }
698
+ end
699
+
700
+ # if self and other_param had a well-defined logical relationship, return it
701
+ # otherwise, return nil
702
+ # *note*: this is only one half of the relationship. to get the whole picture, need to use
703
+ # self.relation_to(other_param) && other_param.relation_to(self)
704
+ sig { params(other_param: ParameterTerm).returns(T.nilable(LogicNode)) }
705
+ def relation_to(other_param)
706
+ return nil unless name == other_param.name
707
+
708
+ self_implies_other =
709
+ LogicNode.new(LogicNodeType::If, [LogicNode.new(LogicNodeType::Term, [self]), LogicNode.new(LogicNodeType::Term, [other_param])])
710
+
711
+ self_implies_not_other =
712
+ LogicNode.new(LogicNodeType::If, [LogicNode.new(LogicNodeType::Term, [self]), LogicNode.new(LogicNodeType::Not, [LogicNode.new(LogicNodeType::Term, [other_param])])])
713
+
714
+ if param_is_array?
715
+ if @yaml.key?("includes")
716
+ if other_param.to_h.key?("index") && other_param.to_h.key?("equals") && (other_param.to_h.fetch("equals") == @yaml.fetch("includes"))
717
+ self_implies_other
718
+ elsif other_param.to_h.key?("size") && other_param.to_h.key?("equals") && (other_param.to_h.fetch("equals") == 0)
719
+ self_implies_not_other
720
+ elsif other_param.to_h.key?("size") && other_param.to_h.key?("notEqual") && (other_param.to_h.fetch("notEqual") == 0)
721
+ self_implies_other
722
+ elsif other_param.to_h.key?("size") && other_param.to_h.key?("greaterThan") && (other_param.to_h.fetch("greaterThan") == 0)
723
+ self_implies_other
724
+ end
725
+ elsif @yaml.key?("size")
726
+ scalar_relation_to(other_param, self_implies_other, self_implies_not_other)
727
+ elsif @yaml.key?("index") && other_param.to_h.key?("index") && @yaml.fetch("index") == other_param.to_h.fetch("index")
728
+ scalar_relation_to(other_param, self_implies_other, self_implies_not_other)
729
+ end
730
+ else
731
+ scalar_relation_to(other_param, self_implies_other, self_implies_not_other)
732
+ end
733
+ end
734
+
735
+ # @api private
736
+ sig { params(other_param: ParameterTerm, self_implies_other: LogicNode, self_implies_not_other: LogicNode).returns(T.nilable(LogicNode)) }
737
+ def scalar_relation_to(other_param, self_implies_other, self_implies_not_other)
738
+ op = comparison_type
739
+ other_op = other_param.comparison_type
740
+
741
+ case op
742
+ when ParameterComparisonType::Equal
743
+ case other_op
744
+ when ParameterComparisonType::Equal
745
+ if comparison_value != other_param.comparison_value
746
+ self_implies_not_other
747
+ else
748
+ self_implies_other
749
+ end
750
+ when ParameterComparisonType::NotEqual
751
+ if comparison_value != other_param.comparison_value
752
+ self_implies_other
753
+ else
754
+ self_implies_not_other
755
+ end
756
+ when ParameterComparisonType::LessThan
757
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
758
+ self_implies_other
759
+ else
760
+ self_implies_not_other
761
+ end
762
+ when ParameterComparisonType::LessThanOrEqual
763
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
764
+ self_implies_other
765
+ else
766
+ self_implies_not_other
767
+ end
768
+ when ParameterComparisonType::GreaterThan
769
+ if T.cast(comparison_value, Integer) > T.cast(other_param.comparison_value, Integer)
770
+ self_implies_other
771
+ else
772
+ self_implies_not_other
773
+ end
774
+ when ParameterComparisonType::GreaterThanOrEqual
775
+ if T.cast(comparison_value, Integer) >= T.cast(other_param.comparison_value, Integer)
776
+ self_implies_other
777
+ else
778
+ self_implies_not_other
779
+ end
780
+ when ParameterComparisonType::OneOf
781
+ if T.cast(other_param.comparison_value, T::Array[T.any(String, Integer)]).include?(comparison_value)
782
+ self_implies_other
783
+ else
784
+ self_implies_not_other
785
+ end
786
+ when ParameterComparisonType::Includes
787
+ # self must be a size comparison
788
+ raise "impossible: comparing #{self} to #{other_param}" unless @yaml.key?("size")
789
+ # if size is 0, we know it doesn't include something
790
+ if comparison_value == 0
791
+ self_implies_not_other
792
+ end
793
+ else
794
+ T.absurd(other_op)
795
+ end
796
+ when ParameterComparisonType::NotEqual
797
+ case other_op
798
+ when ParameterComparisonType::Equal
799
+ if comparison_value != other_param.comparison_value
800
+ if comparison_value.is_a?(TrueClass) || comparison_value.is_a?(FalseClass)
801
+ self_implies_other
802
+ end
803
+ else
804
+ self_implies_not_other
805
+ end
806
+ when ParameterComparisonType::NotEqual
807
+ if comparison_value != other_param.comparison_value # otherwise, this would be self-comparison
808
+ if comparison_value.is_a?(TrueClass) || comparison_value.is_a?(FalseClass)
809
+ self_implies_not_other
810
+ end
811
+ else
812
+ self_implies_other
813
+ end
814
+ when ParameterComparisonType::LessThan,
815
+ ParameterComparisonType::LessThanOrEqual,
816
+ ParameterComparisonType::GreaterThan,
817
+ ParameterComparisonType::GreaterThanOrEqual,
818
+ ParameterComparisonType::OneOf
819
+ # nothing to say here.
820
+ when ParameterComparisonType::Includes
821
+ raise "impossible"
822
+ else
823
+ T.absurd(other_op)
824
+ end
825
+ when ParameterComparisonType::LessThan
826
+ case other_op
827
+ when ParameterComparisonType::Equal
828
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
829
+ self_implies_not_other
830
+ end
831
+ when ParameterComparisonType::NotEqual
832
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
833
+ self_implies_other
834
+ end
835
+ when ParameterComparisonType::LessThan
836
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
837
+ self_implies_other
838
+ end
839
+ when ParameterComparisonType::LessThanOrEqual
840
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
841
+ self_implies_other
842
+ end
843
+ when ParameterComparisonType::GreaterThan
844
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
845
+ self_implies_not_other
846
+ end
847
+ when ParameterComparisonType::GreaterThanOrEqual
848
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
849
+ self_implies_not_other
850
+ end
851
+ when ParameterComparisonType::OneOf
852
+ if T.cast(other_param.comparison_value, T::Array[Integer]).all? { |v| v >= T.cast(comparison_value, Integer) }
853
+ self_implies_not_other
854
+ end
855
+ when ParameterComparisonType::Includes
856
+ raise "impossible"
857
+ else
858
+ T.absurd(other_op)
859
+ end
860
+ when ParameterComparisonType::LessThanOrEqual
861
+ case other_op
862
+ when ParameterComparisonType::Equal
863
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
864
+ self_implies_not_other
865
+ end
866
+ when ParameterComparisonType::NotEqual
867
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
868
+ self_implies_other
869
+ end
870
+ when ParameterComparisonType::LessThan
871
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
872
+ self_implies_other
873
+ end
874
+ when ParameterComparisonType::LessThanOrEqual
875
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
876
+ self_implies_other
877
+ end
878
+ when ParameterComparisonType::GreaterThan
879
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
880
+ self_implies_not_other
881
+ end
882
+ when ParameterComparisonType::GreaterThanOrEqual
883
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
884
+ self_implies_not_other
885
+ end
886
+ when ParameterComparisonType::OneOf
887
+ if T.cast(other_param.comparison_value, T::Array[Integer]).all? { |v| v > T.cast(comparison_value, Integer) }
888
+ self_implies_not_other
889
+ end
890
+ when ParameterComparisonType::Includes
891
+ raise "impossible"
892
+ else
893
+ T.absurd(other_op)
894
+ end
895
+ when ParameterComparisonType::GreaterThan
896
+ case other_op
897
+ when ParameterComparisonType::Equal
898
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
899
+ self_implies_not_other
900
+ end
901
+ when ParameterComparisonType::NotEqual
902
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
903
+ self_implies_other
904
+ end
905
+ when ParameterComparisonType::LessThan
906
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
907
+ self_implies_not_other
908
+ end
909
+ when ParameterComparisonType::LessThanOrEqual
910
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
911
+ self_implies_not_other
912
+ end
913
+ when ParameterComparisonType::GreaterThan
914
+ if T.cast(comparison_value, Integer) >= T.cast(other_param.comparison_value, Integer)
915
+ self_implies_other
916
+ end
917
+ when ParameterComparisonType::GreaterThanOrEqual
918
+ if T.cast(comparison_value, Integer) > T.cast(other_param.comparison_value, Integer)
919
+ self_implies_other
920
+ end
921
+ when ParameterComparisonType::OneOf
922
+ if T.cast(other_param.comparison_value, T::Array[Integer]).all? { |v| v <= T.cast(comparison_value, Integer) }
923
+ self_implies_not_other
924
+ end
925
+ when ParameterComparisonType::Includes
926
+ # if self is a size operation and size is 0, we can know that other_param does not include
927
+ # otherwise, we know nothing
928
+ if @yaml.key?("size") && size == 0
929
+ self_implies_not_other
930
+ end
931
+ else
932
+ T.absurd(other_op)
933
+ end
934
+ when ParameterComparisonType::GreaterThanOrEqual
935
+ case other_op
936
+ when ParameterComparisonType::Equal
937
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
938
+ self_implies_not_other
939
+ end
940
+ when ParameterComparisonType::NotEqual
941
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
942
+ self_implies_other
943
+ end
944
+ when ParameterComparisonType::LessThan
945
+ if T.cast(comparison_value, Integer) < T.cast(other_param.comparison_value, Integer)
946
+ self_implies_not_other
947
+ end
948
+ when ParameterComparisonType::LessThanOrEqual
949
+ if T.cast(comparison_value, Integer) <= T.cast(other_param.comparison_value, Integer)
950
+ self_implies_not_other
951
+ end
952
+ when ParameterComparisonType::GreaterThan
953
+ if T.cast(comparison_value, Integer) > T.cast(other_param.comparison_value, Integer)
954
+ self_implies_other
955
+ end
956
+ when ParameterComparisonType::GreaterThanOrEqual
957
+ if T.cast(comparison_value, Integer) >= T.cast(other_param.comparison_value, Integer)
958
+ self_implies_other
959
+ end
960
+ when ParameterComparisonType::OneOf
961
+ if T.cast(other_param.comparison_value, T::Array[Integer]).all? { |v| v < T.cast(comparison_value, Integer) }
962
+ self_implies_not_other
963
+ end
964
+ when ParameterComparisonType::Includes
965
+ raise "impossible"
966
+ else
967
+ T.absurd(other_op)
968
+ end
969
+ when ParameterComparisonType::OneOf
970
+ case other_op
971
+ when ParameterComparisonType::Equal
972
+ if T.cast(comparison_value, T::Array[T.any(Integer, String)]).all? { |v| v != other_param.comparison_value }
973
+ self_implies_not_other
974
+ end
975
+ when ParameterComparisonType::NotEqual
976
+ if T.cast(comparison_value, T::Array[T.any(Integer, String)]).all? { |v| v != other_param.comparison_value }
977
+ self_implies_other
978
+ end
979
+ when ParameterComparisonType::LessThan
980
+ if T.cast(comparison_value, T::Array[Integer]).all? { |v| v >= T.cast(other_param.comparison_value, Integer) }
981
+ self_implies_not_other
982
+ end
983
+ when ParameterComparisonType::LessThanOrEqual
984
+ if T.cast(comparison_value, T::Array[Integer]).all? { |v| v > T.cast(other_param.comparison_value, Integer) }
985
+ self_implies_not_other
986
+ end
987
+ when ParameterComparisonType::GreaterThan
988
+ if T.cast(comparison_value, T::Array[Integer]).all? { |v| v <= T.cast(other_param.comparison_value, Integer) }
989
+ self_implies_not_other
990
+ end
991
+ when ParameterComparisonType::GreaterThanOrEqual
992
+ if T.cast(comparison_value, T::Array[Integer]).all? { |v| v < T.cast(other_param.comparison_value, Integer) }
993
+ self_implies_not_other
994
+ end
995
+ when ParameterComparisonType::OneOf
996
+ # self implies other if all in set set are also in other set
997
+ if T.cast(comparison_value, T::Array[T.any(Integer, String)]).all? { |v| T.cast(other_param.comparison_value, T::Array[T.any(Integer, String)]).include?(v) }
998
+ self_implies_other
999
+ end
1000
+ when ParameterComparisonType::Includes
1001
+ raise "impossible: comparing #{self} to #{other_param}"
1002
+ else
1003
+ T.absurd(other_op)
1004
+ end
1005
+ when ParameterComparisonType::Includes
1006
+ raise "impossible"
1007
+ else
1008
+ T.absurd(op)
1009
+ end
1010
+ end
1011
+
1012
+ sig {
1013
+ override
1014
+ .params(other: T.untyped)
1015
+ .returns(T.nilable(Integer))
1016
+ .checked(:never)
1017
+ }
1018
+ def <=>(other)
1019
+ return nil unless other.is_a?(ParameterTerm)
1020
+
1021
+ other_param = other
1022
+ if name != other_param.name
1023
+ name <=> other_param.name
1024
+ elsif !index.nil? && !other_param.index.nil? && index != other_param.index
1025
+ T.must(index) <=> T.must(other_param.index)
1026
+ elsif size != other.size
1027
+ # one is a size operator and one isn't.
1028
+ size.nil? ? 1 : -1
1029
+ elsif @yaml.key?("includes") || other_param.to_h.key?("includes")
1030
+ if @yaml.key?("includes") && other_param.to_h.key?("includes")
1031
+ @yaml.fetch("includes") <=> other_param.to_h.fetch("includes")
1032
+ elsif @yaml.key?("includes") && !other_param.to_h.key?("includes")
1033
+ 1
1034
+ elsif !@yaml.key?("includes") && other_param.to_h.key?("includes")
1035
+ -1
1036
+ end
1037
+ elsif @yaml.key?("oneOf") || other_param.to_h.key?("oneOf")
1038
+ if @yaml.key?("oneOf") && other_param.to_h.key?("oneOf")
1039
+ @yaml.fetch("oneOf") <=> other_param.to_h.fetch("oneOf")
1040
+ elsif @yaml.key?("oneOf")
1041
+ 1
1042
+ else
1043
+ -1
1044
+ end
1045
+ elsif @yaml.key?("range") || other_param.to_h.key?("range")
1046
+ if @yaml["range"] == other_param.to_h["range"]
1047
+ comparison_value <=> T.cast(other_param.comparison_value, Integer)
1048
+ elsif @yaml.key?("range")
1049
+ 1
1050
+ else
1051
+ -1
1052
+ end
1053
+ elsif comparison_type != other_param.comparison_type
1054
+ comparison_type <=> other_param.comparison_type
1055
+ elsif comparison_value != other_param.comparison_value
1056
+ cv = comparison_value
1057
+ if cv.is_a?(String)
1058
+ cv <=> T.cast(other_param.comparison_value, String)
1059
+ elsif cv.is_a?(Array)
1060
+ cv <=> T.cast(other_param.comparison_value, T::Array[T.any(String, T::Boolean, Integer)])
1061
+ else
1062
+ T.cast(comparison_value, Integer) <=> T.cast(other_param.comparison_value, Integer)
1063
+ end
1064
+ else
1065
+ # these are the same (ignoring reason)
1066
+ return 0
1067
+ end
1068
+ end
1069
+
1070
+ # hash and eql? must be implemented to use ParameterTerm as a Hash key
1071
+ sig {
1072
+ override
1073
+ .returns(Integer)
1074
+ .checked(:never)
1075
+ }
1076
+ def hash = @hash ||= @yaml.reject { |k, _| k == "reason" }.hash
1077
+
1078
+ sig {
1079
+ override
1080
+ .params(other: T.untyped)
1081
+ .returns(T::Boolean)
1082
+ .checked(:never)
1083
+ }
1084
+ def eql?(other)
1085
+ return false unless other.is_a?(ParameterTerm)
1086
+
1087
+ (self <=> other) == 0
1088
+ end
1089
+ end
1090
+
1091
+ # @api private
1092
+ # represents a "free" term, i.e., one that is not bound to the problem at hand
1093
+ # used by the Tseytin Transformation, which introduces new propositions to represent
1094
+ # subformula
1095
+ class FreeTerm
1096
+ extend T::Sig
1097
+ include Comparable
1098
+
1099
+ @next_id = 1
1100
+
1101
+ sig { returns(Integer) }
1102
+ attr_reader :id
1103
+
1104
+ sig { void }
1105
+ def initialize
1106
+ @id = FreeTerm.instance_variable_get(:@next_id)
1107
+ FreeTerm.instance_variable_set(:@next_id, @id + 1)
1108
+ end
1109
+
1110
+ sig {
1111
+ override
1112
+ .returns(String)
1113
+ }
1114
+ def to_s
1115
+ "t#{@id}"
1116
+ end
1117
+
1118
+ sig { returns(Z3::BoolExpr).checked(:never) }
1119
+ def to_z3
1120
+ @z3 ||= Z3.Bool(to_s)
1121
+ end
1122
+
1123
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(String) }
1124
+ def to_idl(cfg_arch)
1125
+ "FreeTerm"
1126
+ end
1127
+
1128
+ def to_h = {}
1129
+
1130
+ sig { returns(String) }
1131
+ def to_s_pretty = to_s
1132
+
1133
+ sig {
1134
+ override
1135
+ .params(other: T.untyped)
1136
+ .returns(T.nilable(Integer))
1137
+ .checked(:never)
1138
+ }
1139
+ def <=>(other)
1140
+ return nil unless other.is_a?(FreeTerm)
1141
+
1142
+ @id <=> other.id
1143
+ end
1144
+
1145
+ # hash and eql? must be implemented to use ParameterTerm as a Hash key
1146
+ sig {
1147
+ override
1148
+ .returns(Integer)
1149
+ .checked(:never)
1150
+ }
1151
+ def hash = @id.hash
1152
+
1153
+ sig {
1154
+ override
1155
+ .params(other: T.untyped)
1156
+ .returns(T::Boolean)
1157
+ .checked(:never)
1158
+ }
1159
+ def eql?(other)
1160
+ return false unless other.is_a?(FreeTerm)
1161
+
1162
+ (self <=> other) == 0
1163
+ end
1164
+ end
1165
+
1166
+ TermType = T.type_alias { T.any(ExtensionTerm, ParameterTerm, XlenTerm, FreeTerm) }
1167
+
1168
+ # Abstract syntax tree of the condition logic
1169
+ class LogicNode
1170
+ extend T::Sig
1171
+
1172
+ # statistics counters
1173
+ def self.reset_stats
1174
+ @num_brute_force_sat_solves = 0
1175
+ @time_brute_force_sat_solves = 0
1176
+ @num_z3_sat_solves = 0
1177
+ @time_z3_sat_solves = 0
1178
+ @num_z3_cache_hits = 0
1179
+ end
1180
+
1181
+ reset_stats
1182
+
1183
+ def self.num_brute_force_sat_solves
1184
+ @num_brute_force_sat_solves
1185
+ end
1186
+
1187
+ def self.inc_brute_force_sat_solves
1188
+ @num_brute_force_sat_solves += 1
1189
+ end
1190
+
1191
+ def self.num_z3_sat_solves
1192
+ @num_z3_sat_solves
1193
+ end
1194
+
1195
+ def self.inc_z3_sat_solves
1196
+ @num_z3_sat_solves += 1
1197
+ end
1198
+
1199
+ def self.num_z3_cache_hits
1200
+ @num_z3_cache_hits
1201
+ end
1202
+
1203
+ def self.inc_z3_cache_hits
1204
+ @num_z3_cache_hits += 1
1205
+ end
1206
+
1207
+
1208
+ ChildType = T.type_alias { T.any(LogicNode, TermType) }
1209
+
1210
+ sig { returns(LogicNodeType) }
1211
+ attr_reader :type
1212
+
1213
+ sig { returns(T::Array[ChildType]) }
1214
+ attr_reader :children
1215
+
1216
+ # object to hold results of expensive calculations
1217
+ # LogicNode type and children are frozen at construction so
1218
+ # we can safely remember and return these values
1219
+ class MemoizedState < T::Struct
1220
+ # when true, the formula is known to be in CNF form
1221
+ # when false, the formula is known to not be in CNF form
1222
+ prop :is_cnf, T.nilable(T::Boolean)
1223
+
1224
+ # when not nil, an equisatisfiable representation of self in CNF form
1225
+ prop :cnf_form, T.nilable(LogicNode)
1226
+
1227
+ # when true, a flattened version of the formula would be CNF
1228
+ # when false, a flattened version of the formula would not be CNF
1229
+ prop :is_nested_cnf, T.nilable(T::Boolean)
1230
+
1231
+ # when true, the formula would be unaltered by calling reduce
1232
+ # when false, the formula would be reduced further by calling reduce
1233
+ prop :is_reduced, T.nilable(T::Boolean)
1234
+
1235
+ # list of terms in the formula
1236
+ prop :terms, T.nilable(T::Array[TermType])
1237
+
1238
+ # list of literals in the formula
1239
+ prop :literals, T.nilable(T::Array[TermType])
1240
+
1241
+ # when true, formula is known to be satisfiable
1242
+ # when false, formula is known to be unsatisfiable
1243
+ prop :is_satisfiable, T.nilable(T::Boolean)
1244
+
1245
+ # result of #equisat_cnf
1246
+ prop :equisat_cnf, T.nilable(LogicNode)
1247
+
1248
+ # result of #equisat_cnf
1249
+ prop :equiv_cnf, T.nilable(LogicNode)
1250
+ end
1251
+
1252
+ attr_accessor :memo
1253
+
1254
+ sig { params(type: LogicNodeType, children: T::Array[ChildType]).void.checked(:never) }
1255
+ def initialize(type, children)
1256
+ if [LogicNodeType::Term, LogicNodeType::Not].include?(type) && children.size != 1
1257
+ raise ArgumentError, "Children must be singular"
1258
+ end
1259
+ if [LogicNodeType::And, LogicNodeType::Or, LogicNodeType::Xor, LogicNodeType::None, LogicNodeType::If].include?(type) && children.size < 2
1260
+ raise ArgumentError, "Children must have at least two elements"
1261
+ end
1262
+
1263
+ @children = children
1264
+ @children.freeze
1265
+ @node_children = (@type == LogicNodeType::Term) ? nil : T.cast(@children, T::Array[LogicNode])
1266
+
1267
+
1268
+ if [LogicNodeType::True, LogicNodeType::False].include?(type) && !children.empty?
1269
+ raise ArgumentError, "Children must be empty"
1270
+ elsif type == LogicNodeType::Term
1271
+ # ensure the children are TermType
1272
+ children.each { |child| T.assert_type!(T.cast(child, TermType), TermType) }
1273
+ else
1274
+ # raise ArgumentError, "All Children must be LogicNodes" unless children.all? { |child| child.is_a?(LogicNode) }
1275
+ end
1276
+
1277
+ @type = type
1278
+ @type.freeze
1279
+
1280
+ # used for memoization in transformation routines
1281
+ @memo = MemoizedState.new(
1282
+ is_cnf: nil,
1283
+ is_nested_cnf: nil,
1284
+ is_reduced: nil,
1285
+ terms: nil,
1286
+ literals: nil,
1287
+ is_satisfiable: nil,
1288
+ equisat_cnf: nil,
1289
+ equiv_cnf: nil
1290
+ )
1291
+ end
1292
+
1293
+ # @api private
1294
+ sig { returns(T::Array[LogicNode]).checked(:never) }
1295
+ def node_children
1296
+ @node_children
1297
+ end
1298
+
1299
+ True = LogicNode.new(LogicNodeType::True, [])
1300
+ True.memo.is_cnf = true
1301
+ True.memo.is_nested_cnf = true
1302
+ True.memo.is_reduced = true
1303
+ True.memo.cnf_form = True
1304
+ True.memo.terms = [].freeze
1305
+ True.memo.literals = [].freeze
1306
+ True.freeze
1307
+
1308
+ False = LogicNode.new(LogicNodeType::False, [])
1309
+ False.memo.is_cnf = true
1310
+ False.memo.is_nested_cnf = true
1311
+ False.memo.is_reduced = true
1312
+ False.memo.cnf_form = False
1313
+ False.memo.terms = [].freeze
1314
+ False.memo.literals = [].freeze
1315
+ False.freeze
1316
+
1317
+ Xlen32 = LogicNode.new(LogicNodeType::Term, [XlenTerm.new(32).freeze]).freeze
1318
+ Xlen64 = LogicNode.new(LogicNodeType::Term, [XlenTerm.new(64).freeze]).freeze
1319
+
1320
+ # If ext_req is false, can this logic tree be satisfied?
1321
+ sig { params(ext_req: ExtensionRequirement).returns(T::Boolean) }
1322
+ def satisfiability_depends_on_ext_req?(ext_req)
1323
+ # the tree needs something in ext_vers if it is always
1324
+ # unsatisfiable when the corresponding ExtensionTerms are false
1325
+ cb = LogicNode.make_eval_cb do |term|
1326
+ case term
1327
+ when ExtensionTerm
1328
+ ext_req.satisfied_by?(term.to_ext_req(ext_req.cfg_arch)) \
1329
+ ? SatisfiedResult::No
1330
+ : SatisfiedResult::Maybe
1331
+ when ParameterTerm
1332
+ SatisfiedResult::Maybe
1333
+ when FreeTerm
1334
+ SatisfiedResult::No
1335
+ when XlenTerm
1336
+ SatisfiedResult::Maybe
1337
+ else
1338
+ T.absurd(term)
1339
+ end
1340
+ end
1341
+ eval_cb(cb) == SatisfiedResult::No
1342
+ end
1343
+
1344
+ # @return The unique terms (leafs) of this tree
1345
+ sig { returns(T::Array[TermType]).checked(:never) }
1346
+ def terms
1347
+ @memo.terms ||= literals
1348
+ end
1349
+
1350
+ # @return The unique terms (leafs) of this tree, exculding antecendents of an IF
1351
+ sig { returns(T::Array[TermType]).checked(:never) }
1352
+ def terms_no_antecendents
1353
+ if @type == LogicNodeType::If
1354
+ node_children.fetch(1).terms_no_antecendents
1355
+ elsif @type == LogicNodeType::Term
1356
+ [T.cast(@children.fetch(0), TermType)]
1357
+ else
1358
+ seen = {}
1359
+ node_children.each_with_object([]) do |child, result|
1360
+ child.terms_no_antecendents.each do |t|
1361
+ unless seen.key?(t)
1362
+ seen[t] = true
1363
+ result << t
1364
+ end
1365
+ end
1366
+ end
1367
+ end
1368
+ end
1369
+
1370
+ # @return all unique literals (leafs) in the tree
1371
+ sig { returns(T::Array[TermType]).checked(:never) }
1372
+ def literals
1373
+ @memo.literals ||=
1374
+ if @type == LogicNodeType::Term
1375
+ [@children.fetch(0)]
1376
+ else
1377
+ seen = {}
1378
+ node_children.each_with_object([]) do |child, result|
1379
+ child.literals.each do |t|
1380
+ unless seen.key?(t)
1381
+ seen[t] = true
1382
+ result << t
1383
+ end
1384
+ end
1385
+ end
1386
+ end
1387
+ end
1388
+
1389
+
1390
+ sig { params(mterms: T::Array[String], group_by: String).returns(T::Hash[Integer, T::Array[String]]) }
1391
+ def self.group_mterms(mterms, group_by)
1392
+ groups = T.let({}, T::Hash[Integer, T::Array[String]])
1393
+ mterms.each do |mterm|
1394
+ n = mterm.count(group_by)
1395
+ groups[n] ||= []
1396
+ groups.fetch(n) << mterm
1397
+ end
1398
+ groups
1399
+ end
1400
+
1401
+ class PairMintermsResult < T::Struct
1402
+ const :new_group, T::Array[String]
1403
+ const :matched_mterms, T::Set[String]
1404
+ end
1405
+
1406
+ sig { params(group1: T::Array[String], group2: T::Array[String]).returns(PairMintermsResult) }
1407
+ def self.pair_mterms(group1, group2)
1408
+ new_group = []
1409
+ matched = Set.new
1410
+ group1.each do |m1|
1411
+ group2.each do |m2|
1412
+ diff_count = 0
1413
+ diff_index = -1
1414
+ loop_index = 0
1415
+ m1.each_char do |bit|
1416
+ if bit != m2[loop_index]
1417
+ diff_count += 1
1418
+ diff_index = loop_index
1419
+ end
1420
+ loop_index += 1
1421
+ end
1422
+ if diff_count == 1
1423
+ new_mterm = m1.dup
1424
+ new_mterm[diff_index] = "-"
1425
+ new_group << new_mterm
1426
+ matched.add(m1)
1427
+ matched.add(m2)
1428
+ end
1429
+ end
1430
+ end
1431
+ PairMintermsResult.new(new_group: new_group.uniq, matched_mterms: matched)
1432
+ end
1433
+
1434
+
1435
+ def self.prime_implicant_covers_mterm?(implicant, minterm)
1436
+ implicant.chars.zip(minterm.chars).all? do |i_bit, m_bit|
1437
+ i_bit == "-" || i_bit == m_bit
1438
+ end
1439
+ end
1440
+
1441
+ class PrimeImplicantsResult < T::Struct
1442
+ const :essential, T::Array[String]
1443
+ const :minimal, T::Array[String]
1444
+ end
1445
+
1446
+ # given a list of minterms/maxterms, each represented by a string of "0" and "1",
1447
+ # return the prime implicants, represented by a string of "0", "1", and "-"
1448
+ sig { params(mterms: T::Array[String], group_by: String).returns(PrimeImplicantsResult) }
1449
+ def self.find_prime_implicants(mterms, group_by)
1450
+ groups = group_mterms(mterms, group_by)
1451
+
1452
+ # Pair mterms until no further simplification is possible
1453
+ prime_implicants = T.let([], T::Array[String])
1454
+ matched = T.let(Set.new, T::Set[String])
1455
+ while groups.size > 1
1456
+ new_groups = Hash.new { |h, k| h[k] = [] }
1457
+ matched.clear
1458
+ groups.keys.sort.each_cons(2) do |k1, k2|
1459
+ res = pair_mterms(T.must(groups[T.must(k1)]), T.must(groups[T.must(k2)]))
1460
+ matched.merge(res.matched_mterms)
1461
+ new_group = res.new_group
1462
+ new_groups[k1] += new_group unless new_group.empty?
1463
+ end
1464
+ prime_implicants += groups.values.flatten.reject { |mterm| matched.include?(mterm) }
1465
+ groups = new_groups
1466
+ end
1467
+ prime_implicants += groups.values.flatten.reject { |mterm| matched.include?(mterm) }
1468
+ prime_implicants.uniq!
1469
+
1470
+ coverage = Hash.new { |h, k| h[k] = [] }
1471
+
1472
+ mterms.each do |minterm|
1473
+ prime_implicants.each_with_index do |implicant, idx|
1474
+ if prime_implicant_covers_mterm?(implicant, minterm)
1475
+ coverage[minterm] << idx
1476
+ end
1477
+ end
1478
+ end
1479
+
1480
+ essential_indices = []
1481
+ uncovered = mterms.dup
1482
+
1483
+ # Find essential prime implicants
1484
+ coverage.each do |mterm, implicant_indices|
1485
+ if implicant_indices.size == 1
1486
+ idx = implicant_indices.first
1487
+ unless essential_indices.include?(idx)
1488
+ essential_indices << idx
1489
+ # Remove all minterms covered by this implicant
1490
+ uncovered.reject! { |m| prime_implicant_covers_mterm?(prime_implicants.fetch(idx), m) }
1491
+ end
1492
+ end
1493
+ end
1494
+
1495
+ minimal_indices = essential_indices.dup
1496
+ # Greedy selection for remaining minterms
1497
+ while uncovered.any?
1498
+ best_idx = T.cast(prime_implicants.each_with_index.max_by do |implicant, idx|
1499
+ uncovered.count { |m| prime_implicant_covers_mterm?(implicant, m) }
1500
+ end, T::Array[Integer]).last
1501
+
1502
+ minimal_indices << best_idx
1503
+ uncovered.reject! { |m| prime_implicant_covers_mterm?(prime_implicants.fetch(T.must(best_idx)), m) }
1504
+ end
1505
+
1506
+ PrimeImplicantsResult.new(
1507
+ essential: essential_indices.map { |i| prime_implicants.fetch(i) },
1508
+ minimal: minimal_indices.map { |i| prime_implicants.fetch(i) }
1509
+ )
1510
+ end
1511
+
1512
+ class CanonicalizationType < T::Enum
1513
+ enums do
1514
+ SumOfProducts = new
1515
+ ProductOfSums = new
1516
+ end
1517
+ end
1518
+
1519
+ sig { params(result_type: CanonicalizationType).returns(LogicNode) }
1520
+ def quine_mccluskey(result_type)
1521
+ # map terms to indicies for later
1522
+ nterms = terms.size
1523
+ if nterms.zero?
1524
+ # trival case; this is either true or false
1525
+ assert_cb = LogicNode.make_eval_cb do |term|
1526
+ raise "unreachable"
1527
+ end
1528
+ return eval_cb(assert_cb) == SatisfiedResult::Yes ? LogicNode::True : LogicNode::False
1529
+ end
1530
+ term_idx = T.let({}, T::Hash[TermType, Integer])
1531
+ terms.each_with_index do |term, idx|
1532
+ term_idx[term] = idx
1533
+ end
1534
+
1535
+ # mterms are either minterms (for sum-of-products) or maxterms (for product-of-sums)
1536
+ mterms =
1537
+ case result_type
1538
+ when CanonicalizationType::SumOfProducts
1539
+ minterms = T.let([], T::Array[String])
1540
+ (1 << nterms).times do |val|
1541
+ cb = LogicNode.make_eval_cb do |term|
1542
+ ((val >> term_idx.fetch(term)) & 1).zero? ? SatisfiedResult::No : SatisfiedResult::Yes
1543
+ end
1544
+ if eval_cb(cb) == SatisfiedResult::Yes
1545
+ minterms << val.to_s(2).rjust(nterms, "0")
1546
+ end
1547
+ end
1548
+ minterms
1549
+ when CanonicalizationType::ProductOfSums
1550
+ maxterms = T.let([], T::Array[String])
1551
+ (1 << nterms).times do |val|
1552
+ cb = LogicNode.make_eval_cb do |term|
1553
+ ((val >> term_idx.fetch(term)) & 1).zero? ? SatisfiedResult::No : SatisfiedResult::Yes
1554
+ end
1555
+ if eval_cb(cb) == SatisfiedResult::No
1556
+ # swap 0's and 1's since maxterms are inverted
1557
+ maxterms << val.to_s(2).gsub("0", "X").gsub("1", "0").gsub("X", "1").rjust(nterms, "1")
1558
+ end
1559
+ end
1560
+ maxterms
1561
+ else
1562
+ T.absurd(result_type)
1563
+ end
1564
+
1565
+ if mterms.empty?
1566
+ if result_type == CanonicalizationType::SumOfProducts
1567
+ return False
1568
+ else
1569
+ return True
1570
+ end
1571
+ end
1572
+
1573
+ primes = LogicNode.find_prime_implicants(mterms, result_type == CanonicalizationType::SumOfProducts ? "1" : "0")
1574
+ min_primes = primes.minimal
1575
+
1576
+ if (result_type == CanonicalizationType::SumOfProducts)
1577
+ products = T.let([], T::Array[LogicNode])
1578
+ min_primes.each do |p|
1579
+ product = T.let([], T::Array[LogicNode])
1580
+ p = p.reverse
1581
+ p.size.times do |idx|
1582
+ if p[idx] == "1"
1583
+ product << LogicNode.new(LogicNodeType::Term, [terms.fetch(idx)])
1584
+ elsif p[idx] == "0"
1585
+ product << LogicNode.new(LogicNodeType::Not, [LogicNode.new(LogicNodeType::Term, [terms.fetch(idx)])])
1586
+ end
1587
+ end
1588
+ if product.size == 0
1589
+ # trivially satisfiable
1590
+ products << True
1591
+ elsif product.size == 1
1592
+ products << product.fetch(0)
1593
+ else
1594
+ products << LogicNode.new(LogicNodeType::And, product)
1595
+ end
1596
+ end
1597
+
1598
+ if products.size == 0
1599
+ # trivially satisfiable
1600
+ True
1601
+ elsif products.size == 1
1602
+ products.fetch(0)
1603
+ else
1604
+ LogicNode.new(LogicNodeType::Or, products)
1605
+ end
1606
+ elsif result_type == CanonicalizationType::ProductOfSums
1607
+ sums = T.let([], T::Array[LogicNode])
1608
+ min_primes.each do |p|
1609
+ sum = T.let([], T::Array[LogicNode])
1610
+ p = p.reverse
1611
+ p.size.times do |idx|
1612
+ if p[idx] == "1"
1613
+ sum << LogicNode.new(LogicNodeType::Term, [terms.fetch(idx)])
1614
+ elsif p[idx] == "0"
1615
+ sum << LogicNode.new(LogicNodeType::Not, [LogicNode.new(LogicNodeType::Term, [terms.fetch(idx)])])
1616
+ end
1617
+ end
1618
+ if sum.size == 0
1619
+ # unsatisfiable
1620
+ sums << False
1621
+ elsif sum.size == 1
1622
+ sums << sum.fetch(0)
1623
+ else
1624
+ sums << LogicNode.new(LogicNodeType::Or, sum)
1625
+ end
1626
+ end
1627
+
1628
+ if sums.size == 0
1629
+ False
1630
+ elsif sums.size == 1
1631
+ sums.fetch(0)
1632
+ else
1633
+ LogicNode.new(LogicNodeType::And, sums)
1634
+ end
1635
+ else
1636
+ T.absurd(result_type)
1637
+ end
1638
+ end
1639
+ private :quine_mccluskey
1640
+
1641
+ # convert to either sum-of-products form or product-of-sums form and minimize the result
1642
+ sig { params(result_type: CanonicalizationType).returns(LogicNode) }
1643
+ def minimize(result_type)
1644
+ if terms.size <= 4
1645
+ quine_mccluskey(result_type)
1646
+ else
1647
+ # special-case check for when the formula is large but obviously already minimized
1648
+ # added this because espresso runtime for Shcounterenw requirements was painfully long
1649
+ if result_type == CanonicalizationType::ProductOfSums && terms.size > 32 && nnf.nested_cnf? && terms.size == literals.size
1650
+ equiv_cnf
1651
+ else
1652
+ espresso(result_type, true)
1653
+ end
1654
+ end
1655
+ end
1656
+
1657
+ class ConditionalEndterm < T::Struct
1658
+ const :term, TermType
1659
+ const :cond, LogicNode
1660
+ end
1661
+
1662
+ EvalCallbackType = T.type_alias { T.proc.params(arg0: TermType).returns(SatisfiedResult) }
1663
+ sig { params(blk: EvalCallbackType).returns(EvalCallbackType) }
1664
+ def self.make_eval_cb(&blk)
1665
+ blk
1666
+ end
1667
+
1668
+ ReplaceCallbackType = T.type_alias { T.proc.params(arg0: LogicNode).returns(LogicNode) }
1669
+ sig { params(blk: ReplaceCallbackType).returns(ReplaceCallbackType) }
1670
+ def self.make_replace_cb(&blk)
1671
+ blk
1672
+ end
1673
+
1674
+ sig { params(callback: ReplaceCallbackType).returns(LogicNode) }
1675
+ def replace_terms(callback)
1676
+ case @type
1677
+ when LogicNodeType::True, LogicNodeType::False
1678
+ self
1679
+ when LogicNodeType::Term
1680
+ callback.call(self)
1681
+ when LogicNodeType::If, LogicNodeType::Not, LogicNodeType::And,
1682
+ LogicNodeType::Or, LogicNodeType::None, LogicNodeType::Xor
1683
+ LogicNode.new(
1684
+ @type,
1685
+ node_children.map { |c| c.replace_terms(callback) }
1686
+ )
1687
+ else
1688
+ T.absurd(@type)
1689
+ end
1690
+ end
1691
+
1692
+ sig { params(callback: EvalCallbackType).returns(SatisfiedResult) }
1693
+ def eval_cb(callback)
1694
+ case @type
1695
+ when LogicNodeType::True
1696
+ SatisfiedResult::Yes
1697
+ when LogicNodeType::False
1698
+ SatisfiedResult::No
1699
+ when LogicNodeType::Term
1700
+ child = T.cast(@children.fetch(0), TermType)
1701
+ callback.call(child)
1702
+ when LogicNodeType::If
1703
+ cond_ext_ret = node_children.fetch(0)
1704
+ res = cond_ext_ret.eval_cb(callback)
1705
+ if res == SatisfiedResult::Yes
1706
+ node_children.fetch(1).eval_cb(callback)
1707
+ elsif res == SatisfiedResult::Maybe
1708
+ ## if "then" is true, then res doesn't matter....
1709
+ node_children.fetch(1).eval_cb(callback) == SatisfiedResult::Yes \
1710
+ ? SatisfiedResult::Yes
1711
+ : SatisfiedResult::Maybe
1712
+ else
1713
+ # if antecedent is false, implication is true
1714
+ SatisfiedResult::Yes
1715
+ end
1716
+ when LogicNodeType::Not
1717
+ res = node_children.fetch(0).eval_cb(callback)
1718
+ case res
1719
+ when SatisfiedResult::Yes
1720
+ SatisfiedResult::No
1721
+ when SatisfiedResult::No
1722
+ SatisfiedResult::Yes
1723
+ when SatisfiedResult::Maybe
1724
+ SatisfiedResult::Maybe
1725
+ else
1726
+ T.absurd(res)
1727
+ end
1728
+ when LogicNodeType::And
1729
+ yes_cnt = T.let(0, Integer)
1730
+ node_children.each do |child|
1731
+ res1 = child.eval_cb(callback)
1732
+ if res1 == SatisfiedResult::No
1733
+ return SatisfiedResult::No
1734
+ end
1735
+
1736
+ if res1 == SatisfiedResult::Yes
1737
+ yes_cnt += 1
1738
+ end
1739
+ end
1740
+ if yes_cnt == node_children.size
1741
+ SatisfiedResult::Yes
1742
+ else
1743
+ SatisfiedResult::Maybe
1744
+ end
1745
+ when LogicNodeType::Or
1746
+ no_cnt = 0
1747
+ node_children.each do |child|
1748
+ res1 = child.eval_cb(callback)
1749
+ return SatisfiedResult::Yes if res1 == SatisfiedResult::Yes
1750
+
1751
+ no_cnt += 1 if res1 == SatisfiedResult::No
1752
+ end
1753
+ if no_cnt == node_children.size
1754
+ SatisfiedResult::No
1755
+ else
1756
+ SatisfiedResult::Maybe
1757
+ end
1758
+ when LogicNodeType::None
1759
+ no_cnt = 0
1760
+ node_children.each do |child|
1761
+ res1 = child.eval_cb(callback)
1762
+ return SatisfiedResult::No if res1 == SatisfiedResult::Yes
1763
+
1764
+ no_cnt += 1 if res1 == SatisfiedResult::No
1765
+ end
1766
+ if no_cnt == node_children.size
1767
+ SatisfiedResult::Yes
1768
+ else
1769
+ SatisfiedResult::Maybe
1770
+ end
1771
+ when LogicNodeType::Xor
1772
+ yes_cnt = T.let(0, Integer)
1773
+ has_maybe = T.let(false, T::Boolean)
1774
+ node_children.each do |child|
1775
+ res1 = child.eval_cb(callback)
1776
+
1777
+ has_maybe ||= (res1 == SatisfiedResult::Maybe)
1778
+ yes_cnt += 1 if res1 == SatisfiedResult::Yes
1779
+ if yes_cnt > 1
1780
+ return SatisfiedResult::No
1781
+ end
1782
+ end
1783
+ if yes_cnt == 1 && !has_maybe
1784
+ SatisfiedResult::Yes
1785
+ elsif has_maybe
1786
+ SatisfiedResult::Maybe
1787
+ else
1788
+ SatisfiedResult::No
1789
+ end
1790
+ else
1791
+ T.absurd(@type)
1792
+ end
1793
+ end
1794
+
1795
+ # partially evalute -- replace anything known with true/false, and otherwise leave it alone
1796
+ sig { params(cb: EvalCallbackType).returns(LogicNode) }
1797
+ def partial_evaluate(cb)
1798
+ case @type
1799
+ when LogicNodeType::Term
1800
+ res = cb.call(T.cast(@children.fetch(0), TermType))
1801
+ if res == SatisfiedResult::Yes
1802
+ True
1803
+ elsif res == SatisfiedResult::No
1804
+ False
1805
+ else
1806
+ self
1807
+ end
1808
+ else
1809
+ LogicNode.new(@type, node_children.map { |child| child.partial_evaluate(cb) })
1810
+ end
1811
+ end
1812
+
1813
+ class LogicSymbolFormat < T::Enum
1814
+ enums do
1815
+ C = new
1816
+ Eqn = new
1817
+ English = new
1818
+ Predicate = new
1819
+ end
1820
+ end
1821
+
1822
+ LOGIC_SYMBOLS = {
1823
+ LogicSymbolFormat::C => {
1824
+ TRUE: "1",
1825
+ FALSE: "0",
1826
+ NOT: "!",
1827
+ AND: "&&",
1828
+ OR: "||",
1829
+ XOR: "^",
1830
+ IMPLIES: "->" # making this up; there is no implication operator in C
1831
+ },
1832
+ LogicSymbolFormat::Eqn => {
1833
+ TRUE: "ONE",
1834
+ FALSE: "ZERO",
1835
+ NOT: "!",
1836
+ AND: "&",
1837
+ OR: "|",
1838
+ XOR: "DOES NOT EXIST",
1839
+ IMPLIES: "DOES NOT EXIST"
1840
+ },
1841
+ LogicSymbolFormat::English => {
1842
+ TRUE: "true",
1843
+ FALSE: "false",
1844
+ NOT: "NOT ",
1845
+ AND: "AND",
1846
+ OR: "OR",
1847
+ XOR: "XOR",
1848
+ IMPLIES: "IMPLIES"
1849
+ },
1850
+ LogicSymbolFormat::Predicate => {
1851
+ TRUE: "true",
1852
+ FALSE: "false",
1853
+ NOT: "\u00ac",
1854
+ AND: "\u2227",
1855
+ OR: "\u2228",
1856
+ XOR: "\u2295",
1857
+ IMPLIES: "\u2192"
1858
+ }
1859
+ }
1860
+
1861
+ # return a nice, human-readable form that may gloss over details
1862
+ sig { returns(String) }
1863
+ def to_s_pretty
1864
+ if @type == LogicNodeType::True
1865
+ "true"
1866
+ elsif @type == LogicNodeType::False
1867
+ "false"
1868
+ elsif @type == LogicNodeType::Term
1869
+ @children.fetch(0).to_s_pretty
1870
+ elsif @type == LogicNodeType::Not
1871
+ "not #{@children.fetch(0).to_s_pretty}"
1872
+ elsif @type == LogicNodeType::And
1873
+ "(#{node_children.map { |c| c.to_s_pretty }.join(" and ")})"
1874
+ elsif @type == LogicNodeType::Or
1875
+ "(#{node_children.map { |c| c.to_s_pretty }.join(" or ")})"
1876
+ elsif @type == LogicNodeType::Xor
1877
+ "(#{node_children.map { |c| c.to_s_pretty }.join(" xor ")})"
1878
+ elsif @type == LogicNodeType::None
1879
+ "none of (#{node_children.map { |c| c.to_s_pretty }.join(", ")})"
1880
+ elsif @type == LogicNodeType::If
1881
+ "if #{node_children.fetch(0).to_s_pretty} then #{node_children.fetch(1).to_s_pretty})"
1882
+ else
1883
+ T.absurd(@type)
1884
+ end
1885
+ end
1886
+
1887
+ sig { override.returns(Integer) }
1888
+ def hash
1889
+ if @type == LogicNodeType::True
1890
+ true.hash
1891
+ elsif @type == LogicNodeType::False
1892
+ false.hash
1893
+ elsif @type == LogicNodeType::Term
1894
+ @children[0].to_s.hash
1895
+ elsif @type == LogicNodeType::Not
1896
+ [:not, node_children.fetch(0).hash].hash
1897
+ elsif @type == LogicNodeType::And
1898
+ [:and, node_children.map(&:hash)].hash
1899
+ elsif @type == LogicNodeType::Or
1900
+ [:or, node_children.map(&:hash)].hash
1901
+ elsif @type == LogicNodeType::Xor
1902
+ [:xor, node_children.map(&:hash)].hash
1903
+ elsif @type == LogicNodeType::None
1904
+ [:none, node_children.map(&:hash)].hash
1905
+ elsif @type == LogicNodeType::If
1906
+ [:if, node_children.map(&:hash)].hash
1907
+ else
1908
+ T.absurd(@type)
1909
+ end
1910
+ end
1911
+
1912
+ sig { params(format: LogicSymbolFormat).returns(String) }
1913
+ def to_s(format: LogicSymbolFormat::Predicate)
1914
+ if @type == LogicNodeType::True
1915
+ LOGIC_SYMBOLS[format][:TRUE]
1916
+ elsif @type == LogicNodeType::False
1917
+ LOGIC_SYMBOLS[format][:FALSE]
1918
+ elsif @type == LogicNodeType::Term
1919
+ @children[0].to_s
1920
+ elsif @type == LogicNodeType::Not
1921
+ "#{LOGIC_SYMBOLS[format][:NOT]}#{node_children.fetch(0).to_s(format:)}"
1922
+ elsif @type == LogicNodeType::And
1923
+ "(#{node_children.map { |c| c.to_s(format:) }.join(" #{LOGIC_SYMBOLS[format][:AND]} ")})"
1924
+ elsif @type == LogicNodeType::Or
1925
+ "(#{node_children.map { |c| c.to_s(format:) }.join(" #{LOGIC_SYMBOLS[format][:OR]} ")})"
1926
+ elsif @type == LogicNodeType::Xor
1927
+ "(#{node_children.map { |c| c.to_s(format:) }.join(" #{LOGIC_SYMBOLS[format][:XOR]} ")})"
1928
+ elsif @type == LogicNodeType::None
1929
+ "#{LOGIC_SYMBOLS[format][:NOT]}(#{node_children.map { |c| c.to_s(format:) }.join(" #{LOGIC_SYMBOLS[format][:OR]} ")})"
1930
+ elsif @type == LogicNodeType::If
1931
+ "(#{node_children.fetch(0).to_s(format:)} #{LOGIC_SYMBOLS[format][:IMPLIES]} #{node_children.fetch(1).to_s(format:)})"
1932
+ else
1933
+ T.absurd(@type)
1934
+ end
1935
+ end
1936
+
1937
+ sig { params(callback: EvalCallbackType, format: LogicSymbolFormat).returns(String) }
1938
+ def to_s_with_value(callback, format: LogicSymbolFormat::Predicate)
1939
+ if @type == LogicNodeType::True
1940
+ LOGIC_SYMBOLS[format][:TRUE]
1941
+ elsif @type == LogicNodeType::False
1942
+ LOGIC_SYMBOLS[format][:FALSE]
1943
+ elsif @type == LogicNodeType::Term
1944
+ v = callback.call(T.cast(@children.fetch(0), TermType))
1945
+ str =
1946
+ case v
1947
+ when SatisfiedResult::Yes
1948
+ "{true}"
1949
+ when SatisfiedResult::No
1950
+ "{false}"
1951
+ when SatisfiedResult::Maybe
1952
+ "{unknown}"
1953
+ else
1954
+ T.absurd(v)
1955
+ end
1956
+ "`#{@children.fetch(0)}`#{str}"
1957
+ elsif @type == LogicNodeType::Not
1958
+ "#{LOGIC_SYMBOLS[format][:NOT]}#{node_children.fetch(0).to_s_with_value(callback, format:)}"
1959
+ elsif @type == LogicNodeType::And
1960
+ "(#{node_children.map { |c| c.to_s_with_value(callback, format:) }.join(" #{LOGIC_SYMBOLS[format][:AND]} ")})"
1961
+ elsif @type == LogicNodeType::Or
1962
+ "(#{node_children.map { |c| c.to_s_with_value(callback, format:) }.join(" #{LOGIC_SYMBOLS[format][:OR]} ")})"
1963
+ elsif @type == LogicNodeType::Xor
1964
+ "(#{node_children.map { |c| c.to_s_with_value(callback, format:) }.join(" #{LOGIC_SYMBOLS[format][:XOR]} ")})"
1965
+ elsif @type == LogicNodeType::None
1966
+ "#{LOGIC_SYMBOLS[format][:NOT]}(#{node_children.map { |c| c.to_s_with_value(callback, format:) }.join(" #{LOGIC_SYMBOLS[format][:OR]} ")})"
1967
+ elsif @type == LogicNodeType::If
1968
+ "(#{node_children.fetch(0).to_s_with_value(callback, format:)} #{LOGIC_SYMBOLS[format][:IMPLIES]} #{node_children.fetch(1).to_s_with_value(callback, format:)})"
1969
+ else
1970
+ T.absurd(@type)
1971
+ end
1972
+ end
1973
+
1974
+ sig { params(include_versions: T::Boolean).returns(String) }
1975
+ def to_asciidoc(include_versions:)
1976
+ case @type
1977
+ when LogicNodeType::Term
1978
+ term = T.cast(children.fetch(0), TermType)
1979
+ if term.is_a?(ExtensionTerm)
1980
+ if include_versions
1981
+ "`#{term.name}`#{term.comparison}#{term.version.canonical}"
1982
+ else
1983
+ "`#{term.name}`"
1984
+ end
1985
+ elsif term.is_a?(ParameterTerm)
1986
+ term.to_asciidoc
1987
+ elsif term.is_a?(FreeTerm)
1988
+ raise "Should not occur"
1989
+ elsif term.is_a?(XlenTerm)
1990
+ term.to_asciidoc
1991
+ else
1992
+ T.absurd(term)
1993
+ end
1994
+ when LogicNodeType::False
1995
+ "false"
1996
+ when LogicNodeType::True
1997
+ "true"
1998
+ when LogicNodeType::Not
1999
+ if node_children.fetch(0).type == LogicNodeType::Term
2000
+ term = node_children.fetch(0).children.fetch(0)
2001
+ if term.is_a?(ParameterTerm)
2002
+ negation = term.negate
2003
+ unless negation.nil?
2004
+ return negation.to_asciidoc
2005
+ end
2006
+ end
2007
+ end
2008
+ "!#{node_children.fetch(0).to_asciidoc(include_versions:)}"
2009
+ when LogicNodeType::And
2010
+ "++(++#{node_children.map { |c| c.to_asciidoc(include_versions:) }.join(" && ")})"
2011
+ when LogicNodeType::Or
2012
+ "++(++#{node_children.map { |c| c.to_asciidoc(include_versions:) }.join(" pass:[||] ")})"
2013
+ when LogicNodeType::If
2014
+ "++(++#{node_children.fetch(0).to_asciidoc(include_versions:)} -> #{node_children.fetch(1).to_asciidoc(include_versions:)})"
2015
+ when LogicNodeType::Xor
2016
+ "++(++#{node_children.map { |c| c.to_asciidoc(include_versions:) }.join(" &#2295; ")})"
2017
+ when LogicNodeType::None
2018
+ "!++(++#{node_children.map { |c| c.to_asciidoc(include_versions:) }.join(" pass:[||] ")})"
2019
+ else
2020
+ T.absurd(@type)
2021
+ end
2022
+ end
2023
+
2024
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(String) }
2025
+ def to_idl(cfg_arch)
2026
+ case @type
2027
+ when LogicNodeType::True
2028
+ "true"
2029
+ when LogicNodeType::False
2030
+ "false"
2031
+ when LogicNodeType::Term
2032
+ T.cast(@children.fetch(0), TermType).to_idl(cfg_arch)
2033
+ when LogicNodeType::Not
2034
+ "!#{node_children.fetch(0).to_idl(cfg_arch)}"
2035
+ when LogicNodeType::And
2036
+ "(#{node_children.map { |c| c.to_idl(cfg_arch) }.join(" && ") })"
2037
+ when LogicNodeType::Or
2038
+ "(#{node_children.map { |c| c.to_idl(cfg_arch) }.join(" || ")})"
2039
+ when LogicNodeType::Xor, LogicNodeType::None
2040
+ nnf.to_idl(cfg_arch)
2041
+ when LogicNodeType::If
2042
+ "(!(#{node_children.fetch(0).to_idl(cfg_arch)}) || (#{node_children.fetch(1).to_idl(cfg_arch)}))"
2043
+ else
2044
+ T.absurd(@type)
2045
+ end
2046
+ end
2047
+
2048
+ # convert to a UDB schema
2049
+ sig { params(term_determined: T::Boolean).returns(T.any(T::Boolean, T::Hash[String, T.untyped])).checked(:never) }
2050
+ def to_h(term_determined = false)
2051
+ if @type == LogicNodeType::True
2052
+ true
2053
+ elsif @type == LogicNodeType::False
2054
+ false
2055
+ elsif @type == LogicNodeType::Term
2056
+ if term_determined
2057
+ @children.fetch(0).to_h
2058
+ else
2059
+ child = T.cast(@children.fetch(0), TermType)
2060
+ case child
2061
+ when ExtensionTerm
2062
+ { "extension" => @children.fetch(0).to_h }
2063
+ when ParameterTerm
2064
+ { "param" => @children.fetch(0).to_h }
2065
+ when FreeTerm
2066
+ { "free" => child.id } # only needed for #hash
2067
+ when XlenTerm
2068
+ @children.fetch(0).to_h
2069
+ else
2070
+ T.absurd(child)
2071
+ end
2072
+ end
2073
+ elsif @type == LogicNodeType::Not
2074
+ child = node_children.fetch(0)
2075
+ if !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ExtensionTerm) }
2076
+ { "extension" => { "not" => child.to_h(true) } }
2077
+ elsif !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ParameterTerm) }
2078
+ { "param" => { "not" => child.to_h(true) } }
2079
+ else
2080
+ { "not" => child.to_h(term_determined) }
2081
+ end
2082
+ elsif @type == LogicNodeType::And
2083
+ if !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ExtensionTerm) }
2084
+ { "extension" => { "allOf" => node_children.map { |child| child.to_h(true) } } }
2085
+ elsif !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ParameterTerm) }
2086
+ { "param" => { "allOf" => node_children.map { |child| child.to_h(true) } } }
2087
+ else
2088
+ { "allOf" => node_children.map { |child| child.to_h(term_determined) } }
2089
+ end
2090
+ elsif @type == LogicNodeType::Or
2091
+ if !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ExtensionTerm) }
2092
+ { "extension" => { "anyOf" => node_children.map { |child| child.to_h(true) } } }
2093
+ elsif !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ParameterTerm) }
2094
+ { "param" => { "anyOf" => node_children.map { |child| child.to_h(true) } } }
2095
+ else
2096
+ { "anyOf" => node_children.map { |child| child.to_h(term_determined) } }
2097
+ end
2098
+ elsif @type == LogicNodeType::Xor
2099
+ if !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ExtensionTerm) }
2100
+ { "extension" => { "oneOf" => node_children.map { |child| child.to_h(true) } } }
2101
+ elsif !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ParameterTerm) }
2102
+ { "param" => { "oneOf" => node_children.map { |child| child.to_h(true) } } }
2103
+ else
2104
+ { "oneOf" => node_children.map { |child| child.to_h(term_determined) } }
2105
+ end
2106
+ elsif @type == LogicNodeType::None
2107
+ if !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ExtensionTerm) }
2108
+ { "extension" => { "noneOf" => node_children.map { |child| child.to_h(true) } } }
2109
+ elsif !term_determined && terms_no_antecendents.all? { |term| term.is_a?(ParameterTerm) }
2110
+ { "param" => { "noneOf" => node_children.map { |child| child.to_h(true) } } }
2111
+ else
2112
+ { "noneOf" => node_children.map { |child| child.to_h(term_determined) } }
2113
+ end
2114
+ elsif @type == LogicNodeType::If
2115
+ {
2116
+ "if" => node_children.fetch(0).to_h(false),
2117
+ "then" => node_children.fetch(1).to_h(term_determined)
2118
+ }
2119
+ else
2120
+ T.absurd(@type)
2121
+ end
2122
+ end
2123
+
2124
+ sig {
2125
+ params(node: LogicNode)
2126
+ .returns(LogicNode)
2127
+ .checked(:never)
2128
+ }
2129
+ def do_nnf_for_not(node)
2130
+ child = node.node_children.fetch(0)
2131
+ child_type = child.type
2132
+ case child_type
2133
+ when LogicNodeType::Term
2134
+ # identity
2135
+ node
2136
+ when LogicNodeType::True
2137
+ # invert to false
2138
+ False
2139
+ when LogicNodeType::False
2140
+ # invert to true
2141
+ True
2142
+ when LogicNodeType::And
2143
+ # distribute
2144
+ # !(a && b) == (!a || !b)
2145
+ LogicNode.new(
2146
+ LogicNodeType::Or,
2147
+ child.node_children.map { |child2| do_nnf(LogicNode.new(LogicNodeType::Not, [child2])) }
2148
+ )
2149
+ when LogicNodeType::Or
2150
+ # distribute
2151
+ # !(a || b) == (!a && !b)
2152
+ LogicNode.new(
2153
+ LogicNodeType::And,
2154
+ child.node_children.map { |child2| do_nnf(LogicNode.new(LogicNodeType::Not, [child2])) }
2155
+ )
2156
+ when LogicNodeType::Not
2157
+ # !!A = A
2158
+ grandchild = child.node_children.fetch(0)
2159
+ do_nnf(grandchild)
2160
+ when LogicNodeType::If, LogicNodeType::None, LogicNodeType::Xor
2161
+ do_nnf_for_not(LogicNode.new(LogicNodeType::Not, [do_nnf(child)]))
2162
+ else
2163
+ T.absurd(child_type)
2164
+ end
2165
+ end
2166
+ private :do_nnf_for_not
2167
+
2168
+ # rewrite to Negation Normal Form
2169
+ sig { params(node: LogicNode).returns(LogicNode).checked(:never) }
2170
+ def do_nnf(node)
2171
+ node_type = node.type
2172
+ case node_type
2173
+ when LogicNodeType::Not
2174
+ do_nnf_for_not(node)
2175
+ when LogicNodeType::And, LogicNodeType::Or
2176
+ LogicNode.new(node_type, node.node_children.map { |child2| do_nnf(child2) })
2177
+ when LogicNodeType::None
2178
+ # NOR(A, b) = !A && !B
2179
+ LogicNode.new(
2180
+ LogicNodeType::And,
2181
+ node.node_children.map { |child2| do_nnf(LogicNode.new(LogicNodeType::Not, [child2])) }
2182
+ )
2183
+ when LogicNodeType::Xor
2184
+ # XOR(A, b) = (A && !B) || (!A && B)
2185
+ new_kids = []
2186
+ node.children.size.times do |i|
2187
+ group = []
2188
+ node.children.size.times do |j|
2189
+ if i == j
2190
+ group << do_nnf(node.node_children.fetch(j))
2191
+ else
2192
+ group << do_nnf(LogicNode.new(LogicNodeType::Not, [node.children.fetch(j)]))
2193
+ end
2194
+ end
2195
+ new_kids << LogicNode.new(LogicNodeType::And, group)
2196
+ end
2197
+ LogicNode.new(
2198
+ LogicNodeType::Or,
2199
+ new_kids
2200
+ )
2201
+ when LogicNodeType::If
2202
+ # A -> B == !A or B
2203
+ LogicNode.new(
2204
+ LogicNodeType::Or,
2205
+ [
2206
+ do_nnf(LogicNode.new(
2207
+ LogicNodeType::Not,
2208
+ [node.node_children.fetch(0)]
2209
+ )),
2210
+ do_nnf(node.node_children.fetch(1))
2211
+ ]
2212
+ )
2213
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
2214
+ node
2215
+ else
2216
+ T.absurd(node_type)
2217
+ end
2218
+ end
2219
+ private :do_nnf
2220
+
2221
+ # @return self, converted to Negation Normal Form
2222
+ sig { returns(LogicNode) }
2223
+ def nnf
2224
+ do_nnf(self)
2225
+ end
2226
+
2227
+ # @return true iff self is in Negation Normal Form
2228
+ def nnf?
2229
+ if @type == LogicNodeType::Not
2230
+ node_children.fetch(0).type == LogicNodeType::Term
2231
+ elsif @type == LogicNodeType::Term
2232
+ true
2233
+ else
2234
+ node_children.all? { |child| child.nnf? }
2235
+ end
2236
+ end
2237
+
2238
+ # rewrite so that each node has at most two children
2239
+ #
2240
+ # @example
2241
+ # (A || B || C) => ((A || B) || C)
2242
+ sig { params(node: LogicNode).returns(LogicNode).checked(:never) }
2243
+ def do_group_by_2(node)
2244
+ t = node.type
2245
+ case t
2246
+ when LogicNodeType::And
2247
+ root =
2248
+ LogicNode.new(
2249
+ LogicNodeType::And,
2250
+ [
2251
+ do_group_by_2(node.node_children.fetch(0)),
2252
+ do_group_by_2(node.node_children.fetch(1))
2253
+ ]
2254
+ )
2255
+ (2...node.children.size).each do |i|
2256
+ root =
2257
+ LogicNode.new(
2258
+ LogicNodeType::And,
2259
+ [
2260
+ root,
2261
+ do_group_by_2(node.node_children.fetch(i))
2262
+ ]
2263
+ )
2264
+ end
2265
+ root
2266
+ when LogicNodeType::Or
2267
+ root =
2268
+ LogicNode.new(
2269
+ LogicNodeType::Or,
2270
+ [
2271
+ do_group_by_2(node.node_children.fetch(0)),
2272
+ do_group_by_2(node.node_children.fetch(1))
2273
+ ]
2274
+ )
2275
+ (2...node.children.size).each do |i|
2276
+ root =
2277
+ LogicNode.new(
2278
+ LogicNodeType::Or,
2279
+ [
2280
+ root,
2281
+ do_group_by_2(node.node_children.fetch(i))
2282
+ ]
2283
+ )
2284
+ end
2285
+ root
2286
+ when LogicNodeType::Xor
2287
+ # XOR is not distributive, so we need to conver this to AND/OR and then group_by_2
2288
+ do_group_by_2(do_nnf(node))
2289
+ when LogicNodeType::None
2290
+ if node.children.size == 2
2291
+ LogicNode.new(
2292
+ LogicNodeType::Not,
2293
+ [
2294
+ LogicNode.new(
2295
+ LogicNodeType::Or,
2296
+ [
2297
+ do_group_by_2(node.node_children.fetch(0)),
2298
+ do_group_by_2(node.node_children.fetch(1))
2299
+ ]
2300
+ )
2301
+ ]
2302
+ )
2303
+ else
2304
+ tree =
2305
+ LogicNode.new(
2306
+ LogicNodeType::Not,
2307
+ [
2308
+ LogicNode.new(
2309
+ LogicNodeType::Or,
2310
+ [
2311
+ do_group_by_2(node.node_children.fetch(0)),
2312
+ do_group_by_2(node.node_children.fetch(1))
2313
+ ]
2314
+ )
2315
+ ]
2316
+ )
2317
+ (2...node.children.size).each do |i|
2318
+ tree =
2319
+ LogicNode.new(
2320
+ LogicNodeType::Or,
2321
+ [
2322
+ tree,
2323
+ do_group_by_2(node.node_children.fetch(i))
2324
+ ]
2325
+ )
2326
+ end
2327
+ tree
2328
+ end
2329
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
2330
+ node
2331
+ when LogicNodeType::Not
2332
+ LogicNode.new(LogicNodeType::Not, [do_group_by_2(node.node_children.fetch(0))])
2333
+ when LogicNodeType::If
2334
+ LogicNode.new(
2335
+ LogicNodeType::Or,
2336
+ [
2337
+ LogicNode.new(
2338
+ LogicNodeType::Not,
2339
+ [do_group_by_2(node.node_children.fetch(0))]
2340
+ ),
2341
+ do_group_by_2(node.node_children.fetch(1))
2342
+ ]
2343
+ )
2344
+ else
2345
+ T.absurd(t)
2346
+ end
2347
+ end
2348
+ private :do_group_by_2
2349
+
2350
+ # does each node have at most two children?
2351
+ sig { params(node: LogicNode).returns(T::Boolean) }
2352
+ def grouped_by_2?(node)
2353
+ t = node.type
2354
+ case t
2355
+ when LogicNodeType::And, LogicNodeType::Or
2356
+ node.children.size == 2 && \
2357
+ grouped_by_2?(node.node_children.fetch(0)) && \
2358
+ grouped_by_2?(node.node_children.fetch(1))
2359
+ when LogicNodeType::Not
2360
+ grouped_by_2?(node.node_children.fetch(0))
2361
+ when LogicNodeType::Term
2362
+ true
2363
+ when LogicNodeType::None, LogicNodeType::If, LogicNodeType::Xor
2364
+ raise "?"
2365
+ when LogicNodeType::True, LogicNodeType::False
2366
+ true
2367
+ else
2368
+ T.absurd(t)
2369
+ end
2370
+ end
2371
+
2372
+ # @return rewrites the tree so that no node has more than 2 children
2373
+ #
2374
+ # @example
2375
+ # (A || B || C) => ((A || B) || C)
2376
+ sig { returns(LogicNode) }
2377
+ def group_by_2
2378
+ do_group_by_2(self)
2379
+ end
2380
+
2381
+ # distribute OR over AND
2382
+ #
2383
+ # @example
2384
+ # A || (B && C) => (A || B) && (A || C)
2385
+ #
2386
+ # @example
2387
+ # (A && B) || C => (A || C) && (B || C)
2388
+ #
2389
+ # @example
2390
+ # (A && B) || (C && D) => ((A || C) && (A || D)) && ((B || C) && (B || D))
2391
+ sig { params(left: LogicNode, right: LogicNode, clause_count: T::Array[Integer], raise_on_explosion: T::Boolean).returns(LogicNode) }
2392
+ def distribute_or(left, right, clause_count = [0], raise_on_explosion:)
2393
+ if left.type == LogicNodeType::And && right.type == LogicNodeType::And
2394
+ # we want to do:
2395
+ #
2396
+ # left || right
2397
+ # (A && B) || (C && D) => ((A || C) && (A || D)) && ((B || C) && (B || D))
2398
+
2399
+ a = do_equiv_cnf(left.node_children.fetch(0), clause_count, raise_on_explosion:)
2400
+ b = do_equiv_cnf(left.node_children.fetch(1), clause_count, raise_on_explosion:)
2401
+ c = do_equiv_cnf(right.node_children.fetch(0), clause_count, raise_on_explosion:)
2402
+ d = do_equiv_cnf(right.node_children.fetch(1), clause_count, raise_on_explosion:)
2403
+
2404
+ # t1 is an AND of cnfs, so t1 will be cnf
2405
+ clause_count[0] = clause_count.fetch(0) + 2
2406
+ t1 =
2407
+ LogicNode.new(
2408
+ LogicNodeType::And,
2409
+ [
2410
+ do_equiv_cnf(LogicNode.new(LogicNodeType::Or, [a, c]), clause_count, raise_on_explosion:),
2411
+ do_equiv_cnf(LogicNode.new(LogicNodeType::Or, [a, d]), clause_count, raise_on_explosion:),
2412
+ ]
2413
+ )
2414
+
2415
+ # t2 is an AND of cnfs, so t1 will be cnf
2416
+ clause_count[0] = clause_count.fetch(0) + 2
2417
+ t2 =
2418
+ LogicNode.new(
2419
+ LogicNodeType::And,
2420
+ [
2421
+ do_equiv_cnf(LogicNode.new(LogicNodeType::Or, [b, c]), clause_count, raise_on_explosion:),
2422
+ do_equiv_cnf(LogicNode.new(LogicNodeType::Or, [b, d]), clause_count, raise_on_explosion:),
2423
+ ]
2424
+ )
2425
+ # t3 is an AND of cnfs, so t3 will be cnf
2426
+ LogicNode.new(LogicNodeType::And, [t1, t2])
2427
+ elsif left.type == LogicNodeType::And
2428
+ # we want to do:
2429
+ #
2430
+ # left || right
2431
+ # (A && B) || C => (A || C) && (B || C)
2432
+
2433
+ a = do_equiv_cnf(left.node_children.fetch(0), clause_count, raise_on_explosion:)
2434
+ b = do_equiv_cnf(left.node_children.fetch(1), clause_count, raise_on_explosion:)
2435
+ c = do_equiv_cnf(right, clause_count, raise_on_explosion:)
2436
+
2437
+ clause_count[0] = clause_count.fetch(0) + 1
2438
+ clause1 = do_equiv_cnf(LogicNode.new(LogicNodeType::Or, [a, c]), clause_count, raise_on_explosion:)
2439
+ clause_count[0] = clause_count.fetch(0) + 1
2440
+ clause2 = do_equiv_cnf(LogicNode.new(LogicNodeType::Or, [b, c]), clause_count, raise_on_explosion:)
2441
+
2442
+ LogicNode.new(LogicNodeType::And, [clause1, clause2])
2443
+ elsif right.type == LogicNodeType::And
2444
+ # want to do:
2445
+ #
2446
+ # left || right
2447
+ # A || (B && C) => (A || B) && (A || C)
2448
+
2449
+ a = do_equiv_cnf(left, clause_count, raise_on_explosion:)
2450
+ b = do_equiv_cnf(right.node_children.fetch(0), clause_count, raise_on_explosion:)
2451
+ c = do_equiv_cnf(right.node_children.fetch(1), clause_count, raise_on_explosion:)
2452
+
2453
+ clause_count[0] = clause_count.fetch(0) + 2
2454
+ t1 = LogicNode.new(LogicNodeType::And,
2455
+ [
2456
+ do_equiv_cnf(LogicNode.new(LogicNodeType::Or, [a, b]), clause_count, raise_on_explosion:),
2457
+ do_equiv_cnf(LogicNode.new(LogicNodeType::Or, [a, c]), clause_count, raise_on_explosion:)
2458
+ ]
2459
+ ).reduce
2460
+ raise "?" unless t1.nested_cnf?
2461
+ t1
2462
+ else
2463
+ # this is
2464
+ # (A || B), where either A and/or B is a disjunction
2465
+ a = do_equiv_cnf(left, clause_count, raise_on_explosion:)
2466
+ b = do_equiv_cnf(right, clause_count, raise_on_explosion:)
2467
+
2468
+ clause_count[0] = clause_count.fetch(0) + 2
2469
+ t1 = LogicNode.new(LogicNodeType::Or, [a, b]).reduce
2470
+ t1 = t1.nested_cnf? ? t1 : do_equiv_cnf(t1, clause_count, raise_on_explosion:).reduce
2471
+ raise "?" unless t1.nested_cnf?
2472
+ t1
2473
+ end
2474
+ end
2475
+ private :distribute_or
2476
+
2477
+ class SizeExplosion < RuntimeError; end
2478
+
2479
+ # rewrite to Conjunctive Normal Form (i.e., product-of-sums) using Demorgan's laws
2480
+ sig {
2481
+ params(
2482
+ node: LogicNode,
2483
+ clause_count: T::Array[Integer],
2484
+ raise_on_explosion: T::Boolean
2485
+ )
2486
+ .returns(LogicNode)
2487
+ .checked(:never)
2488
+ }
2489
+ def do_equiv_cnf(node, clause_count = [0], raise_on_explosion:)
2490
+ return node if node.nested_cnf? == true
2491
+
2492
+ if raise_on_explosion && clause_count.fetch(0) > 10
2493
+ raise SizeExplosion
2494
+ end
2495
+
2496
+ cnf_node =
2497
+ if node.type == LogicNodeType::And
2498
+ raise "??" unless node.children.size == 2
2499
+ left = node.node_children.fetch(0)
2500
+ right = node.node_children.fetch(1)
2501
+
2502
+ left = do_equiv_cnf(left, clause_count, raise_on_explosion:).reduce
2503
+ right = do_equiv_cnf(right, clause_count, raise_on_explosion:).reduce
2504
+ # left and right are in cnf form
2505
+ # If we and them together, the result is still cnf
2506
+ LogicNode.new(LogicNodeType::And, [left, right]).reduce
2507
+ elsif node.type == LogicNodeType::Or
2508
+ raise "??" unless node.children.size == 2
2509
+ # distributed or over and
2510
+ distribute_or(
2511
+ node.node_children.fetch(0),
2512
+ node.node_children.fetch(1),
2513
+ clause_count,
2514
+ raise_on_explosion:
2515
+ )
2516
+ else
2517
+ unless [
2518
+ node.type == LogicNodeType::Term,
2519
+ (node.type == LogicNodeType::Not && \
2520
+ node.node_children.fetch(0).type == LogicNodeType::Term),
2521
+ node.type == LogicNodeType::True,
2522
+ node.type == LogicNodeType::False
2523
+ ].any?
2524
+ raise "?? #{node.to_s(format: LogicSymbolFormat::C)}"
2525
+ end
2526
+ node.reduce
2527
+ end
2528
+ if cnf_node.frozen?
2529
+ raise "?" unless cnf_node.memo.is_nested_cnf
2530
+ else
2531
+ cnf_node.memo.is_nested_cnf = true
2532
+ end
2533
+ cnf_node
2534
+ end
2535
+ private :do_equiv_cnf
2536
+
2537
+ # flattens a boolean expression using associativity rules.
2538
+ # It simplifies nested AND and OR operations by merging them into a single level.
2539
+ #
2540
+ # @example
2541
+ # ((A || B) || C) => (A || B || C)
2542
+ sig { params(node: LogicNode).returns(LogicNode) }
2543
+ def flatten_cnf(node)
2544
+ if node.type == LogicNodeType::And
2545
+ flattened_kids = node.node_children.map { |child| flatten_cnf(child) }
2546
+
2547
+ if flattened_kids.any? { |child| child.type == LogicNodeType::False }
2548
+ # whole conjunction can be reduced to false
2549
+ False
2550
+ else
2551
+ non_literal_kids = flattened_kids.reject { |child| child.type == LogicNodeType::True }
2552
+ flat_children = non_literal_kids.flat_map do |child|
2553
+ if child.type == LogicNodeType::And
2554
+ child.node_children
2555
+ else
2556
+ child
2557
+ end
2558
+ end
2559
+
2560
+ if flat_children.empty?
2561
+ True
2562
+ elsif flat_children.size == 1
2563
+ flat_children.fetch(0)
2564
+ else
2565
+ LogicNode.new(LogicNodeType::And, flat_children)
2566
+ end
2567
+ end
2568
+ elsif node.type == LogicNodeType::Or
2569
+ flattened_kids = node.node_children.map { |child| flatten_cnf(child) }
2570
+
2571
+ if flattened_kids.any? { |child| child.type == LogicNodeType::True }
2572
+ # whole disjunction can be reduced to true
2573
+ True
2574
+ else
2575
+ non_literal_kids = flattened_kids.reject { |child| child.type == LogicNodeType::False }
2576
+ flat_children = non_literal_kids.flat_map do |child|
2577
+ if child.type == LogicNodeType::Or
2578
+ child.node_children
2579
+ else
2580
+ child
2581
+ end
2582
+ end
2583
+
2584
+ if flat_children.empty?
2585
+ False
2586
+ elsif flat_children.size == 1
2587
+ flat_children.fetch(0)
2588
+ else
2589
+ LogicNode.new(LogicNodeType::Or, flat_children)
2590
+ end
2591
+ end
2592
+ else
2593
+ node
2594
+ end
2595
+ end
2596
+ private :flatten_cnf
2597
+
2598
+ # reduce the equation by removing easy identities:
2599
+ #
2600
+ # (A || B || .. || true) => true
2601
+ # (A || B || .. || Z || !Z) => true
2602
+ # (A && B && .. && false) => false
2603
+ # (A && B && .. && Z && !Z) => false
2604
+ # NONE(A, B, ..., true) => false
2605
+ # false -> A => true
2606
+ # true -> A => A
2607
+ sig { returns(LogicNode) }
2608
+ def reduce
2609
+ unless @memo.is_reduced.nil?
2610
+ raise "?" unless @memo.is_reduced == true
2611
+ return self
2612
+ end
2613
+
2614
+ reduced =
2615
+ case @type
2616
+ when LogicNodeType::And
2617
+ reduced = LogicNode.new(LogicNodeType::And, node_children.map { |child| child.reduce })
2618
+ # see if there is a false term or a contradiction (a && !a)
2619
+ # if so, reduce to false
2620
+ must_be_false = reduced.node_children.any? do |child|
2621
+
2622
+ # a false anywhere will make the conjunction false
2623
+ child.type == LogicNodeType::False ||
2624
+
2625
+ # a contradiction (a && !a) will make the conjunction false
2626
+ (child.type == LogicNodeType::Term &&
2627
+ reduced.node_children.any? do |other_child|
2628
+
2629
+ other_child.type == LogicNodeType::Not && \
2630
+ other_child.node_children.fetch(0).type == LogicNodeType::Term && \
2631
+ child.children.fetch(0) == other_child.node_children.fetch(0).children.fetch(0)
2632
+ end)
2633
+ end
2634
+ if must_be_false
2635
+ False
2636
+ else
2637
+
2638
+ # eliminate True
2639
+ true_reduced_children = reduced.node_children.reject { |c| c.type == LogicNodeType::True }
2640
+ if true_reduced_children.size != reduced.children.size
2641
+ reduced =
2642
+ if true_reduced_children.size == 0
2643
+ True
2644
+ elsif true_reduced_children.size == 1
2645
+ true_reduced_children.fetch(0)
2646
+ else
2647
+ LogicNode.new(LogicNodeType::And, true_reduced_children)
2648
+ end
2649
+ end
2650
+
2651
+ reduced
2652
+ end
2653
+ when LogicNodeType::Or
2654
+ reduced = LogicNode.new(LogicNodeType::Or, node_children.map { |child| child.reduce })
2655
+ # see if there is a true term or a tautology (a || !a)
2656
+ # if so, reduce to true
2657
+ must_be_true = reduced.node_children.any? do |child|
2658
+
2659
+ # a true anywhere will make the disjunction true
2660
+ child.type == LogicNodeType::True ||
2661
+
2662
+ # a tautology (a || !a) will make the disjunction true
2663
+ (child.type == LogicNodeType::Term &&
2664
+ reduced.node_children.any? do |other_child|
2665
+
2666
+ other_child.type == LogicNodeType::Not && \
2667
+ other_child.node_children.fetch(0).type == LogicNodeType::Term && \
2668
+ child.children.fetch(0) == other_child.node_children.fetch(0).children.fetch(0)
2669
+ end)
2670
+ end
2671
+ if must_be_true
2672
+ True
2673
+ else
2674
+
2675
+ # eliminate False
2676
+ false_reduced_children = reduced.node_children.reject { |c| c.type == LogicNodeType::False }
2677
+ if false_reduced_children.size != reduced.children.size
2678
+ reduced =
2679
+ if false_reduced_children.size == 0
2680
+ False
2681
+ elsif false_reduced_children.size == 1
2682
+ false_reduced_children.fetch(0)
2683
+ else
2684
+ LogicNode.new(LogicNodeType::Or, false_reduced_children)
2685
+ end
2686
+ end
2687
+
2688
+ reduced
2689
+ end
2690
+ when LogicNodeType::Xor
2691
+ reduced = LogicNode.new(LogicNodeType::Xor, node_children.map { |child| child.reduce })
2692
+ xor_with_self = reduced.children.size == 2 &&
2693
+ reduced.node_children.fetch(0).type == LogicNodeType::Term &&
2694
+ reduced.node_children.fetch(1).type == LogicNodeType::Term &&
2695
+ reduced.node_children.fetch(0).children.fetch(0) == reduced.node_children.fetch(1).children.fetch(0)
2696
+ if xor_with_self
2697
+ # xor with self if always false
2698
+ False
2699
+ else
2700
+ reduced
2701
+ end
2702
+ when LogicNodeType::If
2703
+ reduced = LogicNode.new(LogicNodeType::If, node_children.map { |child| child.reduce })
2704
+ antecedent = reduced.node_children.fetch(0)
2705
+ consequent = reduced.node_children.fetch(1)
2706
+ if antecedent.type == LogicNodeType::True
2707
+ consequent
2708
+ elsif antecedent.type == LogicNodeType::False
2709
+ return True
2710
+ elsif consequent.type == LogicNodeType::True
2711
+ return True
2712
+ elsif consequent.type == LogicNodeType::False
2713
+ return LogicNode.new(LogicNodeType::Not, [antecedent])
2714
+ else
2715
+ reduced
2716
+ end
2717
+ when LogicNodeType::Not
2718
+ reduced = LogicNode.new(LogicNodeType::Not, node_children.map { |child| child.reduce })
2719
+ child = reduced.node_children.fetch(0)
2720
+ if child.type == LogicNodeType::Not
2721
+ # !!a = a
2722
+ reduced.node_children.fetch(0).node_children.fetch(0)
2723
+ elsif child.type == LogicNodeType::False
2724
+ # !false = true
2725
+ return True
2726
+ elsif child.type == LogicNodeType::True
2727
+ # !true = false
2728
+ return False
2729
+ else
2730
+ reduced
2731
+ end
2732
+ when LogicNodeType::None
2733
+ if node_children.any? { |c| c.type == LogicNodeType::True }
2734
+ True
2735
+ else
2736
+ self.dup
2737
+ end
2738
+ when LogicNodeType::True, LogicNodeType::False, LogicNodeType::Term
2739
+ self
2740
+ else
2741
+ T.absurd(@type)
2742
+ end
2743
+
2744
+ if reduced.memo.is_reduced.nil?
2745
+ reduced.memo.is_reduced = true
2746
+ end
2747
+ reduced
2748
+ end
2749
+
2750
+ # coverts self to an equivalent formula in Conjunctive Normal Form
2751
+ # and returns it as a new formula (self is unmodified)
2752
+ #
2753
+ # iteratively uses Demorgan's Laws. May explode since the worst case
2754
+ # is exponential in the number of clauses
2755
+ sig { params(raise_on_explosion: T::Boolean).returns(LogicNode) }
2756
+ def equiv_cnf(raise_on_explosion: true)
2757
+ @memo.equiv_cnf ||=
2758
+ begin
2759
+ r = reduce
2760
+ return r if r.type == LogicNodeType::True || r.type == LogicNodeType::False
2761
+
2762
+ n = r.nnf
2763
+
2764
+ candidate = n.reduce
2765
+ candidate = n.group_by_2
2766
+ unflattened = do_equiv_cnf(candidate, raise_on_explosion:)
2767
+ result = flatten_cnf(unflattened).reduce
2768
+ if result.frozen?
2769
+ raise "?" unless result.memo.is_cnf == true
2770
+ else
2771
+ result.memo.is_cnf = true
2772
+ end
2773
+ result
2774
+ end
2775
+ end
2776
+
2777
+ # coverts self to an equisatisfiable formula in Conjunctive Normal Form
2778
+ # and returns it as a new formula (self is unmodified)
2779
+ sig { returns(LogicNode) }
2780
+ def equisat_cnf
2781
+ return @memo.equisat_cnf unless @memo.equisat_cnf.nil?
2782
+ return self if @type == LogicNodeType::True
2783
+ return self if @type == LogicNodeType::False
2784
+
2785
+ # strategy: try conversion using Demorgan's laws first. If that appears to be getting too
2786
+ # large (exponential in the worst case), fall back on the tseytin transformation
2787
+ @memo.equisat_cnf =
2788
+ if @memo.equiv_cnf.nil?
2789
+ if terms.count > 4 || literals.count > 10
2790
+ tseytin
2791
+ else
2792
+ # try demorgan first, then fall back if it gets too big
2793
+ begin
2794
+ equiv_cnf
2795
+ rescue SizeExplosion
2796
+ tseytin
2797
+ end
2798
+ end
2799
+ else
2800
+ # we already calculated an equivalent cnf, which is also equisatisfiable
2801
+ @mem.equiv_cnf
2802
+ end
2803
+ end
2804
+
2805
+ # returns true iff tree is in Conjunctive Normal Form
2806
+ sig { returns(T::Boolean) }
2807
+ def cnf?
2808
+ unless @memo.is_cnf.nil?
2809
+ return @memo.is_cnf
2810
+ end
2811
+
2812
+ ret =
2813
+ case @type
2814
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
2815
+ true
2816
+ when LogicNodeType::Not
2817
+ node_children.fetch(0).type == LogicNodeType::Term
2818
+ when LogicNodeType::Or
2819
+ node_children.all? do |child|
2820
+ [
2821
+ child.type == LogicNodeType::True,
2822
+ child.type == LogicNodeType::False,
2823
+ child.type == LogicNodeType::Term,
2824
+ child.type == LogicNodeType::Not && \
2825
+ child.node_children.fetch(0).type == LogicNodeType::Term
2826
+ ].any?
2827
+ end
2828
+ when LogicNodeType::Xor, LogicNodeType::If, LogicNodeType::None
2829
+ false
2830
+ when LogicNodeType::And
2831
+ node_children.all? { |child| child.cnf_conjunction_term? }
2832
+ else
2833
+ T.absurd(@type)
2834
+ end
2835
+
2836
+ @memo.is_cnf = ret
2837
+ end
2838
+
2839
+ # returns true iff tree is in Disjunctive Normal Form
2840
+ sig { returns(T::Boolean) }
2841
+ def dnf?
2842
+ case @type
2843
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
2844
+ true
2845
+ when LogicNodeType::Not
2846
+ node_children.fetch(0).type == LogicNodeType::Term
2847
+ when LogicNodeType::Or
2848
+ node_children.all? { |child| child.dnf_disjunctive_term? }
2849
+ when LogicNodeType::And
2850
+ node_children.all? do |child|
2851
+ [
2852
+ child.type == LogicNodeType::True,
2853
+ child.type == LogicNodeType::False,
2854
+ child.type == LogicNodeType::Term,
2855
+ child.type == LogicNodeType::Not && \
2856
+ child.node_children.fetch(0).type == LogicNodeType::Term
2857
+ ].any?
2858
+ end
2859
+ when LogicNodeType::Xor, LogicNodeType::If, LogicNodeType::None
2860
+ false
2861
+ else
2862
+ T.absurd(@type)
2863
+ end
2864
+ end
2865
+
2866
+ # @api private
2867
+ # returns true iff tree is a valid term in a cnf conjunction
2868
+ sig { returns(T::Boolean) }
2869
+ def cnf_conjunction_term?
2870
+ case @type
2871
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
2872
+ true
2873
+ when LogicNodeType::Not
2874
+ node_children.fetch(0).type == LogicNodeType::Term
2875
+ when LogicNodeType::Or
2876
+ # or is only valid if only contains literals
2877
+ node_children.all? do |child|
2878
+ [
2879
+ child.type == LogicNodeType::True,
2880
+ child.type == LogicNodeType::False,
2881
+ child.type == LogicNodeType::Term,
2882
+ ((child.type == LogicNodeType::Not) && \
2883
+ child.node_children.fetch(0).type == LogicNodeType::Term)
2884
+ ].any?
2885
+ end
2886
+ when LogicNodeType::And, LogicNodeType::Xor, LogicNodeType::If, LogicNodeType::None
2887
+ false
2888
+ else
2889
+ T.absurd(@type)
2890
+ end
2891
+ end
2892
+
2893
+ # @api private
2894
+ # returns true iff tree is a valid term in a dnf disjunction
2895
+ sig { returns(T::Boolean) }
2896
+ def dnf_disjunctive_term?
2897
+ case @type
2898
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
2899
+ true
2900
+ when LogicNodeType::Not
2901
+ node_children.fetch(0).type == LogicNodeType::Term
2902
+ when LogicNodeType::And
2903
+ # and is only valid if only contains literals
2904
+ node_children.all? do |child|
2905
+ [
2906
+ child.type == LogicNodeType::True,
2907
+ child.type == LogicNodeType::False,
2908
+ child.type == LogicNodeType::Term,
2909
+ ((child.type == LogicNodeType::Not) && \
2910
+ child.node_children.fetch(0).type == LogicNodeType::Term)
2911
+ ]
2912
+ end
2913
+ when LogicNodeType::Or, LogicNodeType::Xor, LogicNodeType::If, LogicNodeType::None
2914
+ false
2915
+ else
2916
+ T.absurd(@type)
2917
+ end
2918
+ end
2919
+
2920
+ # @api private
2921
+ # returns true iff tree is a valid term in a nested cnf conjunction
2922
+ sig { params(ancestor_or: T::Boolean).returns(T::Boolean) }
2923
+ def nested_cnf_conjunction_term?(ancestor_or)
2924
+ case @type
2925
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
2926
+ true
2927
+ when LogicNodeType::Not
2928
+ node_children.fetch(0).type == LogicNodeType::Term
2929
+ when LogicNodeType::Or
2930
+ node_children.all? do |child|
2931
+ [
2932
+ child.type == LogicNodeType::True,
2933
+ child.type == LogicNodeType::False,
2934
+ child.type == LogicNodeType::Term,
2935
+ ((child.type == LogicNodeType::Not) && \
2936
+ child.node_children.fetch(0).type == LogicNodeType::Term),
2937
+ child.type == LogicNodeType::Or && child.nested_cnf_conjunction_term?(true)
2938
+ ].any?
2939
+ end
2940
+ when LogicNodeType::And
2941
+ return false if ancestor_or
2942
+
2943
+ node_children.all? do |child|
2944
+ [
2945
+ child.type == LogicNodeType::True,
2946
+ child.type == LogicNodeType::False,
2947
+ child.type == LogicNodeType::Term,
2948
+ ((child.type == LogicNodeType::Not) && \
2949
+ child.node_children.fetch(0).type == LogicNodeType::Term),
2950
+ (child.type == LogicNodeType::Or && \
2951
+ child.nested_cnf_conjunction_term?(true)),
2952
+ (child.type == LogicNodeType::And && \
2953
+ child.nested_cnf_conjunction_term?(ancestor_or))
2954
+ ].any?
2955
+ end
2956
+ when LogicNodeType::Xor, LogicNodeType::If, LogicNodeType::None
2957
+ false
2958
+ else
2959
+ T.absurd(@type)
2960
+ end
2961
+ end
2962
+
2963
+ # returns true iff tree, if flattened, would be cnf
2964
+ # allows nested ANDs as long as there is no ancestor OR
2965
+ # allows nested ORs as long as there is no decendent AND
2966
+ sig { returns(T::Boolean) }
2967
+ def nested_cnf?
2968
+ unless @memo.is_nested_cnf.nil?
2969
+ return @memo.is_nested_cnf
2970
+ end
2971
+
2972
+ ret =
2973
+ case @type
2974
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
2975
+ true
2976
+ when LogicNodeType::Not
2977
+ node_children.fetch(0).type == LogicNodeType::Term
2978
+ when LogicNodeType::And
2979
+ node_children.all? do |child|
2980
+ child.nested_cnf_conjunction_term?(false)
2981
+ end
2982
+ when LogicNodeType::Or
2983
+ # or is only valid if only it recursively contains only literals or disjunctions
2984
+ node_children.all? do |child|
2985
+ [
2986
+ child.type == LogicNodeType::True,
2987
+ child.type == LogicNodeType::False,
2988
+ child.type == LogicNodeType::Term,
2989
+ ((child.type == LogicNodeType::Not) && \
2990
+ child.node_children.fetch(0).type == LogicNodeType::Term),
2991
+ child.type == LogicNodeType::Or && \
2992
+ child.node_children.all? { |grandchild| grandchild.nested_cnf_conjunction_term?(true) }
2993
+ ].any?
2994
+ end
2995
+ when LogicNodeType::Xor, LogicNodeType::If, LogicNodeType::None
2996
+ false
2997
+ else
2998
+ T.absurd(@type)
2999
+ end
3000
+ @memo.is_nested_cnf = ret
3001
+ end
3002
+
3003
+ sig { params(cfg_arch: ConfiguredArchitecture, solver: Z3Solver).returns(Z3::BoolExpr).checked(:never) }
3004
+ def to_z3(cfg_arch, solver = Z3Solver.new)
3005
+ case @type
3006
+ when LogicNodeType::Term
3007
+ t = @children.fetch(0)
3008
+ if t.is_a?(ParameterTerm) || t.is_a?(ExtensionTerm)
3009
+ t.to_z3(solver, cfg_arch)
3010
+ elsif t.is_a?(FreeTerm)
3011
+ t.to_z3
3012
+ else
3013
+ raise "unexpected #{self}" if t.is_a?(LogicNode)
3014
+
3015
+ t.to_z3(solver)
3016
+ end
3017
+ when LogicNodeType::Or
3018
+ T.unsafe(Z3).Or(*node_children.map { |c| c.to_z3(cfg_arch, solver) })
3019
+ when LogicNodeType::And
3020
+ T.unsafe(Z3).And(*node_children.map { |c| c.to_z3(cfg_arch, solver) })
3021
+ when LogicNodeType::Xor
3022
+ if node_children.size == 2
3023
+ T.unsafe(Z3).Xor(*node_children.map { |c| c.to_z3(cfg_arch, solver) })
3024
+ else
3025
+ # see https://stackoverflow.com/questions/14888174/how-do-i-determine-if-exactly-one-boolean-is-true-without-type-conversion#33268481
3026
+ uneven_number_is_true = T.unsafe(Z3).Xor(*node_children.map { |c| c.to_z3(cfg_arch, solver) })
3027
+ max_one_is_true =
3028
+ T.unsafe(Z3).And(
3029
+ *node_children.combination(2).map do |pair|
3030
+ !(pair.fetch(0).to_z3(cfg_arch, solver) & pair.fetch(1).to_z3(cfg_arch, solver))
3031
+ end
3032
+ )
3033
+ uneven_number_is_true & max_one_is_true
3034
+ end
3035
+ when LogicNodeType::True
3036
+ Z3.True
3037
+ when LogicNodeType::False
3038
+ Z3.False
3039
+ when LogicNodeType::Not
3040
+ !node_children.fetch(0).to_z3(cfg_arch, solver)
3041
+ when LogicNodeType::None
3042
+ !node_children.map { |c| c.to_z3(cfg_arch, solver) }.reduce(:|)
3043
+ when LogicNodeType::If
3044
+ node_children.fetch(0).to_z3(cfg_arch, solver).implies(node_children.fetch(1).to_z3(cfg_arch, solver))
3045
+ else
3046
+ T.absurd(@type)
3047
+ end
3048
+ end
3049
+
3050
+ # @return true iff self is satisfiable (possible to be true for some combination of term values)
3051
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(T::Boolean) }
3052
+ def satisfiable?(cfg_arch)
3053
+ @memo.is_satisfiable ||=
3054
+ begin
3055
+ nterms = terms.size
3056
+
3057
+ if nterms < 8 && literals.size <= 128
3058
+ # just brute force it
3059
+ LogicNode.inc_brute_force_sat_solves
3060
+ term_idx = T.let({}, T::Hash[TermType, Integer])
3061
+ terms.each_with_index do |term, idx|
3062
+ term_idx[term] = idx
3063
+ end
3064
+ # define the callback outside the loop to avoid allocating a new block on every iteration
3065
+ val_out_of_loop = 0
3066
+ cb = LogicNode.make_eval_cb do |term|
3067
+ ((val_out_of_loop >> term_idx.fetch(term)) & 1).zero? ? SatisfiedResult::No : SatisfiedResult::Yes
3068
+ end
3069
+
3070
+ if nterms.zero?
3071
+ return eval_cb(cb) == SatisfiedResult::Yes
3072
+ else
3073
+ (2**nterms).to_i.times do |i|
3074
+ val_out_of_loop = i
3075
+ if eval_cb(cb) == SatisfiedResult::Yes
3076
+ return true
3077
+ end
3078
+ end
3079
+ end
3080
+ return false
3081
+
3082
+ else
3083
+ # use SAT solver
3084
+ LogicNode.inc_z3_sat_solves
3085
+
3086
+ @@cache ||= {}
3087
+ cache_key = [hash, cfg_arch.hash].hash
3088
+ if @@cache.key?(cache_key)
3089
+ LogicNode.inc_z3_cache_hits
3090
+ return @@cache[cache_key]
3091
+ end
3092
+
3093
+ solver = Z3Solver.new
3094
+ solver.assert to_z3(cfg_arch, solver)
3095
+ @@cache[cache_key] = solver.satisfiable?
3096
+ end
3097
+ end
3098
+ end
3099
+
3100
+ # @return true iff self is unsatisfiable (not possible to be true for any combination of term values)
3101
+ sig { params(cfg_arch: ConfiguredArchitecture).returns(T::Boolean) }
3102
+ def unsatisfiable?(cfg_arch) = !satisfiable?(cfg_arch)
3103
+
3104
+ sig { params(other: LogicNode, cfg_arch: ConfiguredArchitecture).returns(T::Boolean) }
3105
+ def equisatisfiable?(other, cfg_arch)
3106
+ if satisfiable?(cfg_arch)
3107
+ other.satisfiable?(cfg_arch)
3108
+ else
3109
+ !other.satisfiable?(cfg_arch)
3110
+ end
3111
+ end
3112
+
3113
+ # @return true iff self and other are logically equivalent (identical truth tables)
3114
+ sig { params(other: LogicNode, cfg_arch: ConfiguredArchitecture).returns(T::Boolean) }
3115
+ def equivalent?(other, cfg_arch)
3116
+ # equivalent (A <=> B) if the biconditional is true:
3117
+ # (A -> B) && (B -> A)
3118
+ # or, expressed without implication:
3119
+ # (!A || B) && (!B || A)
3120
+
3121
+ # equivalence is a tautology iff ~(A <=> B) is a contradiction,
3122
+ # i.e., !(A <=> B) is UNSATISFIABLE
3123
+ # !((!A || B) && (!B || A)) is UNSATISFIABLE
3124
+
3125
+ r = self
3126
+ other = other
3127
+ contradiction = LogicNode.new(
3128
+ LogicNodeType::Not,
3129
+ [
3130
+ LogicNode.new(
3131
+ LogicNodeType::And,
3132
+ [
3133
+ LogicNode.new(
3134
+ LogicNodeType::Or,
3135
+ [
3136
+ LogicNode.new(LogicNodeType::Not, [r]),
3137
+ other
3138
+ ]
3139
+ ),
3140
+ LogicNode.new(
3141
+ LogicNodeType::Or,
3142
+ [
3143
+ LogicNode.new(LogicNodeType::Not, [r]),
3144
+ self
3145
+ ]
3146
+ )
3147
+ ]
3148
+ )
3149
+ ]
3150
+ )
3151
+ contradiction.unsatisfiable?(cfg_arch)
3152
+ end
3153
+
3154
+ sig {
3155
+ params(
3156
+ tree: LogicNode,
3157
+ term_map: T::Hash[TermType, String]
3158
+ )
3159
+ .returns(String)
3160
+ .checked(:never)
3161
+ }
3162
+ def do_to_eqntott(tree, term_map)
3163
+ t = tree.type
3164
+ case t
3165
+ when LogicNodeType::True
3166
+ "1"
3167
+ when LogicNodeType::False
3168
+ "0"
3169
+ when LogicNodeType::And
3170
+ "(#{tree.node_children.map { |child| do_to_eqntott(child, term_map) }.join(" & ")})"
3171
+ when LogicNodeType::Or
3172
+ "(#{tree.node_children.map { |child| do_to_eqntott(child, term_map) }.join(" | ")})"
3173
+ when LogicNodeType::Xor
3174
+ do_to_eqntott(tree.nnf, term_map)
3175
+ when LogicNodeType::None
3176
+ do_to_eqntott(LogicNode.new(LogicNodeType::Not, [LogicNode.new(LogicNodeType::Or, tree.children)]), term_map)
3177
+ when LogicNodeType::Term
3178
+ term_map.fetch(T.cast(tree.children.fetch(0), TermType))
3179
+ when LogicNodeType::Not
3180
+ "!(#{do_to_eqntott(tree.node_children.fetch(0), term_map)})"
3181
+ when LogicNodeType::If
3182
+ do_to_eqntott(tree.nnf, term_map)
3183
+ else
3184
+ T.absurd(t)
3185
+ end
3186
+ end
3187
+
3188
+ class EqntottResult < T::Struct
3189
+ const :eqn, String
3190
+ const :term_map, T::Hash[String, TermType]
3191
+ end
3192
+
3193
+ # return equation suitable for `eqntott` input
3194
+ sig { returns(EqntottResult) }
3195
+ def to_eqntott
3196
+ next_term_name = "a"
3197
+ term_map = T.let({}, T::Hash[TermType, String])
3198
+ t = terms
3199
+ t.each do |term|
3200
+ unless term_map.key?(term)
3201
+ term_map[term] = next_term_name
3202
+ next_term_name = next_term_name.next
3203
+ end
3204
+ end
3205
+
3206
+ EqntottResult.new(eqn: "out = #{do_to_eqntott(self, term_map)}", term_map: term_map.invert)
3207
+ end
3208
+
3209
+ # @api private
3210
+ sig { params(node: LogicNode).returns(LogicNode) }
3211
+ def distribute_not_helper(node)
3212
+ child = node.node_children.fetch(0)
3213
+ child_type = child.type
3214
+ case child_type
3215
+ when LogicNodeType::And
3216
+ LogicNode.new(LogicNodeType::Or, child.children.map { |c| LogicNode.new(LogicNodeType::Not, [c]).distribute_not })
3217
+ when LogicNodeType::Or
3218
+ LogicNode.new(LogicNodeType::And, child.children.map { |c| LogicNode.new(LogicNodeType::Not, [c]).distribute_not })
3219
+ when LogicNodeType::Not
3220
+ if child.node_children.fetch(0).type == LogicNodeType::Term
3221
+ child.node_children.fetch(0)
3222
+ else
3223
+ distribute_not_helper(child)
3224
+ end
3225
+ when LogicNodeType::Term
3226
+ self
3227
+ when LogicNodeType::True
3228
+ LogicNode.new(LogicNodeType::False, [])
3229
+ when LogicNodeType::False
3230
+ LogicNode.new(LogicNodeType::True, [])
3231
+ when LogicNodeType::None, LogicNodeType::Xor, LogicNodeType::If
3232
+ raise "Expecting format to start in CNF or DNF"
3233
+ else
3234
+ T.absurd(child_type)
3235
+ end
3236
+ end
3237
+ private :distribute_not_helper
3238
+
3239
+ # @api private
3240
+ sig { returns(LogicNode) }
3241
+ def distribute_not
3242
+ # recursively apply demorgan until we get to terms
3243
+ raise "Not a negation" unless @type == LogicNodeType::Not
3244
+
3245
+ distribute_not_helper(self)
3246
+ end
3247
+
3248
+ # @api private
3249
+ sig {
3250
+ params(subformulae: T::Array[LogicNode])
3251
+ .void
3252
+ .checked(:never)
3253
+ }
3254
+ def collect_tseytin(subformulae)
3255
+ case @type
3256
+ when LogicNodeType::And
3257
+ # (¬A ∨ ¬B ∨ p) ∧ (A ∨ ¬p) ∧ (B ∨ ¬p)
3258
+ a = node_children.fetch(0).tseytin_prop
3259
+ b = node_children.fetch(1).tseytin_prop
3260
+ subformulae <<
3261
+ LogicNode.new(
3262
+ LogicNodeType::And,
3263
+ [
3264
+ LogicNode.new(LogicNodeType::Or,
3265
+ [
3266
+ LogicNode.new(LogicNodeType::Not, [a]),
3267
+ LogicNode.new(LogicNodeType::Not, [b]),
3268
+ tseytin_prop
3269
+ ]
3270
+ ),
3271
+ LogicNode.new(LogicNodeType::Or,
3272
+ [
3273
+ a,
3274
+ LogicNode.new(LogicNodeType::Not, [tseytin_prop])
3275
+ ]
3276
+ ),
3277
+ LogicNode.new(LogicNodeType::Or,
3278
+ [
3279
+ b,
3280
+ LogicNode.new(LogicNodeType::Not, [tseytin_prop])
3281
+ ]
3282
+ )
3283
+ ]
3284
+ )
3285
+ node_children.fetch(0).collect_tseytin(subformulae)
3286
+ node_children.fetch(1).collect_tseytin(subformulae)
3287
+ when LogicNodeType::Or
3288
+ # (A ∨ B ∨ ¬p) ∧ (¬A ∨ p) ∧ (¬B ∨ p)
3289
+ a = node_children.fetch(0).tseytin_prop
3290
+ b = node_children.fetch(1).tseytin_prop
3291
+ subformulae <<
3292
+ LogicNode.new(
3293
+ LogicNodeType::And,
3294
+ [
3295
+ LogicNode.new(LogicNodeType::Or, [a, b, LogicNode.new(LogicNodeType::Not, [tseytin_prop])]),
3296
+ LogicNode.new(LogicNodeType::Or, [LogicNode.new(LogicNodeType::Not, [a]), tseytin_prop]),
3297
+ LogicNode.new(LogicNodeType::Or, [LogicNode.new(LogicNodeType::Not, [b]), tseytin_prop])
3298
+ ]
3299
+ )
3300
+ node_children.fetch(0).collect_tseytin(subformulae)
3301
+ node_children.fetch(1).collect_tseytin(subformulae)
3302
+ when LogicNodeType::Not
3303
+ # (A ∨ p) ∧ (¬A ∨ ¬p)
3304
+ a = node_children.fetch(0).tseytin_prop
3305
+ subformulae <<
3306
+ LogicNode.new(
3307
+ LogicNodeType::And,
3308
+ [
3309
+ LogicNode.new(LogicNodeType::Or, [a, tseytin_prop]),
3310
+ LogicNode.new(LogicNodeType::Or, [
3311
+ LogicNode.new(LogicNodeType::Not, [a]),
3312
+ LogicNode.new(LogicNodeType::Not, [tseytin_prop]),
3313
+ ])
3314
+ ]
3315
+ )
3316
+ node_children.fetch(0).collect_tseytin(subformulae)
3317
+ when LogicNodeType::True, LogicNodeType::False
3318
+ # pass
3319
+ when LogicNodeType::Term
3320
+ # pass
3321
+ else
3322
+ raise "? #{@type}"
3323
+ end
3324
+ end
3325
+
3326
+ # a free variable representing this formula
3327
+ sig { returns(LogicNode) }
3328
+ def tseytin_prop
3329
+ case @type
3330
+ when LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False
3331
+ self
3332
+ else
3333
+ @tseytin_prop ||=
3334
+ LogicNode.new(LogicNodeType::Term, [FreeTerm.new])
3335
+ end
3336
+ end
3337
+
3338
+ # @api private
3339
+ sig { returns(LogicNode) }
3340
+ def tseytin
3341
+ subformulae = []
3342
+ r = reduce
3343
+ return r if [LogicNodeType::Term, LogicNodeType::True, LogicNodeType::False].any?(r.type)
3344
+
3345
+ grouped = r.group_by_2
3346
+ grouped.collect_tseytin(subformulae)
3347
+
3348
+ if subformulae.size == 0
3349
+ raise "? #{r}"
3350
+ elsif subformulae.size == 1
3351
+ subformulae.fetch(0)
3352
+ else
3353
+ equisatisfiable_formula = LogicNode.new(LogicNodeType::And, subformulae + [grouped.tseytin_prop])
3354
+ flatten_cnf(equisatisfiable_formula).reduce
3355
+ end
3356
+ end
3357
+
3358
+ sig { returns(String) }
3359
+ def to_dimacs
3360
+ if @type == LogicNodeType::Term
3361
+ <<~DIMACS
3362
+ p cnf 1 1
3363
+ 1 0
3364
+ DIMACS
3365
+ elsif @type == LogicNodeType::Not && node_children.fetch(0).type == LogicNodeType::Term
3366
+ <<~DIMACS
3367
+ p cnf 1 1
3368
+ -1 0
3369
+ DIMACS
3370
+ elsif @type == LogicNodeType::True || @type == LogicNodeType::False
3371
+ raise "Cannot represent true/false in DIMACS"
3372
+ elsif @type == LogicNodeType::And
3373
+ lines = ["p cnf #{terms.size} #{@children.size}"]
3374
+ lines += node_children.map do |child|
3375
+ if child.type == LogicNodeType::Or
3376
+ term_line = child.node_children.map do |grandchild|
3377
+ if grandchild.type == LogicNodeType::Not
3378
+ (-(T.must(terms.index(grandchild.node_children.fetch(0).node_children.fetch(0))) + 1)).to_s
3379
+ elsif grandchild.type == LogicNodeType::Term
3380
+ (T.must(terms.index(grandchild.node_children.fetch(0))) + 1).to_s
3381
+ end
3382
+ end.join(" ")
3383
+ "#{term_line} 0"
3384
+ elsif child.type == LogicNodeType::Term
3385
+ "#{T.must(terms.index(child.children.fetch(0))) + 1} 0"
3386
+ elsif child.type == LogicNodeType::Not
3387
+ "-#{T.must(terms.index(child.node_children.fetch(0).children.fetch(0))) + 1} 0"
3388
+ else
3389
+ raise "Not CNF"
3390
+ end
3391
+ end
3392
+
3393
+ lines.join("\n")
3394
+ else
3395
+ raise "Not CNF"
3396
+ end
3397
+ end
3398
+
3399
+ sig { params(dimacs: String).returns(LogicNode) }
3400
+ def from_dimacs(dimacs)
3401
+ nodes = dimacs.each_line.map do |line|
3402
+ if line =~ /^(((-?\d+) )+)0/
3403
+ ts = T.let($1.strip.split(" "), T::Array[String])
3404
+ if ts.size == 1
3405
+ t = ts.fetch(0)
3406
+ if t[0] == "-"
3407
+ index = t[1..].to_i - 1
3408
+ LogicNode.new(
3409
+ LogicNodeType::Not,
3410
+ [LogicNode.new(LogicNodeType::Term, [terms.fetch(index)])]
3411
+ )
3412
+ else
3413
+ index = t.to_i - 1
3414
+ LogicNode.new(LogicNodeType::Term, [terms.fetch(index)])
3415
+ end
3416
+ else
3417
+ LogicNode.new(LogicNodeType::Or,
3418
+ ts.map do |t|
3419
+ if t[0] == "-"
3420
+ i = t[1..].to_i - 1
3421
+ LogicNode.new(
3422
+ LogicNodeType::Not,
3423
+ [LogicNode.new(LogicNodeType::Term, [terms.fetch(i)])]
3424
+ )
3425
+ else
3426
+ i = t.to_i - 1
3427
+ LogicNode.new(LogicNodeType::Term, [terms.fetch(i)])
3428
+ end
3429
+ end
3430
+ )
3431
+ end
3432
+ else
3433
+ nil
3434
+ end
3435
+ end.compact
3436
+
3437
+ if nodes.size == 1
3438
+ nodes.fetch(0)
3439
+ else
3440
+ LogicNode.new(LogicNodeType::And, nodes)
3441
+ end
3442
+ end
3443
+
3444
+ # return minimally unsatisfiable subsets of the unstatisfiable formula
3445
+ sig { returns(T::Array[LogicNode]) }
3446
+ def minimal_unsat_subsets
3447
+ r = reduce
3448
+ c = r.equiv_cnf(raise_on_explosion: false)
3449
+ Tempfile.create(%w/formula .cnf/) do |f|
3450
+ f.write c.to_dimacs
3451
+ f.flush
3452
+
3453
+ Tempfile.create do |rf|
3454
+ # run must, re-use the tempfile for the result
3455
+ _stdout, status = Open3.capture2(Udb::MustPath.binary, "-o", rf.path, f.path)
3456
+ raise "could not find minimal subsets" unless status.success?
3457
+
3458
+ rf.rewind
3459
+ result = rf.read
3460
+
3461
+ mus_dimacs = T.let([], T::Array[String])
3462
+ cur_dimacs = T.let(nil, T.nilable(String))
3463
+ result.each_line do |line|
3464
+ if line =~ /MUS #\d+/
3465
+ mus_dimacs << cur_dimacs unless cur_dimacs.nil?
3466
+ cur_dimacs = ""
3467
+ else
3468
+ cur_dimacs = T.must(cur_dimacs) + line
3469
+ end
3470
+ end
3471
+ mus_dimacs << T.must(cur_dimacs)
3472
+
3473
+ return mus_dimacs.map { |d| c.from_dimacs(d) }
3474
+ end
3475
+ end
3476
+ end
3477
+
3478
+
3479
+ # minimize the function using espresso
3480
+ sig {
3481
+ params(
3482
+ result_type: CanonicalizationType,
3483
+ exact: T::Boolean
3484
+ )
3485
+ .returns(LogicNode)
3486
+ }
3487
+ def espresso(result_type, exact)
3488
+ nterms = terms.size
3489
+
3490
+ pla =
3491
+ if nterms > 4 || literals.size >= 32
3492
+
3493
+ eqn_result =
3494
+ if result_type == CanonicalizationType::SumOfProducts
3495
+ to_eqntott
3496
+ elsif result_type == CanonicalizationType::ProductOfSums
3497
+ LogicNode.new(LogicNodeType::Not, [self]).to_eqntott
3498
+ else
3499
+ T.absurd(result_type)
3500
+ end
3501
+ tt = T.let(nil, T.nilable(String))
3502
+ Tempfile.open do |f|
3503
+ f.write <<~FILE
3504
+ NAME=f;
3505
+ #{eqn_result.eqn};
3506
+ FILE
3507
+ f.flush
3508
+
3509
+ tt, status = Open3.capture2(Udb::EqntottPath.binary, "-l", T.must(f.path))
3510
+ raise "eqntott failure" unless status.success?
3511
+ end
3512
+
3513
+ if T.must(tt).lines.any? { |l| l =~ /^\.p 0/ }
3514
+ if result_type == CanonicalizationType::SumOfProducts
3515
+ # short circuit here, it's trivially false
3516
+ return LogicNode.new(LogicNodeType::False, [])
3517
+ else
3518
+ # short circuit here, it's trivially true
3519
+ return LogicNode.new(LogicNodeType::True, [])
3520
+ end
3521
+ end
3522
+ tt
3523
+ else
3524
+
3525
+ term_idx = T.let({}, T::Hash[TermType, Integer])
3526
+ terms.each_with_index do |term, idx|
3527
+ term_idx[term] = idx
3528
+ end
3529
+
3530
+ # define the callback outside the loop to avoid allocating a new block on every iteration
3531
+ val_out_of_loop = 0
3532
+ cb = LogicNode.make_eval_cb do |term|
3533
+ ((val_out_of_loop >> term_idx.fetch(term)) & 1).zero? ? SatisfiedResult::No : SatisfiedResult::Yes
3534
+ end
3535
+
3536
+ tt = T.let([], T::Array[T::Array[String]])
3537
+ (1 << nterms).times do |val|
3538
+ val_out_of_loop = val
3539
+ if result_type == CanonicalizationType::SumOfProducts
3540
+ if eval_cb(cb) == SatisfiedResult::Yes
3541
+ tt << [val.to_s(2).rjust(nterms, "0").reverse, "1"]
3542
+ else
3543
+ tt << [val.to_s(2).rjust(nterms, "0").reverse, "0"]
3544
+ end
3545
+ elsif result_type == CanonicalizationType::ProductOfSums
3546
+ if eval_cb(cb) == SatisfiedResult::Yes
3547
+ tt << [val.to_s(2).rjust(nterms, "0").reverse, "0"]
3548
+ else
3549
+ tt << [val.to_s(2).rjust(nterms, "0").reverse, "1"]
3550
+ end
3551
+ end
3552
+ end
3553
+
3554
+ <<~INFILE
3555
+ .i #{nterms}
3556
+ .o 1
3557
+ .na f
3558
+ .ob out
3559
+ .p #{tt.size}
3560
+ #{tt.map { |t| t.join(" ") }.join("\n")}
3561
+ INFILE
3562
+ end
3563
+
3564
+ Tempfile.open do |f|
3565
+ f.write pla
3566
+ f.flush
3567
+
3568
+ args =
3569
+ if exact
3570
+ [Udb::EspressoPath.binary, "-Dsignature", f.path]
3571
+ else
3572
+ [Udb::EspressoPath.binary, "-efast", f.path]
3573
+ end
3574
+ result, status = T.unsafe(Open3).capture2e(*args)
3575
+ raise "espresso failure\n#{result}" unless status.success?
3576
+
3577
+ sop_terms = []
3578
+ always_true = T.let(false, T::Boolean)
3579
+ result.lines.each_with_index do |line, idx|
3580
+ next if line[0] == "."
3581
+ next if line[0] == "#"
3582
+
3583
+ if line =~ /^([01\-]{#{terms.size}}) 1/
3584
+ term = $1
3585
+ conjunction_kids = []
3586
+ terms.size.times do |i|
3587
+ if term[i] == "1"
3588
+ conjunction_kids << LogicNode.new(LogicNodeType::Term, [terms.fetch(i)])
3589
+ elsif term[i] == "0"
3590
+ conjunction_kids << LogicNode.new(LogicNodeType::Not, [LogicNode.new(LogicNodeType::Term, [terms.fetch(i)])])
3591
+ else
3592
+ raise "unexpected" unless term[i] == "-"
3593
+ end
3594
+ end
3595
+ if conjunction_kids.size == 1
3596
+ sop_terms << conjunction_kids.fetch(0)
3597
+ elsif conjunction_kids.size > 0
3598
+ sop_terms << LogicNode.new(LogicNodeType::And, conjunction_kids)
3599
+ else
3600
+ # always true
3601
+ always_true = true
3602
+ end
3603
+ end
3604
+ end
3605
+
3606
+ sop =
3607
+ if sop_terms.size == 1
3608
+ sop_terms.fetch(0)
3609
+ elsif sop_terms.size > 0
3610
+ LogicNode.new(LogicNodeType::Or, sop_terms)
3611
+ else
3612
+ always_true ? LogicNode.new(LogicNodeType::True, []) : LogicNode.new(LogicNodeType::False, [])
3613
+ end
3614
+
3615
+ if result_type == CanonicalizationType::SumOfProducts
3616
+ sop
3617
+ else
3618
+ # result is actually !result, so negate it and then distribute
3619
+ LogicNode.new(LogicNodeType::Not, [sop]).distribute_not
3620
+ end
3621
+ end
3622
+
3623
+ end
3624
+
3625
+ # @api private
3626
+ sig { override.returns(Integer) }
3627
+ def hash = to_h.hash
3628
+
3629
+ sig { override.params(other: T.untyped).returns(T::Boolean) }
3630
+ def eql?(other)
3631
+ return false unless other.is_a?(LogicNode)
3632
+
3633
+ to_h.eql?(other.to_h)
3634
+ end
3635
+ end
3636
+ end