AMF-Placer  2.0
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
PlacementTimingOptimizer.h
Go to the documentation of this file.
1 
25 #ifndef _PlacementTimingOptimizer
26 #define _PlacementTimingOptimizer
27 
28 #include "DesignInfo.h"
29 #include "DeviceInfo.h"
30 #include "PlacementInfo.h"
31 #include "PlacementTimingInfo.h"
32 #include "dumpZip.h"
33 #include <assert.h>
34 #include <fstream>
35 #include <iostream>
36 #include <map>
37 #include <mutex>
38 #include <semaphore.h>
39 #include <set>
40 #include <sstream>
41 #include <string>
42 #include <thread>
43 #include <vector>
44 
46 {
47  public:
48  PlacementTimingOptimizer(PlacementInfo *placementInfo, std::map<std::string, std::string> &JSONCfg);
50  {
51  }
52 
53  void propogateArrivalTime();
54  std::vector<int> findCriticalPath();
55  std::vector<std::vector<int>> findCriticalPaths(float criticalRatio, bool checkOverlap = true,
56  int pathNumThr = 1000, int converThr = 30);
57  std::vector<std::vector<int>> findCriticalPaths(float criticalRatio,
58  std::vector<bool> &FFDirectlyDrivenButNotInOneSlot);
60  float conductStaticTimingAnalysis(bool enforeOptimisticTiming = false);
62  float targetY);
63  void setPinsLocation();
64  void clusterLongPathInOneClockRegion(int pathLenThr, float clusterThrRatio);
67 
68  void initPois()
69  {
70  pois.push_back(std::exp(-lambdaPois));
71  for (int i = 1; i < poisN; i++)
72  {
73  pois.push_back(pois[i - 1] * lambdaPois / i);
74  }
75  for (int i = 1; i < poisN; i++)
76  {
77  pois[i] = std::pow(pois[i] / pois[100], 0.25);
78  }
79  }
80 
81  inline float getPois(int v)
82  {
83  if (v > 200)
84  {
85  return 0;
86  }
87  else
88  {
89  return pois[v];
90  }
91  }
92 
93  inline float getEffectFactor()
94  {
95  return effectFactor;
96  }
97 
98  inline void setEffectFactor(float _effectFactor)
99  {
100  effectFactor = _effectFactor;
101  }
102 
105  float Y1, float X2, float Y2)
106  {
107  float delay = getDelayByModel_conservative(X1, Y1, X2, Y2);
108  // if (node1->getClusterId() >= 0 && node2->getClusterId() >= 0 &&
109  // node1->getClusterId() != node2->getClusterId() && delay > 0.05)
110  // delay -= 0.05;
111  return delay;
112  }
113 
114  inline float getDelayByModel(float X1, float Y1, float X2, float Y2)
115  {
116  return getDelayByModel_conservative(X1, Y1, X2, Y2);
117  }
118 
119  const float timingC0[10] = {95.05263521, -26.50563359, 77.42394117, 106.29195883, -14.975527};
120  const float timingC1[10] = {123.05017047, -169.25614191, -117.28028144, 208.53573639, 174.2573465};
121  const float timingC2[10] = {234.7694101, -433.99467294, -64.96319998, 373.78606257, 139.45226658};
122 
123  inline float getDelayByModel_conservative(float X1, float Y1, float X2, float Y2)
124  {
125  int clockRegionX0, clockRegionY0;
126  deviceInfo->getClockRegionByLocation(X1, Y1, clockRegionX0, clockRegionY0);
127  int clockRegionX1, clockRegionY1;
128  deviceInfo->getClockRegionByLocation(X2, Y2, clockRegionX1, clockRegionY1);
129 
130  float X = std::fabs(X1 - X2);
131  float Y = std::fabs(Y1 - Y2);
132 
133  if (X * X + Y * Y < 9)
134  {
135  X *= 2;
136  float delay = (timingC0[0] + std::pow(X, 0.3) * timingC0[1] + std::pow(Y, 0.3) * timingC0[2] +
137  std::pow(X, 0.5) * timingC0[3] + std::pow(Y, 0.5) * timingC0[4]) /
138  1000.0;
139  if (std::abs(clockRegionX1 - clockRegionX0) > 1 || clockRegionX1 == 2 || clockRegionX0 == 2)
140  delay += std::abs(clockRegionX1 - clockRegionX0) * 0.5;
141 
142  if (delay < 0.05)
143  delay = 0.05;
144  return delay;
145  }
146  else if (X * X + Y * Y < 36)
147  {
148  X *= 2;
149  float delay = (timingC1[0] + std::pow(X, 0.3) * timingC1[1] + std::pow(Y, 0.3) * timingC1[2] +
150  std::pow(X, 0.5) * timingC1[3] + std::pow(Y, 0.5) * timingC1[4]) /
151  1000.0;
152  if (std::abs(clockRegionX1 - clockRegionX0) > 1 || clockRegionX1 == 2 || clockRegionX0 == 2)
153  delay += std::abs(clockRegionX1 - clockRegionX0) * 0.5;
154 
155  if (delay < 0.05)
156  delay = 0.05;
157  return delay;
158  }
159  else
160  {
161  X *= 2;
162  float delay = (timingC2[0] + std::pow(X, 0.3) * timingC2[1] + std::pow(Y, 0.3) * timingC2[2] +
163  std::pow(X, 0.5) * timingC2[3] + std::pow(Y, 0.5) * timingC2[4]) /
164  1000.0;
165  if (std::abs(clockRegionX1 - clockRegionX0) > 1 || clockRegionX1 == 2 || clockRegionX0 == 2)
166  delay += std::abs(clockRegionX1 - clockRegionX0) * 0.5;
167 
168  if (delay < 0.05)
169  delay = 0.05;
170  return delay;
171  }
172  }
173 
174  inline void pauseCounter()
175  {
176  enableCounter = false;
177  }
178 
179  float getSlackThr();
180  std::map<PlacementInfo::PlacementNet *, int> &getNetActualSlackPinNum()
181  {
182  return netActualSlackPinNum;
183  }
184 
185  std::vector<float> &getPUId2Slack(bool update = false);
186 
187  inline std::vector<PlacementTimingInfo::TimingGraph<DesignInfo::DesignCell>::TimingNode *> &getSortedTimingNodes()
188  {
189  assert(timingInfo);
190  auto timingGraph = timingInfo->getSimplePlacementTimingGraph();
191  timingGraph->sortedEndpointByDelay();
192  return timingGraph->getSortedTimingEndpoints();
193  }
194 
195  private:
200 
201  // settings
202  std::map<std::string, std::string> &JSONCfg;
203 
204  bool verbose = false;
205  float y2xRatio = 1;
206  bool DSPCritical = false;
207 
208  inline float getDis(float x1, float y1, float x2, float y2)
209  {
210  return std::abs(x1 - x2) + y2xRatio * std::abs(y1 - y2);
211  }
212 
213  float xDelayUnit = 0.13; // ns/unit
214  float yDelayUnit = 0.10; // ns/unit
215 
216  int poisN = 1000;
217  float lambdaPois = 100;
218  int STA_Cnt = 0;
219  float effectFactor = 0;
221  std::vector<float> pois;
222  std::vector<std::vector<int>> clockRegionclusters;
223  std::map<PlacementInfo::PlacementNet *, int> netActualSlackPinNum;
224  std::vector<float> PUId2Slack;
225  bool increaseLowDelayVal = false;
226  bool enableCounter = true;
227 };
228 
229 #endif
PlacementTimingOptimizer::DSPCritical
bool DSPCritical
Definition: PlacementTimingOptimizer.h:206
delayVisualization.delay
delay
Definition: delayVisualization.py:55
PlacementTimingOptimizer::getWorstSlackOfCell
float getWorstSlackOfCell(DesignInfo::DesignCell *srcCell)
Definition: PlacementTimingOptimizer.cc:66
PlacementTimingOptimizer::effectFactor
float effectFactor
Definition: PlacementTimingOptimizer.h:219
PlacementTimingOptimizer::initPois
void initPois()
Definition: PlacementTimingOptimizer.h:68
PlacementTimingOptimizer::getDelayByModel
float getDelayByModel(PlacementTimingInfo::TimingGraph< DesignInfo::DesignCell >::TimingNode *node1, PlacementTimingInfo::TimingGraph< DesignInfo::DesignCell >::TimingNode *node2, float X1, float Y1, float X2, float Y2)
Definition: PlacementTimingOptimizer.h:103
PlacementTimingOptimizer::getSortedTimingNodes
std::vector< PlacementTimingInfo::TimingGraph< DesignInfo::DesignCell >::TimingNode * > & getSortedTimingNodes()
Definition: PlacementTimingOptimizer.h:187
PlacementTimingOptimizer::getPois
float getPois(int v)
Definition: PlacementTimingOptimizer.h:81
PlacementTimingOptimizer::clusterLongPathInOneClockRegion
void clusterLongPathInOneClockRegion(int pathLenThr, float clusterThrRatio)
Definition: PlacementTimingOptimizer.cc:526
DesignInfo::DesignCell
a DesignCell in design netlist, DesignPin objects of which might connect to DesignNet objects
Definition: DesignInfo.h:782
PlacementTimingOptimizer::timingC1
const float timingC1[10]
Definition: PlacementTimingOptimizer.h:120
PlacementTimingInfo
PlacementTimingInfo is the container which record the timing information related to placement.
Definition: PlacementTimingInfo.h:49
PlacementTimingOptimizer::stretchClockRegionColumns
void stretchClockRegionColumns()
Definition: PlacementTimingOptimizer.cc:733
PlacementTimingOptimizer::xDelayUnit
float xDelayUnit
Definition: PlacementTimingOptimizer.h:213
PlacementTimingOptimizer::getNetActualSlackPinNum
std::map< PlacementInfo::PlacementNet *, int > & getNetActualSlackPinNum()
Definition: PlacementTimingOptimizer.h:180
PlacementTimingOptimizer::findCriticalPaths
std::vector< std::vector< int > > findCriticalPaths(float criticalRatio, bool checkOverlap=true, int pathNumThr=1000, int converThr=30)
Definition: PlacementTimingOptimizer.cc:119
PlacementTimingOptimizer::PUId2Slack
std::vector< float > PUId2Slack
Definition: PlacementTimingOptimizer.h:224
PlacementTimingOptimizer::incrementalStaticTimingAnalysis_forPUWithLocation
void incrementalStaticTimingAnalysis_forPUWithLocation(PlacementInfo::PlacementUnit *curPU, float targetX, float targetY)
Definition: PlacementTimingOptimizer.cc:474
DeviceInfo::getClockRegionByLocation
void getClockRegionByLocation(float locX, float locY, int &clockRegionX, int &clockRegionY)
Get the clock region ID (X/Y) by a given location (X/Y)
Definition: DeviceInfo.h:1183
PlacementTimingOptimizer::verbose
bool verbose
Definition: PlacementTimingOptimizer.h:204
PlacementTimingOptimizer::poisN
int poisN
Definition: PlacementTimingOptimizer.h:216
PlacementTimingOptimizer
Definition: PlacementTimingOptimizer.h:46
DesignInfo.h
This header file contains the classes of data for a standalone design netlist.
PlacementTimingOptimizer::y2xRatio
float y2xRatio
Definition: PlacementTimingOptimizer.h:205
PlacementTimingOptimizer::designInfo
DesignInfo * designInfo
Definition: PlacementTimingOptimizer.h:198
dumpZip.h
PlacementTimingInfo::TimingGraph::TimingNode
TimingNode is the node in TimingGraph, which could be pin or cell in the design netlist.
Definition: PlacementTimingInfo.h:97
DeviceInfo.h
This header file contains the classes of data for a standalone device.
PlacementTimingOptimizer::deviceInfo
DeviceInfo * deviceInfo
Definition: PlacementTimingOptimizer.h:199
PlacementTimingOptimizer::dumpClockRegionClusters
void dumpClockRegionClusters()
Definition: PlacementTimingOptimizer.cc:848
delayVisualization.X
X
Definition: delayVisualization.py:80
PlacementTimingOptimizer::netActualSlackPinNum
std::map< PlacementInfo::PlacementNet *, int > netActualSlackPinNum
Definition: PlacementTimingOptimizer.h:223
PlacementTimingInfo.h
This header file contains the classes of data which record the timing information related to placemen...
PlacementTimingOptimizer::timingInfo
PlacementTimingInfo * timingInfo
Definition: PlacementTimingOptimizer.h:197
PlacementTimingOptimizer::findCriticalPath
std::vector< int > findCriticalPath()
Definition: PlacementTimingOptimizer.cc:97
PlacementTimingOptimizer::~PlacementTimingOptimizer
~PlacementTimingOptimizer()
Definition: PlacementTimingOptimizer.h:49
PlacementTimingOptimizer::STA_Cnt
int STA_Cnt
Definition: PlacementTimingOptimizer.h:218
PlacementTimingOptimizer::increaseLowDelayVal
bool increaseLowDelayVal
Definition: PlacementTimingOptimizer.h:225
PlacementInfo::PlacementUnit
a movement unit in placement with information of location and resource demand
Definition: PlacementInfo.h:1010
PlacementTimingOptimizer::pauseCounter
void pauseCounter()
Definition: PlacementTimingOptimizer.h:174
PlacementTimingOptimizer::placementInfo
PlacementInfo * placementInfo
Definition: PlacementTimingOptimizer.h:196
PlacementTimingOptimizer::setEffectFactor
void setEffectFactor(float _effectFactor)
Definition: PlacementTimingOptimizer.h:98
PlacementTimingOptimizer::getDelayByModel
float getDelayByModel(float X1, float Y1, float X2, float Y2)
Definition: PlacementTimingOptimizer.h:114
PlacementTimingOptimizer::getDelayByModel_conservative
float getDelayByModel_conservative(float X1, float Y1, float X2, float Y2)
Definition: PlacementTimingOptimizer.h:123
PlacementTimingOptimizer::getEffectFactor
float getEffectFactor()
Definition: PlacementTimingOptimizer.h:93
PlacementTimingOptimizer::pois
std::vector< float > pois
Definition: PlacementTimingOptimizer.h:221
PlacementTimingOptimizer::PlacementTimingOptimizer
PlacementTimingOptimizer(PlacementInfo *placementInfo, std::map< std::string, std::string > &JSONCfg)
Definition: PlacementTimingOptimizer.cc:30
PlacementTimingOptimizer::getDis
float getDis(float x1, float y1, float x2, float y2)
Definition: PlacementTimingOptimizer.h:208
PlacementTimingOptimizer::conductStaticTimingAnalysis
float conductStaticTimingAnalysis(bool enforeOptimisticTiming=false)
Definition: PlacementTimingOptimizer.cc:218
DeviceInfo
Information class related to FPGA device, including the details of BEL/Site/Tile/ClockRegion.
Definition: DeviceInfo.h:43
PlacementTimingOptimizer::clockRegionclusters
std::vector< std::vector< int > > clockRegionclusters
Definition: PlacementTimingOptimizer.h:222
PlacementTimingOptimizer::getSlackThr
float getSlackThr()
Definition: PlacementTimingOptimizer.cc:370
delayVisualization.Y
Y
Definition: delayVisualization.py:80
PlacementTimingOptimizer::getPUId2Slack
std::vector< float > & getPUId2Slack(bool update=false)
Definition: PlacementTimingOptimizer.cc:892
PlacementTimingOptimizer::propogateArrivalTime
void propogateArrivalTime()
Definition: PlacementTimingOptimizer.cc:886
checkHalfColumn.i
int i
Definition: checkHalfColumn.py:5
PlacementTimingOptimizer::yDelayUnit
float yDelayUnit
Definition: PlacementTimingOptimizer.h:214
PlacementTimingOptimizer::enableCounter
bool enableCounter
Definition: PlacementTimingOptimizer.h:226
PlacementTimingOptimizer::lambdaPois
float lambdaPois
Definition: PlacementTimingOptimizer.h:217
PlacementTimingOptimizer::setPinsLocation
void setPinsLocation()
Definition: PlacementTimingOptimizer.cc:46
PlacementTimingOptimizer::timingC2
const float timingC2[10]
Definition: PlacementTimingOptimizer.h:121
PlacementTimingOptimizer::clockRegionClusterTooLarge
bool clockRegionClusterTooLarge
Definition: PlacementTimingOptimizer.h:220
PlacementTimingOptimizer::JSONCfg
std::map< std::string, std::string > & JSONCfg
Definition: PlacementTimingOptimizer.h:202
PlacementInfo.h
This header file mainly contains the definition of class PlacementInfo, including information related...
DesignInfo
Information related to FPGA designs, including design cells and their interconnections.
Definition: DesignInfo.h:51
PlacementTimingOptimizer::timingC0
const float timingC0[10]
Definition: PlacementTimingOptimizer.h:119
PlacementTimingInfo::TimingGraph::sortedEndpointByDelay
void sortedEndpointByDelay()
Definition: PlacementTimingInfo.h:684
PlacementInfo
Information related to FPGA placement (wirelength optimization, cell spreading, legalization,...
Definition: PlacementInfo.h:59
PlacementTimingInfo::getSimplePlacementTimingGraph
TimingGraph< DesignInfo::DesignCell > * getSimplePlacementTimingGraph()
Get the Simple Placement Timing Graph object.
Definition: PlacementTimingInfo.h:850