.. _program_listing_file_src_sta_HSTimingEdge.h: Program Listing for File HSTimingEdge.h ======================================= |exhale_lsh| :ref:`Return to documentation for file ` (``src/sta/HSTimingEdge.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include #include #include #include #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 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