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 */ 21 22 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 117