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.
 
 
 
 
 
 

501 lines
18 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1995 Colin McAndrew Motorola
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH
**********/
/*
* This routine sets model parameters for
* VBICs in the circuit.
*/
#include "ngspice/ngspice.h"
#include "ngspice/const.h"
#include "ngspice/ifsim.h"
#include "vbicdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
VBICmParam(int param, IFvalue *value, GENmodel *inModel)
{
VBICmodel *mods = (VBICmodel*)inModel;
switch(param) {
case VBIC_MOD_NPN:
if(value->iValue) {
mods->VBICtype = NPN;
}
break;
case VBIC_MOD_PNP:
if(value->iValue) {
mods->VBICtype = PNP;
}
break;
case VBIC_MOD_TNOM:
mods->VBICtnom = value->rValue;
mods->VBICtnomGiven = TRUE;
break;
case VBIC_MOD_RCX:
mods->VBICextCollResist = value->rValue;
if (mods->VBICextCollResist < 0.01) mods->VBICextCollResist = 0.01;
mods->VBICextCollResistGiven = TRUE;
break;
case VBIC_MOD_RCI:
mods->VBICintCollResist = value->rValue;
if (mods->VBICintCollResist < 0.01) mods->VBICintCollResist = 0.01;
mods->VBICintCollResistGiven = TRUE;
break;
case VBIC_MOD_VO:
mods->VBICepiSatVoltage = value->rValue;
mods->VBICepiSatVoltageGiven = TRUE;
break;
case VBIC_MOD_GAMM:
mods->VBICepiDoping = value->rValue;
mods->VBICepiDopingGiven = TRUE;
break;
case VBIC_MOD_HRCF:
mods->VBIChighCurFac = value->rValue;
mods->VBIChighCurFacGiven = TRUE;
break;
case VBIC_MOD_RBX:
mods->VBICextBaseResist = value->rValue;
if (mods->VBICextBaseResist < 0.01) mods->VBICextBaseResist = 0.01;
mods->VBICextBaseResistGiven = TRUE;
break;
case VBIC_MOD_RBI:
mods->VBICintBaseResist = value->rValue;
if (mods->VBICintBaseResist < 0.01) mods->VBICintBaseResist = 0.01;
mods->VBICintBaseResistGiven = TRUE;
break;
case VBIC_MOD_RE:
mods->VBICemitterResist = value->rValue;
if (mods->VBICemitterResist < 0.01) mods->VBICemitterResist = 0.01;
mods->VBICemitterResistGiven = TRUE;
break;
case VBIC_MOD_RS:
mods->VBICsubstrateResist = value->rValue;
if (mods->VBICsubstrateResist < 0.01) mods->VBICsubstrateResist = 0.01;
mods->VBICsubstrateResistGiven = TRUE;
break;
case VBIC_MOD_RBP:
mods->VBICparBaseResist = value->rValue;
if (mods->VBICparBaseResist < 0.01) mods->VBICparBaseResist = 0.01;
mods->VBICparBaseResistGiven = TRUE;
break;
case VBIC_MOD_IS:
mods->VBICsatCur = value->rValue;
mods->VBICsatCurGiven = TRUE;
break;
case VBIC_MOD_NF:
mods->VBICemissionCoeffF = value->rValue;
mods->VBICemissionCoeffFGiven = TRUE;
break;
case VBIC_MOD_NR:
mods->VBICemissionCoeffR = value->rValue;
mods->VBICemissionCoeffRGiven = TRUE;
break;
case VBIC_MOD_FC:
mods->VBICdeplCapLimitF = value->rValue;
mods->VBICdeplCapLimitFGiven = TRUE;
break;
case VBIC_MOD_CBEO:
mods->VBICextOverlapCapBE = value->rValue;
mods->VBICextOverlapCapBEGiven=TRUE;
break;
case VBIC_MOD_CJE:
mods->VBICdepletionCapBE = value->rValue;
mods->VBICdepletionCapBEGiven = TRUE;
break;
case VBIC_MOD_PE:
mods->VBICpotentialBE = value->rValue;
mods->VBICpotentialBEGiven = TRUE;
break;
case VBIC_MOD_ME:
mods->VBICjunctionExpBE = value->rValue;
mods->VBICjunctionExpBEGiven = TRUE;
break;
case VBIC_MOD_AJE:
mods->VBICsmoothCapBE = value->rValue;
mods->VBICsmoothCapBEGiven = TRUE;
break;
case VBIC_MOD_CBCO:
mods->VBICextOverlapCapBC = value->rValue;
mods->VBICextOverlapCapBCGiven=TRUE;
break;
case VBIC_MOD_CJC:
mods->VBICdepletionCapBC = value->rValue;
mods->VBICdepletionCapBCGiven = TRUE;
break;
case VBIC_MOD_QCO:
mods->VBICepiCharge = value->rValue;
mods->VBICepiChargeGiven = TRUE;
break;
case VBIC_MOD_CJEP:
mods->VBICextCapBC = value->rValue;
mods->VBICextCapBCGiven = TRUE;
break;
case VBIC_MOD_PC:
mods->VBICpotentialBC = value->rValue;
mods->VBICpotentialBCGiven = TRUE;
break;
case VBIC_MOD_MC:
mods->VBICjunctionExpBC = value->rValue;
mods->VBICjunctionExpBCGiven = TRUE;
break;
case VBIC_MOD_AJC:
mods->VBICsmoothCapBC = value->rValue;
mods->VBICsmoothCapBCGiven = TRUE;
break;
case VBIC_MOD_CJCP:
mods->VBICextCapSC = value->rValue;
mods->VBICextCapSCGiven = TRUE;
break;
case VBIC_MOD_PS:
mods->VBICpotentialSC = value->rValue;
mods->VBICpotentialSCGiven = TRUE;
break;
case VBIC_MOD_MS:
mods->VBICjunctionExpSC = value->rValue;
mods->VBICjunctionExpSCGiven = TRUE;
break;
case VBIC_MOD_AJS:
mods->VBICsmoothCapSC = value->rValue;
mods->VBICsmoothCapSCGiven = TRUE;
break;
case VBIC_MOD_IBEI:
mods->VBICidealSatCurBE = value->rValue;
mods->VBICidealSatCurBEGiven = TRUE;
break;
case VBIC_MOD_WBE:
mods->VBICportionIBEI = value->rValue;
mods->VBICportionIBEIGiven = TRUE;
break;
case VBIC_MOD_NEI:
mods->VBICidealEmissCoeffBE = value->rValue;
mods->VBICidealEmissCoeffBEGiven = TRUE;
break;
case VBIC_MOD_IBEN:
mods->VBICnidealSatCurBE = value->rValue;
mods->VBICnidealSatCurBEGiven = TRUE;
break;
case VBIC_MOD_NEN:
mods->VBICnidealEmissCoeffBE = value->rValue;
mods->VBICnidealEmissCoeffBEGiven = TRUE;
break;
case VBIC_MOD_IBCI:
mods->VBICidealSatCurBC = value->rValue;
mods->VBICidealSatCurBCGiven = TRUE;
break;
case VBIC_MOD_NCI:
mods->VBICidealEmissCoeffBC = value->rValue;
mods->VBICidealEmissCoeffBCGiven = TRUE;
break;
case VBIC_MOD_IBCN:
mods->VBICnidealSatCurBC = value->rValue;
mods->VBICnidealSatCurBCGiven = TRUE;
break;
case VBIC_MOD_NCN:
mods->VBICnidealEmissCoeffBC = value->rValue;
mods->VBICnidealEmissCoeffBCGiven = TRUE;
break;
case VBIC_MOD_AVC1:
mods->VBICavalanchePar1BC = value->rValue;
mods->VBICavalanchePar1BCGiven = TRUE;
break;
case VBIC_MOD_AVC2:
mods->VBICavalanchePar2BC = value->rValue;
mods->VBICavalanchePar2BCGiven = TRUE;
break;
case VBIC_MOD_ISP:
mods->VBICparasitSatCur = value->rValue;
mods->VBICparasitSatCurGiven = TRUE;
break;
case VBIC_MOD_WSP:
mods->VBICportionICCP = value->rValue;
mods->VBICportionICCPGiven = TRUE;
break;
case VBIC_MOD_NFP:
mods->VBICparasitFwdEmissCoeff = value->rValue;
mods->VBICparasitFwdEmissCoeffGiven = TRUE;
break;
case VBIC_MOD_IBEIP:
mods->VBICidealParasitSatCurBE = value->rValue;
mods->VBICidealParasitSatCurBEGiven = TRUE;
break;
case VBIC_MOD_IBENP:
mods->VBICnidealParasitSatCurBE = value->rValue;
mods->VBICnidealParasitSatCurBEGiven = TRUE;
break;
case VBIC_MOD_IBCIP:
mods->VBICidealParasitSatCurBC = value->rValue;
mods->VBICidealParasitSatCurBCGiven = TRUE;
break;
case VBIC_MOD_NCIP:
mods->VBICidealParasitEmissCoeffBC = value->rValue;
mods->VBICidealParasitEmissCoeffBCGiven = TRUE;
break;
case VBIC_MOD_IBCNP:
mods->VBICnidealParasitSatCurBC = value->rValue;
mods->VBICnidealParasitSatCurBCGiven = TRUE;
break;
case VBIC_MOD_NCNP:
mods->VBICnidealParasitEmissCoeffBC = value->rValue;
mods->VBICnidealParasitEmissCoeffBCGiven = TRUE;
break;
case VBIC_MOD_VEF:
mods->VBICearlyVoltF = value->rValue;
mods->VBICearlyVoltFGiven = TRUE;
break;
case VBIC_MOD_VER:
mods->VBICearlyVoltR = value->rValue;
mods->VBICearlyVoltRGiven = TRUE;
break;
case VBIC_MOD_IKF:
mods->VBICrollOffF = value->rValue;
mods->VBICrollOffFGiven = TRUE;
break;
case VBIC_MOD_IKR:
mods->VBICrollOffR = value->rValue;
mods->VBICrollOffRGiven = TRUE;
break;
case VBIC_MOD_IKP:
mods->VBICparRollOff = value->rValue;
mods->VBICparRollOffGiven = TRUE;
break;
case VBIC_MOD_TF:
mods->VBICtransitTimeF = value->rValue;
mods->VBICtransitTimeFGiven = TRUE;
break;
case VBIC_MOD_QTF:
mods->VBICvarTransitTimeF = value->rValue;
mods->VBICvarTransitTimeFGiven = TRUE;
break;
case VBIC_MOD_XTF:
mods->VBICtransitTimeBiasCoeffF = value->rValue;
mods->VBICtransitTimeBiasCoeffFGiven = TRUE;
break;
case VBIC_MOD_VTF:
mods->VBICtransitTimeFVBC = value->rValue;
mods->VBICtransitTimeFVBCGiven = TRUE;
break;
case VBIC_MOD_ITF:
mods->VBICtransitTimeHighCurrentF = value->rValue;
mods->VBICtransitTimeHighCurrentFGiven = TRUE;
break;
case VBIC_MOD_TR:
mods->VBICtransitTimeR = value->rValue;
mods->VBICtransitTimeRGiven = TRUE;
break;
case VBIC_MOD_TD:
mods->VBICdelayTimeF = value->rValue;
mods->VBICdelayTimeFGiven = TRUE;
break;
case VBIC_MOD_KFN:
mods->VBICfNcoef = value->rValue;
mods->VBICfNcoefGiven = TRUE;
break;
case VBIC_MOD_AFN:
mods->VBICfNexpA = value->rValue;
mods->VBICfNexpAGiven = TRUE;
break;
case VBIC_MOD_BFN:
mods->VBICfNexpB = value->rValue;
mods->VBICfNexpBGiven = TRUE;
break;
case VBIC_MOD_XRE:
mods->VBICtempExpRE = value->rValue;
mods->VBICtempExpREGiven = TRUE;
break;
case VBIC_MOD_XRB:
mods->VBICtempExpRB = value->rValue;
mods->VBICtempExpRBGiven = TRUE;
break;
case VBIC_MOD_XRBI:
mods->VBICtempExpRBI = value->rValue;
mods->VBICtempExpRBIGiven = TRUE;
break;
case VBIC_MOD_XRC:
mods->VBICtempExpRC = value->rValue;
mods->VBICtempExpRCGiven = TRUE;
break;
case VBIC_MOD_XRCI:
mods->VBICtempExpRCI = value->rValue;
mods->VBICtempExpRCIGiven = TRUE;
break;
case VBIC_MOD_XRS:
mods->VBICtempExpRS = value->rValue;
mods->VBICtempExpRSGiven = TRUE;
break;
case VBIC_MOD_XVO:
mods->VBICtempExpVO = value->rValue;
mods->VBICtempExpVOGiven = TRUE;
break;
case VBIC_MOD_EA:
mods->VBICactivEnergyEA = value->rValue;
mods->VBICactivEnergyEAGiven = TRUE;
break;
case VBIC_MOD_EAIE:
mods->VBICactivEnergyEAIE = value->rValue;
mods->VBICactivEnergyEAIEGiven = TRUE;
break;
case VBIC_MOD_EAIC:
mods->VBICactivEnergyEAIC = value->rValue;
mods->VBICactivEnergyEAICGiven = TRUE;
break;
case VBIC_MOD_EAIS:
mods->VBICactivEnergyEAIS = value->rValue;
mods->VBICactivEnergyEAISGiven = TRUE;
break;
case VBIC_MOD_EANE:
mods->VBICactivEnergyEANE = value->rValue;
mods->VBICactivEnergyEANEGiven = TRUE;
break;
case VBIC_MOD_EANC:
mods->VBICactivEnergyEANC = value->rValue;
mods->VBICactivEnergyEANCGiven = TRUE;
break;
case VBIC_MOD_EANS:
mods->VBICactivEnergyEANS = value->rValue;
mods->VBICactivEnergyEANSGiven = TRUE;
break;
case VBIC_MOD_XIS:
mods->VBICtempExpIS = value->rValue;
mods->VBICtempExpISGiven = TRUE;
break;
case VBIC_MOD_XII:
mods->VBICtempExpII = value->rValue;
mods->VBICtempExpIIGiven = TRUE;
break;
case VBIC_MOD_XIN:
mods->VBICtempExpIN = value->rValue;
mods->VBICtempExpINGiven = TRUE;
break;
case VBIC_MOD_TNF:
mods->VBICtempExpNF = value->rValue;
mods->VBICtempExpNFGiven = TRUE;
break;
case VBIC_MOD_TAVC:
mods->VBICtempExpAVC = value->rValue;
mods->VBICtempExpAVCGiven = TRUE;
break;
case VBIC_MOD_RTH:
mods->VBICthermalResist = value->rValue;
mods->VBICthermalResistGiven = TRUE;
break;
case VBIC_MOD_CTH:
mods->VBICthermalCapacitance = value->rValue;
mods->VBICthermalCapacitanceGiven = TRUE;
break;
case VBIC_MOD_VRT:
mods->VBICpunchThroughVoltageBC = value->rValue;
mods->VBICpunchThroughVoltageBCGiven = TRUE;
break;
case VBIC_MOD_ART:
mods->VBICdeplCapCoeff1 = value->rValue;
mods->VBICdeplCapCoeff1Given = TRUE;
break;
case VBIC_MOD_CCSO:
mods->VBICfixedCapacitanceCS = value->rValue;
mods->VBICfixedCapacitanceCSGiven = TRUE;
break;
case VBIC_MOD_QBM:
mods->VBICsgpQBselector = value->rValue;
mods->VBICsgpQBselectorGiven = TRUE;
break;
case VBIC_MOD_NKF:
mods->VBIChighCurrentBetaRolloff = value->rValue;
mods->VBIChighCurrentBetaRolloffGiven = TRUE;
break;
case VBIC_MOD_XIKF:
mods->VBICtempExpIKF = value->rValue;
mods->VBICtempExpIKFGiven = TRUE;
break;
case VBIC_MOD_XRCX:
mods->VBICtempExpRCX = value->rValue;
mods->VBICtempExpRCXGiven = TRUE;
break;
case VBIC_MOD_XRBX:
mods->VBICtempExpRBX = value->rValue;
mods->VBICtempExpRBXGiven = TRUE;
break;
case VBIC_MOD_XRBP:
mods->VBICtempExpRBP = value->rValue;
mods->VBICtempExpRBPGiven = TRUE;
break;
case VBIC_MOD_ISRR:
mods->VBICsepISRR = value->rValue;
mods->VBICsepISRRGiven = TRUE;
break;
case VBIC_MOD_XISR:
mods->VBICtempExpXISR = value->rValue;
mods->VBICtempExpXISRGiven = TRUE;
break;
case VBIC_MOD_DEAR:
mods->VBICdear = value->rValue;
mods->VBICdearGiven = TRUE;
break;
case VBIC_MOD_EAP:
mods->VBICeap = value->rValue;
mods->VBICeapGiven = TRUE;
break;
case VBIC_MOD_VBBE:
mods->VBICvbbe = value->rValue;
mods->VBICvbbeGiven = TRUE;
break;
case VBIC_MOD_NBBE:
mods->VBICnbbe = value->rValue;
mods->VBICnbbeGiven = TRUE;
break;
case VBIC_MOD_IBBE:
mods->VBICibbe = value->rValue;
mods->VBICibbeGiven = TRUE;
break;
case VBIC_MOD_TVBBE1:
mods->VBICtvbbe1 = value->rValue;
mods->VBICtvbbe1Given = TRUE;
break;
case VBIC_MOD_TVBBE2:
mods->VBICtvbbe2 = value->rValue;
mods->VBICtvbbe2Given = TRUE;
break;
case VBIC_MOD_TNBBE:
mods->VBICtnbbe = value->rValue;
mods->VBICtnbbeGiven = TRUE;
break;
case VBIC_MOD_EBBE:
mods->VBICebbe = value->rValue;
mods->VBICebbeGiven = TRUE;
break;
case VBIC_MOD_DTEMP:
mods->VBIClocTempDiff = value->rValue;
mods->VBIClocTempDiffGiven = TRUE;
break;
case VBIC_MOD_VERS:
mods->VBICrevVersion = value->rValue;
mods->VBICrevVersionGiven = TRUE;
break;
case VBIC_MOD_VREF:
mods->VBICrefVersion = value->rValue;
mods->VBICrefVersionGiven = TRUE;
break;
case VBIC_MOD_VBE_MAX:
mods->VBICvbeMax = value->rValue;
mods->VBICvbeMaxGiven = TRUE;
break;
case VBIC_MOD_VBC_MAX:
mods->VBICvbcMax = value->rValue;
mods->VBICvbcMaxGiven = TRUE;
break;
case VBIC_MOD_VCE_MAX:
mods->VBICvceMax = value->rValue;
mods->VBICvceMaxGiven = TRUE;
break;
default:
return(E_BADPARM);
}
return(OK);
}