.. _program_listing_file_src_sta_HSPrefixTree.h: Program Listing for File HSPrefixTree.h ======================================= |exhale_lsh| :ref:`Return to documentation for file ` (``src/sta/HSPrefixTree.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include #include #include #include #include "HSGraphClock.h" #include "HSStaBase.h" #include "HSTimingEdge.h" using std::vector; namespace HSFullTiming { class HSPartitionFlow; class HSTimingEdge; class HSTimingLocalData; // prefix node struct pfxtNode { int nodeId; int clkId; float slack; int hop; int fromEdgeId; int toEdgeId; int parentId; bool poped; }; class HSPrefixTree { public: HSPrefixTree(int k, const HSPartitionFlow *pFlow, const HSTimingLocalData *oneLocal); ~HSPrefixTree(); // 初始化堆,把所有与时钟相连的起始边作为偏离边对应的前缀树节点压入堆中,然后把slack最小的节点弹出,把它的偏离结果再压入堆中 void initHeap(); // 向堆中加入一个节点 void pushPfxtNode(pfxtNode node); // 从堆顶弹出slack最小的节点 pfxtNode *popPfxtNode(); // 对一个前缀树节点进行偏移,并把偏移出的节点都压入堆中 void spur(pfxtNode *node); // 重新建堆 void reBuildHeap(); // 导出一条路径 void dumpOnePath(pfxtNode *node); // 提取前K条路径 void extractTopkPaths(); // 打印前K条路径到控制台 void printTopkPaths(); // 用于获取一个nodeId; long long getNodeId(); // 给出id,让它返回对应pfxtNode pfxtNode getNodeById(long long nodeId); // 给出id,让它返回对应的slackData slackData &getSlackData(int clkId, int edgeId); // 获取提取的前K条路径 vector &getTopkPaths(); private: // Top K const int k; // 用堆存储前缀树节点的指针 vector minHeap; // 存储前缀树节点 vector pfxtNodes; // 存储导出的timingpath vector topkPaths; // 用于通过NodeId访问node map id2index; // 用于访问电路图中边的连接关系 const HSPartitionFlow *pFlow; // 用于访问slackData const vector &m_timingEdgeAll; // 用于访问oneLocal const HSTimingLocalData *oneLocal; // 节点计数,用于设置nodeId long long nodeCount = 0; // 用于给定预分配的空间大小 int numReserve; }; } // namespace HSFullTiming