00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <boost/test/unit_test.hpp>
00020 #include "torc/physical/ModuleTransformer.hpp"
00021 #include "torc/physical/XdlImporter.hpp"
00022 #include "torc/physical/XdlExporter.hpp"
00023 #include "torc/common/DirectoryTree.hpp"
00024 #include "torc/physical/Factory.hpp"
00025 #include "torc/physical/Design.hpp"
00026 #include <fstream>
00027
00028 namespace torc {
00029 namespace physical {
00030
00031 BOOST_AUTO_TEST_SUITE(physical)
00032
00033 BOOST_AUTO_TEST_SUITE(moduletransformer)
00034
00035 static const string sInstanceOneName = "c1";
00036 static const string sInstanceTwoName = "c2";
00037 static const string sModuleDefinition = "aModule";
00038 static const string sModuleInstanceName = "aModuleInstance";
00039 static const string sHierarchySeparator = "/";
00040
00041 DesignSharedPtr verifyDesignOpenedSuccessfully(const string & inDesignFileName);
00042 InstanceSharedPtrVector getInstancesToModularize(DesignSharedPtr inDesignPtr);
00043 void preModularizationVerifications(DesignSharedPtr inDesignPtr);
00044 void postModularizationVerifications(DesignSharedPtr inDesignPtr,
00045 InstanceSharedPtrVector inInstanceVector, bool inKeepPlacement = false,
00046 bool inKeepRouting = false);
00047 void preFlatteningVerifications(DesignSharedPtr inDesignPtr);
00048 void postFlatteningVerifications(DesignSharedPtr inDesignPtr, bool inKeepPlacement = false,
00049 bool inKeepRouting = false);
00050
00051
00052
00053 DesignSharedPtr verifyDesignOpenedSuccessfully(const string & inDesignFileName) {
00054
00055 DesignSharedPtr designPtr;
00056
00057 boost::filesystem::path physicalPath =
00058 torc::common::DirectoryTree::getExecutablePath() / "torc" / "physical";
00059
00060 boost::filesystem::path originalPath = physicalPath / inDesignFileName;
00061
00062 std::fstream fileStream(originalPath.string().c_str());
00063
00064 BOOST_REQUIRE(fileStream.good());
00065
00066 XdlImporter importer;
00067 importer(fileStream, originalPath.string());
00068
00069 designPtr = importer.getDesignPtr();
00070
00071 BOOST_REQUIRE(designPtr.get() != 0);
00072 return designPtr;
00073 }
00074
00075
00076
00077 InstanceSharedPtrVector getInstancesToModularize(DesignSharedPtr inDesignPtr) {
00078
00079 InstanceSharedPtrVector instPtrVector;
00080
00081 Design::InstanceSharedPtrIterator instIter = inDesignPtr->findInstance(sInstanceOneName);
00082
00083 BOOST_REQUIRE(instIter != inDesignPtr->instancesEnd());
00084
00085 instPtrVector.push_back(*instIter);
00086
00087 instIter = inDesignPtr->findInstance(sInstanceTwoName);
00088
00089 BOOST_REQUIRE(instIter != inDesignPtr->instancesEnd());
00090 instPtrVector.push_back(*instIter);
00091
00092 return instPtrVector;
00093 }
00094
00095
00096
00097
00098
00099
00100 void preModularizationVerifications(DesignSharedPtr inDesignPtr) {
00101
00102 Design::ModuleSharedPtrIterator modIter = inDesignPtr->findModule(sModuleDefinition);
00103
00104 BOOST_REQUIRE(modIter == inDesignPtr->modulesEnd());
00105
00106 Design::InstanceSharedPtrIterator instIter = inDesignPtr->findInstance(sModuleInstanceName);
00107
00108 BOOST_REQUIRE(instIter == inDesignPtr->instancesEnd());
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 void postModularizationVerifications(DesignSharedPtr inDesignPtr,
00125 InstanceSharedPtrVector inInstanceVector, bool inKeepPlacement, bool inKeepRouting) {
00126
00127
00128 Design::ModuleSharedPtrIterator modIter = inDesignPtr->findModule(sModuleDefinition);
00129
00130 BOOST_REQUIRE(modIter != inDesignPtr->modulesEnd());
00131
00132 Design::InstanceSharedPtrIterator instIter = inDesignPtr->findInstance(sModuleInstanceName);
00133
00134 BOOST_REQUIRE(instIter != inDesignPtr->instancesEnd());
00135
00136 ModuleSharedPtr modPtr = *modIter;
00137
00138 InstanceSharedPtr instPtr = *instIter;
00139
00140 if(!inKeepPlacement) {
00141
00142 BOOST_REQUIRE_EQUAL(instPtr->getTile().compare(""), 0);
00143 BOOST_REQUIRE_EQUAL(instPtr->getSite().compare(""), 0);
00144 }
00145
00146
00147
00148
00149 Design::InstanceSharedPtrConstIterator inInstanceVectorBegin = inInstanceVector.begin();
00150
00151 Design::InstanceSharedPtrConstIterator inInstanceVectorEnd = inInstanceVector.end();
00152
00153 while(inInstanceVectorBegin != inInstanceVectorEnd) {
00154
00155 InstanceSharedPtr instPtr = *inInstanceVectorBegin;
00156
00157 instIter = inDesignPtr->findInstance(instPtr->getName());
00158
00159 BOOST_REQUIRE(instIter == inDesignPtr->instancesEnd());
00160
00161 instIter = modPtr->findInstance(instPtr->getName());
00162
00163 BOOST_REQUIRE(instIter != modPtr->instancesEnd());
00164
00165 InstanceSharedPtr modInstPtr = *instIter;
00166
00167 if(!inKeepPlacement) {
00168
00169 BOOST_REQUIRE_EQUAL(modInstPtr->getTile().compare(""), 0);
00170 BOOST_REQUIRE_EQUAL(modInstPtr->getSite().compare(""), 0);
00171 }
00172
00173 inInstanceVectorBegin++;
00174 }
00175
00176
00177
00178
00179 Design::NetSharedPtrIterator moduleNetsBegin = modPtr->netsBegin();
00180
00181 Design::NetSharedPtrIterator moduleNetsEnd = modPtr->netsEnd();
00182
00183 while(moduleNetsBegin != moduleNetsEnd) {
00184
00185 NetSharedPtr moduleNetPtr = *moduleNetsBegin;
00186
00187 if(!inKeepRouting) {
00188 BOOST_REQUIRE(moduleNetPtr->pipsBegin() == moduleNetPtr->pipsEnd());
00189 }
00190
00191 Design::NetSharedPtrIterator designNetItr = inDesignPtr->findNet(moduleNetPtr->getName());
00192
00193 BOOST_REQUIRE(designNetItr == inDesignPtr->netsEnd());
00194
00195 moduleNetsBegin++;
00196 }
00197
00198
00199
00200
00201 u_int32_t portCount = 0;
00202
00203 instIter = inDesignPtr->findInstance(sModuleInstanceName);
00204
00205 instPtr = *instIter;
00206
00207 Design::NetSharedPtrIterator designNetsBegin = inDesignPtr->netsBegin();
00208
00209 Design::NetSharedPtrIterator designNetsEnd = inDesignPtr->netsEnd();
00210
00211 while(designNetsBegin != designNetsEnd) {
00212
00213 NetSharedPtr designNetPtr = *designNetsBegin;
00214
00215 Net::InstancePinSharedPtrIterator designNetSourcesBegin = designNetPtr->sourcesBegin();
00216
00217 Net::InstancePinSharedPtrIterator designNetSourcesEnd = designNetPtr->sourcesEnd();
00218
00219 while(designNetSourcesBegin != designNetSourcesEnd) {
00220
00221 InstancePinSharedPtr instPinPtr = *designNetSourcesBegin;
00222
00223 InstanceSharedPtr pinInstPtr = instPinPtr->getInstancePtr().lock();
00224
00225 if(pinInstPtr == instPtr) {
00226
00227 if(!inKeepRouting) {
00228 BOOST_REQUIRE(designNetPtr->pipsBegin() == designNetPtr->pipsEnd());
00229 }
00230 portCount++;
00231 }
00232
00233 designNetSourcesBegin++;
00234 }
00235
00236 Net::InstancePinSharedPtrIterator designNetSinksBegin = designNetPtr->sinksBegin();
00237
00238 Net::InstancePinSharedPtrIterator designNetSinksEnd = designNetPtr->sinksEnd();
00239
00240 while(designNetSinksBegin != designNetSinksEnd) {
00241
00242 InstancePinSharedPtr instPinPtr = *designNetSinksBegin;
00243
00244 InstanceSharedPtr pinInstPtr = instPinPtr->getInstancePtr().lock();
00245
00246 if(pinInstPtr == instPtr) {
00247
00248 if(!inKeepRouting) {
00249 BOOST_REQUIRE(designNetPtr->pipsBegin() == designNetPtr->pipsEnd());
00250 }
00251 portCount++;
00252 }
00253
00254 designNetSinksBegin++;
00255 }
00256
00257 designNetsBegin++;
00258 }
00259
00260
00261 BOOST_REQUIRE_EQUAL(modPtr->getPortCount(), portCount);
00262
00263 }
00264
00265
00266
00267
00268
00269
00270 void preFlatteningVerifications(DesignSharedPtr inDesignPtr) {
00271
00272 Design::ModuleSharedPtrIterator modIter = inDesignPtr->findModule(sModuleDefinition);
00273
00274 BOOST_REQUIRE(modIter != inDesignPtr->modulesEnd());
00275
00276 Design::InstanceSharedPtrIterator instIter = inDesignPtr->findInstance(sModuleInstanceName);
00277
00278 BOOST_REQUIRE(instIter != inDesignPtr->instancesEnd());
00279 }
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 void postFlatteningVerifications(DesignSharedPtr inDesignPtr, bool inKeepPlacement,
00292 bool inKeepRouting) {
00293
00294
00295 Design::ModuleSharedPtrIterator modIter = inDesignPtr->findModule(sModuleDefinition);
00296
00297 BOOST_REQUIRE(modIter != inDesignPtr->modulesEnd());
00298
00299 Design::InstanceSharedPtrIterator designInstIter
00300 = inDesignPtr->findInstance(sModuleInstanceName);
00301
00302 BOOST_REQUIRE(designInstIter == inDesignPtr->instancesEnd());
00303
00304
00305
00306
00307 ModuleSharedPtr modPtr = *modIter;
00308
00309 Design::InstanceSharedPtrConstIterator modInstancesBegin = modPtr->instancesBegin();
00310
00311 Design::InstanceSharedPtrConstIterator modInstancesEnd = modPtr->instancesEnd();
00312
00313 while(modInstancesBegin != modInstancesEnd) {
00314
00315 InstanceSharedPtr modInstPtr = *modInstancesBegin;
00316
00317 designInstIter = inDesignPtr->findInstance(sModuleInstanceName +
00318 sHierarchySeparator + modInstPtr->getName());
00319
00320 BOOST_REQUIRE(designInstIter != inDesignPtr->instancesEnd());
00321
00322 if(!inKeepPlacement) {
00323
00324 InstanceSharedPtr instPtr = *designInstIter;
00325
00326 BOOST_REQUIRE_EQUAL(instPtr->getTile().compare(""), 0);
00327 BOOST_REQUIRE_EQUAL(instPtr->getSite().compare(""), 0);
00328 }
00329
00330 modInstancesBegin++;
00331 }
00332
00333
00334
00335
00336 Design::NetSharedPtrIterator moduleNetsBegin = modPtr->netsBegin();
00337
00338 Design::NetSharedPtrIterator moduleNetsEnd = modPtr->netsEnd();
00339
00340 while(moduleNetsBegin != moduleNetsEnd) {
00341
00342 NetSharedPtr moduleNetPtr = *moduleNetsBegin;
00343
00344 Design::NetSharedPtrIterator designNetIter = inDesignPtr->findNet(sModuleInstanceName +
00345 sHierarchySeparator + moduleNetPtr->getName());
00346
00347 BOOST_REQUIRE(designNetIter != inDesignPtr->netsEnd());
00348
00349 NetSharedPtr designNetPtr = *designNetIter;
00350
00351 if(!inKeepRouting) {
00352 BOOST_REQUIRE(designNetPtr->pipsBegin() == designNetPtr->pipsEnd());
00353 }
00354
00355 moduleNetsBegin++;
00356 }
00357
00358
00359
00360
00361 Design::NetSharedPtrIterator designNetsBegin = inDesignPtr->netsBegin();
00362
00363 Design::NetSharedPtrIterator designNetsEnd = inDesignPtr->netsEnd();
00364
00365 while(designNetsBegin != designNetsEnd) {
00366
00367 NetSharedPtr designNetPtr = *designNetsBegin;
00368
00369 Net::InstancePinSharedPtrIterator designNetSourcesBegin = designNetPtr->sourcesBegin();
00370
00371 Net::InstancePinSharedPtrIterator designNetSourcesEnd = designNetPtr->sourcesEnd();
00372
00373 while(designNetSourcesBegin != designNetSourcesEnd) {
00374
00375 InstancePinSharedPtr instPinPtr = *designNetSourcesBegin;
00376
00377 InstanceSharedPtr pinInstPtr = instPinPtr->getInstancePtr().lock();
00378
00379 BOOST_REQUIRE_NE(pinInstPtr->getName().compare(sModuleInstanceName), 0);
00380
00381
00382 if((pinInstPtr->getName()).find(sModuleInstanceName + sHierarchySeparator)
00383 != string::npos) {
00384
00385 if(!inKeepRouting) {
00386 BOOST_REQUIRE(designNetPtr->pipsBegin() == designNetPtr->pipsEnd());
00387 }
00388 }
00389
00390 designNetSourcesBegin++;
00391 }
00392
00393 Net::InstancePinSharedPtrIterator designNetSinksBegin = designNetPtr->sinksBegin();
00394
00395 Net::InstancePinSharedPtrIterator designNetSinksEnd = designNetPtr->sinksEnd();
00396
00397 while(designNetSinksBegin != designNetSinksEnd) {
00398
00399 InstancePinSharedPtr instPinPtr = *designNetSinksBegin;
00400
00401 InstanceSharedPtr pinInstPtr = instPinPtr->getInstancePtr().lock();
00402
00403 BOOST_REQUIRE_NE(pinInstPtr->getName().compare(sModuleInstanceName), 0);
00404
00405 if((pinInstPtr->getName()).find(sModuleInstanceName + sHierarchySeparator)
00406 != string::npos) {
00407
00408 if(!inKeepRouting) {
00409 BOOST_REQUIRE(designNetPtr->pipsBegin() == designNetPtr->pipsEnd());
00410 }
00411 }
00412
00413 designNetSinksBegin++;
00414 }
00415
00416 designNetsBegin++;
00417 }
00418
00419 }
00420
00421
00422 BOOST_AUTO_TEST_CASE(ModularizeWithIntraNetUnitTest) {
00423
00424 DesignSharedPtr designPtr
00425 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.01.Modularize.xdl");
00426
00427 InstanceSharedPtrVector instPtrVector = getInstancesToModularize(designPtr);
00428
00429 preModularizationVerifications(designPtr);
00430
00431 ModuleTransformer moduleTransfomer(designPtr);
00432
00433 moduleTransfomer.modularize(instPtrVector, sModuleDefinition, sModuleInstanceName);
00434
00435 postModularizationVerifications(designPtr, instPtrVector);
00436 }
00437
00438
00439 BOOST_AUTO_TEST_CASE(ModularizeWithInputInterNetUnitTest) {
00440
00441 DesignSharedPtr designPtr
00442 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.02.Modularize.xdl");
00443
00444 InstanceSharedPtrVector instPtrVector = getInstancesToModularize(designPtr);
00445
00446 preModularizationVerifications(designPtr);
00447
00448 ModuleTransformer moduleTransfomer(designPtr);
00449
00450 moduleTransfomer.modularize(instPtrVector, sModuleDefinition, sModuleInstanceName);
00451
00452 postModularizationVerifications(designPtr, instPtrVector);
00453 }
00454
00455
00456 BOOST_AUTO_TEST_CASE(ModularizeWithInputFanoutInterNetUnitTest) {
00457
00458 DesignSharedPtr designPtr
00459 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.03.Modularize.xdl");
00460
00461 InstanceSharedPtrVector instPtrVector = getInstancesToModularize(designPtr);
00462
00463 preModularizationVerifications(designPtr);
00464
00465 ModuleTransformer moduleTransfomer(designPtr);
00466
00467 moduleTransfomer.modularize(instPtrVector, sModuleDefinition, sModuleInstanceName);
00468
00469 postModularizationVerifications(designPtr, instPtrVector);
00470 }
00471
00472
00473 BOOST_AUTO_TEST_CASE(ModularizeWithOutputInterNetUnitTest) {
00474
00475 DesignSharedPtr designPtr
00476 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.04.Modularize.xdl");
00477
00478 InstanceSharedPtrVector instPtrVector = getInstancesToModularize(designPtr);
00479
00480 preModularizationVerifications(designPtr);
00481
00482 ModuleTransformer moduleTransfomer(designPtr);
00483
00484 moduleTransfomer.modularize(instPtrVector, sModuleDefinition, sModuleInstanceName);
00485
00486 postModularizationVerifications(designPtr, instPtrVector);
00487 }
00488
00489
00490 BOOST_AUTO_TEST_CASE(ModularizeWithOutputFanoutInterNetUnitTest) {
00491
00492 DesignSharedPtr designPtr
00493 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.05.Modularize.xdl");
00494
00495 InstanceSharedPtrVector instPtrVector = getInstancesToModularize(designPtr);
00496
00497 preModularizationVerifications(designPtr);
00498
00499 ModuleTransformer moduleTransfomer(designPtr);
00500
00501 moduleTransfomer.modularize(instPtrVector, sModuleDefinition, sModuleInstanceName);
00502
00503 postModularizationVerifications(designPtr, instPtrVector);
00504 }
00505
00506
00507 BOOST_AUTO_TEST_CASE(ModularizeWithIntraAndInterNetUnitTest) {
00508
00509 DesignSharedPtr designPtr
00510 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.06.Modularize.xdl");
00511
00512 InstanceSharedPtrVector instPtrVector = getInstancesToModularize(designPtr);
00513
00514 preModularizationVerifications(designPtr);
00515
00516 ModuleTransformer moduleTransfomer(designPtr);
00517
00518 moduleTransfomer.modularize(instPtrVector, sModuleDefinition, sModuleInstanceName);
00519
00520 postModularizationVerifications(designPtr, instPtrVector);
00521 }
00522
00523
00524
00525
00526 BOOST_AUTO_TEST_CASE(FlattenWithIntraNetUnitTest) {
00527
00528 DesignSharedPtr designPtr
00529 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.01.Flatten.xdl");
00530
00531 preFlatteningVerifications(designPtr);
00532
00533 ModuleTransformer moduleTransfomer(designPtr);
00534
00535 moduleTransfomer.flatten(sModuleInstanceName);
00536
00537 postFlatteningVerifications(designPtr);
00538 }
00539
00540
00541 BOOST_AUTO_TEST_CASE(FlattenWithInputInterNetUnitTest) {
00542
00543 DesignSharedPtr designPtr
00544 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.02.Flatten.xdl");
00545
00546 preFlatteningVerifications(designPtr);
00547
00548 ModuleTransformer moduleTransfomer(designPtr);
00549
00550 moduleTransfomer.flatten(sModuleInstanceName);
00551
00552 postFlatteningVerifications(designPtr);
00553 }
00554
00555
00556 BOOST_AUTO_TEST_CASE(FlattenWithInputFanoutInterNetUnitTest) {
00557
00558 DesignSharedPtr designPtr
00559 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.03.Flatten.xdl");
00560
00561 preFlatteningVerifications(designPtr);
00562
00563 ModuleTransformer moduleTransfomer(designPtr);
00564
00565 moduleTransfomer.flatten(sModuleInstanceName);
00566
00567 postFlatteningVerifications(designPtr);
00568 }
00569
00570
00571 BOOST_AUTO_TEST_CASE(FlattenWithOutputInterNetUnitTest) {
00572
00573 DesignSharedPtr designPtr
00574 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.04.Flatten.xdl");
00575
00576 preFlatteningVerifications(designPtr);
00577
00578 ModuleTransformer moduleTransfomer(designPtr);
00579
00580 moduleTransfomer.flatten(sModuleInstanceName);
00581
00582 postFlatteningVerifications(designPtr);
00583 }
00584
00585
00586 BOOST_AUTO_TEST_CASE(FlattenWithOutputFanoutInterNetUnitTest) {
00587
00588 DesignSharedPtr designPtr
00589 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.05.Flatten.xdl");
00590
00591 preFlatteningVerifications(designPtr);
00592
00593 ModuleTransformer moduleTransfomer(designPtr);
00594
00595 moduleTransfomer.flatten(sModuleInstanceName);
00596
00597 postFlatteningVerifications(designPtr);
00598 }
00599
00600
00601 BOOST_AUTO_TEST_CASE(FlattenWithIntraAndInterNetUnitTest) {
00602
00603 DesignSharedPtr designPtr
00604 = verifyDesignOpenedSuccessfully("ModuleTransformerUnitTest.Scenario.06.Flatten.xdl");
00605
00606 preFlatteningVerifications(designPtr);
00607
00608 ModuleTransformer moduleTransfomer(designPtr);
00609
00610 moduleTransfomer.flatten(sModuleInstanceName);
00611
00612 postFlatteningVerifications(designPtr);
00613 }
00614
00615
00616
00617 BOOST_AUTO_TEST_SUITE_END()
00618
00619 BOOST_AUTO_TEST_SUITE_END()
00620
00621 }
00622 }