110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology
210448Snilay@cs.wisc.edu *
310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy
410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal
510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights
610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is
810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions:
910448Snilay@cs.wisc.edu *
1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in
1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software.
1210448Snilay@cs.wisc.edu *
1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1910448Snilay@cs.wisc.edu * THE SOFTWARE.
2010448Snilay@cs.wisc.edu */
2110448Snilay@cs.wisc.edu
2210447Snilay@cs.wisc.edu
2310447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalTimingNode.h"
2410447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalLoad.h"
2510447Snilay@cs.wisc.edu
2610447Snilay@cs.wisc.edunamespace DSENT
2710447Snilay@cs.wisc.edu{
2810447Snilay@cs.wisc.edu    // Set the optical node initial visited num
2910447Snilay@cs.wisc.edu    const int ElectricalTimingNode::TIMING_NODE_INIT_VISITED_NUM = 0;
3010447Snilay@cs.wisc.edu
3110447Snilay@cs.wisc.edu    ElectricalTimingNode::ElectricalTimingNode(const String& instance_name_, ElectricalModel* model_)
3210447Snilay@cs.wisc.edu        : m_instance_name_(instance_name_), m_model_(model_), m_false_path_(false), m_crit_path_(-1),
3310447Snilay@cs.wisc.edu        m_visited_num_(ElectricalTimingNode::TIMING_NODE_INIT_VISITED_NUM), m_delay_left_(0.0)
3410447Snilay@cs.wisc.edu    {
3510447Snilay@cs.wisc.edu        m_upstream_nodes_ = new vector<ElectricalTimingNode*>();
3610447Snilay@cs.wisc.edu        m_downstream_nodes_ = new vector<ElectricalTimingNode*>();
3710447Snilay@cs.wisc.edu    }
3810447Snilay@cs.wisc.edu
3910447Snilay@cs.wisc.edu    ElectricalTimingNode::~ElectricalTimingNode()
4010447Snilay@cs.wisc.edu    {
4110447Snilay@cs.wisc.edu        delete m_upstream_nodes_;
4210447Snilay@cs.wisc.edu        delete m_downstream_nodes_;
4310447Snilay@cs.wisc.edu    }
4410447Snilay@cs.wisc.edu
4510447Snilay@cs.wisc.edu    double ElectricalTimingNode::getMaxUpstreamRes() const
4610447Snilay@cs.wisc.edu    {
4710447Snilay@cs.wisc.edu        double max_res = 0.0;
4810447Snilay@cs.wisc.edu
4910447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < m_upstream_nodes_->size(); ++i)
5010447Snilay@cs.wisc.edu        {
5110447Snilay@cs.wisc.edu            double res = m_upstream_nodes_->at(i)->getMaxUpstreamRes();
5210447Snilay@cs.wisc.edu            if(max_res < res)
5310447Snilay@cs.wisc.edu            {
5410447Snilay@cs.wisc.edu                max_res = res;
5510447Snilay@cs.wisc.edu            }
5610447Snilay@cs.wisc.edu        }
5710447Snilay@cs.wisc.edu        return max_res;
5810447Snilay@cs.wisc.edu    }
5910447Snilay@cs.wisc.edu
6010447Snilay@cs.wisc.edu    double ElectricalTimingNode::getTotalDownstreamCap() const
6110447Snilay@cs.wisc.edu    {
6210447Snilay@cs.wisc.edu        double cap_sum = 0;
6310447Snilay@cs.wisc.edu
6410447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < m_downstream_nodes_->size(); ++i)
6510447Snilay@cs.wisc.edu        {
6610447Snilay@cs.wisc.edu            cap_sum += m_downstream_nodes_->at(i)->getTotalDownstreamCap();
6710447Snilay@cs.wisc.edu        }
6810447Snilay@cs.wisc.edu
6910447Snilay@cs.wisc.edu        return cap_sum;
7010447Snilay@cs.wisc.edu    }
7110447Snilay@cs.wisc.edu
7210447Snilay@cs.wisc.edu    vector<ElectricalTimingNode*>* ElectricalTimingNode::getUpstreamNodes() const
7310447Snilay@cs.wisc.edu    {
7410447Snilay@cs.wisc.edu        return m_upstream_nodes_;
7510447Snilay@cs.wisc.edu    }
7610447Snilay@cs.wisc.edu
7710447Snilay@cs.wisc.edu    vector<ElectricalTimingNode*>* ElectricalTimingNode::getDownstreamNodes() const
7810447Snilay@cs.wisc.edu    {
7910447Snilay@cs.wisc.edu        return m_downstream_nodes_;
8010447Snilay@cs.wisc.edu    }
8110447Snilay@cs.wisc.edu
8210447Snilay@cs.wisc.edu    const String& ElectricalTimingNode::getInstanceName() const
8310447Snilay@cs.wisc.edu    {
8410447Snilay@cs.wisc.edu        return m_instance_name_;
8510447Snilay@cs.wisc.edu    }
8610447Snilay@cs.wisc.edu
8710447Snilay@cs.wisc.edu    ElectricalModel* ElectricalTimingNode::getModel()
8810447Snilay@cs.wisc.edu    {
8910447Snilay@cs.wisc.edu        return m_model_;
9010447Snilay@cs.wisc.edu    }
9110447Snilay@cs.wisc.edu
9210447Snilay@cs.wisc.edu    bool ElectricalTimingNode::isDriver() const
9310447Snilay@cs.wisc.edu    {
9410447Snilay@cs.wisc.edu        return false;
9510447Snilay@cs.wisc.edu    }
9610447Snilay@cs.wisc.edu
9710447Snilay@cs.wisc.edu    bool ElectricalTimingNode::isNet() const
9810447Snilay@cs.wisc.edu    {
9910447Snilay@cs.wisc.edu        return false;
10010447Snilay@cs.wisc.edu    }
10110447Snilay@cs.wisc.edu
10210447Snilay@cs.wisc.edu    bool ElectricalTimingNode::isLoad() const
10310447Snilay@cs.wisc.edu    {
10410447Snilay@cs.wisc.edu        return false;
10510447Snilay@cs.wisc.edu    }
10610447Snilay@cs.wisc.edu
10710447Snilay@cs.wisc.edu
10810447Snilay@cs.wisc.edu    const ElectricalModel* ElectricalTimingNode::getModel() const
10910447Snilay@cs.wisc.edu    {
11010447Snilay@cs.wisc.edu        return (const ElectricalModel*) m_model_;
11110447Snilay@cs.wisc.edu    }
11210447Snilay@cs.wisc.edu
11310447Snilay@cs.wisc.edu    void ElectricalTimingNode::addDownstreamNode(ElectricalTimingNode* node_)
11410447Snilay@cs.wisc.edu    {
11510447Snilay@cs.wisc.edu        m_downstream_nodes_->push_back(node_);
11610447Snilay@cs.wisc.edu        node_->m_upstream_nodes_->push_back(this);
11710447Snilay@cs.wisc.edu        return;
11810447Snilay@cs.wisc.edu    }
11910447Snilay@cs.wisc.edu
12010447Snilay@cs.wisc.edu    void ElectricalTimingNode::setFalsePath(bool false_path_)
12110447Snilay@cs.wisc.edu    {
12210447Snilay@cs.wisc.edu        m_false_path_ = false_path_;
12310447Snilay@cs.wisc.edu        return;
12410447Snilay@cs.wisc.edu    }
12510447Snilay@cs.wisc.edu
12610447Snilay@cs.wisc.edu    bool ElectricalTimingNode::getFalsePath() const
12710447Snilay@cs.wisc.edu    {
12810447Snilay@cs.wisc.edu        return m_false_path_;
12910447Snilay@cs.wisc.edu    }
13010447Snilay@cs.wisc.edu
13110447Snilay@cs.wisc.edu
13210447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
13310447Snilay@cs.wisc.edu    // Functions for delay optimization
13410447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
13510447Snilay@cs.wisc.edu    // By default, electrical timing nodes cannot be sized up/down
13610447Snilay@cs.wisc.edu    bool ElectricalTimingNode::hasMaxDrivingStrength() const
13710447Snilay@cs.wisc.edu    {
13810447Snilay@cs.wisc.edu        return true;
13910447Snilay@cs.wisc.edu    }
14010447Snilay@cs.wisc.edu
14110447Snilay@cs.wisc.edu    bool ElectricalTimingNode::hasMinDrivingStrength() const
14210447Snilay@cs.wisc.edu    {
14310447Snilay@cs.wisc.edu        return true;
14410447Snilay@cs.wisc.edu    }
14510447Snilay@cs.wisc.edu
14610447Snilay@cs.wisc.edu    void ElectricalTimingNode::increaseDrivingStrength()
14710447Snilay@cs.wisc.edu    {
14810447Snilay@cs.wisc.edu        return;
14910447Snilay@cs.wisc.edu    }
15010447Snilay@cs.wisc.edu
15110447Snilay@cs.wisc.edu    void ElectricalTimingNode::decreaseDrivingStrength()
15210447Snilay@cs.wisc.edu    {
15310447Snilay@cs.wisc.edu        return;
15410447Snilay@cs.wisc.edu    }
15510447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
15610447Snilay@cs.wisc.edu
15710447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
15810447Snilay@cs.wisc.edu    // Node variables for critical path delay calculations
15910447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
16010447Snilay@cs.wisc.edu    void ElectricalTimingNode::setCritPath(int crit_path_)
16110447Snilay@cs.wisc.edu    {
16210447Snilay@cs.wisc.edu        m_crit_path_ = crit_path_;
16310447Snilay@cs.wisc.edu        return;
16410447Snilay@cs.wisc.edu    }
16510447Snilay@cs.wisc.edu
16610447Snilay@cs.wisc.edu    int ElectricalTimingNode::getCritPath() const
16710447Snilay@cs.wisc.edu    {
16810447Snilay@cs.wisc.edu        return m_crit_path_;
16910447Snilay@cs.wisc.edu    }
17010447Snilay@cs.wisc.edu
17110447Snilay@cs.wisc.edu    void ElectricalTimingNode::setVisitedNum(int visited_num_)
17210447Snilay@cs.wisc.edu    {
17310447Snilay@cs.wisc.edu        m_visited_num_ = visited_num_;
17410447Snilay@cs.wisc.edu        return;
17510447Snilay@cs.wisc.edu    }
17610447Snilay@cs.wisc.edu
17710447Snilay@cs.wisc.edu    int ElectricalTimingNode::getVisitedNum() const
17810447Snilay@cs.wisc.edu    {
17910447Snilay@cs.wisc.edu        return m_visited_num_;
18010447Snilay@cs.wisc.edu    }
18110447Snilay@cs.wisc.edu
18210447Snilay@cs.wisc.edu    void ElectricalTimingNode::setDelayLeft(double delay_left_)
18310447Snilay@cs.wisc.edu    {
18410447Snilay@cs.wisc.edu        m_delay_left_ = delay_left_;
18510447Snilay@cs.wisc.edu    }
18610447Snilay@cs.wisc.edu
18710447Snilay@cs.wisc.edu    double ElectricalTimingNode::getDelayLeft() const
18810447Snilay@cs.wisc.edu    {
18910447Snilay@cs.wisc.edu        return m_delay_left_;
19010447Snilay@cs.wisc.edu    }
19110447Snilay@cs.wisc.edu    //-------------------------------------------------------------------------
19210447Snilay@cs.wisc.edu
19310447Snilay@cs.wisc.edu} // namespace DSENT
19410447Snilay@cs.wisc.edu
19510447Snilay@cs.wisc.edu
196