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 BTree & currSolution () const
const BTree & bestSolution () 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 MixedBlockInfoType & blockinfo
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