ElectricalTimingTree.h revision 10448
13691SN/A/* Copyright (c) 2012 Massachusetts Institute of Technology 23691SN/A * 39449SAli.Saidi@ARM.com * Permission is hereby granted, free of charge, to any person obtaining a copy 410409Sandreas.hansson@arm.com * of this software and associated documentation files (the "Software"), to deal 510409Sandreas.hansson@arm.com * in the Software without restriction, including without limitation the rights 68721SN/A * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 710409Sandreas.hansson@arm.com * copies of the Software, and to permit persons to whom the Software is 810409Sandreas.hansson@arm.com * furnished to do so, subject to the following conditions: 910409Sandreas.hansson@arm.com * 1010409Sandreas.hansson@arm.com * The above copyright notice and this permission notice shall be included in 1110409Sandreas.hansson@arm.com * all copies or substantial portions of the Software. 1210409Sandreas.hansson@arm.com * 1310409Sandreas.hansson@arm.com * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1410036SAli.Saidi@ARM.com * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1510036SAli.Saidi@ARM.com * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1610409Sandreas.hansson@arm.com * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1710409Sandreas.hansson@arm.com * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 189729Sandreas.hansson@arm.com * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1910409Sandreas.hansson@arm.com * THE SOFTWARE. 2010409Sandreas.hansson@arm.com */ 2110409Sandreas.hansson@arm.com 2210409Sandreas.hansson@arm.com#ifndef __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__ 239055Ssaidi@eecs.umich.edu#define __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__ 2410409Sandreas.hansson@arm.com 2510409Sandreas.hansson@arm.com#include <vector> 2610409Sandreas.hansson@arm.com 279729Sandreas.hansson@arm.com#include "util/CommonType.h" 2810409Sandreas.hansson@arm.com#include "model/timing_graph/ElectricalTimingNode.h" 2910409Sandreas.hansson@arm.com 309055Ssaidi@eecs.umich.edunamespace DSENT 3110409Sandreas.hansson@arm.com{ 3210409Sandreas.hansson@arm.com using std::vector; 3310409Sandreas.hansson@arm.com 3410409Sandreas.hansson@arm.com class ElectricalDriver; 3510409Sandreas.hansson@arm.com 3610409Sandreas.hansson@arm.com class ElectricalTimingTree 3710409Sandreas.hansson@arm.com { 3810409Sandreas.hansson@arm.com public: 399247Sandreas.hansson@arm.com // The visited number for the next timing run. This needs to be 4010409Sandreas.hansson@arm.com // global because several timing trees may be created to evaluate 4110409Sandreas.hansson@arm.com // a single timing path, causing problems 4210409Sandreas.hansson@arm.com static int msTreeNum; 4310409Sandreas.hansson@arm.com 4410409Sandreas.hansson@arm.com public: 4510409Sandreas.hansson@arm.com // Construct timing tree that watches over model_ 4610409Sandreas.hansson@arm.com ElectricalTimingTree(const String& instance_name_, ElectricalModel* model_); 4710409Sandreas.hansson@arm.com ~ElectricalTimingTree(); 4810409Sandreas.hansson@arm.com 4910409Sandreas.hansson@arm.com public: 5010409Sandreas.hansson@arm.com // Get tree name 5110409Sandreas.hansson@arm.com const String& getInstanceName() const; 5210409Sandreas.hansson@arm.com 5310409Sandreas.hansson@arm.com // A wrapper for extractCritPathDelay 5410409Sandreas.hansson@arm.com // Update the tree num before do extract critical path delay recursively 5510409Sandreas.hansson@arm.com double performCritPathExtract(ElectricalTimingNode* node_); 5610409Sandreas.hansson@arm.com // Calculate the delay of the marked critical path from a starting node 5710409Sandreas.hansson@arm.com double calculateCritPathDelay(ElectricalTimingNode* node_) const; 5810409Sandreas.hansson@arm.com // Calculate the transition at a node 5910409Sandreas.hansson@arm.com double calculateNodeTransition(ElectricalTimingNode* node_) const; 6010409Sandreas.hansson@arm.com // Returns the optimal node to optimize timing (by sizing up) in the critical 6110409Sandreas.hansson@arm.com // path to reduce critical path delay 6210409Sandreas.hansson@arm.com ElectricalTimingNode* findNodeForTimingOpt(ElectricalTimingNode* node_) const; 6310409Sandreas.hansson@arm.com // Perform incremental timing optimization to guarantee that all timing paths from a 6410409Sandreas.hansson@arm.com // starting node meets a required delay 6510409Sandreas.hansson@arm.com // Return false if the timing optimization fails to meet the required delay 6610409Sandreas.hansson@arm.com bool performTimingOpt(ElectricalTimingNode* node_, double required_delay_); 6710409Sandreas.hansson@arm.com 6810409Sandreas.hansson@arm.com // Return the model 6910409Sandreas.hansson@arm.com ElectricalModel* getModel(); 7010409Sandreas.hansson@arm.com 7110409Sandreas.hansson@arm.com private: 7210409Sandreas.hansson@arm.com // Disable the use of copy constructor 7310409Sandreas.hansson@arm.com ElectricalTimingTree(const ElectricalTimingTree& graph_); 7410409Sandreas.hansson@arm.com 7510409Sandreas.hansson@arm.com // Recursively calculate delay from a starting node, finding and marking the 7610409Sandreas.hansson@arm.com // critical path along the way and returns the delay of the critical path 7710409Sandreas.hansson@arm.com double extractCritPathDelay(ElectricalTimingNode* node_); 7810409Sandreas.hansson@arm.com 798721SN/A public: 808721SN/A // Set the sequence number of the timing tree 818721SN/A static void setTreeNum(int tree_num_); 828721SN/A static int getTreeNum(); 838721SN/A 848721SN/A private: 858721SN/A // Name of the timing tree 868721SN/A const String m_instance_name_; 878721SN/A // A pointer to the model that contains this node 888721SN/A ElectricalModel* m_model_; 898721SN/A 908721SN/A }; // class ElectricalTimingTree 9110036SAli.Saidi@ARM.com} // namespace DSENT 928721SN/A 938721SN/A#endif // __DSENT_MODEL_ELECTRICAL_TIMING_TREE_H__ 948721SN/A 958721SN/A