AMF-Placer  2.0
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
SAPlacer.h
Go to the documentation of this file.
1 
25 #ifndef _SAPLACER
26 #define _SAPLACER
27 
28 #include "strPrint.h"
29 #include "sysInfo.h"
30 #include <assert.h>
31 #include <boost/random.hpp>
32 #include <fstream>
33 #include <iostream>
34 #include <map>
35 #include <sstream>
36 #include <string>
37 #include <thread>
38 #include <vector>
39 
40 class SAPlacer
41 {
42  public:
43  SAPlacer(std::string placerName, std::vector<std::vector<float>> &clusterAdjMat, std::vector<float> &clusterWeights,
44  std::vector<std::vector<float>> &cluster2FixedUnitMat, std::vector<float> &fixedX,
45  std::vector<float> &fixedY, int gridH, int gridW, float deviceH, float deviceW,
46  float connectionToFixedFactor = 5.0, float y2xRatio = 0.8, int Kmax = 100000, int nJobs = 1,
47  int restartNum = 10, bool verbose = false)
52  {
53  }
55  {
56  }
57 
58  void solve();
59 
60  inline std::vector<std::pair<int, int>> &getCluster2XY()
61  {
62  return res_cluster2XY;
63  }
64  inline std::vector<std::vector<std::vector<int>>> &getGrid2clusters()
65  {
66  return res_grid2clusters;
67  }
68 
69  double evaluateClusterPlacement(const std::vector<std::vector<std::vector<int>>> &grid2clusters,
70  const std::vector<std::pair<int, int>> &cluster2XY);
71 
72  double incrementalEvaluateClusterPlacement(const std::vector<std::vector<std::vector<int>>> &grid2clusters,
73  const std::vector<std::pair<int, int>> &cluster2XY);
74 
75  private:
76  std::string placerName;
77 
78  std::vector<std::vector<float>> &clusterAdjMat;
79  std::vector<float> &clusterWeights;
80 
81  std::vector<std::vector<float>> &cluster2FixedUnitMat;
82  std::vector<float> &fixedX;
83  std::vector<float> &fixedY;
84 
85  int gridH;
86  int gridW;
87  float deviceH;
88  float deviceW;
89 
91  float y2xRatio;
92  int Kmax;
93  int nJobs;
95  bool verbose;
96 
97  std::vector<std::pair<int, int>> res_cluster2XY;
98  std::vector<std::vector<std::vector<int>>> res_grid2clusters;
99  double resE;
100 
102 
103  void randomSwapInWideRange(const std::vector<std::vector<std::vector<int>>> &grid2clusters,
104  std::vector<std::vector<std::vector<int>>> &new_Grid2clusters,
105  const std::vector<std::pair<int, int>> &cluster2XY,
106  std::vector<std::pair<int, int>> &new_cluster2XY, float temperature,
107  boost::mt19937 &rng);
108 
109  void randomSwapInWideRangeWithNeighbors(const std::vector<std::vector<std::vector<int>>> &grid2clusters,
110  std::vector<std::vector<std::vector<int>>> &new_Grid2clusters,
111  const std::vector<std::pair<int, int>> &cluster2XY,
112  std::vector<std::pair<int, int>> &new_cluster2XY, float temperature,
113  boost::mt19937 &rng);
114 
115  void randomShuffleRowColumn(const std::vector<std::vector<std::vector<int>>> &grid2clusters,
116  std::vector<std::vector<std::vector<int>>> &new_grid2clusters,
117  const std::vector<std::pair<int, int>> &cluster2XY,
118  std::vector<std::pair<int, int>> &new_cluster2XY, boost::mt19937 &rng);
119 
120  float probabilituFunc(double oriE, double newE, float T);
121 
122  static void worker(SAPlacer *saPlacer, std::vector<std::vector<std::vector<int>>> &init_grid2clusters,
123  std::vector<std::pair<int, int>> &init_cluster2XY,
124  std::vector<std::vector<std::vector<int>>> &opt_grid2clusters,
125  std::vector<std::pair<int, int>> &opt_cluster2XY, int &totalIterNum, int &workers_randomSeed,
126  double &resE);
127 
128  void greedyInitialize(std::vector<std::pair<int, int>> &init_cluster2XY,
129  std::vector<std::vector<std::vector<int>>> &init_grid2clusters, int initOffset);
130 
131  void greedyPlaceACluster(const std::vector<std::pair<int, int>> &init_cluster2XY,
132  const std::vector<std::vector<std::vector<int>>> &init_grid2clusters,
133  std::vector<std::pair<int, int>> &new_cluster2XY,
134  std::vector<std::vector<std::vector<int>>> &new_grid2clusters, int clusterIdToPlace);
135 
136  int greedyFindNextClusterToPlace(std::vector<std::pair<int, int>> &tmp_cluster2XY,
137  std::vector<std::vector<std::vector<int>>> &tmp_grid2clusters);
138 };
139 
140 #endif
SAPlacer::placerName
std::string placerName
Definition: SAPlacer.h:76
SAPlacer::randomSwapInWideRangeWithNeighbors
void randomSwapInWideRangeWithNeighbors(const std::vector< std::vector< std::vector< int >>> &grid2clusters, std::vector< std::vector< std::vector< int >>> &new_Grid2clusters, const std::vector< std::pair< int, int >> &cluster2XY, std::vector< std::pair< int, int >> &new_cluster2XY, float temperature, boost::mt19937 &rng)
Definition: SAPlacer.cc:313
SAPlacer::deviceH
float deviceH
Definition: SAPlacer.h:87
SAPlacer::gridH
int gridH
Definition: SAPlacer.h:85
SAPlacer::clusterWeights
std::vector< float > & clusterWeights
Definition: SAPlacer.h:79
SAPlacer::deviceW
float deviceW
Definition: SAPlacer.h:88
SAPlacer::res_grid2clusters
std::vector< std::vector< std::vector< int > > > res_grid2clusters
Definition: SAPlacer.h:98
SAPlacer::clusterAdjMat
std::vector< std::vector< float > > & clusterAdjMat
Definition: SAPlacer.h:78
SAPlacer::~SAPlacer
~SAPlacer()
Definition: SAPlacer.h:54
SAPlacer::gridW
int gridW
Definition: SAPlacer.h:86
SAPlacer::randomSwapInWideRange
void randomSwapInWideRange(const std::vector< std::vector< std::vector< int >>> &grid2clusters, std::vector< std::vector< std::vector< int >>> &new_Grid2clusters, const std::vector< std::pair< int, int >> &cluster2XY, std::vector< std::pair< int, int >> &new_cluster2XY, float temperature, boost::mt19937 &rng)
Definition: SAPlacer.cc:176
SAPlacer::SACalibrationOffset
double SACalibrationOffset
Definition: SAPlacer.h:101
SAPlacer::connectionToFixedFactor
float connectionToFixedFactor
Definition: SAPlacer.h:90
SAPlacer::randomShuffleRowColumn
void randomShuffleRowColumn(const std::vector< std::vector< std::vector< int >>> &grid2clusters, std::vector< std::vector< std::vector< int >>> &new_grid2clusters, const std::vector< std::pair< int, int >> &cluster2XY, std::vector< std::pair< int, int >> &new_cluster2XY, boost::mt19937 &rng)
Definition: SAPlacer.cc:402
SAPlacer::evaluateClusterPlacement
double evaluateClusterPlacement(const std::vector< std::vector< std::vector< int >>> &grid2clusters, const std::vector< std::pair< int, int >> &cluster2XY)
Definition: SAPlacer.cc:32
SAPlacer::SAPlacer
SAPlacer(std::string placerName, std::vector< std::vector< float >> &clusterAdjMat, std::vector< float > &clusterWeights, std::vector< std::vector< float >> &cluster2FixedUnitMat, std::vector< float > &fixedX, std::vector< float > &fixedY, int gridH, int gridW, float deviceH, float deviceW, float connectionToFixedFactor=5.0, float y2xRatio=0.8, int Kmax=100000, int nJobs=1, int restartNum=10, bool verbose=false)
Definition: SAPlacer.h:43
strPrint.h
SAPlacer::worker
static void worker(SAPlacer *saPlacer, std::vector< std::vector< std::vector< int >>> &init_grid2clusters, std::vector< std::pair< int, int >> &init_cluster2XY, std::vector< std::vector< std::vector< int >>> &opt_grid2clusters, std::vector< std::pair< int, int >> &opt_cluster2XY, int &totalIterNum, int &workers_randomSeed, double &resE)
Definition: SAPlacer.cc:442
SAPlacer::incrementalEvaluateClusterPlacement
double incrementalEvaluateClusterPlacement(const std::vector< std::vector< std::vector< int >>> &grid2clusters, const std::vector< std::pair< int, int >> &cluster2XY)
Definition: SAPlacer.cc:89
sysInfo.h
SAPlacer::getCluster2XY
std::vector< std::pair< int, int > > & getCluster2XY()
Definition: SAPlacer.h:60
SAPlacer::cluster2FixedUnitMat
std::vector< std::vector< float > > & cluster2FixedUnitMat
Definition: SAPlacer.h:81
SAPlacer::solve
void solve()
Definition: SAPlacer.cc:678
SAPlacer
Definition: SAPlacer.h:41
SAPlacer::getGrid2clusters
std::vector< std::vector< std::vector< int > > > & getGrid2clusters()
Definition: SAPlacer.h:64
SAPlacer::probabilituFunc
float probabilituFunc(double oriE, double newE, float T)
Definition: SAPlacer.cc:435
SAPlacer::restartNum
int restartNum
Definition: SAPlacer.h:94
SAPlacer::nJobs
int nJobs
Definition: SAPlacer.h:93
SAPlacer::res_cluster2XY
std::vector< std::pair< int, int > > res_cluster2XY
Definition: SAPlacer.h:97
SAPlacer::fixedY
std::vector< float > & fixedY
Definition: SAPlacer.h:83
SAPlacer::fixedX
std::vector< float > & fixedX
Definition: SAPlacer.h:82
SAPlacer::greedyFindNextClusterToPlace
int greedyFindNextClusterToPlace(std::vector< std::pair< int, int >> &tmp_cluster2XY, std::vector< std::vector< std::vector< int >>> &tmp_grid2clusters)
Definition: SAPlacer.cc:558
SAPlacer::resE
double resE
Definition: SAPlacer.h:99
SAPlacer::y2xRatio
float y2xRatio
Definition: SAPlacer.h:91
SAPlacer::greedyInitialize
void greedyInitialize(std::vector< std::pair< int, int >> &init_cluster2XY, std::vector< std::vector< std::vector< int >>> &init_grid2clusters, int initOffset)
Definition: SAPlacer.cc:609
SAPlacer::verbose
bool verbose
Definition: SAPlacer.h:95
SAPlacer::Kmax
int Kmax
Definition: SAPlacer.h:92
SAPlacer::greedyPlaceACluster
void greedyPlaceACluster(const std::vector< std::pair< int, int >> &init_cluster2XY, const std::vector< std::vector< std::vector< int >>> &init_grid2clusters, std::vector< std::pair< int, int >> &new_cluster2XY, std::vector< std::vector< std::vector< int >>> &new_grid2clusters, int clusterIdToPlace)
Definition: SAPlacer.cc:494