Program Listing for File HSTimingDelta.h¶
↰ Return to documentation for file (src/sta/HSTimingDelta.h)
#pragma once
#include <float.h>
#include <limits>
#include <map>
#include <set>
#include <unordered_map>
#include <vector>
#include "../partition/parallel_hashmap/phmap.h"
#include "HSTimingEdge.h"
#include "HSTimingLocalData.h"
#include "HSTimingSlackRange.h"
using phmap::flat_hash_map;
using std::map;
using std::pair;
using std::set;
using std::unordered_map;
using std::vector;
namespace HSFullTiming {
class HSTimingDelta {
public:
HSTimingDelta(const HSPartitionFlow *parent,
const HSTimingLocalData *oneLocal);
~HSTimingDelta();
int updateTimingEdge(const vector<int> &disableEdgeList,
const vector<int> &enableEdgeList,
const vector<int> &delayChangedEdgeList = {});
int updateTimingEdge(vector<pair<int, int>> newParts);
flat_hash_map<int, int> &getPartDelta()
{
return partDelta;
}
flat_hash_map<int, bool> &getEnableDelta()
{
return enableDelta;
}
flat_hash_map<uint64_t, slackData> &getSlackDelta()
{
return slackDelta;
}
map<int, int> &getHop2DataCnt()
{
return m_hop2DataCnt;
}
const flat_hash_map<int, map<int, int>> &getEdgeSlackBucketCntDelta() const
{
return m_edgeSlackBucketCntDelta;
}
const flat_hash_map<int, map<int, map<int, int>>> &
getNetPair2EdgeMinSlackBucketCntByNetDelta() const
{
return m_netPair2EdgeMinSlackBucketCntByNetDelta;
}
const flat_hash_map<int, map<int, int>> &
getNetPair2MinSlackBucketByNetDelta() const
{
return m_netPair2MinSlackBucketByNetDelta;
}
const map<int, int> &getNetCutSlack2Cnt() const
{
return m_netCutSlack2Cnt;
}
int getMaxHop() const;
int getMaxHopDataCnt();
double estimateTopkMinSlackSum(double topkMinSlackRatio = -1.0) const;
int getWorstIndex(double topkMinSlackRatio = -1.0);
int getCriticalCut(double topkMinSlackRatio = -1.0);
void removeDataCnt(int edgeId, slackData *sData);
void addDataCnt(int edgeId, slackData *sData);
float getCutDelay(int edgeId);
float getOldCutDelay(int edgeId);
int getFPGADistance(int edgeId) const;
int getOldFPGADistance(int edgeId) const;
struct traceInfo {
short hop = 0;
float slack = FLT_MAX;
int preEdgeId = -1;
int edgeId = -1;
};
private:
int getPart(int nodeId) const;
bool getEnable(int edgeId) const;
uint64_t makeKey(int edgeId, int clkId)
{
return (uint64_t(uint32_t(edgeId)) << 32) | uint32_t(clkId);
}
slackData &getSlackData(int edgeId, int clkId);
const slackData &getSlackData_ReadOnly(int edgeId, int clkId);
pair<slackData *, bool> getSlackDataRW(int edgeId, int clkId);
slackData *getSlackDataByPtr(int edgeId, slackData *src);
const map<int, int> &getEdgeSlackBucketCnt_ReadOnly(int edgeId) const;
map<int, int> &getEdgeSlackBucketCntRW(int edgeId);
const map<int, map<int, int>> &
getNetPair2EdgeMinSlackBucketCntByNet_ReadOnly(int netId) const;
map<int, map<int, int>> &getNetPair2EdgeMinSlackBucketCntByNetRW(int netId);
const map<int, int> &getNetPair2MinSlackBucketByNet_ReadOnly(int netId) const;
map<int, int> &getNetPair2MinSlackBucketByNetRW(int netId);
int updateTimingEdge(map<int, vector<map<int, traceInfo>>> &clk2TraceList,
bool bPostTrace);
bool setWorseSlack(int clkId, traceInfo &trace, bool bPostValue);
int getSlackIndex(float slack)
{
return HSFullTiming::slackToBucketIndex(slack);
}
int getFPGADistanceByPart(int partFrom, int partTo) const;
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);
void updateNetCutSlackStatsForEdges(const set<int> &edgeIds);
const HSPartitionFlow *m_parent =
nullptr;
const HSTimingLocalData *m_localData =
nullptr;
const vector<HSOuterEdge *> &m_outerEdgeAll;
const vector<HSTimingEdge *> &m_timingEdgeAll;
const vector<int> &m_partInfo;
const vector<vector<float>>
&m_cutDelays;
const vector<vector<int>>
&m_fpgaDistances;
const vector<map<int, int>>
&m_edgeSlackBucketCntBase;
const vector<map<int, map<int, int>>>
&m_netPair2EdgeMinSlackBucketCntByNetBase;
const vector<map<int, int>>
&m_netPair2MinSlackBucketByNetBase;
flat_hash_map<int, int> partDelta;
flat_hash_map<int, bool>
enableDelta;
flat_hash_map<uint64_t, slackData>
slackDelta;
map<int, int>
m_hop2DataCnt;
flat_hash_map<int, map<int, int>>
m_edgeSlackBucketCntDelta;
flat_hash_map<int, map<int, map<int, int>>>
m_netPair2EdgeMinSlackBucketCntByNetDelta;
flat_hash_map<int, map<int, int>>
m_netPair2MinSlackBucketByNetDelta;
map<int, int>
m_netCutSlack2Cnt;
static constexpr int kInvalidTimingCutPairKey =
-1;
static constexpr int kTimingCutPairKeyBase =
1024;
static constexpr int kInvalidSlackBucket =
std::numeric_limits<int>::max();
};
} // namespace HSFullTiming