1aee34000SFrancesco Petrogalli #include "llvm/CodeGen/MachineScheduler.h"
2aee34000SFrancesco Petrogalli #include "gtest/gtest.h"
3aee34000SFrancesco Petrogalli
4aee34000SFrancesco Petrogalli using namespace llvm;
5aee34000SFrancesco Petrogalli
6aee34000SFrancesco Petrogalli #ifndef NDEBUG
TEST(ResourceSegmentsDeath,OverwriteOnRight)7aee34000SFrancesco Petrogalli TEST(ResourceSegmentsDeath, OverwriteOnRight) {
8aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
9aee34000SFrancesco Petrogalli EXPECT_DEATH(X.add({15, 30}), "A resource is being overwritten");
10aee34000SFrancesco Petrogalli }
11aee34000SFrancesco Petrogalli
TEST(ResourceSegmentsDeath,OverwriteOnLeft)12aee34000SFrancesco Petrogalli TEST(ResourceSegmentsDeath, OverwriteOnLeft) {
13aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
14aee34000SFrancesco Petrogalli EXPECT_DEATH(X.add({5, 11}), "A resource is being overwritten");
15aee34000SFrancesco Petrogalli ;
16aee34000SFrancesco Petrogalli }
17aee34000SFrancesco Petrogalli
TEST(ResourceSegmentsDeath,FullOverwrite)18aee34000SFrancesco Petrogalli TEST(ResourceSegmentsDeath, FullOverwrite) {
19aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
20aee34000SFrancesco Petrogalli EXPECT_DEATH(X.add({15, 18}), "A resource is being overwritten");
21aee34000SFrancesco Petrogalli }
22aee34000SFrancesco Petrogalli
TEST(ResourceSegmentsDeath,ZeroSizeIntervalsNotAllowed)23aee34000SFrancesco Petrogalli TEST(ResourceSegmentsDeath, ZeroSizeIntervalsNotAllowed) {
24aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
25aee34000SFrancesco Petrogalli EXPECT_DEATH(X.add({20, 30}, 0), "0-size interval history has no use.");
26aee34000SFrancesco Petrogalli }
27aee34000SFrancesco Petrogalli #endif // NDEBUG
28aee34000SFrancesco Petrogalli
TEST(ResourceSegments,ConsecutiveLeftNoOverlap)29aee34000SFrancesco Petrogalli TEST(ResourceSegments, ConsecutiveLeftNoOverlap) {
30aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
31aee34000SFrancesco Petrogalli X.add({7, 9});
32aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{7, 9}, {10, 20}}));
33aee34000SFrancesco Petrogalli }
34aee34000SFrancesco Petrogalli
TEST(ResourceSegments,ConsecutiveLeftWithOverlap)35aee34000SFrancesco Petrogalli TEST(ResourceSegments, ConsecutiveLeftWithOverlap) {
36aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
37aee34000SFrancesco Petrogalli X.add({7, 10});
38aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{7, 20}}));
39aee34000SFrancesco Petrogalli }
40aee34000SFrancesco Petrogalli
TEST(ResourceSegments,ConsecutiveRightNoOverlap)41aee34000SFrancesco Petrogalli TEST(ResourceSegments, ConsecutiveRightNoOverlap) {
42aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
43aee34000SFrancesco Petrogalli X.add({21, 22});
44aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{10, 20}, {21, 22}}));
45aee34000SFrancesco Petrogalli }
46aee34000SFrancesco Petrogalli
TEST(ResourceSegments,ConsecutiveRightWithOverlap)47aee34000SFrancesco Petrogalli TEST(ResourceSegments, ConsecutiveRightWithOverlap) {
48aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
49aee34000SFrancesco Petrogalli X.add({20, 22});
50aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{10, 22}}));
51aee34000SFrancesco Petrogalli }
52aee34000SFrancesco Petrogalli
TEST(ResourceSegments,Disjoint)53aee34000SFrancesco Petrogalli TEST(ResourceSegments, Disjoint) {
54aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}});
55aee34000SFrancesco Petrogalli X.add({22, 23});
56aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{10, 20}, {22, 23}}));
57aee34000SFrancesco Petrogalli }
58aee34000SFrancesco Petrogalli
TEST(ResourceSegments,SortAfterAdd)59aee34000SFrancesco Petrogalli TEST(ResourceSegments, SortAfterAdd) {
60aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}, {3, 4}});
61aee34000SFrancesco Petrogalli X.add({6, 8});
62aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{3, 4}, {6, 8}, {10, 20}}));
63aee34000SFrancesco Petrogalli }
64aee34000SFrancesco Petrogalli
TEST(ResourceSegments,AddWithCutOff)65aee34000SFrancesco Petrogalli TEST(ResourceSegments, AddWithCutOff) {
66aee34000SFrancesco Petrogalli auto X = ResourceSegments({{1, 2}, {3, 4}});
67aee34000SFrancesco Petrogalli X.add({6, 8}, 2);
68aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{3, 4}, {6, 8}}));
69aee34000SFrancesco Petrogalli }
70aee34000SFrancesco Petrogalli
TEST(ResourceSegments,add_01)71aee34000SFrancesco Petrogalli TEST(ResourceSegments, add_01) {
72aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}, {30, 40}});
73aee34000SFrancesco Petrogalli X.add({21, 29});
74aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{10, 20}, {21, 29}, {30, 40}}));
75aee34000SFrancesco Petrogalli }
76aee34000SFrancesco Petrogalli
TEST(ResourceSegments,add_02)77aee34000SFrancesco Petrogalli TEST(ResourceSegments, add_02) {
78aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}, {30, 40}});
79aee34000SFrancesco Petrogalli X.add({22, 29});
80aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{10, 20}, {22, 29}, {30, 40}}));
81aee34000SFrancesco Petrogalli X.add({29, 30});
82aee34000SFrancesco Petrogalli EXPECT_EQ(X, ResourceSegments({{10, 20}, {22, 40}}));
83aee34000SFrancesco Petrogalli }
84aee34000SFrancesco Petrogalli
85aee34000SFrancesco Petrogalli #ifndef NDEBUG
TEST(ResourceSegmentsDeath,add_empty)86aee34000SFrancesco Petrogalli TEST(ResourceSegmentsDeath, add_empty) {
87aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}, {30, 40}});
88*7e09239eSMichael Maitland X.add({22, 22});
89*7e09239eSMichael Maitland EXPECT_EQ(X, ResourceSegments({{10, 20}, {30, 40}}));
90aee34000SFrancesco Petrogalli }
91aee34000SFrancesco Petrogalli #endif
92aee34000SFrancesco Petrogalli
TEST(ResourceSegments,sort_two)93aee34000SFrancesco Petrogalli TEST(ResourceSegments, sort_two) {
94aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{30, 40}, {10, 28}}),
95aee34000SFrancesco Petrogalli ResourceSegments({{10, 28}, {30, 40}}));
96aee34000SFrancesco Petrogalli }
97aee34000SFrancesco Petrogalli
TEST(ResourceSegments,sort_three)98aee34000SFrancesco Petrogalli TEST(ResourceSegments, sort_three) {
99aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{30, 40}, {71, 200}, {10, 29}}),
100aee34000SFrancesco Petrogalli ResourceSegments({{10, 29}, {30, 40}, {71, 200}}));
101aee34000SFrancesco Petrogalli }
102aee34000SFrancesco Petrogalli
TEST(ResourceSegments,merge_two)103aee34000SFrancesco Petrogalli TEST(ResourceSegments, merge_two) {
104aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{10, 33}, {30, 40}}),
105aee34000SFrancesco Petrogalli ResourceSegments({{10, 40}}));
106aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{10, 30}, {30, 40}}),
107aee34000SFrancesco Petrogalli ResourceSegments({{10, 40}}));
108aee34000SFrancesco Petrogalli // Cycle 29 is resource free, so the interval is disjoint.
109aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{10, 29}, {30, 40}}),
110aee34000SFrancesco Petrogalli ResourceSegments({{10, 29}, {30, 40}}));
111aee34000SFrancesco Petrogalli }
112aee34000SFrancesco Petrogalli
TEST(ResourceSegments,merge_three)113aee34000SFrancesco Petrogalli TEST(ResourceSegments, merge_three) {
114aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{10, 29}, {30, 40}, {71, 200}}),
115aee34000SFrancesco Petrogalli ResourceSegments({{10, 29}, {30, 40}, {71, 200}}));
116aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{10, 29}, {30, 40}, {41, 200}}),
117aee34000SFrancesco Petrogalli ResourceSegments({{10, 29}, {30, 40}, {41, 200}}));
118aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{10, 30}, {30, 40}, {40, 200}}),
119aee34000SFrancesco Petrogalli ResourceSegments({{10, 200}}));
120aee34000SFrancesco Petrogalli EXPECT_EQ(ResourceSegments({{10, 28}, {30, 71}, {71, 200}}),
121aee34000SFrancesco Petrogalli ResourceSegments({{10, 28}, {30, 200}}));
122aee34000SFrancesco Petrogalli }
123aee34000SFrancesco Petrogalli
124aee34000SFrancesco Petrogalli ////////////////////////////////////////////////////////////////////////////////
125aee34000SFrancesco Petrogalli // Intersection
TEST(ResourceSegments,intersects)126aee34000SFrancesco Petrogalli TEST(ResourceSegments, intersects) {
127aee34000SFrancesco Petrogalli // no intersect
128aee34000SFrancesco Petrogalli EXPECT_FALSE(ResourceSegments::intersects({0, 1}, {3, 4}));
129aee34000SFrancesco Petrogalli EXPECT_FALSE(ResourceSegments::intersects({3, 4}, {0, 1}));
130aee34000SFrancesco Petrogalli EXPECT_FALSE(ResourceSegments::intersects({0, 3}, {3, 4}));
131aee34000SFrancesco Petrogalli EXPECT_FALSE(ResourceSegments::intersects({3, 4}, {0, 3}));
132aee34000SFrancesco Petrogalli
133aee34000SFrancesco Petrogalli // Share one boundary
134aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({5, 6}, {5, 10}));
135aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({5, 10}, {5, 6}));
136aee34000SFrancesco Petrogalli
137aee34000SFrancesco Petrogalli // full intersect
138aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({1, 2}, {0, 3}));
139aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({1, 2}, {0, 2}));
140aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({0, 3}, {1, 2}));
141aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({0, 2}, {1, 2}));
142aee34000SFrancesco Petrogalli
143aee34000SFrancesco Petrogalli // right intersect
144aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({2, 4}, {0, 3}));
145aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({0, 3}, {2, 4}));
146aee34000SFrancesco Petrogalli
147aee34000SFrancesco Petrogalli // left intersect
148aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({2, 4}, {3, 5}));
149aee34000SFrancesco Petrogalli EXPECT_TRUE(ResourceSegments::intersects({3, 5}, {2, 4}));
150aee34000SFrancesco Petrogalli }
151aee34000SFrancesco Petrogalli
152aee34000SFrancesco Petrogalli ////////////////////////////////////////////////////////////////////////////////
153aee34000SFrancesco Petrogalli // TOP-DOWN getFirstAvailableAt
TEST(ResourceSegments,getFirstAvailableAtFromTop_oneCycle)154aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromTop_oneCycle) {
155aee34000SFrancesco Petrogalli auto X = ResourceSegments({{2, 5}});
156aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7
157aee34000SFrancesco Petrogalli // Res X X X
158aee34000SFrancesco Petrogalli // ...X...
159aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(0, 0, 1), 0U);
160aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(1, 0, 1), 1U);
161aee34000SFrancesco Petrogalli // Skip to five when hitting cycle 2
162aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(2, 0, 1), 5U);
163aee34000SFrancesco Petrogalli }
164aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromTop_twoCycles)165aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromTop_twoCycles) {
166aee34000SFrancesco Petrogalli auto X = ResourceSegments({{4, 5}});
167aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7
168aee34000SFrancesco Petrogalli // Res X
169aee34000SFrancesco Petrogalli // ...X X....
170aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(0, 0, 2), 0U);
171aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(1, 0, 2), 1U);
172aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(2, 0, 2), 2U);
173aee34000SFrancesco Petrogalli // Skip to cycle 5
174aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(3, 0, 2), 5U);
175aee34000SFrancesco Petrogalli }
176aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromTop_twoCycles_Shifted)177aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromTop_twoCycles_Shifted) {
178aee34000SFrancesco Petrogalli auto X = ResourceSegments({{4, 5}});
179aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7
180aee34000SFrancesco Petrogalli // Res X
181aee34000SFrancesco Petrogalli // ...c X X...
182aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(0, 1, 3), 0U);
183aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(1, 1, 3), 1U);
184aee34000SFrancesco Petrogalli // Skip to cycle 4
185aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(2, 1, 3), 4U);
186aee34000SFrancesco Petrogalli // Stay con cycle 4
187aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7
188aee34000SFrancesco Petrogalli // Res X
189aee34000SFrancesco Petrogalli // ...c X X...
190aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(3, 1, 3), 4U);
191aee34000SFrancesco Petrogalli //
192aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(4, 1, 3), 4U);
193aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(5, 1, 3), 5U);
194aee34000SFrancesco Petrogalli }
195aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromTop_twoCycles_Shifted_withGap)196aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromTop_twoCycles_Shifted_withGap) {
197aee34000SFrancesco Petrogalli auto X = ResourceSegments({{4, 5}, {7, 9}});
198aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7 8 9
199aee34000SFrancesco Petrogalli // Res X X X
200aee34000SFrancesco Petrogalli // c X X
201aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(1, 1, 3), 1U);
202aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7 8 9
203aee34000SFrancesco Petrogalli // Res X X X
204aee34000SFrancesco Petrogalli // c X X --> moves to 4
205aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(2, 1, 3), 4U);
206aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7 8 9
207aee34000SFrancesco Petrogalli // Res X X X
208aee34000SFrancesco Petrogalli // c X X --> moves to 4
209aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(3, 1, 3), 4U);
210aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7 8 9
211aee34000SFrancesco Petrogalli // Res X X X
212aee34000SFrancesco Petrogalli // c X X --> stays on 4
213aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(4, 1, 3), 4U);
214aee34000SFrancesco Petrogalli // 0 1 2 3 4 5 6 7 8 9
215aee34000SFrancesco Petrogalli // Res X X X
216aee34000SFrancesco Petrogalli // c X X --> skips to 8
217aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(5, 1, 3), 8U);
218aee34000SFrancesco Petrogalli }
219aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromTop_basic)220aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromTop_basic) {
221aee34000SFrancesco Petrogalli auto X = ResourceSegments({{5, 10}, {30, 40}});
222aee34000SFrancesco Petrogalli
223aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(0, 3, 4), 0U);
224aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(1, 3, 4), 1U);
225aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(2, 3, 4), 7U);
226aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(3, 3, 4), 7U);
227aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(4, 3, 4), 7U);
228aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(5, 3, 4), 7U);
229aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(6, 3, 4), 7U);
230aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(7, 3, 4), 7U);
231aee34000SFrancesco Petrogalli // Check the empty range between the two intervals of X.
232aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(15, 3, 4), 15U);
233aee34000SFrancesco Petrogalli // Overlap the second interval.
234aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(28, 3, 4), 37U);
235aee34000SFrancesco Petrogalli }
236aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromTop_advanced)237aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromTop_advanced) {
238aee34000SFrancesco Petrogalli auto X = ResourceSegments({{3, 6}, {7, 9}, {11, 14}, {30, 33}});
239aee34000SFrancesco Petrogalli
240aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(2, 4, 5), 2U);
241aee34000SFrancesco Petrogalli
242aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(2, 3, 4), 3U);
243aee34000SFrancesco Petrogalli // Can schedule at 7U because the interval [14, 19[ does not
244aee34000SFrancesco Petrogalli // overlap any of the intervals in X.
245aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromTop(1, 7, 12), 7U);
246aee34000SFrancesco Petrogalli }
247aee34000SFrancesco Petrogalli
248aee34000SFrancesco Petrogalli ////////////////////////////////////////////////////////////////////////////////
249aee34000SFrancesco Petrogalli // BOTTOM-UP getFirstAvailableAt
TEST(ResourceSegments,getFirstAvailableAtFromBottom)250aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromBottom) {
251aee34000SFrancesco Petrogalli // Scheduling cycles move to the left...
252aee34000SFrancesco Petrogalli //
253aee34000SFrancesco Petrogalli // 41 40 39 ... 31 30 29 ... 21 20 19 ... 11 10 9 8 7 6 ... 1 0
254aee34000SFrancesco Petrogalli // Res X X X X X X X X
255aee34000SFrancesco Petrogalli // X X X X X X
256aee34000SFrancesco Petrogalli // Time (relative to instruction execution) 0 1 2 3 4 5
257aee34000SFrancesco Petrogalli auto X = ResourceSegments({{10, 20}, {30, 40}});
258aee34000SFrancesco Petrogalli // .. but time (instruction cycle) moves to the right. Therefore, it
259aee34000SFrancesco Petrogalli // is always possible to llocate a resource to the right of 0 if 0
260aee34000SFrancesco Petrogalli // is not taken, because the right side of the scheduling cycles is
261aee34000SFrancesco Petrogalli // empty.
262aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 1), 0U);
263aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 9), 0U);
264aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 10), 0U);
265aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 20), 0U);
266aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 21), 0U);
267aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 22), 0U);
268aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 29), 0U);
269aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 30), 0U);
270aee34000SFrancesco Petrogalli }
271aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromBottom_01)272aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromBottom_01) {
273aee34000SFrancesco Petrogalli auto X = ResourceSegments({{3, 7}});
274aee34000SFrancesco Petrogalli // 10 9 8 7 6 5 4 3 2 1 0
275aee34000SFrancesco Petrogalli // X X X X
276aee34000SFrancesco Petrogalli // ...X... <- one cycle resource placement
277aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 1), 0U);
278aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(1, 0, 1), 1U);
279aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(2, 0, 1), 2U);
280aee34000SFrancesco Petrogalli // Skip to 7
281aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(3, 0, 1), 7U);
282aee34000SFrancesco Petrogalli }
283aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromBottom_02)284aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromBottom_02) {
285aee34000SFrancesco Petrogalli auto X = ResourceSegments({{3, 7}});
286aee34000SFrancesco Petrogalli // 10 9 8 7 6 5 4 3 2 1 0
287aee34000SFrancesco Petrogalli // X X X X
288aee34000SFrancesco Petrogalli // ...X X... <- two cycles resource placement
289aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 2), 0U);
290aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(1, 0, 2), 1U);
291aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(2, 0, 2), 2U);
292aee34000SFrancesco Petrogalli // skip to 8
293aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(3, 0, 2), 8U);
294aee34000SFrancesco Petrogalli }
295aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromBottom_02_shifted)296aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromBottom_02_shifted) {
297aee34000SFrancesco Petrogalli auto X = ResourceSegments({{3, 7}});
298aee34000SFrancesco Petrogalli // 10 9 8 7 6 5 4 3 2 1 0
299aee34000SFrancesco Petrogalli // X X X X
300aee34000SFrancesco Petrogalli // c X X <- two cycles resource placement but shifted by 1
301aee34000SFrancesco Petrogalli // 0 1 2 <- cycles relative to the execution of the
302aee34000SFrancesco Petrogalli // instruction
303aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 1, 3), 0U);
304aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(1, 1, 3), 1U);
305aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(2, 1, 3), 2U);
306aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(3, 1, 3), 3U);
307aee34000SFrancesco Petrogalli // 10 9 8 7 6 5 4 3 2 1 0
308aee34000SFrancesco Petrogalli // X X X X
309aee34000SFrancesco Petrogalli // c X X -> skip to 9
310aee34000SFrancesco Petrogalli // 0 1 2
311aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(4, 1, 3), 9U);
312aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(5, 1, 3), 9U);
313aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(6, 1, 3), 9U);
314aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(7, 1, 3), 9U);
315aee34000SFrancesco Petrogalli // 10 9 8 7 6 5 4 3 2 1 0
316aee34000SFrancesco Petrogalli // X X X X
317aee34000SFrancesco Petrogalli // c X X <- skip to 9
318aee34000SFrancesco Petrogalli // 0 1 2
319aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(8, 1, 3), 9U);
320aee34000SFrancesco Petrogalli // 10 9 8 7 6 5 4 3 2 1 0
321aee34000SFrancesco Petrogalli // X X X X
322aee34000SFrancesco Petrogalli // c X X
323aee34000SFrancesco Petrogalli // 0 1 2
324aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(9, 1, 3), 9U);
325aee34000SFrancesco Petrogalli // 10 9 8 7 6 5 4 3 2 1 0
326aee34000SFrancesco Petrogalli // X X X X
327aee34000SFrancesco Petrogalli // c X X
328aee34000SFrancesco Petrogalli // 0 1 2
329aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(10, 1, 3), 10U);
330aee34000SFrancesco Petrogalli }
331aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromBottom_03)332aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromBottom_03) {
333aee34000SFrancesco Petrogalli auto X = ResourceSegments({{1, 2}, {3, 7}});
334aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
335aee34000SFrancesco Petrogalli // X X X X X
336aee34000SFrancesco Petrogalli // X
337aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 1), 0U);
338aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
339aee34000SFrancesco Petrogalli // X X X X X
340aee34000SFrancesco Petrogalli // X
341aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(1, 0, 1), 2U);
342aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
343aee34000SFrancesco Petrogalli // X X X X X
344aee34000SFrancesco Petrogalli // X
345aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(2, 0, 1), 2U);
346aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
347aee34000SFrancesco Petrogalli // X X X X X
348aee34000SFrancesco Petrogalli // X X X X X
349aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(2, 0, 5), 11U);
350aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(3, 0, 5), 11U);
351aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(5, 0, 5), 11U);
352aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(11, 0, 5), 11U);
353aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
354aee34000SFrancesco Petrogalli // X X X X X
355aee34000SFrancesco Petrogalli // X X X X X
356aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(12, 0, 5), 12U);
357aee34000SFrancesco Petrogalli }
358aee34000SFrancesco Petrogalli
TEST(ResourceSegments,getFirstAvailableAtFromBottom_03_shifted)359aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromBottom_03_shifted) {
360aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3
361aee34000SFrancesco Petrogalli // X X X X X X X X
362aee34000SFrancesco Petrogalli auto X = ResourceSegments({{-3, -1}, {1, 2}, {3, 7}, {9, 10}});
363aee34000SFrancesco Petrogalli
364aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 1, 2), 0U);
365aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 2), 0U);
366aee34000SFrancesco Petrogalli
367aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3
368aee34000SFrancesco Petrogalli // X X X X X X X X
369aee34000SFrancesco Petrogalli // X X X -> skip to cycle 12
370aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 3), 12U);
371aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3
372aee34000SFrancesco Petrogalli // X X X X X X X X
373aee34000SFrancesco Petrogalli // X X
374aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 1, 3), 1U);
375aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 1, 4), 13U);
376aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(12, 1, 4), 13U);
377aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3
378aee34000SFrancesco Petrogalli // X X X X X X X X
379aee34000SFrancesco Petrogalli // c X X X
380aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(13, 1, 4), 13U);
381aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3
382aee34000SFrancesco Petrogalli // X X X X X X X X
383aee34000SFrancesco Petrogalli // X X
384aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(1, 1, 3), 1U);
385aee34000SFrancesco Petrogalli // 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3
386aee34000SFrancesco Petrogalli // X X X X X X X X
387aee34000SFrancesco Petrogalli // C X X 0 -> skip to cycle 9
388aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(2, 1, 3), 9U);
389aee34000SFrancesco Petrogalli // 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3
390aee34000SFrancesco Petrogalli // X X X X X X X X
391aee34000SFrancesco Petrogalli // C C X X X X X -> skip to cycle 16
392aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(3, 2, 7), 16U);
393aee34000SFrancesco Petrogalli }
TEST(ResourceSegments,getFirstAvailableAtFromBottom_empty)394aee34000SFrancesco Petrogalli TEST(ResourceSegments, getFirstAvailableAtFromBottom_empty) {
395aee34000SFrancesco Petrogalli // Empty resource usage can accept schediling at any cycle
396aee34000SFrancesco Petrogalli auto X = ResourceSegments();
397aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(0, 0, 1), 0U);
398aee34000SFrancesco Petrogalli EXPECT_EQ(X.getFirstAvailableAtFromBottom(17, 1, 22), 17U);
399aee34000SFrancesco Petrogalli }
400