#include <ClusterDB.h>
Collaboration diagram for parquetfp::ClusterDB:
Public Member Functions | |
ClusterDB (DB *db, Command_Line *params) | |
~ClusterDB () | |
void | clusterMulti (DB *newDB) |
void | cluster1Layer (unsigned layerNum, unsigned maxConnId=1) |
void | addNetsToNewDB (Nets *nets, Nets *newNets, Nodes *nodes, Nodes *newNodes, map< unsigned, unsigned > &mapping) |
Node & | getClosestNode (Node &currNode, Nodes *nodes, Nets *nets, vector< bool > &seenNodes, unsigned maxConnId=1, bool direction=true) |
void | addWSPerNode (void) |
void | clusterMultiPhysical (DB *newDB) |
Private Attributes | |
Command_Line * | _params |
DB * | _db |
DB * | _newDB |
DB * | _oldDB |
BitBoard | _nodesSeenBB |
vector< double > | _numConnections |
|
Definition at line 41 of file ClusterDB.cxx. References _db, _oldDB, and _params.
00041 : 00042 _nodesSeenBB(0),_numConnections(0,0) 00043 { 00044 _params = params; 00045 _db = db; 00046 _oldDB = new DB(); 00047 *(_oldDB) = *(_db); 00048 } |
|
Definition at line 130 of file ClusterDB.cxx. References _oldDB.
|
|
Definition at line 457 of file ClusterDB.cxx. References _params, parquetfp::Net::addNode(), parquetfp::Command_Line::clusterPhysical, parquetfp::Node::getArea(), parquetfp::Node::getName(), parquetfp::Nodes::getNode(), parquetfp::Nodes::getNumNodes(), parquetfp::Nodes::getTerminal(), parquetfp::Node::getX(), parquetfp::Node::getY(), parquetfp::itNet, parquetfp::itPin, parquetfp::Nets::netsBegin(), parquetfp::Nets::netsEnd(), parquetfp::Node::numSubBlocks(), parquetfp::Net::pinsBegin(), parquetfp::Net::pinsEnd(), parquetfp::Net::putIndex(), parquetfp::Net::putName(), parquetfp::Nets::putNewNet(), parquetfp::pin::putNodeIndex(), parquetfp::Net::putWeight(), and parquetfp::Nodes::updatePinsInfo(). Referenced by cluster1Layer(), and clusterMultiPhysical().
00459 { 00460 int netCtr=0; 00461 itNet net; 00462 00463 vector<bool> seenNodes(newNodes->getNumNodes()); 00464 for(net = nets->netsBegin(); net != nets->netsEnd(); ++net) 00465 { 00466 Net tempEdge; 00467 fill(seenNodes.begin(), seenNodes.end(), false); 00468 tempEdge.putName(net->getName()); 00469 tempEdge.putIndex(netCtr); 00470 tempEdge.putWeight(net->getWeight()); 00471 for(itPin netPin = net->pinsBegin(); netPin != net->pinsEnd(); ++netPin) 00472 { 00473 unsigned currNodeIdx = netPin->getNodeIndex(); 00474 00475 if(!netPin->getType()) 00476 { 00477 unsigned newNodeIdx = mapping[currNodeIdx]; 00478 Node& newNode = newNodes->getNode(newNodeIdx); 00479 double poffsetX = 0, poffsetY = 0; 00480 if(newNode.numSubBlocks() == 1) 00481 { 00482 poffsetX = netPin->getXOffset(); 00483 poffsetY = netPin->getYOffset(); 00484 } 00485 else if(_params->clusterPhysical) //get pinoffsets of subcells 00486 { 00487 double xMin = newNode.getX(); 00488 double yMin = newNode.getY(); 00489 double xMax = xMin + sqrt(newNode.getArea()); //assume AR 1 00490 double yMax = yMin + sqrt(newNode.getArea()); //assume AR 1 00491 Node& oldNode = nodes->getNode(currNodeIdx); 00492 double xloc = oldNode.getX(); 00493 double yloc = oldNode.getY(); 00494 if(xloc >= xMax) 00495 poffsetX = 0.5; 00496 else if(xloc <= xMin) 00497 poffsetX = -0.5; 00498 else 00499 poffsetX = ((xloc-xMin)/(xMax-xMin)) - 0.5; 00500 00501 if(yloc >= yMax) 00502 poffsetY = 0.5; 00503 else if(yloc <= yMin) 00504 poffsetY = -0.5; 00505 else 00506 poffsetY = ((yloc-yMin)/(yMax-yMin)) - 0.5; 00507 } 00508 00509 pin tempPin(newNode.getName(), false, poffsetX, poffsetY, 00510 netCtr); 00511 tempPin.putNodeIndex(newNodeIdx); 00512 00513 if(!seenNodes[newNodeIdx]) 00514 { 00515 tempEdge.addNode(tempPin); 00516 seenNodes[newNodeIdx] = 1; 00517 } 00518 } 00519 else 00520 { 00521 Node& newTerm = newNodes->getTerminal(currNodeIdx); 00522 double poffsetX = 0, poffsetY = 0; 00523 00524 pin tempPin(newTerm.getName(), true, poffsetX, poffsetY, 00525 netCtr); 00526 tempPin.putNodeIndex(currNodeIdx); 00527 00528 tempEdge.addNode(tempPin); 00529 } 00530 } 00531 00532 bool needNet = false; 00533 int firstNodeIdx = tempEdge.pinsBegin()->getNodeIndex(); 00534 for(itPin netPin = tempEdge.pinsBegin(); netPin != tempEdge.pinsEnd(); 00535 netPin++) 00536 { 00537 if(netPin->getType()) 00538 { 00539 needNet = true; 00540 break; 00541 } 00542 else if(netPin->getNodeIndex() != firstNodeIdx) //atleast 1 different 00543 { 00544 needNet = true; 00545 break; 00546 } 00547 } 00548 if(needNet) 00549 { 00550 newNets->putNewNet(tempEdge); 00551 ++netCtr; 00552 } 00553 } 00554 00555 //cout<<"Num Nets: "<<newNets->getNumNets()<<" Num Pins: " 00556 //<<newNets->getNumPins()<<endl; 00557 //update the pins info in nodes 00558 newNodes->updatePinsInfo(*newNets); 00559 } |
Here is the call graph for this function:
|
Definition at line 434 of file ClusterDB.cxx. References _newDB, _params, parquetfp::DB::getNodes(), parquetfp::itNode, parquetfp::Command_Line::maxWSHier, parquetfp::Nodes::nodesBegin(), and parquetfp::Nodes::nodesEnd(). Referenced by clusterMulti(), and clusterMultiPhysical().
00435 { 00436 itNode node; 00437 Nodes* newNodes = _newDB->getNodes(); 00438 00439 double multFactor = 1+_params->maxWSHier/100; 00440 double currArea, newArea, newHeight, newWidth; 00441 00442 for(node = newNodes->nodesBegin(); node != newNodes->nodesEnd(); ++node) 00443 { 00444 if(node->numSubBlocks() > 1) 00445 { 00446 currArea = node->getArea(); 00447 newArea = currArea*multFactor; //add WS 00448 newWidth = sqrt(newArea*node->getminAR()); 00449 newHeight = newWidth/node->getminAR(); 00450 node->putArea(newArea); 00451 node->putWidth(newWidth); 00452 node->putHeight(newHeight); 00453 } 00454 } 00455 } |
Here is the call graph for this function:
|
Definition at line 135 of file ClusterDB.cxx. References _newDB, _nodesSeenBB, _numConnections, _oldDB, addNetsToNewDB(), parquetfp::Node::addSubBlockIndex(), parquetfp::Node::getArea(), getClosestNode(), parquetfp::Node::getIndex(), parquetfp::Node::getmaxAR(), parquetfp::Node::getminAR(), parquetfp::Node::getName(), parquetfp::DB::getNets(), parquetfp::DB::getNodes(), parquetfp::DB::getNodesArea(), parquetfp::Nodes::getNumNodes(), parquetfp::Node::isMacro(), parquetfp::Node::isOrientFixed(), parquetfp::itNode, parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::Node::putIsOrientFixed(), parquetfp::Nodes::putNewNode(), parquetfp::Nodes::putNewTerm(), parquetfp::BitBoard::reset(), parquetfp::Node::subBlocksBegin(), parquetfp::Node::subBlocksEnd(), parquetfp::Nodes::terminalsBegin(), parquetfp::Nodes::terminalsEnd(), and parquetfp::Node::updateMacroInfo(). Referenced by clusterMulti().
00136 { 00137 map<unsigned, unsigned> mapping; // actual index -> top-level index 00138 00139 char blockName[1024]; 00140 unsigned blkCtr; 00141 00142 Nodes* nodes = _oldDB->getNodes(); 00143 Nets* nets = _oldDB->getNets(); 00144 Nodes* newNodes = _newDB->getNodes(); 00145 Nets* newNets = _newDB->getNets(); 00146 00147 double totalArea = _oldDB->getNodesArea(); 00148 double threshold = 0.2*totalArea; // upper bd in area for a cluster 00149 unsigned numNodes = nodes->getNumNodes(); 00150 unsigned currNodeIdx, nextNodeIdx; 00151 00152 itNode node, nodeBegin; 00153 static bool direction=false; 00154 00155 blkCtr = 0; 00156 vector<bool> seenNodes; 00157 seenNodes.resize(numNodes); 00158 fill(seenNodes.begin(), seenNodes.end(), false); 00159 00160 _nodesSeenBB.reset(numNodes); 00161 _numConnections.resize(numNodes,0); 00162 fill(_numConnections.begin(), _numConnections.end(), false); 00163 00164 // set up the nodes (top-level nodes) 00165 if(direction || numNodes == 1) 00166 nodeBegin = nodes->nodesBegin(); 00167 else 00168 nodeBegin = nodes->nodesEnd()-1; 00169 00170 for(node = nodeBegin; ; ) 00171 { 00172 Node& currNode = *node; 00173 currNodeIdx = currNode.getIndex(); 00174 00175 // if the node hasn't been seen, create it 00176 // otherwise, update existing info 00177 if(!seenNodes[currNode.getIndex()] && !currNode.isMacro()) 00178 { 00179 //seenNodes[currNodeIdx] = true; 00180 double currNodeArea = currNode.getArea(); 00181 00182 Node& nextNode = getClosestNode(currNode, nodes, nets, seenNodes, 00183 maxConnId, direction); 00184 // both "currNode" and "nextNode" haven't been seen 00185 if(!seenNodes[nextNode.getIndex()] && 00186 (currNodeIdx != (unsigned)nextNode.getIndex())) 00187 { 00188 double nextNodeArea = nextNode.getArea(); 00189 double newNodeArea = currNodeArea+nextNodeArea; 00190 nextNodeIdx = nextNode.getIndex(); 00191 00192 if(newNodeArea < threshold && !currNode.isMacro() && 00193 !nextNode.isMacro()) // cluster these nodes 00194 { 00195 seenNodes[nextNodeIdx] = true; 00196 seenNodes[currNodeIdx] = true; 00197 00198 sprintf(blockName, "Block_%d_%d",layerNum,blkCtr); 00199 Node tempNode(blockName, newNodeArea, 0.75, 1.5, blkCtr, false); 00200 00201 // add both the sub-blocks of "currNode" and "nextNode" 00202 for(vector<int>::iterator i = currNode.subBlocksBegin(); 00203 i!= currNode.subBlocksEnd(); ++i) 00204 tempNode.addSubBlockIndex(*i); 00205 00206 for(vector<int>::iterator i = nextNode.subBlocksBegin(); 00207 i!= nextNode.subBlocksEnd(); ++i) 00208 tempNode.addSubBlockIndex(*i); 00209 00210 mapping[currNodeIdx] = blkCtr; 00211 mapping[nextNodeIdx] = blkCtr; 00212 newNodes->putNewNode(tempNode); 00213 ++blkCtr; 00214 } 00215 else 00216 { 00217 seenNodes[currNodeIdx] = true; 00218 Node tempNode(currNode.getName(), currNode.getArea(), 00219 currNode.getminAR(), currNode.getmaxAR(), 00220 blkCtr, false); 00221 if(currNode.isMacro()) 00222 tempNode.updateMacroInfo(true); 00223 if(currNode.isOrientFixed()) 00224 tempNode.putIsOrientFixed(true); 00225 00226 for(vector<int>::iterator i = currNode.subBlocksBegin(); 00227 i!= currNode.subBlocksEnd(); ++i) 00228 tempNode.addSubBlockIndex(*i); 00229 00230 mapping[currNodeIdx] = blkCtr; 00231 newNodes->putNewNode(tempNode); 00232 ++blkCtr; 00233 } 00234 } 00235 } 00236 else if(currNode.isMacro()) 00237 { 00238 seenNodes[currNodeIdx] = true; 00239 Node tempNode(currNode.getName(), currNode.getArea(), 00240 currNode.getminAR(), currNode.getmaxAR(), 00241 blkCtr, false); 00242 if(currNode.isMacro()) 00243 tempNode.updateMacroInfo(true); 00244 if(currNode.isOrientFixed()) 00245 tempNode.putIsOrientFixed(true); 00246 00247 for(vector<int>::iterator i = currNode.subBlocksBegin(); 00248 i!= currNode.subBlocksEnd(); ++i) 00249 tempNode.addSubBlockIndex(*i); 00250 00251 mapping[currNodeIdx] = blkCtr; 00252 newNodes->putNewNode(tempNode); 00253 ++blkCtr; 00254 } 00255 00256 if(direction) 00257 { 00258 ++node; 00259 if(node == nodes->nodesEnd()) 00260 break; 00261 } 00262 else 00263 { 00264 if(node == nodes->nodesBegin()) 00265 break; 00266 --node; 00267 } 00268 } 00269 00270 direction = !direction; 00271 00272 //put any remaining nodes in new DB 00273 for(node = nodes->nodesBegin(); node != nodes->nodesEnd(); ++node) 00274 { 00275 Node& currNode = *node; 00276 currNodeIdx = currNode.getIndex(); 00277 if(!seenNodes[currNodeIdx]) 00278 { 00279 seenNodes[currNodeIdx] = true; 00280 Node tempNode(currNode.getName(), currNode.getArea(), 00281 currNode.getminAR(), currNode.getmaxAR(), 00282 blkCtr, false); 00283 if(currNode.isMacro()) 00284 tempNode.updateMacroInfo(true); 00285 if(currNode.isOrientFixed()) 00286 tempNode.putIsOrientFixed(true); 00287 00288 for(vector<int>::iterator i = currNode.subBlocksBegin(); 00289 i!= currNode.subBlocksEnd(); ++i) 00290 tempNode.addSubBlockIndex(*i); 00291 mapping[currNodeIdx] = blkCtr; 00292 newNodes->putNewNode(tempNode); 00293 ++blkCtr; 00294 } 00295 } 00296 00297 for(node = nodes->terminalsBegin(); node != nodes->terminalsEnd(); ++node) 00298 newNodes->putNewTerm(*node); 00299 00300 //set up the nets now 00301 addNetsToNewDB(nets, newNets, nodes, newNodes, mapping); 00302 } |
Here is the call graph for this function:
|
Definition at line 50 of file ClusterDB.cxx. References _db, _newDB, _oldDB, _params, addWSPerNode(), cluster1Layer(), parquetfp::Command_Line::dontClusterMacros, Verbosity::forMajStats, parquetfp::DB::getAvgHeight(), parquetfp::DB::getNets(), parquetfp::DB::getNodes(), parquetfp::Nets::getNumNets(), parquetfp::DB::getNumNodes(), parquetfp::Nodes::getNumNodes(), parquetfp::Nets::getNumPins(), parquetfp::DB::markTallNodesAsMacros(), parquetfp::Command_Line::maxTopLevelNodes, and parquetfp::Command_Line::verb. Referenced by parquetfp::SolveMulti::clusterOnly(), and parquetfp::SolveMulti::go().
00051 { 00052 unsigned numNewNodes; 00053 unsigned numOldNodes; 00054 unsigned layerNum = 1; 00055 00056 if(_params->dontClusterMacros) 00057 { 00058 double avgNodeHeight = 5*_oldDB->getAvgHeight(); 00059 _oldDB->markTallNodesAsMacros(avgNodeHeight); 00060 } 00061 00062 if(_params->verb.forMajStats > 0) 00063 cout<<"Num Nodes: "<<_oldDB->getNodes()->getNumNodes()<<" Num Nets: " 00064 <<_oldDB->getNets()->getNumNets()<<" Num Pins: " 00065 <<_oldDB->getNets()->getNumPins()<<endl; 00066 00067 unsigned maxTopLevelNodes; 00068 if(_params->maxTopLevelNodes == -9999) // # top-level nodes 00069 { 00070 maxTopLevelNodes = unsigned(2*sqrt(double(_db->getNumNodes()))); 00071 if(maxTopLevelNodes < 50) 00072 maxTopLevelNodes = 50; 00073 } 00074 else 00075 { 00076 maxTopLevelNodes = _params->maxTopLevelNodes; 00077 if(maxTopLevelNodes <= 0) 00078 { 00079 cout<<"maxTopLevelNodes has to be > 0"<<endl; 00080 exit(0); 00081 } 00082 } 00083 00084 if(_db->getNumNodes() > maxTopLevelNodes) 00085 { 00086 unsigned maxConnId = 1; // ??? 00087 do 00088 { 00089 DB * tempDB = new DB(); 00090 _newDB = tempDB; 00091 numOldNodes = _oldDB->getNodes()->getNumNodes(); 00092 cluster1Layer(layerNum, maxConnId); 00093 00094 numNewNodes = _newDB->getNodes()->getNumNodes(); 00095 00096 *(_oldDB) = *(_newDB); 00097 00098 if(_params->verb.forMajStats > 0) 00099 cout<<"Num Nodes: "<<_oldDB->getNodes()->getNumNodes()<<" Num Nets: " 00100 <<_oldDB->getNets()->getNumNets()<<" Num Pins: " 00101 <<_oldDB->getNets()->getNumPins()<<endl; 00102 00103 delete tempDB; 00104 ++layerNum; 00105 if(numOldNodes != numNewNodes && maxConnId > 1) 00106 { 00107 if(maxConnId > 10) 00108 maxConnId -= 4; 00109 else 00110 --maxConnId; 00111 } 00112 if(numOldNodes == numNewNodes) 00113 ++maxConnId; 00114 if(maxConnId >= unsigned(numOldNodes/4) || maxConnId > 100) 00115 break; 00116 } 00117 while(numNewNodes > maxTopLevelNodes/* && numOldNodes != numNewNodes */); 00118 } 00119 00120 _newDB = _oldDB; 00121 00122 addWSPerNode(); //add WS per node 00123 00124 //compress the created DB now 00125 _newDB = new DB(*_oldDB, true); 00126 00127 *newDB = *_newDB; 00128 } |
Here is the call graph for this function:
|
Definition at line 561 of file ClusterDB.cxx. References _newDB, _oldDB, _params, addNetsToNewDB(), parquetfp::Node::addSubBlockIndex(), addWSPerNode(), parquetfp::Command_Line::dontClusterMacros, parquetfp::Node::getArea(), parquetfp::DB::getAvgHeight(), parquetfp::Node::getIndex(), parquetfp::Node::getmaxAR(), parquetfp::Node::getminAR(), parquetfp::Node::getName(), parquetfp::DB::getNets(), parquetfp::Nodes::getNode(), parquetfp::DB::getNodes(), parquetfp::DB::getNumNodes(), parquetfp::Node::getOrient(), parquetfp::Node::getX(), parquetfp::DB::getXSize(), parquetfp::Node::getY(), parquetfp::DB::getYSize(), parquetfp::Node::isMacro(), parquetfp::itNode, parquetfp::DB::markTallNodesAsMacros(), parquetfp::Nodes::nodesBegin(), parquetfp::Nodes::nodesEnd(), parquetfp::Nodes::putNewNode(), parquetfp::Nodes::putNewTerm(), parquetfp::Node::putOrient(), parquetfp::Node::putX(), parquetfp::Node::putY(), parquetfp::Nodes::terminalsBegin(), and parquetfp::Nodes::terminalsEnd(). Referenced by parquetfp::SolveMulti::clusterOnly(), and parquetfp::SolveMulti::go().
00562 { 00563 const unsigned numNew = 6; 00564 unsigned numOldNodes = _oldDB->getNumNodes(); 00565 00566 if(_params->dontClusterMacros) 00567 { 00568 double avgNodeHeight = _oldDB->getAvgHeight(); 00569 _oldDB->markTallNodesAsMacros(avgNodeHeight); 00570 } 00571 00572 map<unsigned, unsigned> mapping; 00573 00574 _newDB = newDB; 00575 00576 Nodes* nodes = _oldDB->getNodes(); 00577 Nets* nets = _oldDB->getNets(); 00578 Nodes* newNodes = _newDB->getNodes(); 00579 Nets* newNets = _newDB->getNets(); 00580 00581 itNode node; 00582 00583 unsigned blkCtr = 0; 00584 if(numOldNodes <= 50) 00585 { 00586 *newDB = *_oldDB; 00587 return; 00588 } 00589 00590 double layOutXSize = _oldDB->getXSize(); 00591 double layOutYSize = _oldDB->getYSize(); 00592 00593 //put nodes outside layout region into layout region 00594 for(node = nodes->nodesBegin(); node != nodes->nodesEnd(); ++node) 00595 { 00596 Node& currNode = *node; 00597 if(currNode.getX() > layOutXSize) 00598 currNode.putX(layOutXSize); 00599 if(currNode.getX() < 0.0) 00600 currNode.putX(0.0); 00601 if(currNode.getY() > layOutYSize) 00602 currNode.putY(layOutYSize); 00603 if(currNode.getY() < 0.0) 00604 currNode.putY(0.0); 00605 } 00606 00607 double xStep = layOutXSize/numNew; 00608 double yStep = layOutYSize/numNew; 00609 double xMax, yMax, xMin, yMin; 00610 00611 vector<bool> seenNodes(numOldNodes, false); 00612 00613 char blockName[1024]; 00614 00615 for(unsigned i=0; i<numNew; ++i) 00616 { 00617 yMin = i*yStep; 00618 yMax = (i+1)*yStep; 00619 for(unsigned j=0; j<numNew; ++j) 00620 { 00621 xMin = j*xStep; 00622 xMax = (j+1)*xStep; 00623 00624 sprintf(blockName, "Block_%d_%d",i,j); 00625 double newNodeArea = 0; 00626 vector<int> newNodesIdxs; 00627 00628 for(node = nodes->nodesBegin(); node != nodes->nodesEnd(); ++node) 00629 { 00630 Node& currNode = *node; 00631 unsigned currNodeIdx = currNode.getIndex(); 00632 if(!seenNodes[currNodeIdx]) 00633 { 00634 if(currNode.getX() >= xMin && currNode.getX() <= xMax && 00635 currNode.getY() >= yMin && currNode.getY() <= yMax) 00636 { 00637 if(!currNode.isMacro()) 00638 { 00639 newNodeArea += currNode.getArea(); 00640 newNodesIdxs.push_back(currNode.getIndex()); 00641 seenNodes[currNode.getIndex()] = 1; 00642 } 00643 else //macro needs to stored alone 00644 { 00645 Node tempNode(currNode.getName(), currNode.getArea(), 00646 currNode.getminAR(), 00647 currNode.getmaxAR(), blkCtr, false); 00648 mapping[currNode.getIndex()] = blkCtr; 00649 tempNode.addSubBlockIndex(currNode.getIndex()); 00650 tempNode.putX(currNode.getX()); 00651 tempNode.putY(currNode.getY()); 00652 tempNode.putOrient(currNode.getOrient()); 00653 newNodes->putNewNode(tempNode); 00654 ++blkCtr; 00655 seenNodes[currNode.getIndex()] = 1; 00656 } 00657 } 00658 } 00659 } 00660 if(newNodesIdxs.size() != 0) 00661 { 00662 Node tempNode(blockName, newNodeArea, 0.5, 2.0, blkCtr, false); 00663 for(unsigned k=0; k<newNodesIdxs.size(); ++k) 00664 { 00665 tempNode.addSubBlockIndex(newNodesIdxs[k]); 00666 mapping[newNodesIdxs[k]] = blkCtr; 00667 } 00668 tempNode.putX(xMin); 00669 tempNode.putY(yMin); 00670 newNodes->putNewNode(tempNode); 00671 ++blkCtr; 00672 } 00673 } 00674 } 00675 for(unsigned i=0; i<seenNodes.size(); ++i) 00676 if(seenNodes[i] == 0) 00677 { 00678 Node& temp = nodes->getNode(i); 00679 Node tempNode(temp.getName(), temp.getArea(), temp.getminAR(), 00680 temp.getmaxAR(), blkCtr, false); 00681 00682 tempNode.addSubBlockIndex(temp.getIndex()); 00683 double xLoc = temp.getX() > 0 ? temp.getX() : 0; 00684 double yLoc = temp.getY() > 0 ? temp.getY() : 0; 00685 tempNode.putX(xLoc); 00686 tempNode.putY(yLoc); 00687 tempNode.putOrient(temp.getOrient()); 00688 newNodes->putNewNode(tempNode); 00689 ++blkCtr; 00690 cout<<"Warning in ClusterDB.cxx "<<temp.getName()<<"("<<temp.getX() 00691 <<", "<<temp.getY()<<") out of layout region "<<endl; 00692 } 00693 00694 for(node = nodes->terminalsBegin(); node != nodes->terminalsEnd(); ++node) 00695 newNodes->putNewTerm(*node); 00696 00697 addWSPerNode(); //add WS per node needs to be before addNetsToNewDB 00698 00699 addNetsToNewDB(nets, newNets, nodes, newNodes, mapping); 00700 } |
Here is the call graph for this function:
|
Definition at line 304 of file ClusterDB.cxx. References _nodesSeenBB, _numConnections, parquetfp::BitBoard::clear(), parquetfp::Net::getDegree(), parquetfp::Node::getIndex(), parquetfp::BitBoard::getIndicesOfSetBits(), parquetfp::Nets::getNet(), parquetfp::Nodes::getNode(), parquetfp::Nodes::getNumNodes(), parquetfp::itNodePin, parquetfp::itPin, parquetfp::Net::pinsBegin(), parquetfp::Node::pinsBegin(), parquetfp::Net::pinsEnd(), parquetfp::Node::pinsEnd(), parquetfp::BitBoard::setBit(), parquetfp::Point::x, and parquetfp::Point::y. Referenced by cluster1Layer().
00307 { 00308 unsigned numNodes = nodes->getNumNodes(); 00309 Point tempPoint; 00310 tempPoint.x = 0; // x: node index 00311 tempPoint.y = 0; // y: incidence w/ "currNode" 00312 vector<Point> numConnections; 00313 bool iamDesperate=false; 00314 00315 unsigned currNodeIdx = currNode.getIndex(); 00316 itNodePin nodePin; 00317 00318 for(nodePin = currNode.pinsBegin(); nodePin != currNode.pinsEnd(); ++nodePin) 00319 { 00320 Net& net = nets->getNet(nodePin->netIndex); 00321 //if(net.getDegree() < 50) 00322 { 00323 itPin netPin; 00324 for(netPin = net.pinsBegin(); netPin != net.pinsEnd(); ++netPin) 00325 { 00326 if(!netPin->getType()) //not terminal 00327 { 00328 if(unsigned(netPin->getNodeIndex()) != currNodeIdx) 00329 { 00330 unsigned nodeId = netPin->getNodeIndex(); 00331 _numConnections[nodeId] += 00332 1.0/net.getDegree(); 00333 _nodesSeenBB.setBit(nodeId); 00334 } 00335 } 00336 } 00337 } 00338 } 00339 00340 if(maxConnId < 11) 00341 { 00342 const vector<unsigned>& bitsSet = _nodesSeenBB.getIndicesOfSetBits(); 00343 for(unsigned i=0; i<bitsSet.size(); ++i) 00344 { 00345 tempPoint.x = double(bitsSet[i]); 00346 tempPoint.y = _numConnections[bitsSet[i]]; 00347 numConnections.push_back(tempPoint); 00348 00349 _numConnections[bitsSet[i]] = 0; 00350 } 00351 _nodesSeenBB.clear(); 00352 } 00353 else 00354 { 00355 for(unsigned i=0; i<_numConnections.size(); ++i) 00356 { 00357 tempPoint.x = double(i); 00358 tempPoint.y = _numConnections[i]; 00359 numConnections.push_back(tempPoint); 00360 } 00361 _nodesSeenBB.clear(); 00362 fill(_numConnections.begin(), _numConnections.end(), 0); 00363 } 00364 00365 //sort 00366 std::sort(numConnections.begin(), numConnections.end(), 00367 sortNumConnections()); 00368 00369 unsigned maxConnectionsIdx = 0; 00370 unsigned maxConnectedNodes = numConnections.size(); 00371 int startingId=0; 00372 if(maxConnId > maxConnectedNodes) 00373 startingId = 0; 00374 else 00375 startingId = maxConnectedNodes-maxConnId; 00376 00377 if(maxConnectedNodes > 0) 00378 { 00379 for(int i=startingId; i>=0; --i) 00380 { 00381 maxConnectionsIdx = unsigned(numConnections[i].x); 00382 if(seenNodes[maxConnectionsIdx] != 1) 00383 { 00384 numConnections.clear(); // why need to clear() 00385 return nodes->getNode(maxConnectionsIdx); 00386 } 00387 } 00388 00389 if(maxConnId <= maxConnectedNodes) 00390 maxConnectionsIdx = unsigned(numConnections[maxConnectedNodes-maxConnId].x); 00391 else if(maxConnectedNodes > 0) 00392 maxConnectionsIdx = unsigned(numConnections[maxConnectedNodes-1].x); 00393 else //desperate attempt. return something 00394 { 00395 iamDesperate = true; 00396 if(direction) 00397 maxConnectionsIdx = 0; 00398 else 00399 maxConnectionsIdx = numNodes-1; 00400 } 00401 } 00402 else 00403 { 00404 //desperate attempt. return something 00405 iamDesperate = true; 00406 if(direction) 00407 maxConnectionsIdx = 0; 00408 else 00409 maxConnectionsIdx = numNodes-1; 00410 } 00411 if(iamDesperate && maxConnId > 15) 00412 { 00413 /* 00414 Node& nextClosestNode = getClosestNodeBFS(currNode, nodes, nets, 00415 seenNodes, maxConnId, direction); 00416 */ 00417 maxConnectionsIdx = rand()%numNodes; 00418 } 00419 numConnections.clear(); 00420 return nodes->getNode(maxConnectionsIdx); 00421 } |
Here is the call graph for this function:
|
Definition at line 57 of file ClusterDB.h. Referenced by ClusterDB(), and clusterMulti(). |
|
Definition at line 58 of file ClusterDB.h. Referenced by addWSPerNode(), cluster1Layer(), clusterMulti(), and clusterMultiPhysical(). |
|
Definition at line 61 of file ClusterDB.h. Referenced by cluster1Layer(), and getClosestNode(). |
|
Definition at line 62 of file ClusterDB.h. Referenced by cluster1Layer(), and getClosestNode(). |
|
Definition at line 59 of file ClusterDB.h. Referenced by cluster1Layer(), ClusterDB(), clusterMulti(), clusterMultiPhysical(), and ~ClusterDB(). |
|
Definition at line 56 of file ClusterDB.h. Referenced by addNetsToNewDB(), addWSPerNode(), ClusterDB(), clusterMulti(), and clusterMultiPhysical(). |