Program Listing for File coarsen.h

Return to documentation for file (src/partition/coarsen.h)

#ifndef COARSEN_H
#define COARSEN_H

#include "defs.h"
#include "evaluator.h"
#include "tools.h"

using namespace std;


enum class CoarsenOrder {
  RANDOM,
  DEGREE,
  SIZE,
  TIMING,
  DEFAULT
};

struct ContractedHyperedgeInformation {
  int he = -1;
  unsigned long long hash =
      42ULL;
  size_t size = std::numeric_limits<size_t>::
      max();
  bool valid = false;
};

class MultilevelCoarsener {
 private:
  const fpga &fpgas;
  int fpga_num;
  int index;
  int multilevel_id =
      0;

  bool
      has_fix;
  bool has_region;
  bool has_io;
  bool force_topo;
  bool has_timing;

  int large_net_threshold;
  int beta;
  double
      coarsening_ratio;
  int coarsen_method = 1;
  int enable_weight_penalty =
      0;
  int thr_coarsen_vertice;

  int seed =
      0;
  int thread;
  VectorXi
      resources_in_one_FPGA;
  CoarsenOrder coarsen_order =
      CoarsenOrder::SIZE;

  kahypar::SparseMap<int, float>
      score_map;
  kahypar::SparseMap<int, float>
      matched_score_map;
  vector<net> tmp_nets;
  vector<int> tmp_incident_nodes;
  vector<vector<int>>
      hyperedge_cluster_id_vec_maps;

  //   float timing_exp_factor;
  //   float net_timing_factor_coarse;
  //   shared_ptr<timingEvaluator> evaluator = nullptr;

  void calTimingPathForGroup(
      const vector<TimingPath> &timing_paths, const vector<int> &map,
      const vector<int> &hyperedge_cluster_id_vec, graph &coarse,
      vector<TimingPath> &timing_paths_c, vector<set<int>> &ins_paths_c,
      flat_hash_map<int, set<pair<int, int>>> &net_insPin_set_c);

  void computeGroupGraph(const graph &finest, int index,
                         const vector<int> &group_map, graph &coarse);
  void candidatePropagation();
  set<int> intersection(const set<int> &set1, const set<int> &set2);

  void coarsening(int l);
  void contraction(int l);
  void parallelContraction(int l);

 public:
  int level;
  vector<int>
      isolated_nodes;
  vector<graph> graphs;
  vector<vector<int>>
      maps;
  vector<vector<int>> map2origins;

  int buildGroupedGraph(const graph &finest, int group_count,
                        const vector<int> &group_map, graph &grouped);

  void deduplicateHyperedges(graph &finest);

  void setCoarsenOrder(int s);

  void setMultilevelId(int id);

  int getMultilevelId() const;

  int COCP_coarsen(const graph &finest, vector<vector<int>> &candidate_parts,
                   int thr_ilp);

  MultilevelCoarsener(const graph &finest, const fpga &fpgas,
                      const PartitionConstraintConfig &constraints,
                      const CoarsenConfig &config, int thread);

  void multilevelCoarsening(const graph &finest);
};

#endif