#include <DB.h>
Collaboration diagram for parquetfp::DB:

Public Types | |
| enum | Corner { BOTTOM_LEFT, BOTTOM_RIGHT, TOP_LEFT, TOP_RIGHT, NUM_CORNERS } |
Public Member Functions | |
| DB (char *baseName) | |
| DB (DB *db, vector< int > &subBlocksIndices, Point &dbLoc, double reqdAR) | |
| DB (void) | |
| DB (DB &db2, bool compressDB=false) | |
| ~DB () | |
| DB & | operator= (DB &db2) |
| void | clean (void) |
| unsigned | getNumNodes (void) const |
| Nodes * | getNodes (void) |
| Nets * | getNets (void) |
| vector< double > | getNodeWidths () const |
| vector< double > | getNodeHeights () const |
| vector< double > | getXLocs () const |
| vector< double > | getYLocs () const |
| double | getNodeArea (unsigned index) const |
| double | getNodeWidth (unsigned index) const |
| double | getNodeHeight (unsigned index) const |
| double | getXLoc (unsigned index) const |
| double | getYLoc (unsigned index) const |
| ORIENT | getOrient (unsigned index) const |
| double | getNodeMaxAR (unsigned index) const |
| double | getNodeMinAR (unsigned index) const |
| double | getNodeAR (unsigned index) const |
| bool | isMacro (unsigned index) const |
| bool | isOrientFixed (unsigned index) const |
| bool | isNodeSoft (unsigned index) const |
| bool | isNodeHard (unsigned index) const |
| void | setNodeWidth (unsigned index, double width) |
| void | setNodeHeight (unsigned index, double height) |
| void | setNodeAR (unsigned index, double ar) |
| void | setXLoc (unsigned index, double newX) |
| void | setYLoc (unsigned index, double newY) |
| void | setOrient (unsigned index, ORIENT newOrient, bool ignoreNets=false) |
| void | setOrient (unsigned index, const char *newOrient, bool ignoreNets=false) |
| Point | getBottomLeftCorner () const |
| Point | getTopRightCorner () const |
| void | packToCorner (vector< vector< double > > &xlocsAt, vector< vector< double > > &ylocsAt) const |
| void | cornerOptimizeDesign () |
| double | getNodesArea (void) const |
| double | getRowHeight (void) const |
| double | getSiteSpacing (void) const |
| void | setRowHeight (double rowHeight) |
| void | setSiteSpacing (double siteSpacing) |
| bool | updateNodeSlim (int index, const Node &newNode) |
| bool | updateNodeLocation (int index, double xloc, double yloc) |
| bool | updateNodeDimensions (int index, double width, double height) |
| void | updatePlacement (const vector< double > &xloc, const vector< double > &yloc) |
| void | initPlacement (const Point &loc) |
| void | updateSlacks (const vector< double > &xSlack, const vector< double > &ySlack) |
| void | plot (char *fileName, double area, double whitespace, double aspectRatio, double time, double HPWL, bool plotSlacks, bool plotNets, bool plotNames) const |
| void | saveCapo (char *baseFileName, double reqdAR=1, double reqdWS=30) const |
| void | saveCapoNets (char *baseFileName) const |
| void | save (char *baseFileName) const |
| void | saveNets (char *baseFileName) const |
| void | saveWts (char *baseFileName) const |
| void | saveBestCopyPl (char *baseFileName) const |
| void | saveInBestCopy (void) |
| double | evalHPWL (bool useWts=true) const |
| double | evalHPWL (double xSize, double ySize, bool useWts=true) const |
| double | evalArea (void) const |
| double | getXSize (void) const |
| double | getYSize (void) const |
| double | getAvgHeight (void) const |
| void | shiftOptimizeDesign (double outlineWidth, double outlineHeight) |
| void | shiftOptimizeDesign (const Point &bottomLeft, const Point &topRight) |
| void | shiftDesign (Point &offset) |
| void | expandDesign (double maxWidth, double maxHeight) |
| void | markTallNodesAsMacros (double maxHeight) |
| void | reduceCoreCellsArea (double layoutArea, double maxWS) |
| double | getXSizeWMacroOnly () |
| double | getYSizeWMacroOnly () |
| double | getXMaxWMacroOnly () |
| double | getYMaxWMacroOnly () |
Static Public Member Functions | |
| string | toString (Corner corner) |
Public Attributes | |
| bool | successAR |
Protected Attributes | |
| Nodes * | _nodes |
| Nets * | _nets |
| Nodes * | _nodesBestCopy |
| double | _area |
| bool | _initArea |
| double | _rowHeight |
| double | _siteSpacing |
Private Member Functions | |
| double | getOptimalRangeStart (bool isHorizontal) |
|
|
Definition at line 136 of file DB.h. Referenced by cornerOptimizeDesign().
00136 {BOTTOM_LEFT, BOTTOM_RIGHT, TOP_LEFT, TOP_RIGHT, NUM_CORNERS};
|
|
|
Definition at line 51 of file DB.cxx. References _initArea, _nets, _nodes, _nodesBestCopy, _rowHeight, _siteSpacing, parquetfp::Nodes::initNodesFastPOAccess(), successAR, parquetfp::Nets::updateNodeInfo(), and parquetfp::Nodes::updatePinsInfo().
00052 {
00053 cout << "Reading Nodes (files " << baseName << ".blocks and "
00054 << baseName << ".pl)" << endl;
00055 _nodes = new Nodes(baseName);
00056
00057 cout << "Reading Nets (file " << baseName << ".nets)"
00058 << endl;
00059 _nets = new Nets(baseName);
00060
00061 _nets->updateNodeInfo(*_nodes);
00062 _nodes->updatePinsInfo(*_nets);
00063 _nodes->initNodesFastPOAccess(*_nets, false);
00064
00065 cout << "Done creating DB " << endl;
00066
00067 _nodesBestCopy = new Nodes();
00068 //_nodesBestCopy = new Nodes(baseName);
00069 //_nodesBestCopy->updatePinsInfo(*_nets);
00070
00071 _initArea = 0;
00072 successAR = 0;
00073 _rowHeight = 0;
00074 _siteSpacing = 0;
00075 }
|
Here is the call graph for this function:

|
||||||||||||||||||||
|
Definition at line 89 of file DB.cxx. References _initArea, _nets, _nodes, _nodesBestCopy, _rowHeight, _siteSpacing, parquetfp::Net::addNode(), parquetfp::Node::addSubBlockIndex(), parquetfp::Net::clean(), parquetfp::Node::getArea(), parquetfp::Node::getIndex(), parquetfp::Net::getIndex(), parquetfp::Node::getmaxAR(), parquetfp::Node::getminAR(), parquetfp::Net::getName(), parquetfp::Node::getName(), parquetfp::Nets::getNet(), getNets(), parquetfp::Nodes::getNode(), getNodes(), parquetfp::Nets::getNumNets(), parquetfp::Nodes::getNumNodes(), parquetfp::Nodes::getTerminal(), parquetfp::Node::getX(), parquetfp::Node::getY(), parquetfp::Nodes::initNodesFastPOAccess(), parquetfp::itNodePin, parquetfp::itPin, parquetfp::Net::pinsBegin(), parquetfp::Node::pinsBegin(), parquetfp::Net::pinsEnd(), parquetfp::Node::pinsEnd(), parquetfp::Net::putIndex(), parquetfp::Net::putName(), parquetfp::Nets::putNewNet(), parquetfp::Nodes::putNewNode(), parquetfp::Nodes::putNewTerm(), parquetfp::pin::putNodeIndex(), parquetfp::Node::putX(), parquetfp::Node::putY(), successAR, parquetfp::Nodes::updatePinsInfo(), parquetfp::Point::x, and parquetfp::Point::y.
00090 {
00091 _nodes = new Nodes();
00092 _nets = new Nets();
00093 _nodesBestCopy = new Nodes();
00094 _initArea = 0;
00095 successAR = 0;
00096 _rowHeight = 0;
00097 _siteSpacing = 0;
00098
00099 Nodes* origNodes = db->getNodes();
00100 Nets* origNets = db->getNets();
00101
00102 map<unsigned, unsigned> mapping;
00103 unsigned numOrigNodes = origNodes->getNumNodes();
00104 vector<bool> seenNodes(numOrigNodes, false);
00105
00106 double nodesArea = 0;
00107 for(unsigned i=0; i<subBlocksIndices.size(); ++i)
00108 {
00109 Node& origNode = origNodes->getNode(subBlocksIndices[i]);
00110 nodesArea += origNode.getArea();
00111 Node tempNode(origNode.getName(), origNode.getArea() ,
00112 origNode.getminAR(), origNode.getmaxAR(), i, false);
00113 tempNode.addSubBlockIndex(subBlocksIndices[i]);
00114 tempNode.putX(origNode.getX());
00115 tempNode.putY(origNode.getY());
00116 _nodes->putNewNode(tempNode);
00117 seenNodes[subBlocksIndices[i]] = true;
00118 mapping[subBlocksIndices[i]] = i;
00119 }
00120
00121 double reqdHeight = sqrt(nodesArea/reqdAR);
00122 double reqdWidth = reqdHeight*reqdAR;
00123 double termXLoc, termYLoc;
00124 double minXLoc = dbLoc.x;
00125 double maxXLoc = minXLoc + reqdWidth;
00126 double minYLoc = dbLoc.y;
00127 double maxYLoc = minYLoc + reqdHeight;
00128
00129 unsigned numOrigNets = origNets->getNumNets();
00130 vector<bool> seenNets(numOrigNets, false);
00131
00132 unsigned newNetCtr=0;
00133 unsigned newTermCtr = 0;
00134
00135 itNodePin origNodePin;
00136 Net tempEdge;
00137
00138 for(unsigned i=0; i<subBlocksIndices.size(); ++i)
00139 {
00140 Node& origNode = origNodes->getNode(subBlocksIndices[i]);
00141 for(origNodePin = origNode.pinsBegin();
00142 origNodePin != origNode.pinsEnd(); ++origNodePin)
00143 {
00144 Net& origNet = origNets->getNet(origNodePin->netIndex);
00145 if(!seenNets[origNet.getIndex()])
00146 {
00147 seenNets[origNet.getIndex()] = true;
00148 tempEdge.putName(origNet.getName());
00149 tempEdge.putIndex(newNetCtr);
00150 for(itPin netPin = origNet.pinsBegin();
00151 netPin != origNet.pinsEnd(); ++netPin)
00152 {
00153 double poffsetX, poffsetY;
00154 unsigned origNodeIdx = netPin->getNodeIndex();
00155 if(!netPin->getType()) //not a terminal
00156 {
00157 if(seenNodes[origNodeIdx])
00158 {
00159 unsigned newNodeIdx = mapping[origNodeIdx];
00160 poffsetX = netPin->getXOffset();
00161 poffsetY = netPin->getYOffset();
00162
00163 Node& newNode = _nodes->getNode(newNodeIdx);
00164 pin tempPin(newNode.getName(), false, poffsetX,
00165 poffsetY, newNetCtr);
00166 tempPin.putNodeIndex(newNodeIdx);
00167 tempEdge.addNode(tempPin);
00168 }
00169 else //need terminal propagation
00170 {
00171 Node& origTerm =
00172 origNodes->getNode(netPin->getNodeIndex());
00173
00174 Node tempTerm(origTerm.getName(), 0, 1, 1,
00175 newTermCtr, true);
00176 tempTerm.addSubBlockIndex(origTerm.getIndex());
00177
00178 //terminal propagation
00179 if(origTerm.getX() < minXLoc)
00180 termXLoc = 0;
00181 else if(origTerm.getX() > maxXLoc)
00182 termXLoc = reqdWidth;
00183 else
00184 termXLoc = origTerm.getX() - minXLoc;
00185
00186 if(origTerm.getY() < minYLoc)
00187 termYLoc = 0;
00188 else if(origTerm.getY() > maxYLoc)
00189 termYLoc = reqdHeight;
00190 else
00191 termYLoc = origTerm.getY() - minYLoc;
00192
00193 tempTerm.putX(termXLoc);
00194 tempTerm.putY(termYLoc);
00195
00196 _nodes->putNewTerm(tempTerm);
00197
00198 pin tempPin(origTerm.getName(), true, 0, 0, newNetCtr);
00199 tempPin.putNodeIndex(newTermCtr);
00200 tempEdge.addNode(tempPin);
00201 newTermCtr++;
00202 }
00203 }
00204 else //actual terminal
00205 {
00206 Node& origTerm =
00207 origNodes->getTerminal(netPin->getNodeIndex());
00208
00209 Node tempTerm(origTerm.getName(), 0, 1, 1, newTermCtr,
00210 true);
00211 tempTerm.addSubBlockIndex(origTerm.getIndex());
00212
00213
00214 //terminal propagation
00215 if(origTerm.getX() < minXLoc)
00216 termXLoc = 0;
00217 else if(origTerm.getX() > maxXLoc)
00218 termXLoc = reqdWidth;
00219 else
00220 termXLoc = origTerm.getX() - minXLoc;
00221
00222 if(origTerm.getY() < minYLoc)
00223 termYLoc = 0;
00224 else if(origTerm.getY() > maxYLoc)
00225 termYLoc = reqdHeight;
00226 else
00227 termYLoc = origTerm.getY() - minYLoc;
00228
00229 tempTerm.putX(termXLoc);
00230 tempTerm.putY(termYLoc);
00231
00232 _nodes->putNewTerm(tempTerm);
00233
00234 pin tempPin(origTerm.getName(), true, 0, 0, newNetCtr);
00235 tempPin.putNodeIndex(newTermCtr);
00236 tempEdge.addNode(tempPin);
00237 newTermCtr++;
00238 }
00239 }
00240 _nets->putNewNet(tempEdge);
00241 ++newNetCtr;
00242 tempEdge.clean();
00243 }
00244 }
00245 }
00246 _nodes->updatePinsInfo(*_nets);
00247 _nodes->initNodesFastPOAccess(*_nets, false);
00248 *_nodesBestCopy = *_nodes;
00249 }
|
Here is the call graph for this function:

|
|
Definition at line 77 of file DB.cxx. References _initArea, _nets, _nodes, _nodesBestCopy, _rowHeight, _siteSpacing, and successAR.
00078 {
00079 _nodes = new Nodes();
00080 _nets = new Nets();
00081 _nodesBestCopy = new Nodes();
00082
00083 _initArea = 0;
00084 successAR = 0;
00085 _rowHeight = 0;
00086 _siteSpacing = 0;
00087 }
|
|
||||||||||||
|
Definition at line 291 of file DB.cxx. References _area, _initArea, _nets, _nodes, _nodesBestCopy, _rowHeight, _siteSpacing, parquetfp::Net::addNode(), parquetfp::Net::getDegree(), parquetfp::Node::getName(), parquetfp::Net::getName(), parquetfp::Nets::getNet(), getNets(), parquetfp::Nodes::getNode(), getNodes(), parquetfp::Nets::getNumNets(), parquetfp::Nodes::getNumNodes(), parquetfp::Nodes::getTerminal(), parquetfp::Net::getWeight(), parquetfp::Nodes::initNodesFastPOAccess(), parquetfp::itNode, parquetfp::itNodePin, parquetfp::itPin, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::Net::pinsBegin(), parquetfp::Net::pinsEnd(), parquetfp::Net::putIndex(), parquetfp::Net::putName(), parquetfp::Nets::putNewNet(), parquetfp::pin::putNodeIndex(), parquetfp::Net::putWeight(), parquetfp::Nodes::terminalsBegin(), parquetfp::Nodes::terminalsEnd(), and parquetfp::Nodes::updatePinsInfo().
00292 {
00293 if(this != &db2)
00294 {
00295 /*
00296 if(_nodes) delete _nodes;
00297 if(_nets) delete _nets;
00298 if(_nodesBestCopy) delete _nodesBestCopy;
00299 */
00300 _nodes = new Nodes();
00301 _nets = new Nets();
00302 _nodesBestCopy = new Nodes();
00303
00304 *(_nodes) = *(db2.getNodes());
00305 *(_nodesBestCopy) = *(db2._nodesBestCopy);
00306
00307 _area = db2._area;
00308 _initArea = db2._initArea;
00309 _rowHeight = db2._rowHeight;
00310 _siteSpacing = db2._siteSpacing;
00311
00312 if(!compressDB)
00313 {
00314 *(_nets) = *(db2.getNets());
00315 }
00316 else
00317 {
00318 //any net connected to a macro or terminal is added as is
00319 //only nets between normal blocks are compressed
00320 int netCtr=0;
00321 Nets* oldNets = db2.getNets();
00322 Nodes* oldNodes = db2.getNodes();
00323 vector<bool> seenNets(oldNets->getNumNets(), false);
00324 for(itNode term=oldNodes->terminalsBegin();
00325 term != oldNodes->terminalsEnd(); ++term)
00326 {
00327 for(itNodePin pin=term->pinsBegin(); pin!=term->pinsEnd(); ++pin)
00328 {
00329 unsigned netId = pin->netIndex;
00330 if(!seenNets[netId])
00331 {
00332 Net& origNet = oldNets->getNet(netId);
00333 Net tempEdge;
00334 tempEdge.putName(origNet.getName());
00335 tempEdge.putIndex(netCtr);
00336 tempEdge.putWeight(origNet.getWeight());
00337 for(itPin netPin = origNet.pinsBegin();
00338 netPin != origNet.pinsEnd(); ++netPin)
00339 {
00340 unsigned currNodeIdx = netPin->getNodeIndex();
00341 double poffsetX = 0, poffsetY = 0;
00342 poffsetX = netPin->getXOffset();
00343 poffsetY = netPin->getYOffset();
00344 if(!netPin->getType())
00345 {
00346 Node& oldNode = oldNodes->getNode(currNodeIdx);
00347 parquetfp::pin tempPin(oldNode.getName(), false, poffsetX,
00348 poffsetY, netCtr);
00349 tempPin.putNodeIndex(currNodeIdx);
00350 tempEdge.addNode(tempPin);
00351 }
00352 else
00353 {
00354 Node& oldTerm = oldNodes->getTerminal(currNodeIdx);
00355 parquetfp::pin tempPin(oldTerm.getName(), true, poffsetX,
00356 poffsetY, netCtr);
00357 tempPin.putNodeIndex(currNodeIdx);
00358 tempEdge.addNode(tempPin);
00359 }
00360 }
00361 seenNets[netId] = true;
00362 _nets->putNewNet(tempEdge);
00363 ++netCtr;
00364 }
00365 }
00366 }
00367
00368 for(itNode node=oldNodes->nodesBegin();
00369 node != oldNodes->nodesEnd(); ++node)
00370 {
00371 for(itNodePin pin=node->pinsBegin(); pin!=node->pinsEnd(); ++pin)
00372 {
00373 unsigned netId = pin->netIndex;
00374 Net& origNet = oldNets->getNet(netId);
00375 if(!seenNets[netId]
00376 /*&& ( node->isMacro() || origNet.getDegree() > 2)*/)
00377 {
00378 Net tempEdge;
00379 bool atleast1PinOffsetNotZero=false;
00380 tempEdge.putName(origNet.getName());
00381 tempEdge.putIndex(netCtr);
00382 tempEdge.putWeight(origNet.getWeight());
00383 for(itPin netPin = origNet.pinsBegin();
00384 netPin != origNet.pinsEnd(); ++netPin)
00385 {
00386 unsigned currNodeIdx = netPin->getNodeIndex();
00387 double poffsetX = 0, poffsetY = 0;
00388 poffsetX = netPin->getXOffset();
00389 poffsetY = netPin->getYOffset();
00390 if(!(fabs(poffsetX-0) < 1e-5 && fabs(poffsetY-0) < 1e-5))
00391 atleast1PinOffsetNotZero = true;
00392
00393 if(!netPin->getType())
00394 {
00395 Node& oldNode = oldNodes->getNode(currNodeIdx);
00396 parquetfp::pin tempPin(oldNode.getName(), false, poffsetX,
00397 poffsetY, netCtr);
00398 tempPin.putNodeIndex(currNodeIdx);
00399 tempEdge.addNode(tempPin);
00400 }
00401 else
00402 {
00403 Node& oldTerm = oldNodes->getTerminal(currNodeIdx);
00404 parquetfp::pin tempPin(oldTerm.getName(), true, poffsetX,
00405 poffsetY, netCtr);
00406 tempPin.putNodeIndex(currNodeIdx);
00407 tempEdge.addNode(tempPin);
00408 }
00409 }
00410 if(atleast1PinOffsetNotZero || origNet.getDegree()>2)
00411 {
00412 seenNets[netId] = true;
00413 _nets->putNewNet(tempEdge);
00414 ++netCtr;
00415 }
00416 }
00417 }
00418 }
00419
00420 //now add the compressing code
00421 vector< vector< pair<unsigned,double> > > nodeConnections(oldNodes->getNumNodes());
00422
00423 for(itNode node=oldNodes->nodesBegin();
00424 node != oldNodes->nodesEnd(); ++node)
00425 {
00426 //if(!node->isMacro())
00427 {
00428 unsigned currNodeIdx = node->getIndex();
00429
00430 for(itNodePin pin=node->pinsBegin(); pin!=node->pinsEnd(); ++pin)
00431 {
00432 unsigned netId = pin->netIndex;
00433 Net& origNet = oldNets->getNet(netId);
00434 if(!seenNets[netId] && origNet.getDegree() == 2)
00435 {
00436 for(itPin netPin = origNet.pinsBegin();
00437 netPin != origNet.pinsEnd(); ++netPin)
00438 {
00439 unsigned nextNodeIdx = netPin->getNodeIndex();
00440 //following cond ensures that we go over each
00441 //net only once
00442 if(nextNodeIdx > currNodeIdx)
00443 {
00444 pair<unsigned, double> elem(nextNodeIdx, origNet.getWeight());
00445 nodeConnections[currNodeIdx].push_back(elem);
00446 }
00447 }
00448 }
00449 }
00450 }
00451 }
00452
00453 for(unsigned i=0; i<nodeConnections.size(); ++i)
00454 std::sort(nodeConnections[i].begin(), nodeConnections[i].end(), sortFnPairFirst());
00455
00456 char netName [100];
00457 for(int i=0; i<int(nodeConnections.size()); ++i)
00458 {
00459 int j=0;
00460 while(j<int(nodeConnections[i].size()))
00461 {
00462 unsigned numConn=1;
00463 double sumOfWts=nodeConnections[i][j].second;
00464 if(j != (int(nodeConnections[i].size())-1))
00465 {
00466 while(j<(int(nodeConnections[i].size())-1) &&
00467 nodeConnections[i][j].first == nodeConnections[i][j+1].first)
00468 {
00469 ++numConn;
00470 ++j;
00471 sumOfWts+=nodeConnections[i][j].second;
00472 }
00473 }
00474
00475 Net tempEdge;
00476 sprintf(netName, "clusteredNet_%d",netCtr);
00477 tempEdge.putName(netName);
00478 tempEdge.putIndex(netCtr);
00479 double poffsetX = 0, poffsetY = 0;
00480 Node& node1 = _nodes->getNode(i);
00481 Node& node2 = _nodes->getNode(nodeConnections[i][j].first);
00482
00483 pin tempPin1(node1.getName(), false, poffsetX,
00484 poffsetY, netCtr);
00485 tempPin1.putNodeIndex(i);
00486 tempEdge.addNode(tempPin1);
00487
00488 pin tempPin2(node2.getName(), false, poffsetX,
00489 poffsetY, netCtr);
00490 tempPin2.putNodeIndex(nodeConnections[i][j].first);
00491 tempEdge.addNode(tempPin2);
00492
00493 //tempEdge.putWeight(numConn);
00494 tempEdge.putWeight(sumOfWts);
00495 _nets->putNewNet(tempEdge);
00496
00497 ++netCtr;
00498 ++j;
00499 }
00500 }
00501 //_nets->updateNodeInfo(*_nodes);
00502 _nodes->updatePinsInfo(*_nets);
00503 _nodes->initNodesFastPOAccess(*_nets, false);
00504
00505 /*
00506 cout<<"Initial #Nets "<<oldNets->getNumNets()<<" Initial #Pins "
00507 <<oldNets->getNumPins()<<" Compressed #Nets "<<_nets->getNumNets()
00508 <<" Compressed #Pins "<<_nets->getNumPins()<<endl;
00509 */
00510 }
00511 }
00512 }
|
Here is the call graph for this function:

|
|
Definition at line 251 of file DB.cxx. References _nets, _nodes, and _nodesBestCopy.
00252 {
00253 if(_nodes) delete _nodes;
00254 if(_nets) delete _nets;
00255 if(_nodesBestCopy) delete _nodesBestCopy;
00256 }
|
|
|
Definition at line 515 of file DB.cxx. References _nets, _nodes, _nodesBestCopy, parquetfp::Nets::clean(), and parquetfp::Nodes::clean().
00516 {
00517 if(_nodes) _nodes->clean();
00518 if(_nets) _nets->clean();
00519 if(_nodesBestCopy) _nodesBestCopy->clean();
00520 }
|
Here is the call graph for this function:

|
|
Definition at line 675 of file DB.cxx. References Corner, evalHPWL(), getNumNodes(), getXLocs(), getYLocs(), NUM_CORNERS, packToCorner(), toString(), and updatePlacement().
00676 {
00677 const vector<double> origXLocs(getXLocs());
00678 const vector<double> origYLocs(getYLocs());
00679
00680 vector< vector<double> > xlocsAt(NUM_CORNERS,
00681 vector<double>(getNumNodes()));
00682 vector< vector<double> > ylocsAt(NUM_CORNERS,
00683 vector<double>(getNumNodes()));
00684 packToCorner(xlocsAt, ylocsAt);
00685
00686 static int ORIGINAL = -1;
00687 int minCorner = ORIGINAL;
00688 double minHPWL = evalHPWL();
00689 cout << "Original HPWL: " << minHPWL << endl;
00690
00691 for (unsigned i = 0; i < NUM_CORNERS; i++)
00692 {
00693 updatePlacement(xlocsAt[i], ylocsAt[i]);
00694
00695 double currHPWL = evalHPWL();
00696 if (currHPWL < minHPWL)
00697 {
00698 minHPWL = currHPWL;
00699 minCorner = i;
00700 }
00701 cout << toString(Corner(i)) << " HPWL: " << currHPWL << endl;
00702 }
00703 cout << "minimum HPWL: " << minHPWL;
00704 if (minCorner == ORIGINAL)
00705 cout << " in the original position." << endl;
00706 else
00707 cout << " at " << toString(Corner(minCorner)) << endl;
00708
00709 cout << "packing design towards "
00710 << ((minCorner==ORIGINAL)
00711 ? string("the original position")
00712 : toString(Corner(minCorner))) << endl;
00713 if (minCorner == ORIGINAL)
00714 updatePlacement(origXLocs, origYLocs);
00715 else
00716 updatePlacement(xlocsAt[minCorner], ylocsAt[minCorner]);
00717 cout << "final HPWL: " << evalHPWL() << endl;
00718 }
|
Here is the call graph for this function:

|
|
Definition at line 1037 of file DB.cxx. References parquetfp::BBox::getXSize(), parquetfp::BBox::getYSize(), parquetfp::itNode, parquetfp::BBox::put(), parquetfp::Point::x, and parquetfp::Point::y.
01038 {
01039 BBox area;
01040 itNode node;
01041 Point P;
01042 for(node = const_cast<DB*>(this)->getNodes()->nodesBegin();
01043 node != const_cast<DB*>(this)->getNodes()->nodesEnd(); ++node)
01044 {
01045 P.x = node->getX();
01046 P.y = node->getY();
01047 area.put(P);
01048 P.x = node->getX()+node->getWidth();
01049 P.y = node->getY()+node->getHeight();
01050 area.put(P);
01051 }
01052 return(area.getXSize()*area.getYSize());
01053 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 977 of file DB.cxx. References _nets, _nodes, parquetfp::BBox::clear(), parquetfp::Node::getHeight(), parquetfp::BBox::getHPWL(), parquetfp::Nodes::getNode(), parquetfp::Nodes::getTerminal(), parquetfp::Node::getWidth(), parquetfp::Node::getX(), parquetfp::Node::getY(), parquetfp::BBox::isValid(), parquetfp::itNet, parquetfp::itPin, parquetfp::Nets::netsBegin(), parquetfp::Nets::netsEnd(), parquetfp::BBox::put(), parquetfp::Point::x, and parquetfp::Point::y.
00978 {
00979 itNet net;
00980 itPin pin;
00981 unsigned nodeIndex;
00982 BBox netBBox;
00983 Point tempPoint;
00984 double HPWL=0;
00985 double width;
00986 double height;
00987 double absOffsetX;
00988 double absOffsetY;
00989 double xloc;
00990 double yloc;
00991
00992 for(net = _nets->netsBegin(); net != _nets->netsEnd(); ++net)
00993 {
00994 for(pin = net->pinsBegin(); pin != net->pinsEnd(); ++pin)
00995 {
00996 nodeIndex = pin->getNodeIndex();
00997 if(!pin->getType()) //if not terminal
00998 {
00999 Node& node = _nodes->getNode(nodeIndex);
01000 width = node.getWidth();
01001 height = node.getHeight();
01002 xloc = node.getX();
01003 yloc = node.getY();
01004 }
01005 else
01006 {
01007 Node& node = _nodes->getTerminal(nodeIndex);
01008 width = node.getWidth();
01009 height = node.getHeight();
01010 xloc = node.getX();
01011 yloc = node.getY();
01012 if(xloc > xSize)
01013 xloc = xSize;
01014 if(yloc > ySize)
01015 yloc = ySize;
01016 }
01017 absOffsetX = 0.5*width + (pin->getXOffset()*width);
01018 absOffsetY = 0.5*height + (pin->getYOffset()*height);
01019
01020 tempPoint.x = xloc + absOffsetX;
01021 tempPoint.y = yloc + absOffsetY;
01022 netBBox.put(tempPoint);
01023 }
01024 if(netBBox.isValid())
01025 {
01026 //cout<<net->getName()<<" "<<netBBox.getHPWL()<<" "<<HPWL<<endl;
01027 if(useWts)
01028 HPWL += net->getWeight()*netBBox.getHPWL();
01029 else
01030 HPWL += netBBox.getHPWL();
01031 }
01032 netBBox.clear();
01033 }
01034 return HPWL;
01035 }
|
Here is the call graph for this function:

|
|
Definition at line 796 of file DB.cxx. References _nets, _nodes, parquetfp::Node::allPinsAtCenter, parquetfp::Node::getHeight(), parquetfp::Nodes::getNode(), parquetfp::Nodes::getTerminal(), parquetfp::Node::getWidth(), parquetfp::Node::getX(), parquetfp::Node::getY(), parquetfp::itNet, parquetfp::itPin, parquetfp::Nets::netsBegin(), parquetfp::Nets::netsEnd(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by BTreeAreaWireAnnealer::anneal(), parquetfp::Annealer::anneal(), cornerOptimizeDesign(), BTreeAreaWireAnnealer::go(), parquetfp::Annealer::go(), BTreeAreaWireAnnealer::packOneBlock(), and shiftOptimizeDesign().
00797 {
00798 itNet net;
00799 itPin pin;
00800 unsigned nodeIndex;
00801 //BBox netBBox;
00802 Point tempPoint;
00803 double HPWL=0;
00804 double width;
00805 double height;
00806 double absOffsetX;
00807 double absOffsetY;
00808 double xloc;
00809 double yloc;
00810 Point llc;
00811 Point trc;
00812
00813 for(net = _nets->netsBegin(); net != _nets->netsEnd(); ++net)
00814 {
00815 llc.x=llc.y=1e306;
00816 trc.x=trc.y=-1e306;
00817 unsigned netDegree = net->getDegree();
00818 if(netDegree <= 1)
00819 continue;
00820 else if(netDegree == 2)//special casing for 2 pin nets
00821 {
00822 itPin pin1 = net->pinsBegin();
00823 itPin pin2 = pin1+1;
00824
00825 unsigned nodeIndex1 = pin1->getNodeIndex();
00826 unsigned nodeIndex2 = pin2->getNodeIndex();
00827
00828 if(!pin1->getType()) //if not terminal
00829 {
00830 Node& node = _nodes->getNode(nodeIndex1);
00831 width = node.getWidth();
00832 height = node.getHeight();
00833 xloc = node.getX();
00834 yloc = node.getY();
00835
00836 if(!node.allPinsAtCenter)
00837 {
00838 absOffsetX = 0.5*width + (pin1->getXOffset()*width);
00839 absOffsetY = 0.5*height + (pin1->getYOffset()*height);
00840 llc.x = xloc + absOffsetX;
00841 llc.y = yloc + absOffsetY;
00842 }
00843 else
00844 {
00845 llc.x = xloc + 0.5*width;
00846 llc.y = yloc + 0.5*height;
00847 }
00848 }
00849 else
00850 {
00851 Node& node = _nodes->getTerminal(nodeIndex1);
00852 width = node.getWidth();
00853 height = node.getHeight();
00854 xloc = node.getX();
00855 yloc = node.getY();
00856
00857 absOffsetX = 0.5*width + (pin1->getXOffset()*width);
00858 absOffsetY = 0.5*height + (pin1->getYOffset()*height);
00859 llc.x = xloc + absOffsetX;
00860 llc.y = yloc + absOffsetY;
00861 }
00862
00863 if(!pin2->getType()) //if not terminal
00864 {
00865 Node& node = _nodes->getNode(nodeIndex2);
00866 width = node.getWidth();
00867 height = node.getHeight();
00868 xloc = node.getX();
00869 yloc = node.getY();
00870
00871 if(!node.allPinsAtCenter)
00872 {
00873 absOffsetX = 0.5*width + (pin2->getXOffset()*width);
00874 absOffsetY = 0.5*height + (pin2->getYOffset()*height);
00875 trc.x = xloc + absOffsetX;
00876 trc.y = yloc + absOffsetY;
00877 }
00878 else
00879 {
00880 trc.x = xloc + 0.5*width;
00881 trc.y = yloc + 0.5*height;
00882 }
00883 }
00884 else
00885 {
00886 Node& node = _nodes->getTerminal(nodeIndex2);
00887 width = node.getWidth();
00888 height = node.getHeight();
00889 xloc = node.getX();
00890 yloc = node.getY();
00891
00892 absOffsetX = 0.5*width + (pin2->getXOffset()*width);
00893 absOffsetY = 0.5*height + (pin2->getYOffset()*height);
00894 trc.x = xloc + absOffsetX;
00895 trc.y = yloc + absOffsetY;
00896 }
00897
00898 double swapVar;
00899 if(trc.x < llc.x )
00900 {
00901 swapVar = llc.x;
00902 llc.x = trc.x;
00903 trc.x = swapVar;
00904 }
00905 if(trc.y < llc.y )
00906 {
00907 swapVar = llc.y;
00908 llc.y = trc.y;
00909 trc.y = swapVar;
00910 }
00911 }
00912 else
00913 {
00914 for(pin = net->pinsBegin(); pin != net->pinsEnd(); ++pin)
00915 {
00916 nodeIndex = pin->getNodeIndex();
00917 if(!pin->getType()) //if not terminal
00918 {
00919 Node& node = _nodes->getNode(nodeIndex);
00920 width = node.getWidth();
00921 height = node.getHeight();
00922 xloc = node.getX();
00923 yloc = node.getY();
00924
00925 if(!node.allPinsAtCenter)
00926 {
00927 absOffsetX = 0.5*width + (pin->getXOffset()*width);
00928 absOffsetY = 0.5*height + (pin->getYOffset()*height);
00929 tempPoint.x = xloc + absOffsetX;
00930 tempPoint.y = yloc + absOffsetY;
00931 }
00932 else
00933 {
00934 tempPoint.x = xloc + 0.5*width;
00935 tempPoint.y = yloc + 0.5*height;
00936 }
00937 }
00938 else
00939 {
00940 Node& node = _nodes->getTerminal(nodeIndex);
00941 width = node.getWidth();
00942 height = node.getHeight();
00943 xloc = node.getX();
00944 yloc = node.getY();
00945
00946 absOffsetX = 0.5*width + (pin->getXOffset()*width);
00947 absOffsetY = 0.5*height + (pin->getYOffset()*height);
00948 tempPoint.x = xloc + absOffsetX;
00949 tempPoint.y = yloc + absOffsetY;
00950 }
00951 //netBBox.put(tempPoint);
00952
00953 if(tempPoint.x < llc.x)
00954 llc.x = tempPoint.x;
00955 if(tempPoint.x > trc.x)
00956 trc.x = tempPoint.x;
00957 if(tempPoint.y < llc.y)
00958 llc.y = tempPoint.y;
00959 if(tempPoint.y > trc.y)
00960 trc.y = tempPoint.y;
00961 }
00962 }
00963
00964 //if(netDegree > 1)
00965 if(useWts)
00966 HPWL += net->getWeight()*(trc.x-llc.x + trc.y-llc.y);
00967 else
00968 HPWL += (trc.x-llc.x + trc.y-llc.y);
00969
00970 //if(netBBox.isValid())
00971 //HPWL += netBBox.getHPWL();
00972 //netBBox.clear();
00973 }
00974 return HPWL;
00975 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 1399 of file DB.cxx. References getNodes(), getXSize(), getYSize(), parquetfp::itNode, parquetfp::Nodes::nodesBegin(), and parquetfp::Nodes::nodesEnd().
01400 {
01401 double currWidth = getXSize();
01402 double currHeight = getYSize();
01403 if(currWidth > maxWidth && currHeight > maxHeight)
01404 return;
01405
01406 double xExpRatio=1;
01407 double yExpRatio=1;
01408
01409 if(currWidth < maxWidth)
01410 xExpRatio = maxWidth/currWidth;
01411 if(currHeight < maxHeight)
01412 yExpRatio = maxHeight/currHeight;
01413
01414 itNode node;
01415 double newLoc;
01416 for(node = getNodes()->nodesBegin(); node != getNodes()->nodesEnd(); ++node)
01417 {
01418 newLoc = node->getX()*xExpRatio;
01419 node->putX(newLoc);
01420 newLoc = node->getY()*yExpRatio;
01421 node->putY(newLoc);
01422 }
01423 }
|
Here is the call graph for this function:

|
|
Definition at line 752 of file DB.cxx. References _nodes, getNumNodes(), parquetfp::itNode, parquetfp::Nodes::nodesBegin(), and parquetfp::Nodes::nodesEnd(). Referenced by parquetfp::ClusterDB::clusterMulti(), and parquetfp::ClusterDB::clusterMultiPhysical().
00753 {
00754 itNode node;
00755 double avgHeight = 0;
00756 for(node = _nodes->nodesBegin(); node != _nodes->nodesEnd(); ++node)
00757 avgHeight += node->getHeight();
00758 avgHeight /= getNumNodes();
00759 return(avgHeight);
00760 }
|
Here is the call graph for this function:

|
|
Definition at line 553 of file DB.cxx. References _nodes, parquetfp::Nodes::getXLocs(), parquetfp::Nodes::getYLocs(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by packToCorner(), and shiftOptimizeDesign().
00554 {
00555 vector<double> nodesXLocs(_nodes->getXLocs());
00556 vector<double> nodesYLocs(_nodes->getYLocs());
00557
00558 vector<double>::iterator xMin = min_element(nodesXLocs.begin(),
00559 nodesXLocs.end());
00560 vector<double>::iterator yMin = min_element(nodesYLocs.begin(),
00561 nodesYLocs.end());
00562
00563 Point bottomLeft;
00564 bottomLeft.x = *xMin;
00565 bottomLeft.y = *yMin;
00566 return bottomLeft;
00567 }
|
Here is the call graph for this function:

|
|
|
Definition at line 250 of file DB.h. References getNodeHeight(), and getNodeWidth().
00251 { return getNodeWidth(index) / getNodeHeight(index); }
|
Here is the call graph for this function:

|
|
Definition at line 226 of file DB.h. References getNodeHeight(), and getNodeWidth(). Referenced by setNodeAR().
00227 { return getNodeWidth(index) * getNodeHeight(index); }
|
Here is the call graph for this function:

|
|
Definition at line 232 of file DB.h. References _nodes, and parquetfp::Nodes::getNodeHeight(). Referenced by getNodeAR(), and getNodeArea().
00233 { return _nodes->getNodeHeight(index); }
|
Here is the call graph for this function:

|
|
Definition at line 538 of file DB.cxx. References _nodes, and parquetfp::Nodes::getNodeHeights(). Referenced by packToCorner(), BTreeAreaWireAnnealer::takePlfromDB(), and parquetfp::Annealer::takeSPfromDB().
00539 {
00540 return _nodes->getNodeHeights();
00541 }
|
Here is the call graph for this function:

|
|
Definition at line 247 of file DB.h. References _nodes, and parquetfp::Nodes::getNode(). Referenced by isNodeSoft().
00248 { return (_nodes->getNode(index)).getmaxAR(); }
|
Here is the call graph for this function:

|
|
Definition at line 244 of file DB.h. References _nodes, and parquetfp::Nodes::getNode(). Referenced by isNodeSoft().
00245 { return (_nodes->getNode(index)).getminAR(); }
|
Here is the call graph for this function:

|
|
|
Definition at line 720 of file DB.cxx. References _area, _initArea, _nodes, and parquetfp::Nodes::getNodesArea(). Referenced by BTreeAreaWireAnnealer::anneal(), parquetfp::Annealer::anneal(), parquetfp::ClusterDB::cluster1Layer(), parquetfp::SolveMulti::go(), plot(), BaseAnnealer::postHPWLOpt(), BaseAnnealer::printResults(), reduceCoreCellsArea(), and parquetfp::AnalytSolve::solveSOR().
|
Here is the call graph for this function:

|
|
Definition at line 229 of file DB.h. References _nodes, and parquetfp::Nodes::getNodeWidth(). Referenced by getNodeAR(), and getNodeArea().
00230 { return _nodes->getNodeWidth(index); }
|
Here is the call graph for this function:

|
|
Definition at line 533 of file DB.cxx. References _nodes, and parquetfp::Nodes::getNodeWidths(). Referenced by packToCorner(), BTreeAreaWireAnnealer::takePlfromDB(), and parquetfp::Annealer::takeSPfromDB().
00534 {
00535 return _nodes->getNodeWidths();
00536 }
|
Here is the call graph for this function:

|
|
Definition at line 528 of file DB.cxx. References _nodes, and parquetfp::Nodes::getNumNodes(). Referenced by parquetfp::Annealer::anneal(), parquetfp::ClusterDB::clusterMulti(), parquetfp::ClusterDB::clusterMultiPhysical(), cornerOptimizeDesign(), getAvgHeight(), parquetfp::SolveMulti::go(), packToCorner(), and parquetfp::SolveMulti::placeSubBlocks().
00529 {
00530 return _nodes->getNumNodes();
00531 }
|
Here is the call graph for this function:

|
|
Definition at line 1693 of file DB.cxx. References _nets, _nodes, abkwarn, parquetfp::Nets::getNet(), parquetfp::Net::getPin(), parquetfp::Nodes::getTerm(), parquetfp::Node::getX(), parquetfp::pin::getXOffset(), getXSize(), parquetfp::Node::getY(), parquetfp::pin::getYOffset(), getYSize(), parquetfp::itNode, parquetfp::itNodePin, parquetfp::itPin, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::Net::pinsBegin(), and parquetfp::Net::pinsEnd(). Referenced by shiftOptimizeDesign().
01694 {
01695 double center = (horizontal)
01696 ? getXSize() / 2 : getYSize() / 2;
01697
01698 vector<double> endPoints;
01699 for (itNode currBlk = _nodes->nodesBegin();
01700 currBlk != _nodes->nodesEnd(); currBlk++)
01701 {
01702 double currNodeLength = (horizontal)
01703 ? currBlk->getWidth() : currBlk->getHeight();
01704
01705 double currNodeLocAbs = (horizontal)
01706 ? currBlk->getX() : currBlk->getY();
01707
01708 for (itNodePin currNodePin = currBlk->pinsBegin();
01709 currNodePin != currBlk->pinsEnd(); currNodePin++)
01710 {
01711 // find the net in which this pin lies
01712 unsigned currNetIndex = currNodePin->netIndex;
01713 Net& currNet = _nets->getNet(currNetIndex);
01714
01715 // index number for the pin in its net
01716 unsigned currPinOffset = currNodePin->pinOffset;
01717
01718 // pins offset from the center
01719 double pinOffset = (horizontal)
01720 ? currNet.getPin(currPinOffset).getXOffset()
01721 : currNet.getPin(currPinOffset).getYOffset();
01722
01723 // absolute location of the pin
01724 double pinLocationAbs =
01725 currNodeLocAbs +
01726 currNodeLength/2 + (currNodeLength * pinOffset);
01727
01728 // relative location wrt center of the FLOORPLAN
01729 double pinLocationWrtCenter = pinLocationAbs - center;
01730
01731 // span of the net in this direction wrt this pin
01732 double spanStart = 1e90;
01733 double spanEnd = -1e90;
01734
01735 for (itPin currPad = currNet.pinsBegin();
01736 currPad != currNet.pinsEnd(); currPad++)
01737 {
01738 if (currPad->getType()) // true: pad/terminal
01739 {
01740 int padIndex = currPad->getNodeIndex();
01741 Node& currTerm = _nodes->getTerm(padIndex);
01742
01743 double padLoc = (horizontal)
01744 ? currTerm.getX() : currTerm.getY();
01745
01746 double padAdjusted = padLoc - pinLocationWrtCenter;
01747
01748 spanStart = min(spanStart, padAdjusted);
01749 spanEnd = max(spanEnd, padAdjusted);
01750 }
01751 } // end for each pin in currNet
01752
01753 if (spanStart <= spanEnd)
01754 {
01755 endPoints.push_back(spanStart);
01756 endPoints.push_back(spanEnd);
01757 }
01758 } // end for each pin in currNode
01759 } // end for each node
01760
01761 sort(endPoints.begin(), endPoints.end());
01762
01763 // return the median, assuming endPoints[] has even size
01764 int endPointNum = endPoints.size();
01765 if(endPointNum < 2)
01766 {
01767 abkwarn(0,"Could not find optimal ranges.");
01768 return 0;
01769 }
01770 abkwarn(endPointNum % 2 == 0, "size of endPoints is not even.");
01771 return (endPoints[(endPointNum/2) - 1] + endPoints[endPointNum/2]) / 2;
01772 }
|
Here is the call graph for this function:

|
|
Definition at line 241 of file DB.h. References _nodes, parquetfp::Nodes::getNode(), and parquetfp::ORIENT.
00242 { return (_nodes->getNode(index)).getOrient(); }
|
Here is the call graph for this function:

|
|
Definition at line 732 of file DB.cxx. References _rowHeight.
00733 {
00734 return _rowHeight;
00735 }
|
|
|
Definition at line 737 of file DB.cxx. References _siteSpacing.
00738 {
00739 return _siteSpacing;
00740 }
|
|
|
Definition at line 569 of file DB.cxx. References _nodes, parquetfp::Nodes::getNodeHeight(), parquetfp::Nodes::getNodeWidth(), parquetfp::Nodes::getNumNodes(), parquetfp::Nodes::getXLocs(), parquetfp::Nodes::getYLocs(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by packToCorner(), and shiftOptimizeDesign().
00570 {
00571 vector<double> nodesXLocs(_nodes->getXLocs());
00572 vector<double> nodesYLocs(_nodes->getYLocs());
00573 for (unsigned int i = 0; i < _nodes->getNumNodes(); i++)
00574 {
00575 nodesXLocs[i] += _nodes->getNodeWidth(i);
00576 nodesYLocs[i] += _nodes->getNodeHeight(i);
00577 }
00578
00579 vector<double>::iterator xMax = max_element(nodesXLocs.begin(),
00580 nodesXLocs.end());
00581 vector<double>::iterator yMax = max_element(nodesYLocs.begin(),
00582 nodesYLocs.end());
00583
00584 Point topRight;
00585 topRight.x = *xMax;
00586 topRight.y = *yMax;
00587 return topRight;
00588 }
|
Here is the call graph for this function:

|
|
Definition at line 235 of file DB.h. References _nodes, and parquetfp::Nodes::getNode().
00236 { return (_nodes->getNode(index)).getX(); }
|
Here is the call graph for this function:

|
|
Definition at line 543 of file DB.cxx. References _nodes, and parquetfp::Nodes::getXLocs(). Referenced by cornerOptimizeDesign(), packToCorner(), parquetfp::AnalytSolve::solveSOR(), BTreeAreaWireAnnealer::takePlfromDB(), and parquetfp::Annealer::takeSPfromDB().
00544 {
00545 return _nodes->getXLocs();
00546 }
|
Here is the call graph for this function:

|
|
Definition at line 1493 of file DB.cxx. References _nodes, parquetfp::itNode, parquetfp::Nodes::nodesBegin(), and parquetfp::Nodes::nodesEnd().
01494 {
01495 //double xMin = DBL_MAX;
01496 double xMax = -1e20;
01497 itNode node;
01498 double value;
01499 bool valid=false;
01500 for(node = _nodes->nodesBegin(); node != _nodes->nodesEnd(); ++node)
01501 {
01502 if(node->isMacro())
01503 {
01504 valid = true;
01505 //value = node->getY();
01506 //if(value < xMin)
01507 // xMin = value;
01508
01509 value = node->getX()+node->getWidth();
01510 if(value > xMax)
01511 xMax = value;
01512 }
01513 }
01514 if(valid)
01515 return (xMax);
01516 else
01517 return 0;
01518 }
|
Here is the call graph for this function:

|
|
Definition at line 1055 of file DB.cxx. References parquetfp::BBox::getXSize(), parquetfp::itNode, parquetfp::BBox::put(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by parquetfp::ClusterDB::clusterMultiPhysical(), expandDesign(), getOptimalRangeStart(), parquetfp::SolveMulti::go(), parquetfp::SolveMulti::placeSubBlocks(), shiftOptimizeDesign(), and parquetfp::SolveMulti::updatePlaceUnCluster().
01056 {
01057 BBox xSize;
01058 itNode node;
01059 Point P;
01060 for(node = const_cast<DB*>(this)->getNodes()->nodesBegin();
01061 node != const_cast<DB*>(this)->getNodes()->nodesEnd(); ++node)
01062 {
01063 P.x = node->getX();
01064 P.y = 0;
01065 xSize.put(P);
01066 P.x = node->getX()+node->getWidth();
01067 P.y = 0;
01068 xSize.put(P);
01069 }
01070 return(xSize.getXSize());
01071 }
|
Here is the call graph for this function:

|
|
Definition at line 1520 of file DB.cxx. References _nodes, parquetfp::BBox::getXSize(), parquetfp::BBox::isValid(), parquetfp::itNode, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::BBox::put(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by BTreeAreaWireAnnealer::anneal(), parquetfp::Annealer::anneal(), parquetfp::SolveMulti::go(), and BaseAnnealer::printResults().
01521 {
01522
01523 BBox xSize;
01524 itNode node;
01525 Point P;
01526 for(node = _nodes->nodesBegin(); node != _nodes->nodesEnd(); ++node)
01527 {
01528 if(node->isMacro())
01529 {
01530 P.x = node->getX();
01531 P.y = 0;
01532 xSize.put(P);
01533 P.x = node->getX()+node->getWidth();
01534 P.y = 0;
01535 xSize.put(P);
01536 }
01537 }
01538 if(xSize.isValid())
01539 return (xSize.getXSize());
01540 else
01541 return 0;
01542 }
|
Here is the call graph for this function:

|
|
Definition at line 238 of file DB.h. References _nodes, and parquetfp::Nodes::getNode().
00239 { return (_nodes->getNode(index)).getY(); }
|
Here is the call graph for this function:

|
|
Definition at line 548 of file DB.cxx. References _nodes, and parquetfp::Nodes::getYLocs(). Referenced by cornerOptimizeDesign(), packToCorner(), parquetfp::AnalytSolve::solveSOR(), BTreeAreaWireAnnealer::takePlfromDB(), and parquetfp::Annealer::takeSPfromDB().
00549 {
00550 return _nodes->getYLocs();
00551 }
|
Here is the call graph for this function:

|
|
Definition at line 1544 of file DB.cxx. References _nodes, parquetfp::itNode, parquetfp::Nodes::nodesBegin(), and parquetfp::Nodes::nodesEnd().
01545 {
01546 //double yMin = DBL_MAX;
01547 double yMax = -1e20;
01548 itNode node;
01549 double value;
01550 bool valid=false;
01551 for(node = _nodes->nodesBegin(); node != _nodes->nodesEnd(); ++node)
01552 {
01553 if(node->isMacro())
01554 {
01555 valid = true;
01556 //value = node->getY();
01557 //if(value < yMin)
01558 // yMin = value;
01559
01560 value = node->getY()+node->getHeight();
01561 if(value > yMax)
01562 yMax = value;
01563 }
01564 }
01565 if(valid)
01566 return (yMax);
01567 else
01568 return 0;
01569 }
|
Here is the call graph for this function:

|
|
Definition at line 1073 of file DB.cxx. References parquetfp::BBox::getYSize(), parquetfp::itNode, parquetfp::BBox::put(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by parquetfp::ClusterDB::clusterMultiPhysical(), expandDesign(), getOptimalRangeStart(), parquetfp::SolveMulti::go(), parquetfp::SolveMulti::placeSubBlocks(), shiftOptimizeDesign(), and parquetfp::SolveMulti::updatePlaceUnCluster().
01074 {
01075 BBox ySize;
01076 itNode node;
01077 Point P;
01078 for(node = const_cast<DB*>(this)->getNodes()->nodesBegin();
01079 node != const_cast<DB*>(this)->getNodes()->nodesEnd(); ++node)
01080 {
01081 P.y = node->getY();
01082 P.x = 0;
01083 ySize.put(P);
01084 P.y = node->getY()+node->getHeight();
01085 P.x = 0;
01086 ySize.put(P);
01087 }
01088 return(ySize.getYSize());
01089 }
|
Here is the call graph for this function:

|
|
Definition at line 1571 of file DB.cxx. References _nodes, parquetfp::BBox::getYSize(), parquetfp::BBox::isValid(), parquetfp::itNode, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::BBox::put(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by BTreeAreaWireAnnealer::anneal(), parquetfp::Annealer::anneal(), parquetfp::SolveMulti::go(), and BaseAnnealer::printResults().
01572 {
01573 BBox ySize;
01574 itNode node;
01575 Point P;
01576 for(node = _nodes->nodesBegin(); node != _nodes->nodesEnd(); ++node)
01577 {
01578 if(node->isMacro())
01579 {
01580 P.y = node->getY();
01581 P.x = 0;
01582 ySize.put(P);
01583 P.y = node->getY()+node->getHeight();
01584 P.x = 0;
01585 ySize.put(P);
01586 }
01587 }
01588 if(ySize.isValid())
01589 return (ySize.getYSize());
01590 else
01591 return 0;
01592 }
|
Here is the call graph for this function:

|
|
Definition at line 776 of file DB.cxx. References _nodes, parquetfp::itNode, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by parquetfp::SolveMulti::placeSubBlocks().
|
Here is the call graph for this function:

|
|
Definition at line 253 of file DB.h. References _nodes, and parquetfp::Nodes::getNode().
00254 { return (_nodes->getNode(index)).isMacro(); }
|
Here is the call graph for this function:

|
|
Definition at line 262 of file DB.h. References isNodeSoft().
00263 { return !isNodeSoft(index); }
|
Here is the call graph for this function:

|
|
Definition at line 259 of file DB.h. References getNodeMaxAR(), and getNodeMinAR(). Referenced by isNodeHard().
00260 { return getNodeMaxAR(index) - getNodeMinAR(index) > 1e-6; }
|
Here is the call graph for this function:

|
|
Definition at line 256 of file DB.h. References _nodes, and parquetfp::Nodes::getNode().
00257 { return (_nodes->getNode(index)).isOrientFixed(); }
|
Here is the call graph for this function:

|
|
Definition at line 1448 of file DB.cxx. References _nodes, parquetfp::itNode, parquetfp::Nodes::nodesBegin(), and parquetfp::Nodes::nodesEnd(). Referenced by parquetfp::ClusterDB::clusterMulti(), and parquetfp::ClusterDB::clusterMultiPhysical().
|
Here is the call graph for this function:

|
|
Definition at line 258 of file DB.cxx. References _area, _initArea, _nets, _nodes, _nodesBestCopy, _rowHeight, _siteSpacing, getNets(), and getNodes().
00259 {
00260 if(this != &db2)
00261 {
00262 if(_nodes) delete _nodes;
00263 if(_nets) delete _nets;
00264 if(_nodesBestCopy) delete _nodesBestCopy;
00265
00266 _nodes = new Nodes();
00267 _nets = new Nets();
00268 _nodesBestCopy = new Nodes();
00269
00270 *(_nodes) = *(db2.getNodes());
00271 *(_nets) = *(db2.getNets());
00272 *(_nodesBestCopy) = *(db2._nodesBestCopy);
00273
00274 _area = db2._area;
00275 _initArea = db2._initArea;
00276 _rowHeight = db2._rowHeight;
00277 _siteSpacing = db2._siteSpacing;
00278 }
00279 return *this;
00280 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 590 of file DB.cxx. References BOTTOM_LEFT, BOTTOM_RIGHT, getBottomLeftCorner(), getNodeHeights(), getNodeWidths(), getNumNodes(), getTopRightCorner(), getXLocs(), getYLocs(), TOP_LEFT, TOP_RIGHT, parquetfp::Point::x, and parquetfp::Point::y. Referenced by cornerOptimizeDesign().
00592 {
00593 const Point topRightCorner(getTopRightCorner());
00594 const Point bottomLeftCorner(getBottomLeftCorner());
00595
00596 const vector<double> xlocs(getXLocs());
00597 const vector<double> ylocs(getYLocs());
00598 const vector<double> widths(getNodeWidths());
00599 const vector<double> heights(getNodeHeights());
00600
00601 // naive FP representation independent way of determining slacks
00602 vector<double> xRightSlacks(getNumNodes());
00603 vector<double> xLeftSlacks(getNumNodes());
00604
00605 vector<double> yTopSlacks(getNumNodes());
00606 vector<double> yBottomSlacks(getNumNodes());
00607 for (unsigned i = 0; i < getNumNodes(); i++)
00608 {
00609 xRightSlacks[i] = topRightCorner.x - xlocs[i] - widths[i];
00610 xLeftSlacks[i] = xlocs[i] - bottomLeftCorner.x;
00611
00612 yTopSlacks[i] = topRightCorner.y - ylocs[i] - heights[i];
00613 yBottomSlacks[i] = ylocs[i] - bottomLeftCorner.y;
00614
00615 for (unsigned j = 0; j < getNumNodes(); j++)
00616 {
00617 if (i != j)
00618 {
00619 // have x-overlap
00620 if ((xlocs[i] < xlocs[j] + widths[j])
00621 && (xlocs[j] < xlocs[i] + widths[i]))
00622 {
00623 if (ylocs[j] > ylocs[i])
00624 {
00625 // [j] is above [i]
00626 yTopSlacks[i] = min(yTopSlacks[i],
00627 ylocs[j] - (ylocs[i]+heights[i]));
00628 }
00629 else
00630 {
00631 // [j] is below [i]
00632 yBottomSlacks[i] = min(yBottomSlacks[i],
00633 ylocs[i] - (ylocs[j]+heights[j]));
00634 }
00635 }
00636
00637 // have y-overlap
00638 if ((ylocs[i] < ylocs[j] + heights[j])
00639 && (ylocs[j] < ylocs[i] + heights[i]))
00640 {
00641 if (xlocs[j] > xlocs[i])
00642 {
00643 // [j] is right of [i]
00644 xRightSlacks[i] = min(xRightSlacks[i],
00645 xlocs[j] - (xlocs[i]+widths[i]));
00646 }
00647 else
00648 {
00649 // [j] is left of [i]
00650 xLeftSlacks[i] = min(xLeftSlacks[i],
00651 xlocs[i] - (xlocs[j]+widths[j]));
00652 }
00653 }
00654 }
00655 }
00656 }
00657
00658 // set the locations
00659 for (unsigned i = 0; i < getNumNodes(); i++)
00660 {
00661 xlocsAt[BOTTOM_LEFT][i] = xlocs[i] - xLeftSlacks[i];
00662 ylocsAt[BOTTOM_LEFT][i] = ylocs[i] - yBottomSlacks[i];
00663
00664 xlocsAt[BOTTOM_RIGHT][i] = xlocs[i] + xRightSlacks[i];
00665 ylocsAt[BOTTOM_RIGHT][i] = ylocs[i] - yBottomSlacks[i];
00666
00667 xlocsAt[TOP_LEFT][i] = xlocs[i] - xLeftSlacks[i];
00668 ylocsAt[TOP_LEFT][i] = ylocs[i] + yTopSlacks[i];
00669
00670 xlocsAt[TOP_RIGHT][i] = xlocs[i] + xRightSlacks[i];
00671 ylocsAt[TOP_RIGHT][i] = ylocs[i] + yTopSlacks[i];
00672 }
00673 }
|
Here is the call graph for this function:

|
||||||||||||||||||||||||||||||||||||||||
|
Definition at line 1091 of file DB.cxx. References _nets, _nodes, parquetfp::Node::getHeight(), parquetfp::Nodes::getNode(), getNodesArea(), parquetfp::Nodes::getTerminal(), parquetfp::Node::getWidth(), parquetfp::Node::getX(), parquetfp::Node::getY(), parquetfp::itNet, parquetfp::itNode, parquetfp::itPin, parquetfp::Nets::netsBegin(), parquetfp::Nets::netsEnd(), parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::Nodes::terminalsBegin(), parquetfp::Nodes::terminalsEnd(), parquetfp::Point::x, and parquetfp::Point::y.
01094 {
01095 double x=0;
01096 double y=0;
01097 double w=0;
01098 double h=0;
01099 double nodesArea = getNodesArea();
01100 double starDelta = sqrt(nodesArea) / 200;
01101 itNode it;
01102
01103 cout<<"OutPut Plot file is "<<fileName<<endl;
01104 ofstream gpOut(fileName);
01105 if (!gpOut.good())
01106 {
01107 cout << "Warning: output file " << fileName
01108 << " can't be opened" << endl;
01109 }
01110
01111 gpOut<<"#Use this file as a script for gnuplot"<<endl;
01112 gpOut<<"#(See http://www.gnuplot.info/ for details)"<<endl;
01113 gpOut << "set nokey"<<endl;
01114
01115 gpOut << "set size ratio -1" << endl;
01116 gpOut << "set title ' " << fileName
01117 << " area= " << area << " WS= " << whitespace << "%" << " AR= " << aspectRatio
01118 << " time= " << time << "s" << " HPWL= " << HPWL << endl << endl;
01119
01120 gpOut<<"# Uncomment these two lines starting with \"set\""<<endl ;
01121 gpOut<<"# to save an EPS file for inclusion into a latex document"<<endl;
01122 gpOut << "# set terminal postscript eps color solid 10"<<endl;
01123 gpOut << "# set output \"out.eps\""<<endl<<endl<<endl;
01124
01125 gpOut<<"# Uncomment these two lines starting with \"set\""<<endl ;
01126 gpOut<<"# to save a PS file for printing"<<endl;
01127 gpOut<<"# set terminal postscript portrait color solid 8"<<endl;
01128 gpOut << "# set output \"out.ps\""<<endl<<endl<<endl;
01129
01130 if(plotNames)
01131 {
01132 for(it=_nodes->nodesBegin();it!=_nodes->nodesEnd();++it)
01133 {
01134 gpOut<<"set label \""<<it->getName()<<"("<<(it-_nodes->nodesBegin())<<"),vdd=" << it->getVoltage()
01135 <<"\" at "<<it->getX()+it->getWidth()/4<<" , "<<it->getY()+it->getHeight()/4<<endl;
01136 }
01137
01138 // plot terminals only when Net is plotted
01139 if (plotNets)
01140 {
01141 for(it=_nodes->terminalsBegin();it!=_nodes->terminalsEnd();++it)
01142 {
01143 gpOut<<"set label \""<<it->getName()<<"\" at "<<it->getX()+it->getWidth()/4<<" , "<<it->getY()+it->getHeight()/4<<endl;
01144 }
01145 }
01146 }
01147
01148
01149 if(plotSlacks)
01150 {
01151 for(it=_nodes->nodesBegin();it!=_nodes->nodesEnd();++it)
01152 {
01153 double xSlack = it->getslackX();
01154 double ySlack = it->getslackY();
01155 if(xSlack < 1e-5)
01156 xSlack = 0;
01157 if(ySlack < 1e-5)
01158 ySlack = 0;
01159
01160 gpOut.precision(4);
01161 gpOut<<"set label \"x "<<xSlack<<"\" at "<<it->getX()+it->getWidth()/6<<" , "<<it->getY()+it->getHeight()/2<<endl;
01162 gpOut<<"set label \"y "<<ySlack<<"\" at "<<it->getX()+it->getWidth()/6<<" , "<<it->getY()+it->getHeight()*3/4<<endl;
01163 }
01164 }
01165
01166 gpOut.precision(6);
01167 gpOut << "plot '-' w l";
01168 if (plotNets)
01169 gpOut << ", '-' w l 3";
01170 gpOut << endl;
01171
01172 for(it=_nodes->nodesBegin();it!=_nodes->nodesEnd();++it)
01173 {
01174 x=it->getX();
01175 y=it->getY();
01176 w=it->getWidth();
01177 h=it->getHeight();
01178
01179 gpOut<<x<<" "<<y<<endl;
01180 gpOut<<x+w<<" "<<y<<endl;
01181 gpOut<<x+w<<" "<<y+h<<endl;
01182 gpOut<<x<<" "<<y+h<<endl;
01183 gpOut<<x<<" "<<y<<endl<<endl;
01184 }
01185 gpOut << "EOF"<<endl;
01186
01187 if(plotNets)
01188 {
01189 double width;
01190 double height;
01191 double absOffsetX;
01192 double absOffsetY;
01193
01194 itNet net;
01195 itPin netPin;
01196 for(net = _nets->netsBegin(); net != _nets->netsEnd(); ++net)
01197 {
01198 Point starPoint;
01199 starPoint.x = 0;
01200 starPoint.y = 0;
01201 unsigned netDegree = 0;
01202 for(netPin = net->pinsBegin(); netPin != net->pinsEnd(); netPin++)
01203 {
01204 Node node;
01205 if(!netPin->getType()) //if not terminal
01206 node = _nodes->getNode(netPin->getNodeIndex());
01207 else
01208 node = _nodes->getTerminal(netPin->getNodeIndex());
01209
01210 width = node.getWidth();
01211 height = node.getHeight();
01212 absOffsetX = width/2 + (netPin->getXOffset()*width);
01213 absOffsetY = height/2 + (netPin->getYOffset()*height);
01214 starPoint.x += node.getX() + absOffsetX;
01215 starPoint.y += node.getY() + absOffsetY;
01216 ++netDegree;
01217 }
01218
01219 if(netDegree != 0)
01220 {
01221 starPoint.x /= netDegree;
01222 starPoint.y /= netDegree;
01223 for(netPin = net->pinsBegin(); netPin != net->pinsEnd(); netPin++)
01224 {
01225 Node node;
01226 if(!netPin->getType())
01227 node = _nodes->getNode(netPin->getNodeIndex());
01228 else
01229 node = _nodes->getTerminal(netPin->getNodeIndex());
01230 width = node.getWidth();
01231 height = node.getHeight();
01232 absOffsetX = width/2 + (netPin->getXOffset()*width);
01233 absOffsetY = height/2 + (netPin->getYOffset()*height);
01234 gpOut<<starPoint.x<<" "<<starPoint.y<<endl;
01235 gpOut<<node.getX()+absOffsetX<<" "<<node.getY()+absOffsetY<<endl;
01236 gpOut<<starPoint.x<<" "<<starPoint.y<<endl<<endl;
01237
01238 gpOut<<starPoint.x-starDelta<<" "<<starPoint.y<<endl;
01239 gpOut<<starPoint.x<<" "<<starPoint.y+starDelta<<endl;
01240 gpOut<<starPoint.x+starDelta<<" "<<starPoint.y<<endl;
01241 gpOut<<starPoint.x<<" "<<starPoint.y-starDelta<<endl;
01242 gpOut<<starPoint.x-starDelta<<" "<<starPoint.y<<endl<<endl;
01243
01244 }
01245 }
01246 else
01247 {
01248 cout << "Warning: net with zero degree detected." << endl;
01249 }
01250 }
01251 gpOut << "EOF"<<endl<<endl;
01252 }
01253 gpOut << "pause -1 'Press any key' "<<endl;
01254 gpOut.close();
01255 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 1458 of file DB.cxx. References _initArea, _nodes, getNodesArea(), parquetfp::itNode, parquetfp::Nodes::nodesBegin(), and parquetfp::Nodes::nodesEnd().
01459 {
01460 double currNodesArea = getNodesArea();
01461 double currWS = (layoutArea - currNodesArea)/currNodesArea;
01462
01463 if(currWS > maxWS)
01464 return;
01465
01466 double macroArea = 0;
01467 itNode node;
01468 for(node = _nodes->nodesBegin(); node != _nodes->nodesEnd(); ++node)
01469 {
01470 if(node->isMacro())
01471 macroArea += node->getHeight()*node->getWidth();
01472 }
01473
01474 double newCtoOldCRatio = ((layoutArea - (1+maxWS)*macroArea)*(1+currWS))/
01475 ((layoutArea - (1+currWS)*macroArea)*(1+maxWS));
01476
01477 for(node = _nodes->nodesBegin(); node != _nodes->nodesEnd(); ++node)
01478 {
01479 if(!node->isMacro())
01480 {
01481 double nodeWidth = node->getWidth();
01482 double newNodeWidth = nodeWidth*newCtoOldCRatio;
01483 node->putWidth(newNodeWidth);
01484 }
01485 }
01486
01487 _initArea = false;
01488 double newNodesArea = getNodesArea();
01489
01490 currWS = (layoutArea - newNodesArea)/newNodesArea;
01491 }
|
Here is the call graph for this function:

|
|
Definition at line 1277 of file DB.cxx. References _nodes, saveNets(), parquetfp::Nodes::saveNodes(), parquetfp::Nodes::savePl(), and saveWts().
|
Here is the call graph for this function:

|
|
Definition at line 1443 of file DB.cxx. References _nodesBestCopy, and parquetfp::Nodes::savePl().
01444 {
01445 _nodesBestCopy->savePl(fileName);
01446 }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 1258 of file DB.cxx. References _nodes, saveCapoNets(), parquetfp::Nodes::saveCapoNodes(), parquetfp::Nodes::saveCapoPl(), and parquetfp::Nodes::saveCapoScl().
01260 {
01261 cout<<"Saving in Capo Format "<<baseFileName<<endl;
01262 _nodes->saveCapoNodes(baseFileName);
01263 _nodes->saveCapoPl(baseFileName);
01264 saveCapoNets(baseFileName);
01265 _nodes->saveCapoScl(baseFileName, reqdAR, reqdWS);
01266
01267 //save the aux file now
01268 char fileName[1024];
01269 strcpy(fileName, baseFileName);
01270 strcat(fileName, ".aux");
01271 ofstream aux(fileName);
01272 aux<<"RowBasedPlacement : "<<baseFileName<<".nodes "<<baseFileName<<".nets "<<
01273 baseFileName<<".scl "<<baseFileName<<".pl "<<endl;
01274 aux.close();
01275 }
|
Here is the call graph for this function:

|
|
Definition at line 1286 of file DB.cxx. References _nodes, parquetfp::Node::getHeight(), parquetfp::Nodes::getNode(), parquetfp::Nets::getNumPins(), parquetfp::Nodes::getTerminal(), parquetfp::Node::getWidth(), parquetfp::itNet, parquetfp::itPin, parquetfp::Nets::netsBegin(), and parquetfp::Nets::netsEnd(). Referenced by saveCapo().
01287 {
01288 Nets* nets;
01289 nets = const_cast<DB*>(this)->getNets();
01290 double absOffsetX;
01291 double absOffsetY;
01292 double width;
01293 double height;
01294 double temp;
01295 int nodeIndex;
01296
01297 char fileName[1024];
01298 strcpy(fileName, baseFileName);
01299 strcat(fileName, ".nets");
01300 ofstream file(fileName);
01301
01302 file<<"UCLA nets 1.0"<<endl<<endl<<endl;
01303 file<<"NumPins : "<<nets->getNumPins()<<endl<<endl;
01304
01305 itNet net;
01306 itPin pin;
01307 for(net = nets->netsBegin(); net != nets->netsEnd(); ++net)
01308 {
01309 file<<"NetDegree : "<<net->_pins.size()<<"\t"<<net->getName()<<endl;
01310 for(pin = net->pinsBegin(); pin != net->pinsEnd(); ++pin)
01311 {
01312 nodeIndex = pin->getNodeIndex();
01313 if(!pin->getType()) //if not terminal
01314 {
01315 Node& node = _nodes->getNode(nodeIndex);
01316 width = node.getWidth();
01317 height = node.getHeight();
01318 }
01319 else
01320 {
01321 Node& node = _nodes->getTerminal(nodeIndex);
01322 width = node.getWidth();
01323 height = node.getHeight();
01324 }
01325 if(int(pin->getOrient())%2 == 1)
01326 {
01327 temp = width;
01328 width = height;
01329 height = temp;
01330 }
01331 absOffsetX = (pin->getOrigXOffset()*width);
01332 absOffsetY = (pin->getOrigYOffset()*height);
01333
01334 file<<"\t"<<pin->getName()<<" B : \t"<<absOffsetX<<"\t "<<absOffsetY<<endl;
01335 }
01336 }
01337 file.close();
01338 }
|
Here is the call graph for this function:

|
|
Definition at line 1426 of file DB.cxx. References _nodes, _nodesBestCopy, parquetfp::itNode, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), and successAR.
01427 {
01428 successAR = 1;
01429 itNode node;
01430 itNode nodeBest;
01431 nodeBest = _nodesBestCopy->nodesBegin();
01432 for(node = _nodes->nodesBegin(); node != _nodes->nodesEnd(); node++)
01433 {
01434 nodeBest->putX(node->getX());
01435 nodeBest->putY(node->getY());
01436 nodeBest->putWidth(node->getWidth());
01437 nodeBest->putHeight(node->getHeight());
01438 nodeBest->putOrient(node->getOrient());
01439 nodeBest++;
01440 }
01441 }
|
Here is the call graph for this function:

|
|
Definition at line 1340 of file DB.cxx. References parquetfp::Nets::getNumNets(), parquetfp::Nets::getNumPins(), parquetfp::itNet, parquetfp::itPin, parquetfp::Nets::netsBegin(), and parquetfp::Nets::netsEnd(). Referenced by save().
01341 {
01342 Nets* nets;
01343 nets = const_cast<DB*>(this)->getNets();
01344
01345 char fileName[1024];
01346 strcpy(fileName, baseFileName);
01347 strcat(fileName, ".nets");
01348 ofstream file(fileName);
01349
01350 file<<"UCLA nets 1.0"<<endl<<endl<<endl;
01351 file<<"NumNets : "<<nets->getNumNets()<<endl;
01352 file<<"NumPins : "<<nets->getNumPins()<<endl<<endl;
01353
01354 itNet net;
01355 itPin pin;
01356 for(net = nets->netsBegin(); net != nets->netsEnd(); ++net)
01357 {
01358 file<<"NetDegree : "<<net->_pins.size()<<" "<<net->getName()<<endl;
01359 for(pin = net->pinsBegin(); pin != net->pinsEnd(); ++pin)
01360 {
01361 file<<pin->getName()<<" B : \t%"<<pin->getOrigXOffset()*100<<
01362 "\t %"<<pin->getOrigYOffset()*100<<endl;
01363 }
01364 }
01365 file.close();
01366 }
|
Here is the call graph for this function:

|
|
Definition at line 1368 of file DB.cxx. References parquetfp::itNet, parquetfp::Nets::netsBegin(), and parquetfp::Nets::netsEnd(). Referenced by save().
01369 {
01370 Nets* nets;
01371 nets = const_cast<DB*>(this)->getNets();
01372
01373 char fileName[1024];
01374 strcpy(fileName, baseFileName);
01375 strcat(fileName, ".wts");
01376 ofstream file(fileName);
01377
01378 file<<"UCLA wts 1.0"<<endl<<endl<<endl;
01379
01380 itNet net;
01381 // itPin pin;
01382 for(net = nets->netsBegin(); net != nets->netsEnd(); ++net)
01383 {
01384 file<<net->getName()<<"\t"<<net->getWeight()<<endl;
01385 }
01386 file.close();
01387 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 271 of file DB.h. References getNodeArea(), setNodeHeight(), and setNodeWidth().
00272 {
00273 const double area = getNodeArea(index);
00274 setNodeWidth(index, sqrt(area * ar));
00275 setNodeHeight(index, sqrt(area / ar));
00276 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 268 of file DB.h. References _nodes, and parquetfp::Nodes::getNode(). Referenced by setNodeAR().
00269 { (_nodes->getNode(index)).putHeight(height); }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 265 of file DB.h. References _nodes, and parquetfp::Nodes::getNode(). Referenced by setNodeAR().
00266 { (_nodes->getNode(index)).putWidth(width); }
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 292 of file DB.h. References setOrient(), and parquetfp::toOrient().
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 284 of file DB.h. References _nets, _nodes, parquetfp::Nodes::changeOrient(), and parquetfp::Nodes::getNode(). Referenced by setOrient().
|
Here is the call graph for this function:

|
|
Definition at line 742 of file DB.cxx. References _rowHeight.
00743 {
00744 _rowHeight = rowHeight;
00745 }
|
|
|
Definition at line 747 of file DB.cxx. References _siteSpacing.
00748 {
00749 _siteSpacing = siteSpacing;
00750 }
|
|
||||||||||||
|
Definition at line 278 of file DB.h. References _nodes, and parquetfp::Nodes::getNode().
00279 { (_nodes->getNode(index)).putX(newX); }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 281 of file DB.h. References _nodes, and parquetfp::Nodes::getNode().
00282 { (_nodes->getNode(index)).putY(newY); }
|
Here is the call graph for this function:

|
|
Definition at line 1389 of file DB.cxx. References _nodes, parquetfp::itNode, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by parquetfp::SolveMulti::placeSubBlocks(), and shiftOptimizeDesign().
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 1610 of file DB.cxx. References evalHPWL(), getBottomLeftCorner(), getOptimalRangeStart(), getTopRightCorner(), getXSize(), getYSize(), shiftDesign(), parquetfp::Point::x, and parquetfp::Point::y.
01612 {
01613 double designWidth = getXSize();
01614 double designHeight = getYSize();
01615
01616 double outlineWidth = outlineTopRight.x - outlineBottomLeft.x;
01617 double outlineHeight = outlineTopRight.y - outlineBottomLeft.y;
01618
01619 if (designWidth < outlineWidth &&
01620 designHeight < outlineHeight)
01621 {
01622 Point currBottomLeft(getBottomLeftCorner());
01623 Point minOffset;
01624 minOffset.x = outlineBottomLeft.x - currBottomLeft.x;
01625 minOffset.y = outlineBottomLeft.y - currBottomLeft.y;
01626
01627 Point currTopRight(getTopRightCorner());
01628 Point maxOffset;
01629 maxOffset.x = outlineTopRight.x - currTopRight.x;
01630 maxOffset.y = outlineTopRight.y - currTopRight.y;
01631
01632 double xRangeStart = getOptimalRangeStart(true);
01633 xRangeStart = max(xRangeStart, minOffset.x);
01634 xRangeStart = min(xRangeStart, maxOffset.x);
01635
01636 double yRangeStart = getOptimalRangeStart(false);
01637 yRangeStart = max(yRangeStart, minOffset.y);
01638 yRangeStart = min(yRangeStart, maxOffset.y);
01639
01640 // the magnitude of shifting (not the final pos)
01641 Point offset;
01642 offset.x = xRangeStart;
01643 offset.y = yRangeStart;
01644
01645 printf("currBBox: %.2f %.2f %.2f %.2f\n",
01646 currBottomLeft.x, currBottomLeft.y,
01647 currTopRight.x, currTopRight.y);
01648 printf("outBBox: %.2f %.2f %.2f %.2f\n",
01649 outlineBottomLeft.x, outlineBottomLeft.y,
01650 outlineTopRight.x, outlineTopRight.y);
01651 cout << "offset.x: " << offset.x
01652 << " offset.y: " << offset.y << endl;
01653
01654 double origHPWL = evalHPWL();
01655 cout << "HPWL before shifting: " << origHPWL << endl;
01656
01657 shiftDesign(offset);
01658
01659 double newHPWL = evalHPWL();
01660 cout << "HPWL after shifting: " << newHPWL << endl;
01661
01662 if (origHPWL < newHPWL)
01663 {
01664 cout << "Undo-ing the shift..." << endl;
01665 offset.x = -offset.x;
01666 offset.y = -offset.y;
01667 shiftDesign(offset);
01668 }
01669
01670 double finalHPWL = evalHPWL();
01671 cout << "Final HPWL: " << finalHPWL << endl;
01672 }
01673 else
01674 {
01675 /* Saurabh: The below code is not general enough. only valid
01676 when relevant nodes are marked as macros. So I am connenting
01677 it out. only used for printing out a message anyway */
01678 /*
01679 double tempXSize = getXSizeWMacroOnly();
01680 double tempYSize = getYSizeWMacroOnly();
01681 if(tempXSize > 1e-5 && tempYSize > 1e-5)
01682 {
01683 designHeight = tempYSize;
01684 designWidth = tempXSize;
01685 }
01686 if (!(designWidth <= outlineWidth &&
01687 designHeight <= outlineHeight))
01688 */
01689 cout << "No shifting for HPWL minimization is performed. " << endl;
01690 }
01691 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 1595 of file DB.cxx. References _nodes, getBottomLeftCorner(), parquetfp::Nodes::getNumTerminals(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by BaseAnnealer::postHPWLOpt().
01597 {
01598 if (_nodes->getNumTerminals() == 0)
01599 return;
01600
01601 // original bottomLeft corner of the floorplan
01602 Point outlineBottomLeft(getBottomLeftCorner());
01603 Point outlineTopRight;
01604 outlineTopRight.x = outlineBottomLeft.x + outlineWidth;
01605 outlineTopRight.y = outlineBottomLeft.y + outlineHeight;
01606
01607 shiftOptimizeDesign(outlineBottomLeft, outlineTopRight);
01608 }
|
Here is the call graph for this function:

|
|
Definition at line 345 of file DB.h. References BOTTOM_LEFT, BOTTOM_RIGHT, TOP_LEFT, and TOP_RIGHT. Referenced by cornerOptimizeDesign().
00346 {
00347 switch (corner)
00348 {
00349 case BOTTOM_LEFT: return "bottom-left";
00350 case BOTTOM_RIGHT: return "bottom-right";
00351 case TOP_LEFT: return "top-left";
00352 case TOP_RIGHT: return "top-right";
00353 default: return "INVALID CORNER";
00354 }
00355 }
|
|
||||||||||||||||
|
Definition at line 330 of file DB.h. References _nodes, parquetfp::Nodes::getNode(), parquetfp::Nodes::getNumNodes(), parquetfp::Node::putHeight(), and parquetfp::Node::putWidth().
|
Here is the call graph for this function:

|
||||||||||||||||
|
Definition at line 316 of file DB.h. References _nodes, parquetfp::Nodes::getNode(), parquetfp::Nodes::getNumNodes(), parquetfp::Node::putX(), and parquetfp::Node::putY().
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 298 of file DB.h. References _nets, _nodes, parquetfp::Node::changeOrient(), parquetfp::Node::getHeight(), parquetfp::Nodes::getNode(), parquetfp::Nodes::getNumNodes(), parquetfp::Node::getOrient(), parquetfp::Node::getWidth(), parquetfp::Node::getX(), parquetfp::Node::getY(), parquetfp::Node::putHeight(), parquetfp::Node::putWidth(), parquetfp::Node::putX(), and parquetfp::Node::putY().
00300 {
00301 if (index < int(_nodes->getNumNodes()))
00302 {
00303 Node& oldNode = _nodes->getNode(index);
00304
00305 oldNode.putX(newNode.getX());
00306 oldNode.putY(newNode.getY());
00307 oldNode.changeOrient(newNode.getOrient(), *_nets);
00308 oldNode.putWidth(newNode.getWidth());
00309 oldNode.putHeight(newNode.getHeight());
00310 return true;
00311 }
00312 else
00313 return false;
00314 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 762 of file DB.cxx. References _nodes, abkwarn, parquetfp::Nodes::getNode(), parquetfp::Nodes::getNumNodes(), parquetfp::Node::putX(), and parquetfp::Node::putY(). Referenced by BTreeAreaWireAnnealer::anneal(), parquetfp::Annealer::anneal(), cornerOptimizeDesign(), BTreeAreaWireAnnealer::DBfromSoln(), parquetfp::Annealer::eval(), parquetfp::Annealer::evalCompact(), parquetfp::Annealer::go(), BaseAnnealer::solveQP(), and parquetfp::Annealer::updatePlacement().
00764 {
00765 unsigned int numNodes = _nodes->getNumNodes();
00766 unsigned int size = min(unsigned(xloc.size()), numNodes);
00767 abkwarn(size >= numNodes, "Too few locations specified.");
00768
00769 for(unsigned i = 0; i < size; i++)
00770 {
00771 _nodes->getNode(i).putX(xloc[i]);
00772 _nodes->getNode(i).putY(yloc[i]);
00773 }
00774 }
|
Here is the call graph for this function:

|
||||||||||||
|
Definition at line 786 of file DB.cxx. References _nodes, parquetfp::Nodes::getNode(), parquetfp::Node::putslackX(), and parquetfp::Node::putslackY(). Referenced by BTreeAreaWireAnnealer::DBfromSoln(), parquetfp::Annealer::evalSlacks(), and parquetfp::Annealer::go().
|
Here is the call graph for this function:

|
|
Definition at line 69 of file DB.h. Referenced by DB(), getNodesArea(), and operator=(). |
|
|
Definition at line 70 of file DB.h. Referenced by DB(), getNodesArea(), operator=(), and reduceCoreCellsArea(). |
|
|
Definition at line 64 of file DB.h. Referenced by clean(), DB(), evalHPWL(), getNets(), getOptimalRangeStart(), operator=(), plot(), setOrient(), updateNodeSlim(), and ~DB(). |
|
|
|
Definition at line 66 of file DB.h. Referenced by clean(), DB(), operator=(), saveBestCopyPl(), saveInBestCopy(), and ~DB(). |
|
|
Definition at line 72 of file DB.h. Referenced by DB(), getRowHeight(), operator=(), and setRowHeight(). |
|
|
Definition at line 73 of file DB.h. Referenced by DB(), getSiteSpacing(), operator=(), and setSiteSpacing(). |
|
|
Definition at line 76 of file DB.h. Referenced by DB(), and saveInBestCopy(). |
1.3.2