ElectricalTimingNode.cc revision 10447
110447Snilay@cs.wisc.edu
210447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalTimingNode.h"
310447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalLoad.h"
410447Snilay@cs.wisc.edu
510447Snilay@cs.wisc.edunamespace DSENT
610447Snilay@cs.wisc.edu{
710447Snilay@cs.wisc.edu    // Set the optical node initial visited num
810447Snilay@cs.wisc.edu    const int ElectricalTimingNode::TIMING_NODE_INIT_VISITED_NUM = 0;
910447Snilay@cs.wisc.edu
1010447Snilay@cs.wisc.edu    ElectricalTimingNode::ElectricalTimingNode(const String& instance_name_, ElectricalModel* model_)
1110447Snilay@cs.wisc.edu        : m_instance_name_(instance_name_), m_model_(model_), m_false_path_(false), m_crit_path_(-1),
1210447Snilay@cs.wisc.edu        m_visited_num_(ElectricalTimingNode::TIMING_NODE_INIT_VISITED_NUM), m_delay_left_(0.0)
1310447Snilay@cs.wisc.edu    {
1410447Snilay@cs.wisc.edu        m_upstream_nodes_ = new vector<ElectricalTimingNode*>();
1510447Snilay@cs.wisc.edu        m_downstream_nodes_ = new vector<ElectricalTimingNode*>();
1610447Snilay@cs.wisc.edu    }
1710447Snilay@cs.wisc.edu
1810447Snilay@cs.wisc.edu    ElectricalTimingNode::~ElectricalTimingNode()
1910447Snilay@cs.wisc.edu    {
2010447Snilay@cs.wisc.edu        delete m_upstream_nodes_;
2110447Snilay@cs.wisc.edu        delete m_downstream_nodes_;
2210447Snilay@cs.wisc.edu    }
2310447Snilay@cs.wisc.edu
2410447Snilay@cs.wisc.edu    double ElectricalTimingNode::getMaxUpstreamRes() const
2510447Snilay@cs.wisc.edu    {
2610447Snilay@cs.wisc.edu        double max_res = 0.0;
2710447Snilay@cs.wisc.edu
2810447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < m_upstream_nodes_->size(); ++i)
2910447Snilay@cs.wisc.edu        {
3010447Snilay@cs.wisc.edu            double res = m_upstream_nodes_->at(i)->getMaxUpstreamRes();
3110447Snilay@cs.wisc.edu            if(max_res < res)
3210447Snilay@cs.wisc.edu            {
3310447Snilay@cs.wisc.edu                max_res = res;
3410447Snilay@cs.wisc.edu            }
3510447Snilay@cs.wisc.edu        }
3610447Snilay@cs.wisc.edu        return max_res;
3710447Snilay@cs.wisc.edu    }
3810447Snilay@cs.wisc.edu
3910447Snilay@cs.wisc.edu    double ElectricalTimingNode::getTotalDownstreamCap() const
4010447Snilay@cs.wisc.edu    {
4110447Snilay@cs.wisc.edu        double cap_sum = 0;
4210447Snilay@cs.wisc.edu
4310447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < m_downstream_nodes_->size(); ++i)
4410447Snilay@cs.wisc.edu        {
4510447Snilay@cs.wisc.edu            cap_sum += m_downstream_nodes_->at(i)->getTotalDownstreamCap();
4610447Snilay@cs.wisc.edu        }
4710447Snilay@cs.wisc.edu
4810447Snilay@cs.wisc.edu        return cap_sum;
4910447Snilay@cs.wisc.edu    }
5010447Snilay@cs.wisc.edu
5110447Snilay@cs.wisc.edu    vector<ElectricalTimingNode*>* ElectricalTimingNode::getUpstreamNodes() const
5210447Snilay@cs.wisc.edu    {
5310447Snilay@cs.wisc.edu        return m_upstream_nodes_;
5410447Snilay@cs.wisc.edu    }
5510447Snilay@cs.wisc.edu
5610447Snilay@cs.wisc.edu    vector<ElectricalTimingNode*>* ElectricalTimingNode::getDownstreamNodes() const
5710447Snilay@cs.wisc.edu    {
5810447Snilay@cs.wisc.edu        return m_downstream_nodes_;
5910447Snilay@cs.wisc.edu    }
6010447Snilay@cs.wisc.edu
6110447Snilay@cs.wisc.edu    const String& ElectricalTimingNode::getInstanceName() const
6210447Snilay@cs.wisc.edu    {
6310447Snilay@cs.wisc.edu        return m_instance_name_;
6410447Snilay@cs.wisc.edu    }
6510447Snilay@cs.wisc.edu
6610447Snilay@cs.wisc.edu    ElectricalModel* ElectricalTimingNode::getModel()
6710447Snilay@cs.wisc.edu    {
6810447Snilay@cs.wisc.edu        return m_model_;
6910447Snilay@cs.wisc.edu    }
7010447Snilay@cs.wisc.edu
7110447Snilay@cs.wisc.edu    bool ElectricalTimingNode::isDriver() const
7210447Snilay@cs.wisc.edu    {
7310447Snilay@cs.wisc.edu        return false;
7410447Snilay@cs.wisc.edu    }
7510447Snilay@cs.wisc.edu
7610447Snilay@cs.wisc.edu    bool ElectricalTimingNode::isNet() const
7710447Snilay@cs.wisc.edu    {
7810447Snilay@cs.wisc.edu        return false;
7910447Snilay@cs.wisc.edu    }
8010447Snilay@cs.wisc.edu
8110447Snilay@cs.wisc.edu    bool ElectricalTimingNode::isLoad() const
8210447Snilay@cs.wisc.edu    {
8310447Snilay@cs.wisc.edu        return false;
8410447Snilay@cs.wisc.edu    }
8510447Snilay@cs.wisc.edu
8610447Snilay@cs.wisc.edu
8710447Snilay@cs.wisc.edu    const ElectricalModel* ElectricalTimingNode::getModel() const
8810447Snilay@cs.wisc.edu    {
8910447Snilay@cs.wisc.edu        return (const ElectricalModel*) m_model_;
9010447Snilay@cs.wisc.edu    }
9110447Snilay@cs.wisc.edu
9210447Snilay@cs.wisc.edu    void ElectricalTimingNode::addDownstreamNode(ElectricalTimingNode* node_)
9310447Snilay@cs.wisc.edu    {
9410447Snilay@cs.wisc.edu        m_downstream_nodes_->push_back(node_);
9510447Snilay@cs.wisc.edu        node_->m_upstream_nodes_->push_back(this);
9610447Snilay@cs.wisc.edu        return;
9710447Snilay@cs.wisc.edu    }
9810447Snilay@cs.wisc.edu
9910447Snilay@cs.wisc.edu    void ElectricalTimingNode::setFalsePath(bool false_path_)
10010447Snilay@cs.wisc.edu    {
10110447Snilay@cs.wisc.edu        m_false_path_ = false_path_;
10210447Snilay@cs.wisc.edu        return;
10310447Snilay@cs.wisc.edu    }
10410447Snilay@cs.wisc.edu
10510447Snilay@cs.wisc.edu    bool ElectricalTimingNode::getFalsePath() const
10610447Snilay@cs.wisc.edu    {
10710447Snilay@cs.wisc.edu        return m_false_path_;
10810447Snilay@cs.wisc.edu    }
10910447Snilay@cs.wisc.edu
11010447Snilay@cs.wisc.edu
11110447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
11210447Snilay@cs.wisc.edu    // Functions for delay optimization
11310447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
11410447Snilay@cs.wisc.edu    // By default, electrical timing nodes cannot be sized up/down
11510447Snilay@cs.wisc.edu    bool ElectricalTimingNode::hasMaxDrivingStrength() const
11610447Snilay@cs.wisc.edu    {
11710447Snilay@cs.wisc.edu        return true;
11810447Snilay@cs.wisc.edu    }
11910447Snilay@cs.wisc.edu
12010447Snilay@cs.wisc.edu    bool ElectricalTimingNode::hasMinDrivingStrength() const
12110447Snilay@cs.wisc.edu    {
12210447Snilay@cs.wisc.edu        return true;
12310447Snilay@cs.wisc.edu    }
12410447Snilay@cs.wisc.edu
12510447Snilay@cs.wisc.edu    void ElectricalTimingNode::increaseDrivingStrength()
12610447Snilay@cs.wisc.edu    {
12710447Snilay@cs.wisc.edu        return;
12810447Snilay@cs.wisc.edu    }
12910447Snilay@cs.wisc.edu
13010447Snilay@cs.wisc.edu    void ElectricalTimingNode::decreaseDrivingStrength()
13110447Snilay@cs.wisc.edu    {
13210447Snilay@cs.wisc.edu        return;
13310447Snilay@cs.wisc.edu    }
13410447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
13510447Snilay@cs.wisc.edu
13610447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
13710447Snilay@cs.wisc.edu    // Node variables for critical path delay calculations
13810447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
13910447Snilay@cs.wisc.edu    void ElectricalTimingNode::setCritPath(int crit_path_)
14010447Snilay@cs.wisc.edu    {
14110447Snilay@cs.wisc.edu        m_crit_path_ = crit_path_;
14210447Snilay@cs.wisc.edu        return;
14310447Snilay@cs.wisc.edu    }
14410447Snilay@cs.wisc.edu
14510447Snilay@cs.wisc.edu    int ElectricalTimingNode::getCritPath() const
14610447Snilay@cs.wisc.edu    {
14710447Snilay@cs.wisc.edu        return m_crit_path_;
14810447Snilay@cs.wisc.edu    }
14910447Snilay@cs.wisc.edu
15010447Snilay@cs.wisc.edu    void ElectricalTimingNode::setVisitedNum(int visited_num_)
15110447Snilay@cs.wisc.edu    {
15210447Snilay@cs.wisc.edu        m_visited_num_ = visited_num_;
15310447Snilay@cs.wisc.edu        return;
15410447Snilay@cs.wisc.edu    }
15510447Snilay@cs.wisc.edu
15610447Snilay@cs.wisc.edu    int ElectricalTimingNode::getVisitedNum() const
15710447Snilay@cs.wisc.edu    {
15810447Snilay@cs.wisc.edu        return m_visited_num_;
15910447Snilay@cs.wisc.edu    }
16010447Snilay@cs.wisc.edu
16110447Snilay@cs.wisc.edu    void ElectricalTimingNode::setDelayLeft(double delay_left_)
16210447Snilay@cs.wisc.edu    {
16310447Snilay@cs.wisc.edu        m_delay_left_ = delay_left_;
16410447Snilay@cs.wisc.edu    }
16510447Snilay@cs.wisc.edu
16610447Snilay@cs.wisc.edu    double ElectricalTimingNode::getDelayLeft() const
16710447Snilay@cs.wisc.edu    {
16810447Snilay@cs.wisc.edu        return m_delay_left_;
16910447Snilay@cs.wisc.edu    }
17010447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
17110447Snilay@cs.wisc.edu
17210447Snilay@cs.wisc.edu} // namespace DSENT
17310447Snilay@cs.wisc.edu
17410447Snilay@cs.wisc.edu
175