11 #include <catch2/catch.hpp>
18 MRRG makeMRRG_4nodeLinear_latency1() {
31 MRRG makeMRRG_2112DAG_latency1() {
47 MRRG makeMRRG_12221DAG_latency1() {
64 MRRG makeMRRG_13331DAG_latency0() {
87 MRRG makeMRRG_multiAdjacentFanin1() {
98 MRRG makeMRRG_multiAdjacentFanin2() {
114 int cycle,
const std::string& name,
115 const MRRG& old_mrrg,
118 const auto& old_ndesc = old_mrrg.
getNode(cycle, name);
120 CHECK(new_nodes.size() == 1);
121 return *new_nodes.begin();
126 SCENARIO(
"MRRG Reduction Tests",
"[mrrg-reduction]") {
127 GIVEN(
"a 4 node linear MRRG with latency on one node") {
128 const auto& old_mrrg = makeMRRG_4nodeLinear_latency1();
130 WHEN(
"losslessly reducing") {
134 THEN(
"Mapping should be as expcted") {
142 new_mrrg.getNode(0,
"3aaa")
144 CHECK(reduce_result.mapping == expected_mapping);
145 CHECK(new_mrrg.size() == 1);
147 AND_THEN(
"latency should be preserved") {
148 const auto& new_a_ndesc = getNewNodeAssumingSingleMapping(0,
"3aaa", old_mrrg, reduce_result);
149 CHECK(new_mrrg.getNodeRef(new_a_ndesc).latency == 1);
151 for (
int cycle = 0; cycle < new_mrrg.initiationInterval(); ++cycle) {
152 for (
auto& name_and_node : new_mrrg.allNodesByCycle().at(cycle)) {
153 if (name_and_node.second.get() != new_a_ndesc) {
154 CHECK(name_and_node.second->latency == 0);
160 AND_THEN(
"mapping to an opgraph node and transforming back to original mrrg should give back original nodes") {
162 Mapping mapping(
nullptr, 1,
nullptr);
163 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"3aaa"));
166 const auto& mapping_list = reversedMapping.getMappingList(&op);
167 const auto actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
168 const auto expected = std::set<MRRG::NodeDescriptor> {
175 CHECK(actual == expected);
181 GIVEN(
"a 2112DAG MRRG with latency on one node") {
182 const auto& old_mrrg = makeMRRG_2112DAG_latency1();
184 WHEN(
"losslessly reducing") {
188 THEN(
"Mapping should be as expcted") {
191 { old_mrrg.
getNode(0,
"3bbb"), old_mrrg.
getNode(0,
"2ccc") }, new_mrrg.getNode(0,
"3bbb")
193 expected_mapping.
addMapping(old_mrrg.
getNode(0,
"4aaa1"), new_mrrg.getNode(0,
"4aaa1"));
194 expected_mapping.
addMapping(old_mrrg.
getNode(0,
"4aaa2"), new_mrrg.getNode(0,
"4aaa2"));
195 expected_mapping.
addMapping(old_mrrg.
getNode(1,
"1ddd1"), new_mrrg.getNode(1,
"1ddd1"));
196 expected_mapping.
addMapping(old_mrrg.
getNode(1,
"0ddd2"), new_mrrg.getNode(1,
"0ddd2"));
198 CHECK(reduce_result.mapping == expected_mapping);
199 CHECK(new_mrrg.size() == 5);
201 AND_THEN(
"latency should be preserved") {
202 const auto& new_b_ndesc = getNewNodeAssumingSingleMapping(0,
"3bbb", old_mrrg, reduce_result);
203 CHECK(new_mrrg.getNodeRef(new_b_ndesc).latency == 1);
205 for (
int cycle = 0; cycle < new_mrrg.initiationInterval(); ++cycle) {
206 for (
auto& name_and_node : new_mrrg.allNodesByCycle().at(cycle)) {
207 if (name_and_node.second.get() != new_b_ndesc) {
208 CHECK(name_and_node.second->latency == 0);
214 AND_THEN(
"mapping to an opgraph node and transforming back to original mrrg should give back original nodes") {
218 Mapping mapping(
nullptr, 1,
nullptr);
219 mapping.
mapMRRGNode(&op1, new_mrrg.getNode(0,
"3bbb"));
220 mapping.
mapMRRGNode(&op1, new_mrrg.getNode(0,
"4aaa1"));
221 mapping.
mapMRRGNode(&op1, new_mrrg.getNode(0,
"4aaa2"));
222 mapping.
mapMRRGNode(&op2, new_mrrg.getNode(1,
"1ddd1"));
223 mapping.
mapMRRGNode(&op2, new_mrrg.getNode(1,
"0ddd2"));
227 auto mapping_list = reversedMapping.getMappingList(&op1);
228 auto actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
229 auto expected = std::set<MRRG::NodeDescriptor> {
235 CHECK(actual == expected);
237 mapping_list = reversedMapping.getMappingList(&op2);
238 actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
239 expected = std::set<MRRG::NodeDescriptor> {
244 CHECK(actual == expected);
250 GIVEN(
"a 12221DAG MRRG with latency on one node") {
251 const auto& old_mrrg = makeMRRG_12221DAG_latency1();
253 WHEN(
"losslessly reducing") {
257 THEN(
"Mapping should be as expcted") {
261 new_mrrg.getNode(0,
"2ccc1") );
264 new_mrrg.getNode(0,
"2ccc2") );
265 expected_mapping.
addMapping(old_mrrg.
getNode(0,
"3bbb"), new_mrrg.getNode(0,
"3bbb"));
266 expected_mapping.
addMapping(old_mrrg.
getNode(1,
"3fff"), new_mrrg.getNode(1,
"3fff"));
268 CHECK(reduce_result.mapping == expected_mapping);
269 CHECK(new_mrrg.size() == 4);
271 AND_THEN(
"latency should be preserved") {
272 const auto new_c1_ndesc = getNewNodeAssumingSingleMapping(0,
"2ccc1", old_mrrg, reduce_result);
273 CHECK(new_mrrg.getNodeRef(new_c1_ndesc).latency == 1);
274 const auto new_c2_ndesc = getNewNodeAssumingSingleMapping(0,
"2ccc2", old_mrrg, reduce_result);
275 CHECK(new_mrrg.getNodeRef(new_c2_ndesc).latency == 1);
277 for (
int cycle = 0; cycle < new_mrrg.initiationInterval(); ++cycle) {
278 for (
auto& name_and_node : new_mrrg.allNodesByCycle().at(cycle)) {
280 name_and_node.second.get() != new_c1_ndesc
281 && name_and_node.second.get() != new_c2_ndesc
283 CHECK(name_and_node.second->latency == 0);
289 AND_THEN(
"mapping all mrrg nodes to an opgraph node and transforming back to original mrrg should give back original nodes") {
295 Mapping mapping(
nullptr, 1,
nullptr);
296 mapping.
mapMRRGNode(&op1, new_mrrg.getNode(0,
"2ccc1"));
297 mapping.
mapMRRGNode(&op2, new_mrrg.getNode(0,
"2ccc2"));
298 mapping.
mapMRRGNode(&op3, new_mrrg.getNode(0,
"3bbb"));
299 mapping.
mapMRRGNode(&op4, new_mrrg.getNode(1,
"3fff"));
303 auto mapping_list = reversedMapping.getMappingList(&op1);
304 auto actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
305 auto expected = std::set<MRRG::NodeDescriptor> {
310 CHECK(actual == expected);
312 mapping_list = reversedMapping.getMappingList(&op2);
313 actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
314 expected = std::set<MRRG::NodeDescriptor> {
319 CHECK(actual == expected);
321 mapping_list = reversedMapping.getMappingList(&op3);
322 actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
323 expected = std::set<MRRG::NodeDescriptor> {
326 CHECK(actual == expected);
328 mapping_list = reversedMapping.getMappingList(&op4);
329 actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
330 expected = std::set<MRRG::NodeDescriptor> {
333 CHECK(actual == expected);
339 GIVEN(
"a 13331DAG MRRG with 0 latency") {
340 const auto& old_mrrg = makeMRRG_13331DAG_latency0();
342 WHEN(
"losslessly reducing") {
345 THEN(
"Mapping should be as expected") {
346 CHECK(new_mrrg.size() == 5);
351 new_mrrg.getNode(0,
"2ccc1") );
354 new_mrrg.getNode(0,
"2ccc2") );
357 new_mrrg.getNode(0,
"2ccc3") );
358 expected_mapping.
addMapping(old_mrrg.
getNode(0,
"3bbb"), new_mrrg.getNode(0,
"3bbb"));
359 expected_mapping.
addMapping(old_mrrg.
getNode(0,
"3fff"), new_mrrg.getNode(0,
"3fff"));
361 CHECK(reduce_result.mapping == expected_mapping);
363 AND_THEN(
"mapping some mrrg nodes to opgraph nodes and transforming back to original mrrg should give back original nodes") {
369 Mapping mapping(
nullptr, 1,
nullptr);
370 mapping.
mapMRRGNode(&op1, new_mrrg.getNode(0,
"3bbb"));
371 mapping.
mapMRRGNode(&op2, new_mrrg.getNode(0,
"2ccc2"));
372 mapping.
mapMRRGNode(&op3, new_mrrg.getNode(0,
"2ccc3"));
373 mapping.
mapMRRGNode(&op4, new_mrrg.getNode(0,
"3fff"));
377 bool found1_1 =
false, found1_2 =
false, found1_3 =
false;
378 for (
auto mrrgNode : reversedMapping.getMappingList(&op2)) {
379 if (mrrgNode->getFullName() ==
"0:2ccc2") {
382 else if (mrrgNode->getFullName() ==
"0:0ddd2") {
385 else if (mrrgNode->getFullName() ==
"0:0eee2") {
391 for (
auto op : reversedMapping.getMapping()) {
392 size += op.second.size();
395 CHECK(reversedMapping.getMappingList(&op1).size() == 1);
396 CHECK(reversedMapping.getMappingList(&op2).size() == 3);
397 CHECK(reversedMapping.getMappingList(&op3).size() == 3);
398 CHECK(reversedMapping.getMappingList(&op4).size() == 1);
411 SCENARIO(
"Mux Exclusivity Insertion",
"[mrrg-reduction2]") {
412 GIVEN(
"a MRRG with one pair of adjacent multi fanin nodes") {
413 const auto & old_mrrg = makeMRRG_multiAdjacentFanin1();
415 WHEN(
"adding new nodes to satisfy mux ex constraint") {
417 const auto& new_mrrg = muxExInsResult.transformed_mrrg;
419 CHECK(new_mrrg.size() == 5);
420 bool linkedCorrectly =
false;
422 for (
auto & fanout : new_mrrg.getNode(0,
"a2")->fanout) {
423 if (fanout->getFullName() ==
"0:mux_ex_insert_0") {
424 if (fanout->fanout[0]->getFullName() ==
"0:b1") {
425 linkedCorrectly =
true;
430 CHECK(linkedCorrectly);
432 THEN (
"mapping to an opgraph node and transforming back to original mrrg should give back original nodes") {
435 Mapping mapping(
nullptr, 1,
nullptr);
436 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"a1"));
437 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"a2"));
438 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"b1"));
439 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"c1"));
440 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"mux_ex_insert_0"));
444 auto mapping_list = reversedMapping.getMappingList(&op);
445 auto actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
446 auto expected = std::set<MRRG::NodeDescriptor> {
452 CHECK(actual == expected);
457 GIVEN(
"a MRRG with a series of adjacent multi fanin nodes") {
458 const auto & old_mrrg = makeMRRG_multiAdjacentFanin2();
460 WHEN(
"adding new nodes to satisfy mux ex constraint") {
462 const auto& new_mrrg = muxExInsResult.transformed_mrrg;
464 CHECK(new_mrrg.size() == 10);
466 THEN (
"mapping to an opgraph node and transforming back to original mrrg should give back original nodes") {
469 Mapping mapping(
nullptr, 1,
nullptr);
470 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"a1"));
471 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"a2"));
472 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"b1"));
473 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"b2"));
474 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"b3"));
475 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"c1"));
476 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"c2"));
477 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"mux_ex_insert_0"));
478 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"mux_ex_insert_1"));
479 mapping.
mapMRRGNode(&op, new_mrrg.getNode(0,
"mux_ex_insert_2"));
483 auto mapping_list = reversedMapping.getMappingList(&op);
484 auto actual = std::set<MRRG::NodeDescriptor>(mapping_list.begin(), mapping_list.end());
485 auto expected = std::set<MRRG::NodeDescriptor> {
494 CHECK(actual == expected);