remove never used sensitivity analysis code

This commit is contained in:
Holger Vogt 2018-04-04 11:24:26 +02:00 committed by rlar
parent b6a8613427
commit b87f5c0563
7 changed files with 4 additions and 304 deletions

View File

@ -28,8 +28,6 @@ IFparm VDMOSpTable[] = { /* parameters */
IOPU("temp", VDMOS_TEMP, IF_REAL, "Instance temperature"),
IOPU("dtemp", VDMOS_DTEMP, IF_REAL, "Instance temperature difference"),
IP( "ic", VDMOS_IC, IF_REALVEC, "Vector of D-S, G-S, B-S voltages"),
IP( "sens_l", VDMOS_L_SENS, IF_FLAG, "flag to request sensitivity WRT length"),
IP( "sens_w", VDMOS_W_SENS, IF_FLAG, "flag to request sensitivity WRT width"),
OP( "id", VDMOS_CD, IF_REAL, "Drain current"),
OP( "is", VDMOS_CS, IF_REAL, "Source current"),
@ -92,26 +90,6 @@ IFparm VDMOSpTable[] = { /* parameters */
OPU( "qbd", VDMOS_QBD, IF_REAL, "Bulk-Drain charge storage"),
OPU( "qbs", VDMOS_QBS, IF_REAL, "Bulk-Source charge storage"),
OPU( "p", VDMOS_POWER, IF_REAL, "Instaneous power"),
OPU( "sens_l_dc", VDMOS_L_SENS_DC, IF_REAL, "dc sensitivity wrt length"),
OPU( "sens_l_real", VDMOS_L_SENS_REAL,IF_REAL,
"real part of ac sensitivity wrt length"),
OPU( "sens_l_imag", VDMOS_L_SENS_IMAG,IF_REAL,
"imag part of ac sensitivity wrt length"),
OPU( "sens_l_mag", VDMOS_L_SENS_MAG, IF_REAL,
"sensitivity wrt l of ac magnitude"),
OPU( "sens_l_ph", VDMOS_L_SENS_PH, IF_REAL,
"sensitivity wrt l of ac phase"),
OPU( "sens_l_cplx", VDMOS_L_SENS_CPLX,IF_COMPLEX, "ac sensitivity wrt length"),
OPU( "sens_w_dc", VDMOS_W_SENS_DC, IF_REAL, "dc sensitivity wrt width"),
OPU( "sens_w_real", VDMOS_W_SENS_REAL,IF_REAL,
"real part of ac sensitivity wrt width"),
OPU( "sens_w_imag", VDMOS_W_SENS_IMAG,IF_REAL,
"imag part of ac sensitivity wrt width"),
OPU( "sens_w_mag", VDMOS_W_SENS_MAG, IF_REAL,
"sensitivity wrt w of ac magnitude"),
OPU( "sens_w_ph", VDMOS_W_SENS_PH, IF_REAL,
"sensitivity wrt w of ac phase"),
OPU( "sens_w_cplx", VDMOS_W_SENS_CPLX,IF_COMPLEX, "ac sensitivity wrt width")
};
IFparm VDMOSmPTable[] = { /* model parameters */

View File

@ -19,12 +19,9 @@ VDMOSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
IFvalue *select)
{
VDMOSinstance *here = (VDMOSinstance*)inst;
double vr;
double vi;
double sr;
double si;
double vm;
static char *msg = "Current and power not available for ac analysis";
NG_IGNORE(select);
switch(which) {
case VDMOS_TEMP:
value->rValue = here->VDMOStemp - CONSTCtoK;
@ -231,126 +228,6 @@ VDMOSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
case VDMOS_CQBS:
value->rValue = *(ckt->CKTstate0 + here->VDMOScqbs);
return(OK);
case VDMOS_L_SENS_DC:
if(ckt->CKTsenInfo && here->VDMOSsens_l){
value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+
here->VDMOSsenParmNo);
}
return(OK);
case VDMOS_L_SENS_REAL:
if(ckt->CKTsenInfo && here->VDMOSsens_l){
value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->VDMOSsenParmNo);
}
return(OK);
case VDMOS_L_SENS_IMAG:
if(ckt->CKTsenInfo && here->VDMOSsens_l){
value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->VDMOSsenParmNo);
}
return(OK);
case VDMOS_L_SENS_MAG:
if(ckt->CKTsenInfo && here->VDMOSsens_l){
vr = *(ckt->CKTrhsOld + select->iValue + 1);
vi = *(ckt->CKTirhsOld + select->iValue + 1);
vm = sqrt(vr*vr + vi*vi);
if(vm == 0){
value->rValue = 0;
return(OK);
}
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->VDMOSsenParmNo);
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->VDMOSsenParmNo);
value->rValue = (vr * sr + vi * si)/vm;
}
return(OK);
case VDMOS_L_SENS_PH:
if(ckt->CKTsenInfo && here->VDMOSsens_l){
vr = *(ckt->CKTrhsOld + select->iValue + 1);
vi = *(ckt->CKTirhsOld + select->iValue + 1);
vm = vr*vr + vi*vi;
if(vm == 0){
value->rValue = 0;
return(OK);
}
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->VDMOSsenParmNo);
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->VDMOSsenParmNo);
value->rValue = (vr * si - vi * sr)/vm;
}
return(OK);
case VDMOS_L_SENS_CPLX:
if(ckt->CKTsenInfo && here->VDMOSsens_l){
value->cValue.real=
*(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->VDMOSsenParmNo);
value->cValue.imag=
*(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->VDMOSsenParmNo);
}
return(OK);
case VDMOS_W_SENS_DC:
if(ckt->CKTsenInfo && here->VDMOSsens_w){
value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
}
return(OK);
case VDMOS_W_SENS_REAL:
if(ckt->CKTsenInfo && here->VDMOSsens_w){
value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
}
return(OK);
case VDMOS_W_SENS_IMAG:
if(ckt->CKTsenInfo && here->VDMOSsens_w){
value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
}
return(OK);
case VDMOS_W_SENS_MAG:
if(ckt->CKTsenInfo && here->VDMOSsens_w){
vr = *(ckt->CKTrhsOld + select->iValue + 1);
vi = *(ckt->CKTirhsOld + select->iValue + 1);
vm = sqrt(vr*vr + vi*vi);
if(vm == 0){
value->rValue = 0;
return(OK);
}
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
value->rValue = (vr * sr + vi * si)/vm;
}
return(OK);
case VDMOS_W_SENS_PH:
if(ckt->CKTsenInfo && here->VDMOSsens_w){
vr = *(ckt->CKTrhsOld + select->iValue + 1);
vi = *(ckt->CKTirhsOld + select->iValue + 1);
vm = vr*vr + vi*vi;
if(vm == 0){
value->rValue = 0;
return(OK);
}
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
value->rValue = (vr * si - vi * sr)/vm;
}
return(OK);
case VDMOS_W_SENS_CPLX:
if(ckt->CKTsenInfo && here->VDMOSsens_w){
value->cValue.real=
*(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
value->cValue.imag=
*(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->VDMOSsenParmNo + here->VDMOSsens_l);
}
return(OK);
case VDMOS_CB :
if (ckt->CKTcurrentAnalysis & DOING_AC) {
errMsg = TMALLOC(char, strlen(msg) + 1);

View File

@ -231,45 +231,6 @@ typedef struct sVDMOSinstance {
double *VDMOSSPdpPtr; /* pointer to sparse matrix element at
* (source prime node,drain prime node) */
int VDMOSsenParmNo; /* parameter # for sensitivity use;
set equal to 0 if neither length
nor width of the mosfet is a design
parameter */
unsigned VDMOSsens_l :1; /* field which indicates whether
length of the mosfet is a design
parameter or not */
unsigned VDMOSsens_w :1; /* field which indicates whether
width of the mosfet is a design
parameter or not */
unsigned VDMOSsenPertFlag :1; /* indictes whether the the
parameter of the particular instance is
to be perturbed */
double VDMOScgs;
double VDMOScgd;
double VDMOScgb;
double *VDMOSsens;
#define VDMOSsenCgs VDMOSsens /* contains pertured values of cgs */
#define VDMOSsenCgd VDMOSsens + 6 /* contains perturbed values of cgd*/
#define VDMOSsenCgb VDMOSsens + 12 /* contains perturbed values of cgb*/
#define VDMOSsenCbd VDMOSsens + 18 /* contains perturbed values of cbd*/
#define VDMOSsenCbs VDMOSsens + 24 /* contains perturbed values of cbs*/
#define VDMOSsenGds VDMOSsens + 30 /* contains perturbed values of gds*/
#define VDMOSsenGbs VDMOSsens + 36 /* contains perturbed values of gbs*/
#define VDMOSsenGbd VDMOSsens + 42 /* contains perturbed values of gbd*/
#define VDMOSsenGm VDMOSsens + 48 /* contains perturbed values of gm*/
#define VDMOSsenGmbs VDMOSsens + 54 /* contains perturbed values of gmbs*/
#define VDMOSdphigs_dl VDMOSsens + 60
#define VDMOSdphigd_dl VDMOSsens + 61
#define VDMOSdphigb_dl VDMOSsens + 62
#define VDMOSdphibs_dl VDMOSsens + 63
#define VDMOSdphibd_dl VDMOSsens + 64
#define VDMOSdphigs_dw VDMOSsens + 65
#define VDMOSdphigd_dw VDMOSsens + 66
#define VDMOSdphigb_dw VDMOSsens + 67
#define VDMOSdphibs_dw VDMOSsens + 68
#define VDMOSdphibd_dw VDMOSsens + 69
} VDMOSinstance ;
#define VDMOSvbd VDMOSstates+ 0 /* bulk-drain voltage */
@ -297,16 +258,6 @@ typedef struct sVDMOSinstance {
#define VDMOSnumStates 17
#define VDMOSsensxpgs VDMOSstates+17 /* charge sensitivities and their derivatives.
* +18 for the derivatives
* pointer to the beginning of the array */
#define VDMOSsensxpgd VDMOSstates+19
#define VDMOSsensxpgb VDMOSstates+21
#define VDMOSsensxpbs VDMOSstates+23
#define VDMOSsensxpbd VDMOSstates+25
#define VDMOSnumSenStates 10
/* per model data */
@ -413,8 +364,6 @@ enum {
VDMOS_IC_VBS,
VDMOS_IC_VDS,
VDMOS_IC_VGS,
VDMOS_W_SENS,
VDMOS_L_SENS,
VDMOS_CB,
VDMOS_CG,
VDMOS_CS,
@ -508,18 +457,6 @@ enum {
VDMOS_CQBD,
VDMOS_QBS,
VDMOS_CQBS,
VDMOS_L_SENS_REAL,
VDMOS_L_SENS_IMAG,
VDMOS_L_SENS_MAG,
VDMOS_L_SENS_PH,
VDMOS_L_SENS_CPLX,
VDMOS_W_SENS_REAL,
VDMOS_W_SENS_IMAG,
VDMOS_W_SENS_MAG,
VDMOS_W_SENS_PH,
VDMOS_W_SENS_CPLX,
VDMOS_L_SENS_DC,
VDMOS_W_SENS_DC,
VDMOS_SOURCERESIST,
VDMOS_DRAINRESIST,
};

View File

@ -13,6 +13,5 @@ int
VDMOSdelete(GENinstance *gen_inst)
{
VDMOSinstance *inst = (VDMOSinstance *) gen_inst;
FREE(inst->VDMOSsens);
return OK;
}

View File

@ -80,7 +80,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
double tempv;
#endif /*NOBYPASS*/
int error;
int SenCond;
/* loop through all the VDMOS device models */
for( ; model != NULL; model = VDMOSnextModel(model)) {
@ -91,17 +90,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
vt = CONSTKoverQ * here->VDMOStemp;
Check=1;
if(ckt->CKTsenInfo){
#ifdef SENSDEBUG
printf("VDMOSload \n");
#endif /* SENSDEBUG */
if((ckt->CKTsenInfo->SENstatus == PERTURBATION)&&
(here->VDMOSsenPertFlag == OFF))continue;
}
SenCond = ckt->CKTsenInfo && here->VDMOSsenPertFlag;
/*
*/
@ -145,44 +133,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
* share some code, so we put them first - others later on
*/
if(SenCond){
#ifdef SENSDEBUG
printf("VDMOSsenPertFlag = ON \n");
#endif /* SENSDEBUG */
if((ckt->CKTsenInfo->SENmode == TRANSEN) &&
(ckt->CKTmode & MODEINITTRAN)) {
vgs = *(ckt->CKTstate1 + here->VDMOSvgs);
vds = *(ckt->CKTstate1 + here->VDMOSvds);
vbs = *(ckt->CKTstate1 + here->VDMOSvbs);
vbd = *(ckt->CKTstate1 + here->VDMOSvbd);
vgb = vgs - vbs;
vgd = vgs - vds;
}
else if (ckt->CKTsenInfo->SENmode == ACSEN){
vgb = model->VDMOStype * (
*(ckt->CKTrhsOp+here->VDMOSgNode) -
*(ckt->CKTrhsOp+here->VDMOSbNode));
vbs = *(ckt->CKTstate0 + here->VDMOSvbs);
vbd = *(ckt->CKTstate0 + here->VDMOSvbd);
vgd = vgb + vbd ;
vgs = vgb + vbs ;
vds = vbs - vbd ;
}
else{
vgs = *(ckt->CKTstate0 + here->VDMOSvgs);
vds = *(ckt->CKTstate0 + here->VDMOSvds);
vbs = *(ckt->CKTstate0 + here->VDMOSvbs);
vbd = *(ckt->CKTstate0 + here->VDMOSvbd);
vgb = vgs - vbs;
vgd = vgs - vds;
}
#ifdef SENSDEBUG
printf(" vbs = %.7e ,vbd = %.7e,vgb = %.7e\n",vbs,vbd,vgb);
printf(" vgs = %.7e ,vds = %.7e,vgd = %.7e\n",vgs,vds,vgd);
#endif /* SENSDEBUG */
goto next1;
}
if((ckt->CKTmode & (MODEINITFLOAT | MODEINITPRED | MODEINITSMSIG
| MODEINITTRAN)) ||
@ -322,11 +272,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1+here->VDMOScapgb) +
GateBulkOverlapCap );
if(ckt->CKTsenInfo){
here->VDMOScgs = capgs;
here->VDMOScgd = capgd;
here->VDMOScgb = capgb;
}
}
goto bypass;
}
@ -418,7 +363,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
* here we just evaluate the ideal diode current and the
* corresponding derivative (conductance).
*/
next1: if(vbs <= -3*vt) {
if(vbs <= -3*vt) {
here->VDMOSgbs = ckt->CKTgmin;
here->VDMOScbs = here->VDMOSgbs*vbs-SourceSatCur;
} else {
@ -649,7 +594,6 @@ next1: if(vbs <= -3*vt) {
*/
if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2;
if ( (ckt->CKTmode & MODETRAN) || ( (ckt->CKTmode&MODEINITTRAN)
&& !(ckt->CKTmode&MODEUIC)) ) {
@ -681,8 +625,6 @@ next1: if(vbs <= -3*vt) {
*/
if(SenCond) goto next2;
/*
* check convergence
@ -700,7 +642,7 @@ next1: if(vbs <= -3*vt) {
/* save things away for next time */
next2: *(ckt->CKTstate0 + here->VDMOSvbs) = vbs;
*(ckt->CKTstate0 + here->VDMOSvbs) = vbs;
*(ckt->CKTstate0 + here->VDMOSvbd) = vbd;
*(ckt->CKTstate0 + here->VDMOSvgs) = vgs;
*(ckt->CKTstate0 + here->VDMOSvds) = vds;
@ -757,26 +699,10 @@ next1: if(vbs <= -3*vt) {
*(ckt->CKTstate1+here->VDMOScapgb) +
GateBulkOverlapCap );
}
if(ckt->CKTsenInfo){
here->VDMOScgs = capgs;
here->VDMOScgd = capgd;
here->VDMOScgb = capgb;
}
/*
*/
/*
* store small-signal parameters (for meyer's model)
* all parameters already stored, so done...
*/
if(SenCond){
if((ckt->CKTsenInfo->SENmode == DCSEN)||
(ckt->CKTsenInfo->SENmode == ACSEN)){
continue;
}
}
#ifndef PREDICTOR
if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) {
*(ckt->CKTstate0 + here->VDMOSqgs) =
@ -810,7 +736,6 @@ next1: if(vbs <= -3*vt) {
#ifndef NOBYPASS
bypass:
#endif
if(SenCond) continue;
if ( (ckt->CKTmode & (MODEINITTRAN)) ||
(! (ckt->CKTmode & (MODETRAN)) ) ) {

View File

@ -104,18 +104,6 @@ VDMOSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
return(E_BADPARM);
}
break;
case VDMOS_L_SENS:
if(value->iValue) {
here->VDMOSsenParmNo = 1;
here->VDMOSsens_l = 1;
}
break;
case VDMOS_W_SENS:
if(value->iValue) {
here->VDMOSsenParmNo = 1;
here->VDMOSsens_w = 1;
}
break;
default:
return(E_BADPARM);
}

View File

@ -96,10 +96,6 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
here->VDMOSstates = *states;
*states += VDMOSnumStates;
if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) ){
*states += VDMOSnumSenStates * (ckt->CKTsenInfo->SENparms);
}
if(!here->VDMOSdrainPerimiterGiven) {
here->VDMOSdrainPerimiter = 0;
}