TechModel.h revision 10448
111308Santhony.gutierrez@amd.com/* Copyright (c) 2012 Massachusetts Institute of Technology 211308Santhony.gutierrez@amd.com * 311308Santhony.gutierrez@amd.com * Permission is hereby granted, free of charge, to any person obtaining a copy 411308Santhony.gutierrez@amd.com * of this software and associated documentation files (the "Software"), to deal 511308Santhony.gutierrez@amd.com * in the Software without restriction, including without limitation the rights 611308Santhony.gutierrez@amd.com * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 711308Santhony.gutierrez@amd.com * copies of the Software, and to permit persons to whom the Software is 811308Santhony.gutierrez@amd.com * furnished to do so, subject to the following conditions: 911308Santhony.gutierrez@amd.com * 1011308Santhony.gutierrez@amd.com * The above copyright notice and this permission notice shall be included in 1111308Santhony.gutierrez@amd.com * all copies or substantial portions of the Software. 1211308Santhony.gutierrez@amd.com * 1311308Santhony.gutierrez@amd.com * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1411308Santhony.gutierrez@amd.com * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1511308Santhony.gutierrez@amd.com * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1611308Santhony.gutierrez@amd.com * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1711308Santhony.gutierrez@amd.com * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1811308Santhony.gutierrez@amd.com * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1911308Santhony.gutierrez@amd.com * THE SOFTWARE. 2011308Santhony.gutierrez@amd.com */ 2111308Santhony.gutierrez@amd.com 2211308Santhony.gutierrez@amd.com#ifndef __DSENT_TECH_TECH_MODEL_H__ 2311308Santhony.gutierrez@amd.com#define __DSENT_TECH_TECH_MODEL_H__ 2411308Santhony.gutierrez@amd.com 2511308Santhony.gutierrez@amd.com#include <vector> 2611308Santhony.gutierrez@amd.com#include <set> 2711308Santhony.gutierrez@amd.com 2811308Santhony.gutierrez@amd.com#include "libutil/Config.h" 2911308Santhony.gutierrez@amd.com#include "libutil/String.h" 3011308Santhony.gutierrez@amd.com 3111308Santhony.gutierrez@amd.comnamespace DSENT 3211308Santhony.gutierrez@amd.com{ 3311308Santhony.gutierrez@amd.com class StdCellLib; 3411308Santhony.gutierrez@amd.com 3511308Santhony.gutierrez@amd.com using std::set; 3611308Santhony.gutierrez@amd.com using std::vector; 3711308Santhony.gutierrez@amd.com using LibUtil::String; 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com class TechModel 4011308Santhony.gutierrez@amd.com { 4111308Santhony.gutierrez@amd.com public: 4211308Santhony.gutierrez@amd.com typedef std::set<String>::const_iterator ConstWireLayerIterator; 4311308Santhony.gutierrez@amd.com 4411308Santhony.gutierrez@amd.com public: 4511308Santhony.gutierrez@amd.com TechModel(); 4611308Santhony.gutierrez@amd.com virtual ~TechModel(); 4711308Santhony.gutierrez@amd.com 4811308Santhony.gutierrez@amd.com public: 4911308Santhony.gutierrez@amd.com // Get the value_ corresponding to the key_ 5011308Santhony.gutierrez@amd.com const String& get(const String& key_) const; 5111308Santhony.gutierrez@amd.com 5211308Santhony.gutierrez@amd.com // Set the pointer to a standard cell library 5311308Santhony.gutierrez@amd.com void setStdCellLib(const StdCellLib* std_cell_lib_); 5411308Santhony.gutierrez@amd.com // Get the pointer to the standard cell library 5511308Santhony.gutierrez@amd.com const StdCellLib* getStdCellLib() const; 5611308Santhony.gutierrez@amd.com 5711308Santhony.gutierrez@amd.com // Return a cloned copy of this instance 5811308Santhony.gutierrez@amd.com virtual TechModel* clone() const; 5911308Santhony.gutierrez@amd.com // Override readFile function to include multiple technology files 6011308Santhony.gutierrez@amd.com virtual void readFile(const String& filename_); 6111308Santhony.gutierrez@amd.com 6211308Santhony.gutierrez@amd.com // Transistor 6311308Santhony.gutierrez@amd.com // Returns the leakage current of NMOS transistors, given the transistor stakcing, transistor widths, and input combination 6411308Santhony.gutierrez@amd.com double calculateNmosLeakageCurrent(unsigned int num_stacks_, double uni_stacked_mos_width_, unsigned int input_vector_) const; 6511308Santhony.gutierrez@amd.com double calculateNmosLeakageCurrent(unsigned int num_stacks_, const vector<double>& stacked_mos_widths_, unsigned int input_vector_) const; 6611308Santhony.gutierrez@amd.com // Returns the leakage current of PMOS transistors, given the transistor stakcing, transistor widths, and input combination 6711308Santhony.gutierrez@amd.com double calculatePmosLeakageCurrent(unsigned int num_stacks_, double uni_stacked_mos_width_, unsigned int input_vector_) const; 6811308Santhony.gutierrez@amd.com double calculatePmosLeakageCurrent(unsigned int num_stacks_, const vector<double>& stacked_mos_widths_, unsigned int input_vector_) const; 6911308Santhony.gutierrez@amd.com // Returns the leakage current, given the transistor stakcing, transistor widths, input combination, 7011308Santhony.gutierrez@amd.com // and technology information (vdd, subthreshold swing, subthreshold dibl swing) 7111308Santhony.gutierrez@amd.com double calculateLeakageCurrentFactor(unsigned int num_stacks_, const vector<double>& stacked_mos_widths_, unsigned int input_vector_, double vdd_, double subthreshold_swing_, double dibl_swing_) const; 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com // Wire 7411308Santhony.gutierrez@amd.com // Check if the wire layer exist 7511308Santhony.gutierrez@amd.com bool isWireLayerExist(const String& layer_name_) const; 7611308Santhony.gutierrez@amd.com const std::set<String>* getAvailableWireLayers() const; 7711308Santhony.gutierrez@amd.com // Return wire capacitance for given wire layer, wire width, wire spacing, and wire length 7811308Santhony.gutierrez@amd.com double calculateWireCapacitance(const String& layer_name_, double width_, double spacing_, double length_) const; 7911308Santhony.gutierrez@amd.com // Return wire resistance for given wire layer, wire width, and wire length 8011308Santhony.gutierrez@amd.com double calculateWireResistance(const String& layer_name_, double width_, double length_) const; 8111308Santhony.gutierrez@amd.com 8211308Santhony.gutierrez@amd.com private: 8311308Santhony.gutierrez@amd.com // Private copy constructor. Use clone to perform copy operation 8411308Santhony.gutierrez@amd.com TechModel(const TechModel& tech_model_); 8511308Santhony.gutierrez@amd.com 8611308Santhony.gutierrez@amd.com private: 8711308Santhony.gutierrez@amd.com // A pointer to a standard cell library 8811308Santhony.gutierrez@amd.com const StdCellLib* m_std_cell_lib_; 8911308Santhony.gutierrez@amd.com // A set of available wire layers 9011308Santhony.gutierrez@amd.com std::set<String>* m_available_wire_layers_; 9111308Santhony.gutierrez@amd.com // A map of model's parameters 9211308Santhony.gutierrez@amd.com std::map<String, String> params; 9311308Santhony.gutierrez@amd.com }; // class TechModel 9411308Santhony.gutierrez@amd.com} // namespace DSENT 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.com#endif // __DSENT_TECH_TECH_MODEL_H__ 9711308Santhony.gutierrez@amd.com