You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

116 lines
4.3 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Modified: 2000 AlansFixes
**********/
/*
*/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "mos2defs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
MOS2acLoad(GENmodel *inModel, CKTcircuit *ckt)
{
MOS2model *model = (MOS2model *)inModel;
MOS2instance *here;
int xnrm;
int xrev;
double xgs;
double xgd;
double xgb;
double xbd;
double xbs;
double capgs;
double capgd;
double capgb;
double GateBulkOverlapCap;
double GateDrainOverlapCap;
double GateSourceOverlapCap;
double EffectiveLength;
for( ; model != NULL; model = model->MOS2nextModel) {
for(here = model->MOS2instances; here!= NULL;
here = here->MOS2nextInstance) {
if (here->MOS2mode < 0) {
xnrm=0;
xrev=1;
} else {
xnrm=1;
xrev=0;
}
/*
* meyer's model parameters
*/
EffectiveLength=here->MOS2l - 2*model->MOS2latDiff;
GateSourceOverlapCap = model->MOS2gateSourceOverlapCapFactor *
here->MOS2m * here->MOS2w;
GateDrainOverlapCap = model->MOS2gateDrainOverlapCapFactor *
here->MOS2m * here->MOS2w;
GateBulkOverlapCap = model->MOS2gateBulkOverlapCapFactor *
here->MOS2m * EffectiveLength;
capgs = ( *(ckt->CKTstate0+here->MOS2capgs)+
*(ckt->CKTstate0+here->MOS2capgs) +
GateSourceOverlapCap );
capgd = ( *(ckt->CKTstate0+here->MOS2capgd)+
*(ckt->CKTstate0+here->MOS2capgd) +
GateDrainOverlapCap );
capgb = ( *(ckt->CKTstate0+here->MOS2capgb)+
*(ckt->CKTstate0+here->MOS2capgb) +
GateBulkOverlapCap );
xgs = capgs * ckt->CKTomega;
xgd = capgd * ckt->CKTomega;
xgb = capgb * ckt->CKTomega;
xbd = here->MOS2capbd * ckt->CKTomega;
xbs = here->MOS2capbs * ckt->CKTomega;
/*
* load matrix
*/
*(here->MOS2GgPtr +1) += xgd+xgs+xgb;
*(here->MOS2BbPtr +1) += xgb+xbd+xbs;
*(here->MOS2DPdpPtr +1) += xgd+xbd;
*(here->MOS2SPspPtr +1) += xgs+xbs;
*(here->MOS2GbPtr +1) -= xgb;
*(here->MOS2GdpPtr +1) -= xgd;
*(here->MOS2GspPtr +1) -= xgs;
*(here->MOS2BgPtr +1) -= xgb;
*(here->MOS2BdpPtr +1) -= xbd;
*(here->MOS2BspPtr +1) -= xbs;
*(here->MOS2DPgPtr +1) -= xgd;
*(here->MOS2DPbPtr +1) -= xbd;
*(here->MOS2SPgPtr +1) -= xgs;
*(here->MOS2SPbPtr +1) -= xbs;
*(here->MOS2DdPtr) += here->MOS2drainConductance;
*(here->MOS2SsPtr) += here->MOS2sourceConductance;
*(here->MOS2BbPtr) += here->MOS2gbd+here->MOS2gbs;
*(here->MOS2DPdpPtr) += here->MOS2drainConductance+
here->MOS2gds+here->MOS2gbd+
xrev*(here->MOS2gm+here->MOS2gmbs);
*(here->MOS2SPspPtr) += here->MOS2sourceConductance+
here->MOS2gds+here->MOS2gbs+
xnrm*(here->MOS2gm+here->MOS2gmbs);
*(here->MOS2DdpPtr) -= here->MOS2drainConductance;
*(here->MOS2SspPtr) -= here->MOS2sourceConductance;
*(here->MOS2BdpPtr) -= here->MOS2gbd;
*(here->MOS2BspPtr) -= here->MOS2gbs;
*(here->MOS2DPdPtr) -= here->MOS2drainConductance;
*(here->MOS2DPgPtr) += (xnrm-xrev)*here->MOS2gm;
*(here->MOS2DPbPtr) += -here->MOS2gbd+(xnrm-xrev)*here->MOS2gmbs;
*(here->MOS2DPspPtr) -= here->MOS2gds+
xnrm*(here->MOS2gm+here->MOS2gmbs);
*(here->MOS2SPgPtr) -= (xnrm-xrev)*here->MOS2gm;
*(here->MOS2SPsPtr) -= here->MOS2sourceConductance;
*(here->MOS2SPbPtr) -= here->MOS2gbs+(xnrm-xrev)*here->MOS2gmbs;
*(here->MOS2SPdpPtr) -= here->MOS2gds+
xrev*(here->MOS2gm+here->MOS2gmbs);
}
}
return(OK);
}