Main Page | Namespace List | Class Hierarchy | Compound List | File List | Namespace Members | Compound Members | File Members

BTreeAreaWireAnnealer Class Reference

#include <btreeanneal.h>

Inheritance diagram for BTreeAreaWireAnnealer:

Inheritance graph
[legend]
Collaboration diagram for BTreeAreaWireAnnealer:

Collaboration graph
[legend]
List of all members.

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

 BTreeAreaWireAnnealer (const parquetfp::Command_Line *const params, parquetfp::DB *const db)
 BTreeAreaWireAnnealer (MixedBlockInfoType &nBlockinfo, const parquetfp::Command_Line *const params, parquetfp::DB *const db)
virtual ~BTreeAreaWireAnnealer ()
virtual bool go ()
bool anneal ()
virtual bool packOneBlock ()
const BTreecurrSolution () const
const BTreebestSolution () const
virtual void takePlfromDB ()
virtual void compactSoln ()
int makeMove (int &indexOrient, parquetfp::ORIENT &newOrient, parquetfp::ORIENT &oldOrient)
int makeMoveSlacks ()
int makeMoveSlacksOrient ()
int makeMoveOrient ()
int makeARMove ()
int makeSoftBlMove (int &index, double &newWidth, double &newHeight)
int makeIndexSoftBlMove (int index, double &newWidth, double &newHeight)
int makeHPWLMove ()
int makeARWLMove ()
int packSoftBlocks (int numIter)
int compactBlocks ()
void GenerateRandomSoln (BTree &soln, int blocknum) const
virtual void solveQP ()
void postHPWLOpt ()
void printResults (const Timer &tm, const SolutionInfo &curr) const

Static Public Member Functions

void sort_slacks (const vector< double > &slacks, vector< int > &indices_sorted)

Public Attributes

const MixedBlockInfoTypeblockinfo
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

void constructor_core ()
BTree::MoveType get_move () const
void perform_swap ()
void perform_move ()
void perform_rotate ()
void perform_rotate (int &blk, parquetfp::ORIENT &newOrient, parquetfp::ORIENT &oldOrient)
void DBfromSoln (const BTree &soln)
void makeMoveSlacksCore (bool)
void locateSearchBlocks (int, vector< int > &)
int getSoftBlIndex (bool horizontal) const
int getSoftBlNewDimensions (int index, double &newWidth, double &newHeight) const
 BTreeAreaWireAnnealer (MixedBlockInfoType &nBlockinfo)

Protected Attributes

MixedBlockInfoType *const _blockinfo_cleaner
MixedBlockInfoType_blockinfo
BTree in_curr_solution
BTree in_next_solution
BTree in_best_solution
vector< vector< parquetfp::ORIENT > > _physicalOrient
BTreeSlackEval *const _slackEval
parquetfp::DB *const _db
const parquetfp::Command_Line
*const 
_params
parquetfp::AnalytSolve *const _analSolve
char _baseFileName [200]

Member Enumeration Documentation

enum BaseAnnealer::MOVE_TYPES [inherited]
 

Enumeration values:
MISC 
NOOP 
REP_SPEC_MIN 
REP_SPEC_ORIENT 
REP_SPEC_MAX 
SLACKS_MOVE 
AR_MOVE 
ORIENT 
SOFT_BL 
HPWL 
ARWL 

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};


Constructor & Destructor Documentation

BTreeAreaWireAnnealer::BTreeAreaWireAnnealer const parquetfp::Command_Line *const  params,
parquetfp::DB *const  db
 

Definition at line 103 of file btreeanneal.cxx.

References constructor_core().

00106    : BaseAnnealer(params, db),
00107      _blockinfo_cleaner(static_cast<MixedBlockInfoType*>
00108                         (new MixedBlockInfoTypeFromDB(*db))),
00109      _blockinfo(*_blockinfo_cleaner),
00110      blockinfo(_blockinfo),
00111      in_curr_solution(_blockinfo.currDimensions),
00112      in_next_solution(_blockinfo.currDimensions),
00113      in_best_solution(_blockinfo.currDimensions),
00114      _slackEval(new BTreeSlackEval(in_curr_solution))
00115 {
00116    constructor_core();
00117 }

Here is the call graph for this function:

BTreeAreaWireAnnealer::BTreeAreaWireAnnealer MixedBlockInfoType nBlockinfo,
const parquetfp::Command_Line *const  params,
parquetfp::DB *const  db
 

Definition at line 87 of file btreeanneal.cxx.

References constructor_core().

00091    : BaseAnnealer(params, db),
00092      _blockinfo_cleaner(NULL),
00093      _blockinfo(nBlockinfo),
00094      blockinfo(nBlockinfo),
00095      in_curr_solution(_blockinfo.currDimensions),
00096      in_next_solution(_blockinfo.currDimensions),
00097      in_best_solution(_blockinfo.currDimensions),
00098      _slackEval(new BTreeSlackEval(in_curr_solution))
00099 {
00100    constructor_core();
00101 }

Here is the call graph for this function:

BTreeAreaWireAnnealer::~BTreeAreaWireAnnealer  )  [inline, virtual]
 

Definition at line 166 of file btreeanneal.h.

References _blockinfo_cleaner, and _slackEval.

00167 {
00168    if (_slackEval != NULL)
00169       delete _slackEval;
00170 
00171    if (_blockinfo_cleaner != NULL)
00172       delete _blockinfo_cleaner;
00173 }

BTreeAreaWireAnnealer::BTreeAreaWireAnnealer MixedBlockInfoType nBlockinfo  )  [protected]
 

Definition at line 75 of file btreeanneal.cxx.

00077    : BaseAnnealer(),
00078      _blockinfo_cleaner(NULL),
00079      _blockinfo(nBlockinfo),
00080      blockinfo(nBlockinfo),
00081      in_curr_solution(_blockinfo.currDimensions),
00082      in_next_solution(_blockinfo.currDimensions),
00083      in_best_solution(_blockinfo.currDimensions),
00084      _slackEval(NULL)
00085 {}


Member Function Documentation

bool BTreeAreaWireAnnealer::anneal  ) 
 

Definition at line 338 of file btreeanneal.cxx.

References _blockinfo, BaseAnnealer::_db, BaseAnnealer::_params, _physicalOrient, parquetfp::Command_Line::areaWeight, blockinfo, parquetfp::Command_Line::budgetTime, compactBlocks(), MixedBlockInfoType::currDimensions, parquetfp::Command_Line::dontClusterMacros, parquetfp::DB::evalHPWL(), BTree::evaluate(), BaseAnnealer::FREE_OUTLINE, parquetfp::DB::getNets(), parquetfp::DB::getNodes(), parquetfp::DB::getNodesArea(), Timer::getUserTime(), parquetfp::DB::getXSizeWMacroOnly(), parquetfp::DB::getYSizeWMacroOnly(), BTree::height(), in_curr_solution, in_next_solution, makeARMove(), makeARWLMove(), makeHPWLMove(), makeMove(), makeSoftBlMove(), parquetfp::Command_Line::maxWS, parquetfp::Command_Line::minWL, BaseAnnealer::MISC, BTree::NUM_BLOCKS, parquetfp::ORIENT, BaseAnnealer::ORIENT, packSoftBlocks(), BaseAnnealer::REP_SPEC_ORIENT, parquetfp::Command_Line::reqdAR, parquetfp::Command_Line::seconds, MixedBlockInfoType::setBlockDimensions(), BaseAnnealer::SOFT_BL, parquetfp::Command_Line::softBlocks, parquetfp::Command_Line::solveTop, Timer::start(), parquetfp::Command_Line::startTime, Timer::stop(), parquetfp::Command_Line::timeCool, parquetfp::Command_Line::timeInit, BTree::totalArea(), BTree::totalHeight(), BTree::totalWidth(), BTree::tree, BaseAnnealer::UNINITIALIZED, BaseAnnealer::UNSIGNED_UNINITIALIZED, parquetfp::DB::updatePlacement(), BTree::width(), parquetfp::Command_Line::wireWeight, BTree::xloc(), and BTree::yloc().

Referenced by go().

00339 {
00340    // options
00341    bool budgetTime = _params->budgetTime;
00342    double seconds = _params->seconds;  
00343    bool minWL = _params->minWL;
00344 
00345    // input params
00346    double wireWeight = _params->wireWeight;
00347    double areaWeight = _params->areaWeight;
00348    double ARWeight = max(1 - areaWeight - wireWeight, 0.0);
00349 
00350    // input params
00351    double blocksArea = _db->getNodesArea();
00352    double size = in_curr_solution.NUM_BLOCKS;
00353   
00354    double currTime = _params->startTime;
00355 
00356    // if any constraint is imposed
00357    const double reqdAR = _params->reqdAR;
00358    // const double reqdArea = blocksArea * (1+((_params->maxWS-1)/100.0));
00359    // const double reqdWidth = sqrt(reqdArea*reqdAR);
00360    // const double reqdHeight = reqdWidth/reqdAR;
00361 
00362    // const double real_reqdAR = _params->reqdAR;
00363    const double real_reqdArea = blocksArea * (1+(_params->maxWS/100.0));
00364    const double real_reqdWidth = sqrt(real_reqdArea*reqdAR);
00365    const double real_reqdHeight = real_reqdWidth / reqdAR;
00366 
00367    // save attributes of the best solution
00368    // double bestArea = DBL_MAX;
00369    // double bestHPWL = DBL_MAX;
00370    
00371    // global counters and book-keepers
00372    int move = UNINITIALIZED;
00373    int count = 0;
00374    int prev_move = UNINITIALIZED;
00375    
00376    unsigned int timeChangeCtr = 0;
00377    unsigned int moveSelect = UNSIGNED_UNINITIALIZED;
00378    unsigned int iter = UNSIGNED_UNINITIALIZED;
00379    unsigned int masterMoveSel = 0;
00380    
00381    bool moveAccepted = false; 
00382    bool brokeFromLoop = false;
00383 
00384    double unit=0, total=seconds, percent=1;
00385    unsigned int moves = 2000;
00386 
00387    Timer looptm;
00388    looptm.stop();
00389 
00390    _db->updatePlacement(const_cast<vector<double>&>(in_curr_solution.xloc()),
00391                         const_cast<vector<double>&>(in_curr_solution.yloc()));
00392    double currHPWL = _db->evalHPWL();
00393    while(currTime > _params->timeCool || budgetTime)
00394    {
00395       brokeFromLoop = false;
00396       iter = 0;
00397 
00398       // ----------------------------------------
00399       // an iteration under the same termperature
00400       // ----------------------------------------
00401       do
00402       {
00403          // ------------------------------------
00404          // special treatment when time is fixed
00405          // ------------------------------------
00406          if (budgetTime)
00407          {
00408             if (count==0)
00409             {
00410                looptm.start(0.0);
00411             }
00412             else if (count==1000)
00413             {  
00414                looptm.stop();               
00415                unit = looptm.getUserTime() / 1000;
00416                if (unit == 0)
00417                {
00418                   unit = 10e-6;
00419                }
00420                seconds -= looptm.getUserTime();
00421                cout << int(seconds/unit) << " moves left with "
00422                     << (unit*1000000) <<" micro seconds per move.\n";
00423                moves = unsigned(seconds/unit/125);// moves every .08 degree
00424             }
00425             else if (count > 1000)
00426             {
00427                seconds -= unit;
00428                if (seconds <= 0)
00429                {
00430                   cout << "TimeOut" << endl;
00431                   return false;
00432                }
00433             }
00434          }
00435          else
00436          {
00437             if (count==0)
00438             {
00439                looptm.start(0.0);
00440             }
00441             else if (count==1000)
00442             {  
00443                looptm.stop();               
00444                unit = looptm.getUserTime() / 1000;
00445                if (unit == 0)
00446                {
00447                   unit = 10e-6;
00448                }
00449                cout << (unit * 1e6) <<" micro seconds per move." << endl;
00450             }
00451          }         
00452          // finish treating time if necessary 
00453 
00454          // -----------------------
00455          // select and apply a move
00456          // -----------------------
00457          
00458          // current solution, "currHPWL" updated only when necessary
00459          double currArea = in_curr_solution.totalArea();
00460          double currHeight = in_curr_solution.totalHeight();
00461          double currWidth = in_curr_solution.totalWidth();
00462          double currAR = currWidth / currHeight;
00463 
00464          ++count; 
00465          ++iter;
00466          prev_move = move;
00467 
00468          // -----select the types of moves here-----
00469          if (_params->softBlocks && currTime < 50)
00470             masterMoveSel = rand() % 1000;
00471          moveSelect = rand() % 1000;
00472 
00473          // -----take action-----
00474          int indexOrient = UNSIGNED_UNINITIALIZED;
00475          parquetfp::ORIENT newOrient = parquetfp::N;
00476          parquetfp::ORIENT oldOrient = parquetfp::N;
00477 
00478          int index = UNINITIALIZED;
00479          double newWidth = UNINITIALIZED;
00480          double newHeight = UNINITIALIZED;
00481 
00482          if(_params->softBlocks && masterMoveSel == 1)
00483             move = packSoftBlocks(2); // needs its return-value (-1)!!!
00484 
00485          else if(_params->softBlocks && masterMoveSel > 950)
00486             move = makeSoftBlMove(index, newWidth, newHeight);
00487          
00488          else if (((reqdAR-currAR)/reqdAR > 0.00005 || 
00489                    (currAR-reqdAR)/reqdAR > 0.00005) && 
00490                   (timeChangeCtr % 4) == 0 && reqdAR != FREE_OUTLINE)
00491          {            
00492             move = makeMove(indexOrient, newOrient, oldOrient);
00493             // move = makeARMove();
00494          }
00495 
00496          else if (false && !minWL &&
00497                   currTime < 30 && (timeChangeCtr % 5) == 0)
00498             move = compactBlocks();
00499          
00500          else if (moveSelect < 150)
00501          {
00502             if (reqdAR != FREE_OUTLINE)
00503                move = makeARMove();
00504             else 
00505                move = makeMove(indexOrient, newOrient, oldOrient);
00506          }
00507          
00508          else if (moveSelect < 300 && minWL)
00509          {
00510             if (reqdAR != FREE_OUTLINE)
00511                move = makeARWLMove();
00512             else
00513                move = makeHPWLMove();
00514          }
00515          
00516          else
00517             move = makeMove(indexOrient, newOrient, oldOrient);
00518 
00519          // -----additional book-keeping for special moves-----
00520          // for orientation moves
00521          if (move == REP_SPEC_ORIENT || move == ORIENT)
00522          {
00523             // temp values
00524             if (minWL)
00525             {
00526                _db->getNodes()->changeOrient(indexOrient, newOrient,
00527                                              *(_db->getNets()));
00528             }
00529          }
00530 
00531          // for soft-block moves
00532          if (move == SOFT_BL)
00533          {
00534             int indexTheta = in_curr_solution.tree[index].orient;
00535             _blockinfo.setBlockDimensions(index,
00536                                           newWidth, newHeight, indexTheta);
00537             in_next_solution.evaluate(in_curr_solution.tree);
00538 
00539             if (minWL)
00540             {
00541                _db->getNodes()->putNodeWidth(index, newWidth);
00542                _db->getNodes()->putNodeHeight(index, newHeight);
00543             }
00544          }            
00545 
00546          // attributes of "in_next_solution"
00547          double tempHeight = in_next_solution.totalHeight(); 
00548          double tempWidth = in_next_solution.totalWidth();  
00549          double tempArea = in_next_solution.totalArea();
00550          double tempAR = tempWidth / tempHeight;
00551          double tempHPWL = UNINITIALIZED;
00552 
00553          // -----------------------------------------------------
00554          // evaulate the temporary solution and calculate "delta"
00555          // -----------------------------------------------------
00556          
00557          double deltaArea = 0;
00558          double deltaHPWL = 0;  
00559          double deltaAR = UNINITIALIZED;
00560          double delta = UNINITIALIZED;
00561  
00562          /* area objective */
00563          if (currTime > 30)
00564             deltaArea = ((tempArea-currArea)*1.2*_params->timeInit) / blocksArea;
00565          else
00566             deltaArea = ((tempArea-currArea)*1.5*_params->timeInit) / blocksArea;
00567          
00568          /* HPWL objective if applicable */ 
00569          if (minWL)
00570          {
00571             _db->updatePlacement(const_cast<vector<double>&>(in_next_solution.xloc()),
00572                                  const_cast<vector<double>&>(in_next_solution.yloc()));
00573             
00574             tempHPWL = _db->evalHPWL();
00575             if(currHPWL == 0)
00576               deltaHPWL = 0;
00577             else
00578             {
00579               if(currTime>30)
00580                deltaHPWL = ((tempHPWL-currHPWL)*1.2*_params->timeInit)/currHPWL; // 1.2
00581               else
00582                deltaHPWL = ((tempHPWL-currHPWL)*1.5*_params->timeInit)/currHPWL; // 1.5 
00583             }
00584          }
00585          
00586          /* AR and overall objective */
00587          delta = deltaArea;
00588          if(reqdAR != FREE_OUTLINE)
00589          {            
00590             deltaAR = ((tempAR - reqdAR)*(tempAR - reqdAR) -
00591                        (currAR - reqdAR)*(currAR - reqdAR)) * 20 * _params->timeInit; // 10 // 1.2
00592             
00593             if(minWL)
00594                delta = (areaWeight * deltaArea +
00595                         wireWeight * deltaHPWL +
00596                         ARWeight * deltaAR);
00597             else
00598                delta = ((areaWeight + wireWeight/2.0) * deltaArea + 
00599                         (ARWeight + wireWeight/2.0) * deltaAR);
00600             
00601          }
00602          else if(minWL)
00603          {
00604             delta = ((areaWeight + ARWeight/2.0)*deltaArea + 
00605                      (wireWeight + ARWeight/2.0)*deltaHPWL);
00606          }
00607          else
00608             delta = deltaArea;
00609          // finish calculating "delta"        
00610 
00611          // --------------------------------------------------
00612          // decide whether a move is accepted based on "delta"
00613          // --------------------------------------------------
00614          
00615          if (delta < 0 || move == MISC)
00616             moveAccepted = true;         
00617          else if (currTime > _params->timeCool) 
00618             // become greedy below time > timeCool
00619          {
00620             double ran = rand() % 10000;
00621             double r = double(ran) / 9999;
00622             if (r < exp(-1*delta/currTime))
00623                moveAccepted = true;
00624             else
00625                moveAccepted = false;
00626          }
00627          else
00628             moveAccepted = false;
00629 
00630          // -----update current solution if accept-----
00631          if (moveAccepted && move != MISC)
00632          {
00633             in_curr_solution = in_next_solution;
00634             currHPWL = tempHPWL;
00635          }
00636 
00637          // -----additional book-keeping for special moves-----
00638          if (move == REP_SPEC_ORIENT || move == ORIENT)
00639          {
00640             // if move not accepted, then put back "oldOrient"
00641             parquetfp::ORIENT actualOrient =
00642                parquetfp::ORIENT(in_curr_solution.tree[indexOrient].orient);
00643             
00644             if (minWL)
00645                _db->getNodes()->changeOrient(indexOrient, actualOrient,
00646                                              *(_db->getNets()));
00647          }
00648 
00649          if (move == SOFT_BL)
00650          {
00651             // if move not accepted, then put back "oldWidth/Height"
00652             double actualWidth = in_curr_solution.width(index);
00653             double actualHeight = in_curr_solution.height(index);
00654             int actualTheta = in_curr_solution.tree[index].orient;
00655             _blockinfo.setBlockDimensions(index,
00656                                           actualWidth, actualHeight,
00657                                           actualTheta);
00658             
00659             if (minWL)
00660             {
00661                _db->getNodes()->putNodeWidth(index, actualWidth);
00662                _db->getNodes()->putNodeHeight(index, actualHeight);
00663             }
00664          }
00665 
00666 //          // update in_best_solution if necessary (doesn't make much diff.)
00667 //          bool updateBest = false;
00668 //          if (_params->reqdAR != FREE_OUTLINE)
00669 //          {
00670 //             if (minWL)
00671 //             {
00672 //                updateBest = (currWidth <= real_reqdWidth &&
00673 //                              currHeight <= real_reqdHeight &&
00674 //                              currHPWL < bestHPWL);
00675 //             }
00676 //             else
00677 //             {
00678 //                updateBest = (currWidth <= real_reqdWidth &&
00679 //                              currHeight <= real_reqdHeight &&
00680 //                              currArea < bestArea);
00681 //             }
00682 //          }
00683 //          else if (minWL)
00684 //          {
00685 //             double currCost =
00686 //                areaWeight * currArea + wireWeight * currHPWL;
00687 //             double bestCost =
00688 //                areaWeight * bestArea + wireWeight * bestHPWL;
00689 
00690 //             updateBest = (currCost < bestCost);
00691 //          }
00692 //          else
00693 //             updateBest = (currArea < bestArea);
00694 
00695 //          if (updateBest)
00696 //             in_best_solution = in_curr_solution;
00697 
00698          // ------------------------------
00699          // special terminating conditions
00700          // ------------------------------
00701          
00702          if (minWL/* && _params->startTime > 100*/)//for lowT anneal don't have this condition
00703          {
00704             // hhchan TODO:  clean-up this code mess 
00705             if(currArea <= real_reqdArea && currHeight <= real_reqdHeight && 
00706                currWidth <= real_reqdWidth && reqdAR != FREE_OUTLINE && currTime < 5)
00707                return true;
00708 
00709             if (reqdAR != FREE_OUTLINE && currTime < 5 && 
00710                 _params->dontClusterMacros && _params->solveTop)
00711             {
00712                double widthWMacroOnly = _db->getXSizeWMacroOnly();
00713                double heightWMacroOnly = _db->getYSizeWMacroOnly();
00714 
00715                if (widthWMacroOnly <= real_reqdWidth &&
00716                    heightWMacroOnly <= real_reqdHeight)
00717                   return true;
00718             }
00719          }
00720          else
00721          {
00722             if(currArea <= real_reqdArea && currHeight <= real_reqdHeight && 
00723                currWidth <= real_reqdWidth && reqdAR != FREE_OUTLINE)
00724                return true;
00725          }
00726           
00727          if (iter >= moves)
00728             break;
00729 
00730 #ifdef PARQUET_DEBUG_HAYWARD_ASSERT_BTREEANNEAL
00731          // -----debugging messages-----
00732          for (int i = 0; i < in_curr_solution.NUM_BLOCKS; i++)
00733          {
00734             if (minWL && (int(in_curr_solution.tree[i].orient) !=
00735                           int(_db->getNodes()->getNode(i).getOrient())))
00736             {
00737                cout << "round [" << count << "]: orient of block[" << i << "] is not consistent" << endl;
00738                printf("in_curr_solution:orient %d vs. _db->orient: %d, move: %d",
00739                       int(in_curr_solution.tree[i].orient),
00740                       int(_db->getNodes()->getNode(i).getOrient()), move);
00741                cin.get();
00742             }
00743 
00744             int theta = in_curr_solution.tree[i].orient;
00745             if (theta != int(_physicalOrient[i][theta]))
00746             {
00747                printf("round[%d]: orient of block[%d] is not consistent, in_curr_soln: %d vs phyOrient: %d move: %d\n",
00748                       count, i, theta, _physicalOrient[i][theta], move);
00749                cin.get();
00750             }
00751             
00752             if (fabs(in_curr_solution.width(i) - blockinfo.currDimensions[i].width[theta]) > 1e-6)
00753             {
00754                printf("round[%d]: width of block[%d] is not consistent.  in_curr_soln: %.2f vs. blockinfo: %.2f move: %d prevMove: %d\n",
00755                       count, i, in_curr_solution.width(i), blockinfo.currDimensions[i].width[theta], move, prev_move);
00756                printf("round[%d]: oldWidth: %.2f oldHeight: %.2f newWidth: %.2f newHeight: %.2f moveAccepted: %s\n",
00757                       count, -1.0, -1.0, newWidth, newHeight, (moveAccepted)? "T" : "F");
00758                cin.get();
00759             }
00760 
00761             if (fabs(in_curr_solution.height(i) - blockinfo.currDimensions[i].height[theta]) > 1e-6)
00762             {
00763                printf("round[%d]: height of block[%d] is not consistent.  in_curr_soln: %.2f vs. blockinfo: %.2f move: %d prevMove: %d\n",
00764                       count, i, in_curr_solution.height(i), blockinfo.currDimensions[i].height[theta], move, prev_move);
00765                printf("round[%d]: oldWidth: %.2f oldHeight: %.2f newWidth: %.2f newHeight: %.2f moveAccepted: %s\n",
00766                       count, -1.0, -1.0, newWidth, newHeight, (moveAccepted)? "T" : "F");
00767                cin.get();
00768             }
00769 
00770             if (minWL && fabs(in_curr_solution.width(i) - _db->getNodes()->getNodeWidth(i)) > 1e-6)
00771             {
00772                printf("round[%d]: width of block[%d] is not consistent.  in_curr_solution: %.2f vs._db: %.2f move: %d\n",
00773                       count, i, in_curr_solution.width(i), _db->getNodes()->getNodeWidth(i), move);
00774                cin.get();
00775             }
00776 
00777             if (in_curr_solution.width(i) < 1e-10 ||
00778                 in_curr_solution.height(i) < 1e-10)
00779             {
00780                printf("round[%d]: width of block[%d]: %f height: %f move: %d\n",
00781                       count, i, in_curr_solution.width(i), in_curr_solution.height(i), move);
00782                cin.get();
00783             }
00784          }
00785          // -----end of debugging messages-----
00786 #endif         
00787       }
00788       while (iter < 4*size || budgetTime);
00789       // finish the loop under constant temperature
00790 
00791       // -----------------------------
00792       // update temperature "currTime"
00793       // -----------------------------
00794       
00795       double alpha = UNINITIALIZED;
00796       ++timeChangeCtr;
00797       if (budgetTime)
00798       {
00799          percent = seconds/total;
00800         
00801          if (percent < 0.66666 && percent > 0.33333)
00802             alpha = 0.9;
00803          else if (percent < 0.33333 && percent > 0.16666)
00804             alpha = 0.95;
00805          else if (percent < 0.16666 && percent > 0.06666)
00806             alpha = 0.96;
00807          else if(percent <.06666 && percent >.00333)
00808             alpha = 0.8;
00809          else if(percent <.00333 && percent >.00003)
00810             alpha = 0.98;
00811          else
00812             alpha = 0.85;
00813       }
00814       else
00815       {
00816          if (currTime < 2000 && currTime > 1000)
00817             alpha = 0.9;
00818          else if (currTime < 1000 && currTime > 500)
00819             alpha = 0.95;
00820          else if (currTime < 500 && currTime > 200)
00821             alpha = 0.96;
00822          else if (currTime < 200 && currTime > 10)
00823             alpha = 0.96;
00824          else if (currTime < 15 && currTime > 0.1)
00825             alpha = 0.98;
00826          else
00827             alpha = 0.85;
00828       }
00829       currTime *= alpha;
00830       
00831       if (brokeFromLoop)
00832          break;
00833    }
00834 
00835    cout << "NumMoves attempted: " << count << endl;
00836    if (reqdAR != FREE_OUTLINE)
00837       return false;
00838    else
00839       return true;
00840 }

Here is the call graph for this function:

const BTree & BTreeAreaWireAnnealer::bestSolution  )  const [inline]
 

Definition at line 178 of file btreeanneal.h.

References in_best_solution.

00179 {   return in_best_solution; }

int BTreeAreaWireAnnealer::compactBlocks  )  [inline]
 

Definition at line 189 of file btreeanneal.h.

References BTreeCompactor::compact(), in_curr_solution, and BaseAnnealer::MISC.

Referenced by anneal().

00190 {
00191    BTreeCompactor compactor(in_curr_solution);
00192    compactor.compact();
00193    in_curr_solution = compactor;
00194    return MISC;
00195 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::compactSoln  )  [virtual]
 

Implements BaseAnnealer.

Definition at line 853 of file btreeanneal.cxx.

References BTreeCompactor::compact(), DBfromSoln(), in_curr_solution, and BTree::totalArea().

00854 {
00855    BTreeCompactor compactor(in_curr_solution);
00856 
00857    int round = 0;
00858    int numBlkChange = compactor.compact();
00859    double lastArea = in_curr_solution.totalArea();
00860    double currArea = compactor.totalArea();
00861    while (numBlkChange > 0)
00862    {
00863       printf("round[%d] %d blks moved, area: %.2f -> %.2f\n",
00864              round, numBlkChange, lastArea, currArea);
00865 
00866       numBlkChange = compactor.compact();
00867       round++;
00868       lastArea = currArea;
00869       currArea = compactor.totalArea();
00870    }
00871    printf("round[%d] %d blks moved, area: %.2f -> %.2f\n",
00872           round, numBlkChange, lastArea, currArea);
00873 
00874    in_curr_solution = compactor;
00875    DBfromSoln(in_curr_solution);
00876 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::constructor_core  )  [protected]
 

Definition at line 119 of file btreeanneal.cxx.

References BaseAnnealer::_db, BaseAnnealer::_params, _physicalOrient, blockinfo, HardBlockInfoType::blocknum(), MixedBlockInfoType::currDimensions, GenerateRandomSoln(), parquetfp::DB::getNets(), parquetfp::DB::getNodes(), in_best_solution, in_curr_solution, in_next_solution, parquetfp::Node::isOrientFixed(), parquetfp::Command_Line::minWL, BTree::NUM_BLOCKS, parquetfp::ORIENT, and MixedBlockInfoType::ORIENT_NUM.

Referenced by BTreeAreaWireAnnealer().

00120 {
00121    // initialize the orientation map
00122    _physicalOrient.resize(in_curr_solution.NUM_BLOCKS);
00123    for (int i = 0; i < in_curr_solution.NUM_BLOCKS; i++)
00124    {      
00125       _physicalOrient[i].resize(blockinfo.ORIENT_NUM);
00126       for (int theta = 0; theta < blockinfo.ORIENT_NUM; theta++)
00127       {
00128          parquetfp::Node& currBlock = _db->getNodes()->getNode(i);
00129          if (currBlock.isOrientFixed())
00130             _physicalOrient[i][theta] = parquetfp::N;
00131          else
00132             _physicalOrient[i][theta] = parquetfp::ORIENT(theta);
00133       }
00134    }
00135    
00136    // generate an initial solution
00137    GenerateRandomSoln(in_curr_solution, blockinfo.currDimensions.blocknum());
00138    in_best_solution = in_curr_solution;
00139    in_next_solution = in_curr_solution;
00140    
00141    // initialize the orientations of nodes in *_db if necessary
00142    for (int i = 0; i < in_curr_solution.NUM_BLOCKS; i++)
00143    {
00144       int initOrient = int(in_curr_solution.tree[i].orient);
00145       initOrient = _physicalOrient[i][initOrient];
00146       
00147       double initWidth = in_curr_solution.width(i);
00148       double initHeight = in_curr_solution.height(i);
00149       
00150       _db->getNodes()->changeOrient(i, parquetfp::ORIENT(initOrient),
00151                                     *(_db->getNets()));
00152       _db->getNodes()->putNodeWidth(i, initWidth);
00153       _db->getNodes()->putNodeHeight(i, initHeight);
00154    }
00155 
00156 
00157    // -----debug messages-----
00158    for (int i = 0; i < in_curr_solution.NUM_BLOCKS; i++)
00159    {
00160       for (int theta = 0; theta < blockinfo.ORIENT_NUM; theta++)
00161          if ((_db->getNodes()->getNode(i)).isOrientFixed() &&
00162              int(in_curr_solution.tree[i].orient) != 0)
00163          {
00164             cout << "ctor: orient of block[" << i << "] should be \"n\"" << endl;
00165             printf("in_curr_solution:orient %d\n",
00166                    int(in_curr_solution.tree[i].orient));
00167             cin.get();
00168          }
00169       
00170       if (_params->minWL && (int(in_curr_solution.tree[i].orient) !=
00171                              int(_db->getNodes()->getNode(i).getOrient())))
00172       {
00173          cout << "ctor: orient of block[" << i << "] is not consistent" << endl;
00174          printf("in_curr_solution:orient %d vs. _db->orient: %d\n",
00175                 int(in_curr_solution.tree[i].orient),
00176                 int(_db->getNodes()->getNode(i).getOrient()));
00177          cin.get();
00178       }
00179       
00180       int theta = in_curr_solution.tree[i].orient;
00181       if (fabs(in_curr_solution.width(i) - blockinfo.currDimensions[i].width[theta]) > 1e-6)
00182       {
00183          printf("ctor: width of block[%d] is not consistent.  in_curr_soln: %.2f vs. blockinfo: %.2f\n",
00184                 i, in_curr_solution.width(i), blockinfo.currDimensions[i].width[theta]);
00185          cin.get();
00186       }
00187       
00188       if (fabs(in_curr_solution.height(i) - blockinfo.currDimensions[i].height[theta]) > 1e-6)
00189       {
00190          printf("ctor: height of block[%d] is not consistent.  in_curr_soln: %.2f vs. blockinfo: %.2f\n",
00191                 i, in_curr_solution.height(i), blockinfo.currDimensions[i].height[theta]);
00192          cin.get();
00193       }
00194       
00195       if (_params->minWL && fabs(in_curr_solution.width(i) - _db->getNodes()->getNodeWidth(i)) > 1e-6)
00196       {
00197          printf("ctor: width of block[%d] is not consistent.  in_curr_solution: %.2f vs._db: %.2f\n",
00198                 i, in_curr_solution.width(i), _db->getNodes()->getNodeWidth(i));
00199          cin.get();
00200       }
00201    }
00202 }

Here is the call graph for this function:

const BTree & BTreeAreaWireAnnealer::currSolution  )  const [inline]
 

Definition at line 175 of file btreeanneal.h.

References in_curr_solution.

Referenced by DebugBTreeAnnealerFromDB().

00176 {   return in_curr_solution; }

void BTreeAreaWireAnnealer::DBfromSoln const BTree soln  )  [protected]
 

Definition at line 236 of file btreeanneal.cxx.

References BaseAnnealer::_db, _physicalOrient, _slackEval, BTreeSlackEval::evaluateSlacks(), parquetfp::DB::getNets(), parquetfp::DB::getNodes(), BTree::height(), BTree::NUM_BLOCKS, parquetfp::ORIENT, BTree::totalHeight(), BTree::totalWidth(), BTree::tree, parquetfp::DB::updatePlacement(), parquetfp::DB::updateSlacks(), BTree::width(), BTree::xloc(), BTreeSlackEval::xSlack(), BTree::yloc(), and BTreeSlackEval::ySlack().

Referenced by compactSoln(), go(), and packOneBlock().

00237 {
00238    _db->updatePlacement(const_cast<vector<double>&>(soln.xloc()),
00239                         const_cast<vector<double>&>(soln.yloc()));
00240    for (int i = 0; i < soln.NUM_BLOCKS; i++)
00241    {
00242       parquetfp::ORIENT newOrient =
00243          parquetfp::ORIENT(soln.tree[i].orient);
00244       _db->getNodes()->changeOrient(i, newOrient, *(_db->getNets()));
00245       _db->getNodes()->putNodeWidth(i, soln.width(i));
00246       _db->getNodes()->putNodeHeight(i, soln.height(i));
00247    }
00248    
00249    _slackEval->evaluateSlacks(soln);
00250 
00251    int blocknum = soln.NUM_BLOCKS;
00252    vector<double> xSlacks(blocknum); // % x-slacks
00253    vector<double> ySlacks(blocknum); // % y-slacks
00254    double totalWidth = soln.totalWidth();
00255    double totalHeight = soln.totalHeight();
00256    for (int i = 0; i < blocknum; i++)
00257    {
00258       xSlacks[i] = (_slackEval->xSlack()[i] / totalWidth) * 100;
00259       ySlacks[i] = (_slackEval->ySlack()[i] / totalHeight) * 100;
00260    }      
00261    _db->updateSlacks(xSlacks, ySlacks);
00262 
00263 #ifdef PARQUET_DEBUG_HAYWARD_ASSERT_BTREEANNEAL
00264    for (int i = 0; i < blocknum; i++)
00265    {
00266       int theta = soln.tree[i].orient;
00267       if (theta != _physicalOrient[i][theta])
00268       {
00269          printf("block: %d theta: %d physicalOrient: %d\n",
00270                 i, theta, _physicalOrient[i][theta]);
00271          cin.get();
00272       }
00273    }   
00274 #endif
00275 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::GenerateRandomSoln BTree soln,
int  blocknum
const
 

Definition at line 1241 of file btreeanneal.cxx.

References _physicalOrient, and BTree::evaluate().

Referenced by constructor_core().

01243 {
01244    vector<int> tree_bits;
01245    int balance = 0;
01246    int num_zeros = 0;
01247    for (int i = 0; i < 2*blocknum; i++)
01248    {
01249       bool assigned = false;
01250       double rand_num = double(rand()) / (RAND_MAX+1.0);
01251       double threshold;
01252 
01253       if (balance == 0)
01254          threshold = 1; // push_back "0" for sure
01255       else if (num_zeros == blocknum) 
01256          threshold = 0; // push_back "1" for sure
01257       else
01258          threshold = 1; // (rand_num * (balance - rand_num));
01259          
01260       if (rand_num >= threshold)
01261       {
01262          tree_bits.push_back(1);
01263          balance--;
01264          assigned = true;
01265       }
01266       else
01267       {
01268          tree_bits.push_back(0);
01269          balance++;
01270          num_zeros++;
01271          assigned = true;
01272       }
01273    }
01274    
01275    vector<int> tree_perm;
01276    tree_perm.resize(blocknum);
01277    for (int i = 0; i < blocknum; i++)
01278       tree_perm[i] = i;
01279    random_shuffle(tree_perm.begin(), tree_perm.end());
01280 
01281    vector<int> tree_perm_inverse(blocknum);
01282    for (int i = 0; i < blocknum; i++)
01283       tree_perm_inverse[tree_perm[i]] = i;
01284 
01285    vector<int> tree_orient(blocknum);
01286    for (int i = 0; i < blocknum; i++)
01287    {
01288       int rand_num = int(8 * (double(rand()) / (RAND_MAX + 1.0)));
01289       rand_num = _physicalOrient[i][rand_num];
01290 
01291       tree_orient[tree_perm_inverse[i]] = rand_num;
01292    }
01293 
01294    soln.evaluate(tree_bits, tree_perm, tree_orient);
01295 }

Here is the call graph for this function:

BTree::MoveType BTreeAreaWireAnnealer::get_move  )  const [inline, protected]
 

Definition at line 214 of file btreeanneal.h.

References BTree::MOVE, BTree::MoveType, BTree::ROTATE, and BTree::SWAP.

Referenced by makeMove().

00215 {
00216    // 0 <= "rand_num" < 1
00217    double rand_num = rand() / (RAND_MAX + 1.0);
00218    if (rand_num < 0.3333)
00219       return BTree::SWAP;
00220    else if (rand_num < 0.6666)
00221       return BTree::ROTATE;
00222    else
00223       return BTree::MOVE;
00224 }

int BTreeAreaWireAnnealer::getSoftBlIndex bool  horizontal  )  const [protected]
 

Definition at line 1079 of file btreeanneal.cxx.

References _slackEval, MixedBlockInfoType::blockARinfo, blockinfo, BTree::height(), in_curr_solution, BaseAnnealer::NOT_FOUND, BTree::NUM_BLOCKS, sort_slacks(), BTree::tree, BTree::width(), BTreeSlackEval::xSlack(), and BTreeSlackEval::ySlack().

Referenced by makeSoftBlMove().

01080 {
01081    static const int NOT_FOUND = NOT_FOUND;
01082    const int blocknum = in_curr_solution.NUM_BLOCKS;
01083    const vector<double>& slacks = (horizontal)?
01084       _slackEval->xSlack() : _slackEval->ySlack();
01085 
01086    const vector<double>& orth_slacks = (horizontal)?
01087       _slackEval->ySlack() : _slackEval->xSlack();
01088 
01089    vector<int> indices_sorted;
01090    sort_slacks(slacks, indices_sorted);
01091 
01092    int operand = NOT_FOUND; // "-1" stands for not found
01093    for (int i = 0; (i < blocknum) && (operand == NOT_FOUND); i++)
01094    {
01095       int index = indices_sorted[i];
01096       if (blockinfo.blockARinfo[index].isSoft)
01097       {
01098          int theta = in_curr_solution.tree[index].orient;
01099          double minAR = blockinfo.blockARinfo[index].minAR[theta];
01100          double maxAR = blockinfo.blockARinfo[index].maxAR[theta];
01101          
01102          double currWidth = in_curr_solution.width(index);
01103          double currHeight = in_curr_solution.height(index);
01104          double currAR = currWidth / currHeight;
01105 
01106          bool adjustable = (horizontal)?
01107             (currAR > minAR) : (currAR < maxAR);
01108 
01109          if (orth_slacks[index] > 0 && adjustable)
01110             operand = index;
01111       }
01112    }
01113    return operand;
01114 }   

Here is the call graph for this function:

int BTreeAreaWireAnnealer::getSoftBlNewDimensions int  index,
double &  newWidth,
double &  newHeight
const [protected]
 

Definition at line 1116 of file btreeanneal.cxx.

References _slackEval, MixedBlockInfoType::blockARinfo, blockinfo, BTree::height(), in_curr_solution, BaseAnnealer::NOOP, BaseAnnealer::SOFT_BL, BTree::tree, BTree::width(), BTreeSlackEval::xSlack(), and BTreeSlackEval::ySlack().

Referenced by makeIndexSoftBlMove(), and makeSoftBlMove().

01119 {
01120    if (blockinfo.blockARinfo[index].isSoft)
01121    {
01122       double origWidth = in_curr_solution.width(index);
01123       double origHeight = in_curr_solution.height(index);
01124       double indexArea = blockinfo.blockARinfo[index].area;
01125       
01126       int theta = in_curr_solution.tree[index].orient;
01127       double minAR = blockinfo.blockARinfo[index].minAR[theta];
01128       double maxAR = blockinfo.blockARinfo[index].maxAR[theta];
01129       
01130       double maxWidth = sqrt(indexArea * maxAR);
01131       double maxHeight = sqrt(indexArea / minAR);
01132       
01133       double indexSlackX = _slackEval->xSlack()[index];
01134       double indexSlackY = _slackEval->ySlack()[index];
01135       if (indexSlackX > indexSlackY)
01136       {
01137          newWidth = min(origWidth+indexSlackX, maxWidth);
01138          newHeight = indexArea / newWidth;
01139       }
01140       else
01141       {
01142          newHeight = min(origHeight+indexSlackY, maxHeight);
01143          newWidth = indexArea / newHeight;
01144       }
01145       return SOFT_BL;
01146    }
01147    else
01148       return NOOP;
01149 }

Here is the call graph for this function:

bool BTreeAreaWireAnnealer::go  )  [virtual]
 

Implements BaseAnnealer.

Definition at line 204 of file btreeanneal.cxx.

References BaseAnnealer::_db, anneal(), BaseAnnealer::annealTime, DBfromSoln(), parquetfp::DB::evalHPWL(), Timer::getUserTime(), in_best_solution, in_curr_solution, BTree::NUM_BLOCKS, packOneBlock(), BaseAnnealer::printResults(), Timer::start(), Timer::stop(), and BTree::totalArea().

Referenced by DebugBTreeAnnealerFromDB().

00205 {      
00206    Timer T;
00207    T.stop();
00208 
00209    DBfromSoln(in_curr_solution);
00210 
00211    T.start(0.0);
00212    bool success = false;
00213    if (in_curr_solution.NUM_BLOCKS > 1)
00214       success = anneal();
00215    else
00216       success = packOneBlock();
00217    T.stop();
00218 
00219    annealTime += T.getUserTime();
00220 
00221    // update *_db for locs, dimensions and slacks
00222    DBfromSoln(in_curr_solution);
00223    in_best_solution = in_curr_solution;
00224 
00225    // print solutions
00226    SolutionInfo currSoln;
00227    currSoln.area = in_curr_solution.totalArea();
00228    currSoln.width = in_curr_solution.totalWidth();
00229    currSoln.height = in_curr_solution.totalHeight();
00230    currSoln.HPWL = _db->evalHPWL();
00231    printResults(T, currSoln);
00232 
00233    return success;
00234 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::locateSearchBlocks int  ,
vector< int > & 
[protected]
 

Definition at line 1202 of file btreeanneal.cxx.

References BaseAnnealer::_analSolve, parquetfp::AnalytSolve::getOptLoc(), in_curr_solution, BTree::NUM_BLOCKS, BTree::totalHeight(), BTree::totalWidth(), parquetfp::Point::x, BTree::xloc(), parquetfp::Point::y, and BTree::yloc().

Referenced by makeARWLMove(), and makeHPWLMove().

01204 {
01205    int size = in_curr_solution.NUM_BLOCKS;
01206    vector<bool> seenBlocks(size, false);
01207    seenBlocks[operand] = true;
01208    double unitRadiusSize = max(in_curr_solution.totalWidth(),
01209                                in_curr_solution.totalHeight());
01210    unitRadiusSize /= sqrt(double(size));
01211 
01212    vector<double>& xloc = const_cast<vector<double>&>(in_curr_solution.xloc());
01213    vector<double>& yloc = const_cast<vector<double>&>(in_curr_solution.yloc());
01214    parquetfp::Point idealLoc(_analSolve->getOptLoc(operand, xloc, yloc));
01215    // get optimum location of "operand"
01216 
01217    int searchRadiusNum = int(ceil(size / 5.0));
01218    double searchRadius = 0;
01219    for(int i = 0; ((i < searchRadiusNum) &&
01220                    (searchBlocks.size() < unsigned(searchRadiusNum))); ++i)
01221    {
01222       searchRadius += unitRadiusSize;
01223       for(int j = 0; ((j < size) &&
01224                       (searchBlocks.size() < unsigned(searchRadiusNum))); ++j)
01225       {
01226          if (!seenBlocks[j])
01227          {
01228             double xDist = xloc[j] - idealLoc.x;
01229             double yDist = yloc[j] - idealLoc.y;
01230             double distance = sqrt(xDist*xDist + yDist*yDist);
01231             if(distance < searchRadius)
01232             {
01233                seenBlocks[j] = true; 
01234                searchBlocks.push_back(j);
01235             }
01236          }
01237       }
01238    }
01239 }

Here is the call graph for this function:

int BTreeAreaWireAnnealer::makeARMove  ) 
 

Definition at line 926 of file btreeanneal.cxx.

References BaseAnnealer::_params, BaseAnnealer::AR_MOVE, in_curr_solution, makeMoveSlacksCore(), parquetfp::Command_Line::reqdAR, BTree::totalHeight(), and BTree::totalWidth().

Referenced by anneal().

00927 {
00928    double currWidth = in_curr_solution.totalWidth();
00929    double currHeight = in_curr_solution.totalHeight();
00930    double currAR = currWidth / currHeight;
00931 
00932    const double reqdAR = _params->reqdAR;
00933    bool horizontal = currAR > reqdAR;
00934 
00935    makeMoveSlacksCore(horizontal);
00936    return AR_MOVE;
00937 }

Here is the call graph for this function:

int BTreeAreaWireAnnealer::makeARWLMove  ) 
 

Definition at line 999 of file btreeanneal.cxx.

References BaseAnnealer::_params, _slackEval, BaseAnnealer::ARWL, BTreeSlackEval::evaluateSlacks(), in_curr_solution, in_next_solution, locateSearchBlocks(), BTree::move(), BTree::NUM_BLOCKS, parquetfp::Command_Line::reqdAR, sort_slacks(), BTree::totalHeight(), BTree::totalWidth(), BaseAnnealer::UNSIGNED_UNINITIALIZED, BTreeSlackEval::xSlack(), and BTreeSlackEval::ySlack().

Referenced by anneal().

01000 {
01001    _slackEval->evaluateSlacks(in_curr_solution);
01002 
01003    const double reqdAR = _params->reqdAR;
01004    const double currAR =
01005       in_curr_solution.totalWidth() / in_curr_solution.totalHeight();
01006    const bool horizontal = currAR > reqdAR;
01007    const vector<double>& slacks = (horizontal)?
01008       _slackEval->xSlack() : _slackEval->ySlack(); 
01009    
01010    vector<int> indices_sorted;
01011    sort_slacks(slacks, indices_sorted);
01012    
01013    int blocknum = in_curr_solution.NUM_BLOCKS;
01014    int range = int(ceil(blocknum / 5.0));
01015    
01016    int operand_ptr = rand() % range;
01017    int operand = indices_sorted[operand_ptr];
01018    while (operand_ptr > 0 && slacks[operand] > 0)
01019    {
01020       operand_ptr--;
01021       operand = indices_sorted[operand_ptr];
01022    }
01023 
01024    vector<int> searchBlocks;
01025    locateSearchBlocks(operand, searchBlocks);
01026 
01027    int target = UNSIGNED_UNINITIALIZED;
01028    double maxSlack = -1;
01029    if (searchBlocks.size() == 0)
01030    {
01031       do
01032          target = rand() % blocknum;
01033       while(target == operand);
01034    }
01035    else
01036    {
01037       for (unsigned int i = 0; i < searchBlocks.size(); i++)
01038       {
01039          int thisBlk = searchBlocks[i];
01040          if (slacks[thisBlk] > maxSlack)
01041          {
01042             maxSlack = slacks[thisBlk];
01043             target = thisBlk;
01044          }
01045       }
01046    }
01047 
01048    in_next_solution = in_curr_solution;
01049    in_curr_solution.move(operand, target, horizontal);
01050    return ARWL; 
01051 }

Here is the call graph for this function:

int BTreeAreaWireAnnealer::makeHPWLMove  ) 
 

Definition at line 972 of file btreeanneal.cxx.

References BaseAnnealer::HPWL, in_curr_solution, in_next_solution, locateSearchBlocks(), BTree::move(), BTree::NUM_BLOCKS, and BaseAnnealer::UNSIGNED_UNINITIALIZED.

Referenced by anneal().

00973 {
00974    int size = in_curr_solution.NUM_BLOCKS;
00975    int operand = rand() % size;
00976    int target = UNSIGNED_UNINITIALIZED;
00977 
00978    vector<int> searchBlocks;
00979    locateSearchBlocks(operand, searchBlocks);
00980    
00981    if (searchBlocks.size() > 0)
00982    {
00983       int temp = rand() % searchBlocks.size();
00984       target = searchBlocks[temp];
00985    }
00986    else
00987    {
00988       do
00989          target = rand() % size;
00990       while(target == operand);
00991    }
00992 
00993    bool leftChild = bool(rand() % 2);
00994    in_next_solution = in_curr_solution;
00995    in_next_solution.move(operand, target, leftChild);
00996    return HPWL;
00997 }

Here is the call graph for this function:

int BTreeAreaWireAnnealer::makeIndexSoftBlMove int  index,
double &  newWidth,
double &  newHeight
[inline]
 

Definition at line 181 of file btreeanneal.h.

References _slackEval, BTreeSlackEval::evaluateSlacks(), getSoftBlNewDimensions(), and in_curr_solution.

Referenced by packSoftBlocks().

00184 {
00185    _slackEval->evaluateSlacks(in_curr_solution);
00186    return getSoftBlNewDimensions(index, newWidth, newHeight);
00187 }

Here is the call graph for this function:

int BTreeAreaWireAnnealer::makeMove int &  indexOrient,
parquetfp::ORIENT newOrient,
parquetfp::ORIENT oldOrient
 

Definition at line 878 of file btreeanneal.cxx.

References get_move(), BaseAnnealer::MISC, BTree::MOVE, BTree::MoveType, perform_move(), perform_rotate(), perform_swap(), BaseAnnealer::REP_SPEC_ORIENT, BTree::ROTATE, BTree::SWAP, and BaseAnnealer::UNSIGNED_UNINITIALIZED.

Referenced by anneal().

00881 {
00882    BTree::MoveType move = get_move();
00883    indexOrient = UNSIGNED_UNINITIALIZED;
00884    newOrient = parquetfp::N;
00885    oldOrient = parquetfp::N;
00886    switch(move)
00887    {
00888    case BTree::SWAP:
00889       perform_swap();
00890       return 1;
00891 
00892    case BTree::ROTATE:
00893       perform_rotate(indexOrient, newOrient, oldOrient);
00894       return int(REP_SPEC_ORIENT);
00895 
00896    case BTree::MOVE:
00897       perform_move();
00898       return 3;
00899 
00900    default:
00901       cout << "ERROR: invalid move specified in makeMove()" << endl;
00902       exit(1);
00903    }
00904    return MISC;
00905 }

Here is the call graph for this function:

int BTreeAreaWireAnnealer::makeMoveOrient  )  [inline]
 

Definition at line 93 of file btreeanneal.h.

00093 { return 10; }       // returns 10

int BTreeAreaWireAnnealer::makeMoveSlacks  ) 
 

Definition at line 907 of file btreeanneal.cxx.

References makeMoveSlacksCore(), and BaseAnnealer::SLACKS_MOVE.

00908 {
00909    int movedir = rand() % 100;
00910    int threshold = 50;
00911    bool horizontal = (movedir < threshold);
00912 
00913    makeMoveSlacksCore(horizontal);
00914 
00915    static int total = 0;
00916    static int numHoriz = 0;
00917 
00918    total++;
00919    numHoriz += ((horizontal)? 1 : 0);
00920 
00921    if (total % 1000 == 0)
00922       cout << "total: " << total << "horiz: " << numHoriz << endl;
00923    return SLACKS_MOVE;
00924 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::makeMoveSlacksCore bool   )  [protected]
 

Definition at line 939 of file btreeanneal.cxx.

References _slackEval, BTreeSlackEval::evaluateSlacks(), in_curr_solution, in_next_solution, BTree::move(), BTree::NUM_BLOCKS, sort_slacks(), BTreeSlackEval::xSlack(), and BTreeSlackEval::ySlack().

Referenced by makeARMove(), and makeMoveSlacks().

00940 {
00941    _slackEval->evaluateSlacks(in_curr_solution);
00942    
00943    vector<int> indices_sorted;
00944    const vector<double>& slacks = (horizontal)?
00945       _slackEval->xSlack() : _slackEval->ySlack();
00946    
00947    sort_slacks(slacks, indices_sorted);
00948 
00949    int blocknum = in_curr_solution.NUM_BLOCKS;
00950    int range = int(ceil(blocknum / 5.0));
00951    
00952    int operand_ptr = rand() % range;
00953    int operand = indices_sorted[operand_ptr];
00954    while (operand_ptr > 0 && slacks[operand] > 0)
00955    {
00956       operand_ptr--;
00957       operand = indices_sorted[operand_ptr];
00958    }
00959    
00960    int target_ptr = blocknum - 1 - (rand() % range);
00961    int target = indices_sorted[target_ptr];
00962    while (target_ptr < (blocknum-1) && slacks[target] == 0)
00963    {
00964       target_ptr++;
00965       target = indices_sorted[target_ptr];
00966    }
00967 
00968    in_next_solution = in_curr_solution;
00969    in_next_solution.move(operand, target, horizontal);
00970 }

Here is the call graph for this function:

int BTreeAreaWireAnnealer::makeMoveSlacksOrient  )  [inline]
 

Definition at line 92 of file btreeanneal.h.

00092 { return 10; } // returns 10

int BTreeAreaWireAnnealer::makeSoftBlMove int &  index,
double &  newWidth,
double &  newHeight
 

Definition at line 1053 of file btreeanneal.cxx.

References _slackEval, BTreeSlackEval::evaluateSlacks(), getSoftBlIndex(), getSoftBlNewDimensions(), in_curr_solution, BaseAnnealer::MISC, and BaseAnnealer::NOT_FOUND.

Referenced by anneal().

01056 {
01057    static const int NOT_FOUND = NOT_FOUND;
01058    _slackEval->evaluateSlacks(in_curr_solution);
01059    
01060    int moveDir = rand() % 2;
01061    bool horizontal = (moveDir%2 == 0);
01062    index = getSoftBlIndex(horizontal);
01063 
01064    if (index == NOT_FOUND)
01065       index = getSoftBlIndex(!horizontal);
01066 
01067    if (index != NOT_FOUND)
01068    {
01069       return getSoftBlNewDimensions(index, newWidth, newHeight);
01070    }
01071    else
01072    {
01073       newWidth = NOT_FOUND;
01074       newHeight = NOT_FOUND;
01075       return MISC;
01076    }
01077 }

Here is the call graph for this function:

bool BTreeAreaWireAnnealer::packOneBlock  )  [virtual]
 

Implements BaseAnnealer.

Definition at line 277 of file btreeanneal.cxx.

References BaseAnnealer::_db, BaseAnnealer::_params, BTree::blockArea(), DBfromSoln(), parquetfp::DB::evalHPWL(), BaseAnnealer::FREE_OUTLINE, BTree::height(), in_curr_solution, basepacking_h::Dimension::INFTY, parquetfp::Command_Line::maxWS, parquetfp::Command_Line::minWL, basepacking_h::Dimension::ORIENT_NUM, parquetfp::Command_Line::reqdAR, BTree::rotate(), and BTree::width().

Referenced by go().

00278 {
00279    const double blocksArea = in_curr_solution.blockArea();
00280    const double reqdAR = _params->reqdAR;
00281    const double reqdArea = blocksArea * (1+(_params->maxWS/100.0));
00282    const double reqdWidth = sqrt(reqdArea * reqdAR);
00283    const double reqdHeight = reqdWidth / reqdAR;
00284    
00285    const vector<double> defaultXloc(1, 0); // 1 copy of "0"
00286    const vector<double> defaultYloc(1, 0);
00287    const int defaultOrient = 0;
00288 
00289    cout << "Only one block is detected, deterministic algo used." << endl;
00290    if (_params->reqdAR != FREE_OUTLINE)
00291       cout << "outline width: " << reqdWidth
00292            << " outline height: " << reqdHeight << endl;
00293       
00294    int bestOrient = defaultOrient; 
00295    double bestHPWL = basepacking_h::Dimension::INFTY;
00296    bool success = false;
00297    for (int theta = 0;
00298         theta < basepacking_h::Dimension::ORIENT_NUM; theta++) 
00299    {
00300       in_curr_solution.rotate(0, theta);
00301 
00302       double blockWidth = in_curr_solution.width(0);
00303       double blockHeight = in_curr_solution.height(0);
00304       bool fitsInside = ((_params->reqdAR == FREE_OUTLINE) ||
00305                          ((blockWidth <= reqdWidth) &&
00306                           (blockHeight <= reqdHeight)));
00307 
00308       cout << "orient: " << theta
00309            << " width: " << blockWidth
00310            << " height: " << blockHeight
00311            << " inside: " << ((fitsInside)? "T" : "F");
00312       
00313       success = success || fitsInside;
00314       if (fitsInside && _params->minWL)
00315       {
00316          DBfromSoln(in_curr_solution);
00317          double currHPWL = _db->evalHPWL();
00318          
00319          cout << " HPWL: " << currHPWL;
00320          if (currHPWL < bestHPWL)
00321          {
00322             bestOrient = theta;
00323             bestHPWL = currHPWL;
00324          }
00325       }
00326       else if (fitsInside)
00327          bestOrient = theta;
00328       
00329       cout << endl;
00330    }
00331 
00332    in_curr_solution.rotate(0, bestOrient);
00333    DBfromSoln(in_curr_solution);
00334 
00335    return success;
00336 }

Here is the call graph for this function:

int BTreeAreaWireAnnealer::packSoftBlocks int  numIter  ) 
 

Definition at line 1151 of file btreeanneal.cxx.

References _blockinfo, BaseAnnealer::_db, BaseAnnealer::_params, _slackEval, BTree::evaluate(), BTreeSlackEval::evaluateSlacks(), parquetfp::DB::getNodes(), BTree::height(), in_curr_solution, in_next_solution, makeIndexSoftBlMove(), parquetfp::Command_Line::minWL, BaseAnnealer::MISC, BTree::NUM_BLOCKS, MixedBlockInfoType::setBlockDimensions(), BaseAnnealer::SOFT_BL, sort_slacks(), BTree::totalArea(), BTree::tree, BTree::width(), BTreeSlackEval::xSlack(), and BTreeSlackEval::ySlack().

Referenced by anneal().

01152 {
01153    const int NUM_BLOCKS = in_curr_solution.NUM_BLOCKS;
01154    for (int iter = 0; iter < numIter; iter++)
01155    {
01156       bool horizontal = (iter % 2 == 0);
01157       _slackEval->evaluateSlacks(in_curr_solution);
01158 
01159       const vector<double>& slacks = (horizontal)?
01160          _slackEval->xSlack() : _slackEval->ySlack();
01161 
01162       vector<int> indices_sorted;
01163       sort_slacks(slacks, indices_sorted);
01164       for (int i = 0; i < NUM_BLOCKS; i++)
01165       {
01166          int index = indices_sorted[i];
01167          double origWidth = in_curr_solution.width(index);
01168          double origHeight = in_curr_solution.height(index);
01169 
01170          double newWidth, newHeight;
01171          int softDecision = makeIndexSoftBlMove(index, newWidth, newHeight);
01172 
01173          if (softDecision == SOFT_BL)
01174          {
01175             // change dimensions only when needed
01176             int theta = in_curr_solution.tree[index].orient;
01177             _blockinfo.setBlockDimensions(index, newWidth, newHeight, theta);
01178 
01179             in_next_solution.evaluate(in_curr_solution.tree);
01180 
01181             double origTotalArea = in_curr_solution.totalArea();
01182             double newTotalArea = in_next_solution.totalArea();
01183             if (newTotalArea < origTotalArea)
01184             {
01185                in_curr_solution = in_next_solution;
01186                if (_params->minWL)
01187                {
01188                   _db->getNodes()->putNodeWidth(index, newWidth);
01189                   _db->getNodes()->putNodeHeight(index, newHeight);
01190                }
01191             }
01192             else
01193             {
01194                _blockinfo.setBlockDimensions(index, origWidth, origHeight, theta);
01195             }
01196          }
01197       }
01198    }
01199    return MISC;
01200 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::perform_move  )  [inline, protected]
 

Definition at line 250 of file btreeanneal.h.

References blockinfo, HardBlockInfoType::blocknum(), MixedBlockInfoType::currDimensions, in_curr_solution, in_next_solution, BTree::move(), BTree::setTree(), and BTree::tree.

Referenced by makeMove().

00251 {
00252    int blocknum = blockinfo.currDimensions.blocknum();
00253    int blk = int(blocknum * (rand() / (RAND_MAX + 1.0)));
00254 
00255    int target_rand_num = int((2*blocknum-1) * (rand() / (RAND_MAX + 1.0)));
00256    int target = target_rand_num / 2;
00257    target = (target >= blk)? target+1 : target;
00258    
00259    int leftChild = target_rand_num % 2;
00260 
00261    // in_next_solution = in_curr_solution;
00262    in_next_solution.setTree(in_curr_solution.tree);
00263    in_next_solution.move(blk, target, (leftChild == 0));
00264 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::perform_rotate int &  blk,
parquetfp::ORIENT newOrient,
parquetfp::ORIENT oldOrient
[inline, protected]
 

Definition at line 266 of file btreeanneal.h.

References BaseAnnealer::_params, _physicalOrient, blockinfo, HardBlockInfoType::blocknum(), MixedBlockInfoType::currDimensions, in_curr_solution, in_next_solution, parquetfp::Command_Line::minWL, parquetfp::ORIENT, BTree::rotate(), BTree::setTree(), and BTree::tree.

00269 {
00270    int blocknum = blockinfo.currDimensions.blocknum();
00271    blk = int(blocknum * (rand() / (RAND_MAX + 1.0)));
00272    int blk_orient = in_curr_solution.tree[blk].orient;
00273    int new_orient = blk_orient;
00274    if (_params->minWL)
00275    {
00276       while (new_orient == blk_orient)
00277          new_orient = (blk_orient + rand() % 8) % 8;
00278    }
00279    else
00280       new_orient = (blk_orient+1) % 8;
00281    new_orient = _physicalOrient[blk][new_orient];
00282 
00283    // in_next_solution = in_curr_solution;
00284    in_next_solution.setTree(in_curr_solution.tree);
00285    in_next_solution.rotate(blk, new_orient);
00286 
00287    newOrient = parquetfp::ORIENT(new_orient);
00288    oldOrient = parquetfp::ORIENT(blk_orient);
00289 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::perform_rotate  )  [inline, protected]
 

Definition at line 237 of file btreeanneal.h.

References _physicalOrient, blockinfo, HardBlockInfoType::blocknum(), MixedBlockInfoType::currDimensions, in_curr_solution, in_next_solution, BTree::rotate(), BTree::setTree(), and BTree::tree.

Referenced by makeMove().

00238 {
00239    int blocknum = blockinfo.currDimensions.blocknum();
00240    int blk = int(blocknum * (rand() / (RAND_MAX + 1.0)));
00241    int blk_orient = in_curr_solution.tree[blk].orient;
00242    int new_orient = (blk_orient+1) % 8;
00243    new_orient = _physicalOrient[blk][new_orient];
00244 
00245    // in_next_solution = in_curr_solution;
00246    in_next_solution.setTree(in_curr_solution.tree);
00247    in_next_solution.rotate(blk, new_orient);
00248 }

Here is the call graph for this function:

void BTreeAreaWireAnnealer::perform_swap  )  [inline, protected]
 

Definition at line 226 of file btreeanneal.h.

References blockinfo, HardBlockInfoType::blocknum(), MixedBlockInfoType::currDimensions, in_curr_solution, in_next_solution, and BTree::swap().

Referenced by makeMove().

00227 {
00228    int blocknum = blockinfo.currDimensions.blocknum();
00229    int blkA = int(blocknum * (rand() / (RAND_MAX + 1.0)));
00230    int blkB = int((blocknum-1) * (rand() / (RAND_MAX + 1.0)));
00231    blkB = (blkB >= blkA)? blkB+1 : blkB;
00232    
00233    in_next_solution = in_curr_solution;
00234    in_next_solution.swap(blkA, blkB);
00235 }

Here is the call graph for this function:

void BaseAnnealer::postHPWLOpt  )  [inherited]
 

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:

void BaseAnnealer::printResults const Timer tm,
const SolutionInfo curr
const [inherited]
 

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 go(), and parquetfp::Annealer::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:

void BaseAnnealer::solveQP  )  [virtual, inherited]
 

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:

void BTreeAreaWireAnnealer::sort_slacks const vector< double > &  slacks,
vector< int > &  indices_sorted
[inline, static]
 

Definition at line 197 of file btreeanneal.h.

Referenced by getSoftBlIndex(), makeARWLMove(), makeMoveSlacksCore(), and packSoftBlocks().

00199 {
00200    int blocknum = slacks.size();
00201    vector<SlackInfo> slackinfo(blocknum);
00202    for (int i = 0; i < blocknum; i++)
00203    {
00204       slackinfo[i].slack = slacks[i];
00205       slackinfo[i].index = i;
00206    }
00207    sort(slackinfo.begin(), slackinfo.end());
00208 
00209    indices_sorted.resize(blocknum);
00210    for (int i = 0; i < blocknum; i++)
00211       indices_sorted[i] = slackinfo[i].index;
00212 }

void BTreeAreaWireAnnealer::takePlfromDB  )  [virtual]
 

Implements BaseAnnealer.

Definition at line 842 of file btreeanneal.cxx.

References BaseAnnealer::_db, Pl2BTree::btree(), BTree::evaluate(), parquetfp::DB::getNodeHeights(), parquetfp::DB::getNodeWidths(), parquetfp::DB::getXLocs(), parquetfp::DB::getYLocs(), in_curr_solution, in_next_solution, and Pl2BTree::TCG.

00843 {
00844    Pl2BTree converter(_db->getXLocs(),
00845                       _db->getYLocs(),
00846                       _db->getNodeWidths(),
00847                       _db->getNodeHeights(),
00848                       Pl2BTree::TCG);
00849    in_curr_solution.evaluate(converter.btree());
00850    in_next_solution = in_curr_solution;
00851 }

Here is the call graph for this function:


Member Data Documentation

parquetfp::AnalytSolve* const BaseAnnealer::_analSolve [protected, inherited]
 

Definition at line 105 of file baseannealer.h.

Referenced by BaseAnnealer::BaseAnnealer(), locateSearchBlocks(), parquetfp::Annealer::makeARWLMove(), parquetfp::Annealer::makeHPWLMove(), BaseAnnealer::solveQP(), and BaseAnnealer::~BaseAnnealer().

char BaseAnnealer::_baseFileName[200] [protected, inherited]
 

Definition at line 106 of file baseannealer.h.

Referenced by BaseAnnealer::BaseAnnealer().

MixedBlockInfoType& BTreeAreaWireAnnealer::_blockinfo [protected]
 

Definition at line 113 of file btreeanneal.h.

Referenced by anneal(), and packSoftBlocks().

MixedBlockInfoType* const BTreeAreaWireAnnealer::_blockinfo_cleaner [protected]
 

Definition at line 112 of file btreeanneal.h.

Referenced by ~BTreeAreaWireAnnealer().

parquetfp::DB* const BaseAnnealer::_db [protected, inherited]
 

Definition at line 103 of file baseannealer.h.

Referenced by anneal(), parquetfp::Annealer::anneal(), BaseAnnealer::BaseAnnealer(), constructor_core(), DBfromSoln(), parquetfp::Annealer::eval(), parquetfp::Annealer::evalCompact(), parquetfp::Annealer::evalSlacks(), go(), parquetfp::Annealer::go(), parquetfp::Annealer::makeIndexSoftBlMove(), parquetfp::Annealer::makeIslands(), parquetfp::Annealer::makeMoveOrient(), parquetfp::Annealer::makeMoveSlacksOrient(), parquetfp::Annealer::makeSoftBlMove(), packOneBlock(), packSoftBlocks(), parquetfp::Annealer::packSoftBlocks(), BaseAnnealer::postHPWLOpt(), BaseAnnealer::printResults(), BaseAnnealer::solveQP(), takePlfromDB(), parquetfp::Annealer::takeSPfromDB(), and parquetfp::Annealer::updatePlacement().

const parquetfp::Command_Line* const BaseAnnealer::_params [protected, inherited]
 

Definition at line 104 of file baseannealer.h.

Referenced by anneal(), parquetfp::Annealer::anneal(), BaseAnnealer::BaseAnnealer(), parquetfp::Annealer::compactSoln(), constructor_core(), parquetfp::Annealer::go(), makeARMove(), parquetfp::Annealer::makeARMove(), makeARWLMove(), parquetfp::Annealer::makeARWLMove(), packOneBlock(), packSoftBlocks(), perform_rotate(), BaseAnnealer::postHPWLOpt(), and BaseAnnealer::printResults().

vector< vector<parquetfp::ORIENT> > BTreeAreaWireAnnealer::_physicalOrient [protected]
 

Definition at line 125 of file btreeanneal.h.

Referenced by anneal(), constructor_core(), DBfromSoln(), GenerateRandomSoln(), and perform_rotate().

BTreeSlackEval* const BTreeAreaWireAnnealer::_slackEval [protected]
 

Definition at line 127 of file btreeanneal.h.

Referenced by DBfromSoln(), getSoftBlIndex(), getSoftBlNewDimensions(), makeARWLMove(), makeIndexSoftBlMove(), makeMoveSlacksCore(), makeSoftBlMove(), packSoftBlocks(), and ~BTreeAreaWireAnnealer().

double BaseAnnealer::annealTime [inherited]
 

Definition at line 100 of file baseannealer.h.

Referenced by BaseAnnealer::BaseAnnealer(), parquetfp::SolveMulti::go(), go(), and parquetfp::Annealer::go().

const MixedBlockInfoType& BTreeAreaWireAnnealer::blockinfo
 

Definition at line 116 of file btreeanneal.h.

Referenced by anneal(), constructor_core(), getSoftBlIndex(), getSoftBlNewDimensions(), perform_move(), perform_rotate(), and perform_swap().

const int BaseAnnealer::FREE_OUTLINE = -9999 [static, inherited]
 

Definition at line 62 of file baseannealer.cxx.

Referenced by anneal(), Parquet::go(), packOneBlock(), BaseAnnealer::postHPWLOpt(), parquetfp::Command_Line::printAnnealerParams(), and BaseAnnealer::printResults().

BTree BTreeAreaWireAnnealer::in_best_solution [protected]
 

Definition at line 122 of file btreeanneal.h.

Referenced by bestSolution(), constructor_core(), and go().

BTree BTreeAreaWireAnnealer::in_curr_solution [protected]
 

Definition at line 120 of file btreeanneal.h.

Referenced by anneal(), compactBlocks(), compactSoln(), constructor_core(), currSolution(), getSoftBlIndex(), getSoftBlNewDimensions(), go(), locateSearchBlocks(), makeARMove(), makeARWLMove(), makeHPWLMove(), makeIndexSoftBlMove(), makeMoveSlacksCore(), makeSoftBlMove(), packOneBlock(), packSoftBlocks(), perform_move(), perform_rotate(), perform_swap(), and takePlfromDB().

BTree BTreeAreaWireAnnealer::in_next_solution [protected]
 

Definition at line 121 of file btreeanneal.h.

Referenced by anneal(), constructor_core(), makeARWLMove(), makeHPWLMove(), makeMoveSlacksCore(), packSoftBlocks(), perform_move(), perform_rotate(), perform_swap(), and takePlfromDB().

const int BaseAnnealer::NOT_FOUND = -1 [static, inherited]
 

Definition at line 63 of file baseannealer.cxx.

Referenced by getSoftBlIndex(), and makeSoftBlMove().

const int BaseAnnealer::UNINITIALIZED = -1 [static, inherited]
 

Definition at line 60 of file baseannealer.cxx.

Referenced by anneal().

const unsigned int BaseAnnealer::UNSIGNED_UNINITIALIZED = 0 [static, inherited]
 

Definition at line 61 of file baseannealer.cxx.

Referenced by anneal(), makeARWLMove(), makeHPWLMove(), and makeMove().


The documentation for this class was generated from the following files:
Generated on Mon Apr 25 01:13:42 2005 for Parquete by doxygen 1.3.2