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.
77 lines
2.3 KiB
77 lines
2.3 KiB
/**********
|
|
Copyright 1992 Regents of the University of California. All rights reserved.
|
|
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group
|
|
**********/
|
|
|
|
/*
|
|
* Function to load the COMPLEX circuit matrix using the small signal
|
|
* parameters saved during a previous DC operating point analysis.
|
|
*/
|
|
|
|
#include "ngspice.h"
|
|
#include "cktdefs.h"
|
|
#include "numddefs.h"
|
|
#include "sperror.h"
|
|
#include "complex.h"
|
|
#include "../../../ciderlib/oned/onedext.h"
|
|
#include "cidersupt.h"
|
|
#include "numglobs.h"
|
|
#include "suffix.h"
|
|
|
|
/* External Declarations */
|
|
extern int ONEacDebug;
|
|
|
|
int
|
|
NUMDacLoad(inModel, ckt)
|
|
GENmodel *inModel;
|
|
CKTcircuit *ckt;
|
|
{
|
|
register NUMDmodel *model = (NUMDmodel *) inModel;
|
|
register NUMDinstance *inst;
|
|
SPcomplex y;
|
|
double startTime;
|
|
|
|
/* loop through all the diode models */
|
|
for (; model != NULL; model = model->NUMDnextModel) {
|
|
FieldDepMobility = model->NUMDmodels->MODLfieldDepMobility;
|
|
Srh = model->NUMDmodels->MODLsrh;
|
|
Auger = model->NUMDmodels->MODLauger;
|
|
AvalancheGen = model->NUMDmodels->MODLavalancheGen;
|
|
AcAnalysisMethod = model->NUMDmethods->METHacAnalysisMethod;
|
|
MobDeriv = model->NUMDmethods->METHmobDeriv;
|
|
ONEacDebug = model->NUMDoutputs->OUTPacDebug;
|
|
|
|
for (inst = model->NUMDinstances; inst != NULL;
|
|
inst = inst->NUMDnextInstance) {
|
|
if (inst->NUMDowner != ARCHme) continue;
|
|
|
|
startTime = SPfrontEnd->IFseconds();
|
|
/* Get Temp.-Dep. Global Parameters */
|
|
GLOBgetGlobals(&(inst->NUMDglobals));
|
|
|
|
model->NUMDmethods->METHacAnalysisMethod =
|
|
NUMDadmittance(inst->NUMDpDevice,
|
|
ckt->CKTomega, &y);
|
|
|
|
*(inst->NUMDposPosPtr) += y.real;
|
|
*(inst->NUMDposPosPtr + 1) += y.imag;
|
|
*(inst->NUMDnegNegPtr) += y.real;
|
|
*(inst->NUMDnegNegPtr + 1) += y.imag;
|
|
*(inst->NUMDnegPosPtr) -= y.real;
|
|
*(inst->NUMDnegPosPtr + 1) -= y.imag;
|
|
*(inst->NUMDposNegPtr) -= y.real;
|
|
*(inst->NUMDposNegPtr + 1) -= y.imag;
|
|
if (ckt->CKTomega != 0.0) {
|
|
inst->NUMDc11 = y.imag / ckt->CKTomega;
|
|
} else {
|
|
inst->NUMDc11 = 0.0; /* XXX What else can be done?! */
|
|
}
|
|
inst->NUMDy11r = y.real;
|
|
inst->NUMDy11i = y.imag;
|
|
inst->NUMDsmSigAvail = TRUE;
|
|
inst->NUMDpDevice->pStats->totalTime[STAT_AC] +=
|
|
SPfrontEnd->IFseconds() - startTime;
|
|
}
|
|
}
|
|
return (OK);
|
|
}
|