#include <Annealer.h>
Inheritance diagram for parquetfp::Annealer:
Public Types | |
enum | MOVE_TYPES { MISC = -1, NOOP = 0, REP_SPEC_MIN = 1, REP_SPEC_ORIENT = 2, REP_SPEC_MAX = 5, SLACKS_MOVE = 6, AR_MOVE = 7, ORIENT = 10, SOFT_BL = 11, HPWL = 12, ARWL = 13 } |
Public Member Functions | |
Annealer (const Command_Line *const params, DB *const db) | |
virtual | ~Annealer () |
void | parseConfig () |
virtual bool | go () |
void | anneal () |
virtual bool | packOneBlock () |
virtual void | compactSoln () |
virtual void | takePlfromDB () |
void | takeSPfromDB () |
void | eval () |
void | evalSlacks () |
void | evalCompact (bool whichDir) |
void | makeIslands (SetOfVoltages *islandSet, vector< unsigned > &tempX, vector< unsigned > &tempY) |
int | makeMove (vector< unsigned > &tempX, vector< unsigned > &tempY) |
int | makeMoveSlacks (vector< unsigned > &tempX, vector< unsigned > &tempY) |
int | makeMoveSlacksOrient (vector< unsigned > &A, vector< unsigned > &B, unsigned &index, parquetfp::ORIENT &oldOrient, parquetfp::ORIENT &newOrient) |
int | makeMoveOrient (unsigned &index, parquetfp::ORIENT &oldOrient, parquetfp::ORIENT &newOrient) |
int | makeARMove (vector< unsigned > &A, vector< unsigned > &B, double currAR) |
int | makeSoftBlMove (const vector< unsigned > &A, const vector< unsigned > &B, unsigned &index, double &newWidth, double &newHeight) |
int | makeIndexSoftBlMove (const vector< unsigned > &A, const vector< unsigned > &B, unsigned index, double &newWidth, double &newHeight) |
int | makeHPWLMove (vector< unsigned > &tempX, vector< unsigned > &tempY) |
int | makeARWLMove (vector< unsigned > &tempX, vector< unsigned > &tempY, double currAR) |
void | sortSlacks (vector< Point > &sortedXSlacks, vector< Point > &sortedYSlacks) |
double | getXSize () |
double | getYSize () |
int | packSoftBlocks (unsigned numIter) |
void | updatePlacement () |
virtual void | solveQP () |
void | postHPWLOpt () |
void | printResults (const Timer &tm, const SolutionInfo &curr) const |
Public Attributes | |
double | annealTime |
Static Public Attributes | |
const int | UNINITIALIZED = -1 |
const unsigned int | UNSIGNED_UNINITIALIZED = 0 |
const int | FREE_OUTLINE = -9999 |
const int | NOT_FOUND = -1 |
Protected Member Functions | |
Annealer () | |
Protected Attributes | |
SeqPair *const | _sp |
SPeval *const | _spEval |
vector< Point > | sortedXSlacks |
vector< Point > | sortedYSlacks |
parquetfp::DB *const | _db |
const parquetfp::Command_Line *const | _params |
parquetfp::AnalytSolve *const | _analSolve |
char | _baseFileName [200] |
|
Definition at line 72 of file baseannealer.h.
00072 {MISC = -1, 00073 NOOP = 0, 00074 REP_SPEC_MIN = 1, // representation-specific 00075 REP_SPEC_ORIENT = 2, 00076 REP_SPEC_MAX = 5, 00077 SLACKS_MOVE = 6, 00078 AR_MOVE = 7, 00079 ORIENT = 10, 00080 SOFT_BL = 11, 00081 HPWL = 12, 00082 ARWL = 13}; |
|
Definition at line 75 of file Annealer.h.
00076 : BaseAnnealer(), _sp(NULL), _spEval(NULL) {} |
|
Definition at line 57 of file Annealer.cxx.
|
|
Definition at line 66 of file Annealer.cxx.
|
|
Definition at line 185 of file Annealer.cxx. References BaseAnnealer::_db, BaseAnnealer::_params, _sp, _spEval, parquetfp::Command_Line::areaWeight, parquetfp::Command_Line::budgetTime, parquetfp::SPeval::changeNodeHeight(), parquetfp::SPeval::changeNodeWidth(), parquetfp::Nodes::changeOrient(), parquetfp::SPeval::changeOrient(), SetOfVoltages::clearIslandNodes(), parquetfp::Command_Line::dontClusterMacros, parquetfp::DB::evalHPWL(), parquetfp::SPeval::evaluate(), Verbosity::forActions, Verbosity::forMajStats, parquetfp::DB::getNets(), parquetfp::Nodes::getNodeHeight(), parquetfp::DB::getNodes(), parquetfp::DB::getNodesArea(), parquetfp::Nodes::getNodeWidth(), parquetfp::DB::getNumNodes(), Timer::getUserTime(), parquetfp::SeqPair::getX(), parquetfp::DB::getXSizeWMacroOnly(), parquetfp::SeqPair::getY(), parquetfp::DB::getYSizeWMacroOnly(), parquetfp::itNode, makeARMove(), makeARWLMove(), makeHPWLMove(), makeIslands(), makeMove(), makeMoveOrient(), makeMoveSlacks(), makeMoveSlacksOrient(), makeSoftBlMove(), SetOfVoltages::maxIslandNodes(), parquetfp::Command_Line::maxWS, parquetfp::Command_Line::minWL, parquetfp::N, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), SetOfVoltages::numCurrentGroups, SetOfVoltages::numIslandInGroup(), SetOfVoltages::numIslandNodes(), packSoftBlocks(), std::power(), SetOfVoltages::printIslands(), parquetfp::SeqPair::printX(), parquetfp::SeqPair::printY(), parquetfp::Nodes::putNodeHeight(), parquetfp::Nodes::putNodeWidth(), parquetfp::SeqPair::putX(), parquetfp::SeqPair::putY(), parquetfp::Command_Line::reqdAR, parquetfp::Command_Line::seconds, parquetfp::Command_Line::softBlocks, parquetfp::Command_Line::solveTop, Timer::start(), parquetfp::Command_Line::startTime, Timer::stop(), parquetfp::Command_Line::timeCool, parquetfp::Command_Line::timeInit, parquetfp::DB::updatePlacement(), parquetfp::Command_Line::verb, SetOfVoltages::voltageInGroup(), parquetfp::Command_Line::wireWeight, parquetfp::Point::x, parquetfp::SPeval::xloc, parquetfp::SPeval::xSize, parquetfp::Point::y, parquetfp::SPeval::yloc, and parquetfp::SPeval::ySize. Referenced by go().
00186 { 00187 bool budgetTime = _params->budgetTime; 00188 double seconds = _params->seconds; 00189 00190 vector<unsigned> tempX, tempY; 00191 vector<unsigned> vddX, vddY; 00192 00193 bool minWL = _params->minWL; 00194 double wireWeight = _params->wireWeight; 00195 double areaWeight = _params->areaWeight; 00196 double ARWeight = 1 - areaWeight - wireWeight; 00197 if(ARWeight < 0) 00198 ARWeight = 0; 00199 00200 double tempArea = 0; 00201 double tempHeight = 0; 00202 double tempWidth = 0; 00203 double tempAR=0; 00204 double bestHPWL = 1e100; 00205 double bestArea = 1e100; 00206 double currArea = 1e100; 00207 double deltaArea = 0, deltaAR, delta; 00208 double blocksArea = _db->getNodesArea(); 00209 double currHeight = 1; 00210 double currWidth = 1; 00211 double currTime = _params->startTime; 00212 double size = _sp->getX().size(); 00213 double alpha = 0, r; 00214 double reqdAR = _params->reqdAR, currAR; 00215 int move = 0, test=0,count=0, ran, finalPower = 100, prevPower = 100, prevNumIslands = 0, prevNodesInIslands = 0, prevMaxIsland = 0; 00216 SetOfVoltages islandSetIn; 00217 unsigned timeChangeCtr = 0; 00218 unsigned indexOrient = 0, moveSelect, iter, masterMoveSel=0; 00219 parquetfp::ORIENT newOrient = N; 00220 parquetfp::ORIENT oldOrient = N; 00221 double oldWidth=0, oldHeight=0, newWidth=0, newHeight=0; 00222 bool moveAccepted=0; 00223 00224 const double reqdArea = blocksArea * (1+(_params->maxWS/100.0)); 00225 const double reqdWidth = sqrt(reqdArea*reqdAR); 00226 const double reqdHeight = reqdWidth/reqdAR; 00227 00228 bool brokeFromLoop; 00229 00230 double tempHPWL=1e100; 00231 double currHPWL=1e100; 00232 double deltaHPWL=0; 00233 00234 unsigned numNodes = _db->getNumNodes(); 00235 bool updatedBestSoln=false; 00236 Point dummy; 00237 dummy.x=0; 00238 dummy.y=0; 00239 vector<Point> bestSolnPl(numNodes, dummy); 00240 vector<parquetfp::ORIENT> bestSolnOrient(numNodes, N); 00241 vector<double> bestSolnWidth(numNodes, 0); 00242 vector<double> bestSolnHeight(numNodes, 0); 00243 vector<unsigned> bestXSP(numNodes, 0); 00244 vector<unsigned> bestYSP(numNodes, 0); 00245 // const vector<unsigned>& spX = _sp->getX(); 00246 // const vector<unsigned>& spY = _sp->getY(); 00247 00248 Timer looptm; 00249 looptm.stop(); 00250 double unit=0, total=seconds, percent=1; 00251 unsigned moves=2000; 00252 here: currTime = _params->startTime; 00253 while(currTime>_params->timeCool || budgetTime) 00254 { 00255 brokeFromLoop = 0; 00256 iter=0; 00257 do 00258 { 00259 if (budgetTime) 00260 { 00261 if (count==0) 00262 { 00263 looptm.start(0.0); 00264 } 00265 else if (count==1000) 00266 { 00267 looptm.stop(); 00268 unit=looptm.getUserTime()/1000; 00269 if(unit == 0) 00270 { 00271 unit = 10e-6; 00272 } 00273 seconds-=looptm.getUserTime(); 00274 if(_params->verb.forMajStats > 0) 00275 cout<<int(seconds/unit)<<" moves left with "<< 00276 unit*1000000<<" micro seconds per move.\n"; 00277 moves=unsigned(seconds/unit/125.0);//moves every .08 degree 00278 } 00279 else if (count > 1000) 00280 { 00281 seconds-=unit; 00282 if (seconds <= 0) 00283 { 00284 brokeFromLoop=1; 00285 break; 00286 //return; 00287 } 00288 } 00289 } 00290 else 00291 { 00292 if (count==0) 00293 { 00294 looptm.start(0.0); 00295 } 00296 else if (count==1000) 00297 { 00298 looptm.stop(); 00299 unit=looptm.getUserTime()/1000; 00300 if(unit == 0) 00301 { 00302 unit = 10e-6; 00303 } 00304 if(_params->verb.forMajStats > 0) 00305 cout << (unit*1000000) << " micro seconds per move." << endl; 00306 } 00307 } 00308 00309 ++count; 00310 ++iter; 00311 00312 tempX = _sp->getX(); 00313 tempY = _sp->getY(); 00314 00315 // cout << "voltage of node " << indexOrient << " is: " << _db->getNodes()->getNode(indexOrient).getVoltage() << endl; 00316 00317 //select the types of moves here 00318 if(_params->softBlocks && currTime < 30) 00319 masterMoveSel = rand()%1000; 00320 moveSelect = rand()%1000; 00321 00322 currAR = currWidth/currHeight; 00323 move = -1; 00324 00325 #ifdef VANILLA 00326 if(_params->softBlocks && masterMoveSel > 990) 00327 move = packSoftBlocks(2); 00328 else if(_params->softBlocks && masterMoveSel > 930) 00329 move = makeSoftBlMove(tempX, tempY, indexOrient, newWidth, 00330 newHeight); 00331 else if(((reqdAR-currAR)/reqdAR > 0.00005 || 00332 (currAR-reqdAR)/reqdAR > 0.00005) && 00333 (timeChangeCtr%4)==0 && reqdAR != -9999) 00334 move = makeARMove(tempX, tempY, currAR); 00335 else if(moveSelect < 150 && minWL == 1 && reqdAR != -9999) 00336 move = makeARWLMove(tempX, tempY, currAR); 00337 else if(moveSelect < 300 && minWL == 1) 00338 move = makeHPWLMove(tempX, tempY); 00339 else if(moveSelect < 500) 00340 move = makeMoveOrient(indexOrient, oldOrient, newOrient); 00341 else 00342 move = makeMove(tempX, tempY); 00343 #else 00344 if(_params->softBlocks && masterMoveSel > 470) 00345 move = packSoftBlocks(2); 00346 else if(_params->softBlocks && masterMoveSel > 400) 00347 move = makeSoftBlMove(tempX, tempY, indexOrient, newWidth, 00348 newHeight); 00349 else if(((reqdAR-currAR)/reqdAR > 0.00007 || 00350 (currAR-reqdAR)/reqdAR >0.00005) 00351 && (timeChangeCtr%2)==0 && reqdAR != -9999) 00352 move = makeARMove(tempX, tempY, currAR); 00353 else if(moveSelect < 150 && minWL == 1 && reqdAR != -9999) 00354 move = makeARWLMove(tempX, tempY, currAR); 00355 else if(moveSelect < 300 && minWL == 1) 00356 move = makeHPWLMove(tempX, tempY); 00357 else if(moveSelect < 400) 00358 move = makeMoveSlacks(tempX, tempY); 00359 else if(moveSelect < 600) 00360 move = makeMoveSlacksOrient(tempX, tempY, indexOrient, oldOrient, 00361 newOrient); 00362 else if(moveSelect < 700) 00363 move = makeMoveOrient(indexOrient, oldOrient, newOrient); 00364 else 00365 move = makeMove(tempX, tempY); 00366 #endif 00367 00368 //for orientation moves 00369 if(move == 10) 00370 { 00371 if(oldOrient%2 != newOrient%2) 00372 _spEval->changeOrient(indexOrient); 00373 00374 if(minWL) 00375 _db->getNodes()->changeOrient(indexOrient, newOrient, 00376 *(_db->getNets())); 00377 } 00378 if(move == 11) //softBlocks move 00379 { 00380 oldHeight = _db->getNodes()->getNodeHeight(indexOrient); 00381 oldWidth = _db->getNodes()->getNodeWidth(indexOrient); 00382 _spEval->changeNodeWidth(indexOrient, newWidth); 00383 _spEval->changeNodeHeight(indexOrient, newHeight); 00384 } 00385 00386 _spEval->evaluate(tempX, tempY); 00387 tempHeight = _spEval->ySize; 00388 tempWidth = _spEval->xSize; 00389 tempArea = tempHeight*tempWidth; 00390 tempAR = tempWidth/tempHeight; 00391 00392 /*area objective*/ 00393 00394 if(currTime>30) 00395 deltaArea=((tempArea-currArea)*1.2*_params->timeInit)/blocksArea; 00396 else 00397 deltaArea=((tempArea-currArea)*1.5*_params->timeInit)/blocksArea; 00398 00399 /* x-viol + y-viol objective 00400 deltaArea=0.5*1.3*_params->timeInit*((tempHeight-currHeight)/(reqdHeight)+(tempWidth-currWidth)/(reqdWidth)); 00401 */ 00402 00403 /*max(x-viol, y-viol) objective 00404 if((tempHeight-currHeight)>(tempWidth-currWidth)) 00405 deltaArea=((tempHeight-currHeight)*1.3*_params->timeInit)/(reqdHeight); 00406 else 00407 deltaArea=((tempWidth-currWidth)*1.3*_params->timeInit)/(reqdWidth); 00408 */ 00409 00410 delta = deltaArea; 00411 00412 _db->updatePlacement(_spEval->xloc, _spEval->yloc); 00413 if(minWL) 00414 { 00415 tempHPWL = _db->evalHPWL(); 00416 00417 if(currHPWL == 0) 00418 deltaHPWL = 0; 00419 else 00420 { 00421 if(currTime>30) 00422 deltaHPWL=((tempHPWL-currHPWL)*1.2*_params->timeInit)/currHPWL; 00423 else 00424 deltaHPWL=((tempHPWL-currHPWL)*1.5*_params->timeInit)/currHPWL; 00425 } 00426 } 00427 00428 if(reqdAR != -9999) 00429 { 00430 if(currTime>30) 00431 deltaAR = ((tempAR - reqdAR)*(tempAR - reqdAR) - (currAR - reqdAR)*(currAR - reqdAR))*10*_params->timeInit; 00432 else 00433 deltaAR = ((tempAR - reqdAR)*(tempAR - reqdAR) - (currAR - reqdAR)*(currAR - reqdAR))*10*_params->timeInit; 00434 00435 //deltaAR = 0; 00436 if(minWL) 00437 delta = areaWeight*deltaArea + wireWeight*deltaHPWL + 00438 ARWeight*deltaAR; 00439 else 00440 delta = (areaWeight+wireWeight/2.0)*deltaArea + 00441 (ARWeight+wireWeight/2.0)*deltaAR; 00442 } 00443 else if(minWL) 00444 { 00445 delta = (areaWeight+ARWeight/2.0)*deltaArea + 00446 (wireWeight+ARWeight/2.0)*deltaHPWL; 00447 } 00448 else 00449 delta = deltaArea; 00450 00451 vddX = _sp->getX(); 00452 vddY = _sp->getY(); 00453 islandSetIn.clearIslandNodes(); 00454 makeIslands(&islandSetIn, vddX, vddY); 00455 00456 int curPower=100; 00457 if(test == 0){ 00458 cout << "--- Examining Power Reduction from Voltage Island Creation at Start---" << endl; 00459 for(int i = 0; i < islandSetIn.numCurrentGroups; i++) { 00460 finalPower = finalPower - (islandSetIn.voltageInGroup(i)*islandSetIn.numIslandInGroup(i)); 00461 } 00462 cout << "Total power overhead reduced from 100 to " << finalPower << endl; 00463 test = 1; 00464 } 00465 00466 for(int i = 0; i < islandSetIn.numCurrentGroups; i++) { 00467 curPower = curPower - (islandSetIn.voltageInGroup(i)*islandSetIn.numIslandInGroup(i)); 00468 } 00469 00470 if((islandSetIn.numCurrentGroups > prevNumIslands) && (currTime > 50)) { 00471 delta = delta/2; 00472 } 00473 00474 if((islandSetIn.numIslandNodes() > prevNodesInIslands) && (currTime > 50)) { 00475 delta = delta/4; 00476 } 00477 00478 if((islandSetIn.maxIslandNodes() > prevMaxIsland) && (currTime > 50)) { 00479 delta = delta/6; 00480 } 00481 00482 if((curPower < prevPower) && (currTime > 50)) { 00483 delta = delta/8; 00484 } 00485 00486 if(prevPower > curPower) prevPower = curPower; 00487 if(prevNumIslands<islandSetIn.numCurrentGroups) prevNumIslands = islandSetIn.numCurrentGroups; 00488 if(prevNodesInIslands<islandSetIn.numIslandNodes()) prevNodesInIslands = islandSetIn.numIslandNodes(); 00489 if(prevMaxIsland<islandSetIn.maxIslandNodes()) prevMaxIsland = islandSetIn.maxIslandNodes(); 00490 00491 if(delta<0 || move == -1) 00492 moveAccepted = 1; 00493 else if(currTime>_params->timeCool) 00494 //become greedy below time>timeCool 00495 { 00496 ran=rand()%10000; 00497 r=double(ran)/9999.0; 00498 if(r<exp(-1*delta/currTime)) 00499 moveAccepted = 1; 00500 else 00501 moveAccepted = 0; 00502 } 00503 else 00504 moveAccepted = 0; 00505 00506 if(moveAccepted) 00507 { 00508 currHeight=tempHeight; 00509 currWidth=tempWidth; 00510 currArea=tempArea; 00511 currHPWL=tempHPWL; 00512 _sp->putX(tempX); 00513 _sp->putY(tempY); 00514 00515 if(move == 10) 00516 _db->getNodes()->changeOrient(indexOrient, newOrient, 00517 *(_db->getNets())); 00518 else if(move == 11) 00519 { 00520 _db->getNodes()->putNodeWidth(indexOrient, newWidth); 00521 _db->getNodes()->putNodeHeight(indexOrient, newHeight); 00522 } 00523 } 00524 else 00525 { 00526 if(move == 10) //if move not accepted then put back orient 00527 { 00528 if(oldOrient%2 != newOrient%2) 00529 _spEval->changeOrient(indexOrient); 00530 00531 if(minWL) 00532 _db->getNodes()->changeOrient(indexOrient, oldOrient, 00533 *(_db->getNets())); 00534 } 00535 else if(move == 11) //if move not accepted then put back old HW's 00536 { 00537 _spEval->changeNodeWidth(indexOrient, oldWidth); 00538 _spEval->changeNodeHeight(indexOrient, oldHeight); 00539 } 00540 } 00541 00542 //cout<<"currTime "<<currTime<<" currHPWL "<<currHPWL<<" deltaHPWL "<<deltaHPWL<<" deltaArea "<<deltaArea<<" delta "<<delta<<" param "<<exp(-1*delta/currTime)<<endl; 00543 00544 bool saveSolnInBestCopy=false; 00545 if(moveAccepted) 00546 { 00547 double oldCurrArea = currArea; 00548 double oldCurrWidth = currWidth; 00549 double oldCurrHeight = currHeight; 00550 00551 if(reqdAR != -9999) 00552 { 00553 if(_params->solveTop && _params->dontClusterMacros) 00554 { 00555 double tempXSize = _db->getXSizeWMacroOnly(); 00556 double tempYSize = _db->getYSizeWMacroOnly(); 00557 if(tempXSize > 1e-5 && tempYSize > 1e-5) 00558 { 00559 currArea = tempXSize*tempYSize; 00560 currHeight = tempYSize; 00561 currWidth = tempXSize; 00562 } 00563 } 00564 00565 if(minWL) 00566 { 00567 if(currArea <= reqdArea && currHeight <= reqdHeight && 00568 currWidth <= reqdWidth && bestHPWL > currHPWL) 00569 { 00570 bestHPWL = currHPWL; 00571 bestArea = currArea; 00572 updatedBestSoln = true; 00573 saveSolnInBestCopy = true; 00574 } 00575 } 00576 else 00577 { 00578 if(currArea <= reqdArea && currHeight <= reqdHeight && 00579 currWidth <= reqdWidth && bestArea > currArea) 00580 { 00581 bestHPWL = currHPWL; 00582 bestArea = currArea; 00583 updatedBestSoln = true; 00584 saveSolnInBestCopy = true; 00585 } 00586 } 00587 } 00588 else 00589 { 00590 if(minWL) 00591 { 00592 if(currArea <= bestArea && currHPWL <= bestHPWL) 00593 { 00594 bestHPWL = currHPWL; 00595 bestArea = currArea; 00596 updatedBestSoln = true; 00597 saveSolnInBestCopy = true; 00598 } 00599 } 00600 else 00601 { 00602 if(currArea <= bestArea) 00603 { 00604 bestHPWL = currHPWL; 00605 bestArea = currArea; 00606 updatedBestSoln = true; 00607 saveSolnInBestCopy = true; 00608 } 00609 } 00610 } 00611 if(saveSolnInBestCopy) 00612 { 00613 itNode node; 00614 unsigned nodeId=0; 00615 for(node = _db->getNodes()->nodesBegin(); node != _db->getNodes()->nodesEnd(); ++node) 00616 { 00617 bestSolnPl[nodeId].x = node->getX(); 00618 bestSolnPl[nodeId].y = node->getY(); 00619 bestSolnOrient[nodeId] = node->getOrient(); 00620 bestSolnWidth[nodeId] = node->getWidth(); 00621 bestSolnHeight[nodeId] = node->getHeight(); 00622 bestXSP[nodeId] = (_sp->getX())[nodeId]; 00623 bestYSP[nodeId] = (_sp->getY())[nodeId]; 00624 ++nodeId; 00625 } 00626 } 00627 00628 if(minWL/* && _params->startTime > 100*/)//for lowT anneal don't have this condition 00629 { 00630 if(reqdAR != -9999 && currTime < 0.5 && updatedBestSoln) 00631 { 00632 brokeFromLoop = 1; 00633 if(_params->verb.forMajStats > 0) 00634 cout<<"Fixed-outline FPing SUCCESS"<<endl; 00635 break; 00636 //return; 00637 } 00638 } 00639 else 00640 { 00641 if(updatedBestSoln && reqdAR != -9999) 00642 { 00643 brokeFromLoop = 1; 00644 if(_params->verb.forMajStats > 0) 00645 cout<<"Fixed-outline FPing SUCCESS"<<endl; 00646 break; 00647 //return; 00648 } 00649 } 00650 00651 if(reqdAR != -9999 && _params->solveTop && _params->dontClusterMacros) 00652 { 00653 currArea = oldCurrArea; 00654 currWidth = oldCurrWidth; 00655 currHeight = oldCurrHeight; 00656 } 00657 } 00658 00659 if (iter>=moves && budgetTime) 00660 break; 00661 } 00662 while(iter<size*4 || budgetTime); 00663 00664 /* 00665 if(reqdAR != -9999) 00666 { 00667 if(minWL) 00668 if(currArea <= reqdArea && currHeight <= reqdHeight && 00669 currWidth <= reqdWidth && bestHPWL > currHPWL) 00670 { 00671 _db->saveInBestCopy(); 00672 bestHPWL = currHPWL; 00673 } 00674 else 00675 { 00676 if(currArea <= reqdArea && currHeight <= reqdHeight && 00677 currWidth <= reqdWidth && bestArea > currArea) 00678 { 00679 _db->saveInBestCopy(); 00680 bestArea = currArea; 00681 } 00682 } 00683 } 00684 */ 00685 00686 ++timeChangeCtr; 00687 00688 if (budgetTime) 00689 { 00690 percent=seconds/total; 00691 00692 if(percent<.066666 && percent>.033333) 00693 alpha=0.9; 00694 else if(percent<.033333 && percent>.016666) 00695 alpha=0.95; 00696 else if(percent<.016666 && percent>.006666) 00697 alpha=0.96; 00698 else if(percent<.006666 && percent>.000333) 00699 alpha=0.8; 00700 else if(percent<.000333 && percent>.000003) 00701 alpha=0.98; 00702 else 00703 alpha=0.85; 00704 } 00705 else 00706 { 00707 if(currTime<2000 && currTime>1000) 00708 alpha=0.95; 00709 else if(currTime<1000 && currTime>500) 00710 alpha=0.95; 00711 else if(currTime<500 && currTime>200) 00712 alpha=0.96; 00713 else if(currTime<200 && currTime>10) 00714 alpha=0.96; 00715 else if(currTime<15 && currTime>0.1) 00716 alpha=0.98; 00717 else 00718 alpha=0.95; 00719 } 00720 currTime = alpha*currTime; 00721 00722 if(brokeFromLoop == 1) 00723 break; 00724 00725 //cout<<currTime<<endl; 00726 } 00727 00728 if(updatedBestSoln) 00729 { 00730 itNode node; 00731 unsigned nodeId=0; 00732 for(node = _db->getNodes()->nodesBegin(); node != _db->getNodes()->nodesEnd(); ++node) 00733 { 00734 node->putX(bestSolnPl[nodeId].x); 00735 node->putY(bestSolnPl[nodeId].y); 00736 node->changeOrient(bestSolnOrient[nodeId], *(_db->getNets())); 00737 node->putWidth(bestSolnWidth[nodeId]); 00738 node->putHeight(bestSolnHeight[nodeId]); 00739 00740 _spEval->changeNodeWidth(nodeId, bestSolnWidth[nodeId]); 00741 _spEval->changeNodeHeight(nodeId, bestSolnHeight[nodeId]); 00742 ++nodeId; 00743 } 00744 // update the sequence-pair here 00745 _sp->putX(bestXSP); 00746 _sp->putY(bestYSP); 00747 } 00748 00749 if(_params->verb.forActions > 0) 00750 cout << "NumMoves attempted: " << count << endl; 00751 00752 00753 00754 int power = 100; 00755 for(int i = 0; i < islandSetIn.numCurrentGroups; i++) { 00756 power = power - (islandSetIn.voltageInGroup(i)*islandSetIn.numIslandInGroup(i)); 00757 } 00758 00759 if(power > finalPower) goto here; 00760 00761 _sp->printX(); 00762 _sp->printY(); 00763 00764 tempX = _sp->getX(); 00765 tempY = _sp->getY(); 00766 00767 cout << "number of distinct islands " << islandSetIn.numCurrentGroups << endl; 00768 islandSetIn.printIslands(); 00769 00770 cout << "Total number of nodes in islands is " << islandSetIn.numIslandNodes() << endl; 00771 cout << "The largest island has " << islandSetIn.maxIslandNodes() << " nodes" << endl; 00772 00773 power = 100; 00774 cout << "--- Examining Power Reduction from Voltage Island Creation ---" << endl; 00775 for(int i = 0; i < islandSetIn.numCurrentGroups; i++) { 00776 cout << "Island[" << i << "] has VDD " << islandSetIn.voltageInGroup(i) << " with number of nodes " << islandSetIn.numIslandInGroup(i) << " -- overhead reduced by " << islandSetIn.voltageInGroup(i)*islandSetIn.numIslandInGroup(i) << endl; 00777 power = power - (islandSetIn.voltageInGroup(i)*islandSetIn.numIslandInGroup(i)); 00778 } 00779 cout << "Total power overhead reduced from 100 to " << power << endl; 00780 } |
Here is the call graph for this function:
|
Implements BaseAnnealer. Definition at line 72 of file Annealer.cxx. References BaseAnnealer::_params, eval(), evalCompact(), Verbosity::forMajStats, getXSize(), getYSize(), takeSPfromDB(), and parquetfp::Command_Line::verb.
00073 { 00074 eval(); 00075 double currArea = getXSize() * getYSize(); 00076 double lastArea = currArea; 00077 00078 bool whichDir = false; 00079 evalCompact(whichDir); 00080 do 00081 { 00082 whichDir = !whichDir; 00083 takeSPfromDB(); 00084 evalCompact(whichDir); 00085 00086 lastArea = currArea; 00087 currArea = getXSize() * getYSize(); 00088 if(_params->verb.forMajStats > 0) 00089 cout << "area: " << lastArea << " -> " << currArea << endl; 00090 } 00091 while(int(currArea) < int(lastArea)); 00092 } |
Here is the call graph for this function:
|
Definition at line 167 of file Annealer.cxx. References BaseAnnealer::_db, _sp, _spEval, parquetfp::SPeval::evaluate(), parquetfp::SeqPair::getX(), parquetfp::SeqPair::getY(), parquetfp::DB::updatePlacement(), parquetfp::SPeval::xloc, and parquetfp::SPeval::yloc. Referenced by compactSoln(), and takePlfromDB().
|
Here is the call graph for this function:
|
Definition at line 179 of file Annealer.cxx. References BaseAnnealer::_db, _sp, _spEval, parquetfp::SPeval::evaluateCompact(), parquetfp::SeqPair::getX(), parquetfp::SeqPair::getY(), parquetfp::DB::updatePlacement(), parquetfp::SPeval::xloc, and parquetfp::SPeval::yloc. Referenced by compactSoln().
|
Here is the call graph for this function:
|
Definition at line 173 of file Annealer.cxx. References BaseAnnealer::_db, _sp, _spEval, parquetfp::SPeval::evalSlacks(), parquetfp::SeqPair::getX(), parquetfp::SeqPair::getY(), parquetfp::DB::updateSlacks(), parquetfp::SPeval::xSlacks, and parquetfp::SPeval::ySlacks.
|
Here is the call graph for this function:
|
Definition at line 1723 of file Annealer.cxx. References _spEval, and parquetfp::SPeval::xSize. Referenced by compactSoln().
01724 { 01725 return _spEval->xSize; 01726 } |
|
Definition at line 1729 of file Annealer.cxx. References _spEval, and parquetfp::SPeval::ySize. Referenced by compactSoln().
01730 { 01731 return _spEval->ySize; 01732 } |
|
Implements BaseAnnealer. Definition at line 115 of file Annealer.cxx. References BaseAnnealer::_db, BaseAnnealer::_params, _sp, _spEval, anneal(), BaseAnnealer::annealTime, parquetfp::DB::evalHPWL(), parquetfp::SPeval::evalSlacks(), parquetfp::SPeval::evaluate(), Timer::getUserTime(), parquetfp::SeqPair::getX(), parquetfp::SeqPair::getY(), packSoftBlocks(), BaseAnnealer::printResults(), parquetfp::Command_Line::softBlocks, Timer::start(), Timer::stop(), MaxMem::update(), parquetfp::DB::updatePlacement(), parquetfp::DB::updateSlacks(), parquetfp::SPeval::xloc, parquetfp::SPeval::xSize, parquetfp::SPeval::xSlacks, parquetfp::SPeval::yloc, parquetfp::SPeval::ySize, and parquetfp::SPeval::ySlacks.
00116 { 00117 MaxMem::update("Parquet before annealing"); 00118 00119 Timer T; 00120 T.stop(); 00121 T.start(0.0); 00122 anneal(); 00123 T.stop(); 00124 00125 annealTime += T.getUserTime(); 00126 00127 _spEval->evaluate(_sp->getX(), _sp->getY()); 00128 _db->updatePlacement(_spEval->xloc, _spEval->yloc); 00129 00130 if(_params->softBlocks) 00131 { 00132 //cout<<"Before area is "<<_spEval->xSize*_spEval->ySize<<endl; 00133 packSoftBlocks(100); 00134 _spEval->evaluate(_sp->getX(), _sp->getY()); 00135 _db->updatePlacement(_spEval->xloc, _spEval->yloc); 00136 } 00137 _spEval->evalSlacks(_sp->getX(), _sp->getY()); 00138 00139 /* 00140 int blocknum = _sp->getX().size(); 00141 vector<double> xSlacks(blocknum); // absolute x-slacks 00142 vector<double> ySlacks(blocknum); // absolute y-slacks 00143 for (int i = 0; i < blocknum; i++) 00144 { 00145 xSlacks[i] = (_spEval->xSlacks[i]/100) * _spEval->xSize; 00146 ySlacks[i] = (_spEval->ySlacks[i]/100) * _spEval->ySize; 00147 } 00148 _db->updateSlacks(xSlacks, ySlacks); 00149 */ 00150 _db->updateSlacks(_spEval->xSlacks, _spEval->ySlacks); 00151 00152 SolutionInfo currSoln; 00153 currSoln.area = _spEval->xSize*_spEval->ySize; 00154 currSoln.width = _spEval->xSize; 00155 currSoln.height = _spEval->ySize; 00156 currSoln.HPWL = _db->evalHPWL(); 00157 printResults(T, currSoln); 00158 00159 return true; 00160 } |
Here is the call graph for this function:
|
Definition at line 1077 of file Annealer.cxx. References BaseAnnealer::_params, _spEval, parquetfp::SPeval::evalSlacks(), parquetfp::Command_Line::reqdAR, sortedXSlacks, sortedYSlacks, and sortSlacks(). Referenced by anneal().
01079 { 01080 unsigned size = A.size(); 01081 if(size == 1) 01082 return -1; 01083 01084 unsigned direction, temp; 01085 _spEval->evalSlacks(A, B); 01086 01087 sortSlacks(sortedXSlacks, sortedYSlacks); 01088 01089 std::vector<unsigned>::iterator itb; 01090 unsigned chooseElem1=0; 01091 unsigned elem1=0; 01092 unsigned chooseElem2=0; 01093 unsigned elem2=0; 01094 unsigned temporary=0; 01095 01096 bool HVDir=0; 01097 if(currAR > 1.0*_params->reqdAR)//width is greater than reqd,(a little bias 01098 //to increase width for better performance 01099 HVDir = 0; // width needs to reduce 01100 else 01101 HVDir = 1; // height needs to reduce 01102 01103 chooseElem1=rand()%int(ceil(size/5.0)); 01104 chooseElem2=size-rand()%int(ceil(size/5.0))-1; 01105 01106 if(HVDir == 0) //horizontal 01107 { 01108 elem1 = unsigned(sortedXSlacks[chooseElem1].y); 01109 elem2 = unsigned(sortedXSlacks[chooseElem2].y); 01110 } 01111 else //vertical 01112 { 01113 elem1 = unsigned(sortedYSlacks[chooseElem1].y); 01114 elem2 = unsigned(sortedYSlacks[chooseElem2].y); 01115 } 01116 01117 temp = rand() % 2; 01118 if(HVDir == 0) 01119 { 01120 if(temp == 0) 01121 direction = 0; //left 01122 else 01123 direction = 3; //right 01124 } 01125 else 01126 { 01127 if(temp == 0) 01128 direction = 1; //top 01129 else 01130 direction = 2; //bottom 01131 } 01132 01133 for(itb=A.begin();(*itb)!=unsigned(elem1);++itb) 01134 { } 01135 temporary=*itb; 01136 A.erase(itb); 01137 01138 for(itb=A.begin();(*itb)!=unsigned(elem2);++itb) 01139 { } 01140 switch(direction) 01141 { 01142 case 0: //left 01143 case 1: //top 01144 break; 01145 case 2: //bottom 01146 case 3: //right 01147 ++itb; 01148 break; 01149 } 01150 A.insert(itb,1,temporary); 01151 01152 //for B seqPair 01153 for(itb=B.begin();(*itb)!=unsigned(elem1);++itb) 01154 { } 01155 temporary=*itb; 01156 B.erase(itb); 01157 01158 for(itb=B.begin();(*itb)!=unsigned(elem2);++itb) 01159 { } 01160 switch(direction) 01161 { 01162 case 0: //left 01163 case 2: //bottom 01164 break; 01165 case 1: //top 01166 case 3: //right 01167 ++itb; 01168 break; 01169 } 01170 01171 B.insert(itb,1,temporary); 01172 01173 return 7; 01174 } |
Here is the call graph for this function:
|
Definition at line 1548 of file Annealer.cxx. References BaseAnnealer::_analSolve, BaseAnnealer::_params, _spEval, parquetfp::SPeval::evalSlacks(), parquetfp::SPeval::evaluate(), parquetfp::AnalytSolve::getOptLoc(), parquetfp::Command_Line::reqdAR, sortedXSlacks, sortedYSlacks, sortSlacks(), parquetfp::Point::x, parquetfp::SPeval::xloc, parquetfp::SPeval::xSize, parquetfp::SPeval::xSlacks, parquetfp::Point::y, parquetfp::SPeval::yloc, parquetfp::SPeval::ySize, and parquetfp::SPeval::ySlacks. Referenced by anneal().
01550 { 01551 unsigned size = A.size(); 01552 01553 if(size == 1) 01554 return -1; 01555 01556 std::vector<unsigned>::iterator itb; 01557 unsigned chooseElem1=0; 01558 unsigned elem1=0; 01559 unsigned elem2=0; 01560 unsigned temporary=0; 01561 unsigned i, j, direction, temp; 01562 double maxSlack; 01563 unsigned searchRadiusNum = unsigned(ceil(size/5.0)); 01564 double searchRadius; 01565 double distance; 01566 double xDist; 01567 double yDist; 01568 01569 vector<bool> seenBlocks; 01570 seenBlocks.resize(size); 01571 double unitRadiusSize; 01572 01573 vector<int> searchBlocks; 01574 01575 vector<double>& xloc = _spEval->xloc; 01576 vector<double>& yloc = _spEval->yloc; 01577 01578 _spEval->evalSlacks(A, B); 01579 01580 sortSlacks(sortedXSlacks, sortedYSlacks); 01581 01582 _spEval->evaluate(A, B); //evaluate SP to determine locs, may be redundant 01583 //can use db locs instead 01584 01585 bool HVDir=0; 01586 if(currAR > _params->reqdAR) //width is greater than reqd,(a little bias 01587 //to increase width for better performance 01588 HVDir = 0; // width needs to reduce 01589 else 01590 HVDir = 1; // height needs to reduce 01591 01592 chooseElem1=rand()%int(ceil(size/5.0)); 01593 01594 if(HVDir == 0) //horizontal 01595 elem1 = unsigned(sortedXSlacks[chooseElem1].y); 01596 else //vertical 01597 elem1 = unsigned(sortedYSlacks[chooseElem1].y); 01598 01599 if(_spEval->xSize > _spEval->ySize) 01600 unitRadiusSize = _spEval->xSize; 01601 else 01602 unitRadiusSize = _spEval->ySize; 01603 unitRadiusSize /= sqrt(double(size)); 01604 01605 Point idealLoc = _analSolve->getOptLoc(elem1, xloc, yloc); 01606 //get optimum location of elem1 01607 01608 fill(seenBlocks.begin(), seenBlocks.end(), 0); 01609 searchRadius = 0; 01610 for(i=0; i<searchRadiusNum; ++i) 01611 { 01612 searchRadius += unitRadiusSize; 01613 for(j = 0; j<size; ++j) 01614 { 01615 if(seenBlocks[j] == 0 && j != elem1) 01616 { 01617 xDist = xloc[j]-idealLoc.x; 01618 yDist = yloc[j]-idealLoc.y; 01619 distance = sqrt(xDist*xDist + yDist*yDist); 01620 if(distance < searchRadius) 01621 { 01622 seenBlocks[j] = 1; 01623 searchBlocks.push_back(j); 01624 if(searchBlocks.size() >= unsigned(searchRadiusNum)) 01625 break; 01626 continue; 01627 } 01628 } 01629 } 01630 if(searchBlocks.size() >= unsigned(searchRadiusNum)) 01631 break; 01632 } 01633 01634 maxSlack = -1e100; 01635 if(HVDir == 0) //width reduction. find max xSlack block 01636 { 01637 for(i=0; i<searchBlocks.size(); ++i) 01638 { 01639 if(_spEval->xSlacks[searchBlocks[i]] > maxSlack) 01640 { 01641 maxSlack = _spEval->xSlacks[searchBlocks[i]]; 01642 elem2 = searchBlocks[i]; 01643 } 01644 } 01645 } 01646 else //height reduction. find max yslack block 01647 { 01648 for(i=0; i<searchBlocks.size(); ++i) 01649 { 01650 if(_spEval->ySlacks[searchBlocks[i]] > maxSlack) 01651 { 01652 maxSlack = _spEval->ySlacks[searchBlocks[i]]; 01653 elem2 = searchBlocks[i]; 01654 } 01655 } 01656 } 01657 01658 if(searchBlocks.size() == 0) 01659 do 01660 elem2 = rand() % size; 01661 while(elem2 == elem1); 01662 01663 temp = rand() % 2; 01664 if(HVDir == 0) 01665 { 01666 if(temp == 0) 01667 direction = 0; //left 01668 else 01669 direction = 3; //right 01670 } 01671 else 01672 { 01673 if(temp == 0) 01674 direction = 1; //top 01675 else 01676 direction = 2; //bottom 01677 } 01678 01679 for(itb=A.begin();(*itb)!=unsigned(elem1);++itb) 01680 { } 01681 temporary=*itb; 01682 A.erase(itb); 01683 01684 for(itb=A.begin();(*itb)!=unsigned(elem2);++itb) 01685 { } 01686 switch(direction) 01687 { 01688 case 0: //left 01689 case 1: //top 01690 break; 01691 case 2: //bottom 01692 case 3: //right 01693 ++itb; 01694 break; 01695 } 01696 A.insert(itb,1,temporary); 01697 01698 //for B seqPair 01699 for(itb=B.begin();(*itb)!=unsigned(elem1);++itb) 01700 { } 01701 temporary=*itb; 01702 B.erase(itb); 01703 01704 for(itb=B.begin();(*itb)!=unsigned(elem2);++itb) 01705 { } 01706 switch(direction) 01707 { 01708 case 0: //left 01709 case 2: //bottom 01710 break; 01711 case 1: //top 01712 case 3: //right 01713 ++itb; 01714 break; 01715 } 01716 01717 B.insert(itb,1,temporary); 01718 01719 return 13; 01720 } |
Here is the call graph for this function:
|
Definition at line 1415 of file Annealer.cxx. References BaseAnnealer::_analSolve, _spEval, parquetfp::SPeval::evaluate(), parquetfp::AnalytSolve::getOptLoc(), parquetfp::Point::x, parquetfp::SPeval::xloc, parquetfp::SPeval::xSize, parquetfp::Point::y, parquetfp::SPeval::yloc, and parquetfp::SPeval::ySize. Referenced by anneal().
01416 { 01417 01418 int size = A.size(); 01419 01420 if(size == 1) 01421 return -1; 01422 01423 int i, j, temp, direction; 01424 int elem1,elem2; 01425 01426 elem1=rand()%size; 01427 int searchRadiusNum = int(ceil(size/5.0)); 01428 double searchRadius; 01429 double distance; 01430 double xDist; 01431 double yDist; 01432 01433 std::vector<unsigned>::iterator itb; 01434 int temporary; 01435 01436 vector<bool> seenBlocks; 01437 seenBlocks.resize(size); 01438 01439 double unitRadiusSize; 01440 01441 vector<int> searchBlocks; 01442 01443 vector<double>& xloc = _spEval->xloc; 01444 vector<double>& yloc = _spEval->yloc; 01445 01446 01447 _spEval->evaluate(A, B); //evaluate SP to determine locs, may be redundant 01448 //can use db locs instead 01449 01450 if(_spEval->xSize > _spEval->ySize) 01451 unitRadiusSize = _spEval->xSize; 01452 else 01453 unitRadiusSize = _spEval->ySize; 01454 01455 unitRadiusSize /= sqrt(double(size)); 01456 01457 Point idealLoc = _analSolve->getOptLoc(elem1, _spEval->xloc, _spEval->yloc); 01458 //get optimum location of elem1 01459 01460 fill(seenBlocks.begin(), seenBlocks.end(), 0); 01461 searchRadius = 0; 01462 for(i=0; i<searchRadiusNum; ++i) 01463 { 01464 searchRadius += unitRadiusSize; 01465 for(j = 0; j<size; ++j) 01466 { 01467 if(seenBlocks[j] == 0 && j != elem1) 01468 { 01469 xDist = xloc[j]-idealLoc.x; 01470 yDist = yloc[j]-idealLoc.y; 01471 distance = sqrt(xDist*xDist + yDist*yDist); 01472 if(distance < searchRadius) 01473 { 01474 seenBlocks[j] = 1; 01475 searchBlocks.push_back(j); 01476 if(searchBlocks.size() >= unsigned(searchRadiusNum)) 01477 break; 01478 continue; 01479 } 01480 } 01481 } 01482 if(searchBlocks.size() >= unsigned(searchRadiusNum)) 01483 break; 01484 } 01485 01486 if(searchBlocks.size() != 0) 01487 { 01488 temp = rand() % searchBlocks.size(); 01489 elem2 = searchBlocks[temp]; 01490 } 01491 else 01492 { 01493 do 01494 elem2 = rand() % size; 01495 while(elem2 == elem1); 01496 } 01497 01498 if(elem1 == elem2) 01499 return -1; 01500 01501 direction = rand() % 4; 01502 01503 01504 for(itb=A.begin();(*itb)!=unsigned(elem1);++itb) 01505 { } 01506 temporary=*itb; 01507 A.erase(itb); 01508 01509 for(itb=A.begin();(*itb)!=unsigned(elem2);++itb) 01510 { } 01511 switch(direction) 01512 { 01513 case 0: //left 01514 case 1: //top 01515 break; 01516 case 2: //bottom 01517 case 3: //right 01518 ++itb; 01519 break; 01520 } 01521 A.insert(itb,1,temporary); 01522 01523 //for B seqPair 01524 for(itb=B.begin();(*itb)!=unsigned(elem1);++itb) 01525 { } 01526 temporary=*itb; 01527 B.erase(itb); 01528 01529 for(itb=B.begin();(*itb)!=unsigned(elem2);++itb) 01530 { } 01531 switch(direction) 01532 { 01533 case 0: //left 01534 case 2: //bottom 01535 break; 01536 case 1: //top 01537 case 3: //right 01538 ++itb; 01539 break; 01540 } 01541 01542 B.insert(itb,1,temporary); 01543 return 12; 01544 01545 return -1; 01546 } |
Here is the call graph for this function:
|
Definition at line 1291 of file Annealer.cxx. References BaseAnnealer::_db, _spEval, parquetfp::SPeval::evalSlacks(), parquetfp::Node::getArea(), parquetfp::Node::getHeight(), parquetfp::Node::getmaxAR(), parquetfp::Node::getminAR(), parquetfp::Nodes::getNode(), parquetfp::DB::getNodes(), parquetfp::Node::getOrient(), parquetfp::Node::getWidth(), parquetfp::SPeval::xSize, parquetfp::SPeval::xSlacks, parquetfp::SPeval::ySize, and parquetfp::SPeval::ySlacks. Referenced by packSoftBlocks().
01295 { 01296 _spEval->evalSlacks(A, B); 01297 01298 //sortSlacks(sortedXSlacks, sortedYSlacks); 01299 double minAR, maxAR, currAR; 01300 double maxWidth, maxHeight; 01301 01302 Node& node = _db->getNodes()->getNode(index); 01303 double origHeight = node.getHeight(); 01304 double origWidth = node.getWidth(); 01305 currAR = origWidth/origHeight; 01306 double area = node.getArea(); 01307 01308 if(node.getminAR() > node.getmaxAR()) 01309 { 01310 minAR = node.getmaxAR(); 01311 maxAR = node.getminAR(); 01312 } 01313 else 01314 { 01315 minAR = node.getminAR(); 01316 maxAR = node.getmaxAR(); 01317 } 01318 01319 if(node.getOrient()%2 == 0) 01320 { 01321 maxHeight = sqrt(area/minAR); 01322 maxWidth = sqrt(area*maxAR); 01323 } 01324 else 01325 { 01326 maxHeight = sqrt(area*maxAR); 01327 maxWidth = sqrt(area/minAR); 01328 } 01329 01330 double absSlackX = _spEval->xSlacks[index]*_spEval->xSize/100; 01331 double absSlackY = _spEval->ySlacks[index]*_spEval->ySize/100; 01332 01333 newHeight = origHeight; 01334 newWidth = origWidth; 01335 01336 if(absSlackX > absSlackY) //need to elongate in X direction 01337 { 01338 newWidth = origWidth + absSlackX; 01339 if(newWidth > maxWidth) 01340 newWidth = maxWidth; 01341 newHeight = area/newWidth; 01342 01343 } 01344 else //need to elongate in Y direction 01345 { 01346 newHeight = origHeight + absSlackY; 01347 if(newHeight > maxHeight) 01348 newHeight = maxHeight; 01349 newWidth = area/newHeight; 01350 } 01351 01352 if(fabs(minAR-maxAR) < 0.0000001) 01353 { 01354 newHeight = origHeight; 01355 newWidth = origWidth; 01356 } 01357 01358 return 11; 01359 } |
Here is the call graph for this function:
|
Definition at line 803 of file Annealer.cxx. References BaseAnnealer::_db, SetOfVoltages::addIslandNodes(), SetOfVoltages::createVoltageIslands(), parquetfp::Nodes::getNode(), parquetfp::DB::getNodes(), and parquetfp::Node::getVoltage(). Referenced by anneal().
00804 { 00805 int size = A.size(); 00806 //SetOfVoltages islandSet; 00807 for(unsigned i=0;i<(size-1);i++) 00808 { 00809 if(_db->getNodes()->getNode(A[i]).getVoltage() == _db->getNodes()->getNode(A[i+1]).getVoltage()) 00810 { 00811 // cout << "Node " << A[i] << " can be voltage island with " << A[i+1] << endl; 00812 islandSet->addIslandNodes(_db->getNodes()->getNode(A[i]).getVoltage(), A[i], A[i+1]); 00813 } 00814 if(_db->getNodes()->getNode(B[i]).getVoltage() == _db->getNodes()->getNode(B[i+1]).getVoltage()) 00815 { 00816 // cout << "Node " << B[i] << " can be voltage island with " << B[i+1] << endl; 00817 islandSet->addIslandNodes(_db->getNodes()->getNode(B[i]).getVoltage(), B[i], B[i+1]); 00818 } 00819 } 00820 00821 islandSet->createVoltageIslands(); 00822 00823 /* 00824 cout << "number of distinct islands " << islandSet.numCurrentGroups << endl; 00825 islandSet.printIslands(); 00826 */ 00827 // return islandSet; 00828 } |
Here is the call graph for this function:
|
Definition at line 830 of file Annealer.cxx. Referenced by anneal().
00831 { 00832 int elem1,elem2,i=0,voltage1=0,voltage2=0; 00833 int size = A.size(); 00834 if(size == 1) 00835 return -1; 00836 00837 unsigned temporary; 00838 int moverand = rand()%1000; 00839 int movedir; 00840 00841 elem1=rand()%size; 00842 elem2=rand()%size; 00843 00844 /* 00845 voltage1 = _db->getNodes()->getNode(elem1).getVoltage(); 00846 00847 while(voltage1 != voltage2) 00848 { 00849 elem2=rand()%size; 00850 voltage2 = _db->getNodes()->getNode(elem2).getVoltage(); 00851 } 00852 */ 00853 00854 std::vector<unsigned>::iterator itb; 00855 00856 moverand=rand()%600; 00857 00858 if(moverand<75) 00859 { 00860 temporary=A[elem1]; 00861 A[elem1]=A[elem2]; 00862 A[elem2]=temporary; 00863 return 1; 00864 } 00865 else if(moverand>75 && moverand<150) 00866 { 00867 temporary=B[elem1]; 00868 B[elem1]=B[elem2]; 00869 B[elem2]=temporary; 00870 return 2; 00871 } 00872 else if(moverand>150 && moverand<200) 00873 { 00874 temporary=A[elem1]; 00875 A[elem1]=A[elem2]; 00876 A[elem2]=temporary; 00877 elem1=rand()%size; 00878 elem2=rand()%size; 00879 temporary=B[elem1]; 00880 B[elem1]=B[elem2]; 00881 B[elem2]=temporary; 00882 return 3; 00883 } 00884 else if(moverand>200 && moverand<400) 00885 { 00886 movedir=rand()%100; 00887 if(movedir<50) 00888 { 00889 i=0; 00890 for(itb=A.begin();i!=elem1;++itb,++i) 00891 { } 00892 temporary=*itb; 00893 A.erase(itb); 00894 i=0; 00895 for(itb=A.begin();i!=elem2;++itb,++i) 00896 { } 00897 A.insert(itb,1,temporary); 00898 } 00899 else 00900 { 00901 i=0; 00902 for(itb=B.begin();i!=elem1;++itb,++i) 00903 { } 00904 temporary=*itb; 00905 B.erase(itb); 00906 i=0; 00907 for(itb=B.begin();i!=elem2;++itb,++i) 00908 { 00909 } 00910 B.insert(itb,1,temporary); 00911 } 00912 return 4; 00913 } 00914 else if(moverand>400 && moverand<600) 00915 { 00916 elem2=rand()%(int(ceil(size/4.0))); 00917 movedir=rand()%100; 00918 if(movedir<50) 00919 { 00920 if((elem1-elem2)<0) 00921 elem2=elem1+elem2; 00922 else 00923 elem2=elem1-elem2; 00924 } 00925 else 00926 { 00927 if((elem1+elem2)>size-1) 00928 elem2=elem1-elem2; 00929 else 00930 elem2=elem1+elem2; 00931 } 00932 if(moverand<500) 00933 { 00934 temporary=A[elem1]; 00935 A[elem1]=A[elem2]; 00936 A[elem2]=temporary; 00937 } 00938 else 00939 { 00940 temporary=B[elem1]; 00941 B[elem1]=B[elem2]; 00942 B[elem2]=temporary; 00943 } 00944 return 5; 00945 } 00946 return -1; 00947 } |
|
Definition at line 949 of file Annealer.cxx. References BaseAnnealer::_db, _sp, parquetfp::Nodes::getNode(), parquetfp::DB::getNodes(), parquetfp::Node::getOrient(), parquetfp::SeqPair::getSize(), parquetfp::Node::isOrientFixed(), and parquetfp::ORIENT. Referenced by anneal().
00951 { 00952 00953 index = rand()%_sp->getSize(); 00954 Node& node = _db->getNodes()->getNode(index); 00955 if(node.isOrientFixed()) 00956 return -1; 00957 00958 oldOrient = node.getOrient(); 00959 newOrient = parquetfp::ORIENT(rand()%8); //one of the 8 orientations 00960 00961 return 10; 00962 } |
Here is the call graph for this function:
|
Definition at line 1013 of file Annealer.cxx. References _spEval, parquetfp::SPeval::evalSlacks(), sortedXSlacks, sortedYSlacks, and sortSlacks(). Referenced by anneal().
01014 { 01015 unsigned size = A.size(); 01016 if(size == 1) 01017 return -1; 01018 01019 _spEval->evalSlacks(A, B); 01020 01021 sortSlacks(sortedXSlacks, sortedYSlacks); 01022 01023 std::vector<unsigned>::iterator itb; 01024 unsigned temporary; 01025 unsigned elem1, elem2; 01026 unsigned movedir = rand()%100; 01027 unsigned choseElem1=rand()%int(ceil(size/5.0)); 01028 unsigned choseElem2=size-rand()%int(ceil(size/5.0))-1; 01029 if(movedir<50) 01030 { 01031 elem1 = unsigned(sortedXSlacks[choseElem1].y); 01032 for(itb=A.begin();(*itb)!=elem1;++itb) 01033 { } 01034 temporary=*itb; 01035 A.erase(itb); 01036 01037 elem2=unsigned(sortedXSlacks[choseElem2].y); 01038 for(itb=A.begin();(*itb)!=elem2;++itb) 01039 { } 01040 A.insert(itb,1,temporary); 01041 //for B seqPair 01042 for(itb=B.begin();(*itb)!=elem1;++itb) 01043 { } 01044 temporary=*itb; 01045 B.erase(itb); 01046 01047 for(itb=B.begin();(*itb)!=elem2;++itb) 01048 { } 01049 B.insert(itb,1,temporary); 01050 } 01051 else 01052 { 01053 elem1 = unsigned(sortedYSlacks[choseElem1].y); 01054 for(itb=A.begin();(*itb)!=elem1;++itb) 01055 { } 01056 temporary=*itb; 01057 A.erase(itb); 01058 01059 elem2=unsigned(sortedYSlacks[choseElem2].y); 01060 for(itb=A.begin();(*itb)!=elem2;++itb) 01061 { } 01062 A.insert(itb,1,temporary); 01063 01064 //for B seqPair 01065 for(itb=B.begin();(*itb)!=elem1;++itb) 01066 { } 01067 temporary=*itb; 01068 B.erase(itb); 01069 01070 for(itb=B.begin();(*itb)!=elem2;++itb) 01071 { } 01072 B.insert(itb,1,temporary); 01073 } 01074 return 6; 01075 } |
Here is the call graph for this function:
|
Definition at line 964 of file Annealer.cxx. References BaseAnnealer::_db, _spEval, parquetfp::SPeval::evalSlacks(), parquetfp::Nodes::getNode(), parquetfp::Nodes::getNodeHeight(), parquetfp::DB::getNodes(), parquetfp::Nodes::getNodeWidth(), parquetfp::Node::getOrient(), parquetfp::Node::isOrientFixed(), parquetfp::ORIENT, sortedXSlacks, sortedYSlacks, and sortSlacks(). Referenced by anneal().
00966 { 00967 unsigned size = A.size(); 00968 _spEval->evalSlacks(A, B); 00969 00970 sortSlacks(sortedXSlacks, sortedYSlacks); 00971 unsigned elem1=0; 00972 unsigned movedir = rand()%100; 00973 index = elem1; 00974 if(movedir<50) 00975 { 00976 for(unsigned i=0;i<size;++i) 00977 { 00978 elem1 = unsigned(sortedXSlacks[i].y); 00979 if(_db->getNodes()->getNodeWidth(elem1) > 00980 _db->getNodes()->getNodeHeight(elem1)) 00981 break; 00982 } 00983 index = elem1; 00984 } 00985 else 00986 { 00987 for(unsigned i=0;i<size;++i) 00988 { 00989 elem1 = unsigned(sortedYSlacks[i].y); 00990 if(_db->getNodes()->getNodeHeight(elem1) > 00991 _db->getNodes()->getNodeWidth(elem1)) 00992 break; 00993 } 00994 index = elem1; 00995 } 00996 00997 Node& node = _db->getNodes()->getNode(index); 00998 if(node.isOrientFixed()) 00999 return -1; 01000 01001 oldOrient = node.getOrient(); 01002 unsigned r = rand()%4; 01003 01004 if(oldOrient%2 == 0) 01005 newOrient = parquetfp::ORIENT(2*r+1); 01006 else 01007 newOrient = parquetfp::ORIENT(2*r); 01008 01009 return 10; 01010 } |
Here is the call graph for this function:
|
Definition at line 1176 of file Annealer.cxx. References BaseAnnealer::_db, _spEval, parquetfp::SPeval::evalSlacks(), parquetfp::Node::getArea(), parquetfp::Node::getHeight(), parquetfp::Node::getmaxAR(), parquetfp::Node::getminAR(), parquetfp::Nodes::getNode(), parquetfp::DB::getNodes(), parquetfp::Node::getOrient(), parquetfp::Node::getWidth(), sortedXSlacks, sortedYSlacks, sortSlacks(), parquetfp::SPeval::xSize, parquetfp::SPeval::xSlacks, parquetfp::SPeval::ySize, and parquetfp::SPeval::ySlacks. Referenced by anneal().
01180 { 01181 unsigned size = A.size(); 01182 _spEval->evalSlacks(A, B); 01183 01184 sortSlacks(sortedXSlacks, sortedYSlacks); 01185 unsigned elem1=0; 01186 double minAR, maxAR, currAR; 01187 unsigned movedir = rand()%100; 01188 double maxWidth, maxHeight; 01189 index = elem1; 01190 bool brokeFromLoop=0; 01191 01192 if(movedir<50) 01193 { 01194 for(unsigned i=0;i<size;++i) 01195 { 01196 elem1 = unsigned(sortedXSlacks[i].y); 01197 Node& node = _db->getNodes()->getNode(elem1); 01198 minAR = node.getminAR(); 01199 maxAR = node.getmaxAR(); 01200 currAR = node.getWidth()/node.getHeight(); 01201 01202 if(_spEval->ySlacks[elem1] > 0 && minAR != maxAR && currAR > minAR) 01203 { 01204 brokeFromLoop = 1; 01205 break; 01206 } 01207 } 01208 index = elem1; 01209 } 01210 01211 if(movedir >= 50 || brokeFromLoop == 0) 01212 { 01213 for(unsigned i=0;i<size;++i) 01214 { 01215 elem1 = unsigned(sortedYSlacks[i].y); 01216 Node& node = _db->getNodes()->getNode(elem1); 01217 minAR = node.getminAR(); 01218 maxAR = node.getmaxAR(); 01219 currAR = node.getWidth()/node.getHeight(); 01220 01221 if(_spEval->xSlacks[elem1] > 0 && minAR != maxAR && currAR < maxAR) 01222 break; 01223 } 01224 index = elem1; 01225 } 01226 01227 Node& node = _db->getNodes()->getNode(index); 01228 double origHeight = node.getHeight(); 01229 double origWidth = node.getWidth(); 01230 currAR = origWidth/origHeight; 01231 double area = node.getArea(); 01232 01233 if(node.getminAR() > node.getmaxAR()) 01234 { 01235 minAR = node.getmaxAR(); 01236 maxAR = node.getminAR(); 01237 } 01238 else 01239 { 01240 minAR = node.getminAR(); 01241 maxAR = node.getmaxAR(); 01242 } 01243 01244 if(node.getOrient()%2 == 0) 01245 { 01246 maxHeight = sqrt(area/minAR); 01247 maxWidth = sqrt(area*maxAR); 01248 } 01249 else 01250 { 01251 maxHeight = sqrt(area*maxAR); 01252 maxWidth = sqrt(area/minAR); 01253 } 01254 01255 double absSlackX = _spEval->xSlacks[index]*_spEval->xSize/100; 01256 double absSlackY = _spEval->ySlacks[index]*_spEval->ySize/100; 01257 01258 newHeight = origHeight; 01259 newWidth = origWidth; 01260 01261 if(absSlackX > absSlackY) //need to elongate in X direction 01262 { 01263 if(currAR < maxAR) //need to satisfy this constraint 01264 { 01265 newWidth = origWidth + absSlackX; 01266 if(newWidth > maxWidth) 01267 newWidth = maxWidth; 01268 newHeight = area/newWidth; 01269 } 01270 } 01271 else //need to elongate in Y direction 01272 { 01273 if(currAR > minAR) //need to satisfy this constraint 01274 { 01275 newHeight = origHeight + absSlackY; 01276 if(newHeight > maxHeight) 01277 newHeight = maxHeight; 01278 newWidth = area/newHeight; 01279 } 01280 } 01281 01282 if(minAR == maxAR) 01283 { 01284 newHeight = origHeight; 01285 newWidth = origWidth; 01286 } 01287 01288 return 11; 01289 } |
Here is the call graph for this function:
|
Implements BaseAnnealer. Definition at line 86 of file Annealer.h.
00086 { return true; } |
|
Definition at line 1361 of file Annealer.cxx. References BaseAnnealer::_db, _sp, _spEval, parquetfp::SPeval::changeNodeHeight(), parquetfp::SPeval::changeNodeWidth(), parquetfp::SPeval::evalSlacks(), parquetfp::SPeval::evaluate(), parquetfp::Nodes::getNodeHeight(), parquetfp::DB::getNodes(), parquetfp::Nodes::getNodeWidth(), parquetfp::SeqPair::getX(), parquetfp::SeqPair::getY(), makeIndexSoftBlMove(), parquetfp::Nodes::putNodeHeight(), parquetfp::Nodes::putNodeWidth(), sortedXSlacks, sortedYSlacks, sortSlacks(), parquetfp::SPeval::xSize, and parquetfp::SPeval::ySize. Referenced by anneal(), and go().
01362 { 01363 unsigned index; 01364 double origHeight, origWidth; 01365 double newHeight, newWidth; 01366 double oldArea; 01367 double newArea; 01368 double change=-1; 01369 01370 unsigned size = (_sp->getX()).size(); 01371 01372 _spEval->evaluate(_sp->getX(), _sp->getY()); 01373 oldArea = _spEval->ySize * _spEval->xSize; 01374 unsigned iter = 0; 01375 while(iter < numIter) 01376 { 01377 ++iter; 01378 01379 _spEval->evalSlacks(_sp->getX(), _sp->getY()); 01380 sortSlacks(sortedXSlacks, sortedYSlacks); 01381 01382 for(unsigned i = 0; i<size; ++i) 01383 { 01384 if(numIter%2 == 0) 01385 index = unsigned(sortedXSlacks[i].y); 01386 else 01387 index = unsigned(sortedYSlacks[i].y); 01388 01389 origHeight = _db->getNodes()->getNodeHeight(index); 01390 origWidth = _db->getNodes()->getNodeWidth(index); 01391 01392 makeIndexSoftBlMove(_sp->getX(), _sp->getY(), index, newWidth, newHeight); 01393 _spEval->changeNodeWidth(index, newWidth); 01394 _spEval->changeNodeHeight(index, newHeight); 01395 _spEval->evaluate(_sp->getX(), _sp->getY()); 01396 01397 newArea = _spEval->ySize * _spEval->xSize; 01398 change = newArea-oldArea; 01399 if(change > 1) //do not accept 01400 { 01401 _spEval->changeNodeWidth(index, origWidth); 01402 _spEval->changeNodeHeight(index, origHeight); 01403 } 01404 else 01405 { 01406 _db->getNodes()->putNodeWidth(index, newWidth); 01407 _db->getNodes()->putNodeHeight(index, newHeight); 01408 oldArea = newArea; 01409 } 01410 } 01411 } 01412 return -1; 01413 } |
Here is the call graph for this function:
|
|
|
Definition at line 103 of file baseannealer.cxx. References BaseAnnealer::_db, BaseAnnealer::_params, BaseAnnealer::FREE_OUTLINE, parquetfp::DB::getNodesArea(), parquetfp::Command_Line::maxWS, parquetfp::Command_Line::reqdAR, and parquetfp::DB::shiftOptimizeDesign(). Referenced by Parquet::go().
00104 { 00105 // parquetfp::Point offset = _analSolve->getDesignOptLoc(); 00106 // cout << "offset.x " << offset.x 00107 // << " offset.y " << offset.y << endl; 00108 00109 // double initHPWL = _db->evalHPWL(); 00110 // cout << "initHPWL: " << initHPWL << endl; 00111 // _db->shiftDesign(offset); 00112 00113 // double afterHPWL = _db->evalHPWL(); 00114 // cout << "afterHPWL: " << afterHPWL << endl; 00115 // if(afterHPWL > initHPWL) 00116 // { 00117 // cout << "shifting not done." << endl; 00118 // offset.x *= -1; 00119 // offset.y *= -1; 00120 // _db->shiftDesign(offset); 00121 // } 00122 // else 00123 // cout << "shifting is done." << endl; 00124 00125 // only shift in "fixed-outline" mode 00126 if (_params->reqdAR != FREE_OUTLINE) 00127 { 00128 double blocksArea = _db->getNodesArea(); 00129 double reqdAR = _params->reqdAR; 00130 double reqdArea = blocksArea * (1 + _params->maxWS/100.0); 00131 double reqdWidth = sqrt(reqdArea * reqdAR); 00132 double reqdHeight = sqrt(reqdArea / reqdAR); 00133 00134 // printf("blocksArea: %.2f reqdWidth: %.2f reqdHeight: %.2f\n", 00135 // blocksArea, reqdWidth, reqdHeight); 00136 _db->shiftOptimizeDesign(reqdWidth, reqdHeight); 00137 } 00138 } |
Here is the call graph for this function:
|
Definition at line 140 of file baseannealer.cxx. References BaseAnnealer::_db, BaseAnnealer::_params, BaseAnnealer::SolutionInfo::area, parquetfp::Command_Line::dontClusterMacros, Verbosity::forMajStats, Verbosity::forSysRes, BaseAnnealer::FREE_OUTLINE, parquetfp::DB::getNodesArea(), Timer::getRealTime(), Timer::getUserTime(), parquetfp::DB::getXSizeWMacroOnly(), parquetfp::DB::getYSizeWMacroOnly(), BaseAnnealer::SolutionInfo::height, BaseAnnealer::SolutionInfo::HPWL, BaseAnnealer::HPWL, parquetfp::Command_Line::maxWS, parquetfp::Command_Line::reqdAR, parquetfp::Command_Line::solveTop, parquetfp::Command_Line::verb, and BaseAnnealer::SolutionInfo::width. Referenced by BTreeAreaWireAnnealer::go(), and go().
00142 { 00143 double timeReqd = tm.getUserTime(); 00144 double realTime = tm.getRealTime(); 00145 00146 double blocksArea = _db->getNodesArea(); 00147 double currArea = curr.area; 00148 double currWidth = curr.width; 00149 double currHeight = curr.height; 00150 double currAR = currWidth / currHeight; 00151 double whiteSpace = 100 * (currArea - blocksArea) / blocksArea; 00152 double HPWL = curr.HPWL; 00153 00154 cout.precision(6); 00155 if(_params->verb.forSysRes > 0) 00156 cout << "realTime:" << realTime << "\tuserTime:" << timeReqd << endl; 00157 if(_params->verb.forMajStats > 0) 00158 cout << "Final Area: " << currArea << " WhiteSpace " << whiteSpace 00159 << "%" << " AR " << currAR << " HPWL " << HPWL << endl; 00160 00161 double reqdAR = _params->reqdAR; 00162 double reqdArea = blocksArea * (1 + _params->maxWS/100.0); 00163 double reqdWidth = sqrt(reqdArea * reqdAR); 00164 double reqdHeight = sqrt(reqdArea / reqdAR); 00165 00166 if(_params->verb.forMajStats > 0) 00167 { 00168 if (_params->dontClusterMacros && _params->solveTop) 00169 cout << "width w/ macros only: " 00170 << _db->getXSizeWMacroOnly() << " "; 00171 else 00172 cout << "width: " << currWidth << " "; 00173 00174 if (_params->reqdAR != FREE_OUTLINE) 00175 cout << "(outline width: " << reqdWidth << ") "; 00176 cout << endl; 00177 00178 if (_params->dontClusterMacros && _params->solveTop) 00179 cout << "height w/ macros only: " 00180 << _db->getYSizeWMacroOnly() << " "; 00181 else 00182 cout << "height: " << currHeight << " "; 00183 00184 if (_params->reqdAR != FREE_OUTLINE) 00185 cout << "(outline height: " << reqdHeight << ") "; 00186 cout << endl; 00187 00188 cout << "area utilization (wrt. total current area): " 00189 << (blocksArea / currArea) * 100 << "%." << endl; 00190 cout << "whitespace (wrt. total current area): " 00191 << (1 - (blocksArea/currArea)) * 100 << "% " << endl; 00192 } 00193 } |
Here is the call graph for this function:
|
Definition at line 97 of file baseannealer.cxx. References BaseAnnealer::_analSolve, BaseAnnealer::_db, parquetfp::AnalytSolve::getXLocs(), parquetfp::AnalytSolve::getYLocs(), parquetfp::AnalytSolve::solveSOR(), and parquetfp::DB::updatePlacement(). Referenced by parquetfp::SolveMulti::go().
00098 { 00099 _analSolve->solveSOR(); 00100 _db->updatePlacement(_analSolve->getXLocs(), _analSolve->getYLocs()); 00101 } |
Here is the call graph for this function:
|
Definition at line 783 of file Annealer.cxx. References _spEval, parquetfp::Point::x, parquetfp::SPeval::xSlacks, parquetfp::Point::y, and parquetfp::SPeval::ySlacks. Referenced by makeARMove(), makeARWLMove(), makeMoveSlacks(), makeMoveSlacksOrient(), makeSoftBlMove(), and packSoftBlocks().
00785 { 00786 sortedXSlacks.erase(sortedXSlacks.begin(), sortedXSlacks.end()); 00787 sortedYSlacks.erase(sortedYSlacks.begin(), sortedYSlacks.end()); 00788 Point tempPoint; 00789 00790 for(unsigned i=0;i<_spEval->xSlacks.size();++i) 00791 { 00792 tempPoint.x = _spEval->xSlacks[i]; 00793 tempPoint.y = i; 00794 sortedXSlacks.push_back(tempPoint); 00795 tempPoint.x = _spEval->ySlacks[i]; 00796 tempPoint.y = i; 00797 sortedYSlacks.push_back(tempPoint); 00798 } 00799 std::sort(sortedXSlacks.begin(),sortedXSlacks.end(),sort_slacks()); 00800 std::sort(sortedYSlacks.begin(),sortedYSlacks.end(),sort_slacks()); 00801 } |
|
Implements BaseAnnealer. Definition at line 94 of file Annealer.cxx. References eval(), and takeSPfromDB().
00095 { 00096 takeSPfromDB(); 00097 eval(); 00098 } |
Here is the call graph for this function:
|
Definition at line 100 of file Annealer.cxx. References BaseAnnealer::_db, _sp, _spEval, parquetfp::SPeval::changeHeights(), parquetfp::SPeval::changeWidths(), parquetfp::DB::getNodeHeights(), parquetfp::DB::getNodeWidths(), parquetfp::DB::getXLocs(), parquetfp::Pl2SP::getXSP(), parquetfp::DB::getYLocs(), parquetfp::Pl2SP::getYSP(), parquetfp::PL2SP_ALGO, parquetfp::SeqPair::putX(), parquetfp::SeqPair::putY(), and parquetfp::TCG_ALGO. Referenced by compactSoln(), and takePlfromDB().
00101 { 00102 vector<double> heights = _db->getNodeHeights(); 00103 vector<double> widths = _db->getNodeWidths(); 00104 vector<double> xloc = _db->getXLocs(); 00105 vector<double> yloc = _db->getYLocs(); 00106 00107 PL2SP_ALGO useAlgo = TCG_ALGO; 00108 Pl2SP pl2sp(xloc, yloc, widths, heights, useAlgo); 00109 _sp->putX(pl2sp.getXSP()); 00110 _sp->putY(pl2sp.getYSP()); 00111 _spEval->changeWidths(widths); 00112 _spEval->changeHeights(heights); 00113 } |
Here is the call graph for this function:
|
Definition at line 162 of file Annealer.cxx. References BaseAnnealer::_db, _spEval, parquetfp::DB::updatePlacement(), parquetfp::SPeval::xloc, and parquetfp::SPeval::yloc.
00163 { 00164 _db->updatePlacement(_spEval->xloc, _spEval->yloc); 00165 } |
Here is the call graph for this function:
|
Definition at line 105 of file baseannealer.h. Referenced by BaseAnnealer::BaseAnnealer(), BTreeAreaWireAnnealer::locateSearchBlocks(), makeARWLMove(), makeHPWLMove(), BaseAnnealer::solveQP(), and BaseAnnealer::~BaseAnnealer(). |
|
Definition at line 106 of file baseannealer.h. Referenced by BaseAnnealer::BaseAnnealer(). |
|
|
|
Definition at line 69 of file Annealer.h. Referenced by anneal(), Annealer(), eval(), evalCompact(), evalSlacks(), go(), makeMoveOrient(), packSoftBlocks(), takeSPfromDB(), and ~Annealer(). |
|
Definition at line 70 of file Annealer.h. Referenced by anneal(), Annealer(), eval(), evalCompact(), evalSlacks(), getXSize(), getYSize(), go(), makeARMove(), makeARWLMove(), makeHPWLMove(), makeIndexSoftBlMove(), makeMoveSlacks(), makeMoveSlacksOrient(), makeSoftBlMove(), packSoftBlocks(), sortSlacks(), takeSPfromDB(), updatePlacement(), and ~Annealer(). |
|
Definition at line 100 of file baseannealer.h. Referenced by BaseAnnealer::BaseAnnealer(), parquetfp::SolveMulti::go(), BTreeAreaWireAnnealer::go(), and go(). |
|
Definition at line 62 of file baseannealer.cxx. Referenced by BTreeAreaWireAnnealer::anneal(), Parquet::go(), BTreeAreaWireAnnealer::packOneBlock(), BaseAnnealer::postHPWLOpt(), parquetfp::Command_Line::printAnnealerParams(), and BaseAnnealer::printResults(). |
|
Definition at line 63 of file baseannealer.cxx. Referenced by BTreeAreaWireAnnealer::getSoftBlIndex(), and BTreeAreaWireAnnealer::makeSoftBlMove(). |
|
Definition at line 72 of file Annealer.h. Referenced by makeARMove(), makeARWLMove(), makeMoveSlacks(), makeMoveSlacksOrient(), makeSoftBlMove(), and packSoftBlocks(). |
|
Definition at line 73 of file Annealer.h. Referenced by makeARMove(), makeARWLMove(), makeMoveSlacks(), makeMoveSlacksOrient(), makeSoftBlMove(), and packSoftBlocks(). |
|
Definition at line 60 of file baseannealer.cxx. Referenced by BTreeAreaWireAnnealer::anneal(). |
|
Definition at line 61 of file baseannealer.cxx. Referenced by BTreeAreaWireAnnealer::anneal(), BTreeAreaWireAnnealer::makeARWLMove(), BTreeAreaWireAnnealer::makeHPWLMove(), and BTreeAreaWireAnnealer::makeMove(). |