Program Listing for File evaluator.h

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

#ifndef EVALUATOR_H
#define EVALUATOR_H

#include "../sta/sta.h"
#include "tools.h"

using namespace std;
using phmap::flat_hash_map;


struct TimingPathCompare {
  bool operator()(const TimingPath &a, const TimingPath &b)
  {
    return floatNumLess(a.slack_new, b.slack_new);
  }
};

struct PathStats {
  int tot_num_path =
      0;
  int worst_cut_path = 0;
  int tot_cut_on_all_path =
      0;
  float avg_cut_path = 0;

  // the following slacks are relative values before guardband
  // minimum slack of all the paths before partitioning
  float old_worst_slack =
      1;
  // minimum slack of all the paths after partitioning
  float new_worst_slack =
      1;

  // Cut on the timing path with the minimum slack before partitioning
  int cut_on_worstSlackOfOld =
      0;
  // Cut on the timing path with the minimum slack after partitioning
  int cut_on_worstSlackOfNew = 0;
  int new_index = 0;
  int old_index = 0;

  // TritonPart的评价指标(该项目可能只作参考统计使用)
  int tot_num_critical_path = 0;
  int tot_num_noncritical_path =
      0;
  int worst_cut_critical_path =
      0;
  // average number of cuts on each critical path
  float avg_cut_critical_path = 0;
  // total number of noncritical paths become critical
  int number_non2critical_path =
      0;
  // worst number of cuts on noncritical paths that become critical
  int worst_cut_non2critical_path =
      0;
  // average number of cuts on noncritical paths that become critical
  float avg_cut_non2critical_path =
      0.0f;
  float fpga_delay =
      0.0f;
  float die_delay = 0.0f;
  int worst_die_hop =
      0;
  // Hop on the timing path with the minimum slack before partitioning
  int die_hop_on_worstSlackOfOld =
      0;
  // Hop on the timing path with the minimum slack after partitioning
  int die_hop_on_worstSlackOfNew =
      0;
  vector<int> block_path;
  vector<double> tdm_path;
};

class timingEvaluator {
 private:
  float net_timing_factor_coarse;
  float net_timing_factor_refine;
  float path_timing_factor;
  float
      path_snaking_factor;
  float timing_exp_factor;
  bool guardband_flag;
  int has_timing_propogate;
  int propogate_effort_value;
  int path_slack_update_mode;
  int enable_partition_HSFulltiming;
  // int isUpdateGraph;
  int skip_path_timing;
  flat_hash_map<pair<int, int>, pinSlack>
      pin_minslack;
  flat_hash_map<pair<int, int>, vector<int>>
      pin_paths;
  vector<TimingPath>
      original_timing_paths;
  shared_ptr<curPartStatus>
      mulClock_status;
  graph
      originHgraph;
  shared_ptr<mulClockAttr>
      clockAttr;

 public:
  timingEvaluator(float net_timing_factor_coarse,
                  float net_timing_factor_refine, float path_timing_factor,
                  float path_snaking_factor, float timing_exp_factor,
                  bool guardband_flag, int has_timing_propogate,
                  int propogate_effort_value,
                  flat_hash_map<pair<int, int>, pinSlack> pin_minslack,
                  flat_hash_map<pair<int, int>, vector<int>> pin_paths,
                  vector<TimingPath> original_timing_paths,
                  int path_slack_update_mode,
                  shared_ptr<curPartStatus> mulClock_status, graph originHgraph,
                  shared_ptr<mulClockAttr> clockAttr,
                  int enable_partition_HSFulltiming, int skip_path_timing);

  timingEvaluator();

  timingEvaluator(const timingEvaluator &) = delete;
  timingEvaluator(timingEvaluator &)       = delete;
  virtual ~timingEvaluator()               = default;

  float getNetTimingFactorCoarse() const
  {
    return net_timing_factor_coarse;
  }
  float getNetTimingFactorRefine() const
  {
    return net_timing_factor_refine;
  }
  float getPathtimingfactor() const
  {
    return path_timing_factor;
  }
  float getPathSnakingFactor() const
  {
    return path_snaking_factor;
  }
  float getTimingExpFactor() const
  {
    return timing_exp_factor;
  }
  bool getGuardbandFlag() const
  {
    return guardband_flag;
  }
  int getTimingPropogateFlag() const
  {
    return has_timing_propogate;
  }
  int getPropogaEffortValue() const
  {
    return propogate_effort_value;
  }
  int getPathSlackUpdateMode() const
  {
    return path_slack_update_mode;
  }
  int getEnablePartitionHSFulltiming() const
  {
    return enable_partition_HSFulltiming;
  }
  int getSkipPathTiming() const
  {
    return skip_path_timing;
  }

  shared_ptr<curPartStatus> getMulClockStatus() const
  {
    return mulClock_status;
  }
  flat_hash_map<pair<int, int>, pinSlack> getPinSlacks() const
  {
    return pin_minslack;
  }
  flat_hash_map<pair<int, int>, vector<int>> getInsPinPaths() const
  {
    return pin_paths;
  }
  vector<TimingPath> getTimingPaths() const
  {
    return original_timing_paths;
  }
  graph getOriginHgraph() const
  {
    return originHgraph;
  }
  shared_ptr<mulClockAttr> getClockAttr() const
  {
    return clockAttr;
  }

  timing init(timing timingInfo) const;

  // --------------------------------------------------------------------------------
  // // 时序评价与统计汇报使用的静态工具接口:
  // --------------------------------------------------------------------------------
  // //

  static int getCutOnPath(const vector<int> &path, const vector<int> &parts);

  static PathStats getTimingCutsOld(const graph &hgraph,
                                    const vector<int> &parts,
                                    const float &extra_delay_cut);

  static void PrintPathStatsOld(const PathStats &path_stats);

  static PathStats getTimingCuts2(
      graph &hgraph, const vector<int> &parts, const vector<vector<int>> &dist,
      const int &guardband_flag, const float &extra_delay_cut,
      float &maximum_clock_period, shared_ptr<timingEvaluator> &evaluator,
      const int &fpga_num,
      const flat_hash_map<int, float> &original_pin_minslack,
      const flat_hash_map<pair<int, int>, vector<int>> &pin_paths,
      const vector<TimingPath> &original_timing_paths,
      const int &has_timing_base);

  static void PrintSlackStats(const PathStats &path_stats, const bool &has_die,
                              const bool &consider_tdm,
                              const shared_ptr<mulClockAttr> &mul_clock_attr,
                              const vector<TimingPath> &timing_paths);

  static void PrintPathStats(PathStats &path_stats,
                             vector<TimingPath> &timing_paths,
                             const bool &has_die, const bool &consider_tdm,
                             const shared_ptr<mulClockAttr> &mul_clock_attr);

  static ofstream
      fout;

  static float getWorstSlackAfterCutsForOldSlack(
      graph &hgraph, const vector<int> &parts, const vector<vector<int>> &dist,
      const int &guardband_flag,
      const shared_ptr<curPartStatus> &mulClock_status);

  static float getWorstSlackAfterCutsForOldSlackConsideringTDM(
      graph &hgraph, const vector<int> &parts, const fpga &fpgas,
      const int &guardband_flag,
      const shared_ptr<curPartStatus> &mulClock_status);

  static float getWorstSlackAfterCuts(graph &hgraph, const vector<int> &parts,
                                      const float &extra_delay_cut,
                                      const int &guardband_flag,
                                      const float &clock_period);

  // --------------------------------------------------------------------------------
  // //
  // 细化(Refinement)阶段提供的高频热区微操计算引擎。负责单点腾挪带来的分数加减快速反查:
  // --------------------------------------------------------------------------------
  // //

  static float calCutNetgCost(const graph &g, const vector<int> &parts,
                              int fpga_num);

  static float calCutPathCost(int path_id, const timing &timingInfo,
                              const vector<int> &parts,
                              const vector<vector<int>> &dist,
                              const float &path_timing_factor,
                              const float &path_snaking_factor, const int &v,
                              const int &to);

  static vector<float> getCutPathsCost(const timing &timingInfo,
                                       const vector<int> &parts,
                                       const vector<vector<int>> &dist,
                                       const float &path_timing_factor,
                                       const float &path_snaking_factor);

  static vector<int> getCutHyperedges(const graph &g, const vector<int> &parts,
                                      const vector<pair<int, int>> &die_parts);

  static timing updateTiming(
      const int &has_timing_propogate, shared_ptr<timingEvaluator> evaluator,
      const vector<int> &parts, const fpga &fpgas, const bool &has_timing_tdm,
      const int &path_slack_update_mode, const graph &finest,
      const bool &isUpdateCost, HSFullTiming::HSPartitionFlow &pFlow,
      const shared_ptr<mulClockAttr> &clockAttr, const int &enable_HSFulltiming,
      timing &updatedTimingInfo, float &worst_slack);

  static void preprocessPpath(
      const vector<TimingPath> &original_timing_paths,
      vector<flat_hash_map<pair<int, int>, int>> &ppathValue_to_index,
      const int &psize);

  static void getCutEdgeIds(
      const vector<int> &cut_hyperedges, const graph &g,
      const vector<int> &parts,
      const flat_hash_map<int, set<pair<int, int>>> &net_insPin_set,
      const flat_hash_map<pair<int, int>, int> &pin2Edge, vector<int> &edgeIds,
      const int &l);

  static int convertPathToSimpleTiming(
      HSFullTiming::HSPartitionFlow &pFlow,
      vector<HSFullTiming::HSStaBase::timingpath> &path,
      vector<SimpleTiming> &simpleTimingsCut);

  static void getCutEdgePath(
      const vector<int> &cut_hyperedges, const graph &g,
      const vector<int> &parts,
      const flat_hash_map<int, set<pair<int, int>>> &net_insPin_set,
      HSFullTiming::HSPartitionFlow &pFlow,
      vector<SimpleTiming> &simpleTimingsCut, const bool &entireFlag,
      const int &l);
  static void contractionPath(const vector<int> &nodemap,
                              const vector<TimingPath> &timing_paths,
                              const vector<int> &hyperedge_cluster_id_vec,
                              vector<TimingPath> &timing_paths_c,
                              vector<set<int>> &ins_paths_c,
                              const bool &insPathFlag);
  static void getPathContraction(
      const vector<vector<int>> &maps,
      const vector<vector<int>> &hyperedge_cluster_id_vec_maps,
      const vector<graph> &graphs, const int &l,
      const vector<TimingPath> &cut_timing_paths,
      vector<TimingPath> &graphsl_timing_paths,
      vector<set<int>> &graphsl_ins_paths);
  static void newInfoMerge(vector<TimingPath> &timing_paths,
                           vector<set<int>> &ins_paths,
                           const vector<TimingPath> &timing_paths_newadd,
                           const bool &insPathFlag);
  static void propogateOld1(
      flat_hash_map<pair<int, int>, pinSlack> &pin_minslack,
      const vector<TimingPath> &finest_timing_paths,
      const flat_hash_map<pair<int, int>, vector<int>> &pin_paths,
      const pair<int, int> &pinid);
  static void propogateOld2(
      flat_hash_map<pair<int, int>, pinSlack> &pin_minslack,
      HSFullTiming::HSPartitionFlow &pFlow, const pair<int, int> &pinid);
  static void propogateNew(
      flat_hash_map<pair<int, int>, pinSlack> &pin_minslack,
      const pair<int, int> &pinid);
};

#endif