ElectricalDriver.cc revision 10447
110447Snilay@cs.wisc.edu
210447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalDriver.h"
310447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalNet.h"
410447Snilay@cs.wisc.edu#include "model/ElectricalModel.h"
510447Snilay@cs.wisc.edu
610447Snilay@cs.wisc.edunamespace DSENT
710447Snilay@cs.wisc.edu{
810447Snilay@cs.wisc.edu    ElectricalDriver::ElectricalDriver(const String& instance_name_, ElectricalModel* model_, bool sizable_)
910447Snilay@cs.wisc.edu        : ElectricalTimingNode(instance_name_, model_), m_output_res_(0.0), m_sizable_(sizable_)
1010447Snilay@cs.wisc.edu    {
1110447Snilay@cs.wisc.edu
1210447Snilay@cs.wisc.edu    }
1310447Snilay@cs.wisc.edu
1410447Snilay@cs.wisc.edu    ElectricalDriver::~ElectricalDriver()
1510447Snilay@cs.wisc.edu    {
1610447Snilay@cs.wisc.edu
1710447Snilay@cs.wisc.edu    }
1810447Snilay@cs.wisc.edu
1910447Snilay@cs.wisc.edu    void ElectricalDriver::setOutputRes(double output_res_)
2010447Snilay@cs.wisc.edu    {
2110447Snilay@cs.wisc.edu        m_output_res_ = output_res_;
2210447Snilay@cs.wisc.edu        return;
2310447Snilay@cs.wisc.edu    }
2410447Snilay@cs.wisc.edu
2510447Snilay@cs.wisc.edu    double ElectricalDriver::getOutputRes() const
2610447Snilay@cs.wisc.edu    {
2710447Snilay@cs.wisc.edu        return m_output_res_;
2810447Snilay@cs.wisc.edu    }
2910447Snilay@cs.wisc.edu
3010447Snilay@cs.wisc.edu    double ElectricalDriver::calculateDelay() const
3110447Snilay@cs.wisc.edu    {
3210447Snilay@cs.wisc.edu        return 0.693 * m_output_res_ * getTotalDownstreamCap();
3310447Snilay@cs.wisc.edu    }
3410447Snilay@cs.wisc.edu
3510447Snilay@cs.wisc.edu    double ElectricalDriver::calculateTransition() const
3610447Snilay@cs.wisc.edu    {
3710447Snilay@cs.wisc.edu        return 1.386 * getMaxUpstreamRes() * getTotalDownstreamCap();
3810447Snilay@cs.wisc.edu    }
3910447Snilay@cs.wisc.edu
4010447Snilay@cs.wisc.edu    double ElectricalDriver::getMaxUpstreamRes() const
4110447Snilay@cs.wisc.edu    {
4210447Snilay@cs.wisc.edu        return m_output_res_;
4310447Snilay@cs.wisc.edu    }
4410447Snilay@cs.wisc.edu
4510447Snilay@cs.wisc.edu    bool ElectricalDriver::isSizable() const
4610447Snilay@cs.wisc.edu    {
4710447Snilay@cs.wisc.edu        return m_sizable_;
4810447Snilay@cs.wisc.edu    }
4910447Snilay@cs.wisc.edu
5010447Snilay@cs.wisc.edu    bool ElectricalDriver::hasMaxDrivingStrength() const
5110447Snilay@cs.wisc.edu    {
5210447Snilay@cs.wisc.edu        if (!isSizable())
5310447Snilay@cs.wisc.edu        {
5410447Snilay@cs.wisc.edu            return true;
5510447Snilay@cs.wisc.edu        }
5610447Snilay@cs.wisc.edu        return (getModel() == NULL) || (getModel()->hasMaxDrivingStrength());
5710447Snilay@cs.wisc.edu    }
5810447Snilay@cs.wisc.edu
5910447Snilay@cs.wisc.edu    bool ElectricalDriver::hasMinDrivingStrength() const
6010447Snilay@cs.wisc.edu    {
6110447Snilay@cs.wisc.edu        if (!isSizable())
6210447Snilay@cs.wisc.edu        {
6310447Snilay@cs.wisc.edu            return true;
6410447Snilay@cs.wisc.edu        }
6510447Snilay@cs.wisc.edu        return (getModel() == NULL) || (getModel()->hasMinDrivingStrength());
6610447Snilay@cs.wisc.edu    }
6710447Snilay@cs.wisc.edu
6810447Snilay@cs.wisc.edu    void ElectricalDriver::increaseDrivingStrength()
6910447Snilay@cs.wisc.edu    {
7010447Snilay@cs.wisc.edu        ASSERT(isSizable(), "[Error] " + getInstanceName() +
7110447Snilay@cs.wisc.edu            " -> Attempted to size up unsizable driver!");
7210447Snilay@cs.wisc.edu        if(!hasMaxDrivingStrength())
7310447Snilay@cs.wisc.edu        {
7410447Snilay@cs.wisc.edu            getModel()->increaseDrivingStrength();
7510447Snilay@cs.wisc.edu        }
7610447Snilay@cs.wisc.edu        return;
7710447Snilay@cs.wisc.edu    }
7810447Snilay@cs.wisc.edu
7910447Snilay@cs.wisc.edu    void ElectricalDriver::decreaseDrivingStrength()
8010447Snilay@cs.wisc.edu    {
8110447Snilay@cs.wisc.edu        ASSERT(isSizable(), "[Error] " + getInstanceName() +
8210447Snilay@cs.wisc.edu            " -> Attempted to size down unsizable driver!");
8310447Snilay@cs.wisc.edu        if(!hasMinDrivingStrength())
8410447Snilay@cs.wisc.edu        {
8510447Snilay@cs.wisc.edu            getModel()->decreaseDrivingStrength();
8610447Snilay@cs.wisc.edu        }
8710447Snilay@cs.wisc.edu        return;
8810447Snilay@cs.wisc.edu    }
8910447Snilay@cs.wisc.edu
9010447Snilay@cs.wisc.edu    bool ElectricalDriver::isDriver() const
9110447Snilay@cs.wisc.edu    {
9210447Snilay@cs.wisc.edu        return true;
9310447Snilay@cs.wisc.edu    }
9410447Snilay@cs.wisc.edu} // namespace DSENT
9510447Snilay@cs.wisc.edu
96