summaryrefslogtreecommitdiff
path: root/ext/dsent/model/timing_graph/ElectricalTimingTree.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dsent/model/timing_graph/ElectricalTimingTree.h')
-rw-r--r--ext/dsent/model/timing_graph/ElectricalTimingTree.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/ext/dsent/model/timing_graph/ElectricalTimingTree.h b/ext/dsent/model/timing_graph/ElectricalTimingTree.h
new file mode 100644
index 000000000..4dfbff8a7
--- /dev/null
+++ b/ext/dsent/model/timing_graph/ElectricalTimingTree.h
@@ -0,0 +1,73 @@
+#ifndef __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__
+#define __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__
+
+#include <vector>
+
+#include "util/CommonType.h"
+#include "model/timing_graph/ElectricalTimingNode.h"
+
+namespace DSENT
+{
+ using std::vector;
+
+ class ElectricalDriver;
+
+ class ElectricalTimingTree
+ {
+ public:
+ // The visited number for the next timing run. This needs to be
+ // global because several timing trees may be created to evaluate
+ // a single timing path, causing problems
+ static int msTreeNum;
+
+ public:
+ // Construct timing tree that watches over model_
+ ElectricalTimingTree(const String& instance_name_, ElectricalModel* model_);
+ ~ElectricalTimingTree();
+
+ public:
+ // Get tree name
+ const String& getInstanceName() const;
+
+ // A wrapper for extractCritPathDelay
+ // Update the tree num before do extract critical path delay recursively
+ double performCritPathExtract(ElectricalTimingNode* node_);
+ // Calculate the delay of the marked critical path from a starting node
+ double calculateCritPathDelay(ElectricalTimingNode* node_) const;
+ // Calculate the transition at a node
+ double calculateNodeTransition(ElectricalTimingNode* node_) const;
+ // Returns the optimal node to optimize timing (by sizing up) in the critical
+ // path to reduce critical path delay
+ ElectricalTimingNode* findNodeForTimingOpt(ElectricalTimingNode* node_) const;
+ // Perform incremental timing optimization to guarantee that all timing paths from a
+ // starting node meets a required delay
+ // Return false if the timing optimization fails to meet the required delay
+ bool performTimingOpt(ElectricalTimingNode* node_, double required_delay_);
+
+ // Return the model
+ ElectricalModel* getModel();
+
+ private:
+ // Disable the use of copy constructor
+ ElectricalTimingTree(const ElectricalTimingTree& graph_);
+
+ // Recursively calculate delay from a starting node, finding and marking the
+ // critical path along the way and returns the delay of the critical path
+ double extractCritPathDelay(ElectricalTimingNode* node_);
+
+ public:
+ // Set the sequence number of the timing tree
+ static void setTreeNum(int tree_num_);
+ static int getTreeNum();
+
+ private:
+ // Name of the timing tree
+ const String m_instance_name_;
+ // A pointer to the model that contains this node
+ ElectricalModel* m_model_;
+
+ }; // class ElectricalTimingTree
+} // namespace DSENT
+
+#endif // __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__
+