?? leakage.c.svn-base
字號(hào):
/*------------------------------------------------------------
* CACTI 4.0
* Copyright 2005 Hewlett-Packard Development Corporation
* All Rights Reserved
*
* Permission to use, copy, and modify this software and its documentation is
* hereby granted only under the following terms and conditions. Both the
* above copyright notice and this permission notice must appear in all copies
* of the software, derivative works or modified versions, and any portions
* thereof, and both notices must appear in supporting documentation.
*
* Users of this software agree to the terms and conditions set forth herein, and
* hereby grant back to Hewlett-Packard Company and its affiliated companies ("HP")
* a non-exclusive, unrestricted, royalty-free right and license under any changes,
* enhancements or extensions made to the core functions of the software, including
* but not limited to those affording compatibility with other hardware or software
* environments, but excluding applications which incorporate this software.
* Users further agree to use their best efforts to return to HP any such changes,
* enhancements or extensions that they make and inform HP of noteworthy uses of
* this software. Correspondence should be provided to HP at:
*
* Director of Intellectual Property Licensing
* Office of Strategy and Technology
* Hewlett-Packard Company
* 1501 Page Mill Road
* Palo Alto, California 94304
*
* This software may be distributed (but not offered for sale or transferred
* for compensation) to third parties, provided such third parties agree to
* abide by the terms and conditions of this notice.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND HP DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL HP
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*------------------------------------------------------------*/
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "leakage.h"
#include "def.h"
#include "areadef.h"
/*dt: added for windows compatibility */
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
/* Box-Mueller Method */
double box_mueller(double std_var, double value)
{
double temp;
double temp1;
double random;
/* dt: drand48 not supported in windows
random = drand48();
*/
random = rand();
temp = sqrt((double)(-2.00 * (double)log(random)));
random = rand();
temp1 = cos(2.00 * M_PI * random);
return(temp * temp1 * std_var * value);
}
/* ************************************************************************ */
/* Calculating the NMOS I Normalized Leakage From the BSIM Equation.*/
/* Also Using Box-Mueller to Find the Random Samples Due to Any Variation */
/* In any of the parameters like length, Vdd etc. */
/* ************************************************************************ */
double nmos_ileakage(double aspect_ratio, double Volt, double Vth0, double Tkelvin, double tox0)
{
double Tox_Std_Array[No_of_Samples];
double Vdd_Std_Array[No_of_Samples];
double Tech_Std_Array[No_of_Samples];
double Vthn_Std_Array[No_of_Samples];
double Ileak_Std_Array[No_of_Samples];
int i;
double mean =0.0;
if(Tox_Std || Tech_Std || Vdd_Std || Vthn_Std)
{
for(i =0; i<No_of_Samples;i++)
{
Tox_Std_Array[i] = tox0;
Vdd_Std_Array[i] = Volt;
Tech_Std_Array[i] = tech_length0;
Vthn_Std_Array[i] = Vth0;
}
}
if(Tox_Std)
{
for(i =0; i<No_of_Samples;i++)
Tox_Std_Array[i] = tox0 + box_mueller(Tox_Std,tox0);
}
if(Tech_Std)
{
for(i =0; i<No_of_Samples;i++)
Tech_Std_Array[i] = tech_length0 + box_mueller(Tech_Std,tech_length0);
}
if(Vdd_Std)
{
for(i =0; i<No_of_Samples;i++)
Vdd_Std_Array[i] = Volt + box_mueller(Vdd_Std,Volt);
}
if(Vthn_Std)
{
for(i =0; i<No_of_Samples;i++)
Vthn_Std_Array[i] = Vth0 + box_mueller(Vthn_Std,Vth0);
}
if(Tox_Std || Tech_Std || Vdd_Std || Vthn_Std)
{
for(i =0; i<No_of_Samples;i++)
{
Ileak_Std_Array[i] = nmos_ileakage_var(aspect_ratio, Vdd_Std_Array[i], Vthn_Std_Array[i], Tkelvin, Tox_Std_Array[i], Tech_Std_Array[i]);
}
}
else
{
return(nmos_ileakage_var(aspect_ratio,Volt,Vth0,Tkelvin, tox0, tech_length0));
}
for(i =0; i<No_of_Samples;i++)
mean += Ileak_Std_Array[i];
mean = mean/(double)No_of_Samples;
return mean;
}
double nmos_ileakage_var(double aspect_ratio, double Volt, double Vth0, double Tkelvin, double tox0, double tech_length)
{
double Ileak;
double Vthermal;
double Vth,temp , Vnoff;
double param1,param2,param3, param4,param5,param6;
double temp1;
param1 = (aspect_ratio * tech_length0 *M0n*Cox)/tech_length;
/* Thermal Voltage */
Vthermal =((Bk*Tkelvin)/Qparam);
/* Vdd Fitting */
temp = Nb*(Volt- Volt0);
param2 = exp(temp);
param3 = 1-exp((-Volt/Vthermal));
Vth =Vth0 + Vnthx * (Tkelvin-300);
Vnoff = Vnoff0 + Nfix*(Vth0-Vthn);
param4 = exp(((-fabs(Vth)-Vnoff)/(NEta*Vthermal)));
temp = (tech_length0 - tech_length) * L_nmos_d ;
param5 = exp(temp);
temp1 = (tox0 - Tox) * Tox_nmos_e;
param6 = exp(temp1);
Ileak = param1*pow(Vthermal,2.0)*param2*param3*param4*param5*param6;
return Ileak;
}
/* ************************************************************************ */
/* Calculating the PMOS I Normalized Leakage From the BSIM Equation.*/
/* Also Using Box-Mueller to Find the Random Samples Due to Any Variation */
/* In any of the parameters like length, Vdd etc. */
/* ************************************************************************ */
double pmos_ileakage(double aspect_ratio,double Volt, double Vth0,double Tkelvin,double tox0)
{
double Tox_Std_Array[No_of_Samples];
double Vdd_Std_Array[No_of_Samples];
double Tech_Std_Array[No_of_Samples];
double Vthp_Std_Array[No_of_Samples];
double Ileak_Std_Array[No_of_Samples];
int i;
double mean =0.0;
if(Tox_Std || Tech_Std || Vdd_Std || Vthp_Std) {
for(i =0; i<No_of_Samples;i++)
{
Tox_Std_Array[i] = tox0;
Vdd_Std_Array[i] = Volt;
Tech_Std_Array[i] = tech_length0;
Vthp_Std_Array[i] = Vth0;
}
}
if(Tox_Std)
{
for(i =0; i<No_of_Samples;i++)
Tox_Std_Array[i] = tox0 + box_mueller(Tox_Std,tox0);
}
if(Tech_Std)
{
for(i =0; i<No_of_Samples;i++)
Tech_Std_Array[i] = tech_length0 + box_mueller(Tech_Std,tech_length0);
}
if(Vdd_Std)
{
for(i =0; i<No_of_Samples;i++)
Vdd_Std_Array[i] = Volt + box_mueller(Vdd_Std,Volt);
}
if(Vthp_Std)
{
for(i =0; i<No_of_Samples;i++)
Vthp_Std_Array[i] = Vth0 + box_mueller(Vthp_Std,Vth0);
}
if(Tox_Std || Tech_Std || Vdd_Std || Vthp_Std)
{
for(i =0; i<No_of_Samples;i++)
Ileak_Std_Array[i] = pmos_ileakage_var(aspect_ratio, Vdd_Std_Array[i], Vthp_Std_Array[i], Tkelvin, Tox_Std_Array[i], Tech_Std_Array[i]);
}
else
{
return (pmos_ileakage_var(aspect_ratio,Volt, Vth0, Tkelvin, tox0, tech_length0));
}
for(i =0; i<No_of_Samples;i++)
mean += Ileak_Std_Array[i];
mean = mean/(double)No_of_Samples;
return mean;
}
double pmos_ileakage_var(double aspect_ratio,double Volt, double Vth0,double Tkelvin,double tox0, double tech_length) {
double Ileak;
double Vthermal;
double Vth, temp ,temp1,Vpoff;
double param1,param2,param3,param4,param5,param6;
param1 = (aspect_ratio * tech_length0 *M0p*Cox )/tech_length;
/* Thermal Voltage */
Vthermal =((Bk*Tkelvin)/Qparam);
/* Vdd Fitting */
temp = Pb*(Volt- Volt0);
param2 = exp(temp);
param3 = 1-exp((-Volt/Vthermal));
Vth =Vth0 + Vpthx * (Tkelvin-300);
Vpoff = Vpoff0 + Pfix*(Vth0-Vthp);
param4 = exp(((-fabs(Vth)-Vpoff)/(PEta*Vthermal)));
temp = (tech_length0 - tech_length) * L_nmos_d ;
param5 = exp(temp);
temp1 = (tox0 - Tox) * Tox_nmos_e;
param6 = exp(temp1);
Ileak = param1*pow(Vthermal,2.0)*param2*param3*param4*param5*param6;
return Ileak;
}
double simplified_cmos_leakage(double naspect_ratio,double paspect_ratio, double nVth0, double pVth0,
double *norm_nleak, double *norm_pleak)
{
double sum;
double pIleak,nIleak;
double nVth,pVth,Vpoff,Vnoff;
double nparam1,pparam1,nparam4,pparam4;
nparam1 = naspect_ratio * precalc_nparamf;
pparam1 = paspect_ratio * precalc_pparamf;
nVth =nVth0 + precalc_Vnthx;
pVth =pVth0 + precalc_Vpthx;
Vnoff = Vnoff0 + Nfix*(nVth0-Vthn);
Vpoff = Vpoff0 + Pfix*(pVth0-Vthp);
nparam4 = exp(((-fabs(nVth)-Vnoff)*precalc_inv_nVthermal));
pparam4 = exp(((-fabs(pVth)-Vpoff)*precalc_inv_pVthermal));
*norm_nleak = precalc_nparamf*nparam4*precalc_nparaml;
*norm_pleak = precalc_pparamf*pparam4*precalc_pparaml;
nIleak = nparam1*nparam4*precalc_nparaml;
pIleak = pparam1*pparam4*precalc_pparaml;
sum = nIleak + pIleak;
return sum;
}
double optimized_simplified_cmos_leakage(double naspect_ratio,double paspect_ratio, double nVth0, double pVth0,
double * nleak, double * pleak)
{
double sum;
double pIleak,nIleak;
double nVth,pVth,Vpoff,Vnoff;
double nparam1,pparam1,nparam4,pparam4;
nparam1 = naspect_ratio * precalc_nparamf;
pparam1 = paspect_ratio * precalc_pparamf;
nVth =nVth0 + precalc_Vnthx;
pVth =pVth0 + precalc_Vpthx;
Vnoff = Vnoff0 + Nfix*(nVth0-Vthn);
Vpoff = Vpoff0 + Pfix*(pVth0-Vthp);
nparam4 = exp(((-fabs(nVth)-Vnoff)/(NEta*precalc_Vthermal)));
pparam4 = exp(((-fabs(pVth)-Vpoff)/(PEta*precalc_Vthermal)));
nIleak = nparam1*nparam4*precalc_nparaml;
pIleak = pparam1*pparam4*precalc_pparaml;
(*nleak) = precalc_nparamf*nparam4*precalc_nparaml;
(*pleak) = precalc_pparamf*pparam4*precalc_pparaml;
sum = nIleak + pIleak;
return sum;
}
double simplified_nmos_leakage(double naspect_ratio, double nVth0)
{
//double sum;
double nIleak;
double nVth,Vnoff;
double nparam1,nparam4;
if(have_leakage_params) {
nparam1 = naspect_ratio * precalc_nparamf;
nVth =nVth0 + precalc_Vnthx;
Vnoff = Vnoff0 + Nfix*(nVth0-Vthn);
nparam4 = exp(((-fabs(nVth)-Vnoff)/(NEta*precalc_Vthermal)));
nIleak = nparam1*nparam4*precalc_nparaml;
}
else {
nIleak = 0;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -