Program Listing for File HSTimingLocalData.h¶
↰ Return to documentation for file (src/sta/HSTimingLocalData.h)
#pragma once
#include <float.h>
#include <limits>
#include <map>
#include <set>
#include <string>
#include <vector>
#include "HSIOTdmDelay.h"
#include "HSTimingEdge.h"
#include "HSTimingSlackRange.h"
#include "HSTimingUndo.h"
using std::map;
using std::pair;
using std::vector;
class graph;
namespace HSFullTiming {
class HSPartitionFlow;
class HSOuterEdge;
class HSTimingDelta;
class HSTimingLocalData {
public:
HSTimingLocalData(const HSPartitionFlow *parent);
~HSTimingLocalData();
HSTimingLocalData *clone() const;
void buildTimingEdge();
void setHasCutDelay(bool hasCutDelay)
{
m_hasCutDelay = hasCutDelay;
}
int updatePartInfo();
int updatePartInfo(const vector<int> &partInfo);
const vector<int> &getPartInfo() const;
int updateTimingEdge(bool allUpdate);
int updateTimingEdge(
const vector<int> &disableEdgeList, const vector<int> &enableEdgeList,
const vector<int> &delayChangedEdgeList = {});
int updateTimingEdge(vector<pair<int, int>> newParts);
const vector<HSTimingEdge *> &getTimingEdge() const;
const vector<HSOuterEdge *> &getOuterEdge() const;
const vector<vector<float>> &getCutDelays() const
{
return m_cutDelays;
}
const vector<vector<int>> &getFPGADistances() const
{
return m_fpgaDistances;
}
void setEnableRollback(bool enableRollback);
void rollbackUndo();
void compare(HSTimingLocalData *oneLocal, bool verifyRollback = false);
void verifyHop2DataCnt();
// daiyt: 获取maxHop
int getMaxHop() const;
int getMaxHopDataCnt();
// daiyt: 基于当前“按 net+FPGA pair 去重后的 slack bucket 统计”
// 估计前K个最差slack之和。
// K 由当前总割边数自适应决定,并允许使用小数以减小突变。
// 若未传入比例,则默认使用当前实例的 m_topkMinSlackRatio。
double estimateTopkMinSlackSum(double topkMinSlackRatio = -1.0) const;
void setTopkMinSlackRatio(double topkMinSlackRatio)
{
m_topkMinSlackRatio = (topkMinSlackRatio > 0.0) ? topkMinSlackRatio : 0.0;
}
double getTopkMinSlackRatio() const
{
return m_topkMinSlackRatio;
}
map<int, int> getHop2DataCnt() const
{
return m_hop2DataCnt;
}
// daiyt: 获取前K个最差slack
vector<float> getTopkMinSlack(int k);
float getMinSlack();
float getPercentileSlack(float &ratio);
float getAverageSlack();
void printTopkPaths(int k);
void dumpTopkSlackToFile(int k, const std::string &filepath);
void dumpNetCutSlackToFile(const std::string &filepath) const;
void applyDelta(HSTimingDelta *delta);
void setCutDelays(const vector<vector<float>> cutDelays)
{
m_cutDelays = cutDelays;
}
void setFPGADistances(const vector<vector<int>> fpgaDistances)
{
m_fpgaDistances = fpgaDistances;
}
const HSPartitionFlow *getParent() const
{
return m_parent;
}
float getCutDelay(int edgeId) const;
int getFPGADistance(int edgeId) const;
void addSlackUndo(slackData *sData, bool bPostValue);
void removeDataCnt(int edgeId, slackData *sData);
void addDataCnt(int edgeId, slackData *sData);
void setCutWeights(vector<vector<int>> cutWeights)
{
m_cutWeights = cutWeights;
}
double computeCutDelta(const vector<vector<int>> &cutWeights);
int getId();
void setTdmEstimate(const HSIOTdmDelay &tdmEstimate)
{
m_tdmEstimate = tdmEstimate;
}
void updateCutDelays(const graph &g, const vector<int> &parts,
bool useTdmDelay, bool withNet = false);
bool isEmptyIO() const
{
return m_tdmEstimate.isEmptyIO();
}
int getWorstIndex(double topkMinSlackRatio = -1.0);
int getCriticalCut(double topkMinSlackRatio = -1.0);
const vector<map<int, int>> &getNetPair2MinSlackBucketByNet() const
{
return m_netPair2MinSlackBucketByNet;
}
const vector<map<int, int>> &getEdgeSlackBucketCnt() const
{
return m_edgeSlackBucketCnt;
}
const vector<map<int, map<int, int>>> &getNetPair2EdgeMinSlackBucketCntByNet()
const
{
return m_netPair2EdgeMinSlackBucketCntByNet;
}
const map<int, int> &getNetCutSlack2Cnt() const
{
return m_netCutSlack2Cnt;
}
float getOldCutDelay(int edgeId);
int getOldFPGADistance(int edgeId) const;
struct traceInfo {
short hop = 0;
float slack = FLT_MAX;
int preEdgeId = -1;
int edgeId = -1;
};
private:
void clearTimingEdge();
void initTimingEdge();
int updateTimingEdge(map<int, vector<map<int, traceInfo>>> &clk2TraceList,
bool bPostTrace, bool bRetrace);
void rebuildNetCutSlackStats();
void updateNetCutSlackStatsForEdges(const set<int> &edgeIds);
int getTimingCutPairKey(int edgeId, bool useOldPart) const;
int getNetCutMinSlackBucket(int netId, int pairKey) const;
int getEdgeMinSlackBucket(int edgeId) const;
int getMinSlackBucket(const map<int, int> &bucket2Cnt) const;
void updateNetCutSlackOnEdgeMinChange(int netId, int pairKey,
int oldEdgeMinSlackBucket,
int newEdgeMinSlackBucket);
int getSlackIndex(float slack) const
{
return HSFullTiming::slackToBucketIndex(slack);
}
int getFPGADistanceByPart(int partFrom, int partTo) const;
const HSPartitionFlow *m_parent =
nullptr;
const vector<HSOuterEdge *> &m_outerEdgeAll;
vector<HSTimingEdge *>
m_timingEdgeAll;
std::vector<int> m_partInfo;
vector<vector<float>> m_cutDelays;
vector<vector<int>>
m_fpgaDistances;
bool m_hasCutDelay =
true;
vector<vector<int>> m_cutWeights;
HSIOTdmDelay m_tdmEstimate;
map<int, int> m_hop2DataCnt;
map<int, int>
m_netCutSlack2Cnt;
vector<map<int, int>>
m_edgeSlackBucketCnt;
vector<map<int, map<int, int>>>
m_netPair2EdgeMinSlackBucketCntByNet;
vector<map<int, int>>
m_netPair2MinSlackBucketByNet;
bool m_enableRollback = false;
bool m_incUpdate = false;
map<int, int> m_partUndo;
vector<EnableUndo> m_enableUndo;
vector<SlackUndo> m_slackUndo;
map<int, int> m_hop2DataCntUndo;
map<int, map<int, int>>
m_edgeSlackBucketCntUndo;
map<int, map<int, map<int, int>>>
m_netPair2EdgeMinSlackBucketCntUndo;
map<int, map<int, int>>
m_netPair2MinSlackBucketUndo;
map<int, int>
m_netCutSlack2CntUndo;
static constexpr int kInvalidTimingCutPairKey =
-1;
static constexpr int kTimingCutPairKeyBase =
1024;
static constexpr int kInvalidSlackBucket =
std::numeric_limits<int>::max();
static constexpr double kDefaultTopkMinSlackRatio =
0.12;
double m_topkMinSlackRatio =
kDefaultTopkMinSlackRatio;
};
} // namespace HSFullTiming