/* Copyright (c) 2012 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "model/timing_graph/ElectricalTimingNode.h" #include "model/timing_graph/ElectricalLoad.h" namespace DSENT { // Set the optical node initial visited num const int ElectricalTimingNode::TIMING_NODE_INIT_VISITED_NUM = 0; ElectricalTimingNode::ElectricalTimingNode(const String& instance_name_, ElectricalModel* model_) : m_instance_name_(instance_name_), m_model_(model_), m_false_path_(false), m_crit_path_(-1), m_visited_num_(ElectricalTimingNode::TIMING_NODE_INIT_VISITED_NUM), m_delay_left_(0.0) { m_upstream_nodes_ = new vector(); m_downstream_nodes_ = new vector(); } ElectricalTimingNode::~ElectricalTimingNode() { delete m_upstream_nodes_; delete m_downstream_nodes_; } double ElectricalTimingNode::getMaxUpstreamRes() const { double max_res = 0.0; for(unsigned int i = 0; i < m_upstream_nodes_->size(); ++i) { double res = m_upstream_nodes_->at(i)->getMaxUpstreamRes(); if(max_res < res) { max_res = res; } } return max_res; } double ElectricalTimingNode::getTotalDownstreamCap() const { double cap_sum = 0; for(unsigned int i = 0; i < m_downstream_nodes_->size(); ++i) { cap_sum += m_downstream_nodes_->at(i)->getTotalDownstreamCap(); } return cap_sum; } vector* ElectricalTimingNode::getUpstreamNodes() const { return m_upstream_nodes_; } vector* ElectricalTimingNode::getDownstreamNodes() const { return m_downstream_nodes_; } const String& ElectricalTimingNode::getInstanceName() const { return m_instance_name_; } ElectricalModel* ElectricalTimingNode::getModel() { return m_model_; } bool ElectricalTimingNode::isDriver() const { return false; } bool ElectricalTimingNode::isNet() const { return false; } bool ElectricalTimingNode::isLoad() const { return false; } const ElectricalModel* ElectricalTimingNode::getModel() const { return (const ElectricalModel*) m_model_; } void ElectricalTimingNode::addDownstreamNode(ElectricalTimingNode* node_) { m_downstream_nodes_->push_back(node_); node_->m_upstream_nodes_->push_back(this); return; } void ElectricalTimingNode::setFalsePath(bool false_path_) { m_false_path_ = false_path_; return; } bool ElectricalTimingNode::getFalsePath() const { return m_false_path_; } //------------------------------------------------------------------------- // Functions for delay optimization //------------------------------------------------------------------------- // By default, electrical timing nodes cannot be sized up/down bool ElectricalTimingNode::hasMaxDrivingStrength() const { return true; } bool ElectricalTimingNode::hasMinDrivingStrength() const { return true; } void ElectricalTimingNode::increaseDrivingStrength() { return; } void ElectricalTimingNode::decreaseDrivingStrength() { return; } //------------------------------------------------------------------------- //------------------------------------------------------------------------- // Node variables for critical path delay calculations //------------------------------------------------------------------------- void ElectricalTimingNode::setCritPath(int crit_path_) { m_crit_path_ = crit_path_; return; } int ElectricalTimingNode::getCritPath() const { return m_crit_path_; } void ElectricalTimingNode::setVisitedNum(int visited_num_) { m_visited_num_ = visited_num_; return; } int ElectricalTimingNode::getVisitedNum() const { return m_visited_num_; } void ElectricalTimingNode::setDelayLeft(double delay_left_) { m_delay_left_ = delay_left_; } double ElectricalTimingNode::getDelayLeft() const { return m_delay_left_; } //------------------------------------------------------------------------- } // namespace DSENT