ElectricalTimingTree.h revision 10447:a465576671d4
16313Sgblack@eecs.umich.edu#ifndef __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__
26313Sgblack@eecs.umich.edu#define __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__
36313Sgblack@eecs.umich.edu
46313Sgblack@eecs.umich.edu#include <vector>
56313Sgblack@eecs.umich.edu
66313Sgblack@eecs.umich.edu#include "util/CommonType.h"
76313Sgblack@eecs.umich.edu#include "model/timing_graph/ElectricalTimingNode.h"
86313Sgblack@eecs.umich.edu
96313Sgblack@eecs.umich.edunamespace DSENT
106313Sgblack@eecs.umich.edu{
116313Sgblack@eecs.umich.edu    using std::vector;
126313Sgblack@eecs.umich.edu
136313Sgblack@eecs.umich.edu    class ElectricalDriver;
146313Sgblack@eecs.umich.edu
156313Sgblack@eecs.umich.edu    class ElectricalTimingTree
166313Sgblack@eecs.umich.edu    {
176313Sgblack@eecs.umich.edu        public:
186313Sgblack@eecs.umich.edu            // The visited number for the next timing run. This needs to be
196313Sgblack@eecs.umich.edu            // global because several timing trees may be created to evaluate
206313Sgblack@eecs.umich.edu            // a single timing path, causing problems
216313Sgblack@eecs.umich.edu            static int msTreeNum;
226313Sgblack@eecs.umich.edu
236313Sgblack@eecs.umich.edu        public:
246313Sgblack@eecs.umich.edu            // Construct timing tree that watches over model_
256313Sgblack@eecs.umich.edu            ElectricalTimingTree(const String& instance_name_, ElectricalModel* model_);
266313Sgblack@eecs.umich.edu            ~ElectricalTimingTree();
276313Sgblack@eecs.umich.edu
286313Sgblack@eecs.umich.edu        public:
296313Sgblack@eecs.umich.edu            // Get tree name
306313Sgblack@eecs.umich.edu            const String& getInstanceName() const;
316313Sgblack@eecs.umich.edu
326336Sgblack@eecs.umich.edu            // A wrapper for extractCritPathDelay
336336Sgblack@eecs.umich.edu            // Update the tree num before do extract critical path delay recursively
346313Sgblack@eecs.umich.edu            double performCritPathExtract(ElectricalTimingNode* node_);
356336Sgblack@eecs.umich.edu            // Calculate the delay of the marked critical path from a starting node
366313Sgblack@eecs.umich.edu            double calculateCritPathDelay(ElectricalTimingNode* node_) const;
376313Sgblack@eecs.umich.edu            // Calculate the transition at a node
386313Sgblack@eecs.umich.edu            double calculateNodeTransition(ElectricalTimingNode* node_) const;
396313Sgblack@eecs.umich.edu            // Returns the optimal node to optimize timing (by sizing up) in the critical
406313Sgblack@eecs.umich.edu            // path to reduce critical path delay
416336Sgblack@eecs.umich.edu            ElectricalTimingNode* findNodeForTimingOpt(ElectricalTimingNode* node_) const;
426336Sgblack@eecs.umich.edu            // Perform incremental timing optimization to guarantee that all timing paths from a
436336Sgblack@eecs.umich.edu            // starting node meets a required delay
446712Snate@binkert.org            // Return false if the timing optimization fails to meet the required delay
456336Sgblack@eecs.umich.edu            bool performTimingOpt(ElectricalTimingNode* node_, double required_delay_);
466336Sgblack@eecs.umich.edu
476336Sgblack@eecs.umich.edu            // Return the model
486336Sgblack@eecs.umich.edu            ElectricalModel* getModel();
496336Sgblack@eecs.umich.edu
506336Sgblack@eecs.umich.edu        private:
516336Sgblack@eecs.umich.edu            // Disable the use of copy constructor
526336Sgblack@eecs.umich.edu            ElectricalTimingTree(const ElectricalTimingTree& graph_);
536336Sgblack@eecs.umich.edu
546336Sgblack@eecs.umich.edu            // Recursively calculate delay from a starting node, finding and marking the
556336Sgblack@eecs.umich.edu            // critical path along the way and returns the delay of the critical path
566336Sgblack@eecs.umich.edu            double extractCritPathDelay(ElectricalTimingNode* node_);
576336Sgblack@eecs.umich.edu
586336Sgblack@eecs.umich.edu        public:
596336Sgblack@eecs.umich.edu            // Set the sequence number of the timing tree
606336Sgblack@eecs.umich.edu            static void setTreeNum(int tree_num_);
616336Sgblack@eecs.umich.edu            static int getTreeNum();
626336Sgblack@eecs.umich.edu
636336Sgblack@eecs.umich.edu        private:
646336Sgblack@eecs.umich.edu            // Name of the timing tree
656336Sgblack@eecs.umich.edu            const String m_instance_name_;
666336Sgblack@eecs.umich.edu            // A pointer to the model that contains this node
676336Sgblack@eecs.umich.edu            ElectricalModel* m_model_;
686336Sgblack@eecs.umich.edu
696336Sgblack@eecs.umich.edu    }; // class ElectricalTimingTree
706336Sgblack@eecs.umich.edu} // namespace DSENT
716336Sgblack@eecs.umich.edu
726336Sgblack@eecs.umich.edu#endif // __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__
736336Sgblack@eecs.umich.edu
746336Sgblack@eecs.umich.edu