ElectricalDriver.cc revision 10447
110152Satgutier@umich.edu
210152Satgutier@umich.edu#include "model/timing_graph/ElectricalDriver.h"
310152Satgutier@umich.edu#include "model/timing_graph/ElectricalNet.h"
410152Satgutier@umich.edu#include "model/ElectricalModel.h"
510152Satgutier@umich.edu
610152Satgutier@umich.edunamespace DSENT
710152Satgutier@umich.edu{
810152Satgutier@umich.edu    ElectricalDriver::ElectricalDriver(const String& instance_name_, ElectricalModel* model_, bool sizable_)
910152Satgutier@umich.edu        : ElectricalTimingNode(instance_name_, model_), m_output_res_(0.0), m_sizable_(sizable_)
1010152Satgutier@umich.edu    {
1110152Satgutier@umich.edu
1210152Satgutier@umich.edu    }
1310152Satgutier@umich.edu
1410152Satgutier@umich.edu    ElectricalDriver::~ElectricalDriver()
1510152Satgutier@umich.edu    {
1610152Satgutier@umich.edu
1710152Satgutier@umich.edu    }
1810152Satgutier@umich.edu
1910152Satgutier@umich.edu    void ElectricalDriver::setOutputRes(double output_res_)
2010152Satgutier@umich.edu    {
2110152Satgutier@umich.edu        m_output_res_ = output_res_;
2210152Satgutier@umich.edu        return;
2310152Satgutier@umich.edu    }
2410152Satgutier@umich.edu
2510233Syasuko.eckert@amd.com    double ElectricalDriver::getOutputRes() const
2610233Syasuko.eckert@amd.com    {
2710152Satgutier@umich.edu        return m_output_res_;
2810152Satgutier@umich.edu    }
2910152Satgutier@umich.edu
3010152Satgutier@umich.edu    double ElectricalDriver::calculateDelay() const
3110152Satgutier@umich.edu    {
3210152Satgutier@umich.edu        return 0.693 * m_output_res_ * getTotalDownstreamCap();
3310152Satgutier@umich.edu    }
3410152Satgutier@umich.edu
3510152Satgutier@umich.edu    double ElectricalDriver::calculateTransition() const
3610152Satgutier@umich.edu    {
3710152Satgutier@umich.edu        return 1.386 * getMaxUpstreamRes() * getTotalDownstreamCap();
3810234Syasuko.eckert@amd.com    }
3910234Syasuko.eckert@amd.com
4010234Syasuko.eckert@amd.com    double ElectricalDriver::getMaxUpstreamRes() const
4110234Syasuko.eckert@amd.com    {
4210152Satgutier@umich.edu        return m_output_res_;
4310152Satgutier@umich.edu    }
4410152Satgutier@umich.edu
4510152Satgutier@umich.edu    bool ElectricalDriver::isSizable() const
4610152Satgutier@umich.edu    {
4710152Satgutier@umich.edu        return m_sizable_;
4810152Satgutier@umich.edu    }
4910152Satgutier@umich.edu
5010152Satgutier@umich.edu    bool ElectricalDriver::hasMaxDrivingStrength() const
5110152Satgutier@umich.edu    {
5210152Satgutier@umich.edu        if (!isSizable())
5310152Satgutier@umich.edu        {
5410152Satgutier@umich.edu            return true;
5510152Satgutier@umich.edu        }
5610152Satgutier@umich.edu        return (getModel() == NULL) || (getModel()->hasMaxDrivingStrength());
5710152Satgutier@umich.edu    }
5810152Satgutier@umich.edu
5910152Satgutier@umich.edu    bool ElectricalDriver::hasMinDrivingStrength() const
6010234Syasuko.eckert@amd.com    {
6110152Satgutier@umich.edu        if (!isSizable())
6210152Satgutier@umich.edu        {
6310152Satgutier@umich.edu            return true;
6410234Syasuko.eckert@amd.com        }
6510152Satgutier@umich.edu        return (getModel() == NULL) || (getModel()->hasMinDrivingStrength());
6610232Syasuko.eckert@amd.com    }
6710152Satgutier@umich.edu
6810232Syasuko.eckert@amd.com    void ElectricalDriver::increaseDrivingStrength()
6910232Syasuko.eckert@amd.com    {
7010152Satgutier@umich.edu        ASSERT(isSizable(), "[Error] " + getInstanceName() +
7110232Syasuko.eckert@amd.com            " -> Attempted to size up unsizable driver!");
7210232Syasuko.eckert@amd.com        if(!hasMaxDrivingStrength())
7310152Satgutier@umich.edu        {
7410232Syasuko.eckert@amd.com            getModel()->increaseDrivingStrength();
7510152Satgutier@umich.edu        }
7610152Satgutier@umich.edu        return;
7710152Satgutier@umich.edu    }
7810232Syasuko.eckert@amd.com
7910152Satgutier@umich.edu    void ElectricalDriver::decreaseDrivingStrength()
8010152Satgutier@umich.edu    {
81        ASSERT(isSizable(), "[Error] " + getInstanceName() +
82            " -> Attempted to size down unsizable driver!");
83        if(!hasMinDrivingStrength())
84        {
85            getModel()->decreaseDrivingStrength();
86        }
87        return;
88    }
89
90    bool ElectricalDriver::isDriver() const
91    {
92        return true;
93    }
94} // namespace DSENT
95
96