AMF-Placer  2.0
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
WirelengthOptimizer.h
Go to the documentation of this file.
1 
26 #ifndef _WIRELENGTHOPTIMIZER
27 #define _WIRELENGTHOPTIMIZER
28 
29 #include "DesignInfo.h"
30 #include "DeviceInfo.h"
31 #include "Eigen/Eigen"
32 #include "Eigen/SparseCore"
33 #include "PlacementInfo.h"
35 #include "QPSolverWrapper.h"
36 #include <assert.h>
37 #include <fstream>
38 #include <iostream>
39 #include <map>
40 #include <mutex>
41 #include <semaphore.h>
42 #include <set>
43 #include <sstream>
44 #include <string>
45 #include <thread>
46 #include <vector>
47 
54 {
55  public:
63  WirelengthOptimizer(PlacementInfo *placementInfo, std::map<std::string, std::string> &JSONCfg, bool verbose = true);
65  {
66  if (xSolver)
67  delete xSolver;
68  if (ySolver)
69  delete ySolver;
70  for (auto list : PNetId2SlackEnhanceTuples)
71  {
72  if (list)
73  delete list;
74  }
75  }
76 
91  void GlobalPlacementQPSolve(float pesudoNetWeight, bool firstIteration = true,
92  bool forwardSolutionToNextIteration = false, bool enableMacroPseudoNet2Site = false,
93  bool considerNetNum = true, bool enableUserDefinedClusterOpt = false,
94  float displacementLimit = -10, PlacementTimingOptimizer *timingOptimizer = nullptr);
95 
110  void updateB2BNetWeight(float pesudoNetWeight, bool enableMacroPseudoNet2Site = false, bool considerNetNum = true,
111  bool enableUserDefinedClusterOpt = false,
112  PlacementTimingOptimizer *timingOptimizer = nullptr);
113 
133  std::vector<Eigen::Triplet<float>> &objectiveMatrixTripletList,
134  std::vector<float> &objectiveMatrixDiag, Eigen::VectorXd &objectiveVector,
135  float generalNetWeight, float y2xRatio, bool updateX, bool updateY);
136 
144  void reloadPlacementInfo();
145 
155  inline void setMacroLegalizationParameters(int cnt, float macroLegalizationWeight)
156  {
158  oriMacroLegalizationWeight = macroLegalizationWeight;
159  }
160 
167  {
168  return macroPseudoNetCnt;
169  }
170 
177  {
179  }
180 
182  {
183  netPinEnhanceRate.clear();
184  }
185 
186  inline void setGeneralTimingNetWeight(float _generalTimingNetWeight)
187  {
188  generalTimingNetWeight = _generalTimingNetWeight;
189  }
190 
191  inline void setSlackPowerFactor(double _slackPowerFactor)
192  {
193  slackPowerFactor = _slackPowerFactor;
194  }
195 
196  private:
202  static void QPSolve(QPSolverWrapper *&curSolver);
203 
208  void solverLoadData();
209 
214  void solverLoadFixedData();
215 
220  void solverWriteBackData(float displacementLimit);
221 
228  void addPseudoNetForMacros(float pesudoNetWeight, bool considerNetNum);
229 
240  void addPseudoNet2LoctionForAllPUs(float pesudoNetWeight, bool considerNetNum);
241 
250  void updatePseudoNetForUserDefinedClusters(float pesudoNetWeight);
251 
252  typedef struct _slackEnhanceTuple
253  {
254  float weight;
256  float YEnhance;
257 
258  _slackEnhanceTuple(float weight, int PUAId, int PUBId, int PinAId, int PinBId, float YEnhance = 1.0)
260  {
261  }
263  {
264  }
266 
267  std::vector<std::vector<slackEnhanceTuple> *> PNetId2SlackEnhanceTuples;
268 
277  void addPseudoNet_SlackBased(float timingWeight, double slackPowFactor, PlacementTimingOptimizer *timingOptimizer,
278  bool calculate = false);
279 
280  void LUTLUTPairing_TimingDriven(float timingWeight, float disThreshold, PlacementTimingOptimizer *timingOptimizer);
281 
290  void updatePseudoNetForClockRegion(float pesudoNetWeight);
291 
301  inline double manhattanDis(double x0, double y0, double x1, double y1)
302  {
303  return std::abs(x0 - x1) + y2xRatio * std::abs(y0 - y1);
304  }
306  {
307  return fabs(A.X - B.X) + y2xRatio * fabs(A.Y - B.Y);
308  }
309 
310  typedef struct _PUWithScore
311  {
313  float score;
314 
316  {
317  }
319  typedef struct _CellWithScore
320  {
322  float score;
323 
325  {
326  }
328 
330 
333  std::map<std::string, std::string> &JSONCfg;
334  bool verbose;
335 
341  float generalNetWeight = 1.0;
343  double slackPowerFactor = 1.1;
344 
350  float y2xRatio = 1.0;
351 
357  bool useUnconstrainedCG = true;
358 
364  bool MKLorNot = false;
365 
374  bool directMacroLegalize = false;
375 
376  bool DSPCritical = false;
377 
378  float pin2pinEnhance = 5.0;
379 
388 
394 
400 
401  std::map<DesignInfo::DesignNet *, std::vector<float>> netPinEnhanceRate;
402 
403  float slackThr = 0;
404 
405  // For debug usage
406  std::string targetCellName = "design_1_i/DigitRec_0/inst/ap_phi_reg_pp2_iter31_knn_set_392_1_reg_27413_reg[20]";
407  int targetCellId = -1;
408 };
409 
410 #endif
PlacementInfo::Location
Definition: PlacementInfo.h:3595
WirelengthOptimizer::_PUWithScore::_PUWithScore
_PUWithScore(PlacementInfo::PlacementUnit *PU, float score)
Definition: WirelengthOptimizer.h:315
paintPlacement.cnt
int cnt
Definition: paintPlacement.py:155
WirelengthOptimizer::_slackEnhanceTuple::PUBId
int PUBId
Definition: WirelengthOptimizer.h:255
WirelengthOptimizer::QPSolve
static void QPSolve(QPSolverWrapper *&curSolver)
call the cooresponding solver to solve the QP problem defined in the given QPSolverWrapper
WirelengthOptimizer::_slackEnhanceTuple::_slackEnhanceTuple
_slackEnhanceTuple()
Definition: WirelengthOptimizer.h:262
WirelengthOptimizer::_slackEnhanceTuple
Definition: WirelengthOptimizer.h:253
WirelengthOptimizer::updatePseudoNetForClockRegion
void updatePseudoNetForClockRegion(float pesudoNetWeight)
add pseudo nets for clock region
Definition: WirelengthOptimizer.cc:1043
WirelengthOptimizer::ySolver
QPSolverWrapper * ySolver
Definition: WirelengthOptimizer.h:332
WirelengthOptimizer::_CellWithScore::cell
DesignInfo::DesignCell * cell
Definition: WirelengthOptimizer.h:321
PlacementTimingOptimizer.h
DesignInfo::DesignCell
a DesignCell in design netlist, DesignPin objects of which might connect to DesignNet objects
Definition: DesignInfo.h:782
WirelengthOptimizer::netPinEnhanceRate
std::map< DesignInfo::DesignNet *, std::vector< float > > netPinEnhanceRate
Definition: WirelengthOptimizer.h:401
WirelengthOptimizer::placementInfo
PlacementInfo * placementInfo
Definition: WirelengthOptimizer.h:329
WirelengthOptimizer::verbose
bool verbose
Definition: WirelengthOptimizer.h:334
WirelengthOptimizer::addPseudoNet2LoctionForAllPUs
void addPseudoNet2LoctionForAllPUs(float pesudoNetWeight, bool considerNetNum)
as convential QP placers do, we add pseudo nets between anchors and PlacementUnit to constrain the mo...
Definition: WirelengthOptimizer.cc:821
WirelengthOptimizer::_PUWithScore
Definition: WirelengthOptimizer.h:311
WirelengthOptimizer::oriMacroLegalizationWeight
float oriMacroLegalizationWeight
the net weight for macro legalization
Definition: WirelengthOptimizer.h:393
WirelengthOptimizer::PNetId2SlackEnhanceTuples
std::vector< std::vector< slackEnhanceTuple > * > PNetId2SlackEnhanceTuples
Definition: WirelengthOptimizer.h:267
WirelengthOptimizer::LUTLUTPairing_TimingDriven
void LUTLUTPairing_TimingDriven(float timingWeight, float disThreshold, PlacementTimingOptimizer *timingOptimizer)
Definition: WirelengthOptimizer.cc:666
WirelengthOptimizer::getMacroPseudoNetEnhanceCnt
int getMacroPseudoNetEnhanceCnt()
Get the number of the conducted macro iterations.
Definition: WirelengthOptimizer.h:166
WirelengthOptimizer::manhattanDis
double manhattanDis(double x0, double y0, double x1, double y1)
evaluate the Mahattan distance between two locations
Definition: WirelengthOptimizer.h:301
WirelengthOptimizer::_CellWithScore
Definition: WirelengthOptimizer.h:320
WirelengthOptimizer::pin2pinEnhance
float pin2pinEnhance
Definition: WirelengthOptimizer.h:378
WirelengthOptimizer::setMacroLegalizationParameters
void setMacroLegalizationParameters(int cnt, float macroLegalizationWeight)
Set the macro legalization parameters.
Definition: WirelengthOptimizer.h:155
WirelengthOptimizer::clearNetPinEnhanceRate
void clearNetPinEnhanceRate()
Definition: WirelengthOptimizer.h:181
WirelengthOptimizer::_PUWithScore::PU
PlacementInfo::PlacementUnit * PU
Definition: WirelengthOptimizer.h:312
WirelengthOptimizer::useUnconstrainedCG
bool useUnconstrainedCG
indicate whether wirelength optimizer uses Eigen3, which cannot solve QP problem with constraints....
Definition: WirelengthOptimizer.h:357
WirelengthOptimizer::targetCellId
int targetCellId
Definition: WirelengthOptimizer.h:407
PlacementTimingOptimizer
Definition: PlacementTimingOptimizer.h:46
DesignInfo.h
This header file contains the classes of data for a standalone design netlist.
WirelengthOptimizer::updatePseudoNetForUserDefinedClusters
void updatePseudoNetForUserDefinedClusters(float pesudoNetWeight)
add pseudo net for user-defined clusters
Definition: WirelengthOptimizer.cc:955
WirelengthOptimizer::WirelengthOptimizer
WirelengthOptimizer(PlacementInfo *placementInfo, std::map< std::string, std::string > &JSONCfg, bool verbose=true)
Construct a new Wirelength Optimizer object.
Definition: WirelengthOptimizer.cc:31
WirelengthOptimizer::generalNetWeight
float generalNetWeight
a common factor indicate the overall strength of the nets in the QP model from external setting
Definition: WirelengthOptimizer.h:341
WirelengthOptimizer::userDefinedClusterFadeOutFactor
float userDefinedClusterFadeOutFactor
the fade-out factor for the user-defined clusters
Definition: WirelengthOptimizer.h:387
DeviceInfo.h
This header file contains the classes of data for a standalone device.
PlacementInfo::Location::X
float X
Definition: PlacementInfo.h:3596
WirelengthOptimizer::addPseudoNet_SlackBased
void addPseudoNet_SlackBased(float timingWeight, double slackPowFactor, PlacementTimingOptimizer *timingOptimizer, bool calculate=false)
add pseudo net for timing optimization based on the timing slack of each elements in the design netli...
Definition: WirelengthOptimizer.cc:434
WirelengthOptimizer::solverLoadData
void solverLoadData()
load to placement location from PlacementInfo to the solver
Definition: WirelengthOptimizer.cc:142
WirelengthOptimizer::updateB2BNetWeight
void updateB2BNetWeight(float pesudoNetWeight, bool enableMacroPseudoNet2Site=false, bool considerNetNum=true, bool enableUserDefinedClusterOpt=false, PlacementTimingOptimizer *timingOptimizer=nullptr)
update the net weights in the quadratic model according to B2B net HPWL model.
Definition: WirelengthOptimizer.cc:268
WirelengthOptimizer::reloadPlacementInfo
void reloadPlacementInfo()
re-initialize some parameters and optimizer configuration according to the PlacementInfo
Definition: WirelengthOptimizer.cc:69
WirelengthOptimizer::slackEnhanceTuple
struct WirelengthOptimizer::_slackEnhanceTuple slackEnhanceTuple
WirelengthOptimizer::_CellWithScore::_CellWithScore
_CellWithScore(DesignInfo::DesignCell *cell, float score)
Definition: WirelengthOptimizer.h:324
WirelengthOptimizer::_slackEnhanceTuple::PUAId
int PUAId
Definition: WirelengthOptimizer.h:255
delayVisualization.A
A
Definition: delayVisualization.py:85
WirelengthOptimizer::macroPseudoNetCnt
int macroPseudoNetCnt
the number of the conducted macro iterations
Definition: WirelengthOptimizer.h:399
QPSolverWrapper
Definition: QPSolverWrapper.h:41
WirelengthOptimizer::y2xRatio
float y2xRatio
a factor to tune the weights of the net spanning in Y-coordinate relative to the net spanning in X-co...
Definition: WirelengthOptimizer.h:350
WirelengthOptimizer::~WirelengthOptimizer
~WirelengthOptimizer()
Definition: WirelengthOptimizer.h:64
WirelengthOptimizer::_slackEnhanceTuple::YEnhance
float YEnhance
Definition: WirelengthOptimizer.h:256
WirelengthOptimizer::PUWithScore
struct WirelengthOptimizer::_PUWithScore PUWithScore
PlacementInfo::PlacementUnit
a movement unit in placement with information of location and resource demand
Definition: PlacementInfo.h:1010
WirelengthOptimizer::_slackEnhanceTuple::_slackEnhanceTuple
_slackEnhanceTuple(float weight, int PUAId, int PUBId, int PinAId, int PinBId, float YEnhance=1.0)
Definition: WirelengthOptimizer.h:258
WirelengthOptimizer::generalTimingNetWeight
float generalTimingNetWeight
Definition: WirelengthOptimizer.h:342
QPSolverWrapper.h
WirelengthOptimizer::updateB2BNetWeightWorker
static void updateB2BNetWeightWorker(PlacementInfo *placementInfo, std::vector< Eigen::Triplet< float >> &objectiveMatrixTripletList, std::vector< float > &objectiveMatrixDiag, Eigen::VectorXd &objectiveVector, float generalNetWeight, float y2xRatio, bool updateX, bool updateY)
a worker funtion for multi-threading net weight updating
Definition: WirelengthOptimizer.cc:334
WirelengthOptimizer::_CellWithScore::score
float score
Definition: WirelengthOptimizer.h:322
WirelengthOptimizer::JSONCfg
std::map< std::string, std::string > & JSONCfg
Definition: WirelengthOptimizer.h:333
WirelengthOptimizer::_slackEnhanceTuple::weight
float weight
Definition: WirelengthOptimizer.h:254
WirelengthOptimizer::slackPowerFactor
double slackPowerFactor
Definition: WirelengthOptimizer.h:343
WirelengthOptimizer::_slackEnhanceTuple::PinBId
int PinBId
Definition: WirelengthOptimizer.h:255
WirelengthOptimizer::DSPCritical
bool DSPCritical
Definition: WirelengthOptimizer.h:376
WirelengthOptimizer::GlobalPlacementQPSolve
void GlobalPlacementQPSolve(float pesudoNetWeight, bool firstIteration=true, bool forwardSolutionToNextIteration=false, bool enableMacroPseudoNet2Site=false, bool considerNetNum=true, bool enableUserDefinedClusterOpt=false, float displacementLimit=-10, PlacementTimingOptimizer *timingOptimizer=nullptr)
use quadratic model to estimate the HPWL and some timing/user-defined pseudo nets are involved for sp...
Definition: WirelengthOptimizer.cc:100
WirelengthOptimizer::CellWithScore
struct WirelengthOptimizer::_CellWithScore CellWithScore
WirelengthOptimizer::slackThr
float slackThr
Definition: WirelengthOptimizer.h:403
WirelengthOptimizer::_slackEnhanceTuple::PinAId
int PinAId
Definition: WirelengthOptimizer.h:255
WirelengthOptimizer::_PUWithScore::score
float score
Definition: WirelengthOptimizer.h:313
WirelengthOptimizer::getCellDistance
float getCellDistance(PlacementInfo::Location &A, PlacementInfo::Location &B)
Definition: WirelengthOptimizer.h:305
WirelengthOptimizer::getMacroLegalizationWeight
float getMacroLegalizationWeight()
Get the net weight for macro legalization.
Definition: WirelengthOptimizer.h:176
WirelengthOptimizer::solverWriteBackData
void solverWriteBackData(float displacementLimit)
write placement location from the solver to the PlacementInfo
Definition: WirelengthOptimizer.cc:181
WirelengthOptimizer::solverLoadFixedData
void solverLoadFixedData()
load to placement location of fixed PlacementUnits from PlacementInfo to the solver
Definition: WirelengthOptimizer.cc:152
WirelengthOptimizer::addPseudoNetForMacros
void addPseudoNetForMacros(float pesudoNetWeight, bool considerNetNum)
add the legalization pseudo nets to force macros move to the legal sites
Definition: WirelengthOptimizer.cc:356
PlacementInfo.h
This header file mainly contains the definition of class PlacementInfo, including information related...
WirelengthOptimizer::MKLorNot
bool MKLorNot
indicate whether wirelength optimizer is based on MKL library when using OSQP placer,...
Definition: WirelengthOptimizer.h:364
WirelengthOptimizer::targetCellName
std::string targetCellName
Definition: WirelengthOptimizer.h:406
WirelengthOptimizer::directMacroLegalize
bool directMacroLegalize
indicate whether we use direct macro legalization instread of the progressive legalization (2-phase l...
Definition: WirelengthOptimizer.h:374
WirelengthOptimizer::xSolver
QPSolverWrapper * xSolver
Definition: WirelengthOptimizer.h:331
PlacementInfo::Location::Y
float Y
Definition: PlacementInfo.h:3597
WirelengthOptimizer
WirelengthOptimizer builds numerical models based on the element locations and calls solvers to find ...
Definition: WirelengthOptimizer.h:54
WirelengthOptimizer::setSlackPowerFactor
void setSlackPowerFactor(double _slackPowerFactor)
Definition: WirelengthOptimizer.h:191
WirelengthOptimizer::setGeneralTimingNetWeight
void setGeneralTimingNetWeight(float _generalTimingNetWeight)
Definition: WirelengthOptimizer.h:186
PlacementInfo
Information related to FPGA placement (wirelength optimization, cell spreading, legalization,...
Definition: PlacementInfo.h:59