14{
15
16
17
18
19
20
21
22
23 std::unordered_map<unsigned int, bool> validationMap;
24
25 for (auto memBlock : memBlocks)
26 {
27 validationMap[memBlock.m_Index] = false;
28 }
29
30 auto memBinVect = m_Strategy->Optimize(memBlocks);
31
32
33
34
35
36 for (auto memBin : memBinVect)
37 {
38 for (auto block : memBin.m_MemBlocks)
39 {
40 try
41 {
42 if (!validationMap.at(block.m_Index))
43 {
44 validationMap.at(block.m_Index) = true;
45 }
46 else
47 {
48 throw MemoryValidationException("Condition #2: Memblock is assigned to multiple MemBins");
49 }
50 }
51 catch (const std::out_of_range&)
52 {
53 throw MemoryValidationException("Unknown index ");
54 }
55 }
56 }
57
58 for (auto memBlock : memBlocks)
59 {
60 if (!validationMap.at(memBlock.m_Index))
61 {
62 throw MemoryValidationException("Condition #1: Block not found in any bin");
63 }
64 }
65
66
67 for (auto bin : memBinVect)
68 {
69 for (unsigned int i = 0; i < bin.m_MemBlocks.size(); ++i)
70 {
71 auto Block1 = bin.m_MemBlocks[i];
72 auto B1Left = Block1.m_Offset;
73 auto B1Right = Block1.m_Offset + Block1.m_MemSize;
74
75 auto B1Top = Block1.m_StartOfLife;
76 auto B1Bottom = Block1.m_EndOfLife;
77
78
79 for (unsigned int j = i + 1; j < bin.m_MemBlocks.size(); ++j)
80 {
81 auto Block2 = bin.m_MemBlocks[j];
82 auto B2Left = Block2.m_Offset;
83 auto B2Right = Block2.m_Offset + Block2.m_MemSize;
84
85 auto B2Top = Block2.m_StartOfLife;
86 auto B2Bottom = Block2.m_EndOfLife;
87
88 switch (m_Strategy->GetMemBlockStrategyType())
89 {
90 case (MemBlockStrategyType::SingleAxisPacking):
91 {
92 if (B1Top <= B2Bottom && B1Bottom >= B2Top)
93 {
94 throw MemoryValidationException("Condition #3: "
95 "invalid as two Memblocks overlap on the Y axis for SingleAxisPacking");
96
97 }
98 break;
99 }
100 case (MemBlockStrategyType::MultiAxisPacking):
101 {
102
103 if (B1Left <= B2Right && B1Right >= B2Left &&
104 B1Top <= B2Bottom && B1Bottom >= B2Top)
105 {
106
107 throw MemoryValidationException("Condition #3: "
108 "two Memblocks overlap on both the X and Y axis");
109 }
110 break;
111 }
112 default:
113 throw MemoryValidationException("Unknown MemBlockStrategyType");
114 }
115 }
116 }
117 }
118
119
120 return memBinVect;
121}