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)