Class HSTimingDelta¶
Defined in File HSTimingDelta.h
Nested Relationships¶
Nested Types¶
Class Documentation¶
-
class HSTimingDelta¶
增量时序评估器,为一次候选分区变更维护独立的时序差分账本。
该类持有父级 HSPartitionFlow 和基准 HSTimingLocalData 的只读引用, 并以 copy-on-write 的方式维护:
节点分区覆盖表(partDelta)。
时序边启用状态覆盖表(enableDelta)。
指定 edge/clock 下被重新传播后的 slackData(slackDelta)。
与 MaxHop、Slack bucket、net cut min-slack 相关的统计增量。
典型使用流程是构造一个 delta,调用 updateTimingEdge(newParts) 试探一组节点移动, 读取 getWorstIndex()/getCriticalCut()/estimateTopkMinSlackSum() 等指标作决策, 若接受该 move,再由本地时序数据对象合并这些 delta。
Public Functions
-
HSTimingDelta(const HSPartitionFlow *parent, const HSTimingLocalData *oneLocal)¶
构造一份基于指定本地时序数据的增量视图。
- Parameters:
parent – [in] 全局 STA/划分流程上下文,用于查询拓扑、层级、前后继边等信息。
oneLocal – [in] 当前候选解对应的本地时序基准数据。
-
~HSTimingDelta()¶
清理本次增量评估过程中创建的所有临时容器。
-
int updateTimingEdge(const vector<int> &disableEdgeList, const vector<int> &enableEdgeList, const vector<int> &delayChangedEdgeList = {})¶
以边级变更为入口,重新传播受影响的时序 Slack。
- Parameters:
disableEdgeList – [in] 本次试探中从跨区割边变为非割边、需要禁用的 timing edge。
enableEdgeList – [in] 本次试探中从非割边变为跨区割边、需要启用的 timing edge。
delayChangedEdgeList – [in] 仍保持启用但跨区延迟发生变化的 timing edge。
- Returns:
0 表示传播流程执行完成;负值表示当前数据不满足传播条件。
-
int updateTimingEdge(vector<pair<int, int>> newParts)¶
以节点分区变更为入口,自动推导边启停和延迟变化并更新时序增量。
- Parameters:
newParts – [in] 发生移动的节点及其新分区编号,格式为 (nodeId, partId)。
- Returns:
0 表示增量评估完成。
-
inline flat_hash_map<int, int> &getPartDelta()¶
获取节点分区覆盖表。
- Returns:
nodeId 到新 partId 的映射,可供提交 delta 时写回本地状态。
-
inline flat_hash_map<int, bool> &getEnableDelta()¶
获取时序边启用状态覆盖表。
- Returns:
edgeId 到 enable 状态的映射,记录本轮试探造成的启停变化。
-
inline flat_hash_map<uint64_t, slackData> &getSlackDelta()¶
获取被重新传播或复制出的 Slack 差分数据。
- Returns:
以 (edgeId, clkId) 打包键索引的 slackData 增量表。
-
inline map<int, int> &getHop2DataCnt()¶
获取当前 delta 视图下的 hop 统计表。
- Returns:
hop 总数到有效 slackData 条目数的映射。
-
inline const flat_hash_map<int, map<int, int>> &getEdgeSlackBucketCntDelta() const¶
-
inline const flat_hash_map<int, map<int, map<int, int>>> &getNetPair2EdgeMinSlackBucketCntByNetDelta() const¶
获取 net 内 pair 维度 edge-min-slack bucket 计数的差分视图。
- Returns:
netId -> FPGA pair key -> edge min-slack bucket -> 计数。
-
inline const flat_hash_map<int, map<int, int>> &getNetPair2MinSlackBucketByNetDelta() const¶
获取 net 内各 FPGA pair 最差 Slack bucket 的差分视图。
- Returns:
netId -> FPGA pair key -> 该 pair 下最小 Slack bucket。
-
inline const map<int, int> &getNetCutSlack2Cnt() const¶
获取按 net+FPGA pair 去重后的全局关键割线 Slack bucket 统计。
- Returns:
slack bucket 到 net cut 计数的映射。
-
int getMaxHop() const¶
查询当前 delta 视图下仍有有效数据的最大 hop。
- Returns:
最大 hop 值;若无有效项则返回 0。
-
int getMaxHopDataCnt()¶
查询最大 hop 对应的有效 slackData 数量。
- Returns:
getMaxHop() 所在桶的计数。
-
double estimateTopkMinSlackSum(double topkMinSlackRatio = -1.0) const¶
-
int getWorstIndex(double topkMinSlackRatio = -1.0)¶
获取用于候选解排序的最坏指标。
- Parameters:
topkMinSlackRatio – [in] Top-K 最差 Slack 估计比例。
- Returns:
无 IO/TDM 估计时返回 MaxHop;否则返回 Top-K Slack 估计值的相反数。
-
int getCriticalCut(double topkMinSlackRatio = -1.0)¶
获取与最坏指标对应的关键割线强度。
- Parameters:
topkMinSlackRatio – [in] Top-K 最差 Slack 估计比例。
- Returns:
无 IO/TDM 估计时返回最大 hop 计数;否则返回 Top-K Slack 估计值的相反数。
-
void removeDataCnt(int edgeId, slackData *sData)¶
从当前 delta 统计中移除一个有效 slackData 对应的 hop/slack 贡献。
- Parameters:
edgeId – [in] 该 slackData 所属的 timing edge。
sData – [in] 将被移除统计贡献的 Slack 数据指针。
-
void addDataCnt(int edgeId, slackData *sData)¶
向当前 delta 统计中加入一个有效 slackData 对应的 hop/slack 贡献。
- Parameters:
edgeId – [in] 该 slackData 所属的 timing edge。
sData – [in] 将被加入统计贡献的 Slack 数据指针。
-
float getCutDelay(int edgeId)¶
查询当前 delta 分区视图下某条边的跨区延迟。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
使用 partDelta 覆盖后的 from/to 分区查出的 cut delay。
-
float getOldCutDelay(int edgeId)¶
查询基准分区视图下某条边的跨区延迟。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
不考虑 partDelta、直接使用 localData 原始分区查出的 cut delay。
-
int getFPGADistance(int edgeId) const¶
查询当前 delta 分区视图下某条边跨越的 FPGA 最短拓扑距离。
-
int getOldFPGADistance(int edgeId) const¶
查询基准分区视图下某条边跨越的 FPGA 最短拓扑距离。
Private Functions
-
int getPart(int nodeId) const¶
查询节点在当前 delta 视图中的分区。
- Parameters:
nodeId – [in] 节点编号。
- Returns:
若 partDelta 中存在覆盖值则返回新分区,否则返回基准分区。
-
bool getEnable(int edgeId) const¶
查询时序边在当前 delta 视图中的启用状态。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
若 enableDelta 中存在覆盖值则返回覆盖状态,否则返回基准状态。
-
inline uint64_t makeKey(int edgeId, int clkId)¶
将 edgeId 与 clkId 打包成 slackDelta 的 64 位索引键。
- Parameters:
edgeId – [in] timing edge 编号。
clkId – [in] 时钟域编号。
- Returns:
高 32 位为 edgeId、低 32 位为 clkId 的组合键。
-
slackData &getSlackData(int edgeId, int clkId)¶
获取可写 Slack 数据;若 delta 中不存在,则从基准边复制一份。
- Parameters:
edgeId – [in] timing edge 编号。
clkId – [in] 时钟域编号。
- Returns:
当前 delta 中可写的 slackData 引用。
-
const slackData &getSlackData_ReadOnly(int edgeId, int clkId)¶
只读获取 Slack 数据,优先读取 delta,缺省回落到基准边。
- Parameters:
edgeId – [in] timing edge 编号。
clkId – [in] 时钟域编号。
- Returns:
slackData 只读引用。
-
pair<slackData*, bool> getSlackDataRW(int edgeId, int clkId)¶
获取 Slack 数据指针并标记其是否已经位于 delta 中。
- Parameters:
edgeId – [in] timing edge 编号。
clkId – [in] 时钟域编号。
- Returns:
(slackData 指针, 是否来自 slackDelta)。
-
slackData *getSlackDataByPtr(int edgeId, slackData *src)¶
以现有 Slack 指针为源,在 slackDelta 中创建或获取对应副本。
- Parameters:
edgeId – [in] timing edge 编号。
src – [in] 基准或 delta 中已有的 Slack 数据。
- Returns:
slackDelta 中对应副本的可写指针。
-
const map<int, int> &getEdgeSlackBucketCnt_ReadOnly(int edgeId) const¶
只读获取某条边的 Slack bucket 计数表。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
优先返回 delta 计数表,否则返回基准计数表;越界时返回空表。
-
map<int, int> &getEdgeSlackBucketCntRW(int edgeId)¶
获取某条边的 Slack bucket 计数表可写副本。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
m_edgeSlackBucketCntDelta 中的可写计数表。
-
const map<int, map<int, int>> &getNetPair2EdgeMinSlackBucketCntByNet_ReadOnly(int netId) const¶
只读获取指定 net 的 pair->edge-min-slack-bucket 计数表。
- Parameters:
netId – [in] net 编号。
- Returns:
优先返回 delta 计数表,否则返回基准计数表;越界时返回空表。
-
map<int, map<int, int>> &getNetPair2EdgeMinSlackBucketCntByNetRW(int netId)¶
获取指定 net 的 pair->edge-min-slack-bucket 计数表可写副本。
- Parameters:
netId – [in] net 编号。
- Returns:
m_netPair2EdgeMinSlackBucketCntByNetDelta 中的可写计数表。
-
const map<int, int> &getNetPair2MinSlackBucketByNet_ReadOnly(int netId) const¶
只读获取指定 net 的 pair->min-slack-bucket 表。
- Parameters:
netId – [in] net 编号。
- Returns:
优先返回 delta 最小 bucket 表,否则返回基准表;越界时返回空表。
-
map<int, int> &getNetPair2MinSlackBucketByNetRW(int netId)¶
获取指定 net 的 pair->min-slack-bucket 表可写副本。
- Parameters:
netId – [in] net 编号。
- Returns:
m_netPair2MinSlackBucketByNetDelta 中的可写最小 bucket 表。
-
int updateTimingEdge(map<int, vector<map<int, traceInfo>>> &clk2TraceList, bool bPostTrace)¶
执行一轮层级有序的前向或后向 Slack 重传播。
- Parameters:
clk2TraceList – [inout] 按时钟域组织的层级传播队列。
bPostTrace – [in] 为 true 时更新 pre-path 方向;为 false 时更新 post-path 方向。
- Returns:
0 表示传播完成。
-
bool setWorseSlack(int clkId, traceInfo &trace, bool bPostValue)¶
将一条候选传播轨迹写入对应 slackData,只有更差 Slack 才会生效。
- Parameters:
clkId – [in] 时钟域编号。
trace – [inout] 候选传播轨迹。
bPostValue – [in] 为 true 时写 pre-path 字段;为 false 时写 post-path 字段。
- Returns:
true 表示 slackData 被更新。
-
inline int getSlackIndex(float slack)¶
将浮点 Slack 映射到统一 bucket 编号。
- Parameters:
slack – [in] 原始 Slack 值。
- Returns:
bucket 编号。
-
int getFPGADistanceByPart(int partFrom, int partTo) const¶
查询两个 FPGA 分区之间的最短拓扑距离。
-
int getTimingCutPairKey(int edgeId, bool useOldPart) const¶
获取某条 timing edge 在当前或基准分区下的 FPGA pair key。
- Parameters:
edgeId – [in] timing edge 编号。
useOldPart – [in] 为 true 时使用基准分区;为 false 时使用 delta 分区。
- Returns:
partFrom * kTimingCutPairKeyBase + partTo;非割边返回无效 key。
-
int getNetCutMinSlackBucket(int netId, int pairKey) const¶
查询指定 net/pair 下当前记录的最差 Slack bucket。
- Parameters:
netId – [in] net 编号。
pairKey – [in] FPGA pair key。
- Returns:
最小 Slack bucket;无记录时返回 kInvalidSlackBucket。
-
int getEdgeMinSlackBucket(int edgeId) const¶
查询指定 edge 当前的最差 Slack bucket。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
该 edge bucket 计数表中仍有效的最小 bucket。
-
int getMinSlackBucket(const map<int, int> &bucket2Cnt) const¶
从 bucket 计数表中找出仍有有效计数的最小 bucket。
- Parameters:
bucket2Cnt – [in] bucket 到计数的映射。
- Returns:
最小有效 bucket;无有效项时返回 kInvalidSlackBucket。
-
void updateNetCutSlackOnEdgeMinChange(int netId, int pairKey, int oldEdgeMinSlackBucket, int newEdgeMinSlackBucket)¶
当某条 edge 的最差 Slack bucket 改变时,联动更新 net+pair 级统计。
- Parameters:
netId – [in] edge 所属 net。
pairKey – [in] edge 当前或旧的 FPGA pair key。
oldEdgeMinSlackBucket – [in] edge 原最小 Slack bucket。
newEdgeMinSlackBucket – [in] edge 新最小 Slack bucket。
-
void updateNetCutSlackStatsForEdges(const set<int> &edgeIds)¶
根据受影响 edge 集合刷新 net+FPGA pair 去重后的关键割线 Slack 统计。
- Parameters:
edgeIds – [in] 需要检查的 timing edge 集合。
Private Members
-
const HSPartitionFlow *m_parent = nullptr¶
父级划分/STA 流程,用于查询全局拓扑和配置上下文。
-
const HSTimingLocalData *m_localData = nullptr¶
当前 delta 依附的基准本地时序数据。
-
const vector<HSOuterEdge*> &m_outerEdgeAll¶
基准状态中的全局 outer edge 列表引用。
-
const vector<HSTimingEdge*> &m_timingEdgeAll¶
基准状态中的 timing edge 指针表引用。
-
const vector<int> &m_partInfo¶
基准状态中的 nodeId 到 partId 分区映射。
-
const vector<vector<float>> &m_cutDelays¶
基准状态中的 FPGA pair 间 cut delay 矩阵。
-
const vector<vector<int>> &m_fpgaDistances¶
基准状态中的 FPGA pair 间最短 hop 矩阵。
-
const vector<map<int, int>> &m_edgeSlackBucketCntBase¶
基准状态中的 edge Slack bucket 计数表。
-
const vector<map<int, map<int, int>>> &m_netPair2EdgeMinSlackBucketCntByNetBase¶
基准状态中的 net/pair edge-min-bucket 计数表。
-
const vector<map<int, int>> &m_netPair2MinSlackBucketByNetBase¶
基准状态中的 net/pair 最差 Slack bucket 表。
-
flat_hash_map<int, int> partDelta¶
本次试探覆盖的 nodeId 到新 partId 映射。
-
flat_hash_map<int, bool> enableDelta¶
本次试探覆盖的 edgeId 到启用状态映射。
-
flat_hash_map<int, map<int, int>> m_edgeSlackBucketCntDelta¶
edgeId 到 Slack bucket 计数表的增量覆盖。
-
flat_hash_map<int, map<int, map<int, int>>> m_netPair2EdgeMinSlackBucketCntByNetDelta¶
netId 到 pair/edge-min-bucket 计数表的增量覆盖。
-
flat_hash_map<int, map<int, int>> m_netPair2MinSlackBucketByNetDelta¶
netId 到 pair 最小 Slack bucket 表的增量覆盖。
-
map<int, int> m_netCutSlack2Cnt¶
delta 视图下按 net+FPGA pair 去重后的 Slack bucket 统计。
Private Static Attributes
-
static constexpr int kInvalidTimingCutPairKey = -1¶
无效或非割边的 FPGA pair key。
-
static constexpr int kTimingCutPairKeyBase = 1024¶
打包 partFrom/partTo 时使用的基数。
-
static constexpr int kInvalidSlackBucket = std::numeric_limits<int>::max()¶
无效 Slack bucket 哨兵值。
-
struct traceInfo¶
单步传播轨迹记录,用于前向/后向重传播时在层级队列中携带候选路径状态。