Program Listing for File HSPrefixTree.h¶
↰ Return to documentation for file (src/sta/HSPrefixTree.h)
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
#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<HSStaBase::timingpath> &getTopkPaths();
private:
// Top K
const int k;
// 用堆存储前缀树节点的指针
vector<pfxtNode *> minHeap;
// 存储前缀树节点
vector<pfxtNode> pfxtNodes;
// 存储导出的timingpath
vector<HSStaBase::timingpath> topkPaths;
// 用于通过NodeId访问node
map<long long, int> id2index;
// 用于访问电路图中边的连接关系
const HSPartitionFlow *pFlow;
// 用于访问slackData
const vector<HSTimingEdge *> &m_timingEdgeAll;
// 用于访问oneLocal
const HSTimingLocalData *oneLocal;
// 节点计数,用于设置nodeId
long long nodeCount = 0;
// 用于给定预分配的空间大小
int numReserve;
};
} // namespace HSFullTiming