Class HSTimingLocalData

Nested Relationships

Nested Types

Class Documentation

class HSTimingLocalData

分区级 STA 工作集,保存一份可更新、可克隆、可回滚的本地时序状态。

该类与 HSPartitionFlow 共享全局 outer edge / clock / net 拓扑上下文, 自身拥有本地 HSTimingEdge 实例和各种统计表。它的主要职责包括:

  1. 根据当前分区构建 timing edge 并初始化 Slack 数据。

  2. 在分区变化、edge 启停、cut delay 变化后执行增量或全量时序传播。

  3. 维护 MaxHop、Slack bucket、edge-min-slack 和 net-cut-slack 等指标。

  4. 支持 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 表示以回滚验证场景输出额外检查信息。

void verifyHop2DataCnt()

验证 hop 统计表是否与所有 timing edge 上的有效 slackData 一致。

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:

当前实例使用的采样比例。

inline map<int, int> getHop2DataCnt() const

获取 hop 统计表副本。

Returns:

hop 总数到有效 slackData 条目数的映射。

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_hop2DataCnt

hop 总数到有效 slackData 条目数的统计表。

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 启停状态日志。

vector<SlackUndo> m_slackUndo

rollback 用的 slackData 字段修改日志。

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

单步传播轨迹记录,用于前向/后向重传播时携带候选路径状态。

Public Members

short hop = 0

当前传播路径累计 hop。

float slack = FLT_MAX

当前传播路径累计得到的最差 Slack。

int preEdgeId = -1

当前路径追溯到的前驱 timing edge。

int edgeId = -1

当前正在更新的 timing edge。