Class HSTimingDelta

Nested Relationships

Nested Types

Class Documentation

class HSTimingDelta

增量时序评估器,为一次候选分区变更维护独立的时序差分账本。

该类持有父级 HSPartitionFlow 和基准 HSTimingLocalData 的只读引用, 并以 copy-on-write 的方式维护:

  1. 节点分区覆盖表(partDelta)。

  2. 时序边启用状态覆盖表(enableDelta)。

  3. 指定 edge/clock 下被重新传播后的 slackData(slackDelta)。

  4. 与 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<uint64_t, slackData> slackDelta

本次试探复制或重传播得到的 slackData 差分表。

map<int, int> m_hop2DataCnt

delta 视图下 hop 总数到有效 slackData 条目数的统计表。

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

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

Public Members

short hop = 0

当前传播路径累计 hop。

float slack = FLT_MAX

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

int preEdgeId = -1

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

int edgeId = -1

当前正在更新的 timing edge。