Program Listing for File HSTimingEdge.h¶
↰ Return to documentation for file (src/sta/HSTimingEdge.h)
#pragma once
#include <float.h>
#include <forward_list>
#include <map>
#include <vector>
#include "HSTimingSlackRange.h"
#include "HSTimingUndo.h"
using std::forward_list;
using std::map;
using std::pair;
using std::vector;
namespace HSFullTiming {
class HSTimingLocalData;
// slackData 结构体用于存储一条时序边的slack(裕量)信息。
// 它包含了与该边相关的slack值、前驱/后继边的ID、时钟ID以及路径跳数。
// 每条HSTimingEdge可以包含多个slackData实例,通常每个相关的时钟域一个。
struct slackData {
// 考虑此边之前的路径部分的slack值。初始化为float类型的最大值。
// 代表到达此边时的slack累积值(通常是Required Time - Arrival Time)。
float slackPre = FLT_MAX;
// 考虑此边之后的路径部分的slack值。初始化为float类型的最大值。
// 代表从此边出发到路径终点的slack累积值。
float slackPost = FLT_MAX;
// 时序路径中,此前驱边的ID。默认为-1,表示无效或不存在。
int edgePreId = -1;
// 时序路径中,此后继边的ID。默认为-1,表示无效或不存在。
int edgePostId = -1;
// 与此slack数据关联的时钟的ID。默认为-1,表示无效或未指定。
int clkId = -1;
// 从时钟源(或路径起点)到此边的跳数(边的数量),从边的前段视角看。默认为-1。
short hopPre = -1;
// 从此边到路径终点的跳数,从边的后段视角看。默认为-1。
short hopPost = -1;
};
// HSTimingEdge 类代表时序图中的一条边,并携带相关的slack数据。
// 它用于存储和管理通过这条边的时序路径信息。
// 例如,它可以保存不同时钟域下,通过此边的最差slack值、路径跳数等。
class HSTimingEdge {
public:
// 默认构造函数。
// 创建 HSTimingEdge 对象时调用。
HSTimingEdge();
// 析构函数。
// HSTimingEdge 对象销毁时调用。
~HSTimingEdge();
// 布尔标志,指示此时序边当前是否启用。
// 如果为false,则在时序计算中可能会忽略此边或以不同方式处理。默认为true。
bool m_bEnable = true;
// 当前 timing edge 对应的全局 edgeId,便于本地统计做增量维护。
int m_edgeId = -1;
// 一个 std::forward_list,用于存储多个 slackData 条目。
// 通常,每个相关的时钟会有一个对应的 slackData 条目。
// 使用 forward_list 是因为它适用于频繁在前端插入元素的场景。
forward_list<slackData> m_slackData;
// 检查此边是否有任何关联的slack数据。
// @return 如果 m_slackData
// 列表非空且至少有一个有效的slack条目,则返回true,否则返回false。
// (有效性通常指 hopPre > 0 且 hopPost > -1)
bool hasSlack();
// 检查此边是否有针对特定时钟ID的关联slack数据。
// @param clkId 要检查的时钟的ID。
// @return
// 如果存在针对给定clkId的slack数据且该数据有效,则返回true,否则返回false。
bool hasSlack(int clkId);
bool hasSlack2(int clkId);
// 获取此边所有slackData条目中的最差slack值。
// 计算时会考虑 cutDelay(跨区延迟)。
// @param cutDelay 用于计算的额外跨区延迟。
// @param worstSlack 输出参数,用于存储找到的最差slack值。
// @return
// 如果存在有效的slack数据并且worstSlack被更新,则返回true,否则返回false。
bool getWorstSlack(float cutDelay, float &worstSlack);
// 设置或更新给定clkId的更差的slack值。
// 此方法会将新的slack值与现有slack值(前段或后段)进行比较,如果新的更差(更小),则更新。
// @param cutDelay 用于计算有效slack值的跨区延迟。
// @param clkId 此slack所属的时钟的ID。
// @param hop 与此slack关联的路径跳数。
// @param slack 新的slack值。
// @param bPostValue 布尔值,如果 'slack'
// 是后段路径的slack,则为true;如果是前段路径的slack,则为false。
// @param preEdgeId
// 前驱边的ID(对于后段路径slack,此参数可能表示逻辑上的前驱或触发更新的边)。
// @return
// 如果slack数据被更新或添加,则返回true;否则(例如,新的slack值不够差)返回false。
bool setWorseSlack(int clkId, short hop, float slack, bool bPostValue,
int preEdgeId, HSTimingLocalData *oneLocal);
// 获取或创建指定时钟ID (clkId) 的 slackData 条目。
// 如果给定 clkId 的 slackData 已存在,则返回其引用。
// 否则,创建一个新的 slackData 条目,将其添加到 m_slackData
// 列表中,并返回其引用。
// @param clkId 时钟的ID。
// @return 对给定clkId的slackData结构体的引用。
slackData &getSlackData(int clkId); // if has return current, if not new one
// 查询是否存在该clkId的slackData
bool findSlackData(int clkId);
};
} // namespace HSFullTiming