| 1/* Copyright (c) 2012 Massachusetts Institute of Technology 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining a copy 4 * of this software and associated documentation files (the "Software"), to deal 5 * in the Software without restriction, including without limitation the rights 6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 * copies of the Software, and to permit persons to whom the Software is 8 * furnished to do so, subject to the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in 11 * all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 * THE SOFTWARE. 20 */
|
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
| 23#include "model/timing_graph/ElectricalDriver.h" 24#include "model/timing_graph/ElectricalNet.h" 25#include "model/ElectricalModel.h" 26 27namespace DSENT 28{ 29 ElectricalDriver::ElectricalDriver(const String& instance_name_, ElectricalModel* model_, bool sizable_) 30 : ElectricalTimingNode(instance_name_, model_), m_output_res_(0.0), m_sizable_(sizable_) 31 { 32 33 } 34 35 ElectricalDriver::~ElectricalDriver() 36 { 37 38 } 39 40 void ElectricalDriver::setOutputRes(double output_res_) 41 { 42 m_output_res_ = output_res_; 43 return; 44 } 45 46 double ElectricalDriver::getOutputRes() const 47 { 48 return m_output_res_; 49 } 50 51 double ElectricalDriver::calculateDelay() const 52 { 53 return 0.693 * m_output_res_ * getTotalDownstreamCap(); 54 } 55 56 double ElectricalDriver::calculateTransition() const 57 { 58 return 1.386 * getMaxUpstreamRes() * getTotalDownstreamCap(); 59 } 60 61 double ElectricalDriver::getMaxUpstreamRes() const 62 { 63 return m_output_res_; 64 } 65 66 bool ElectricalDriver::isSizable() const 67 { 68 return m_sizable_; 69 } 70 71 bool ElectricalDriver::hasMaxDrivingStrength() const 72 { 73 if (!isSizable()) 74 { 75 return true; 76 } 77 return (getModel() == NULL) || (getModel()->hasMaxDrivingStrength()); 78 } 79 80 bool ElectricalDriver::hasMinDrivingStrength() const 81 { 82 if (!isSizable()) 83 { 84 return true; 85 } 86 return (getModel() == NULL) || (getModel()->hasMinDrivingStrength()); 87 } 88 89 void ElectricalDriver::increaseDrivingStrength() 90 { 91 ASSERT(isSizable(), "[Error] " + getInstanceName() + 92 " -> Attempted to size up unsizable driver!"); 93 if(!hasMaxDrivingStrength()) 94 { 95 getModel()->increaseDrivingStrength(); 96 } 97 return; 98 } 99 100 void ElectricalDriver::decreaseDrivingStrength() 101 { 102 ASSERT(isSizable(), "[Error] " + getInstanceName() + 103 " -> Attempted to size down unsizable driver!"); 104 if(!hasMinDrivingStrength()) 105 { 106 getModel()->decreaseDrivingStrength(); 107 } 108 return; 109 } 110 111 bool ElectricalDriver::isDriver() const 112 { 113 return true; 114 } 115} // namespace DSENT 116
|