39 #include <gtest/gtest.h>
46 TEST(AddrRangeTest, ValidRange)
49 EXPECT_FALSE(
r.valid());
58 TEST(AddrRangeTest, EmptyRange)
65 EXPECT_TRUE(
r.valid());
66 EXPECT_EQ(0x0,
r.start());
67 EXPECT_EQ(0x0,
r.end());
68 EXPECT_EQ(0,
r.size());
73 EXPECT_EQ(0,
r.granularity());
78 EXPECT_FALSE(
r.interleaved());
83 EXPECT_EQ(
ULL(1),
r.stripes());
84 EXPECT_EQ(
"[0:0]",
r.to_string());
87 TEST(AddrRangeTest, RangeSizeOfOne)
90 EXPECT_TRUE(
r.valid());
91 EXPECT_EQ(0x0,
r.start());
92 EXPECT_EQ(0x1,
r.end());
93 EXPECT_EQ(1,
r.size());
94 EXPECT_EQ(1,
r.granularity());
95 EXPECT_FALSE(
r.interleaved());
96 EXPECT_EQ(
ULL(1),
r.stripes());
97 EXPECT_EQ(
"[0:0x1]",
r.to_string());
100 TEST(AddrRangeTest, Range16Bit)
103 EXPECT_TRUE(
r.valid());
104 EXPECT_EQ(0xF000,
r.start());
105 EXPECT_EQ(0xFFFF,
r.end());
106 EXPECT_EQ(0x0FFF,
r.size());
107 EXPECT_EQ(0x0FFF,
r.granularity());
108 EXPECT_FALSE(
r.interleaved());
109 EXPECT_EQ(
ULL(1),
r.stripes());
110 EXPECT_EQ(
"[0xf000:0xffff]",
r.to_string());
113 TEST(AddrRangeTest, InvalidRange)
116 EXPECT_FALSE(
r.valid());
131 EXPECT_TRUE(r1 < r2);
132 EXPECT_FALSE(r2 < r1);
133 EXPECT_FALSE(r1 < r3);
134 EXPECT_FALSE(r3 < r1);
137 TEST(AddrRangeTest, EqualToNotEqualTo)
143 EXPECT_TRUE(r1 == r2);
144 EXPECT_FALSE(r1 == r3);
145 EXPECT_FALSE(r1 != r2);
146 EXPECT_TRUE(r1 != r3);
148 EXPECT_TRUE(r2 == r1);
149 EXPECT_FALSE(r3 == r1);
150 EXPECT_FALSE(r2 != r1);
151 EXPECT_TRUE(r3 != r1);
154 TEST(AddrRangeTest, MergesWith)
167 TEST(AddrRangeTest, DoesNotMergeWith)
176 TEST(AddrRangeTest, IntersectsCompleteOverlap)
185 TEST(AddrRangeTest, IntersectsAddressWithin)
194 TEST(AddrRangeTest, IntersectsPartialOverlap)
203 TEST(AddrRangeTest, IntersectsNoOverlap)
212 TEST(AddrRangeTest, IntersectsFirstLastAddressOverlap)
225 TEST(AddrRangeTest, isSubsetCompleteOverlap)
234 TEST(AddrRangeTest, isSubsetNoOverlap)
243 TEST(AddrRangeTest, isSubsetTrueSubset)
252 TEST(AddrRangeTest, isSubsetPartialSubset)
261 TEST(AddrRangeTest, isSubsetInterleavedCompleteOverlap)
266 EXPECT_TRUE(r2.isSubset(r1));
269 TEST(AddrRangeTest, isSubsetInterleavedNoOverlap)
274 EXPECT_FALSE(r2.isSubset(r1));
277 TEST(AddrRangeTest, isSubsetInterleavedPartialOverlap)
282 EXPECT_FALSE(r2.isSubset(r1));
289 EXPECT_FALSE(
r.contains(0xEF));
290 EXPECT_TRUE(
r.contains(0xF0));
291 EXPECT_TRUE(
r.contains(0xF1));
292 EXPECT_TRUE(
r.contains(0xF2));
293 EXPECT_TRUE(
r.contains(0xF3));
294 EXPECT_TRUE(
r.contains(0xF4));
295 EXPECT_FALSE(
r.contains(0xF5));
296 EXPECT_FALSE(
r.contains(0xF6));
299 TEST(AddrRangeTest, ContainsInAnEmptyRange)
303 EXPECT_FALSE(
r.contains(0x1));
306 TEST(AddrRangeTest, RemoveIntlvBits)
315 a =
r.removeIntlvBits(
a);
319 TEST(AddrRangeTest, addIntlvBits)
328 a =
r.addIntlvBits(
a);
332 TEST(AddrRangeTest, OffsetInRange)
335 EXPECT_EQ(0x04,
r.getOffset(0x5));
338 TEST(AddrRangeTest, OffsetOutOfRangeAfter)
344 EXPECT_EQ(
MaxAddr,
r.getOffset(0xF0));
347 TEST(AddrRangeTest, OffsetOutOfRangeBefore)
350 EXPECT_EQ(
MaxAddr,
r.getOffset(0x04));
357 TEST(AddrRangeTest, LsbInterleavingMask)
366 uint8_t intlv_match = 1;
369 EXPECT_TRUE(
r.valid());
370 EXPECT_EQ(start,
r.start());
371 EXPECT_EQ(end,
r.end());
376 EXPECT_EQ(0x7F,
r.size());
381 EXPECT_EQ(1,
r.granularity());
382 EXPECT_TRUE(
r.interleaved());
383 EXPECT_EQ(
ULL(2),
r.stripes());
384 EXPECT_EQ(
"[0:0xff] a[0]^\b=1",
r.to_string());
387 TEST(AddrRangeTest, TwoInterleavingMasks)
396 masks.push_back((1 << 1));
397 uint8_t intlv_match = (1 << 1) | 1;
400 EXPECT_TRUE(
r.valid());
401 EXPECT_EQ(start,
r.start());
402 EXPECT_EQ(end,
r.end());
404 EXPECT_EQ(0x3FFF,
r.size());
405 EXPECT_TRUE(
r.interleaved());
406 EXPECT_EQ(
ULL(4),
r.stripes());
407 EXPECT_EQ(
"[0:0xffff] a[0]^\b=1 a[1]^\b=1",
r.to_string());
410 TEST(AddrRangeTest, ComplexInterleavingMasks)
415 masks.push_back((1 << 1) | 1);
416 masks.push_back((
ULL(1) << 63) | (
ULL(1) << 62));
417 uint8_t intlv_match = 0;
420 EXPECT_TRUE(
r.valid());
421 EXPECT_EQ(start,
r.start());
422 EXPECT_EQ(end,
r.end());
424 EXPECT_EQ(0x3FFF,
r.size());
425 EXPECT_TRUE(
r.interleaved());
426 EXPECT_EQ(
ULL(4),
r.stripes());
427 EXPECT_EQ(
"[0:0xffff] a[0]^a[1]^\b=0 a[62]^a[63]^\b=0",
r.to_string());
430 TEST(AddrRangeTest, InterleavingAddressesMergesWith)
432 Addr start1 = 0x0000;
435 masks.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
436 masks.push_back((1 << 2));
437 uint8_t intlv_match1 = 0;
438 AddrRange r1(start1, end1, masks, intlv_match1);
440 Addr start2 = 0x0000;
442 uint8_t intlv_match2 = 1;
443 AddrRange r2(start2, end2, masks, intlv_match2);
449 TEST(AddrRangeTest, InterleavingAddressesDoNotMergeWith)
451 Addr start1 = 0x0000;
454 masks1.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
455 masks1.push_back((1 << 2));
456 uint8_t intlv_match1 = 0;
457 AddrRange r1(start1, end1, masks1, intlv_match1);
459 Addr start2 = 0x0000;
462 masks2.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
463 masks2.push_back((1 << 3));
464 uint8_t intlv_match2 = 1;
465 AddrRange r2(start2, end2, masks2, intlv_match2);
471 TEST(AddrRangeTest, InterleavingAddressesDoNotIntersect)
476 Addr start1 = 0x0000;
480 uint8_t intlv_match1 = 1;
481 AddrRange r1(start1, end1, masks1, intlv_match1);
487 Addr start2 = 0x0000;
491 uint8_t intv_match2 = 0;
492 AddrRange r2(start2, end2, masks2, intv_match2);
498 TEST(AddrRangeTest, InterleavingAddressesIntersectsViaMerging)
500 Addr start1 = 0x0000;
503 masks1.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
504 masks1.push_back((1 << 2));
505 uint8_t intlv_match1 = 0;
506 AddrRange r1(start1, end1, masks1, intlv_match1);
508 Addr start2 = 0x0000;
511 masks2.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
512 masks2.push_back((1 << 2));
513 uint8_t intlv_match2 = 0;
514 AddrRange r2(start2, end2, masks2, intlv_match2);
520 TEST(AddrRangeTest, InterleavingAddressesDoesNotIntersectViaMerging)
522 Addr start1 = 0x0000;
525 masks1.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
526 masks1.push_back((1 << 2));
527 uint8_t intlv_match1 = 0;
528 AddrRange r1(start1, end1, masks1, intlv_match1);
530 Addr start2 = 0x0000;
533 masks2.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
534 masks2.push_back((1 << 2));
539 uint8_t intlv_match2 = 1;
540 AddrRange r2(start2, end2, masks2, intlv_match2);
556 TEST(AddrRangeTest, DISABLED_InterleavingAddressesIntersect)
561 Addr start1 = 0x0000;
565 uint8_t intlv_match1 = 0;
566 AddrRange r1(start1, end1, masks1, intlv_match1);
572 Addr start2 = 0x0000;
575 masks2.push_back(1 << 2);
576 uint8_t intlv_match2 = 1;
577 AddrRange r2(start2, end2, masks2, intlv_match2);
583 TEST(AddrRangeTest, DISABLED_InterleavingAddressesIntersectsOnOneByteAddress)
592 uint8_t intlv_match = 1;
593 AddrRange r1(start, end, masks, intlv_match);
602 DISABLED_InterleavingAddressesDoesNotIntersectOnOneByteAddress)
611 uint8_t intlv_match = 1;
612 AddrRange r1(start, end, masks, intlv_match);
626 TEST(AddrRangeTest, DISABLED_InterleavingAddressIsSubset)
629 Addr start1 = 0x0000;
633 uint8_t intlv_match1 = 0;
634 AddrRange r1(start1, end1, masks1, intlv_match1);
638 Addr start2 = 0xF000;
642 uint8_t intlv_match2 = 0;
643 AddrRange r2(start2, end2, masks2, intlv_match2);
649 TEST(AddrRangeTest, DISABLED_InterleavingAddressIsNotSubset)
652 Addr start1 = 0x0000;
656 uint8_t intlv_match1 = 0;
657 AddrRange r1(start1, end1, masks1, intlv_match1);
662 Addr start2 = 0xF000;
666 uint8_t intlv_match2 = 1;
667 AddrRange r2(start2, end2, masks2, intlv_match2);
673 TEST(AddrRangeTest, DISABLED_InterleavingAddressContains)
682 masks.push_back((1 << 4) | 1);
683 uint8_t intlv_match = 0;
687 if (((
addr & 1) && ((1 << 4) &
addr)) ||
688 (!(
addr & 1) && !((1 << 4) &
addr))) {
689 EXPECT_TRUE(
r.contains(
addr));
691 EXPECT_FALSE(
r.contains(
addr));
696 TEST(AddrRangeTest, InterleavingAddressAddRemoveInterlvBits)
698 Addr start = 0x00000;
702 uint8_t intlv_match = 1;
723 EXPECT_EQ(input >> 1,
output);
728 EXPECT_EQ(input,
r.addIntlvBits(
output));
731 TEST(AddrRangeTest, InterleavingAddressAddRemoveInterlvBitsTwoMasks)
733 Addr start = 0x00000;
736 masks.push_back((1 << 3) | (1 << 2) | (1 << 1) | 1);
737 masks.push_back((1 << 11) | (1 << 10) | (1 << 9) | (1 << 8));
738 uint8_t intlv_match = 1;
741 Addr input = (1 << 9) | (1 << 8) | 1;
750 EXPECT_EQ((1 << 7),
output);
755 EXPECT_EQ(input,
r.addIntlvBits(
output));
758 TEST(AddrRangeTest, AddRemoveInterleavBitsAcrossRange)
767 Addr start = 0x00000;
770 masks.push_back(1 << 2);
771 masks.push_back(1 << 3);
772 masks.push_back(1 << 7);
773 masks.push_back(1 << 11);
774 uint8_t intlv_match = 0xF;
777 for (
Addr i = 0;
i < 0xFFF;
i++) {
778 Addr removedBits =
r.removeIntlvBits(
i);
782 EXPECT_EQ(
i | (1 << 2) | (1 << 3) | (1 << 7) | (1 << 11),
783 r.addIntlvBits(removedBits));
787 TEST(AddrRangeTest, AddRemoveInterleavBitsAcrossContiguousRange)
796 Addr start = 0x00000;
799 masks.push_back(1 << 2);
800 masks.push_back(1 << 3);
801 masks.push_back(1 << 4);
802 uint8_t intlv_match = 0x7;
805 for (
Addr i = 0;
i < 0xFFF;
i++) {
806 Addr removedBits =
r.removeIntlvBits(
i);
810 EXPECT_EQ(
i | (1 << 2) | (1 << 3) | (1 << 4),
811 r.addIntlvBits(removedBits));
815 TEST(AddrRangeTest, InterleavingAddressesGetOffset)
820 masks.push_back((1 << 4) | (1 << 2));
821 uint8_t intlv_match = 0;
824 Addr value = ((1 << 10) | (1 << 9) | (1 << 8) | (1 << 2) | (1 << 1) | 1);
825 Addr value_interleaving_bits_removed =
826 ((1 << 9) | (1 << 8) | (1 << 7) | (1 << 1) | 1);
828 Addr expected_output = value_interleaving_bits_removed - start;
830 EXPECT_EQ(expected_output,
r.getOffset(value));
833 TEST(AddrRangeTest, InterleavingLessThanStartEquals)
835 Addr start1 = 0x0000FFFF;
836 Addr end1 = 0xFFFF0000;
838 masks1.push_back((1 << 4) | (1 << 2));
839 uint8_t intlv_match1 = 0;
840 AddrRange r1(start1, end1, masks1, intlv_match1);
842 Addr start2 = 0x0000FFFF;
843 Addr end2 = 0x000F0000;
845 masks2.push_back((1 << 4) | (1 << 2));
846 masks2.push_back((1 << 10));
847 uint8_t intlv_match2 = 2;
848 AddrRange r2(start2, end2, masks2, intlv_match2);
854 EXPECT_TRUE(r1 < r2);
855 EXPECT_FALSE(r2 < r1);
858 TEST(AddrRangeTest, InterleavingLessThanStartNotEquals)
860 Addr start1 = 0x0000FFFF;
861 Addr end1 = 0xFFFF0000;
863 masks1.push_back((1 << 4) | (1 << 2));
864 uint8_t intlv_match1 = 0;
865 AddrRange r1(start1, end1, masks1, intlv_match1);
867 Addr start2 = 0x0000FFFE;
868 Addr end2 = 0x000F0000;
870 masks2.push_back((1 << 4) | (1 << 2));
871 masks2.push_back((1 << 10));
872 uint8_t intlv_match2 = 2;
873 AddrRange r2(start2, end2, masks2, intlv_match2);
875 EXPECT_TRUE(r2 < r1);
876 EXPECT_FALSE(r1 < r2);
879 TEST(AddrRangeTest, InterleavingEqualTo)
881 Addr start1 = 0x0000FFFF;
882 Addr end1 = 0xFFFF0000;
884 masks1.push_back((1 << 4) | (1 << 2));
885 uint8_t intlv_match1 = 0;
886 AddrRange r1(start1, end1, masks1, intlv_match1);
888 Addr start2 = 0x0000FFFF;
889 Addr end2 = 0xFFFF0000;
891 masks2.push_back((1 << 4) | (1 << 2));
892 uint8_t intlv_match2 = 0;
893 AddrRange r2(start2, end2, masks2, intlv_match2);
895 EXPECT_TRUE(r1 == r2);
898 TEST(AddrRangeTest, InterleavingNotEqualTo)
900 Addr start1 = 0x0000FFFF;
901 Addr end1 = 0xFFFF0000;
903 masks1.push_back((1 << 4) | (1 << 2));
904 uint8_t intlv_match1 = 0;
905 AddrRange r1(start1, end1, masks1, intlv_match1);
907 Addr start2 = 0x0000FFFF;
908 Addr end2 = 0xFFFF0000;
910 masks2.push_back((1 << 4) | (1 << 2));
911 masks2.push_back((1 << 10));
912 uint8_t intlv_match2 = 2;
913 AddrRange r2(start2, end2, masks2, intlv_match2);
918 EXPECT_FALSE(r1 == r2);
927 TEST(AddrRangeTest, MergingInterleavingAddressRanges)
929 Addr start1 = 0x0000;
932 masks1.push_back((1 << 4) | (1 << 2));
933 uint8_t intlv_match1 = 0;
934 AddrRange r1(start1, end1, masks1, intlv_match1);
936 Addr start2 = 0x0000;
939 masks2.push_back((1 << 4) | (1 << 2));
940 uint8_t intlv_match2 = 1;
941 AddrRange r2(start2, end2, masks2, intlv_match2);
944 to_merge.push_back(r1);
945 to_merge.push_back(r2);
949 EXPECT_EQ(0x0000,
output.start());
950 EXPECT_EQ(0xFFFF,
output.end());
951 EXPECT_FALSE(
output.interleaved());
954 TEST(AddrRangeTest, MergingInterleavingAddressRangesOneRange)
963 masks.push_back((1 << 4) | (1 << 2));
964 uint8_t intlv_match = 0;
968 to_merge.push_back(
r);
991 TEST(AddrRangeTest, LegacyConstructorNoInterleaving)
996 AddrRange range(0x0000, 0xFFFF, 0, 0, 0 ,0);
1002 TEST(AddrRangeTest, LegacyConstructorOneBitMask)
1009 AddrRange range(0x00000000, 0xFFFFFFFF, 0, 0, 1, 0);
1018 TEST(AddrRangeTest, LegacyConstructorTwoBitMask)
1025 AddrRange range(0x00000000, 0xFFFFFFFF, 1, 0, 2, 3);
1029 masks.push_back((1 << 1));
1035 TEST(AddrRangeTest, LegacyConstructorTwoBitMaskWithXOR)
1043 AddrRange range(0x00000000, 0xFFFFFFFF, 1, 11, 2, 3);
1052 Addr xor_mask = (1 << 11) | (1 << 10);
1053 for (
Addr i = 0;
i < 0x0000FFFF;
i++) {
1055 Addr xor_value = (xor_mask &
i) >> 10;
1060 if (((xor_value ^
i) & 3) == 3) {
1072 TEST(AddrRangeTest, RangeExConstruction)
1075 EXPECT_EQ(0x6,
r.start());
1076 EXPECT_EQ(0xE,
r.end());
1079 TEST(AddrRangeTest, RangeInConstruction)
1082 EXPECT_EQ(0x6,
r.start());
1083 EXPECT_EQ(0xF,
r.end());
1086 TEST(AddrRangeTest, RangeSizeConstruction){
1088 EXPECT_EQ(0x5,
r.start());
1089 EXPECT_EQ(0xA,
r.end());