AMF-Placer  2.0
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
IncrementalBELPacker.cc
Go to the documentation of this file.
1 
26 #include "IncrementalBELPacker.h"
27 #include "dumpZip.h"
28 #include "readZip.h"
29 #include "strPrint.h"
30 #include "stringCheck.h"
31 #include <assert.h>
32 #include <cmath>
33 #include <queue>
34 
37 {
38  assert(LUTA);
39  assert(LUTB);
40  assert(LUTA->getCell()->isLUT() && !LUTA->getCell()->isLUT6());
41  assert(LUTB->getCell()->isLUT() && !LUTB->getCell()->isLUT6());
42 }
43 
44 void IncrementalBELPacker::LUTFFPairing(float disThreshold)
45 {
46  print_status("IncrementalBELPacker Pairing LUTs and FFs.");
47  std::vector<PlacementInfo::Location> &cellLoc = placementInfo->getCellId2location();
48  LUTFFPairs.clear();
49  std::vector<bool> packed(placementUnpackedCells.size(), false);
50  std::vector<PlacementInfo::PlacementUnpackedCell *> oriPlacementUnpackedCells = placementUnpackedCells;
51 
52  placementUnits.resize(placementMacros.size());
53 
54  int LUTTO1FFPackedCnt = 0;
55  int LUTTOMultiFFPackedCnt = 0;
56  for (auto unpackedCell : oriPlacementUnpackedCells)
57  {
58  DesignInfo::DesignCell *curCell = unpackedCell->getCell();
59  if (curCell->isLUT())
60  {
61  assert(curCell->getOutputPins().size() > 0);
62  if (curCell->getOutputPins().size() == 1)
63  {
64  if (curCell->getOutputPins()[0]
65  ->isUnconnected()) // interestingly, some LUTs generated by Vivado might have no output
66  continue;
67  assert(curCell->getOutputPins()[0]->getNet());
68  if (curCell->getOutputPins()[0]->getNet()->getPinsBeDriven().size() == 1)
69  {
70  auto pinBeDriven = curCell->getOutputPins()[0]->getNet()->getPinsBeDriven()[0];
71  assert(pinBeDriven->getCell());
72  auto FFBeDriven = pinBeDriven->getCell();
73  if (FFBeDriven->isFF() && cellInMacros.find(FFBeDriven) == cellInMacros.end())
74  {
75  if (getCellDistance(cellLoc[FFBeDriven->getCellId()], cellLoc[curCell->getCellId()]) <
76  disThreshold)
77  {
78  LUTFFPairs.emplace_back(curCell, FFBeDriven);
81  cellId2PlacementUnitVec[FFBeDriven->getCellId()]);
82  FFPU->setPacked();
83  unpackedCell->setPacked();
84 
86  curCell->getName(), placementUnits.size(),
88 
89  curMacro->addOccupiedSite(0.0, 0.0625);
90  curMacro->addCell(curCell, curCell->getCellType(), 0, 0.0);
91  curMacro->addCell(FFBeDriven, FFBeDriven->getCellType(), 0, 0.0);
92  float newX = (cellLoc[curCell->getCellId()].X * curCell->getPins().size() +
93  cellLoc[FFBeDriven->getCellId()].X * FFBeDriven->getPins().size()) /
94  (curCell->getPins().size() + FFBeDriven->getPins().size());
95  float newY = (cellLoc[curCell->getCellId()].Y * curCell->getPins().size() +
96  cellLoc[FFBeDriven->getCellId()].Y * FFBeDriven->getPins().size()) /
97  (curCell->getPins().size() + FFBeDriven->getPins().size());
98  placementInfo->legalizeXYInArea(curMacro, newX, newY);
99  curMacro->setAnchorLocationAndForgetTheOriginalOne(newX, newY);
100  cellLoc[curCell->getCellId()].X = cellLoc[FFBeDriven->getCellId()].X = newX;
101  cellLoc[curCell->getCellId()].Y = cellLoc[FFBeDriven->getCellId()].Y = newY;
102  curMacro->setWeight(
103  compatiblePlacementTable->cellType2sharedBELTypeOccupation[FFBeDriven->getCellType()] +
105  placementMacros.push_back(curMacro);
106  placementUnits.push_back(curMacro);
107 
108  cellId2PlacementUnit[curCell->getCellId()] = curMacro;
109  cellId2PlacementUnit[FFBeDriven->getCellId()] = curMacro;
110 
111  cellInMacros.insert(curCell);
112  cellInMacros.insert(FFBeDriven);
113 
114  LUTTO1FFPackedCnt++;
115  }
116  }
117  }
118  else if (curCell->getOutputPins()[0]->getNet()->getPinsBeDriven().size() <= 4)
119  {
120  float minDis = 1000000000;
121  DesignInfo::DesignCell *FFToPack = nullptr;
122  int drivenFFNum = 0;
123  for (auto pinBeDriven : curCell->getOutputPins()[0]->getNet()->getPinsBeDriven())
124  {
125  assert(pinBeDriven->getCell());
126  auto FFBeDriven = pinBeDriven->getCell();
127  if (FFBeDriven->isFF() && cellInMacros.find(FFBeDriven) == cellInMacros.end())
128  {
129  float curDis =
130  getCellDistance(cellLoc[FFBeDriven->getCellId()], cellLoc[curCell->getCellId()]);
131  if (curDis < disThreshold)
132  {
133  if (curDis < minDis)
134  {
135  minDis = curDis;
136  FFToPack = FFBeDriven;
137  }
138  }
139  drivenFFNum++;
140  }
141  }
142 
143  if (FFToPack && drivenFFNum <= 4)
144  {
145  if (FFToPack->isFF())
146  {
147  if (getCellDistance(cellLoc[FFToPack->getCellId()], cellLoc[curCell->getCellId()]) <
148  disThreshold)
149  {
150  LUTFFPairs.emplace_back(curCell, FFToPack);
153  cellId2PlacementUnitVec[FFToPack->getCellId()]);
154  FFPU->setPacked();
155  unpackedCell->setPacked();
156 
158  curCell->getName(), placementUnits.size(),
160 
161  curMacro->addOccupiedSite(0.0, 0.0625);
162  curMacro->addCell(curCell, curCell->getCellType(), 0, 0.0);
163  curMacro->addCell(FFToPack, FFToPack->getCellType(), 0, 0.0);
164  float newX = (cellLoc[curCell->getCellId()].X * curCell->getPins().size() +
165  cellLoc[FFToPack->getCellId()].X * FFToPack->getPins().size()) /
166  (curCell->getPins().size() + FFToPack->getPins().size());
167  float newY = (cellLoc[curCell->getCellId()].Y * curCell->getPins().size() +
168  cellLoc[FFToPack->getCellId()].Y * FFToPack->getPins().size()) /
169  (curCell->getPins().size() + FFToPack->getPins().size());
170  placementInfo->legalizeXYInArea(curMacro, newX, newY);
171  curMacro->setAnchorLocationAndForgetTheOriginalOne(newX, newY);
172  cellLoc[curCell->getCellId()].X = cellLoc[FFToPack->getCellId()].X = newX;
173  cellLoc[curCell->getCellId()].Y = cellLoc[FFToPack->getCellId()].Y = newY;
174  curMacro->setWeight(
176  ->cellType2sharedBELTypeOccupation[FFToPack->getCellType()] +
178  placementMacros.push_back(curMacro);
179  placementUnits.push_back(curMacro);
180 
181  cellId2PlacementUnit[curCell->getCellId()] = curMacro;
182  cellId2PlacementUnit[FFToPack->getCellId()] = curMacro;
183 
184  cellInMacros.insert(curCell);
185  cellInMacros.insert(FFToPack);
186 
187  LUTTOMultiFFPackedCnt++;
188  }
189  }
190  }
191  }
192  }
193  else
194  {
195  // this is a LUT6_2, has two output pins and we don't pack them temporarily.
196  }
197  }
198  }
199 
200  print_info("IncrementalBELPacker: LUTTO1FFPackedCnt=" + std::to_string(LUTTO1FFPackedCnt));
201  print_info("IncrementalBELPacker: LUTTOMultiFFPackedCnt=" + std::to_string(LUTTOMultiFFPackedCnt));
202  placementUnpackedCells.clear();
203  for (auto unpackedCell : oriPlacementUnpackedCells)
204  {
205  if (!unpackedCell->isPacked())
206  {
207  unpackedCell->renewId(placementUnits.size());
208  placementUnits.push_back(unpackedCell);
209  placementUnpackedCells.push_back(unpackedCell);
210  }
211  else
212  {
213  delete unpackedCell;
214  }
215  }
216 
217  print_status("IncrementalBELPacker Updating Cell-PlacementUnit Mapping");
220  // since new placement units might be generated, we need to update the net information
221  print_status("IncrementalBELPacker Loading Nets");
223 
224  std::map<DesignInfo::DesignCell *, PlacementInfo::PlacementUnit *> cell2PUMap;
225 
226  cell2PUMap.clear();
227  for (auto unpackedCell : placementUnpackedCells)
228  {
229  DesignInfo::DesignCell *curCell = unpackedCell->getCell();
230  assert(cell2PUMap.find(curCell) == cell2PUMap.end());
231  cell2PUMap[curCell] = unpackedCell;
232  }
233 
234  for (auto curMacro : placementMacros)
235  {
236  for (auto curCell : curMacro->getCells())
237  {
238  if (cell2PUMap.find(curCell) != cell2PUMap.end())
239  {
240  std::cout << "recorded PU:" << cell2PUMap[curCell] << "\n";
241  std::cout << "another PU:" << curMacro << "\n";
242  std::cout.flush();
243  }
244  assert(cell2PUMap.find(curCell) == cell2PUMap.end());
245  cell2PUMap[curCell] = curMacro;
246  }
247  }
248 
249  print_status("IncrementalBELPacker Paired LUTs and FFs (#Pairs = " + std::to_string(LUTFFPairs.size()) + ")");
250  dumpPairedLUTFF();
251 }
252 
253 void IncrementalBELPacker::FFPairing(float disThreshold)
254 {
255  print_status("IncrementalBELPacker Pairing FFs.");
256  std::vector<PlacementInfo::Location> &cellLoc = placementInfo->getCellId2location();
257  FF_FFPairs.clear();
258  std::vector<bool> packed(placementUnpackedCells.size(), false);
259  std::vector<PlacementInfo::PlacementUnpackedCell *> oriPlacementUnpackedCells = placementUnpackedCells;
260 
261  placementUnits.resize(placementMacros.size());
262  std::set<PlacementInfo::PlacementUnpackedCell *> packedCells;
263  int FFPairedCnt = 0;
264  int FFCouldBePackedCnt = 0;
265 
266  for (auto CS : designInfo->getControlSets())
267  {
268  auto &FFs = CS->getFFs();
269  std::vector<FFLocation> FFpoints;
270  FFpoints.clear();
271 
272  for (auto curFF : FFs)
273  {
274  auto tmpPU = cellId2PlacementUnit[curFF->getCellId()];
275  if (auto unpackedCell = dynamic_cast<PlacementInfo::PlacementUnpackedCell *>(tmpPU))
276  {
277  FFpoints.emplace_back(unpackedCell);
278  FFCouldBePackedCnt++;
279  }
280  }
281 
282  // build k-d tree
283  kdt::KDTree<FFLocation> kdtree(FFpoints, y2xRatio);
284 
285  for (auto &FFTmpPoint : FFpoints)
286  {
287  auto FF0 = FFTmpPoint.getUnpackedCell();
288 
289  if (packedCells.find(FF0) != packedCells.end())
290  continue;
291  // K-nearest neighbor search (gets indices to neighbors)
292  int k = 10;
293  FFLocation query(FF0);
294  std::vector<int> indices = kdtree.knnSearch(query, k);
295  int closestInd = -1;
296  float closetDis = 10000000;
297  for (auto tmpInd : indices)
298  {
299  auto tmpPU1 = FFpoints[tmpInd].getUnpackedCell();
300  if (auto FF1 = dynamic_cast<PlacementInfo::PlacementUnpackedCell *>(tmpPU1))
301  {
302  if (packedCells.find(FF1) != packedCells.end())
303  continue;
304  if (FF0 == FF1)
305  continue;
306  DesignInfo::DesignCell *FFCell0 = FF0->getCell();
307  DesignInfo::DesignCell *FFCell1 = FF1->getCell();
308  float dis = getCellDistance(cellLoc[FFCell0->getCellId()], cellLoc[FFCell1->getCellId()]);
309  if (dis < disThreshold)
310  {
311  if (dis < closetDis)
312  {
313  closetDis = dis;
314  closestInd = tmpInd;
315  }
316  }
317  }
318  }
319 
320  if (closestInd >= 0)
321  {
322  auto FF1 = FFpoints[closestInd].getUnpackedCell();
323  DesignInfo::DesignCell *FFCell0 = FF0->getCell();
324  DesignInfo::DesignCell *FFCell1 = FF1->getCell();
325  FF_FFPairs.emplace_back(FFCell0, FFCell1);
326  FF0->setPacked();
327  FF1->setPacked();
328 
331 
332  curMacro->addOccupiedSite(0.0, 0.0625);
333  curMacro->addCell(FFCell0, FFCell0->getCellType(), 0, 0.0);
334  curMacro->addCell(FFCell1, FFCell1->getCellType(), 0, 0.0);
335  float newX = (cellLoc[FFCell0->getCellId()].X * FFCell0->getPins().size() +
336  cellLoc[FFCell1->getCellId()].X * FFCell1->getPins().size()) /
337  (FFCell0->getPins().size() + FFCell1->getPins().size());
338  float newY = (cellLoc[FFCell0->getCellId()].Y * FFCell0->getPins().size() +
339  cellLoc[FFCell1->getCellId()].Y * FFCell1->getPins().size()) /
340  (FFCell0->getPins().size() + FFCell1->getPins().size());
341  placementInfo->legalizeXYInArea(curMacro, newX, newY);
342  curMacro->setAnchorLocationAndForgetTheOriginalOne(newX, newY);
343  cellLoc[FFCell0->getCellId()].X = cellLoc[FFCell1->getCellId()].X = newX;
344  cellLoc[FFCell0->getCellId()].Y = cellLoc[FFCell1->getCellId()].Y = newY;
347  placementMacros.push_back(curMacro);
348  placementUnits.push_back(curMacro);
349 
350  cellId2PlacementUnit[FFCell0->getCellId()] = curMacro;
351  cellId2PlacementUnit[FFCell1->getCellId()] = curMacro;
352 
353  assert(cellInMacros.find(FFCell0) == cellInMacros.end());
354  assert(cellInMacros.find(FFCell1) == cellInMacros.end());
355  cellInMacros.insert(FFCell0);
356  cellInMacros.insert(FFCell1);
357 
358  packedCells.insert(FF0);
359  packedCells.insert(FF1);
360 
361  FFPairedCnt++;
362  }
363  }
364  }
365 
366  print_info("IncrementalBELPacker: 2FFPairedCnt=" + std::to_string(FFPairedCnt));
367  print_info("IncrementalBELPacker: FFCouldBePackedCnt=" + std::to_string(FFCouldBePackedCnt));
368  placementUnpackedCells.clear();
369  for (auto unpackedCell : oriPlacementUnpackedCells)
370  {
371  if (!unpackedCell->isPacked())
372  {
373  unpackedCell->renewId(placementUnits.size());
374  placementUnits.push_back(unpackedCell);
375  placementUnpackedCells.push_back(unpackedCell);
376  }
377  else
378  {
379  delete unpackedCell;
380  }
381  }
382 
383  print_status("IncrementalBELPacker Updating Cell-PlacementUnit Mapping");
386  // since new placement units might be generated, we need to update the net information
387  print_status("IncrementalBELPacker Loading Nets");
389 
390  std::map<DesignInfo::DesignCell *, PlacementInfo::PlacementUnit *> cell2PUMap;
391 
392  cell2PUMap.clear();
393  for (auto unpackedCell : placementUnpackedCells)
394  {
395  DesignInfo::DesignCell *curCell = unpackedCell->getCell();
396  assert(cell2PUMap.find(curCell) == cell2PUMap.end());
397  cell2PUMap[curCell] = unpackedCell;
398  }
399 
400  for (auto curMacro : placementMacros)
401  {
402  for (auto curCell : curMacro->getCells())
403  {
404  if (cell2PUMap.find(curCell) != cell2PUMap.end())
405  {
406  std::cout << "recorded PU:" << cell2PUMap[curCell] << "\n";
407  std::cout << "another PU:" << curMacro << "\n";
408  std::cout.flush();
409  }
410  assert(cell2PUMap.find(curCell) == cell2PUMap.end());
411  cell2PUMap[curCell] = curMacro;
412  }
413  }
414 
415  print_status("IncrementalBELPacker Paired LUTs and FFs (#Pairs = " + std::to_string(LUTFFPairs.size()) + ")");
416  dumpPairedLUTFF();
417 }
418 
420 {
421  if (JSONCfg.find("DumpLUTFFPair") != JSONCfg.end())
422  {
423  std::string dumpFile = JSONCfg["DumpLUTFFPair"] + "-" + std::to_string(LUTFFPairDumpCnt) + ".gz";
424  print_status("IncrementalBELPacker: dumping LUTFFPair archieve to: " + dumpFile);
426  if (dumpFile != "")
427  {
428  std::stringstream outfile0;
429  for (auto curPair : LUTFFPairs)
430  {
431  outfile0 << curPair.first->getName() << " " << curPair.second->getName() << "\n";
432  }
433  writeStrToGZip(dumpFile, outfile0);
434  print_status("IncrementalBELPacker: dumped LUTFFPair archieve to: " + dumpFile);
435  }
436  }
437 }
readZip.h
PlacementInfo::CompatiblePlacementTable::cellType2sharedBELTypeOccupation
std::map< DesignInfo::DesignCellType, int > cellType2sharedBELTypeOccupation
the resource demand of specific types. (cost how many slot/BELs)
Definition: PlacementInfo.h:144
PlacementInfo::PlacementUnit::setPacked
void setPacked()
Definition: PlacementInfo.h:1369
DesignInfo::DesignCell::getOutputPins
std::vector< DesignPin * > & getOutputPins()
Definition: DesignInfo.h:914
PlacementInfo::PlacementMacro
a fixed group of multiple standard cells with constraints of their relative locations
Definition: PlacementInfo.h:1525
DesignInfo::DesignCell::isLUT6
bool isLUT6()
Definition: DesignInfo.h:923
PlacementInfo::PlacementUnit::setWeight
void setWeight(int numCell)
Definition: PlacementInfo.h:1196
DesignInfo::DesignCell
a DesignCell in design netlist, DesignPin objects of which might connect to DesignNet objects
Definition: DesignInfo.h:782
IncrementalBELPacker::LUTFFPairing
void LUTFFPairing(float disThreshold)
try to pair LUTs/FFs in the design netlist which are neighbors according to a given threshold and con...
Definition: IncrementalBELPacker.cc:44
IncrementalBELPacker::y2xRatio
float y2xRatio
Definition: IncrementalBELPacker.h:175
PlacementInfo::getCellId2location
std::vector< Location > & getCellId2location()
Definition: PlacementInfo.h:3600
IncrementalBELPacker::compatiblePlacementTable
PlacementInfo::CompatiblePlacementTable * compatiblePlacementTable
Definition: IncrementalBELPacker.h:161
DesignInfo::DesignCell::getCellType
DesignCellType getCellType()
Definition: DesignInfo.h:881
IncrementalBELPacker::JSONCfg
std::map< std::string, std::string > & JSONCfg
Definition: IncrementalBELPacker.h:169
PlacementInfo::updateCells2PlacementUnits
void updateCells2PlacementUnits()
update the mapping from Cells to PlacementUnits, since sometime, PlacementUnits might change
Definition: PlacementInfo.cc:1683
PlacementInfo::PlacementMacro::PlacementMacroType_FFFFPair
@ PlacementMacroType_FFFFPair
Definition: PlacementInfo.h:1531
IncrementalBELPacker::placementMacros
std::vector< PlacementInfo::PlacementMacro * > & placementMacros
Definition: IncrementalBELPacker.h:164
dumpZip.h
IncrementalBELPacker::FFLocation
FFLocation records the FF cell pointer and the location of the FF cell for kdt::KDTree construction w...
Definition: IncrementalBELPacker.h:114
DesignInfo::getControlSets
std::vector< ControlSetInfo * > & getControlSets()
Get the control sets in the design.
Definition: DesignInfo.h:1575
PlacementInfo::reloadNets
void reloadNets()
update PlacementNet objects when there are some updates of PlacementUnit objects (e....
Definition: PlacementInfo.cc:507
stringCheck.h
PlacementInfo::updateElementBinGrid
void updateElementBinGrid()
map design cells to the bins in the bin grid.
Definition: PlacementInfo.cc:906
IncrementalBELPacker::placementUnits
std::vector< PlacementInfo::PlacementUnit * > & placementUnits
Definition: IncrementalBELPacker.h:162
strPrint.h
DesignInfo::DesignCell::isFF
bool isFF()
Definition: DesignInfo.h:933
print_status
void print_status(std::string tmp_string)
Definition: strPrint.cc:44
PlacementInfo::PlacementMacro::PlacementMacroType_LUTFFPair
@ PlacementMacroType_LUTFFPair
Definition: PlacementInfo.h:1529
IncrementalBELPacker::dumpPairedLUTFF
void dumpPairedLUTFF()
Definition: IncrementalBELPacker.cc:419
DesignInfo::DesignElement::getName
const std::string & getName() const
Definition: DesignInfo.h:243
IncrementalBELPacker::placementUnpackedCells
std::vector< PlacementInfo::PlacementUnpackedCell * > & placementUnpackedCells
Definition: IncrementalBELPacker.h:163
IncrementalBELPacker::cellInMacros
std::set< DesignInfo::DesignCell * > & cellInMacros
Definition: IncrementalBELPacker.h:166
IncrementalBELPacker::cellId2PlacementUnitVec
std::vector< PlacementInfo::PlacementUnit * > & cellId2PlacementUnitVec
Definition: IncrementalBELPacker.h:168
DesignInfo::DesignCell::getCellId
int getCellId()
Get the Cell Id in the cell list.
Definition: DesignInfo.h:1037
PlacementInfo::PlacementUnpackedCell::getCell
DesignInfo::DesignCell * getCell()
Definition: PlacementInfo.h:1497
DesignInfo::DesignCell::isLUT
bool isLUT()
Definition: DesignInfo.h:927
writeStrToGZip
void writeStrToGZip(std::string fileName, std::stringstream &data)
Definition: dumpZip.cc:29
PlacementInfo::legalizeXYInArea
void legalizeXYInArea(PlacementUnit *curPU, float &fX, float &fY)
move the PlacementUnit to ensure the cells in it are within the device area.
Definition: PlacementInfo.h:3364
PlacementInfo::PlacementMacro::addOccupiedSite
void addOccupiedSite(float siteOffset, float occ)
for site-level cell spreading
Definition: PlacementInfo.h:1827
IncrementalBELPacker.h
This header file contains the definitions of IncrementalBELPacker class and its internal modules and ...
IncrementalBELPacker::LUTFFPairDumpCnt
int LUTFFPairDumpCnt
Definition: IncrementalBELPacker.h:174
IncrementalBELPacker::isLUTsPackable
void isLUTsPackable(PlacementInfo::PlacementUnpackedCell *LUTA, PlacementInfo::PlacementUnpackedCell *LUTB)
check whether two LUTs can be packed to share one BEL
Definition: IncrementalBELPacker.cc:35
DesignInfo::DesignCell::getPins
std::vector< DesignPin * > & getPins()
Definition: DesignInfo.h:893
IncrementalBELPacker::getCellDistance
float getCellDistance(PlacementInfo::Location &A, PlacementInfo::Location &B)
Definition: IncrementalBELPacker.h:103
PlacementInfo::PlacementMacro::addCell
void addCell(DesignInfo::DesignCell *curCell, DesignInfo::DesignCellType cellType, float x, float y)
add a real cell into the macro with its offsets in the macro
Definition: PlacementInfo.h:1576
PlacementInfo::PlacementUnit::setAnchorLocationAndForgetTheOriginalOne
void setAnchorLocationAndForgetTheOriginalOne(float x, float y)
Definition: PlacementInfo.h:1128
PlacementInfo::PlacementUnpackedCell
the smallest, indivisible, representable component. It will include only one standard cell
Definition: PlacementInfo.h:1447
print_info
void print_info(std::string tmp_string)
Definition: strPrint.cc:39
IncrementalBELPacker::LUTFFPairs
std::vector< std::pair< DesignInfo::DesignCell *, DesignInfo::DesignCell * > > LUTFFPairs
Definition: IncrementalBELPacker.h:172
IncrementalBELPacker::designInfo
DesignInfo * designInfo
Definition: IncrementalBELPacker.h:158
IncrementalBELPacker::placementInfo
PlacementInfo * placementInfo
Definition: IncrementalBELPacker.h:160
IncrementalBELPacker::FF_FFPairs
std::vector< std::pair< DesignInfo::DesignCell *, DesignInfo::DesignCell * > > FF_FFPairs
Definition: IncrementalBELPacker.h:173
IncrementalBELPacker::FFPairing
void FFPairing(float disThreshold)
try to pair FFs in the design netlist which are neighbors according to a given threshold and the cont...
Definition: IncrementalBELPacker.cc:253
IncrementalBELPacker::cellId2PlacementUnit
std::map< int, PlacementInfo::PlacementUnit * > & cellId2PlacementUnit
Definition: IncrementalBELPacker.h:167