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