diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c index 4657f1be2..cd614bc26 100644 --- a/src/spicelib/devices/vdmos/vdmos.c +++ b/src/spicelib/devices/vdmos/vdmos.c @@ -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 */ diff --git a/src/spicelib/devices/vdmos/vdmosask.c b/src/spicelib/devices/vdmos/vdmosask.c index 9319b8c42..bf97916ae 100644 --- a/src/spicelib/devices/vdmos/vdmosask.c +++ b/src/spicelib/devices/vdmos/vdmosask.c @@ -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); diff --git a/src/spicelib/devices/vdmos/vdmosdefs.h b/src/spicelib/devices/vdmos/vdmosdefs.h index e7fc33e00..4cf9b9a98 100644 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ b/src/spicelib/devices/vdmos/vdmosdefs.h @@ -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, }; diff --git a/src/spicelib/devices/vdmos/vdmosdel.c b/src/spicelib/devices/vdmos/vdmosdel.c index 7b9c066b5..5ea8e84df 100644 --- a/src/spicelib/devices/vdmos/vdmosdel.c +++ b/src/spicelib/devices/vdmos/vdmosdel.c @@ -13,6 +13,5 @@ int VDMOSdelete(GENinstance *gen_inst) { VDMOSinstance *inst = (VDMOSinstance *) gen_inst; - FREE(inst->VDMOSsens); return OK; } diff --git a/src/spicelib/devices/vdmos/vdmosload.c b/src/spicelib/devices/vdmos/vdmosload.c index fa0118763..f56a62b27 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/src/spicelib/devices/vdmos/vdmosload.c @@ -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)) ) ) { diff --git a/src/spicelib/devices/vdmos/vdmospar.c b/src/spicelib/devices/vdmos/vdmospar.c index 0a0263083..f05896807 100644 --- a/src/spicelib/devices/vdmos/vdmospar.c +++ b/src/spicelib/devices/vdmos/vdmospar.c @@ -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); } diff --git a/src/spicelib/devices/vdmos/vdmosset.c b/src/spicelib/devices/vdmos/vdmosset.c index 1021bd2a8..f6d3e5600 100644 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ b/src/spicelib/devices/vdmos/vdmosset.c @@ -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; }