Class HSTimingLocalData¶
Defined in File HSTimingLocalData.h
Nested Relationships¶
Nested Types¶
Class Documentation¶
-
class HSTimingLocalData¶
分区级 STA 工作集,保存一份可更新、可克隆、可回滚的本地时序状态。
该类与 HSPartitionFlow 共享全局 outer edge / clock / net 拓扑上下文, 自身拥有本地 HSTimingEdge 实例和各种统计表。它的主要职责包括:
根据当前分区构建 timing edge 并初始化 Slack 数据。
在分区变化、edge 启停、cut delay 变化后执行增量或全量时序传播。
维护 MaxHop、Slack bucket、edge-min-slack 和 net-cut-slack 等指标。
支持 undo 回滚、clone 深拷贝以及 HSTimingDelta 增量合并。
Public Functions
-
HSTimingLocalData(const HSPartitionFlow *parent)¶
构造一份依附于指定 HSPartitionFlow 的本地时序状态。
- Parameters:
parent – [in] 父级 STA/划分流程,用于获取全局拓扑和配置。
-
~HSTimingLocalData()¶
析构本地状态并释放所有 HSTimingEdge。
-
HSTimingLocalData *clone() const¶
深拷贝当前本地时序状态。
- Returns:
新创建的 HSTimingLocalData 指针,调用者负责释放。
-
void buildTimingEdge()¶
基于全局 outer edge 列表创建本地 timing edge,并初始化其状态。
-
inline void setHasCutDelay(bool hasCutDelay)¶
设置当前状态是否已经拥有有效的跨区 cut delay。
- Parameters:
hasCutDelay – [in] true 表示后续时序计算应考虑 cut delay。
-
int updatePartInfo()¶
将节点分区初始化为每个节点独占一个分区的默认状态。
- Returns:
0 表示更新完成。
-
int updatePartInfo(const vector<int> &partInfo)¶
使用外部给定分区向量更新本地节点分区信息。
- Parameters:
partInfo – [in] nodeId 到 partId 的映射数组。
- Returns:
0 表示更新完成。
-
const vector<int> &getPartInfo() const¶
获取当前节点分区信息。
- Returns:
nodeId 到 partId 的映射数组引用。
-
int updateTimingEdge(bool allUpdate)¶
更新 timing edge 的 Slack 信息。
- Parameters:
allUpdate – [in] true 表示全量重算;false 表示按当前变化做局部更新。
- Returns:
0 表示更新完成。
-
int updateTimingEdge(const vector<int> &disableEdgeList, const vector<int> &enableEdgeList, const vector<int> &delayChangedEdgeList = {})¶
以 edge 启停/延迟变化列表为入口执行局部时序更新。
- Parameters:
disableEdgeList – [in] 本轮由跨区割边变为非割边的 timing edge。
enableEdgeList – [in] 本轮由非割边变为跨区割边的 timing edge。
delayChangedEdgeList – [in] 仍启用但 cut delay 发生变化的 timing edge。
- Returns:
0 表示更新完成。
-
int updateTimingEdge(vector<pair<int, int>> newParts)¶
以节点分区变化为入口,推导受影响 edge 并更新本地时序状态。
- Parameters:
newParts – [in] 发生移动的节点及其新分区编号,格式为 (nodeId, partId)。
- Returns:
0 表示更新完成。
-
const vector<HSTimingEdge*> &getTimingEdge() const¶
获取本地维护的 timing edge 列表。
- Returns:
与全局 edgeId 对齐的 HSTimingEdge 指针数组。
-
const vector<HSOuterEdge*> &getOuterEdge() const¶
获取父流程中的全局 outer edge 列表。
- Returns:
与全局 edgeId 对齐的 HSOuterEdge 指针数组。
-
inline const vector<vector<float>> &getCutDelays() const¶
获取 FPGA pair 间 cut delay 矩阵。
- Returns:
cutDelays[fromPart][toPart] 形式的延迟矩阵。
-
inline const vector<vector<int>> &getFPGADistances() const¶
获取 FPGA pair 间最短拓扑距离矩阵。
- Returns:
fpgaDistances[fromPart][toPart] 形式的最短 hop 距离矩阵。
-
void setEnableRollback(bool enableRollback)¶
设置是否记录 undo 信息以支持 rollbackUndo()。
- Parameters:
enableRollback – [in] true 表示后续修改会记录回滚日志。
-
void rollbackUndo()¶
回滚最近一次开启 undo 后记录的本地时序更新。
-
void compare(HSTimingLocalData *oneLocal, bool verifyRollback = false)¶
将当前对象与另一份本地状态做一致性对比。
- Parameters:
oneLocal – [in] 作为参照的另一份本地时序状态。
verifyRollback – [in] true 表示以回滚验证场景输出额外检查信息。
-
int getMaxHop() const¶
-
int getMaxHopDataCnt()¶
查询最大 hop 对应的有效 slackData 数量。
- Returns:
getMaxHop() 所在桶的计数。
-
double estimateTopkMinSlackSum(double topkMinSlackRatio = -1.0) const¶
-
inline void setTopkMinSlackRatio(double topkMinSlackRatio)¶
设置估计 Top-K 最差 Slack 时使用的比例。
- Parameters:
topkMinSlackRatio – [in] 采样比例,例如 0.12 表示统计最差的 12。
-
inline double getTopkMinSlackRatio() const¶
获取当前 Top-K 最差 Slack 采样比例。
- Returns:
当前实例使用的采样比例。
-
vector<float> getTopkMinSlack(int k)¶
-
float getMinSlack()¶
获取当前状态下最差的 Slack 值。
- Returns:
所有有效 timing edge/path 中的最小 Slack。
-
float getPercentileSlack(float &ratio)¶
获取从小到大排序后第ratio百分位的slack值
- Parameters:
ratio – [in] 目标百分位
- Returns:
slack 值
-
float getAverageSlack()¶
获取全局 slack 平均值
- Returns:
slack 值
-
void printTopkPaths(int k)¶
打印前 k 条最差路径信息。
- Parameters:
k – [in] 需要打印的路径数量。
-
void dumpTopkSlackToFile(int k, const std::string &filepath)¶
将前 k 条最差路径的 Slack 信息导出到文件。
- Parameters:
k – [in] 需要导出的路径数量。
filepath – [in] 输出文件路径,通常供脚本绘图或离线分析使用。
-
void dumpNetCutSlackToFile(const std::string &filepath) const¶
将按 net+FPGA pair 去重后的最差 min-slack 统计导出为 JSON。
- Parameters:
filepath – [in] 输出 JSON 文件路径。
-
void applyDelta(HSTimingDelta *delta)¶
将 HSTimingDelta 中的试探更新提交到当前本地状态。
- Parameters:
delta – [in] 已经完成增量传播并被上层接受的 delta 对象。
-
inline void setCutDelays(const vector<vector<float>> cutDelays)¶
设置 FPGA pair 间 cut delay 矩阵。
- Parameters:
cutDelays – [in] cutDelays[fromPart][toPart] 形式的延迟矩阵。
-
inline void setFPGADistances(const vector<vector<int>> fpgaDistances)¶
设置 FPGA pair 间最短拓扑距离矩阵。
- Parameters:
fpgaDistances – [in] fpgaDistances[fromPart][toPart] 形式的最短 hop 距离矩阵。
-
inline const HSPartitionFlow *getParent() const¶
获取父级 HSPartitionFlow。
- Returns:
当前本地状态依附的父流程指针。
-
float getCutDelay(int edgeId) const¶
查询当前分区视图下指定 edge 的 cut delay。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
根据当前 m_partInfo 查出的跨区延迟。
-
int getFPGADistance(int edgeId) const¶
查询当前分区视图下指定 edge 跨越的 FPGA 最短拓扑距离。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
当前 from/to FPGA 间的最短 hop;距离矩阵不可用时跨区边回退为 1。
-
void addSlackUndo(slackData *sData, bool bPostValue)¶
为指定 slackData 修改记录 undo 信息。
- Parameters:
sData – [in] 即将被修改的 Slack 数据。
bPostValue – [in] true 表示记录 pre-path 字段,false 表示记录 post-path 字段。
-
void removeDataCnt(int edgeId, slackData *sData)¶
从统计表中移除一个有效 slackData 的 hop/slack 贡献。
- Parameters:
edgeId – [in] 该 slackData 所属 timing edge。
sData – [in] 将被移除统计贡献的 Slack 数据。
-
void addDataCnt(int edgeId, slackData *sData)¶
向统计表中加入一个有效 slackData 的 hop/slack 贡献。
- Parameters:
edgeId – [in] 该 slackData 所属 timing edge。
sData – [in] 将被加入统计贡献的 Slack 数据。
-
inline void setCutWeights(vector<vector<int>> cutWeights)¶
设置当前分区间 cut 权重矩阵。
- Parameters:
cutWeights – [in] cutWeights[fromPart][toPart] 形式的切割权重矩阵。
-
double computeCutDelta(const vector<vector<int>> &cutWeights)¶
计算给定 cut 权重矩阵相对于当前状态的代价差异。
- Parameters:
cutWeights – [in] 待评估的 cut 权重矩阵。
- Returns:
计算出的 cut 代价差值。
-
int getId()¶
查询当前对象在父流程本地数据列表中的编号。
- Returns:
local data 索引;未找到时通常返回负值。
-
inline void setTdmEstimate(const HSIOTdmDelay &tdmEstimate)¶
设置 IO/TDM 延迟估计器。
- Parameters:
tdmEstimate – [in] 已构建好的 IO/TDM 延迟估计数据。
-
void updateCutDelays(const graph &g, const vector<int> &parts, bool useTdmDelay, bool withNet = false)¶
根据图结构和可选 TDM 估计刷新 cut delay 矩阵。
- Parameters:
g – [in] 当前划分图。
useTdmDelay – [in] true 表示使用 TDM 估计更新延迟。
withNet – [in] true 表示更新时同时考虑 net 维度信息。
-
inline bool isEmptyIO() const¶
判断当前 IO/TDM 估计器是否为空。
- Returns:
true 表示没有可用 IO/TDM 估计。
-
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 估计值的相反数。
-
inline const vector<map<int, int>> &getNetPair2MinSlackBucketByNet() const¶
获取每个 net 内各 FPGA pair 的最小 Slack bucket 表。
- Returns:
netId -> pairKey -> minSlackBucket 的数组引用。
-
inline const vector<map<int, int>> &getEdgeSlackBucketCnt() const¶
获取每条 edge 的 Slack bucket 计数表。
- Returns:
edgeId -> bucket -> count 的数组引用。
-
inline const vector<map<int, map<int, int>>> &getNetPair2EdgeMinSlackBucketCntByNet() const¶
获取每个 net/pair 下 edge-min-slack bucket 的计数表。
- Returns:
netId -> pairKey -> edgeMinSlackBucket -> count 的数组引用。
-
inline const map<int, int> &getNetCutSlack2Cnt() const¶
获取按 net+FPGA pair 去重后的 Slack bucket 统计。
- Returns:
slack bucket 到 net cut 计数的映射。
-
float getOldCutDelay(int edgeId)¶
查询指定 edge 在旧分区状态下的 cut delay。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
根据旧分区视图查出的跨区延迟。
-
int getOldFPGADistance(int edgeId) const¶
查询指定 edge 在旧分区状态下跨越的 FPGA 最短拓扑距离。
- Parameters:
edgeId – [in] timing edge 编号。
- Returns:
旧 from/to FPGA 间的最短 hop;距离矩阵不可用时跨区边回退为 1。
Private Functions
-
void clearTimingEdge()¶
清空并释放所有本地 HSTimingEdge。
-
void initTimingEdge()¶
初始化本地 timing edge 的启用状态、Slack 容器和统计缓存。
-
int updateTimingEdge(map<int, vector<map<int, traceInfo>>> &clk2TraceList, bool bPostTrace, bool bRetrace)¶
执行一轮层级有序的前向或后向 Slack 重传播。
- Parameters:
clk2TraceList – [inout] 按时钟域组织的层级传播队列。
bPostTrace – [in] 为 true 时更新 pre-path 方向;为 false 时更新 post-path 方向。
bRetrace – [in] true 表示允许在路径变好时触发重追踪。
- Returns:
0 表示传播完成。
-
void rebuildNetCutSlackStats()¶
基于当前所有 edge 统计重建 net+FPGA pair 去重后的 Slack 统计。
-
void updateNetCutSlackStatsForEdges(const set<int> &edgeIds)¶
根据受影响 edge 集合刷新 net+FPGA pair 去重后的关键割线 Slack 统计。
- Parameters:
edgeIds – [in] 需要检查的 timing edge 集合。
-
int getTimingCutPairKey(int edgeId, bool useOldPart) const¶
获取某条 timing edge 在当前或旧分区下的 FPGA pair key。
- Parameters:
edgeId – [in] timing edge 编号。
useOldPart – [in] true 表示使用 undo/旧分区视图;false 表示使用当前分区视图。
- 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。
-
inline int getSlackIndex(float slack) const¶
将浮点 Slack 映射到统一 bucket 编号。
- Parameters:
slack – [in] 原始 Slack 值。
- Returns:
bucket 编号。
-
int getFPGADistanceByPart(int partFrom, int partTo) const¶
查询两个 FPGA 分区之间的最短拓扑距离。
Private Members
-
const HSPartitionFlow *m_parent = nullptr¶
父级划分/STA 流程,用于访问全局拓扑、net 与配置上下文。
-
const vector<HSOuterEdge*> &m_outerEdgeAll¶
父流程维护的全局 outer edge 列表引用。
-
vector<HSTimingEdge*> m_timingEdgeAll¶
本地拥有的 timing edge 指针表,与 outer edge 编号对齐。
-
std::vector<int> m_partInfo¶
nodeId 到当前 partId 的分区映射表。
-
vector<vector<float>> m_cutDelays¶
FPGA pair 间 cut delay 矩阵。
-
vector<vector<int>> m_fpgaDistances¶
FPGA pair 间最短拓扑 hop 距离矩阵。
-
bool m_hasCutDelay = true¶
当前时序传播是否启用跨 FPGA cut delay。
-
vector<vector<int>> m_cutWeights¶
FPGA pair 间 cut 数量/权重矩阵。
-
HSIOTdmDelay m_tdmEstimate¶
IO/TDM 延迟估计器及其缓存数据。
-
map<int, int> m_netCutSlack2Cnt¶
按 net+FPGA pair 去重后的 Slack bucket 统计。
-
vector<map<int, int>> m_edgeSlackBucketCnt¶
每条 edge 当前有效 Slack bucket 的计数分布。
-
vector<map<int, map<int, int>>> m_netPair2EdgeMinSlackBucketCntByNet¶
每个 net/pair 下 edge-min-slack bucket 的计数表。
-
vector<map<int, int>> m_netPair2MinSlackBucketByNet¶
每个 net/pair 对应的最差 Slack bucket 表。
-
bool m_enableRollback = false¶
是否记录本轮更新的 undo 信息。
-
bool m_incUpdate = false¶
当前是否处于节点移动触发的增量更新过程中。
-
map<int, int> m_partUndo¶
rollback 用的 nodeId 到旧 partId 映射。
-
vector<EnableUndo> m_enableUndo¶
rollback 用的 timing edge 启停状态日志。
-
map<int, int> m_hop2DataCntUndo¶
rollback 用的 hop 统计表快照。
-
map<int, map<int, int>> m_edgeSlackBucketCntUndo¶
rollback 用的 edge Slack bucket 快照。
-
map<int, map<int, map<int, int>>> m_netPair2EdgeMinSlackBucketCntUndo¶
rollback 用的 net/pair edge-min-bucket 计数快照。
-
map<int, map<int, int>> m_netPair2MinSlackBucketUndo¶
rollback 用的 net/pair 最差 bucket 快照。
-
map<int, int> m_netCutSlack2CntUndo¶
rollback 用的 net cut Slack bucket 总统计快照。
-
double m_topkMinSlackRatio = kDefaultTopkMinSlackRatio¶
当前实例估计 Top-K 最差 Slack 的采样比例。
Private Static Attributes
-
static constexpr int kInvalidTimingCutPairKey = -1¶
无效或非割边的 FPGA pair key。
-
static constexpr int kTimingCutPairKeyBase = 1024¶
打包 partFrom/partTo 为 pair key 时使用的基数。
-
static constexpr int kInvalidSlackBucket = std::numeric_limits<int>::max()¶
无效 Slack bucket 哨兵值。
-
static constexpr double kDefaultTopkMinSlackRatio = 0.12¶
估计 Top-K 最差 Slack 时使用的默认比例。
-
struct traceInfo¶
单步传播轨迹记录,用于前向/后向重传播时携带候选路径状态。