ElectricalDriver.cc revision 10447:a465576671d4
1
2#include "model/timing_graph/ElectricalDriver.h"
3#include "model/timing_graph/ElectricalNet.h"
4#include "model/ElectricalModel.h"
5
6namespace DSENT
7{
8    ElectricalDriver::ElectricalDriver(const String& instance_name_, ElectricalModel* model_, bool sizable_)
9        : ElectricalTimingNode(instance_name_, model_), m_output_res_(0.0), m_sizable_(sizable_)
10    {
11
12    }
13
14    ElectricalDriver::~ElectricalDriver()
15    {
16
17    }
18
19    void ElectricalDriver::setOutputRes(double output_res_)
20    {
21        m_output_res_ = output_res_;
22        return;
23    }
24
25    double ElectricalDriver::getOutputRes() const
26    {
27        return m_output_res_;
28    }
29
30    double ElectricalDriver::calculateDelay() const
31    {
32        return 0.693 * m_output_res_ * getTotalDownstreamCap();
33    }
34
35    double ElectricalDriver::calculateTransition() const
36    {
37        return 1.386 * getMaxUpstreamRes() * getTotalDownstreamCap();
38    }
39
40    double ElectricalDriver::getMaxUpstreamRes() const
41    {
42        return m_output_res_;
43    }
44
45    bool ElectricalDriver::isSizable() const
46    {
47        return m_sizable_;
48    }
49
50    bool ElectricalDriver::hasMaxDrivingStrength() const
51    {
52        if (!isSizable())
53        {
54            return true;
55        }
56        return (getModel() == NULL) || (getModel()->hasMaxDrivingStrength());
57    }
58
59    bool ElectricalDriver::hasMinDrivingStrength() const
60    {
61        if (!isSizable())
62        {
63            return true;
64        }
65        return (getModel() == NULL) || (getModel()->hasMinDrivingStrength());
66    }
67
68    void ElectricalDriver::increaseDrivingStrength()
69    {
70        ASSERT(isSizable(), "[Error] " + getInstanceName() +
71            " -> Attempted to size up unsizable driver!");
72        if(!hasMaxDrivingStrength())
73        {
74            getModel()->increaseDrivingStrength();
75        }
76        return;
77    }
78
79    void ElectricalDriver::decreaseDrivingStrength()
80    {
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