40 #pragma GCC diagnostic push
45 # if (defined(__clang__) && __GNUC__ >= 10) || \
46 (!defined(__clang__) && __GNUC__ >= 9)
47 # pragma GCC diagnostic ignored "-Wdeprecated-copy"
51 #include <gmock/gmock.h>
52 #include <gtest/gtest.h>
54 #pragma GCC diagnostic pop
64 using testing::ElementsAre;
66 using testing::ElementsAreArray;
69 using testing::HasSubstr;
79 static constexpr
size_t BufSize = 12;
80 static constexpr
size_t BufOffset = 4;
81 static constexpr
size_t RazSize = 4;
83 std::array<uint8_t, BufSize>
buf;
84 RegisterBankLE::RegisterRaz
raz;
96 EXPECT_EQ(
raz.name(),
"raz");
101 EXPECT_EQ(
raz.size(), RazSize);
107 raz.write(buf.data() + BufOffset);
108 raz.read(buf.data() + BufOffset);
109 EXPECT_THAT(buf, ElementsAreArray({0xff, 0xff, 0xff, 0xff,
110 0x00, 0x00, 0x00, 0x00,
111 0xff, 0xff, 0xff, 0xff}));
117 raz.write(buf.data() + BufOffset, 1, 3);
118 raz.read(buf.data() + BufOffset, 1, 3);
119 EXPECT_THAT(buf, ElementsAreArray({0xff, 0xff, 0xff, 0xff,
120 0x00, 0x00, 0x00, 0xff,
121 0xff, 0xff, 0xff, 0xff}));
127 raz.write(buf.data() + BufOffset, 0, 3);
128 raz.read(buf.data() + BufOffset, 0, 3);
129 EXPECT_THAT(buf, ElementsAreArray({0xff, 0xff, 0xff, 0xff,
130 0x00, 0x00, 0x00, 0xff,
131 0xff, 0xff, 0xff, 0xff}));
137 raz.write(buf.data() + BufOffset, 1, 2);
138 raz.read(buf.data() + BufOffset, 1, 2);
139 EXPECT_THAT(buf, ElementsAreArray({0xff, 0xff, 0xff, 0xff,
140 0x00, 0x00, 0xff, 0xff,
141 0xff, 0xff, 0xff, 0xff}));
146 std::ostringstream
os;
148 EXPECT_EQ(
os.str(),
"");
154 EXPECT_TRUE(
raz.unserialize(
s));
165 static constexpr
size_t BufSize = 12;
166 static constexpr
size_t BufOffset = 4;
167 static constexpr
size_t RaoSize = 4;
169 std::array<uint8_t, BufSize>
buf;
170 RegisterBankLE::RegisterRao
rao;
182 EXPECT_EQ(rao.name(),
"rao");
187 EXPECT_EQ(rao.size(), RaoSize);
193 rao.write(buf.data() + BufOffset);
194 rao.read(buf.data() + BufOffset);
195 EXPECT_THAT(buf, ElementsAreArray({0x00, 0x00, 0x00, 0x00,
196 0xff, 0xff, 0xff, 0xff,
197 0x00, 0x00, 0x00, 0x00}));
203 rao.write(buf.data() + BufOffset, 1, 3);
204 rao.read(buf.data() + BufOffset, 1, 3);
205 EXPECT_THAT(buf, ElementsAreArray({0x00, 0x00, 0x00, 0x00,
206 0xff, 0xff, 0xff, 0x00,
207 0x00, 0x00, 0x00, 0x00}));
213 rao.write(buf.data() + BufOffset, 0, 3);
214 rao.read(buf.data() + BufOffset, 0, 3);
215 EXPECT_THAT(buf, ElementsAreArray({0x00, 0x00, 0x00, 0x00,
216 0xff, 0xff, 0xff, 0x00,
217 0x00, 0x00, 0x00, 0x00}));
223 rao.write(buf.data() + BufOffset, 1, 2);
224 rao.read(buf.data() + BufOffset, 1, 2);
225 EXPECT_THAT(buf, ElementsAreArray({0x00, 0x00, 0x00, 0x00,
226 0xff, 0xff, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00}));
232 std::ostringstream
os;
234 EXPECT_EQ(
os.str(),
"");
240 EXPECT_TRUE(rao.unserialize(
s));
251 static constexpr
size_t RegSize = 4;
253 std::array<uint8_t, RegSize * 3>
buf;
256 RegisterBankLE::RegisterBuf
reg;
260 : buf{0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc},
261 backing{0x10, 0x20, 0x30, 0x40, 0x50, 0x60,
262 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0},
263 reg(
"buf_reg", backing.data() + RegSize, RegSize)
271 EXPECT_EQ(
reg.name(),
"buf_reg");
276 EXPECT_EQ(
reg.size(), RegSize);
282 reg.read(buf.data() + RegSize);
283 EXPECT_THAT(buf, ElementsAreArray({0x1, 0x2, 0x3, 0x4,
284 0x50, 0x60, 0x70, 0x80,
285 0x9, 0xa, 0xb, 0xc}));
286 EXPECT_THAT(backing, ElementsAreArray({0x10, 0x20, 0x30, 0x40,
287 0x50, 0x60, 0x70, 0x80,
288 0x90, 0xa0, 0xb0, 0xc0}));
294 reg.write(buf.data() + RegSize);
295 EXPECT_THAT(buf, ElementsAreArray({0x1, 0x2, 0x3, 0x4,
297 0x9, 0xa, 0xb, 0xc}));
298 EXPECT_THAT(backing, ElementsAreArray({0x10, 0x20, 0x30, 0x40,
300 0x90, 0xa0, 0xb0, 0xc0}));
306 reg.read(buf.data() + RegSize, 1, 3);
307 EXPECT_THAT(buf, ElementsAreArray({0x1, 0x2, 0x3, 0x4,
308 0x60, 0x70, 0x80, 0x8,
309 0x9, 0xa, 0xb, 0xc}));
310 EXPECT_THAT(backing, ElementsAreArray({0x10, 0x20, 0x30, 0x40,
311 0x50, 0x60, 0x70, 0x80,
312 0x90, 0xa0, 0xb0, 0xc0}));
318 reg.write(buf.data() + RegSize, 1, 3);
319 EXPECT_THAT(buf, ElementsAreArray({0x1, 0x2, 0x3, 0x4,
321 0x9, 0xa, 0xb, 0xc}));
322 EXPECT_THAT(backing, ElementsAreArray({0x10, 0x20, 0x30, 0x40,
324 0x90, 0xa0, 0xb0, 0xc0}));
330 reg.read(buf.data() + RegSize, 0, 3);
331 EXPECT_THAT(buf, ElementsAreArray({0x1, 0x2, 0x3, 0x4,
332 0x50, 0x60, 0x70, 0x8,
333 0x9, 0xa, 0xb, 0xc}));
334 EXPECT_THAT(backing, ElementsAreArray({0x10, 0x20, 0x30, 0x40,
335 0x50, 0x60, 0x70, 0x80,
336 0x90, 0xa0, 0xb0, 0xc0}));
342 reg.write(buf.data() + RegSize, 0, 3);
343 EXPECT_THAT(buf, ElementsAreArray({0x1, 0x2, 0x3, 0x4,
345 0x9, 0xa, 0xb, 0xc}));
346 EXPECT_THAT(backing, ElementsAreArray({0x10, 0x20, 0x30, 0x40,
348 0x90, 0xa0, 0xb0, 0xc0}));
354 reg.read(buf.data() + RegSize, 1, 2);
355 EXPECT_THAT(buf, ElementsAreArray({0x1, 0x2, 0x3, 0x4,
356 0x60, 0x70, 0x7, 0x8,
357 0x9, 0xa, 0xb, 0xc}));
358 EXPECT_THAT(backing, ElementsAreArray({0x10, 0x20, 0x30, 0x40,
359 0x50, 0x60, 0x70, 0x80,
360 0x90, 0xa0, 0xb0, 0xc0}));
366 reg.write(buf.data() + RegSize, 1, 2);
367 EXPECT_THAT(buf, ElementsAreArray({0x1, 0x2, 0x3, 0x4,
369 0x9, 0xa, 0xb, 0xc}));
370 EXPECT_THAT(backing, ElementsAreArray({0x10, 0x20, 0x30, 0x40,
371 0x50, 0x5, 0x6, 0x80,
372 0x90, 0xa0, 0xb0, 0xc0}));
377 std::ostringstream
os;
379 EXPECT_EQ(
os.str(),
"");
385 EXPECT_TRUE(
reg.unserialize(
s));
398 static constexpr
size_t RegSize = 12;
400 RegisterBankLE::RegisterLBuf<12>
reg;
406 reg.buffer.fill(0xff);
412 EXPECT_EQ(
reg.name(),
"lbuf_reg");
417 reg.write(to_write.data(), 4, 4);
418 EXPECT_THAT(
reg.buffer, ElementsAreArray({0xff, 0xff, 0xff, 0xff,
420 0xff, 0xff, 0xff, 0xff}));
425 std::ostringstream
os;
426 for (
int i = 0;
i <
reg.buffer.size();
i++)
429 EXPECT_EQ(
os.str(),
"0 1 2 3 4 5 6 7 8 9 10 11");
434 std::string
s =
"0 1 2 3 4 5 6 7 8 9 10 11";
435 EXPECT_TRUE(
reg.unserialize(
s));
436 EXPECT_THAT(
reg.buffer, ElementsAreArray({0, 1, 2, 3, 4, 5,
437 6, 7, 8, 9, 10, 11}));
442 std::string
s =
"0 1 2 3 4 5 6 7 8 9 10";
443 EXPECT_FALSE(
reg.unserialize(
s));
444 EXPECT_THAT(
reg.buffer, ElementsAreArray({0xff, 0xff, 0xff, 0xff,
445 0xff, 0xff, 0xff, 0xff,
446 0xff, 0xff, 0xff, 0xff}));
463 RegisterBankLE::Register<BackingType>
reg;
466 std::array<uint8_t, RegSize * 3>
buf;
469 buf{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}
477 RegisterBankLE::Register<uint32_t> def(
"def");
478 EXPECT_EQ(def.get(), 0);
483 EXPECT_EQ(
reg.name(),
"le_reg");
488 EXPECT_EQ(
reg.size(), RegSize);
494 EXPECT_EQ(
reg.writeable(), 0xffff);
500 EXPECT_EQ(
reg.get(), 0x1122);
506 EXPECT_EQ(
reg.get(), 0x1020);
508 EXPECT_EQ(
reg.get(), 0x3040);
514 regBE.read(buf.data() + RegSize);
515 EXPECT_EQ(regBE.get(), 0x1122);
516 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x11, 0x22, 0x5, 0x6));
522 regBE.write(buf.data() + RegSize);
523 EXPECT_EQ(regBE.get(), 0x0304);
524 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x3, 0x4, 0x5, 0x6));
530 regBE.read(buf.data() + RegSize, 0, 1);
531 EXPECT_EQ(regBE.get(), 0x1122);
532 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x11, 0x4, 0x5, 0x6));
538 regBE.read(buf.data() + RegSize, 1, 1);
539 EXPECT_EQ(regBE.get(), 0x1122);
540 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x22, 0x4, 0x5, 0x6));
546 regBE.write(buf.data() + RegSize, 0, 1);
547 EXPECT_EQ(regBE.get(), 0x0322);
548 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x3, 0x4, 0x5, 0x6));
554 regBE.write(buf.data() + RegSize, 1, 1);
555 EXPECT_EQ(regBE.get(), 0x1103);
556 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x3, 0x4, 0x5, 0x6));
562 reg.read(buf.data() + RegSize);
563 EXPECT_EQ(
reg.get(), 0x1122);
564 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x22, 0x11, 0x5, 0x6));
570 reg.write(buf.data() + RegSize);
571 EXPECT_EQ(
reg.get(), 0x0403);
572 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x3, 0x4, 0x5, 0x6));
578 reg.read(buf.data() + RegSize, 0, 1);
579 EXPECT_EQ(
reg.get(), 0x1122);
580 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x22, 0x4, 0x5, 0x6));
586 reg.read(buf.data() + RegSize, 1, 1);
587 EXPECT_EQ(
reg.get(), 0x1122);
588 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x11, 0x4, 0x5, 0x6));
594 reg.write(buf.data() + RegSize, 0, 1);
595 EXPECT_EQ(
reg.get(), 0x1103);
596 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x3, 0x4, 0x5, 0x6));
602 reg.write(buf.data() + RegSize, 1, 1);
603 EXPECT_EQ(
reg.get(), 0x0322);
604 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x3, 0x4, 0x5, 0x6));
610 reg.writeable(0xff00);
611 reg.write(buf.data() + RegSize);
612 EXPECT_EQ(
reg.get(), 0x0422);
614 regBE.writeable(0xff00);
615 regBE.write(buf.data() + RegSize);
616 EXPECT_EQ(regBE.get(), 0x0322);
623 reg.write(buf.data() + RegSize);
624 EXPECT_EQ(
reg.get(), 0x1122);
630 reg.update(0xeeee, 0x0ff0);
631 EXPECT_EQ(
reg.get(), 0x1ee2);
637 reg.writeable(0xf00f);
639 EXPECT_EQ(
reg.get(), 0xe12e);
645 RegisterBankLE::Register<BackingType> *reg_ptr =
nullptr;
646 BackingType ret = 0x3344;
648 reg.reader([®_ptr, &ret](
auto &
r){
653 reg.read(buf.data() + RegSize);
654 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x44, 0x33, 0x5, 0x6));
655 EXPECT_EQ(reg_ptr, &
reg);
661 using Reg = RegisterBankLE::Register<BackingType>;
665 Reg *reg_ptr =
nullptr;
666 BackingType ret = 0x3344;
676 reg.reader(&read_struct, &ReadStruct::reader);
678 reg.read(buf.data() + RegSize);
679 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x44, 0x33, 0x5, 0x6));
680 EXPECT_EQ(read_struct.reg_ptr, &
reg);
686 RegisterBankLE::Register<BackingType> *reg_ptr =
nullptr;
687 BackingType value = 0;
689 reg.writer([®_ptr, &value](
auto &
r,
const BackingType &
v) {
694 reg.write(buf.data() + RegSize);
695 EXPECT_EQ(reg_ptr, &
reg);
696 EXPECT_EQ(value, 0x0403);
702 using Reg = RegisterBankLE::Register<BackingType>;
706 Reg *reg_ptr =
nullptr;
707 BackingType value = 0;
717 reg.writer(&write_struct, &WriteStruct::writer);
719 reg.write(buf.data() + RegSize);
720 EXPECT_EQ(write_struct.reg_ptr, &
reg);
721 EXPECT_THAT(write_struct.value, 0x0403);
727 RegisterBankLE::Register<BackingType> *reg_ptr =
nullptr;
730 BackingType ret = 0x3344;
732 reg.partialReader([®_ptr, &first, &last, ret](
auto &
r,
int f,
int l) {
739 reg.read(buf.data() + RegSize, 1, 1);
740 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x33, 0x4, 0x5, 0x6));
741 EXPECT_EQ(reg_ptr, &
reg);
742 EXPECT_EQ(first, 15);
749 using Reg = RegisterBankLE::Register<BackingType>;
753 Reg *reg_ptr =
nullptr;
756 BackingType ret = 0x3344;
759 reader(
Reg &
r,
int f,
int l)
768 reg.partialReader(&read_struct, &ReadStruct::reader);
770 reg.read(buf.data() + RegSize, 1, 1);
771 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x33, 0x4, 0x5, 0x6));
772 EXPECT_EQ(read_struct.reg_ptr, &
reg);
773 EXPECT_EQ(read_struct.first, 15);
774 EXPECT_EQ(read_struct.last, 8);
780 RegisterBankLE::Register<BackingType> *reg_ptr =
nullptr;
781 BackingType value = 0;
785 reg.partialWriter([®_ptr, &value, &first, &last](
786 auto &
r,
const BackingType &
v,
int f,
int l) {
793 reg.write(buf.data() + RegSize, 1, 1);
794 EXPECT_EQ(reg_ptr, &
reg);
795 EXPECT_EQ(value, 0x300);
796 EXPECT_EQ(first, 15);
803 using Reg = RegisterBankLE::Register<BackingType>;
807 Reg *reg_ptr =
nullptr;
808 BackingType value = 0;
822 reg.partialWriter(&write_struct, &WriteStruct::writer);
824 reg.write(buf.data() + RegSize, 1, 1);
825 EXPECT_EQ(write_struct.reg_ptr, &
reg);
826 EXPECT_EQ(write_struct.value, 0x300);
827 EXPECT_EQ(write_struct.first, 15);
828 EXPECT_EQ(write_struct.last, 8);
834 RegisterBankLE::Register<BackingType> *reg_ptr =
nullptr;
835 BackingType ret = 0x3344;
837 reg.reader([®_ptr, &ret](
auto &
r){
842 reg.read(buf.data() + RegSize, 1, 1);
843 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x33, 0x4, 0x5, 0x6));
844 EXPECT_EQ(reg_ptr, &
reg);
850 RegisterBankLE::Register<BackingType> *read_reg_ptr =
nullptr;
851 BackingType read_ret = 0x3344;
853 RegisterBankLE::Register<BackingType> *write_reg_ptr =
nullptr;
854 BackingType write_value = 0;
856 reg.reader([&read_reg_ptr, read_ret](
auto &
r){
859 }).
writer([&write_reg_ptr, &write_value](
auto &
r,
const BackingType &
v) {
864 reg.write(buf.data() + RegSize, 1, 1);
865 EXPECT_THAT(buf, ElementsAre(0x1, 0x2, 0x3, 0x4, 0x5, 0x6));
866 EXPECT_EQ(read_reg_ptr, &
reg);
867 EXPECT_EQ(write_reg_ptr, &
reg);
868 EXPECT_EQ(write_value, 0x0344);
874 BackingType initial_value =
reg.get();
876 reg.get() = initial_value + 1;
877 EXPECT_EQ(
reg.get(), initial_value + 1);
881 EXPECT_EQ(
reg.get(), initial_value);
887 BackingType initial_value =
reg.get();
888 BackingType new_initial_value = initial_value + 1;
890 reg.get() = new_initial_value;
891 reg.resetInitialValue();
893 EXPECT_EQ(
reg.get(), new_initial_value);
894 EXPECT_EQ(
reg.initialValue(), new_initial_value);
896 reg.get() = new_initial_value + 1;
897 EXPECT_EQ(
reg.get(), new_initial_value + 1);
898 EXPECT_EQ(
reg.initialValue(), new_initial_value);
902 EXPECT_EQ(
reg.get(), new_initial_value);
903 EXPECT_EQ(
reg.initialValue(), new_initial_value);
909 RegisterBankLE::Register<BackingType> *reg_ptr =
nullptr;
911 reg.resetter([®_ptr](
auto &
r) {
917 EXPECT_EQ(reg_ptr, &
reg);
923 using Reg = RegisterBankLE::Register<BackingType>;
927 Reg *reg_ptr =
nullptr;
936 reg.resetter(&reset_struct, &ResetStruct::resetter);
940 EXPECT_EQ(reset_struct.reg_ptr, &
reg);
945 std::ostringstream
os;
947 EXPECT_EQ(
os.str(),
"4386");
952 std::string
s =
"1234";
953 EXPECT_TRUE(
reg.unserialize(
s));
954 EXPECT_EQ(
reg.get(), 1234);
959 std::string
s =
"not_a_number";
960 EXPECT_FALSE(
reg.unserialize(
s));
996 int _first,
int _last, uint32_t _ret) :
997 type(_type), value(_value),
998 first(_first), last(_last), ret(_ret)
1005 first == other.
first && last == other.
last &&
1016 TestReg(
const std::string &new_name, uint32_t initial) :
1019 reader([
this](
auto &
r) {
1021 access.
ret = defaultReader(
r);
1022 accesses.push_back(access);
1025 writer([
this](
auto &
r,
const uint32_t &
v) {
1028 defaultWriter(
r,
v);
1029 accesses.push_back(access);
1031 partialReader([
this](
auto &
r,
int f,
int l) {
1032 Access access(PartialRead);
1035 access.
ret = defaultPartialReader(
r,
f,
l);
1036 accesses.push_back(access);
1039 partialWriter([
this](
auto &
r,
const uint32_t &
v,
int f,
int l) {
1040 Access access(PartialWrite);
1044 defaultPartialWriter(
r,
v,
f,
l);
1045 accesses.push_back(access);
1056 reg0(
"reg0", 0xd3d2d1d0), reg1(
"reg1", 0xe3e2e1e0),
1057 reg2(
"reg2", 0xf3f2f1f0),
1058 emptyBank(
"empty", 0x12345), fullBank(
"full", 0x1000),
1059 buf{0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
1060 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc}
1070 EXPECT_EQ(emptyBank.
name(),
"empty");
1071 EXPECT_EQ(fullBank.
name(),
"full");
1076 EXPECT_EQ(emptyBank.
base(), 0x12345);
1077 EXPECT_EQ(fullBank.
base(), 0x1000);
1083 EXPECT_EQ(emptyBank.
size(), 0);
1085 EXPECT_EQ(emptyBank.
size(), 4);
1087 EXPECT_EQ(emptyBank.
size(), 12);
1093 EXPECT_EQ(emptyBank.
size(), 0);
1095 EXPECT_EQ(emptyBank.
size(), 4);
1097 EXPECT_EQ(emptyBank.
size(), 4);
1099 emptyBank.
addRegisters({{0x12349, reg1}, {0x1234d}, {0x1234d, reg2}});
1100 EXPECT_EQ(emptyBank.
size(), 12);
1106 EXPECT_ANY_THROW(emptyBank.
addRegisters({{0xabcd, reg0}, reg1}));
1109 EXPECT_THAT(actual, HasSubstr(
"empty.reg0"));
1110 EXPECT_THAT(actual, HasSubstr(
"to be 0xabcd"));
1111 EXPECT_THAT(actual, HasSubstr(
"is 0x12345"));
1117 EXPECT_ANY_THROW(emptyBank.addRegisters({{0xabcd}, reg0}));
1120 EXPECT_THAT(actual, HasSubstr(
"empty "));
1121 EXPECT_THAT(actual, HasSubstr(
"to be 0xabcd"));
1122 EXPECT_THAT(actual, HasSubstr(
"is 0x12345"));
1129 fullBank.read(0x1000, buf.data() + 4, 4);
1130 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0x33, 0x44,
1131 0xd0, 0xd1, 0xd2, 0xd3,
1132 0x99, 0xaa, 0xbb, 0xcc}));
1133 EXPECT_THAT(reg0.accesses, ElementsAre(
1134 Access(Read, 0, 0, 0, 0xd3d2d1d0)
1136 EXPECT_TRUE(reg1.accesses.empty());
1137 EXPECT_TRUE(reg2.accesses.empty());
1142 fullBank.read(0x1004, buf.data() + 4, 4);
1143 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0x33, 0x44,
1144 0xe0, 0xe1, 0xe2, 0xe3,
1145 0x99, 0xaa, 0xbb, 0xcc}));
1146 EXPECT_TRUE(reg0.accesses.empty());
1147 EXPECT_THAT(reg1.accesses, ElementsAre(
1148 Access(Read, 0, 0, 0, 0xe3e2e1e0)
1150 EXPECT_TRUE(reg2.accesses.empty());
1155 fullBank.read(0x1008, buf.data() + 4, 4);
1156 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0x33, 0x44,
1157 0xf0, 0xf1, 0xf2, 0xf3,
1158 0x99, 0xaa, 0xbb, 0xcc}));
1159 EXPECT_TRUE(reg0.accesses.empty());
1160 EXPECT_TRUE(reg1.accesses.empty());
1161 EXPECT_THAT(reg2.accesses, ElementsAre(
1162 Access(Read, 0, 0, 0, 0xf3f2f1f0)
1168 fullBank.read(0x1004, buf.data() + 2, 8);
1169 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0xe0, 0xe1,
1170 0xe2, 0xe3, 0xf0, 0xf1,
1171 0xf2, 0xf3, 0xbb, 0xcc}));
1172 EXPECT_TRUE(reg0.accesses.empty());
1173 EXPECT_THAT(reg1.accesses, ElementsAre(
1174 Access(Read, 0, 0, 0, 0xe3e2e1e0)
1176 EXPECT_THAT(reg2.accesses, ElementsAre(
1177 Access(Read, 0, 0, 0, 0xf3f2f1f0)
1183 fullBank.read(0x1001, buf.data() + 4, 2);
1184 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0x33, 0x44,
1185 0xd1, 0xd2, 0x77, 0x88,
1186 0x99, 0xaa, 0xbb, 0xcc}));
1187 EXPECT_THAT(reg0.accesses, ElementsAre(
1188 Access(Read, 0, 0, 0, 0xd3d2d1d0),
1189 Access(PartialRead, 0, 23, 8, 0x00d2d100)
1191 EXPECT_TRUE(reg1.accesses.empty());
1192 EXPECT_TRUE(reg2.accesses.empty());
1197 fullBank.read(0x1002, buf.data() + 4, 4);
1198 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0x33, 0x44,
1199 0xd2, 0xd3, 0xe0, 0xe1,
1200 0x99, 0xaa, 0xbb, 0xcc}));
1201 EXPECT_THAT(reg0.accesses, ElementsAre(
1202 Access(Read, 0, 0, 0, 0xd3d2d1d0),
1203 Access(PartialRead, 0, 31, 16, 0xd3d20000)
1205 EXPECT_THAT(reg1.accesses, ElementsAre(
1206 Access(Read, 0, 0, 0, 0xe3e2e1e0),
1207 Access(PartialRead, 0, 15, 0, 0x0000e1e0)
1209 EXPECT_TRUE(reg2.accesses.empty());
1214 fullBank.read(0x1002, buf.data() + 2, 8);
1215 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0xd2, 0xd3,
1216 0xe0, 0xe1, 0xe2, 0xe3,
1217 0xf0, 0xf1, 0xbb, 0xcc}));
1218 EXPECT_THAT(reg0.accesses, ElementsAre(
1219 Access(Read, 0, 0, 0, 0xd3d2d1d0),
1220 Access(PartialRead, 0, 31, 16, 0xd3d20000)
1222 EXPECT_THAT(reg1.accesses, ElementsAre(
1223 Access(Read, 0, 0, 0, 0xe3e2e1e0)
1225 EXPECT_THAT(reg2.accesses, ElementsAre(
1226 Access(Read, 0, 0, 0, 0xf3f2f1f0),
1227 Access(PartialRead, 0, 15, 0, 0x0000f1f0)
1233 fullBank.read(0x1002, buf.data() + 4, 6);
1234 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0x33, 0x44,
1235 0xd2, 0xd3, 0xe0, 0xe1,
1236 0xe2, 0xe3, 0xbb, 0xcc}));
1237 EXPECT_THAT(reg0.accesses, ElementsAre(
1238 Access(Read, 0, 0, 0, 0xd3d2d1d0),
1239 Access(PartialRead, 0, 31, 16, 0xd3d20000)
1241 EXPECT_THAT(reg1.accesses, ElementsAre(
1242 Access(Read, 0, 0, 0, 0xe3e2e1e0)
1244 EXPECT_TRUE(reg2.accesses.empty());
1249 fullBank.read(0x1004, buf.data() + 4, 6);
1250 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0x33, 0x44,
1251 0xe0, 0xe1, 0xe2, 0xe3,
1252 0xf0, 0xf1, 0xbb, 0xcc}));
1253 EXPECT_TRUE(reg0.accesses.empty());
1254 EXPECT_THAT(reg1.accesses, ElementsAre(
1255 Access(Read, 0, 0, 0, 0xe3e2e1e0)
1257 EXPECT_THAT(reg2.accesses, ElementsAre(
1258 Access(Read, 0, 0, 0, 0xf3f2f1f0),
1259 Access(PartialRead, 0, 15, 0, 0x0000f1f0)
1265 fullBank.read(0x100a, buf.data() + 4, 2);
1266 EXPECT_THAT(buf, ElementsAreArray({0x11, 0x22, 0x33, 0x44,
1267 0xf2, 0xf3, 0x77, 0x88,
1268 0x99, 0xaa, 0xbb, 0xcc}));
1269 EXPECT_TRUE(reg0.accesses.empty());
1270 EXPECT_TRUE(reg1.accesses.empty());
1271 EXPECT_THAT(reg2.accesses, ElementsAre(
1272 Access(Read, 0, 0, 0, 0xf3f2f1f0),
1273 Access(PartialRead, 0, 31, 16, 0xf3f20000)
1281 fullBank.write(0x1000, buf.data() + 4, 4);
1282 EXPECT_EQ(reg0.get(), 0x88776655);
1283 EXPECT_EQ(reg1.get(), 0xe3e2e1e0);
1284 EXPECT_EQ(reg2.get(), 0xf3f2f1f0);
1285 EXPECT_THAT(reg0.accesses, ElementsAre(
1286 Access(Write, 0x88776655, 0, 0, 0)
1288 EXPECT_TRUE(reg1.accesses.empty());
1289 EXPECT_TRUE(reg2.accesses.empty());
1294 fullBank.write(0x1004, buf.data() + 4, 4);
1295 EXPECT_EQ(reg0.get(), 0xd3d2d1d0);
1296 EXPECT_EQ(reg1.get(), 0x88776655);
1297 EXPECT_EQ(reg2.get(), 0xf3f2f1f0);
1298 EXPECT_TRUE(reg0.accesses.empty());
1299 EXPECT_THAT(reg1.accesses, ElementsAre(
1300 Access(Write, 0x88776655, 0, 0, 0)
1302 EXPECT_TRUE(reg2.accesses.empty());
1307 fullBank.write(0x1008, buf.data() + 4, 4);
1308 EXPECT_EQ(reg0.get(), 0xd3d2d1d0);
1309 EXPECT_EQ(reg1.get(), 0xe3e2e1e0);
1310 EXPECT_EQ(reg2.get(), 0x88776655);
1311 EXPECT_TRUE(reg0.accesses.empty());
1312 EXPECT_TRUE(reg1.accesses.empty());
1313 EXPECT_THAT(reg2.accesses, ElementsAre(
1314 Access(Write, 0x88776655, 0, 0, 0)
1320 fullBank.write(0x1004, buf.data() + 2, 8);
1321 EXPECT_EQ(reg0.get(), 0xd3d2d1d0);
1322 EXPECT_EQ(reg1.get(), 0x66554433);
1323 EXPECT_EQ(reg2.get(), 0xaa998877);
1324 EXPECT_TRUE(reg0.accesses.empty());
1325 EXPECT_THAT(reg1.accesses, ElementsAre(
1326 Access(Write, 0x66554433, 0, 0, 0)
1328 EXPECT_THAT(reg2.accesses, ElementsAre(
1329 Access(Write, 0xaa998877, 0, 0, 0)
1335 fullBank.write(0x1001, buf.data() + 4, 2);
1336 EXPECT_EQ(reg0.get(), 0xd36655d0);
1337 EXPECT_EQ(reg1.get(), 0xe3e2e1e0);
1338 EXPECT_EQ(reg2.get(), 0xf3f2f1f0);
1339 EXPECT_THAT(reg0.accesses, ElementsAre(
1340 Access(Read, 0, 0, 0, 0xd3d2d1d0),
1341 Access(Write, 0xd36655d0, 0, 0, 0),
1342 Access(PartialWrite, 0x00665500, 23, 8, 0)
1344 EXPECT_TRUE(reg1.accesses.empty());
1345 EXPECT_TRUE(reg2.accesses.empty());
1350 fullBank.write(0x1002, buf.data() + 4, 4);
1351 EXPECT_EQ(reg0.get(), 0x6655d1d0);
1352 EXPECT_EQ(reg1.get(), 0xe3e28877);
1353 EXPECT_EQ(reg2.get(), 0xf3f2f1f0);
1354 EXPECT_THAT(reg0.accesses, ElementsAre(
1355 Access(Read, 0, 0, 0, 0xd3d2d1d0),
1356 Access(Write, 0x6655d1d0, 0, 0, 0),
1357 Access(PartialWrite, 0x66550000, 31, 16, 0)
1359 EXPECT_THAT(reg1.accesses, ElementsAre(
1360 Access(Read, 0, 0, 0, 0xe3e2e1e0),
1361 Access(Write, 0xe3e28877, 0, 0, 0),
1362 Access(PartialWrite, 0x00008877, 15, 0, 0)
1364 EXPECT_TRUE(reg2.accesses.empty());
1369 fullBank.write(0x1002, buf.data() + 2, 8);
1370 EXPECT_EQ(reg0.get(), 0x4433d1d0);
1371 EXPECT_EQ(reg1.get(), 0x88776655);
1372 EXPECT_EQ(reg2.get(), 0xf3f2aa99);
1373 EXPECT_THAT(reg0.accesses, ElementsAre(
1374 Access(Read, 0, 0, 0, 0xd3d2d1d0),
1375 Access(Write, 0x4433d1d0, 0, 0, 0),
1376 Access(PartialWrite, 0x44330000, 31, 16, 0)
1378 EXPECT_THAT(reg1.accesses, ElementsAre(
1379 Access(Write, 0x88776655, 0, 0, 0)
1381 EXPECT_THAT(reg2.accesses, ElementsAre(
1382 Access(Read, 0, 0, 0, 0xf3f2f1f0),
1383 Access(Write, 0xf3f2aa99, 0, 0, 0),
1384 Access(PartialWrite, 0x0000aa99, 15, 0, 0)
1390 fullBank.write(0x1002, buf.data() + 4, 6);
1391 EXPECT_EQ(reg0.get(), 0x6655d1d0);
1392 EXPECT_EQ(reg1.get(), 0xaa998877);
1393 EXPECT_EQ(reg2.get(), 0xf3f2f1f0);
1394 EXPECT_THAT(reg0.accesses, ElementsAre(
1395 Access(Read, 0, 0, 0, 0xd3d2d1d0),
1396 Access(Write, 0x6655d1d0, 0, 0, 0),
1397 Access(PartialWrite, 0x66550000, 31, 16, 0)
1399 EXPECT_THAT(reg1.accesses, ElementsAre(
1400 Access(Write, 0xaa998877, 0, 0, 0)
1402 EXPECT_TRUE(reg2.accesses.empty());
1407 fullBank.write(0x1004, buf.data() + 4, 6);
1408 EXPECT_EQ(reg0.get(), 0xd3d2d1d0);
1409 EXPECT_EQ(reg1.get(), 0x88776655);
1410 EXPECT_EQ(reg2.get(), 0xf3f2aa99);
1411 EXPECT_TRUE(reg0.accesses.empty());
1412 EXPECT_THAT(reg1.accesses, ElementsAre(
1413 Access(Write, 0x88776655, 0, 0, 0)
1415 EXPECT_THAT(reg2.accesses, ElementsAre(
1416 Access(Read, 0, 0, 0, 0xf3f2f1f0),
1417 Access(Write, 0xf3f2aa99, 0, 0, 0),
1418 Access(PartialWrite, 0x0000aa99, 15, 0, 0)