39 #include <gtest/gtest.h>
48 TEST(AddrRangeTest, ValidRange)
51 EXPECT_FALSE(
r.valid());
60 TEST(AddrRangeTest, EmptyRange)
67 EXPECT_TRUE(
r.valid());
68 EXPECT_EQ(0x0,
r.start());
69 EXPECT_EQ(0x0,
r.end());
70 EXPECT_EQ(0,
r.size());
75 EXPECT_EQ(0,
r.granularity());
80 EXPECT_FALSE(
r.interleaved());
85 EXPECT_EQ(1ULL,
r.stripes());
86 EXPECT_EQ(
"[0:0]",
r.to_string());
89 TEST(AddrRangeTest, RangeSizeOfOne)
92 EXPECT_TRUE(
r.valid());
93 EXPECT_EQ(0x0,
r.start());
94 EXPECT_EQ(0x1,
r.end());
95 EXPECT_EQ(1,
r.size());
96 EXPECT_EQ(1,
r.granularity());
97 EXPECT_FALSE(
r.interleaved());
98 EXPECT_EQ(1ULL,
r.stripes());
99 EXPECT_EQ(
"[0:0x1]",
r.to_string());
102 TEST(AddrRangeTest, Range16Bit)
105 EXPECT_TRUE(
r.valid());
106 EXPECT_EQ(0xF000,
r.start());
107 EXPECT_EQ(0xFFFF,
r.end());
108 EXPECT_EQ(0x0FFF,
r.size());
109 EXPECT_EQ(0x0FFF,
r.granularity());
110 EXPECT_FALSE(
r.interleaved());
111 EXPECT_EQ(1ULL,
r.stripes());
112 EXPECT_EQ(
"[0xf000:0xffff]",
r.to_string());
115 TEST(AddrRangeTest, InvalidRange)
118 EXPECT_FALSE(
r.valid());
133 EXPECT_TRUE(r1 < r2);
134 EXPECT_FALSE(r2 < r1);
135 EXPECT_FALSE(r1 < r3);
136 EXPECT_FALSE(r3 < r1);
139 TEST(AddrRangeTest, EqualToNotEqualTo)
145 EXPECT_TRUE(r1 == r2);
146 EXPECT_FALSE(r1 == r3);
147 EXPECT_FALSE(r1 != r2);
148 EXPECT_TRUE(r1 != r3);
150 EXPECT_TRUE(r2 == r1);
151 EXPECT_FALSE(r3 == r1);
152 EXPECT_FALSE(r2 != r1);
153 EXPECT_TRUE(r3 != r1);
156 TEST(AddrRangeTest, MergesWith)
169 TEST(AddrRangeTest, DoesNotMergeWith)
178 TEST(AddrRangeTest, IntersectsCompleteOverlap)
187 TEST(AddrRangeTest, IntersectsAddressWithin)
196 TEST(AddrRangeTest, IntersectsPartialOverlap)
205 TEST(AddrRangeTest, IntersectsNoOverlap)
214 TEST(AddrRangeTest, IntersectsFirstLastAddressOverlap)
227 TEST(AddrRangeTest, isSubsetCompleteOverlap)
236 TEST(AddrRangeTest, isSubsetNoOverlap)
245 TEST(AddrRangeTest, isSubsetTrueSubset)
254 TEST(AddrRangeTest, isSubsetPartialSubset)
263 TEST(AddrRangeTest, isSubsetInterleavedCompleteOverlap)
268 EXPECT_TRUE(r2.isSubset(r1));
271 TEST(AddrRangeTest, isSubsetInterleavedNoOverlap)
276 EXPECT_FALSE(r2.isSubset(r1));
279 TEST(AddrRangeTest, isSubsetInterleavedPartialOverlap)
284 EXPECT_FALSE(r2.isSubset(r1));
291 EXPECT_FALSE(
r.contains(0xEF));
292 EXPECT_TRUE(
r.contains(0xF0));
293 EXPECT_TRUE(
r.contains(0xF1));
294 EXPECT_TRUE(
r.contains(0xF2));
295 EXPECT_TRUE(
r.contains(0xF3));
296 EXPECT_TRUE(
r.contains(0xF4));
297 EXPECT_FALSE(
r.contains(0xF5));
298 EXPECT_FALSE(
r.contains(0xF6));
301 TEST(AddrRangeTest, ContainsInAnEmptyRange)
305 EXPECT_FALSE(
r.contains(0x1));
308 TEST(AddrRangeTest, RemoveIntlvBits)
317 a =
r.removeIntlvBits(
a);
321 TEST(AddrRangeTest, addIntlvBits)
330 a =
r.addIntlvBits(
a);
334 TEST(AddrRangeTest, OffsetInRange)
337 EXPECT_EQ(0x04,
r.getOffset(0x5));
340 TEST(AddrRangeTest, OffsetOutOfRangeAfter)
346 EXPECT_EQ(
MaxAddr,
r.getOffset(0xF0));
349 TEST(AddrRangeTest, OffsetOutOfRangeBefore)
352 EXPECT_EQ(
MaxAddr,
r.getOffset(0x04));
359 TEST(AddrRangeTest, LsbInterleavingMask)
368 uint8_t intlv_match = 1;
371 EXPECT_TRUE(
r.valid());
372 EXPECT_EQ(start,
r.start());
373 EXPECT_EQ(end,
r.end());
378 EXPECT_EQ(0x7F,
r.size());
383 EXPECT_EQ(1,
r.granularity());
384 EXPECT_TRUE(
r.interleaved());
385 EXPECT_EQ(2ULL,
r.stripes());
386 EXPECT_EQ(
"[0:0xff] a[0]^\b=1",
r.to_string());
389 TEST(AddrRangeTest, TwoInterleavingMasks)
398 masks.push_back((1 << 1));
399 uint8_t intlv_match = (1 << 1) | 1;
402 EXPECT_TRUE(
r.valid());
403 EXPECT_EQ(start,
r.start());
404 EXPECT_EQ(end,
r.end());
406 EXPECT_EQ(0x3FFF,
r.size());
407 EXPECT_TRUE(
r.interleaved());
408 EXPECT_EQ(4ULL,
r.stripes());
409 EXPECT_EQ(
"[0:0xffff] a[0]^\b=1 a[1]^\b=1",
r.to_string());
412 TEST(AddrRangeTest, ComplexInterleavingMasks)
417 masks.push_back((1 << 1) | 1);
418 masks.push_back((1ULL << 63) | (1ULL << 62));
419 uint8_t intlv_match = 0;
422 EXPECT_TRUE(
r.valid());
423 EXPECT_EQ(start,
r.start());
424 EXPECT_EQ(end,
r.end());
426 EXPECT_EQ(0x3FFF,
r.size());
427 EXPECT_TRUE(
r.interleaved());
428 EXPECT_EQ(4ULL,
r.stripes());
429 EXPECT_EQ(
"[0:0xffff] a[0]^a[1]^\b=0 a[62]^a[63]^\b=0",
r.to_string());
432 TEST(AddrRangeTest, InterleavingAddressesMergesWith)
434 Addr start1 = 0x0000;
437 masks.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
438 masks.push_back((1 << 2));
439 uint8_t intlv_match1 = 0;
440 AddrRange r1(start1, end1, masks, intlv_match1);
442 Addr start2 = 0x0000;
444 uint8_t intlv_match2 = 1;
445 AddrRange r2(start2, end2, masks, intlv_match2);
451 TEST(AddrRangeTest, InterleavingAddressesDoNotMergeWith)
453 Addr start1 = 0x0000;
456 masks1.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
457 masks1.push_back((1 << 2));
458 uint8_t intlv_match1 = 0;
459 AddrRange r1(start1, end1, masks1, intlv_match1);
461 Addr start2 = 0x0000;
464 masks2.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
465 masks2.push_back((1 << 3));
466 uint8_t intlv_match2 = 1;
467 AddrRange r2(start2, end2, masks2, intlv_match2);
473 TEST(AddrRangeTest, InterleavingAddressesDoNotIntersect)
478 Addr start1 = 0x0000;
482 uint8_t intlv_match1 = 1;
483 AddrRange r1(start1, end1, masks1, intlv_match1);
489 Addr start2 = 0x0000;
493 uint8_t intv_match2 = 0;
494 AddrRange r2(start2, end2, masks2, intv_match2);
500 TEST(AddrRangeTest, InterleavingAddressesIntersectsViaMerging)
502 Addr start1 = 0x0000;
505 masks1.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
506 masks1.push_back((1 << 2));
507 uint8_t intlv_match1 = 0;
508 AddrRange r1(start1, end1, masks1, intlv_match1);
510 Addr start2 = 0x0000;
513 masks2.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
514 masks2.push_back((1 << 2));
515 uint8_t intlv_match2 = 0;
516 AddrRange r2(start2, end2, masks2, intlv_match2);
522 TEST(AddrRangeTest, InterleavingAddressesDoesNotIntersectViaMerging)
524 Addr start1 = 0x0000;
527 masks1.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
528 masks1.push_back((1 << 2));
529 uint8_t intlv_match1 = 0;
530 AddrRange r1(start1, end1, masks1, intlv_match1);
532 Addr start2 = 0x0000;
535 masks2.push_back((1 << 29) | (1 << 20) | (1 << 10) | 1);
536 masks2.push_back((1 << 2));
541 uint8_t intlv_match2 = 1;
542 AddrRange r2(start2, end2, masks2, intlv_match2);
558 TEST(AddrRangeTest, DISABLED_InterleavingAddressesIntersect)
563 Addr start1 = 0x0000;
567 uint8_t intlv_match1 = 0;
568 AddrRange r1(start1, end1, masks1, intlv_match1);
574 Addr start2 = 0x0000;
577 masks2.push_back(1 << 2);
578 uint8_t intlv_match2 = 1;
579 AddrRange r2(start2, end2, masks2, intlv_match2);
585 TEST(AddrRangeTest, DISABLED_InterleavingAddressesIntersectsOnOneByteAddress)
594 uint8_t intlv_match = 1;
595 AddrRange r1(start, end, masks, intlv_match);
604 DISABLED_InterleavingAddressesDoesNotIntersectOnOneByteAddress)
613 uint8_t intlv_match = 1;
614 AddrRange r1(start, end, masks, intlv_match);
628 TEST(AddrRangeTest, DISABLED_InterleavingAddressIsSubset)
631 Addr start1 = 0x0000;
635 uint8_t intlv_match1 = 0;
636 AddrRange r1(start1, end1, masks1, intlv_match1);
640 Addr start2 = 0xF000;
644 uint8_t intlv_match2 = 0;
645 AddrRange r2(start2, end2, masks2, intlv_match2);
651 TEST(AddrRangeTest, DISABLED_InterleavingAddressIsNotSubset)
654 Addr start1 = 0x0000;
658 uint8_t intlv_match1 = 0;
659 AddrRange r1(start1, end1, masks1, intlv_match1);
664 Addr start2 = 0xF000;
668 uint8_t intlv_match2 = 1;
669 AddrRange r2(start2, end2, masks2, intlv_match2);
675 TEST(AddrRangeTest, DISABLED_InterleavingAddressContains)
684 masks.push_back((1 << 4) | 1);
685 uint8_t intlv_match = 0;
689 if (((
addr & 1) && ((1 << 4) &
addr)) ||
690 (!(
addr & 1) && !((1 << 4) &
addr))) {
691 EXPECT_TRUE(
r.contains(
addr));
693 EXPECT_FALSE(
r.contains(
addr));
698 TEST(AddrRangeTest, InterleavingAddressAddRemoveInterlvBits)
700 Addr start = 0x00000;
704 uint8_t intlv_match = 1;
725 EXPECT_EQ(input >> 1,
output);
730 EXPECT_EQ(input,
r.addIntlvBits(
output));
733 TEST(AddrRangeTest, InterleavingAddressAddRemoveInterlvBitsTwoMasks)
735 Addr start = 0x00000;
738 masks.push_back((1 << 3) | (1 << 2) | (1 << 1) | 1);
739 masks.push_back((1 << 11) | (1 << 10) | (1 << 9) | (1 << 8));
740 uint8_t intlv_match = 1;
743 Addr input = (1 << 9) | (1 << 8) | 1;
752 EXPECT_EQ((1 << 7),
output);
757 EXPECT_EQ(input,
r.addIntlvBits(
output));
760 TEST(AddrRangeTest, AddRemoveInterleavBitsAcrossRange)
769 Addr start = 0x00000;
772 masks.push_back(1 << 2);
773 masks.push_back(1 << 3);
774 masks.push_back(1 << 7);
775 masks.push_back(1 << 11);
776 uint8_t intlv_match = 0xF;
779 for (
Addr i = 0;
i < 0xFFF;
i++) {
780 Addr removedBits =
r.removeIntlvBits(
i);
784 EXPECT_EQ(
i | (1 << 2) | (1 << 3) | (1 << 7) | (1 << 11),
785 r.addIntlvBits(removedBits));
789 TEST(AddrRangeTest, AddRemoveInterleavBitsAcrossContiguousRange)
798 Addr start = 0x00000;
801 masks.push_back(1 << 2);
802 masks.push_back(1 << 3);
803 masks.push_back(1 << 4);
804 uint8_t intlv_match = 0x7;
807 for (
Addr i = 0;
i < 0xFFF;
i++) {
808 Addr removedBits =
r.removeIntlvBits(
i);
812 EXPECT_EQ(
i | (1 << 2) | (1 << 3) | (1 << 4),
813 r.addIntlvBits(removedBits));
817 TEST(AddrRangeTest, InterleavingAddressesGetOffset)
822 masks.push_back((1 << 4) | (1 << 2));
823 uint8_t intlv_match = 0;
826 Addr value = ((1 << 10) | (1 << 9) | (1 << 8) | (1 << 2) | (1 << 1) | 1);
827 Addr value_interleaving_bits_removed =
828 ((1 << 9) | (1 << 8) | (1 << 7) | (1 << 1) | 1);
830 Addr expected_output = value_interleaving_bits_removed - start;
832 EXPECT_EQ(expected_output,
r.getOffset(value));
835 TEST(AddrRangeTest, InterleavingLessThanStartEquals)
837 Addr start1 = 0x0000FFFF;
838 Addr end1 = 0xFFFF0000;
840 masks1.push_back((1 << 4) | (1 << 2));
841 uint8_t intlv_match1 = 0;
842 AddrRange r1(start1, end1, masks1, intlv_match1);
844 Addr start2 = 0x0000FFFF;
845 Addr end2 = 0x000F0000;
847 masks2.push_back((1 << 4) | (1 << 2));
848 masks2.push_back((1 << 10));
849 uint8_t intlv_match2 = 2;
850 AddrRange r2(start2, end2, masks2, intlv_match2);
856 EXPECT_TRUE(r1 < r2);
857 EXPECT_FALSE(r2 < r1);
860 TEST(AddrRangeTest, InterleavingLessThanStartNotEquals)
862 Addr start1 = 0x0000FFFF;
863 Addr end1 = 0xFFFF0000;
865 masks1.push_back((1 << 4) | (1 << 2));
866 uint8_t intlv_match1 = 0;
867 AddrRange r1(start1, end1, masks1, intlv_match1);
869 Addr start2 = 0x0000FFFE;
870 Addr end2 = 0x000F0000;
872 masks2.push_back((1 << 4) | (1 << 2));
873 masks2.push_back((1 << 10));
874 uint8_t intlv_match2 = 2;
875 AddrRange r2(start2, end2, masks2, intlv_match2);
877 EXPECT_TRUE(r2 < r1);
878 EXPECT_FALSE(r1 < r2);
881 TEST(AddrRangeTest, InterleavingEqualTo)
883 Addr start1 = 0x0000FFFF;
884 Addr end1 = 0xFFFF0000;
886 masks1.push_back((1 << 4) | (1 << 2));
887 uint8_t intlv_match1 = 0;
888 AddrRange r1(start1, end1, masks1, intlv_match1);
890 Addr start2 = 0x0000FFFF;
891 Addr end2 = 0xFFFF0000;
893 masks2.push_back((1 << 4) | (1 << 2));
894 uint8_t intlv_match2 = 0;
895 AddrRange r2(start2, end2, masks2, intlv_match2);
897 EXPECT_TRUE(r1 == r2);
900 TEST(AddrRangeTest, InterleavingNotEqualTo)
902 Addr start1 = 0x0000FFFF;
903 Addr end1 = 0xFFFF0000;
905 masks1.push_back((1 << 4) | (1 << 2));
906 uint8_t intlv_match1 = 0;
907 AddrRange r1(start1, end1, masks1, intlv_match1);
909 Addr start2 = 0x0000FFFF;
910 Addr end2 = 0xFFFF0000;
912 masks2.push_back((1 << 4) | (1 << 2));
913 masks2.push_back((1 << 10));
914 uint8_t intlv_match2 = 2;
915 AddrRange r2(start2, end2, masks2, intlv_match2);
920 EXPECT_FALSE(r1 == r2);
929 TEST(AddrRangeTest, MergingInterleavingAddressRanges)
931 Addr start1 = 0x0000;
934 masks1.push_back((1 << 4) | (1 << 2));
935 uint8_t intlv_match1 = 0;
936 AddrRange r1(start1, end1, masks1, intlv_match1);
938 Addr start2 = 0x0000;
941 masks2.push_back((1 << 4) | (1 << 2));
942 uint8_t intlv_match2 = 1;
943 AddrRange r2(start2, end2, masks2, intlv_match2);
946 to_merge.push_back(r1);
947 to_merge.push_back(r2);
951 EXPECT_EQ(0x0000,
output.start());
952 EXPECT_EQ(0xFFFF,
output.end());
953 EXPECT_FALSE(
output.interleaved());
956 TEST(AddrRangeTest, MergingInterleavingAddressRangesOneRange)
965 masks.push_back((1 << 4) | (1 << 2));
966 uint8_t intlv_match = 0;
970 to_merge.push_back(
r);
993 TEST(AddrRangeTest, LegacyConstructorNoInterleaving)
998 AddrRange range(0x0000, 0xFFFF, 0, 0, 0 ,0);
1004 TEST(AddrRangeTest, LegacyConstructorOneBitMask)
1011 AddrRange range(0x00000000, 0xFFFFFFFF, 0, 0, 1, 0);
1020 TEST(AddrRangeTest, LegacyConstructorTwoBitMask)
1027 AddrRange range(0x00000000, 0xFFFFFFFF, 1, 0, 2, 3);
1031 masks.push_back((1 << 1));
1037 TEST(AddrRangeTest, LegacyConstructorTwoBitMaskWithXOR)
1045 AddrRange range(0x00000000, 0xFFFFFFFF, 1, 11, 2, 3);
1054 Addr xor_mask = (1 << 11) | (1 << 10);
1055 for (
Addr i = 0;
i < 0x0000FFFF;
i++) {
1057 Addr xor_value = (xor_mask &
i) >> 10;
1062 if (((xor_value ^
i) & 3) == 3) {
1074 TEST(AddrRangeTest, RangeExConstruction)
1077 EXPECT_EQ(0x6,
r.start());
1078 EXPECT_EQ(0xE,
r.end());
1081 TEST(AddrRangeTest, RangeInConstruction)
1084 EXPECT_EQ(0x6,
r.start());
1085 EXPECT_EQ(0xF,
r.end());
1088 TEST(AddrRangeTest, RangeSizeConstruction){
1090 EXPECT_EQ(0x5,
r.start());
1091 EXPECT_EQ(0xA,
r.end());