diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f86ed1..a0de054 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,6 +144,12 @@ add_test( --fixture ${CMAKE_CURRENT_SOURCE_DIR}/tests/fixtures/pto_v058_shared_state.json) set_tests_properties(linx_model_check_pto_v058_shared_fixture PROPERTIES LABELS "checks") +add_test( + NAME linx_model_check_diff_runner + COMMAND + ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/tests/avs/test_run_model_diff_suite.py) +set_tests_properties(linx_model_check_diff_runner PROPERTIES LABELS "checks") add_test( NAME linx_model_check_gen_minst_codec COMMAND diff --git a/include/linx/model/emulator/execution_context.hpp b/include/linx/model/emulator/execution_context.hpp index b5d8fdf..db4d19e 100644 --- a/include/linx/model/emulator/execution_context.hpp +++ b/include/linx/model/emulator/execution_context.hpp @@ -73,6 +73,8 @@ class ExecutionContext { [[nodiscard]] std::optional Read16(std::uint64_t addr) const; [[nodiscard]] std::optional Read32(std::uint64_t addr) const; [[nodiscard]] std::optional Read64(std::uint64_t addr) const; + [[nodiscard]] std::optional> ReadMemoryRange(std::uint64_t addr, + std::size_t size) const; void Write8(std::uint64_t addr, std::uint8_t value); void Write32(std::uint64_t addr, std::uint32_t value); void Write64(std::uint64_t addr, std::uint64_t value); diff --git a/include/linx/model/sim_main.hpp b/include/linx/model/sim_main.hpp index 851a76f..e6e2842 100644 --- a/include/linx/model/sim_main.hpp +++ b/include/linx/model/sim_main.hpp @@ -22,6 +22,9 @@ namespace linx::model { struct SimMainArgs { std::string engine = "ref"; std::optional emit_trace_path; + std::optional result_dump_path; + std::optional result_address; + std::optional result_size; std::optional stop_pc; std::optional max_cycles; std::size_t compare_window = 128; diff --git a/src/emulator/execution_context.cpp b/src/emulator/execution_context.cpp index 80cf3ef..f0529bd 100644 --- a/src/emulator/execution_context.cpp +++ b/src/emulator/execution_context.cpp @@ -1,6 +1,7 @@ #include "linx/model/emulator/execution_context.hpp" #include +#include #include "linx/model/sim_assert.hpp" @@ -148,6 +149,23 @@ std::optional ExecutionContext::Read64(std::uint64_t addr) const return value; } +std::optional> ExecutionContext::ReadMemoryRange(std::uint64_t addr, + std::size_t size) const { + if (size > 0 && size - 1U > std::numeric_limits::max() - addr) { + return std::nullopt; + } + std::vector bytes; + bytes.reserve(size); + for (std::size_t index = 0; index < size; ++index) { + const auto byte = Read8(addr + index); + if (!byte.has_value()) { + return std::nullopt; + } + bytes.push_back(*byte); + } + return bytes; +} + void ExecutionContext::Write8(std::uint64_t addr, std::uint8_t value) { memory_[addr] = value; } diff --git a/src/isa/generated_tables.cpp b/src/isa/generated_tables.cpp index 368dddc..fea0b53 100644 --- a/src/isa/generated_tables.cpp +++ b/src/isa/generated_tables.cpp @@ -5173,7 +5173,7 @@ const MinstConstraintDesc kConstraints[] = { const std::size_t kConstraintCount = 780; const MinstFormDesc kForms[] = { - {.uid = "4ecf52b5127e", + {.uid = "a9c0e33f9904", .mnemonic = "ACRC", .asm_template = "acrc rst_type", .encoding_kind = "L32", @@ -5188,7 +5188,7 @@ const MinstFormDesc kForms[] = { .field_count = 1, .constraint_start = 0, .constraint_count = 0}, - {.uid = "a8259d99731c", + {.uid = "54b80944d32d", .mnemonic = "ACRE", .asm_template = "acre rra_type", .encoding_kind = "L32", @@ -5203,7 +5203,7 @@ const MinstFormDesc kForms[] = { .field_count = 1, .constraint_start = 0, .constraint_count = 14}, - {.uid = "3af05dd9677d", + {.uid = "d04202886d0a", .mnemonic = "ADD", .asm_template = "add SrcL, SrcR<{.sw,.uw,.neg}><<, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5218,7 +5218,7 @@ const MinstFormDesc kForms[] = { .field_count = 5, .constraint_start = 14, .constraint_count = 0}, - {.uid = "1f3ff8db558b", + {.uid = "2decd0a93a0a", .mnemonic = "ADDI", .asm_template = "addi SrcL, uimm, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5233,7 +5233,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 14, .constraint_count = 0}, - {.uid = "21a5eabbbdc6", + {.uid = "08cc89cd2689", .mnemonic = "ADDIW", .asm_template = "addiw SrcL, uimm, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5248,7 +5248,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 14, .constraint_count = 0}, - {.uid = "425b43c01598", + {.uid = "e5aa0f0abca3", .mnemonic = "ADDTPC", .asm_template = "addtpc simm, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5263,7 +5263,7 @@ const MinstFormDesc kForms[] = { .field_count = 2, .constraint_start = 14, .constraint_count = 1}, - {.uid = "f237d211a91d", + {.uid = "a27109fe30fc", .mnemonic = "ADDW", .asm_template = "addw SrcL, SrcR<{.sw,.uw,.neg}><<, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5278,7 +5278,7 @@ const MinstFormDesc kForms[] = { .field_count = 5, .constraint_start = 15, .constraint_count = 0}, - {.uid = "947d0acde105", + {.uid = "b6a903a3ec94", .mnemonic = "AND", .asm_template = "and SrcL, SrcR<{.sw,.uw,.not}><<, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5293,7 +5293,7 @@ const MinstFormDesc kForms[] = { .field_count = 5, .constraint_start = 15, .constraint_count = 0}, - {.uid = "2465e8402fe6", + {.uid = "1d9302e57d30", .mnemonic = "ANDI", .asm_template = "andi SrcL, simm, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5308,7 +5308,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 15, .constraint_count = 0}, - {.uid = "a84e137e01a1", + {.uid = "9ec1f7343dbd", .mnemonic = "ANDIW", .asm_template = "andiw SrcL, simm, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5323,7 +5323,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 15, .constraint_count = 0}, - {.uid = "e5aabf349678", + {.uid = "6907ed7cec90", .mnemonic = "ANDW", .asm_template = "andw SrcL, SrcR<{.sw,.uw,.not}><<, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5338,7 +5338,7 @@ const MinstFormDesc kForms[] = { .field_count = 5, .constraint_start = 15, .constraint_count = 0}, - {.uid = "5a2aa5fe31c5", + {.uid = "f05d67874ae5", .mnemonic = "ASSERT", .asm_template = "assert SrcL", .encoding_kind = "L32", @@ -5353,7 +5353,7 @@ const MinstFormDesc kForms[] = { .field_count = 1, .constraint_start = 15, .constraint_count = 0}, - {.uid = "18ebd8429b53", + {.uid = "e90bd52fa480", .mnemonic = "B.CATR", .asm_template = "B.CATR {trap, atomic, , far, dr}", .encoding_kind = "L32", @@ -5368,7 +5368,7 @@ const MinstFormDesc kForms[] = { .field_count = 6, .constraint_start = 15, .constraint_count = 0}, - {.uid = "85918343b9b5", + {.uid = "c161a042ff38", .mnemonic = "B.DATR", .asm_template = "B.DATR {layout, datatype, padvalue_or_byteid, cmode, rmode, sat, canonicalize}", @@ -5384,7 +5384,7 @@ const MinstFormDesc kForms[] = { .field_count = 7, .constraint_start = 15, .constraint_count = 27}, - {.uid = "570ae2178c51", + {.uid = "4191099a5f4d", .mnemonic = "B.DIM", .asm_template = "B.DIM RegSrc, uimm, ->LB1", .encoding_kind = "L32", @@ -5399,7 +5399,7 @@ const MinstFormDesc kForms[] = { .field_count = 2, .constraint_start = 42, .constraint_count = 8}, - {.uid = "a097166c338b", + {.uid = "27602ab68929", .mnemonic = "B.DIM", .asm_template = "B.DIM RegSrc, uimm, ->LB0", .encoding_kind = "L32", @@ -5414,7 +5414,7 @@ const MinstFormDesc kForms[] = { .field_count = 2, .constraint_start = 50, .constraint_count = 8}, - {.uid = "f88715bdc6ea", + {.uid = "1caa1aa2944a", .mnemonic = "B.DIM", .asm_template = "B.DIM RegSrc, uimm, ->LB2", .encoding_kind = "L32", @@ -5429,7 +5429,7 @@ const MinstFormDesc kForms[] = { .field_count = 2, .constraint_start = 58, .constraint_count = 8}, - {.uid = "f0f909e9f755", + {.uid = "41f00e5abd89", .mnemonic = "B.EQ", .asm_template = "b.eq SrcL, SrcR, label", .encoding_kind = "L32", @@ -5444,7 +5444,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 66, .constraint_count = 0}, - {.uid = "cba93d710148", + {.uid = "4f2db11e8e8a", .mnemonic = "B.FPATR", .asm_template = "B.FPATR PreQuantMode, ReluMode, GroupNCode, RowMaxEn, GroupMaxEn, RowMaxInit, MaxAbsEn", @@ -5460,7 +5460,7 @@ const MinstFormDesc kForms[] = { .field_count = 7, .constraint_start = 66, .constraint_count = 47}, - {.uid = "4d00af558ba0", + {.uid = "7bd9050705dc", .mnemonic = "B.GE", .asm_template = "b.ge SrcL, SrcR, label", .encoding_kind = "L32", @@ -5475,7 +5475,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 113, .constraint_count = 0}, - {.uid = "7832bac8f1a4", + {.uid = "43a6e57dce55", .mnemonic = "B.GEU", .asm_template = "b.geu SrcL, SrcR, label", .encoding_kind = "L32", @@ -5490,7 +5490,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 113, .constraint_count = 0}, - {.uid = "67e2ad8dd981", + {.uid = "f7d01d734925", .mnemonic = "B.HINT", .asm_template = "B.HINT TRACE.{begin, end}", .encoding_kind = "L32", @@ -5505,7 +5505,7 @@ const MinstFormDesc kForms[] = { .field_count = 1, .constraint_start = 113, .constraint_count = 0}, - {.uid = "b3e8a4e77930", + {.uid = "69d942ff1583", .mnemonic = "B.HINT", .asm_template = "B.HINT {BR.{likely, unlikely}, TEMP.{hot, warm, cool, none}, PRFSIZE}", .encoding_kind = "L32", @@ -5520,7 +5520,7 @@ const MinstFormDesc kForms[] = { .field_count = 4, .constraint_start = 113, .constraint_count = 0}, - {.uid = "df50a269be7c", + {.uid = "c3ea71404eb3", .mnemonic = "B.IOR", .asm_template = "B.IOR [[, [, ]]][, ->]", .encoding_kind = "L32", @@ -5535,7 +5535,7 @@ const MinstFormDesc kForms[] = { .field_count = 4, .constraint_start = 113, .constraint_count = 32}, - {.uid = "11ff57a2e635", + {.uid = "4ba5ef98fdaa", .mnemonic = "B.IOS", .asm_template = "B.IOS S, mask= | B.IOS mask=, ->S", @@ -5551,7 +5551,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 145, .constraint_count = 0}, - {.uid = "36792782e584", + {.uid = "2c07e7177fad", .mnemonic = "B.IOT", .asm_template = "B.IOT SrcTile0, SrcTile1, mask=PE_MASK, ", .encoding_kind = "L32", @@ -5566,7 +5566,7 @@ const MinstFormDesc kForms[] = { .field_count = 6, .constraint_start = 145, .constraint_count = 0}, - {.uid = "3a493c45ddfa", + {.uid = "efa0fe3fe49a", .mnemonic = "B.IOT", .asm_template = "B.IOT mask=PE_MASK, , ->DstTile", .encoding_kind = "L32", @@ -5581,7 +5581,7 @@ const MinstFormDesc kForms[] = { .field_count = 4, .constraint_start = 145, .constraint_count = 1}, - {.uid = "437af312f86d", + {.uid = "10db6db84f5d", .mnemonic = "B.IOT", .asm_template = "B.IOT SrcTile0, mask=PE_MASK, , ->DstTile", .encoding_kind = "L32", @@ -5596,7 +5596,7 @@ const MinstFormDesc kForms[] = { .field_count = 5, .constraint_start = 146, .constraint_count = 1}, - {.uid = "84944b9c3d19", + {.uid = "8b8bce6bffe8", .mnemonic = "B.IOT", .asm_template = "B.IOT SrcTile0, SrcTile1, mask=PE_MASK, , ->DstTile", .encoding_kind = "L32", @@ -5611,7 +5611,7 @@ const MinstFormDesc kForms[] = { .field_count = 6, .constraint_start = 147, .constraint_count = 1}, - {.uid = "f17390877416", + {.uid = "c11eb189dd83", .mnemonic = "B.IOT", .asm_template = "B.IOT SrcTile0, mask=PE_MASK, ", .encoding_kind = "L32", @@ -5626,7 +5626,7 @@ const MinstFormDesc kForms[] = { .field_count = 5, .constraint_start = 148, .constraint_count = 0}, - {.uid = "59c035b9c132", + {.uid = "2ca5ecd25cfb", .mnemonic = "B.LT", .asm_template = "b.lt SrcL, SrcR, label", .encoding_kind = "L32", @@ -5641,7 +5641,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 148, .constraint_count = 0}, - {.uid = "fe13236f720b", + {.uid = "f1ea7ad44e37", .mnemonic = "B.LTU", .asm_template = "b.ltu SrcL, SrcR, label", .encoding_kind = "L32", @@ -5656,7 +5656,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 148, .constraint_count = 0}, - {.uid = "af79aa13d05a", + {.uid = "831af6a36ff4", .mnemonic = "B.NE", .asm_template = "b.ne SrcL, SrcR, label", .encoding_kind = "L32", @@ -5671,7 +5671,7 @@ const MinstFormDesc kForms[] = { .field_count = 3, .constraint_start = 148, .constraint_count = 0}, - {.uid = "890ac2de1897", + {.uid = "0f583cdd8d4d", .mnemonic = "B.NZ", .asm_template = "b.nz label", .encoding_kind = "L32", @@ -5701,7 +5701,7 @@ const MinstFormDesc kForms[] = { .field_count = 1, .constraint_start = 148, .constraint_count = 0}, - {.uid = "caa0ef1ffc2e", + {.uid = "753dd3b4fcb6", .mnemonic = "B.Z", .asm_template = "b.z label", .encoding_kind = "L32", @@ -5716,7 +5716,7 @@ const MinstFormDesc kForms[] = { .field_count = 1, .constraint_start = 148, .constraint_count = 0}, - {.uid = "27b4ceb9cbaa", + {.uid = "fdceb48516a8", .mnemonic = "BC.IALL", .asm_template = "bc.iall", .encoding_kind = "L32", @@ -5731,7 +5731,7 @@ const MinstFormDesc kForms[] = { .field_count = 0, .constraint_start = 148, .constraint_count = 0}, - {.uid = "1108bd41a6b4", + {.uid = "c166de534c98", .mnemonic = "BC.IVA", .asm_template = "bc.iva SrcL", .encoding_kind = "L32", @@ -5746,7 +5746,7 @@ const MinstFormDesc kForms[] = { .field_count = 1, .constraint_start = 148, .constraint_count = 0}, - {.uid = "421cd5d5713a", + {.uid = "e0b06e436a5b", .mnemonic = "BCNT", .asm_template = "bcnt srcL, M, N, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5761,7 +5761,7 @@ const MinstFormDesc kForms[] = { .field_count = 4, .constraint_start = 148, .constraint_count = 0}, - {.uid = "856fa5d3ee3c", + {.uid = "3a10830a3a93", .mnemonic = "BIC", .asm_template = "bic SrcL, M, N, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5776,7 +5776,7 @@ const MinstFormDesc kForms[] = { .field_count = 4, .constraint_start = 148, .constraint_count = 0}, - {.uid = "74124ad50d6b", + {.uid = "bca5d1a80f32", .mnemonic = "BIS", .asm_template = "bis SrcL, M, N, ->{t, u, Rd}", .encoding_kind = "L32", @@ -5791,7 +5791,7 @@ const MinstFormDesc kForms[] = { .field_count = 4, .constraint_start = 148, .constraint_count = 0}, - {.uid = "1e9f7cd317bd", + {.uid = "883b5167edbc", .mnemonic = "BSE", .asm_template = "bse SrcL", .encoding_kind = "L32", @@ -5806,7 +5806,7 @@ const MinstFormDesc kForms[] = { .field_count = 1, .constraint_start = 148, .constraint_count = 0}, - {.uid = "416bc417fc20", + {.uid = "7eb93b649748", .mnemonic = "BSTART", .asm_template = "BSTART DIRECT,