/ test / common / test_isa.py
test_isa.py
  1  import pytest
  2  import unittest
  3  
  4  from coreblocks.arch.isa import Extension, ISA
  5  
  6  
  7  class TestISA(unittest.TestCase):
  8      class ISATestEntry:
  9          def __init__(self, isa_str, valid, xlen=None, reg_cnt=None, extensions=None):
 10              self.isa_str = isa_str
 11              self.valid = valid
 12              self.xlen = xlen
 13              self.reg_cnt = reg_cnt
 14              self.extensions = extensions
 15  
 16      ISA_TESTS = [
 17          ISATestEntry("rv32i", True, 32, 32, Extension.I),
 18          ISATestEntry("RV32I", True, 32, 32, Extension.I),
 19          ISATestEntry(
 20              "rv32ima",
 21              True,
 22              32,
 23              32,
 24              Extension.I | Extension.M | Extension.ZMMUL | Extension.A | Extension.ZAAMO | Extension.ZALRSC,
 25          ),
 26          ISATestEntry(
 27              "rv32imafdc_zicsr",
 28              True,
 29              32,
 30              32,
 31              Extension.I
 32              | Extension.M
 33              | Extension.A
 34              | Extension.ZAAMO
 35              | Extension.ZALRSC
 36              | Extension.F
 37              | Extension.D
 38              | Extension.C
 39              | Extension.ZCA
 40              | Extension.ZCF
 41              | Extension.ZCD
 42              | Extension.ZICSR
 43              | Extension.ZMMUL,
 44          ),
 45          ISATestEntry(
 46              "rv32imf",
 47              True,
 48              32,
 49              32,
 50              Extension.I | Extension.M | Extension.F | Extension.ZICSR | Extension.ZMMUL,
 51          ),
 52          ISATestEntry(
 53              "rv32izicsr",
 54              True,
 55              32,
 56              32,
 57              Extension.I | Extension.ZICSR,
 58          ),
 59          ISATestEntry(
 60              "rv32imczicsr",
 61              True,
 62              32,
 63              32,
 64              Extension.I | Extension.M | Extension.ZMMUL | Extension.C | Extension.ZCA | Extension.ZICSR,
 65          ),
 66          ISATestEntry(
 67              "rv32i_zmmul",
 68              True,
 69              32,
 70              32,
 71              Extension.I | Extension.ZMMUL,
 72          ),
 73          ISATestEntry(
 74              "rv32imafdc_zifencei_zicsr",
 75              True,
 76              32,
 77              32,
 78              Extension.I
 79              | Extension.M
 80              | Extension.ZMMUL
 81              | Extension.A
 82              | Extension.ZAAMO
 83              | Extension.ZALRSC
 84              | Extension.F
 85              | Extension.D
 86              | Extension.C
 87              | Extension.ZCA
 88              | Extension.ZCF
 89              | Extension.ZCD
 90              | Extension.ZIFENCEI
 91              | Extension.ZICSR,
 92          ),
 93          ISATestEntry(
 94              "rv32imafdczifencei_zicsr",
 95              True,
 96              32,
 97              32,
 98              Extension.I
 99              | Extension.M
100              | Extension.ZMMUL
101              | Extension.A
102              | Extension.ZAAMO
103              | Extension.ZALRSC
104              | Extension.F
105              | Extension.D
106              | Extension.C
107              | Extension.ZCA
108              | Extension.ZCF
109              | Extension.ZCD
110              | Extension.ZIFENCEI
111              | Extension.ZICSR,
112          ),
113          ISATestEntry(
114              "rv32i_m_a_f_d_c_zifencei_zicsr",
115              True,
116              32,
117              32,
118              Extension.I
119              | Extension.M
120              | Extension.ZMMUL
121              | Extension.A
122              | Extension.ZAAMO
123              | Extension.ZALRSC
124              | Extension.F
125              | Extension.D
126              | Extension.C
127              | Extension.ZCA
128              | Extension.ZCF
129              | Extension.ZCD
130              | Extension.ZIFENCEI
131              | Extension.ZICSR,
132          ),
133          ISATestEntry("rv32ec_zicsr", True, 32, 16, Extension.E | Extension.C | Extension.ZCA | Extension.ZICSR),
134          ISATestEntry("rv64i", True, 64, 32, Extension.I),
135          ISATestEntry(
136              "rv64g",
137              True,
138              64,
139              32,
140              Extension.I
141              | Extension.M
142              | Extension.ZMMUL
143              | Extension.A
144              | Extension.ZAAMO
145              | Extension.ZALRSC
146              | Extension.F
147              | Extension.D
148              | Extension.ZIFENCEI
149              | Extension.ZICSR,
150          ),
151          ISATestEntry("rv32ie", True, 32, 32, Extension.I | Extension.E),
152          ISATestEntry("rv32", False),
153          ISATestEntry("rv64e", False),
154          ISATestEntry("rv32fdc", False),
155          ISATestEntry("rv32izicsrzmmul", False),
156          ISATestEntry("rv64imadc", False),
157          ISATestEntry("rvima", False),
158          ISATestEntry("rv42i", False),
159      ]
160  
161      def do_test(self, test):
162          def _do_test():
163              isa = ISA(test.isa_str)
164              assert isa.xlen == test.xlen
165              assert isa.reg_cnt == test.reg_cnt
166              assert isa.extensions == test.extensions
167              assert isa.ilen == 32
168  
169          if not test.valid:
170              with pytest.raises(RuntimeError):
171                  _do_test()
172          else:
173              _do_test()
174  
175      def test_isa(self):
176          for test in self.ISA_TESTS:
177              self.do_test(test)