AMF-Placer  2.0
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
GraphPartitioner.h
Go to the documentation of this file.
1 
25 #ifndef _GRAPHPARTITIONER
26 #define _GRAPHPARTITIONER
27 
28 #include "PlacementInfo.h"
29 #include "sysInfo.h"
30 #include <assert.h>
31 #include <fstream>
32 #include <iostream>
33 #include <map>
34 #include <mutex>
35 #include <semaphore.h>
36 #include <set>
37 #include <sstream>
38 #include <string>
39 #include <thread>
40 #include <vector>
41 
42 #define MULTIPROCESS_PARITION
43 
51 template <class NodeList, class NetList> class GraphPartitioner
52 {
53  public:
63  GraphPartitioner(NodeList &nodeList, NetList &netList, int minClusterCellNum, int jobs, bool verbose)
65  {
66  sem_init(&partitionSem, 0, 0);
67  for (int tid = 0; tid < jobs; tid++)
68  sem_post(&partitionSem);
69  }
70 
72  {
73  }
74 
81  void solve(int eachClusterDSPNum, int eachClusterBRAMNum);
82 
88  inline const std::vector<std::vector<int>> &getClusters()
89  {
90  return clusters;
91  }
92 
98  inline const std::vector<std::set<int>> &getClustersPUIdSets()
99  {
100  ClusterPUIdSets.clear();
101  int i = 0;
102  for (auto &tmpCluster : clusters)
103  {
104  ClusterPUIdSets.push_back(std::set<int>());
105  for (auto id : tmpCluster)
106  ClusterPUIdSets[i].insert(id);
107  i++;
108  }
109  return ClusterPUIdSets;
110  }
111 
122  static void recursiveMinCutPartition(std::vector<int> &inputCluster,
123  GraphPartitioner<NodeList, NetList> *graphPartitioner, int eachClusterDSPNum,
124  int eachClusterBRAMNum);
125 
137  unsigned minCutBipartition(const std::vector<int> &inputCluster, std::array<std::vector<int>, 2> &outputClusters,
138  GraphPartitioner<NodeList, NetList> *graphPartitioner, int eachClusterDSPNum,
139  int eachClusterBRAMNum);
140 
148  void setMaxCutRate(double _maxCutRate)
149  {
150  maxCutRate = _maxCutRate;
151  }
152 
153  private:
158  std::vector<std::vector<int>> clusters;
159 
164  std::vector<std::set<int>> ClusterPUIdSets;
165 
171  std::mutex clustersLock, cntLock;
172 
173  double maxCutRate = 0.0333;
174 
175  NodeList &nodeList;
176  NetList &netList;
177  unsigned int minClusterCellNum;
178 
184  void sortClustersBySize();
185 
186  bool verbose;
187 };
188 
189 #ifdef MULTIPROCESS_PARITION
190 #include "ExternalProcessFunc.h"
191 #endif
192 
193 #endif
GraphPartitioner::GraphPartitioner
GraphPartitioner(NodeList &nodeList, NetList &netList, int minClusterCellNum, int jobs, bool verbose)
Construct a new Graph Partitioner object.
Definition: GraphPartitioner.h:63
GraphPartitioner::netList
NetList & netList
Definition: GraphPartitioner.h:176
GraphPartitioner::getClusters
const std::vector< std::vector< int > > & getClusters()
Get the clusters after partitioning (each is a vector containing ids for nodes inside the clusters)
Definition: GraphPartitioner.h:88
GraphPartitioner::getClustersPUIdSets
const std::vector< std::set< int > > & getClustersPUIdSets()
Get the clusters after partitioning (each is a set containing ids for nodes inside the clusters)
Definition: GraphPartitioner.h:98
GraphPartitioner::verbose
bool verbose
Definition: GraphPartitioner.h:186
GraphPartitioner::clusters
std::vector< std::vector< int > > clusters
the resultant clusters (vectors) after partitioning
Definition: GraphPartitioner.h:158
GraphPartitioner::clustersLock
std::mutex clustersLock
Definition: GraphPartitioner.h:171
GraphPartitioner::maxCutRate
double maxCutRate
Definition: GraphPartitioner.h:173
GraphPartitioner
GraphPartitioner will recursively bi-partition the netlist (which could be netlist of clusters) based...
Definition: GraphPartitioner.h:52
GraphPartitioner::~GraphPartitioner
~GraphPartitioner()
Definition: GraphPartitioner.h:71
GraphPartitioner::recursiveMinCutPartition
static void recursiveMinCutPartition(std::vector< int > &inputCluster, GraphPartitioner< NodeList, NetList > *graphPartitioner, int eachClusterDSPNum, int eachClusterBRAMNum)
a recursive function which will recursively bi-partition the input cluster into two based on connecti...
Definition: GraphPartitioner.cc:65
sysInfo.h
GraphPartitioner::partitionSem
sem_t partitionSem
used to limit the number of processes for the parallel partitioning
Definition: GraphPartitioner.h:170
GraphPartitioner::minCutBipartition
unsigned minCutBipartition(const std::vector< int > &inputCluster, std::array< std::vector< int >, 2 > &outputClusters, GraphPartitioner< NodeList, NetList > *graphPartitioner, int eachClusterDSPNum, int eachClusterBRAMNum)
the actual function to call partitioner to conduct partitioning with given clusters and parameters
Definition: GraphPartitioner.cc:108
GraphPartitioner::cntLock
std::mutex cntLock
Definition: GraphPartitioner.h:171
GraphPartitioner::nodeList
NodeList & nodeList
Definition: GraphPartitioner.h:175
GraphPartitioner::sortClustersBySize
void sortClustersBySize()
sort clusters by sizes to fix the output clusters' order for later processing and avoid the random fa...
Definition: GraphPartitioner.cc:45
GraphPartitioner::solve
void solve(int eachClusterDSPNum, int eachClusterBRAMNum)
a caller which will start the partitioning procedure
Definition: GraphPartitioner.cc:32
GraphPartitioner::minClusterCellNum
unsigned int minClusterCellNum
Definition: GraphPartitioner.h:177
checkHalfColumn.i
int i
Definition: checkHalfColumn.py:5
PlacementInfo.h
This header file mainly contains the definition of class PlacementInfo, including information related...
GraphPartitioner::ClusterPUIdSets
std::vector< std::set< int > > ClusterPUIdSets
the resultant clusters (set) after partitioning
Definition: GraphPartitioner.h:164
ExternalProcessFunc.h
This header file contains the definitions of ExternalProcessFunc class and its internal modules and A...
GraphPartitioner::setMaxCutRate
void setMaxCutRate(double _maxCutRate)
Set the max mincut rate.
Definition: GraphPartitioner.h:148