Initial HICUM2 integration

This commit is contained in:
dwarning 2020-01-05 15:01:20 +01:00
parent 420ca90e55
commit 7d160f659e
21 changed files with 7405 additions and 0 deletions

View File

@ -0,0 +1,32 @@
## Process this file with automake to produce Makefile.in
noinst_LTLIBRARIES = libhicum.la
libhicum_la_SOURCES = \
hicum.c \
hicumacld.c \
hicumask.c \
hicumconv.c \
hicumdefs.h \
hicumext.h \
hicumgetic.c \
hicuminit.c \
hicuminit.h \
hicumitf.h \
hicumload.c \
hicummask.c \
hicummpar.c \
hicumnoise.c \
hicumparam.c \
hicumpzld.c \
hicumsetup.c \
hicumsoachk.c \
hicumtemp.c \
hicumtrunc.c
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
AM_CFLAGS = $(STATIC)
MAINTAINERCLEANFILES = Makefile.in

View File

@ -0,0 +1,259 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* This file defines the HICUM data structures that are
* available to the next level(s) up the calling hierarchy
*/
#include "ngspice/ngspice.h"
#include "ngspice/devdefs.h"
#include "hicumdefs.h"
#include "ngspice/suffix.h"
IFparm HICUMpTable[] = { /* parameters */
IOPU("area", HICUM_AREA, IF_REAL, "Area factor"),
IOPU("off", HICUM_OFF, IF_FLAG, "Device initially off"),
IP("ic", HICUM_IC, IF_REALVEC, "Initial condition vector"),
IOPAU("icvbe", HICUM_IC_VBE, IF_REAL, "Initial B-E voltage"),
IOPAU("icvce", HICUM_IC_VCE, IF_REAL, "Initial C-E voltage"),
IOPU("temp", HICUM_TEMP, IF_REAL, "Instance temperature"),
IOPU("dtemp", HICUM_DTEMP, IF_REAL, "Instance delta temperature"),
IOPU("m", HICUM_M, IF_REAL, "Multiplier"),
OPU("collnode", HICUM_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"),
OPU("basenode", HICUM_QUEST_BASENODE, IF_INTEGER, "Number of base node"),
OPU("emitnode", HICUM_QUEST_EMITNODE, IF_INTEGER, "Number of emitter node"),
OPU("subsnode", HICUM_QUEST_SUBSNODE, IF_INTEGER, "Number of substrate node"),
OPU("collCInode", HICUM_QUEST_COLLCINODE, IF_INTEGER, "Internal collector node"),
OPU("baseBPnode", HICUM_QUEST_BASEBPNODE, IF_INTEGER, "Internal base node"),
OPU("baseBInode", HICUM_QUEST_BASEBINODE, IF_INTEGER, "Internal base node"),
OPU("emitEInode", HICUM_QUEST_EMITEINODE, IF_INTEGER, "Internal emitter node"),
OPU("subsSInode", HICUM_QUEST_SUBSSINODE, IF_INTEGER, "Internal substrate node"),
// OPU("xfnode", HICUM_QUEST_XFNODE, IF_INTEGER, "Internal phase node xf"),
// OPU("xf1node", HICUM_QUEST_XF1NODE, IF_INTEGER, "Internal phase node xf1"),
// OPU("xf2node", HICUM_QUEST_XF2NODE, IF_INTEGER, "Internal phase node xf2"),
OP("vbe", HICUM_QUEST_VBE, IF_REAL, "B-E voltage"),
OP("vbc", HICUM_QUEST_VBC, IF_REAL, "B-C voltage"),
OP("ic", HICUM_QUEST_CC, IF_REAL, "Collector current"),
OP("ib", HICUM_QUEST_CB, IF_REAL, "Base current"),
OP("ie", HICUM_QUEST_CE, IF_REAL, "Emitter current"),
OP("is", HICUM_QUEST_CS, IF_REAL, "Substrate current"),
OP("gm", HICUM_QUEST_GM, IF_REAL, "Small signal transconductance dIc/dVbe"),
OP("go", HICUM_QUEST_GO, IF_REAL, "Small signal output conductance dIc/dVbc"),
OP("gpi", HICUM_QUEST_GPI, IF_REAL, "Small signal input conductance dIb/dVbe"),
OP("gmu", HICUM_QUEST_GMU, IF_REAL, "Small signal conductance dIb/dVbc"),
OP("gx", HICUM_QUEST_GX, IF_REAL, "Conductance from base to internal base"),
OP("cbe", HICUM_QUEST_CJBE, IF_REAL, "Internal base to emitter capacitance"),
OP("cbex", HICUM_QUEST_CBEX, IF_REAL, "External base to emitter capacitance"),
OP("cbep", HICUM_QUEST_CBEP, IF_REAL, "Parasitic Base to emitter capacitance"),
OP("cbc", HICUM_QUEST_CJBC, IF_REAL, "Internal base to collector capacitance"),
OP("cbcp", HICUM_QUEST_CBCXII,IF_REAL, "Parasitic Base to collector capacitance"),
OPU("geqcb", HICUM_QUEST_GEQCB, IF_REAL, "Internal C-B-base cap. equiv. cond."),
OPU("qbe", HICUM_QUEST_QBE, IF_REAL, "Charge storage B-E junction"),
OPU("cqbe", HICUM_QUEST_CQBE, IF_REAL, "Cap. due to charge storage in B-E jct."),
OPU("qbc", HICUM_QUEST_QBC, IF_REAL, "Charge storage B-C junction"),
OPU("cqbc", HICUM_QUEST_CQBC, IF_REAL, "Cap. due to charge storage in B-C jct."),
OPU("qbx", HICUM_QUEST_QBX, IF_REAL, "Charge storage B-X junction"),
OPU("cqbx", HICUM_QUEST_CQBX, IF_REAL, "Cap. due to charge storage in B-X jct."),
OP("p", HICUM_QUEST_POWER, IF_REAL, "Power dissipation")
};
IFparm HICUMmPTable[] = { /* model parameters */
//Circuit simulator specific parameters
IOP("type", HICUM_MOD_TYPE, IF_STRING, "For transistor type NPN(+1) or PNP (-1)"),
IOPU("npn", HICUM_MOD_NPN, IF_FLAG, "NPN type device"),
IOPU("pnp", HICUM_MOD_PNP, IF_FLAG, "PNP type device"),
IOP("tnom", HICUM_MOD_TNOM, IF_REAL, "Temperature at which parameters are specified"),
//Transfer current
IOP("c10", HICUM_MOD_C10 , IF_REAL, "GICCR constant"),
IOP("qp0", HICUM_MOD_QP0 , IF_REAL, "Zero-bias hole charge"),
IOP("ich", HICUM_MOD_ICH , IF_REAL, "High-current correction for 2D and 3D effects"), //`0' signifies infinity
IOP("hf0", HICUM_MOD_HF0 , IF_REAL, "Weight factor for the low current minority charge"),
IOP("hfe", HICUM_MOD_HFE , IF_REAL, "Emitter minority charge weighting factor in HBTs"),
IOP("hfc", HICUM_MOD_HFC , IF_REAL, "Collector minority charge weighting factor in HBTs"),
IOP("hjei", HICUM_MOD_HJEI , IF_REAL, "B-E depletion charge weighting factor in HBTs"),
IOP("ahjei", HICUM_MOD_AHJEI, IF_REAL, "Parameter describing the slope of hjEi(VBE)"),
IOP("rhjei", HICUM_MOD_RHJEI, IF_REAL, "Smoothing parameter for hjEi(VBE) at high voltage"),
IOP("hjci", HICUM_MOD_HJCI , IF_REAL, "B-C depletion charge weighting factor in HBTs"),
//Base-Emitter diode currents
IOP("ibeis", HICUM_MOD_IBEIS, IF_REAL, "Internal B-E saturation current"),
IOP("mbei", HICUM_MOD_MBEI , IF_REAL, "Internal B-E current ideality factor"),
IOP("ireis", HICUM_MOD_IREIS, IF_REAL, "Internal B-E recombination saturation current"),
IOP("mrei", HICUM_MOD_MREI , IF_REAL, "Internal B-E recombination current ideality factor"),
IOP("ibeps", HICUM_MOD_IBEPS, IF_REAL, "Peripheral B-E saturation current"),
IOP("mbep", HICUM_MOD_MBEP , IF_REAL, "Peripheral B-E current ideality factor"),
IOP("ireps", HICUM_MOD_IREPS, IF_REAL, "Peripheral B-E recombination saturation current"),
IOP("mrep", HICUM_MOD_MREP , IF_REAL, "Peripheral B-E recombination current ideality factor"),
IOP("mcf", HICUM_MOD_MCF , IF_REAL, "Non-ideality factor for III-V HBTs"),
//Transit time for excess recombination current at b-c barrier
IOP("tbhrec", HICUM_MOD_TBHREC, IF_REAL, "Base current recombination time constant at B-C barrier for high forward injection"),
//Base-Collector diode currents
IOP("ibcis", HICUM_MOD_IBCIS, IF_REAL, "Internal B-C saturation current"),
IOP("mbci", HICUM_MOD_MBCI , IF_REAL, "Internal B-C current ideality factor"),
IOP("ibcxs", HICUM_MOD_IBCXS, IF_REAL, "External B-C saturation current"),
IOP("mbcx", HICUM_MOD_MBCX , IF_REAL, "External B-C current ideality factor"),
//Base-Emitter tunneling current
IOP("ibets", HICUM_MOD_IBETS, IF_REAL, "B-E tunneling saturation current"),
IOP("abet", HICUM_MOD_ABET, IF_REAL, "Exponent factor for tunneling current"),
IOP("tunode",HICUM_MOD_TUNODE, IF_INTEGER, "Specifies the base node connection for the tunneling current"), // =1 signifies perimeter node
//Base-Collector avalanche current
IOP("favl", HICUM_MOD_FAVL , IF_REAL, "Avalanche current factor"),
IOP("qavl", HICUM_MOD_QAVL , IF_REAL, "Exponent factor for avalanche current"),
IOP("alfav", HICUM_MOD_ALFAV, IF_REAL, "Relative TC for FAVL"),
IOP("alqav", HICUM_MOD_ALQAV, IF_REAL, "Relative TC for QAVL"),
//Series resistances
IOP("rbi0", HICUM_MOD_RBI0 , IF_REAL, "Zero bias internal base resistance"),
IOP("rbx", HICUM_MOD_RBX , IF_REAL, "External base series resistance"),
IOP("fgeo", HICUM_MOD_FGEO , IF_REAL, "Factor for geometry dependence of emitter current crowding"),
IOP("fdqr0", HICUM_MOD_FDQR0, IF_REAL, "Correction factor for modulation by B-E and B-C space charge layer"),
IOP("fcrbi", HICUM_MOD_FCRBI, IF_REAL, "Ratio of HF shunt to total internal capacitance (lateral NQS effect)"),
IOP("fqi", HICUM_MOD_FQI , IF_REAL, "Ration of internal to total minority charge"),
IOP("re", HICUM_MOD_RE , IF_REAL, "Emitter series resistance"),
IOP("rcx", HICUM_MOD_RCX , IF_REAL, "External collector series resistance"),
//Substrate transistor
IOP("itss", HICUM_MOD_ITSS, IF_REAL, "Substrate transistor transfer saturation current"),
IOP("msf", HICUM_MOD_MSF , IF_REAL, "Forward ideality factor of substrate transfer current"),
IOP("iscs", HICUM_MOD_ISCS, IF_REAL, "C-S diode saturation current"),
IOP("msc", HICUM_MOD_MSC , IF_REAL, "Ideality factor of C-S diode current"),
IOP("tsf", HICUM_MOD_TSF , IF_REAL, "Transit time for forward operation of substrate transistor"),
//Intra-device substrate coupling
IOP("rsu", HICUM_MOD_RSU, IF_REAL, "Substrate series resistance"),
IOP("csu", HICUM_MOD_CSU, IF_REAL, "Substrate shunt capacitance"),
//Depletion Capacitances
IOP("cjei0", HICUM_MOD_CJEI0 , IF_REAL, "Internal B-E zero-bias depletion capacitance"),
IOP("vdei", HICUM_MOD_VDEI , IF_REAL, "Internal B-E built-in potential"),
IOP("zei", HICUM_MOD_ZEI , IF_REAL, "Internal B-E grading coefficient"),
IOP("ajei", HICUM_MOD_AJEI , IF_REAL, "Ratio of maximum to zero-bias value of internal B-E capacitance"),
IOP("cjep0", HICUM_MOD_CJEP0 , IF_REAL, "Peripheral B-E zero-bias depletion capacitance"),
IOP("vdep", HICUM_MOD_VDEP , IF_REAL, "Peripheral B-E built-in potential"),
IOP("zep", HICUM_MOD_ZEP , IF_REAL, "Peripheral B-E grading coefficient"),
IOP("ajep", HICUM_MOD_AJEP , IF_REAL, "Ratio of maximum to zero-bias value of peripheral B-E capacitance"),
IOP("cjci0", HICUM_MOD_CJCI0 , IF_REAL, "Internal B-C zero-bias depletion capacitance"),
IOP("vdci", HICUM_MOD_VDCI , IF_REAL, "Internal B-C built-in potential"),
IOP("zci", HICUM_MOD_ZCI , IF_REAL, "Internal B-C grading coefficient"),
IOP("vptci", HICUM_MOD_VPTCI , IF_REAL, "Internal B-C punch-through voltage"),
IOP("cjcx0", HICUM_MOD_CJCX0 , IF_REAL, "External B-C zero-bias depletion capacitance"),
IOP("vdcx", HICUM_MOD_VDCX , IF_REAL, "External B-C built-in potential"),
IOP("zcx", HICUM_MOD_ZCX , IF_REAL, "External B-C grading coefficient"),
IOP("vptcx", HICUM_MOD_VPTCX , IF_REAL, "External B-C punch-through voltage"),
IOP("fbcpar", HICUM_MOD_FBCPAR, IF_REAL, "Partitioning factor of parasitic B-C cap"),
IOP("fbepar", HICUM_MOD_FBEPAR, IF_REAL, "Partitioning factor of parasitic B-E cap"),
IOP("cjs0", HICUM_MOD_CJS0 , IF_REAL, "C-S zero-bias depletion capacitance"),
IOP("vds", HICUM_MOD_VDS , IF_REAL, "C-S built-in potential"),
IOP("zs", HICUM_MOD_ZS , IF_REAL, "C-S grading coefficient"),
IOP("vpts", HICUM_MOD_VPTS , IF_REAL, "C-S punch-through voltage"),
IOP("cscp0", HICUM_MOD_CSCP0 , IF_REAL, "Perimeter S-C zero-bias depletion capacitance"),
IOP("vdsp", HICUM_MOD_VDSP , IF_REAL, "Perimeter S-C built-in potential"),
IOP("zsp", HICUM_MOD_ZSP , IF_REAL, "Perimeter S-C grading coefficient"),
IOP("vptsp", HICUM_MOD_VPTSP , IF_REAL, "Perimeter S-C punch-through voltage"),
//Diffusion Capacitances
IOP("t0", HICUM_MOD_T0 , IF_REAL, "Low current forward transit time at VBC=0V"),
IOP("dt0h", HICUM_MOD_DT0H , IF_REAL, "Time constant for base and B-C space charge layer width modulation"),
IOP("tbvl", HICUM_MOD_TBVL , IF_REAL, "Time constant for modeling carrier jam at low VCE"),
IOP("tef0", HICUM_MOD_TEF0 , IF_REAL, "Neutral emitter storage time"),
IOP("gtfe", HICUM_MOD_GTFE , IF_REAL, "Exponent factor for current dependence of neutral emitter storage time"),
IOP("thcs", HICUM_MOD_THCS , IF_REAL, "Saturation time constant at high current densities"),
IOP("ahc", HICUM_MOD_AHC , IF_REAL, "Smoothing factor for current dependence of base and collector transit time"),
IOP("fthc", HICUM_MOD_FTHC , IF_REAL, "Partitioning factor for base and collector portion"),
IOP("rci0", HICUM_MOD_RCI0 , IF_REAL, "Internal collector resistance at low electric field"),
IOP("vlim", HICUM_MOD_VLIM , IF_REAL, "Voltage separating ohmic and saturation velocity regime"),
IOP("vces", HICUM_MOD_VCES , IF_REAL, "Internal C-E saturation voltage"),
IOP("vpt", HICUM_MOD_VPT , IF_REAL, "Collector punch-through voltage"), // `0' signifies infinity
IOP("aick", HICUM_MOD_AICK , IF_REAL, "Smoothing term for ICK"),
IOP("delck", HICUM_MOD_DELCK, IF_REAL, "Fitting factor for critical current"),
IOP("tr", HICUM_MOD_TR , IF_REAL, "Storage time for inverse operation"),
IOP("vcbar", HICUM_MOD_VCBAR, IF_REAL, "Barrier voltage"),
IOP("icbar", HICUM_MOD_ICBAR, IF_REAL, "Normalization parameter"),
IOP("acbar", HICUM_MOD_ACBAR, IF_REAL, "Smoothing parameter for barrier voltage"),
//Isolation Capacitances
IOP("cbepar", HICUM_MOD_CBEPAR, IF_REAL, "Total parasitic B-E capacitance"),
IOP("cbcpar", HICUM_MOD_CBCPAR, IF_REAL, "Total parasitic B-C capacitance"),
//Non-quasi-static Effect
IOP("alqf", HICUM_MOD_ALQF, IF_REAL, "Factor for additional delay time of minority charge"),
IOP("alit", HICUM_MOD_ALIT, IF_REAL, "Factor for additional delay time of transfer current"),
IOP("flnqs", HICUM_MOD_FLNQS, IF_INTEGER, "Flag for turning on and off of vertical NQS effect"),
//Noise
IOP("kf", HICUM_MOD_KF , IF_REAL, "Flicker noise coefficient"),
IOP("af", HICUM_MOD_AF , IF_REAL, "Flicker noise exponent factor"),
IOP("cfbe", HICUM_MOD_CFBE , IF_INTEGER, "Flag for determining where to tag the flicker noise source"),
IOP("flcono", HICUM_MOD_FLCONO, IF_INTEGER, "Flag for turning on and off of correlated noise implementation"),
IOP("kfre", HICUM_MOD_KFRE , IF_REAL, "Emitter resistance flicker noise coefficient"),
IOP("afre", HICUM_MOD_AFRE , IF_REAL, "Emitter resistance flicker noise exponent factor"),
//Lateral Geometry Scaling (at high current densities)
IOP("latb", HICUM_MOD_LATB, IF_REAL, "Scaling factor for collector minority charge in direction of emitter width"),
IOP("latl", HICUM_MOD_LATL, IF_REAL, "Scaling factor for collector minority charge in direction of emitter length"),
//Temperature dependence
IOP("vgb", HICUM_MOD_VGB , IF_REAL, "Bandgap voltage extrapolated to 0 K"),
IOP("alt0", HICUM_MOD_ALT0 , IF_REAL, "First order relative TC of parameter T0"),
IOP("kt0", HICUM_MOD_KT0 , IF_REAL, "Second order relative TC of parameter T0"),
IOP("zetaci", HICUM_MOD_ZETACI , IF_REAL, "Temperature exponent for RCI0"),
IOP("alvs", HICUM_MOD_ALVS , IF_REAL, "Relative TC of saturation drift velocity"),
IOP("alces", HICUM_MOD_ALCES , IF_REAL, "Relative TC of VCES"),
IOP("zetarbi", HICUM_MOD_ZETARBI , IF_REAL, "Temperature exponent of internal base resistance"),
IOP("zetarbx", HICUM_MOD_ZETARBX , IF_REAL, "Temperature exponent of external base resistance"),
IOP("zetarcx", HICUM_MOD_ZETARCX , IF_REAL, "Temperature exponent of external collector resistance"),
IOP("zetare", HICUM_MOD_ZETARE , IF_REAL, "Temperature exponent of emitter resistance"),
IOP("zetacx", HICUM_MOD_ZETACX , IF_REAL, "Temperature exponent of mobility in substrate transistor transit time"),
IOP("vge", HICUM_MOD_VGE , IF_REAL, "Effective emitter bandgap voltage"),
IOP("vgc", HICUM_MOD_VGC , IF_REAL, "Effective collector bandgap voltage"),
IOP("vgs", HICUM_MOD_VGS , IF_REAL, "Effective substrate bandgap voltage"),
IOP("f1vg", HICUM_MOD_F1VG , IF_REAL, "Coefficient K1 in T-dependent band-gap equation"),
IOP("f2vg", HICUM_MOD_F2VG , IF_REAL, "Coefficient K2 in T-dependent band-gap equation"),
IOP("zetact", HICUM_MOD_ZETACT , IF_REAL, "Exponent coefficient in transfer current temperature dependence"),
IOP("zetabet", HICUM_MOD_ZETABET , IF_REAL, "Exponent coefficient in B-E junction current temperature dependence"),
IOP("alb", HICUM_MOD_ALB , IF_REAL, "Relative TC of forward current gain for V2.1 model"),
IOP("dvgbe", HICUM_MOD_DVGBE , IF_REAL, "Bandgap difference between B and B-E junction used for hjEi0 and hf0"),
IOP("zetahjei", HICUM_MOD_ZETAHJEI, IF_REAL, "Temperature coefficient for ahjEi"),
IOP("zetavgbe", HICUM_MOD_ZETAVGBE, IF_REAL, "Temperature coefficient for hjEi0"),
//Self-Heating
IOP("flsh", HICUM_MOD_FLSH , IF_INTEGER, "Flag for turning on and off self-heating effect"),
IOP("rth", HICUM_MOD_RTH , IF_REAL, "Thermal resistance"),
IOP("zetarth", HICUM_MOD_ZETARTH, IF_REAL, "Temperature coefficient for Rth"),
IOP("alrth", HICUM_MOD_ALRTH , IF_REAL, "First order relative TC of parameter Rth"),
IOP("cth", HICUM_MOD_CTH , IF_REAL, "Thermal capacitance"),
//Compatibility with V2.1
IOP("flcomp", HICUM_MOD_FLCOMP, IF_REAL, "Flag for compatibility with v2.1 model (0=v2.1)"),
IOP("vbe_max", HICUM_MOD_VBE_MAX, IF_REAL, "maximum voltage B-E junction"),
IOP("vbc_max", HICUM_MOD_VBC_MAX, IF_REAL, "maximum voltage B-C junction"),
IOP("vce_max", HICUM_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch")
};
char *HICUMnames[] = {
"collector",
"base",
"emitter",
"substrate",
"temp"
};
int HICUMnSize = NUMELEMS(HICUMnames);
int HICUMpTSize = NUMELEMS(HICUMpTable);
int HICUMmPTSize = NUMELEMS(HICUMmPTable);
int HICUMiSize = sizeof(HICUMinstance);
int HICUMmSize = sizeof(HICUMmodel);

View File

@ -0,0 +1,320 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* Function to load the COMPLEX circuit matrix using the
* small signal parameters saved during a previous DC operating
* point analysis.
*/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "hicumdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
{
HICUMinstance *here;
HICUMmodel *model = (HICUMmodel*)inModel;
double Ibpei_Vbpei;
double Ibiei_Vbiei;
double Ibici_Vbici;
double Ibpci_Vbpci;
double Isici_Vsici;
double Iciei_Vbiei;
double Iciei_Vbici;
double Ibbp_Vbbp;
double Isis_Vsis;
double Ieie_Veie;
double Ibpbi_Vbpbi, Ibpbi_Vciei, Ibpbi_Vbiei;
double Ibpsi_Vbpci, Ibpsi_Vsici;
double Icic_Vcic;
double XQrbi_Vbpbi;
// double XQrbi_Vbiei;
// double XQrbi_Vbici;
double XQdeix_Vbiei;
double XQjei_Vbiei;
double XQdci_Vbici;
double XQjci_Vbici;
double XQjep_Vbpei;
double Xqjcx0_t_i_Vbci;
double Xqjcx0_t_ii_Vbpci;
double XQdsu_Vbpci;
// double XQdsu_Vsici;
double XQjs_Vsici;
double XQscp_Vsc;
double XQbepar1_Vbe;
double XQbepar2_Vbpe;
double XQbcpar1_Vbci;
double XQbcpar2_Vbpci;
double XQsu_Vsis;
/* loop through all the models */
for( ; model != NULL; model = HICUMnextModel(model)) {
/* loop through all the instances of the model */
for( here = HICUMinstances(model); here!= NULL;
here = HICUMnextInstance(here)) {
Ibbp_Vbbp = 1/here->HICUMrbx_t;
Icic_Vcic = 1/here->HICUMrcx_t;
Ieie_Veie = 1/here->HICUMre_t;
Isis_Vsis = 1/model->HICUMrsu;
Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei);
Ibpei_Vbpei = *(ckt->CKTstate0 + here->HICUMibpei_Vbpei);
Iciei_Vbiei = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei);
Iciei_Vbici = *(ckt->CKTstate0 + here->HICUMiciei_Vbici);
Ibici_Vbici = *(ckt->CKTstate0 + here->HICUMibici_Vbici);
Ibpbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi);
Ibpbi_Vbiei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei);
Ibpbi_Vciei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbici);
Isici_Vsici = *(ckt->CKTstate0 + here->HICUMisici_Vsici);
Ibpsi_Vbpci = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci);
Ibpsi_Vsici = *(ckt->CKTstate0 + here->HICUMibpsi_Vsici);
Ibpci_Vbpci = *(ckt->CKTstate0 + here->HICUMibpci_Vbpci);
/*
c The real part
*/
/*
c Stamp element: Ibiei
*/
*(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbiei;
*(here->HICUMbaseBIEmitEIPtr) += -Ibiei_Vbiei;
*(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbiei;
*(here->HICUMemitEIEmitEIPtr) += Ibiei_Vbiei;
/*
c Stamp element: Ibpei
*/
*(here->HICUMbaseBPBaseBPPtr) += Ibpei_Vbpei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpei_Vbpei;
*(here->HICUMemitEIBaseBPPtr) += -Ibpei_Vbpei;
*(here->HICUMemitEIEmitEIPtr) += Ibpei_Vbpei;
/*
c Stamp element: Iciei
*/
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbiei;
*(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei;
*(here->HICUMemitEIEmitEIPtr) += Iciei_Vbiei;
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici;
*(here->HICUMcollCICollCIPtr) += -Iciei_Vbici;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici;
*(here->HICUMemitEICollCIPtr) += Iciei_Vbici;
/*
c Stamp element: Ibici
*/
*(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici;
*(here->HICUMbaseBICollCIPtr) += -Ibici_Vbici;
*(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbici;
*(here->HICUMcollCICollCIPtr) += Ibici_Vbici;
/*
c Stamp element: Ibpci
*/
*(here->HICUMbaseBPCollCIPtr) += Ibpci_Vbpci;
*(here->HICUMbaseBPBaseBPPtr) += -Ibpci_Vbpci;
*(here->HICUMcollCIBaseBPPtr) += -Ibpci_Vbpci;
*(here->HICUMcollCICollCIPtr) += Ibpci_Vbpci;
/*
c Stamp element: Rcx
*/
*(here->HICUMcollCollPtr) += Icic_Vcic;
*(here->HICUMcollCICollPtr) += -Icic_Vcic;
*(here->HICUMcollCollCIPtr) += -Icic_Vcic;
*(here->HICUMcollCICollCIPtr) += Icic_Vcic;
/*
c Stamp element: Rbx
*/
*(here->HICUMbaseBasePtr) += Ibbp_Vbbp;
*(here->HICUMbaseBPBasePtr) += -Ibbp_Vbbp;
*(here->HICUMbaseBaseBPPtr) += -Ibbp_Vbbp;
*(here->HICUMbaseBPBaseBPPtr) += Ibbp_Vbbp;
/*
c Stamp element: Ibpbi
*/
*(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi;
*(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi;
*(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei;
*(here->HICUMbaseBPCollCIPtr) += Ibpbi_Vciei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vciei;
*(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi;
*(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi;
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei;
*(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei;
*(here->HICUMbaseBICollCIPtr) += -Ibpbi_Vciei;
*(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vciei;
/*
c Stamp element: Re
*/
*(here->HICUMemitEmitPtr) += Ieie_Veie;
*(here->HICUMemitEIEmitPtr) += -Ieie_Veie;
*(here->HICUMemitEmitEIPtr) += -Ieie_Veie;
*(here->HICUMemitEIEmitEIPtr) += Ieie_Veie;
/*
c Stamp element: Isici
*/
*(here->HICUMsubsSISubsSIPtr) += Isici_Vsici;
*(here->HICUMsubsSICollCIPtr) += -Isici_Vsici;
*(here->HICUMcollCISubsSIPtr) += -Isici_Vsici;
*(here->HICUMcollCICollCIPtr) += Isici_Vsici;
/*
c Stamp element: Ibpsi
*/
*(here->HICUMbaseBPBaseBPPtr) += Ibpsi_Vbpci;
*(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vbpci;
*(here->HICUMbaseBPSubsSIPtr) += Ibpsi_Vsici;
*(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vsici;
*(here->HICUMsubsSIBaseBPPtr) += -Ibpsi_Vbpci;
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vbpci;
*(here->HICUMsubsSISubsSIPtr) += -Ibpsi_Vsici;
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vsici;
/*
c Stamp element: Rs
*/
*(here->HICUMsubsSubsPtr) += Isis_Vsis;
*(here->HICUMsubsSISubsPtr) += -Isis_Vsis;
*(here->HICUMsubsSubsSIPtr) += -Isis_Vsis;
*(here->HICUMsubsSISubsSIPtr) += Isis_Vsis;
/*
c The complex part
*/
//todo: Complete with partial dervatives e.g. Qjs_Vsici, Qrbi_Vbici
XQrbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMcqrbi) * ckt->CKTomega;
XQdeix_Vbiei = *(ckt->CKTstate0 + here->HICUMcqdeix) * ckt->CKTomega;
XQjei_Vbiei = *(ckt->CKTstate0 + here->HICUMcqjei) * ckt->CKTomega;
XQdci_Vbici = *(ckt->CKTstate0 + here->HICUMcqdci) * ckt->CKTomega;
XQjci_Vbici = *(ckt->CKTstate0 + here->HICUMcqjci) * ckt->CKTomega;
XQjep_Vbpei = *(ckt->CKTstate0 + here->HICUMcqjep) * ckt->CKTomega;
Xqjcx0_t_i_Vbci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_i) * ckt->CKTomega;
Xqjcx0_t_ii_Vbpci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii) * ckt->CKTomega;
XQdsu_Vbpci = *(ckt->CKTstate0 + here->HICUMcqdsu) * ckt->CKTomega;
XQjs_Vsici = *(ckt->CKTstate0 + here->HICUMcqjs) * ckt->CKTomega;
XQscp_Vsc = *(ckt->CKTstate0 + here->HICUMcqscp) * ckt->CKTomega;
XQbepar1_Vbe = *(ckt->CKTstate0 + here->HICUMcqbepar1) * ckt->CKTomega;
XQbepar2_Vbpe = *(ckt->CKTstate0 + here->HICUMcqbepar2) * ckt->CKTomega;
XQbcpar1_Vbci = *(ckt->CKTstate0 + here->HICUMcqbcpar1) * ckt->CKTomega;
XQbcpar2_Vbpci = *(ckt->CKTstate0 + here->HICUMcqbcpar2) * ckt->CKTomega;
XQsu_Vsis = *(ckt->CKTstate0 + here->HICUMcqsu) * ckt->CKTomega;
/*
c Stamp element: Qbepar1
*/
*(here->HICUMbaseBasePtr + 1) += XQbepar1_Vbe;
*(here->HICUMbaseEmitPtr + 1) += -XQbepar1_Vbe;
*(here->HICUMemitBasePtr + 1) += -XQbepar1_Vbe;
*(here->HICUMemitEmitPtr + 1) += XQbepar1_Vbe;
/*
c Stamp element: Qbepar2
*/
*(here->HICUMbaseBPBaseBPPtr + 1) += XQbepar2_Vbpe;
*(here->HICUMemitBaseBPPtr + 1) += -XQbepar2_Vbpe;
*(here->HICUMemitEmitPtr + 1) += -XQbepar2_Vbpe;
*(here->HICUMbaseBPEmitPtr + 1) += XQbepar2_Vbpe;
/*
c Stamp element: Qdeix, Qjei
*/
*(here->HICUMbaseBIBaseBIPtr + 1) += XQdeix_Vbiei;
*(here->HICUMbaseBIEmitEIPtr + 1) += -XQdeix_Vbiei;
*(here->HICUMemitEIBaseBIPtr + 1) += -XQdeix_Vbiei;
*(here->HICUMemitEIEmitEIPtr + 1) += XQdeix_Vbiei;
*(here->HICUMbaseBIBaseBIPtr + 1) += XQjei_Vbiei;
*(here->HICUMbaseBIEmitEIPtr + 1) += -XQjei_Vbiei;
*(here->HICUMemitEIBaseBIPtr + 1) += -XQjei_Vbiei;
*(here->HICUMemitEIEmitEIPtr + 1) += XQjei_Vbiei;
/*
c Stamp element: Qjep
*/
*(here->HICUMbaseBPBaseBPPtr + 1) += XQjep_Vbpei;
*(here->HICUMbaseBPEmitEIPtr + 1) += -XQjep_Vbpei;
*(here->HICUMemitEIBaseBPPtr + 1) += -XQjep_Vbpei;
*(here->HICUMemitEIEmitEIPtr + 1) += XQjep_Vbpei;
/*
c Stamp element: Qdci, Qjci
*/
*(here->HICUMbaseBIBaseBIPtr + 1) += XQdci_Vbici;
*(here->HICUMbaseBICollCIPtr + 1) += -XQdci_Vbici;
*(here->HICUMcollCIBaseBIPtr + 1) += -XQdci_Vbici;
*(here->HICUMcollCICollCIPtr + 1) += XQdci_Vbici;
*(here->HICUMbaseBIBaseBIPtr + 1) += XQjci_Vbici;
*(here->HICUMbaseBICollCIPtr + 1) += -XQjci_Vbici;
*(here->HICUMcollCIBaseBIPtr + 1) += -XQjci_Vbici;
*(here->HICUMcollCICollCIPtr + 1) += XQjci_Vbici;
/*
c Stamp element: Qbcpar1, qjcx0_i
*/
*(here->HICUMbaseBasePtr + 1) += XQbcpar1_Vbci;
*(here->HICUMbaseCollCIPtr + 1) += -XQbcpar1_Vbci;
*(here->HICUMcollCIBasePtr + 1) += -XQbcpar1_Vbci;
*(here->HICUMcollCICollCIPtr + 1) += XQbcpar1_Vbci;
*(here->HICUMbaseBasePtr + 1) += Xqjcx0_t_i_Vbci;
*(here->HICUMbaseCollCIPtr + 1) += -Xqjcx0_t_i_Vbci;
*(here->HICUMcollCIBasePtr + 1) += -Xqjcx0_t_i_Vbci;
*(here->HICUMcollCICollCIPtr + 1) += Xqjcx0_t_i_Vbci;
/*
c Stamp element: Qbcpar2, qjcx0_ii, Qdsu
*/
*(here->HICUMbaseBPBaseBPPtr + 1) += XQbcpar2_Vbpci;
*(here->HICUMcollCICollCIPtr + 1) += XQbcpar2_Vbpci;
*(here->HICUMbaseBPCollCIPtr + 1) += -XQbcpar2_Vbpci;
*(here->HICUMcollCIBaseBPPtr + 1) += -XQbcpar2_Vbpci;
*(here->HICUMbaseBPCollCIPtr + 1) += Xqjcx0_t_ii_Vbpci;
*(here->HICUMbaseBPBaseBPPtr + 1) += -Xqjcx0_t_ii_Vbpci;
*(here->HICUMcollCIBaseBPPtr + 1) += -Xqjcx0_t_ii_Vbpci;
*(here->HICUMcollCICollCIPtr + 1) += Xqjcx0_t_ii_Vbpci;
*(here->HICUMbaseBPCollCIPtr + 1) += XQdsu_Vbpci;
*(here->HICUMbaseBPBaseBPPtr + 1) += -XQdsu_Vbpci;
*(here->HICUMcollCIBaseBPPtr + 1) += -XQdsu_Vbpci;
*(here->HICUMcollCICollCIPtr + 1) += XQdsu_Vbpci;
/*
c Stamp element: Qrbi
*/
*(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi;
*(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi;
*(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi;
*(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi;
//todo:
// *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei;
// *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei;
// *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei;
// *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei;
// *(here->HICUMbaseBPCollCIPtr + 1) += XQrbi_Vbici;
// *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbici;
// *(here->HICUMbaseBICollCIPtr + 1) += -XQrbi_Vbici;
// *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbici;
/*
c Stamp element: Cscp
*/
*(here->HICUMsubsSubsPtr + 1) += XQscp_Vsc;
*(here->HICUMcollSubsPtr + 1) += -XQscp_Vsc;
*(here->HICUMcollCollPtr + 1) += -XQscp_Vsc;
*(here->HICUMsubsCollPtr + 1) += XQscp_Vsc;
/*
c Stamp element: Cjs
*/
*(here->HICUMsubsSISubsSIPtr + 1) += XQjs_Vsici;
*(here->HICUMsubsSICollCIPtr + 1) += -XQjs_Vsici;
*(here->HICUMcollCISubsSIPtr + 1) += -XQjs_Vsici;
*(here->HICUMcollCICollCIPtr + 1) += XQjs_Vsici;
/*
c Stamp element: Csu
*/
*(here->HICUMsubsSubsPtr + 1) += XQsu_Vsis;
*(here->HICUMsubsSISubsPtr + 1) += -XQsu_Vsis;
*(here->HICUMsubsSubsSIPtr + 1) += -XQsu_Vsis;
*(here->HICUMsubsSISubsSIPtr + 1) += XQsu_Vsis;
}
}
return(OK);
}

View File

@ -0,0 +1,155 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Mathew Lew and Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* This routine gives access to the internal device
* parameters for HICUMs
*/
#include "ngspice/ngspice.h"
#include "ngspice/const.h"
#include "ngspice/cktdefs.h"
#include "hicumdefs.h"
#include "ngspice/ifsim.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
/*ARGSUSED*/
int
HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select)
{
HICUMinstance *here = (HICUMinstance*)instPtr;
NG_IGNORE(select);
switch(which) {
case HICUM_AREA:
value->rValue = here->HICUMarea;
return(OK);
case HICUM_OFF:
value->iValue = here->HICUMoff;
return(OK);
case HICUM_IC_VBE:
value->rValue = here->HICUMicVBE;
return(OK);
case HICUM_IC_VCE:
value->rValue = here->HICUMicVCE;
return(OK);
case HICUM_TEMP:
value->rValue = here->HICUMtemp - CONSTCtoK;
return(OK);
case HICUM_M:
value->rValue = here->HICUMm;
return(OK);
case HICUM_QUEST_COLLNODE:
value->iValue = here->HICUMcollNode;
return(OK);
case HICUM_QUEST_BASENODE:
value->iValue = here->HICUMbaseNode;
return(OK);
case HICUM_QUEST_EMITNODE:
value->iValue = here->HICUMemitNode;
return(OK);
case HICUM_QUEST_SUBSNODE:
value->iValue = here->HICUMsubsNode;
return(OK);
case HICUM_QUEST_COLLCINODE:
value->iValue = here->HICUMcollCINode;
return(OK);
case HICUM_QUEST_BASEBPNODE:
value->iValue = here->HICUMbaseBPNode;
return(OK);
case HICUM_QUEST_BASEBINODE:
value->iValue = here->HICUMbaseBINode;
return(OK);
case HICUM_QUEST_EMITEINODE:
value->iValue = here->HICUMemitEINode;
return(OK);
case HICUM_QUEST_SUBSSINODE:
value->iValue = here->HICUMsubsSINode;
return(OK);
case HICUM_QUEST_VBE:
value->rValue = *(ckt->CKTstate0 + here->HICUMvbiei);
return(OK);
case HICUM_QUEST_VBC:
value->rValue = *(ckt->CKTstate0 + here->HICUMvbici);
return(OK);
case HICUM_QUEST_CC:
value->rValue = *(ckt->CKTstate0 + here->HICUMiciei) -
*(ckt->CKTstate0 + here->HICUMibici);
return(OK);
case HICUM_QUEST_CB:
value->rValue = *(ckt->CKTstate0 + here->HICUMibiei) +
*(ckt->CKTstate0 + here->HICUMibici) +
*(ckt->CKTstate0 + here->HICUMibpci) +
*(ckt->CKTstate0 + here->HICUMibpsi);
return(OK);
case HICUM_QUEST_CE:
value->rValue = - *(ckt->CKTstate0 + here->HICUMibiei) -
*(ckt->CKTstate0 + here->HICUMibpei) -
*(ckt->CKTstate0 + here->HICUMiciei);
return(OK);
case HICUM_QUEST_CS:
value->rValue = *(ckt->CKTstate0 + here->HICUMisici) -
*(ckt->CKTstate0 + here->HICUMibpsi);
return(OK);
case HICUM_QUEST_GM:
value->rValue = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei);
return(OK);
case HICUM_QUEST_GO:
value->rValue = *(ckt->CKTstate0 + here->HICUMiciei_Vbici);
return(OK);
case HICUM_QUEST_GPI:
value->rValue = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei);
return(OK);
case HICUM_QUEST_GMU:
value->rValue = *(ckt->CKTstate0 + here->HICUMibici_Vbici);
return(OK);
case HICUM_QUEST_GX:
value->rValue = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi);
return(OK);
case HICUM_QUEST_CJBE:
value->rValue = here->HICUMcapjei;
return(OK);
case HICUM_QUEST_CDBE:
value->rValue = here->HICUMcapdeix;
return(OK);
case HICUM_QUEST_CBEP:
value->rValue = here->HICUMcapjep;
return(OK);
case HICUM_QUEST_CJBC:
value->rValue = here->HICUMcapjci;
return(OK);
case HICUM_QUEST_CBCXI:
value->rValue = here->HICUMcapjcx_t_i;
return(OK);
case HICUM_QUEST_CBCXII:
value->rValue = here->HICUMcapjcx_t_ii;
return(OK);
case HICUM_QUEST_CSCP:
value->rValue = here->HICUMcapscp;
return(OK);
case HICUM_QUEST_QBE:
value->rValue = *(ckt->CKTstate0 + here->HICUMqjei);
return(OK);
case HICUM_QUEST_QBC:
value->rValue = *(ckt->CKTstate0 + here->HICUMqjci);
return(OK);
case HICUM_QUEST_POWER:
value->rValue = fabs(*(ckt->CKTstate0 + here->HICUMiciei)) * fabs(*(ckt->CKTstate0 + here->HICUMvbiei) - *(ckt->CKTstate0 + here->HICUMvbici)) +
fabs(*(ckt->CKTstate0 + here->HICUMibiei) * *(ckt->CKTstate0 + here->HICUMvbiei)) +
fabs(*(ckt->CKTstate0 + here->HICUMibpei) * *(ckt->CKTstate0 + here->HICUMvbpei)) +
fabs(*(ckt->CKTstate0 + here->HICUMibici) * *(ckt->CKTstate0 + here->HICUMvbici)) +
fabs(*(ckt->CKTstate0 + here->HICUMibpci) * *(ckt->CKTstate0 + here->HICUMvbpci)) +
fabs(*(ckt->CKTstate0 + here->HICUMibpsi) * *(ckt->CKTstate0 + here->HICUMvsici));
return(OK);
default:
return(E_BADPARM);
}
/* NOTREACHED */
}

View File

@ -0,0 +1,166 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* This routine performs the device convergence test for
* HICUMs in the circuit.
*/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "hicumdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
HICUMconvTest(GENmodel *inModel, CKTcircuit *ckt)
{
HICUMinstance *here;
HICUMmodel *model = (HICUMmodel *) inModel;
double tol;
double delvbiei;
double delvbici;
double delvbpei;
double delvbpbi;
double delvbpci;
double delvsici;
double ibieihat;
double ibicihat;
double icieihat;
double ibpeihat;
double ibpbihat;
double ibpcihat;
double ibpsihat;
double isicihat;
double Vbiei, Vbici, Vciei, Vbpei, Vbpbi, Vbpci, Vbci, Vsici;
double Ibiei, Ibici, Iciei, Ibpei, Ibpbi, Ibpci, Ibpsi, Isici;
for( ; model != NULL; model = HICUMnextModel(model)) {
for(here=HICUMinstances(model);here!=NULL;here = HICUMnextInstance(here)) {
Vbci = model->HICUMtype*(
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
*(ckt->CKTrhsOld+here->HICUMcollCINode));
Vbiei= model->HICUMtype*(
*(ckt->CKTrhsOld+here->HICUMbaseBINode)-
*(ckt->CKTrhsOld+here->HICUMemitEINode));
Vbici = model->HICUMtype*(
*(ckt->CKTrhsOld+here->HICUMbaseBINode)-
*(ckt->CKTrhsOld+here->HICUMcollCINode));
Vbpei = model->HICUMtype*(
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
*(ckt->CKTrhsOld+here->HICUMemitEINode));
Vbpbi = model->HICUMtype*(
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
*(ckt->CKTrhsOld+here->HICUMbaseBINode));
Vbpci = model->HICUMtype*(
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
*(ckt->CKTrhsOld+here->HICUMcollCINode));
Vsici = model->HICUMtype*(
*(ckt->CKTrhsOld+here->HICUMsubsSINode)-
*(ckt->CKTrhsOld+here->HICUMcollCINode));
Vciei = Vbiei - Vbici;
delvbiei = Vbiei - *(ckt->CKTstate0 + here->HICUMvbiei);
delvbici = Vbici - *(ckt->CKTstate0 + here->HICUMvbici);
delvbpei = Vbpei - *(ckt->CKTstate0 + here->HICUMvbpei);
delvbpbi = Vbpbi - *(ckt->CKTstate0 + here->HICUMvbpbi);
delvbpci = Vbpci - *(ckt->CKTstate0 + here->HICUMvbpci);
delvsici = Vsici - *(ckt->CKTstate0 + here->HICUMvsici);
ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) +
*(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei;
ibicihat = *(ckt->CKTstate0 + here->HICUMibici) +
*(ckt->CKTstate0 + here->HICUMibici_Vbici)*delvbici;
icieihat = *(ckt->CKTstate0 + here->HICUMiciei) +
*(ckt->CKTstate0 + here->HICUMiciei_Vbiei)*delvbiei +
*(ckt->CKTstate0 + here->HICUMiciei_Vbici)*delvbici;
ibpeihat = *(ckt->CKTstate0 + here->HICUMibpei) +
*(ckt->CKTstate0 + here->HICUMibpei_Vbpei)*delvbpei;
ibpbihat = *(ckt->CKTstate0 + here->HICUMibpbi) +
*(ckt->CKTstate0 + here->HICUMibpbi_Vbiei)*delvbiei +
*(ckt->CKTstate0 + here->HICUMibpbi_Vbici)*delvbici;
ibpcihat = *(ckt->CKTstate0 + here->HICUMibpci) +
*(ckt->CKTstate0 + here->HICUMibpci_Vbpci)*delvbici;
ibpsihat = *(ckt->CKTstate0 + here->HICUMibpsi) +
*(ckt->CKTstate0 + here->HICUMibpsi_Vbpci)*delvbpci +
*(ckt->CKTstate0 + here->HICUMibpsi_Vsici)*delvsici;
isicihat = *(ckt->CKTstate0 + here->HICUMisici) +
*(ckt->CKTstate0 + here->HICUMisici_Vsici)*delvsici;
Ibiei = *(ckt->CKTstate0 + here->HICUMibiei);
Ibici = *(ckt->CKTstate0 + here->HICUMibici);
Iciei = *(ckt->CKTstate0 + here->HICUMiciei);
Ibpei = *(ckt->CKTstate0 + here->HICUMibpei);
Ibpbi = *(ckt->CKTstate0 + here->HICUMibpbi);
Ibpci = *(ckt->CKTstate0 + here->HICUMibpci);
Ibpsi = *(ckt->CKTstate0 + here->HICUMibpsi);
Isici = *(ckt->CKTstate0 + here->HICUMisici);
/*
* check convergence
*/
tol=ckt->CKTreltol*MAX(fabs(ibieihat),fabs(Ibiei))+ckt->CKTabstol;
if (fabs(ibieihat-Ibiei) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(ibicihat),fabs(Ibici))+ckt->CKTabstol;
if (fabs(ibicihat-Ibici) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(icieihat),fabs(Iciei))+ckt->CKTabstol;
if (fabs(icieihat-Iciei) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(ibpeihat),fabs(Ibpei))+ckt->CKTabstol;
if (fabs(ibpeihat-Ibpei) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(ibpbihat),fabs(Ibpbi))+ckt->CKTabstol;
if (fabs(ibpbihat-Ibpbi) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(ibpcihat),fabs(Ibpci))+ckt->CKTabstol;
if (fabs(ibpcihat-Ibpci) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(ibpsihat),fabs(Ibpsi))+ckt->CKTabstol;
if (fabs(ibpsihat-Ibpsi) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
} else {
tol=ckt->CKTreltol*MAX(fabs(isicihat),fabs(Isici))+ckt->CKTabstol;
if (fabs(isicihat-Isici) > tol) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
return(OK); /* no reason to continue - we've failed... */
}
}
}
}
}
}
}
}
}
}
return(OK);
}

View File

@ -0,0 +1,994 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
#ifndef HICUM
#define HICUM
#include "ngspice/cktdefs.h"
#include "ngspice/ifsim.h"
#include "ngspice/gendefs.h"
#include "ngspice/complex.h"
#include "ngspice/noisedef.h"
/* structures to describe Bipolar Junction Transistors */
/* indices to array of HICUM noise sources */
enum {
HICUMRCNOIZ = 0,
HICUMRBNOIZ,
HICUMRBINOIZ,
HICUMRENOIZ,
HICUMRSNOIZ,
HICUMICNOIZ,
HICUMIBCNOIZ,
HICUMIBEPNOIZ,
HICUMIBCXNOIZ,
HICUMITSNOIZ,
HICUMFLBENOIZ,
HICUMFLRENOIZ,
HICUMTOTNOIZ,
/* finally, the number of noise sources */
HICUMNSRCS
};
/* data needed to describe a single instance */
typedef struct sHICUMinstance {
struct GENinstance gen;
#define HICUMmodPtr(inst) ((struct sHICUMmodel *)((inst)->gen.GENmodPtr))
#define HICUMnextInstance(inst) ((struct sHICUMinstance *)((inst)->gen.GENnextInstance))
#define HICUMname gen.GENname
#define HICUMstate gen.GENstate
const int HICUMcollNode; /* number of collector node of hicum */
const int HICUMbaseNode; /* number of base node of hicum */
const int HICUMemitNode; /* number of emitter node of hicum */
const int HICUMsubsNode; /* number of substrate node of hicum */
const int HICUMtempNode; /* number of the temperature node of the hicum */
int HICUMcollCINode; /* number of internal collector node of hicum */
int HICUMbaseBINode; /* number of internal base node of hicum */
int HICUMemitEINode; /* number of internal emitter node of hicum */
int HICUMbaseBPNode; /* number of internal base node of hicum */
int HICUMsubsSINode; /* number of internal substrate node */
int HICUMxfNode; /* number of internal excess phase node */
int HICUMxf1Node; /* number of internal excess phase node */
int HICUMxf2Node; /* number of internal excess phase node */
double HICUMarea; /* area factor for the hicum */
double HICUMicVBE; /* initial condition voltage B-E */
double HICUMicVCE; /* initial condition voltage C-E */
double HICUMtemp; /* instance temperature */
double HICUMdtemp; /* instance delta temperature */
double HICUMm; /* multiply factor for the hicum */
double HICUMmg;
double HICUMvt0;
double HICUMvt;
double HICUMdT;
double HICUMqtt0;
double HICUMln_qtt0;
double HICUMibeis_t;
double HICUMireis_t;
double HICUMibeps_t;
double HICUMireps_t;
double HICUMibcis_t;
double HICUMibcxs_t;
double HICUMitss_t;
double HICUMiscs_t;
double HICUMqp0_t;
double HICUMvlim_t;
double HICUMtef0_t;
double HICUMc10_t;
double HICUMrci0_t;
double HICUMvces_t;
double HICUMt0_t;
double HICUMthcs_t;
double HICUMfavl_t;
double HICUMqavl_t;
double HICUMrbi0_t;
double HICUMibets_t;
double HICUMabet_t;
double HICUMcjcx01_t;
double HICUMcjcx02_t;
double HICUMrcx_t;
double HICUMrbx_t;
double HICUMre_t;
double HICUMtsf_t;
double HICUMcscp0_t;
double HICUMvdsp_t;
double HICUMvptsp_t;
double HICUMahjei_t;
double HICUMhjei0_t;
double HICUMhf0_t;
double HICUMhfc_t;
double HICUMhfe_t;
double HICUMrth_t;
double HICUMvdei_t;
double HICUMajei_t;
double HICUMcjci0_t;
double HICUMvdci_t;
double HICUMvptci_t;
double HICUMvdep_t;
double HICUMajep_t;
double HICUMcjep0_t;
double HICUMcjei0_t;
double HICUMvdcx_t;
double HICUMvptcx_t;
double HICUMcjs0_t;
double HICUMvds_t;
double HICUMvpts_t;
double *HICUMcollCollPtr; /* pointer to sparse matrix at
* (collector,collector) */
double *HICUMbaseBasePtr; /* pointer to sparse matrix at
* (base,base) */
double *HICUMemitEmitPtr; /* pointer to sparse matrix at
* (emitter,emitter) */
double *HICUMsubsSubsPtr; /* pointer to sparse matrix at
* (substrate,substrate) */
double *HICUMcollCICollCIPtr; /* pointer to sparse matrix at
* (collector prime,collector prime) */
double *HICUMbaseBIBaseBIPtr; /* pointer to sparse matrix at
* (collector prime,collector prime) */
double *HICUMbaseBPBaseBPPtr; /* pointer to sparse matrix at
* (collector prime,collector prime) */
double *HICUMemitEIEmitEIPtr; /* pointer to sparse matrix at
* (emitter prime,emitter prime) */
double *HICUMsubsSISubsSIPtr; /* pointer to sparse matrix at
* (substrate prime, substrate prime) */
double *HICUMbaseEmitPtr; /* pointer to sparse matrix at
* (base,emit) */
double *HICUMemitBasePtr; /* pointer to sparse matrix at
* (emit,base) */
double *HICUMcollCollCIPtr; /* pointer to sparse matrix at
* (collector,collector prime) */
double *HICUMbaseBaseBPPtr; /* pointer to sparse matrix at
* (base,base prime) */
double *HICUMemitEmitEIPtr; /* pointer to sparse matrix at
* (emitter,emitter prime) */
double *HICUMsubsSubsSIPtr; /* pointer to sparse matrix at
* (substrate, Substrate connection) */
double *HICUMcollCIBaseBIPtr; /* pointer to sparse matrix at
* (collector prime,base) */
double *HICUMcollCIEmitEIPtr; /* pointer to sparse matrix at
* (collector prime,emitter prime) */
double *HICUMbaseBPBaseBIPtr; /* pointer to sparse matrix at
* (base prime,emitter prime) */
double *HICUMbaseBPEmitEIPtr; /* pointer to sparse matrix at
* (base prime,emitter prime) */
double *HICUMbaseBPSubsSIPtr; /* pointer to sparse matrix at
* (base prime,emitter prime) */
double *HICUMbaseBIEmitEIPtr; /* pointer to sparse matrix at
* (base prime,emitter prime) */
double *HICUMcollCICollPtr; /* pointer to sparse matrix at
* (collector prime,collector) */
double *HICUMbaseBPBasePtr; /* pointer to sparse matrix at
* (base prime,base ) */
double *HICUMemitEIEmitPtr; /* pointer to sparse matrix at
* (emitter prime,emitter) */
double *HICUMsubsSISubsPtr; /* pointer to sparse matrix at
* (Substrate connection, substrate) */
double *HICUMbaseBPCollCIPtr; /* pointer to sparse matrix at
* (base,collector prime) */
double *HICUMcollCIBaseBPPtr; /* pointer to sparse matrix at
* (collector prime,base) */
double *HICUMbaseBICollCIPtr; /* pointer to sparse matrix at
* (base,collector prime) */
double *HICUMemitEICollCIPtr; /* pointer to sparse matrix at
* (emitter prime,collector prime) */
double *HICUMsubsSICollCIPtr; /* pointer to sparse matrix at
* (substrate,collector prime) */
double *HICUMcollCISubsSIPtr; /* pointer to sparse matrix at
* (collector prime,substrate) */
double *HICUMbaseBIBaseBPPtr; /* pointer to sparse matrix at
* (base prime,emitter prime) */
double *HICUMemitEIBaseBPPtr; /* pointer to sparse matrix at
* (emitter prime,base prime) */
double *HICUMsubsSIBaseBPPtr; /* pointer to sparse matrix at
* (substrate,base) */
double *HICUMsubsSIBaseBIPtr; /* pointer to sparse matrix at
* (substrate,base) */
double *HICUMemitEIBaseBIPtr; /* pointer to sparse matrix at
* (emitter prime,base prime) */
double *HICUMcollCIBasePtr;
double *HICUMbaseCollCIPtr;
double *HICUMbaseBPEmitPtr;
double *HICUMemitBaseBPPtr;
double *HICUMsubsCollPtr;
double *HICUMcollSubsPtr;
double *HICUMxfXfPtr;
double *HICUMxf1Xf1Ptr;
double *HICUMxf2Xf2Ptr;
/* self heating */
double *HICUMcollTempPtr;
double *HICUMbaseTempPtr;
double *HICUMemitTempPtr;
double *HICUMcollCItempPtr;
double *HICUMbaseBItempPtr;
double *HICUMbaseBPtempPtr;
double *HICUMemitEItempPtr;
double *HICUMsubsSItempPtr;
double *HICUMtempCollCIPtr;
double *HICUMtempBaseBIPtr;
double *HICUMtempBaseBPPtr;
double *HICUMtempEmitEIPtr;
double *HICUMtempSubsSIPtr;
double *HICUMtempTempPtr;
unsigned HICUMareaGiven :1; /* flag to indicate area was specified */
unsigned HICUMoff :1; /* 'off' flag for hicum */
unsigned HICUMicVBEGiven :1; /* flag to indicate VBE init. cond. given */
unsigned HICUMicVCEGiven :1; /* flag to indicate VCE init. cond. given */
unsigned HICUMtempGiven :1; /* temperature given for hicum instance*/
unsigned HICUMdtempGiven :1; /* delta temperature given for hicum instance*/
unsigned HICUMmGiven :1; /* flag to indicate multiplier was specified */
double HICUMcaprbi;
double HICUMcapdeix;
double HICUMcapjei;
double HICUMcapdci;
double HICUMcapjci;
double HICUMcapjep;
double HICUMcapjcx_t_i;
double HICUMcapjcx_t_ii;
double HICUMcapdsu;
double HICUMcapjs;
double HICUMcapscp;
double HICUMcapsu;
double HICUMcapcth;
double HICUMtVcrit;
double HICUMbetadc;
#ifndef NONOISE
double HICUMnVar[NSTATVARS][HICUMNSRCS];
#else /*NONOISE*/
double **HICUMnVar;
#endif /*NONOISE*/
/* the above to avoid allocating memory when it is not needed */
} HICUMinstance;
/* entries in the state vector for hicum: */
#define HICUMvbiei HICUMstate
#define HICUMvbici HICUMstate+1
#define HICUMvbpei HICUMstate+2
#define HICUMvbpbi HICUMstate+3
#define HICUMvbpci HICUMstate+4
#define HICUMvsici HICUMstate+5
#define HICUMibiei HICUMstate+6
#define HICUMibiei_Vbiei HICUMstate+7
#define HICUMibpei HICUMstate+8
#define HICUMibpei_Vbpei HICUMstate+9
#define HICUMiciei HICUMstate+10
#define HICUMiciei_Vbiei HICUMstate+11
#define HICUMiciei_Vbici HICUMstate+12
#define HICUMibici HICUMstate+13
#define HICUMibici_Vbici HICUMstate+14
#define HICUMibpbi HICUMstate+15
#define HICUMibpbi_Vbpbi HICUMstate+16
#define HICUMibpbi_Vbiei HICUMstate+17
#define HICUMibpbi_Vbici HICUMstate+18
#define HICUMibpci HICUMstate+19
#define HICUMibpci_Vbpci HICUMstate+20
#define HICUMisici HICUMstate+21
#define HICUMisici_Vsici HICUMstate+22
#define HICUMibpsi HICUMstate+23
#define HICUMibpsi_Vbpci HICUMstate+24
#define HICUMibpsi_Vsici HICUMstate+25
#define HICUMisis_Vsis HICUMstate+26
#define HICUMieie HICUMstate+27 // needed for re-flicker noise
#define HICUMqrbi HICUMstate+28
#define HICUMcqrbi HICUMstate+29
#define HICUMqjei HICUMstate+30
#define HICUMcqjei HICUMstate+31
#define HICUMqdeix HICUMstate+32
#define HICUMcqdeix HICUMstate+33
#define HICUMqjci HICUMstate+34
#define HICUMcqjci HICUMstate+35
#define HICUMqdci HICUMstate+36
#define HICUMcqdci HICUMstate+37
#define HICUMqjep HICUMstate+38
#define HICUMcqjep HICUMstate+39
#define HICUMqjcx0_i HICUMstate+40
#define HICUMcqcx0_t_i HICUMstate+41
#define HICUMqjcx0_ii HICUMstate+42
#define HICUMcqcx0_t_ii HICUMstate+43
#define HICUMqdsu HICUMstate+44
#define HICUMcqdsu HICUMstate+45
#define HICUMqjs HICUMstate+46
#define HICUMcqjs HICUMstate+47
#define HICUMqscp HICUMstate+48
#define HICUMcqscp HICUMstate+49
#define HICUMqbepar1 HICUMstate+50
#define HICUMcqbepar1 HICUMstate+51
#define HICUMgqbepar1 HICUMstate+52
#define HICUMqbepar2 HICUMstate+53
#define HICUMcqbepar2 HICUMstate+54
#define HICUMgqbepar2 HICUMstate+55
#define HICUMqbcpar1 HICUMstate+56
#define HICUMcqbcpar1 HICUMstate+57
#define HICUMgqbcpar1 HICUMstate+58
#define HICUMqbcpar2 HICUMstate+59
#define HICUMcqbcpar2 HICUMstate+60
#define HICUMgqbcpar2 HICUMstate+61
#define HICUMqsu HICUMstate+62
#define HICUMcqsu HICUMstate+63
#define HICUMgqsu HICUMstate+64
#define HICUMqcth HICUMstate+65 /* thermal capacitor charge */
#define HICUMcqcth HICUMstate+66 /* thermal capacitor current */
#define HICUMvrth HICUMstate+67
#define HICUMicth_Vrth HICUMstate+68
//#define HICUMvbxf HICUMstate+73
//#define HICUMvbxf1 HICUMstate+74
//#define HICUMvbxf2 HICUMstate+75
#define HICUMnumStates 69
/* per model data */
typedef struct sHICUMmodel { /* model structure for a hicum */
struct GENmodel gen;
#define HICUMmodType gen.GENmodType
#define HICUMnextModel(inst) ((struct sHICUMmodel *)((inst)->gen.GENnextModel))
#define HICUMinstances(inst) ((HICUMinstance *)((inst)->gen.GENinstances))
#define HICUMmodName gen.GENmodName
//Circuit simulator specific parameters
int HICUMtype;
double HICUMtnom;
//Transfer current
double HICUMc10;
double HICUMqp0;
double HICUMich;
double HICUMhf0;
double HICUMhfe;
double HICUMhfc;
double HICUMhjei;
double HICUMahjei;
double HICUMrhjei;
double HICUMhjci;
//Base-Emitter diode;
double HICUMibeis;
double HICUMmbei;
double HICUMireis;
double HICUMmrei;
double HICUMibeps;
double HICUMmbep;
double HICUMireps;
double HICUMmrep;
double HICUMmcf;
//Transit time for excess recombination current at b-c barrier
double HICUMtbhrec;
//Base-Collector diode currents
double HICUMibcis;
double HICUMmbci;
double HICUMibcxs;
double HICUMmbcx;
//Base-Emitter tunneling current
double HICUMibets;
double HICUMabet;
int HICUMtunode;
//Base-Collector avalanche current
double HICUMfavl;
double HICUMqavl;
double HICUMalfav;
double HICUMalqav;
//Series resistances
double HICUMrbi0;
double HICUMrbx;
double HICUMfgeo;
double HICUMfdqr0;
double HICUMfcrbi;
double HICUMfqi;
double HICUMre;
double HICUMrcx;
//Substrate transistor
double HICUMitss;
double HICUMmsf;
double HICUMiscs;
double HICUMmsc;
double HICUMtsf;
//Intra-device substrate coupling
double HICUMrsu;
double HICUMcsu;
//Depletion Capacitances
double HICUMcjei0;
double HICUMvdei;
double HICUMzei;
double HICUMajei;
double HICUMcjep0;
double HICUMvdep;
double HICUMzep;
double HICUMajep;
double HICUMcjci0;
double HICUMvdci;
double HICUMzci;
double HICUMvptci;
double HICUMcjcx0;
double HICUMvdcx;
double HICUMzcx;
double HICUMvptcx;
double HICUMfbcpar;
double HICUMfbepar;
double HICUMcjs0;
double HICUMvds;
double HICUMzs;
double HICUMvpts;
double HICUMcscp0;
double HICUMvdsp;
double HICUMzsp;
double HICUMvptsp;
//Diffusion Capacitances
double HICUMt0;
double HICUMdt0h;
double HICUMtbvl;
double HICUMtef0;
double HICUMgtfe;
double HICUMthcs;
double HICUMahc;
double HICUMfthc;
double HICUMrci0;
double HICUMvlim;
double HICUMvces;
double HICUMvpt;
double HICUMaick;
double HICUMdelck;
double HICUMtr;
double HICUMvcbar;
double HICUMicbar;
double HICUMacbar;
//Isolation Capacitances
double HICUMcbepar;
double HICUMcbcpar;
//Non-quasi-static Effect
double HICUMalqf;
double HICUMalit;
int HICUMflnqs;
//Noise
double HICUMkf;
double HICUMaf;
int HICUMcfbe;
int HICUMflcono;
double HICUMkfre;
double HICUMafre;
//Lateral Geometry Scaling (at high current densities)
double HICUMlatb;
double HICUMlatl;
//Temperature dependence
double HICUMvgb;
double HICUMalt0;
double HICUMkt0;
double HICUMzetaci;
double HICUMalvs;
double HICUMalces;
double HICUMzetarbi;
double HICUMzetarbx;
double HICUMzetarcx;
double HICUMzetare;
double HICUMzetacx;
double HICUMvge;
double HICUMvgc;
double HICUMvgs;
double HICUMf1vg;
double HICUMf2vg;
double HICUMzetact;
double HICUMzetabet;
double HICUMalb;
double HICUMdvgbe;
double HICUMzetahjei;
double HICUMzetavgbe;
//Self-Heating
int HICUMflsh;
double HICUMrth;
double HICUMzetarth;
double HICUMalrth;
double HICUMcth;
//Compatibility with V2.1
double HICUMflcomp;
//SOA check parameters
double HICUMvbeMax; /* maximum voltage over B-E junction */
double HICUMvbcMax; /* maximum voltage over B-C junction */
double HICUMvceMax; /* maximum voltage over C-E branch */
//Circuit simulator specific parameters
unsigned HICUMtypeGiven : 1;
unsigned HICUMtnomGiven : 1;
//Transfer current
unsigned HICUMc10Given : 1;
unsigned HICUMqp0Given : 1;
unsigned HICUMichGiven : 1;
unsigned HICUMhf0Given : 1;
unsigned HICUMhfeGiven : 1;
unsigned HICUMhfcGiven : 1;
unsigned HICUMhjeiGiven : 1;
unsigned HICUMahjeiGiven : 1;
unsigned HICUMrhjeiGiven : 1;
unsigned HICUMhjciGiven : 1;
//Base-Emitter diodeGiven : 1;
unsigned HICUMibeisGiven : 1;
unsigned HICUMmbeiGiven : 1;
unsigned HICUMireisGiven : 1;
unsigned HICUMmreiGiven : 1;
unsigned HICUMibepsGiven : 1;
unsigned HICUMmbepGiven : 1;
unsigned HICUMirepsGiven : 1;
unsigned HICUMmrepGiven : 1;
unsigned HICUMmcfGiven : 1;
//Transit time for excess recombination current at b-c barrier
unsigned HICUMtbhrecGiven : 1;
//Base-Collector diode currents
unsigned HICUMibcisGiven : 1;
unsigned HICUMmbciGiven : 1;
unsigned HICUMibcxsGiven : 1;
unsigned HICUMmbcxGiven : 1;
//Base-Emitter tunneling current
unsigned HICUMibetsGiven : 1;
unsigned HICUMabetGiven : 1;
unsigned HICUMtunodeGiven : 1;
//Base-Collector avalanche current
unsigned HICUMfavlGiven : 1;
unsigned HICUMqavlGiven : 1;
unsigned HICUMalfavGiven : 1;
unsigned HICUMalqavGiven : 1;
//Series resistances
unsigned HICUMrbi0Given : 1;
unsigned HICUMrbxGiven : 1;
unsigned HICUMfgeoGiven : 1;
unsigned HICUMfdqr0Given : 1;
unsigned HICUMfcrbiGiven : 1;
unsigned HICUMfqiGiven : 1;
unsigned HICUMreGiven : 1;
unsigned HICUMrcxGiven : 1;
//Substrate transistor
unsigned HICUMitssGiven : 1;
unsigned HICUMmsfGiven : 1;
unsigned HICUMiscsGiven : 1;
unsigned HICUMmscGiven : 1;
unsigned HICUMtsfGiven : 1;
//Intra-device substrate coupling
unsigned HICUMrsuGiven : 1;
unsigned HICUMcsuGiven : 1;
//Depletion Capacitances
unsigned HICUMcjei0Given : 1;
unsigned HICUMvdeiGiven : 1;
unsigned HICUMzeiGiven : 1;
unsigned HICUMajeiGiven : 1;
unsigned HICUMcjep0Given : 1;
unsigned HICUMvdepGiven : 1;
unsigned HICUMzepGiven : 1;
unsigned HICUMajepGiven : 1;
unsigned HICUMcjci0Given : 1;
unsigned HICUMvdciGiven : 1;
unsigned HICUMzciGiven : 1;
unsigned HICUMvptciGiven : 1;
unsigned HICUMcjcx0Given : 1;
unsigned HICUMvdcxGiven : 1;
unsigned HICUMzcxGiven : 1;
unsigned HICUMvptcxGiven : 1;
unsigned HICUMfbcparGiven : 1;
unsigned HICUMfbeparGiven : 1;
unsigned HICUMcjs0Given : 1;
unsigned HICUMvdsGiven : 1;
unsigned HICUMzsGiven : 1;
unsigned HICUMvptsGiven : 1;
unsigned HICUMcscp0Given : 1;
unsigned HICUMvdspGiven : 1;
unsigned HICUMzspGiven : 1;
unsigned HICUMvptspGiven : 1;
//Diffusion Capacitances
unsigned HICUMt0Given : 1;
unsigned HICUMdt0hGiven : 1;
unsigned HICUMtbvlGiven : 1;
unsigned HICUMtef0Given : 1;
unsigned HICUMgtfeGiven : 1;
unsigned HICUMthcsGiven : 1;
unsigned HICUMahcGiven : 1;
unsigned HICUMfthcGiven : 1;
unsigned HICUMrci0Given : 1;
unsigned HICUMvlimGiven : 1;
unsigned HICUMvcesGiven : 1;
unsigned HICUMvptGiven : 1;
unsigned HICUMaickGiven : 1;
unsigned HICUMdelckGiven : 1;
unsigned HICUMtrGiven : 1;
unsigned HICUMvcbarGiven : 1;
unsigned HICUMicbarGiven : 1;
unsigned HICUMacbarGiven : 1;
//Isolation Capacitances
unsigned HICUMcbeparGiven : 1;
unsigned HICUMcbcparGiven : 1;
//Non-quasi-static Effect
unsigned HICUMalqfGiven : 1;
unsigned HICUMalitGiven : 1;
unsigned HICUMflnqsGiven : 1;
//Noise
unsigned HICUMkfGiven : 1;
unsigned HICUMafGiven : 1;
unsigned HICUMcfbeGiven : 1;
unsigned HICUMflconoGiven : 1;
unsigned HICUMkfreGiven : 1;
unsigned HICUMafreGiven : 1;
//Lateral Geometry Scaling (at high current densities)
unsigned HICUMlatbGiven : 1;
unsigned HICUMlatlGiven : 1;
//Temperature dependence
unsigned HICUMvgbGiven : 1;
unsigned HICUMalt0Given : 1;
unsigned HICUMkt0Given : 1;
unsigned HICUMzetaciGiven : 1;
unsigned HICUMalvsGiven : 1;
unsigned HICUMalcesGiven : 1;
unsigned HICUMzetarbiGiven : 1;
unsigned HICUMzetarbxGiven : 1;
unsigned HICUMzetarcxGiven : 1;
unsigned HICUMzetareGiven : 1;
unsigned HICUMzetacxGiven : 1;
unsigned HICUMvgeGiven : 1;
unsigned HICUMvgcGiven : 1;
unsigned HICUMvgsGiven : 1;
unsigned HICUMf1vgGiven : 1;
unsigned HICUMf2vgGiven : 1;
unsigned HICUMzetactGiven : 1;
unsigned HICUMzetabetGiven : 1;
unsigned HICUMalbGiven : 1;
unsigned HICUMdvgbeGiven : 1;
unsigned HICUMzetahjeiGiven : 1;
unsigned HICUMzetavgbeGiven : 1;
//Self-Heating
unsigned HICUMflshGiven : 1;
unsigned HICUMrthGiven : 1;
unsigned HICUMzetarthGiven : 1;
unsigned HICUMalrthGiven : 1;
unsigned HICUMcthGiven : 1;
//Compatibility with V2.1
unsigned HICUMflcompGiven : 1;
unsigned HICUMvbeMaxGiven : 1;
unsigned HICUMvbcMaxGiven : 1;
unsigned HICUMvceMaxGiven : 1;
} HICUMmodel;
#ifndef NPN
#define NPN 1
#define PNP -1
#endif /*NPN*/
/* device parameters */
enum {
HICUM_AREA = 1,
HICUM_OFF,
HICUM_IC,
HICUM_IC_VBE,
HICUM_IC_VCE,
HICUM_TEMP,
HICUM_DTEMP,
HICUM_M,
};
/* model parameters */
enum {
//Circuit simulator specific parameters
HICUM_MOD_NPN = 101,
HICUM_MOD_PNP,
HICUM_MOD_TNOM,
//Transfer current
HICUM_MOD_C10,
HICUM_MOD_QP0,
HICUM_MOD_ICH,
HICUM_MOD_HF0,
HICUM_MOD_HFE,
HICUM_MOD_HFC,
HICUM_MOD_HJEI,
HICUM_MOD_AHJEI,
HICUM_MOD_RHJEI,
HICUM_MOD_HJCI,
//Base-Emitter diode,
HICUM_MOD_IBEIS,
HICUM_MOD_MBEI,
HICUM_MOD_IREIS,
HICUM_MOD_MREI,
HICUM_MOD_IBEPS,
HICUM_MOD_MBEP,
HICUM_MOD_IREPS,
HICUM_MOD_MREP,
HICUM_MOD_MCF,
//Transit time for excess recombination current at b-c barrier
HICUM_MOD_TBHREC,
//Base-Collector diode currents
HICUM_MOD_IBCIS,
HICUM_MOD_MBCI,
HICUM_MOD_IBCXS,
HICUM_MOD_MBCX,
//Base-Emitter tunneling current
HICUM_MOD_IBETS,
HICUM_MOD_ABET,
HICUM_MOD_TUNODE,
//Base-Collector avalanche current
HICUM_MOD_FAVL,
HICUM_MOD_QAVL,
HICUM_MOD_ALFAV,
HICUM_MOD_ALQAV,
//Series resistances
HICUM_MOD_RBI0,
HICUM_MOD_RBX,
HICUM_MOD_FGEO,
HICUM_MOD_FDQR0,
HICUM_MOD_FCRBI,
HICUM_MOD_FQI,
HICUM_MOD_RE,
HICUM_MOD_RCX,
//Substrate transistor
HICUM_MOD_ITSS,
HICUM_MOD_MSF,
HICUM_MOD_ISCS,
HICUM_MOD_MSC,
HICUM_MOD_TSF,
//Intra-device substrate coupling
HICUM_MOD_RSU,
HICUM_MOD_CSU,
//Depletion Capacitances
HICUM_MOD_CJEI0,
HICUM_MOD_VDEI,
HICUM_MOD_ZEI,
HICUM_MOD_AJEI,
HICUM_MOD_CJEP0,
HICUM_MOD_VDEP,
HICUM_MOD_ZEP,
HICUM_MOD_AJEP,
HICUM_MOD_CJCI0,
HICUM_MOD_VDCI,
HICUM_MOD_ZCI,
HICUM_MOD_VPTCI,
HICUM_MOD_CJCX0,
HICUM_MOD_VDCX,
HICUM_MOD_ZCX,
HICUM_MOD_VPTCX,
HICUM_MOD_FBCPAR,
HICUM_MOD_FBEPAR,
HICUM_MOD_CJS0,
HICUM_MOD_VDS,
HICUM_MOD_ZS,
HICUM_MOD_VPTS,
HICUM_MOD_CSCP0,
HICUM_MOD_VDSP,
HICUM_MOD_ZSP,
HICUM_MOD_VPTSP,
//Diffusion Capacitances
HICUM_MOD_T0,
HICUM_MOD_DT0H,
HICUM_MOD_TBVL,
HICUM_MOD_TEF0,
HICUM_MOD_GTFE,
HICUM_MOD_THCS,
HICUM_MOD_AHC,
HICUM_MOD_FTHC,
HICUM_MOD_RCI0,
HICUM_MOD_VLIM,
HICUM_MOD_VCES,
HICUM_MOD_VPT,
HICUM_MOD_AICK,
HICUM_MOD_DELCK,
HICUM_MOD_TR,
HICUM_MOD_VCBAR,
HICUM_MOD_ICBAR,
HICUM_MOD_ACBAR,
//Isolation Capacitances
HICUM_MOD_CBEPAR,
HICUM_MOD_CBCPAR,
//Non-quasi-static Effect
HICUM_MOD_ALQF,
HICUM_MOD_ALIT,
HICUM_MOD_FLNQS,
//Noise
HICUM_MOD_KF,
HICUM_MOD_AF,
HICUM_MOD_CFBE,
HICUM_MOD_FLCONO,
HICUM_MOD_KFRE,
HICUM_MOD_AFRE,
//Lateral Geometry Scaling (at high current densities)
HICUM_MOD_LATB,
HICUM_MOD_LATL,
//Temperature dependence
HICUM_MOD_VGB,
HICUM_MOD_ALT0,
HICUM_MOD_KT0,
HICUM_MOD_ZETACI,
HICUM_MOD_ALVS,
HICUM_MOD_ALCES,
HICUM_MOD_ZETARBI,
HICUM_MOD_ZETARBX,
HICUM_MOD_ZETARCX,
HICUM_MOD_ZETARE,
HICUM_MOD_ZETACX,
HICUM_MOD_VGE,
HICUM_MOD_VGC,
HICUM_MOD_VGS,
HICUM_MOD_F1VG,
HICUM_MOD_F2VG,
HICUM_MOD_ZETACT,
HICUM_MOD_ZETABET,
HICUM_MOD_ALB,
HICUM_MOD_DVGBE,
HICUM_MOD_ZETAHJEI,
HICUM_MOD_ZETAVGBE,
//Self-Heating
HICUM_MOD_FLSH,
HICUM_MOD_RTH,
HICUM_MOD_ZETARTH,
HICUM_MOD_ALRTH,
HICUM_MOD_CTH,
//Compatibility with V2.1
HICUM_MOD_FLCOMP,
HICUM_MOD_VBE_MAX,
HICUM_MOD_VBC_MAX,
HICUM_MOD_VCE_MAX,
};
/* device questions */
enum {
HICUM_QUEST_FT = 251,
HICUM_QUEST_COLLNODE,
HICUM_QUEST_BASENODE,
HICUM_QUEST_EMITNODE,
HICUM_QUEST_SUBSNODE,
HICUM_QUEST_COLLCINODE,
HICUM_QUEST_BASEBPNODE,
HICUM_QUEST_BASEBINODE,
HICUM_QUEST_EMITEINODE,
HICUM_QUEST_SUBSSINODE,
// HICUM_QUEST_XFNODE,
// HICUM_QUEST_XF1NODE,
// HICUM_QUEST_XF2NODE,
HICUM_QUEST_VBE,
HICUM_QUEST_VBC,
HICUM_QUEST_CC,
HICUM_QUEST_CB,
HICUM_QUEST_CE,
HICUM_QUEST_CS,
HICUM_QUEST_GM,
HICUM_QUEST_GO,
HICUM_QUEST_GPI,
HICUM_QUEST_GMU,
HICUM_QUEST_GX,
HICUM_QUEST_QBE,
HICUM_QUEST_CQBE,
HICUM_QUEST_QBC,
HICUM_QUEST_CQBC,
HICUM_QUEST_QBX,
HICUM_QUEST_CQBX,
HICUM_QUEST_QBCP,
HICUM_QUEST_CQBCP,
HICUM_QUEST_CEXBC,
HICUM_QUEST_GEQCB,
HICUM_QUEST_GCSUB,
HICUM_QUEST_GDSUB,
HICUM_QUEST_GEQBX,
HICUM_QUEST_CJBE,
HICUM_QUEST_CBEX,
HICUM_QUEST_CDBE,
HICUM_QUEST_CBEP,
HICUM_QUEST_CJBC,
HICUM_QUEST_CBCXI,
HICUM_QUEST_CBCXII,
HICUM_QUEST_CSCP,
HICUM_QUEST_POWER,
};
/* model questions */
enum {
HICUM_MOD_COLLCONDUCT = 301,
HICUM_MOD_BASECONDUCT,
HICUM_MOD_EMITTERCONDUCT,
HICUM_MOD_SUBSTRATECONDUCT,
HICUM_MOD_TYPE,
};
#include "hicumext.h"
#endif /*HICUM*/

View File

@ -0,0 +1,28 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
#ifndef __HICUMEXT_H
#define __HICUMEXT_H
extern int HICUMacLoad(GENmodel *,CKTcircuit*);
extern int HICUMask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
extern int HICUMconvTest(GENmodel*,CKTcircuit*);
extern int HICUMdelete(GENinstance*);
extern int HICUMgetic(GENmodel*,CKTcircuit*);
extern int HICUMload(GENmodel*,CKTcircuit*);
extern int HICUMmAsk(CKTcircuit*,GENmodel*,int,IFvalue*);
extern int HICUMmParam(int,IFvalue*,GENmodel*);
extern int HICUMparam(int,IFvalue*,GENinstance*,IFvalue*);
extern int HICUMpzLoad(GENmodel*, CKTcircuit*, SPcomplex*);
extern int HICUMsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int HICUMunsetup(GENmodel*,CKTcircuit*);
extern int HICUMtemp(GENmodel*,CKTcircuit*);
extern int HICUMtrunc(GENmodel*,CKTcircuit*,double*);
extern int HICUMnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
extern int HICUMsoaCheck(CKTcircuit *, GENmodel *);
#endif

View File

@ -0,0 +1,47 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* This routine gets the device initial conditions for the HICUMs
* from the RHS vector
*/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "hicumdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
HICUMgetic(GENmodel *inModel, CKTcircuit *ckt)
{
HICUMmodel *model = (HICUMmodel*)inModel;
HICUMinstance *here;
/*
* grab initial conditions out of rhs array. User specified, so use
* external nodes to get values
*/
for( ; model ; model = HICUMnextModel(model)) {
for(here = HICUMinstances(model); here ; here = HICUMnextInstance(here)) {
if(!here->HICUMicVBEGiven) {
here->HICUMicVBE =
*(ckt->CKTrhs + here->HICUMbaseNode) -
*(ckt->CKTrhs + here->HICUMemitNode);
}
if(!here->HICUMicVCEGiven) {
here->HICUMicVCE =
*(ckt->CKTrhs + here->HICUMcollNode) -
*(ckt->CKTrhs + here->HICUMemitNode);
}
}
}
return(OK);
}

View File

@ -0,0 +1,81 @@
/*
* hicuminit.c
*/
#include "ngspice/config.h"
#include "ngspice/devdefs.h"
#include "hicumitf.h"
#include "hicumext.h"
#include "hicuminit.h"
SPICEdev HICUMinfo = {
.DEVpublic = {
.name = "hicum2",
.description = "High Current Model for BJT",
.terms = &HICUMnSize,
.numNames = &HICUMnSize,
.termNames = HICUMnames,
.numInstanceParms = &HICUMpTSize,
.instanceParms = HICUMpTable,
.numModelParms = &HICUMmPTSize,
.modelParms = HICUMmPTable,
.flags = DEV_DEFAULT,
#ifdef XSPICE
.cm_func = NULL,
.num_conn = 0,
.conn = NULL,
.num_param = 0,
.param = NULL,
.num_inst_var = 0,
.inst_var = NULL,
#endif
},
.DEVparam = HICUMparam,
.DEVmodParam = HICUMmParam,
.DEVload = HICUMload,
.DEVsetup = HICUMsetup,
.DEVunsetup = HICUMunsetup,
.DEVpzSetup = HICUMsetup,
.DEVtemperature = HICUMtemp,
.DEVtrunc = HICUMtrunc,
.DEVfindBranch = NULL,
.DEVacLoad = HICUMacLoad,
.DEVaccept = NULL,
.DEVdestroy = NULL,
.DEVmodDelete = NULL,
.DEVdelete = NULL,
.DEVsetic = HICUMgetic,
.DEVask = HICUMask,
.DEVmodAsk = HICUMmAsk,
.DEVpzLoad = HICUMpzLoad,
.DEVconvTest = HICUMconvTest,
.DEVsenSetup = NULL,
.DEVsenLoad = NULL,
.DEVsenUpdate = NULL,
.DEVsenAcLoad = NULL,
.DEVsenPrint = NULL,
.DEVsenTrunc = NULL,
.DEVdisto = NULL,
.DEVnoise = HICUMnoise,
.DEVsoaCheck = HICUMsoaCheck,
.DEVinstSize = &HICUMiSize,
.DEVmodSize = &HICUMmSize,
#ifdef CIDER
.DEVdump = NULL,
.DEVacct = NULL,
#endif
};
SPICEdev *
get_hicum_info(void)
{
return &HICUMinfo;
}

View File

@ -0,0 +1,13 @@
#ifndef _HICUMINIT_H
#define _HICUMINIT_H
extern IFparm HICUMpTable[ ];
extern IFparm HICUMmPTable[ ];
extern char *HICUMnames[ ];
extern int HICUMpTSize;
extern int HICUMmPTSize;
extern int HICUMnSize;
extern int HICUMiSize;
extern int HICUMmSize;
#endif

View File

@ -0,0 +1,12 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
#ifndef DEV_HICUM
#define DEV_HICUM
extern SPICEdev *get_hicum_info(void);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,488 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1987 Mathew Lew and Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
#include "ngspice/ngspice.h"
#include "ngspice/const.h"
#include "ngspice/ifsim.h"
#include "ngspice/cktdefs.h"
#include "ngspice/devdefs.h"
#include "hicumdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
#define MIN_R 0.001
/*ARGSUSED*/
int
HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
{
HICUMmodel *here = (HICUMmodel*)instPtr;
NG_IGNORE(ckt);
switch(which) {
//Circuit simulator specific parameters
case HICUM_MOD_TYPE:
if (here->HICUMtype == NPN)
value->sValue = "npn";
else
value->sValue = "pnp";
return(OK);
case HICUM_MOD_TNOM:
value->rValue = here->HICUMtnom;
return(OK);
//Transfer current
case HICUM_MOD_C10:
value->rValue = here->HICUMc10;
return(OK);
case HICUM_MOD_QP0:
value->rValue = here->HICUMqp0;
return(OK);
case HICUM_MOD_ICH:
value->rValue = here->HICUMich;
return(OK);
case HICUM_MOD_HF0:
value->rValue = here->HICUMhf0;
return(OK);
case HICUM_MOD_HFE:
value->rValue = here->HICUMhfe;
return(OK);
case HICUM_MOD_HFC:
value->rValue = here->HICUMhfc;
return(OK);
case HICUM_MOD_HJEI:
value->rValue = here->HICUMhjei;
return(OK);
case HICUM_MOD_AHJEI:
value->rValue = here->HICUMahjei;
return(OK);
case HICUM_MOD_RHJEI:
value->rValue = here->HICUMrhjei;
return(OK);
case HICUM_MOD_HJCI:
value->rValue = here->HICUMhjci;
return(OK);
//Base-Emitter diode:
case HICUM_MOD_IBEIS:
value->rValue = here->HICUMibeis;
return(OK);
case HICUM_MOD_MBEI:
value->rValue = here->HICUMmbei;
return(OK);
case HICUM_MOD_IREIS:
value->rValue = here->HICUMireis;
return(OK);
case HICUM_MOD_MREI:
value->rValue = here->HICUMmrei;
return(OK);
case HICUM_MOD_IBEPS:
value->rValue = here->HICUMibeps;
return(OK);
case HICUM_MOD_MBEP:
value->rValue = here->HICUMmbep;
return(OK);
case HICUM_MOD_IREPS:
value->rValue = here->HICUMireps;
return(OK);
case HICUM_MOD_MREP:
value->rValue = here->HICUMmrep;
return(OK);
case HICUM_MOD_MCF:
value->rValue = here->HICUMmcf;
return(OK);
//Transit time for excess recombination current at b-c barrier
case HICUM_MOD_TBHREC:
value->rValue = here->HICUMtbhrec;
return(OK);
//Base-Collector diode currents
case HICUM_MOD_IBCIS:
value->rValue = here->HICUMibcis;
return(OK);
case HICUM_MOD_MBCI:
value->rValue = here->HICUMmbci;
return(OK);
case HICUM_MOD_IBCXS:
value->rValue = here->HICUMibcxs;
return(OK);
case HICUM_MOD_MBCX:
value->rValue = here->HICUMmbcx;
return(OK);
//Base-Emitter tunneling current
case HICUM_MOD_IBETS:
value->rValue = here->HICUMibets;
return(OK);
case HICUM_MOD_ABET:
value->rValue = here->HICUMabet;
return(OK);
case HICUM_MOD_TUNODE:
value->rValue = here->HICUMtunode = value->iValue;
return(OK);
//Base-Collector avalanche current
case HICUM_MOD_FAVL:
value->rValue = here->HICUMfavl;
return(OK);
case HICUM_MOD_QAVL:
value->rValue = here->HICUMqavl;
return(OK);
case HICUM_MOD_ALFAV:
value->rValue = here->HICUMalfav;
return(OK);
case HICUM_MOD_ALQAV:
value->rValue = here->HICUMalqav;
return(OK);
//Series resistances
case HICUM_MOD_RBI0:
value->rValue = here->HICUMrbi0;
if (here->HICUMrbi0 < MIN_R) here->HICUMrbi0 = MIN_R;
return(OK);
case HICUM_MOD_RBX:
value->rValue = here->HICUMrbx;
if (here->HICUMrbx < MIN_R) here->HICUMrbx = MIN_R;
return(OK);
case HICUM_MOD_FGEO:
value->rValue = here->HICUMfgeo;
return(OK);
case HICUM_MOD_FDQR0:
value->rValue = here->HICUMfdqr0;
return(OK);
case HICUM_MOD_FCRBI:
value->rValue = here->HICUMfcrbi;
return(OK);
case HICUM_MOD_FQI:
value->rValue = here->HICUMfqi;
return(OK);
case HICUM_MOD_RE:
value->rValue = here->HICUMre;
if (here->HICUMre < MIN_R) here->HICUMre = MIN_R;
return(OK);
case HICUM_MOD_RCX:
value->rValue = here->HICUMrcx;
if (here->HICUMrcx < MIN_R) here->HICUMrcx = MIN_R;
return(OK);
//Substrate transistor
case HICUM_MOD_ITSS:
value->rValue = here->HICUMitss;
return(OK);
case HICUM_MOD_MSF:
value->rValue = here->HICUMmsf;
return(OK);
case HICUM_MOD_ISCS:
value->rValue = here->HICUMiscs;
return(OK);
case HICUM_MOD_MSC:
value->rValue = here->HICUMmsc;
return(OK);
case HICUM_MOD_TSF:
value->rValue = here->HICUMtsf;
return(OK);
//Intra-device substrate coupling
case HICUM_MOD_RSU:
value->rValue = here->HICUMrsu;
if (here->HICUMrsu < MIN_R) here->HICUMrsu = MIN_R;
return(OK);
case HICUM_MOD_CSU:
//Depletion Capacitances
case HICUM_MOD_CJEI0:
value->rValue = here->HICUMcjei0;
return(OK);
case HICUM_MOD_VDEI:
value->rValue = here->HICUMvdei;
return(OK);
case HICUM_MOD_ZEI:
value->rValue = here->HICUMzei;
return(OK);
case HICUM_MOD_AJEI:
value->rValue = here->HICUMajei;
return(OK);
case HICUM_MOD_CJEP0:
value->rValue = here->HICUMcjep0;
return(OK);
case HICUM_MOD_VDEP:
value->rValue = here->HICUMvdep;
return(OK);
case HICUM_MOD_ZEP:
value->rValue = here->HICUMzep;
return(OK);
case HICUM_MOD_AJEP:
value->rValue = here->HICUMajep;
return(OK);
case HICUM_MOD_CJCI0:
value->rValue = here->HICUMcjci0;
return(OK);
case HICUM_MOD_VDCI:
value->rValue = here->HICUMvdci;
return(OK);
case HICUM_MOD_ZCI:
value->rValue = here->HICUMzci;
return(OK);
case HICUM_MOD_VPTCI:
value->rValue = here->HICUMvptci;
return(OK);
case HICUM_MOD_CJCX0:
value->rValue = here->HICUMcjcx0;
return(OK);
case HICUM_MOD_VDCX:
value->rValue = here->HICUMvdcx;
return(OK);
case HICUM_MOD_ZCX:
value->rValue = here->HICUMzcx;
return(OK);
case HICUM_MOD_VPTCX:
value->rValue = here->HICUMvptcx;
return(OK);
case HICUM_MOD_FBCPAR:
value->rValue = here->HICUMfbcpar;
return(OK);
case HICUM_MOD_FBEPAR:
value->rValue = here->HICUMfbepar;
return(OK);
case HICUM_MOD_CJS0:
value->rValue = here->HICUMcjs0;
return(OK);
case HICUM_MOD_VDS:
value->rValue = here->HICUMvds;
return(OK);
case HICUM_MOD_ZS:
value->rValue = here->HICUMzs;
return(OK);
case HICUM_MOD_VPTS:
value->rValue = here->HICUMvpts;
return(OK);
case HICUM_MOD_CSCP0:
value->rValue = here->HICUMcscp0;
return(OK);
case HICUM_MOD_VDSP:
value->rValue = here->HICUMvdsp;
return(OK);
case HICUM_MOD_ZSP:
value->rValue = here->HICUMzsp;
return(OK);
case HICUM_MOD_VPTSP:
value->rValue = here->HICUMvptsp;
return(OK);
//Diffusion Capacitances
case HICUM_MOD_T0:
value->rValue = here->HICUMt0;
return(OK);
case HICUM_MOD_DT0H:
value->rValue = here->HICUMdt0h;
return(OK);
case HICUM_MOD_TBVL:
value->rValue = here->HICUMtbvl;
return(OK);
case HICUM_MOD_TEF0:
value->rValue = here->HICUMtef0;
return(OK);
case HICUM_MOD_GTFE:
value->rValue = here->HICUMgtfe;
return(OK);
case HICUM_MOD_THCS:
value->rValue = here->HICUMthcs;
return(OK);
case HICUM_MOD_AHC:
value->rValue = here->HICUMahc;
return(OK);
case HICUM_MOD_FTHC:
value->rValue = here->HICUMfthc;
return(OK);
case HICUM_MOD_RCI0:
value->rValue = here->HICUMrci0;
return(OK);
case HICUM_MOD_VLIM:
value->rValue = here->HICUMvlim;
return(OK);
case HICUM_MOD_VCES:
value->rValue = here->HICUMvces;
return(OK);
case HICUM_MOD_VPT:
value->rValue = here->HICUMvpt;
return(OK);
case HICUM_MOD_AICK:
value->rValue = here->HICUMaick;
return(OK);
case HICUM_MOD_DELCK:
value->rValue = here->HICUMdelck;
return(OK);
case HICUM_MOD_TR:
value->rValue = here->HICUMtr;
return(OK);
case HICUM_MOD_VCBAR:
value->rValue = here->HICUMvcbar;
return(OK);
case HICUM_MOD_ICBAR:
value->rValue = here->HICUMicbar;
return(OK);
case HICUM_MOD_ACBAR:
value->rValue = here->HICUMacbar;
return(OK);
//Isolation Capacitances
case HICUM_MOD_CBEPAR:
value->rValue = here->HICUMcbepar;
return(OK);
case HICUM_MOD_CBCPAR:
value->rValue = here->HICUMcbcpar;
return(OK);
//Non-quasi-static Effect
case HICUM_MOD_ALQF:
value->rValue = here->HICUMalqf;
return(OK);
case HICUM_MOD_ALIT:
value->rValue = here->HICUMalit;
return(OK);
case HICUM_MOD_FLNQS:
value->iValue = here->HICUMflnqs;
return(OK);
//Noise
case HICUM_MOD_KF:
value->rValue = here->HICUMkf;
return(OK);
case HICUM_MOD_AF:
value->rValue = here->HICUMaf;
return(OK);
case HICUM_MOD_CFBE:
value->rValue = here->HICUMcfbe;
return(OK);
case HICUM_MOD_FLCONO:
value->iValue = here->HICUMflcono;
return(OK);
case HICUM_MOD_KFRE:
value->rValue = here->HICUMkfre;
return(OK);
case HICUM_MOD_AFRE:
value->rValue = here->HICUMafre;
return(OK);
//Lateral Geometry Scaling (at high current densities)
case HICUM_MOD_LATB:
value->rValue = here->HICUMlatb;
return(OK);
case HICUM_MOD_LATL:
value->rValue = here->HICUMlatl;
return(OK);
//Temperature dependence
case HICUM_MOD_VGB:
value->rValue = here->HICUMvgb;
return(OK);
case HICUM_MOD_ALT0:
value->rValue = here->HICUMalt0;
return(OK);
case HICUM_MOD_KT0:
value->rValue = here->HICUMkt0;
return(OK);
case HICUM_MOD_ZETACI:
value->rValue = here->HICUMzetaci;
return(OK);
case HICUM_MOD_ALVS:
value->rValue = here->HICUMalvs;
return(OK);
case HICUM_MOD_ALCES:
value->rValue = here->HICUMalces;
return(OK);
case HICUM_MOD_ZETARBI:
value->rValue = here->HICUMzetarbi;
return(OK);
case HICUM_MOD_ZETARBX:
value->rValue = here->HICUMzetarbx;
return(OK);
case HICUM_MOD_ZETARCX:
value->rValue = here->HICUMzetarcx;
return(OK);
case HICUM_MOD_ZETARE:
value->rValue = here->HICUMzetare;
return(OK);
case HICUM_MOD_ZETACX:
value->rValue = here->HICUMzetacx;
return(OK);
case HICUM_MOD_VGE:
value->rValue = here->HICUMvge;
return(OK);
case HICUM_MOD_VGC:
value->rValue = here->HICUMvgc;
return(OK);
case HICUM_MOD_VGS:
value->rValue = here->HICUMvgs;
return(OK);
case HICUM_MOD_F1VG:
value->rValue = here->HICUMf1vg;
return(OK);
case HICUM_MOD_F2VG:
value->rValue = here->HICUMf2vg;
return(OK);
case HICUM_MOD_ZETACT:
value->rValue = here->HICUMzetact;
return(OK);
case HICUM_MOD_ZETABET:
value->rValue = here->HICUMzetabet;
return(OK);
case HICUM_MOD_ALB:
value->rValue = here->HICUMalb;
return(OK);
case HICUM_MOD_DVGBE:
value->rValue = here->HICUMdvgbe;
return(OK);
case HICUM_MOD_ZETAHJEI:
value->rValue = here->HICUMzetahjei;
return(OK);
case HICUM_MOD_ZETAVGBE:
value->rValue = here->HICUMzetavgbe;
return(OK);
//Self-Heating
case HICUM_MOD_FLSH:
value->iValue = here->HICUMflsh;
return(OK);
case HICUM_MOD_RTH:
value->rValue = here->HICUMrth;
return(OK);
case HICUM_MOD_ZETARTH:
value->rValue = here->HICUMzetarth;
return(OK);
case HICUM_MOD_ALRTH:
value->rValue = here->HICUMalrth;
return(OK);
case HICUM_MOD_CTH:
value->rValue = here->HICUMcth;
return(OK);
//Compatibility with V2.1
case HICUM_MOD_FLCOMP:
value->rValue = here->HICUMflcomp;
return(OK);
//SOA-check
case HICUM_MOD_VBE_MAX:
value->rValue = here->HICUMvbeMax;
return(OK);
case HICUM_MOD_VBC_MAX:
value->rValue = here->HICUMvbcMax;
return(OK);
case HICUM_MOD_VCE_MAX:
value->rValue = here->HICUMvceMax;
return(OK);
default:
return(E_BADPARM);
}
/* NOTREACHED */
}

View File

@ -0,0 +1,626 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* This routine sets model parameters for
* HICUMs in the circuit.
*/
#include "ngspice/ngspice.h"
#include "ngspice/const.h"
#include "ngspice/ifsim.h"
#include "hicumdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
#define MIN_R 0.001
int
HICUMmParam(int param, IFvalue *value, GENmodel *inModel)
{
HICUMmodel *model = (HICUMmodel*)inModel;
switch(param) {
//Circuit simulator specific parameters
case HICUM_MOD_NPN:
if(value->iValue) {
model->HICUMtype = NPN;
}
break;
case HICUM_MOD_PNP:
if(value->iValue) {
model->HICUMtype = PNP;
}
break;
case HICUM_MOD_TNOM:
model->HICUMtnom = value->rValue+CONSTCtoK;
model->HICUMtnomGiven = TRUE;
break;
//Transfer current
case HICUM_MOD_C10:
model->HICUMc10 = value->rValue;
model->HICUMc10Given = TRUE;
break;
case HICUM_MOD_QP0:
model->HICUMqp0 = value->rValue;
model->HICUMqp0Given = TRUE;
break;
case HICUM_MOD_ICH:
model->HICUMich = value->rValue;
model->HICUMichGiven = TRUE;
break;
case HICUM_MOD_HF0:
model->HICUMhf0 = value->rValue;
model->HICUMhf0Given = TRUE;
break;
case HICUM_MOD_HFE:
model->HICUMhfe = value->rValue;
model->HICUMhfeGiven = TRUE;
break;
case HICUM_MOD_HFC:
model->HICUMhfc = value->rValue;
model->HICUMhfcGiven = TRUE;
break;
case HICUM_MOD_HJEI:
model->HICUMhjei = value->rValue;
model->HICUMhjeiGiven = TRUE;
break;
case HICUM_MOD_AHJEI:
model->HICUMahjei = value->rValue;
model->HICUMahjeiGiven = TRUE;
break;
case HICUM_MOD_RHJEI:
model->HICUMrhjei = value->rValue;
model->HICUMrhjeiGiven = TRUE;
break;
case HICUM_MOD_HJCI:
model->HICUMhjci = value->rValue;
model->HICUMhjciGiven = TRUE;
break;
//Base-Emitter diode:
case HICUM_MOD_IBEIS:
model->HICUMibeis = value->rValue;
model->HICUMibeisGiven = TRUE;
break;
case HICUM_MOD_MBEI:
model->HICUMmbei = value->rValue;
model->HICUMmbeiGiven = TRUE;
break;
case HICUM_MOD_IREIS:
model->HICUMireis = value->rValue;
model->HICUMireisGiven = TRUE;
break;
case HICUM_MOD_MREI:
model->HICUMmrei = value->rValue;
model->HICUMmreiGiven = TRUE;
break;
case HICUM_MOD_IBEPS:
model->HICUMibeps = value->rValue;
model->HICUMibepsGiven = TRUE;
break;
case HICUM_MOD_MBEP:
model->HICUMmbep = value->rValue;
model->HICUMmbepGiven = TRUE;
break;
case HICUM_MOD_IREPS:
model->HICUMireps = value->rValue;
model->HICUMirepsGiven = TRUE;
break;
case HICUM_MOD_MREP:
model->HICUMmrep = value->rValue;
model->HICUMmrepGiven = TRUE;
break;
case HICUM_MOD_MCF:
model->HICUMmcf = value->rValue;
model->HICUMmcfGiven = TRUE;
break;
//Transit time for excess recombination current at b-c barrier
case HICUM_MOD_TBHREC:
model->HICUMtbhrec = value->rValue;
model->HICUMtbhrecGiven = TRUE;
break;
//Base-Collector diode currents
case HICUM_MOD_IBCIS:
model->HICUMibcis = value->rValue;
model->HICUMibcisGiven = TRUE;
break;
case HICUM_MOD_MBCI:
model->HICUMmbci = value->rValue;
model->HICUMmbciGiven = TRUE;
break;
case HICUM_MOD_IBCXS:
model->HICUMibcxs = value->rValue;
model->HICUMibcxsGiven = TRUE;
break;
case HICUM_MOD_MBCX:
model->HICUMmbcx = value->rValue;
model->HICUMmbcxGiven = TRUE;
break;
//Base-Emitter tunneling current
case HICUM_MOD_IBETS:
model->HICUMibets = value->rValue;
model->HICUMibetsGiven = TRUE;
break;
case HICUM_MOD_ABET:
model->HICUMabet = value->rValue;
model->HICUMabetGiven = TRUE;
break;
case HICUM_MOD_TUNODE:
model->HICUMtunode = value->iValue;
model->HICUMtunodeGiven = TRUE;
break;
//Base-Collector avalanche current
case HICUM_MOD_FAVL:
model->HICUMfavl = value->rValue;
model->HICUMfavlGiven = TRUE;
break;
case HICUM_MOD_QAVL:
model->HICUMqavl = value->rValue;
model->HICUMqavlGiven = TRUE;
break;
case HICUM_MOD_ALFAV:
model->HICUMalfav = value->rValue;
model->HICUMalfavGiven = TRUE;
break;
case HICUM_MOD_ALQAV:
model->HICUMalqav = value->rValue;
model->HICUMalqavGiven = TRUE;
break;
//Series resistances
case HICUM_MOD_RBI0:
model->HICUMrbi0 = value->rValue;
if (model->HICUMrbi0 < MIN_R) model->HICUMrbi0 = MIN_R;
model->HICUMrbi0Given = TRUE;
break;
case HICUM_MOD_RBX:
model->HICUMrbx = value->rValue;
if (model->HICUMrbx < MIN_R) model->HICUMrbx = MIN_R;
model->HICUMrbxGiven = TRUE;
break;
case HICUM_MOD_FGEO:
model->HICUMfgeo = value->rValue;
model->HICUMfgeoGiven = TRUE;
break;
case HICUM_MOD_FDQR0:
model->HICUMfdqr0 = value->rValue;
model->HICUMfdqr0Given = TRUE;
break;
case HICUM_MOD_FCRBI:
model->HICUMfcrbi = value->rValue;
model->HICUMfcrbiGiven = TRUE;
break;
case HICUM_MOD_FQI:
model->HICUMfqi = value->rValue;
model->HICUMfqiGiven = TRUE;
break;
case HICUM_MOD_RE:
model->HICUMre = value->rValue;
if (model->HICUMre < MIN_R) model->HICUMre = MIN_R;
model->HICUMreGiven = TRUE;
break;
case HICUM_MOD_RCX:
model->HICUMrcx = value->rValue;
if (model->HICUMrcx < MIN_R) model->HICUMrcx = MIN_R;
model->HICUMrcxGiven = TRUE;
break;
//Substrate transistor
case HICUM_MOD_ITSS:
model->HICUMitss = value->rValue;
model->HICUMitssGiven = TRUE;
break;
case HICUM_MOD_MSF:
model->HICUMmsf = value->rValue;
model->HICUMmsfGiven = TRUE;
break;
case HICUM_MOD_ISCS:
model->HICUMiscs = value->rValue;
model->HICUMiscsGiven = TRUE;
break;
case HICUM_MOD_MSC:
model->HICUMmsc = value->rValue;
model->HICUMmscGiven = TRUE;
break;
case HICUM_MOD_TSF:
model->HICUMtsf = value->rValue;
model->HICUMtsfGiven = TRUE;
break;
//Intra-device substrate coupling
case HICUM_MOD_RSU:
model->HICUMrsu = value->rValue;
if (model->HICUMrsu < MIN_R) model->HICUMrsu = MIN_R;
model->HICUMrsuGiven = TRUE;
break;
case HICUM_MOD_CSU:
//Depletion Capacitances
case HICUM_MOD_CJEI0:
model->HICUMcjei0 = value->rValue;
model->HICUMcjei0Given = TRUE;
break;
case HICUM_MOD_VDEI:
model->HICUMvdei = value->rValue;
model->HICUMvdeiGiven = TRUE;
break;
case HICUM_MOD_ZEI:
model->HICUMzei = value->rValue;
model->HICUMzeiGiven = TRUE;
break;
case HICUM_MOD_AJEI:
model->HICUMajei = value->rValue;
model->HICUMajeiGiven = TRUE;
break;
case HICUM_MOD_CJEP0:
model->HICUMcjep0 = value->rValue;
model->HICUMcjep0Given = TRUE;
break;
case HICUM_MOD_VDEP:
model->HICUMvdep = value->rValue;
model->HICUMvdepGiven = TRUE;
break;
case HICUM_MOD_ZEP:
model->HICUMzep = value->rValue;
model->HICUMzepGiven = TRUE;
break;
case HICUM_MOD_AJEP:
model->HICUMajep = value->rValue;
model->HICUMajepGiven = TRUE;
break;
case HICUM_MOD_CJCI0:
model->HICUMcjci0 = value->rValue;
model->HICUMcjci0Given = TRUE;
break;
case HICUM_MOD_VDCI:
model->HICUMvdci = value->rValue;
model->HICUMvdciGiven = TRUE;
break;
case HICUM_MOD_ZCI:
model->HICUMzci = value->rValue;
model->HICUMzciGiven = TRUE;
break;
case HICUM_MOD_VPTCI:
model->HICUMvptci = value->rValue;
model->HICUMvptciGiven = TRUE;
break;
case HICUM_MOD_CJCX0:
model->HICUMcjcx0 = value->rValue;
model->HICUMcjcx0Given = TRUE;
break;
case HICUM_MOD_VDCX:
model->HICUMvdcx = value->rValue;
model->HICUMvdcxGiven = TRUE;
break;
case HICUM_MOD_ZCX:
model->HICUMzcx = value->rValue;
model->HICUMzcxGiven = TRUE;
break;
case HICUM_MOD_VPTCX:
model->HICUMvptcx = value->rValue;
model->HICUMvptcxGiven = TRUE;
break;
case HICUM_MOD_FBCPAR:
model->HICUMfbcpar = value->rValue;
model->HICUMfbcparGiven = TRUE;
break;
case HICUM_MOD_FBEPAR:
model->HICUMfbepar = value->rValue;
model->HICUMfbeparGiven = TRUE;
break;
case HICUM_MOD_CJS0:
model->HICUMcjs0 = value->rValue;
model->HICUMcjs0Given = TRUE;
break;
case HICUM_MOD_VDS:
model->HICUMvds = value->rValue;
model->HICUMvdsGiven = TRUE;
break;
case HICUM_MOD_ZS:
model->HICUMzs = value->rValue;
model->HICUMzsGiven = TRUE;
break;
case HICUM_MOD_VPTS:
model->HICUMvpts = value->rValue;
model->HICUMvptsGiven = TRUE;
break;
case HICUM_MOD_CSCP0:
model->HICUMcscp0 = value->rValue;
model->HICUMcscp0Given = TRUE;
break;
case HICUM_MOD_VDSP:
model->HICUMvdsp = value->rValue;
model->HICUMvdspGiven = TRUE;
break;
case HICUM_MOD_ZSP:
model->HICUMzsp = value->rValue;
model->HICUMzspGiven = TRUE;
break;
case HICUM_MOD_VPTSP:
model->HICUMvptsp = value->rValue;
model->HICUMvptspGiven = TRUE;
break;
//Diffusion Capacitances
case HICUM_MOD_T0:
model->HICUMt0 = value->rValue;
model->HICUMt0Given = TRUE;
break;
case HICUM_MOD_DT0H:
model->HICUMdt0h = value->rValue;
model->HICUMdt0hGiven = TRUE;
break;
case HICUM_MOD_TBVL:
model->HICUMtbvl = value->rValue;
model->HICUMtbvlGiven = TRUE;
break;
case HICUM_MOD_TEF0:
model->HICUMtef0 = value->rValue;
model->HICUMtef0Given = TRUE;
break;
case HICUM_MOD_GTFE:
model->HICUMgtfe = value->rValue;
model->HICUMgtfeGiven = TRUE;
break;
case HICUM_MOD_THCS:
model->HICUMthcs = value->rValue;
model->HICUMthcsGiven = TRUE;
break;
case HICUM_MOD_AHC:
model->HICUMahc = value->rValue;
model->HICUMahcGiven = TRUE;
break;
case HICUM_MOD_FTHC:
model->HICUMfthc = value->rValue;
model->HICUMfthcGiven = TRUE;
break;
case HICUM_MOD_RCI0:
model->HICUMrci0 = value->rValue;
model->HICUMrci0Given = TRUE;
break;
case HICUM_MOD_VLIM:
model->HICUMvlim = value->rValue;
model->HICUMvlimGiven = TRUE;
break;
case HICUM_MOD_VCES:
model->HICUMvces = value->rValue;
model->HICUMvcesGiven = TRUE;
break;
case HICUM_MOD_VPT:
model->HICUMvpt = value->rValue;
model->HICUMvptGiven = TRUE;
break;
case HICUM_MOD_AICK:
model->HICUMaick = value->rValue;
model->HICUMaickGiven = TRUE;
break;
case HICUM_MOD_DELCK:
model->HICUMdelck = value->rValue;
model->HICUMdelckGiven = TRUE;
break;
case HICUM_MOD_TR:
model->HICUMtr = value->rValue;
model->HICUMtrGiven = TRUE;
break;
case HICUM_MOD_VCBAR:
model->HICUMvcbar = value->rValue;
model->HICUMvcbarGiven = TRUE;
break;
case HICUM_MOD_ICBAR:
model->HICUMicbar = value->rValue;
model->HICUMicbarGiven = TRUE;
break;
case HICUM_MOD_ACBAR:
model->HICUMacbar = value->rValue;
model->HICUMacbarGiven = TRUE;
break;
//Isolation Capacitances
case HICUM_MOD_CBEPAR:
model->HICUMcbepar = value->rValue;
model->HICUMcbeparGiven = TRUE;
break;
case HICUM_MOD_CBCPAR:
model->HICUMcbcpar = value->rValue;
model->HICUMcbcparGiven = TRUE;
break;
//Non-quasi-static Effect
case HICUM_MOD_ALQF:
model->HICUMalqf = value->rValue;
model->HICUMalqfGiven = TRUE;
break;
case HICUM_MOD_ALIT:
model->HICUMalit = value->rValue;
model->HICUMalitGiven = TRUE;
break;
case HICUM_MOD_FLNQS:
model->HICUMflnqs = value->iValue;
model->HICUMflnqsGiven = TRUE;
break;
//Noise
case HICUM_MOD_KF:
model->HICUMkf = value->rValue;
model->HICUMkfGiven = TRUE;
break;
case HICUM_MOD_AF:
model->HICUMaf = value->rValue;
model->HICUMafGiven = TRUE;
break;
case HICUM_MOD_CFBE:
model->HICUMcfbe = value->iValue;
model->HICUMcfbeGiven = TRUE;
break;
case HICUM_MOD_FLCONO:
model->HICUMflcono = value->iValue;
model->HICUMflconoGiven = TRUE;
break;
case HICUM_MOD_KFRE:
model->HICUMkfre = value->rValue;
model->HICUMkfreGiven = TRUE;
break;
case HICUM_MOD_AFRE:
model->HICUMafre = value->rValue;
model->HICUMafreGiven = TRUE;
break;
//Lateral Geometry Scaling (at high current densities)
case HICUM_MOD_LATB:
model->HICUMlatb = value->rValue;
model->HICUMlatbGiven = TRUE;
break;
case HICUM_MOD_LATL:
model->HICUMlatl = value->rValue;
model->HICUMlatlGiven = TRUE;
break;
//Temperature dependence
case HICUM_MOD_VGB:
model->HICUMvgb = value->rValue;
model->HICUMvgbGiven = TRUE;
break;
case HICUM_MOD_ALT0:
model->HICUMalt0 = value->rValue;
model->HICUMalt0Given = TRUE;
break;
case HICUM_MOD_KT0:
model->HICUMkt0 = value->rValue;
model->HICUMkt0Given = TRUE;
break;
case HICUM_MOD_ZETACI:
model->HICUMzetaci = value->rValue;
model->HICUMzetaciGiven = TRUE;
break;
case HICUM_MOD_ALVS:
model->HICUMalvs = value->rValue;
model->HICUMalvsGiven = TRUE;
break;
case HICUM_MOD_ALCES:
model->HICUMalces = value->rValue;
model->HICUMalcesGiven = TRUE;
break;
case HICUM_MOD_ZETARBI:
model->HICUMzetarbi = value->rValue;
model->HICUMzetarbiGiven = TRUE;
break;
case HICUM_MOD_ZETARBX:
model->HICUMzetarbx = value->rValue;
model->HICUMzetarbxGiven = TRUE;
break;
case HICUM_MOD_ZETARCX:
model->HICUMzetarcx = value->rValue;
model->HICUMzetarcxGiven = TRUE;
break;
case HICUM_MOD_ZETARE:
model->HICUMzetare = value->rValue;
model->HICUMzetareGiven = TRUE;
break;
case HICUM_MOD_ZETACX:
model->HICUMzetacx = value->rValue;
model->HICUMzetacxGiven = TRUE;
break;
case HICUM_MOD_VGE:
model->HICUMvge = value->rValue;
model->HICUMvgeGiven = TRUE;
break;
case HICUM_MOD_VGC:
model->HICUMvgc = value->rValue;
model->HICUMvgcGiven = TRUE;
break;
case HICUM_MOD_VGS:
model->HICUMvgs = value->rValue;
model->HICUMvgsGiven = TRUE;
break;
case HICUM_MOD_F1VG:
model->HICUMf1vg = value->rValue;
model->HICUMf1vgGiven = TRUE;
break;
case HICUM_MOD_F2VG:
model->HICUMf2vg = value->rValue;
model->HICUMf2vgGiven = TRUE;
break;
case HICUM_MOD_ZETACT:
model->HICUMzetact = value->rValue;
model->HICUMzetactGiven = TRUE;
break;
case HICUM_MOD_ZETABET:
model->HICUMzetabet = value->rValue;
model->HICUMzetabetGiven = TRUE;
break;
case HICUM_MOD_ALB:
model->HICUMalb = value->rValue;
model->HICUMalbGiven = TRUE;
break;
case HICUM_MOD_DVGBE:
model->HICUMdvgbe = value->rValue;
model->HICUMdvgbeGiven = TRUE;
break;
case HICUM_MOD_ZETAHJEI:
model->HICUMzetahjei = value->rValue;
model->HICUMzetahjeiGiven = TRUE;
break;
case HICUM_MOD_ZETAVGBE:
model->HICUMzetavgbe = value->rValue;
model->HICUMzetavgbeGiven = TRUE;
break;
//Self-Heating
case HICUM_MOD_FLSH:
model->HICUMflsh = value->iValue;
model->HICUMflshGiven = TRUE;
break;
case HICUM_MOD_RTH:
model->HICUMrth = value->rValue;
model->HICUMrthGiven = TRUE;
break;
case HICUM_MOD_ZETARTH:
model->HICUMzetarth = value->rValue;
model->HICUMzetarthGiven = TRUE;
break;
case HICUM_MOD_ALRTH:
model->HICUMalrth = value->rValue;
model->HICUMalrthGiven = TRUE;
break;
case HICUM_MOD_CTH:
model->HICUMcth = value->rValue;
model->HICUMcthGiven = TRUE;
break;
//Compatibility with V2.1
case HICUM_MOD_FLCOMP:
model->HICUMflcomp = value->rValue;
model->HICUMflcompGiven = TRUE;
break;
//SOA-check
case HICUM_MOD_VBE_MAX:
model->HICUMvbeMax = value->rValue;
model->HICUMvbeMaxGiven = TRUE;
break;
case HICUM_MOD_VBC_MAX:
model->HICUMvbcMax = value->rValue;
model->HICUMvbcMaxGiven = TRUE;
break;
case HICUM_MOD_VCE_MAX:
model->HICUMvceMax = value->rValue;
model->HICUMvceMaxGiven = TRUE;
break;
default:
return(E_BADPARM);
}
return(OK);
}

View File

@ -0,0 +1,252 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1987 Gary W. Ng
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
#include "ngspice/ngspice.h"
#include "hicumdefs.h"
#include "ngspice/cktdefs.h"
#include "ngspice/iferrmsg.h"
#include "ngspice/noisedef.h"
#include "ngspice/suffix.h"
/*
* HICUMnoise (mode, operation, firstModel, ckt, data, OnDens)
*
* This routine names and evaluates all of the noise sources
* associated with HICUM's. It starts with the model *firstModel and
* traverses all of its insts. It then proceeds to any other models
* on the linked list. The total output noise density generated by
* all of the HICUM's is summed with the variable "OnDens".
*/
int
HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens)
{
NOISEAN *job = (NOISEAN *) ckt->CKTcurJob;
HICUMmodel *firstModel = (HICUMmodel *) genmodel;
HICUMmodel *model;
HICUMinstance *inst;
double tempOnoise;
double tempInoise;
double noizDens[HICUMNSRCS];
double lnNdens[HICUMNSRCS];
int i;
double Ibbp_Vbbp;
double Icic_Vcic;
double Ieie_Veie;
double Isis_Vsis;
/* define the names of the noise sources */
static char *HICUMnNames[HICUMNSRCS] = {
/* Note that we have to keep the order consistent with the
strchr definitions in HICUMdefs.h */
"_rc", /* noise due to rc */
"_rb", /* noise due to rb */
"_rbi", /* noise due to rbi */
"_re", /* noise due to re */
"_rs", /* noise due to rs */
"_ic", /* noise due to ic */
"_ibc", /* noise due to ib */
"_ibep", /* noise due to ibep */
"_its", /* noise due to iccp */
"_1overfbe", /* flicker (1/f) noise ibe */
"_1overfbep", /* flicker (1/f) noise re */
"" /* total transistor noise */
};
for (model=firstModel; model != NULL; model=HICUMnextModel(model)) {
for (inst=HICUMinstances(model); inst != NULL;
inst=HICUMnextInstance(inst)) {
Ibbp_Vbbp = 1/inst->HICUMrbx_t;
Icic_Vcic = 1/inst->HICUMrcx_t;
Ieie_Veie = 1/inst->HICUMre_t;
Isis_Vsis = 1/model->HICUMrsu;
switch (operation) {
case N_OPEN:
/* see if we have to to produce a summary report */
/* if so, name all the noise generators */
if (job->NStpsSm != 0) {
switch (mode) {
case N_DENS:
for (i=0; i < HICUMNSRCS; i++) {
NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->HICUMname, HICUMnNames[i]);
}
break;
case INT_NOIZ:
for (i=0; i < HICUMNSRCS; i++) {
NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->HICUMname, HICUMnNames[i]);
NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->HICUMname, HICUMnNames[i]);
}
break;
}
}
break;
case N_CALC:
switch (mode) {
case N_DENS:
NevalSrc(&noizDens[HICUMRCNOIZ],&lnNdens[HICUMRCNOIZ],
ckt,THERMNOISE,inst->HICUMcollCINode,inst->HICUMcollNode,
Icic_Vcic);
NevalSrc(&noizDens[HICUMRBNOIZ],&lnNdens[HICUMRBNOIZ],
ckt,THERMNOISE,inst->HICUMbaseBPNode,inst->HICUMbaseNode,
Ibbp_Vbbp);
NevalSrc(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ],
ckt,THERMNOISE,inst->HICUMbaseBPNode,inst->HICUMbaseBINode,
*(ckt->CKTstate0 + inst->HICUMibpbi_Vbpbi));
NevalSrc(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ],
ckt,THERMNOISE,inst->HICUMemitEINode,inst->HICUMemitNode,
Ieie_Veie);
NevalSrc(&noizDens[HICUMRSNOIZ],&lnNdens[HICUMRSNOIZ],
ckt,THERMNOISE,inst->HICUMsubsSINode,inst->HICUMsubsNode,
Isis_Vsis);
NevalSrc(&noizDens[HICUMICNOIZ],&lnNdens[HICUMICNOIZ],
ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMemitEINode,
*(ckt->CKTstate0 + inst->HICUMiciei));
NevalSrc(&noizDens[HICUMIBCNOIZ],&lnNdens[HICUMIBCNOIZ],
ckt,SHOTNOISE,inst->HICUMbaseBINode,inst->HICUMcollCINode,
*(ckt->CKTstate0 + inst->HICUMibici));
NevalSrc(&noizDens[HICUMIBEPNOIZ],&lnNdens[HICUMIBEPNOIZ],
ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMemitEINode,
*(ckt->CKTstate0 + inst->HICUMibpei));
NevalSrc(&noizDens[HICUMIBCXNOIZ],&lnNdens[HICUMIBCXNOIZ],
ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMcollCINode,
*(ckt->CKTstate0 + inst->HICUMibpci));
NevalSrc(&noizDens[HICUMITSNOIZ],&lnNdens[HICUMITSNOIZ],
ckt,SHOTNOISE,inst->HICUMsubsSINode,inst->HICUMcollCINode,
*(ckt->CKTstate0 + inst->HICUMisici));
NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt,
N_GAIN,inst->HICUMbaseBINode, inst->HICUMemitEINode,
(double)0.0);
noizDens[HICUMFLBENOIZ] *= inst->HICUMm * model->HICUMkf *
exp(model->HICUMaf *
log(MAX(fabs((*(ckt->CKTstate0 + inst->HICUMibiei)+*(ckt->CKTstate0 + inst->HICUMibpei))/inst->HICUMm),N_MINLOG))) /
data->freq;
lnNdens[HICUMFLBENOIZ] =
log(MAX(noizDens[HICUMFLBENOIZ],N_MINLOG));
NevalSrc(&noizDens[HICUMFLRENOIZ], NULL, ckt,
N_GAIN,inst->HICUMemitNode, inst->HICUMemitEINode,
(double)0.0);
noizDens[HICUMFLRENOIZ] *= inst->HICUMm * model->HICUMkfre *
exp(model->HICUMafre *
log(MAX(fabs(*(ckt->CKTstate0 + inst->HICUMieie)/inst->HICUMm),N_MINLOG))) /
data->freq;
lnNdens[HICUMFLRENOIZ] =
log(MAX(noizDens[HICUMFLRENOIZ],N_MINLOG));
noizDens[HICUMTOTNOIZ] = noizDens[HICUMRCNOIZ] +
noizDens[HICUMRBNOIZ] +
noizDens[HICUMRBINOIZ] +
noizDens[HICUMRENOIZ] +
noizDens[HICUMRSNOIZ] +
noizDens[HICUMICNOIZ] +
noizDens[HICUMIBCNOIZ] +
noizDens[HICUMIBEPNOIZ] +
noizDens[HICUMIBCXNOIZ] +
noizDens[HICUMITSNOIZ] +
noizDens[HICUMFLBENOIZ] +
noizDens[HICUMFLRENOIZ];
lnNdens[HICUMTOTNOIZ] =
log(noizDens[HICUMTOTNOIZ]);
*OnDens += noizDens[HICUMTOTNOIZ];
if (data->delFreq == 0.0) {
/* if we haven't done any previous integration, we need to */
/* initialize our "history" variables */
for (i=0; i < HICUMNSRCS; i++) {
inst->HICUMnVar[LNLSTDENS][i] = lnNdens[i];
}
/* clear out our integration variables if it's the first pass */
if (data->freq == job->NstartFreq) {
for (i=0; i < HICUMNSRCS; i++) {
inst->HICUMnVar[OUTNOIZ][i] = 0.0;
inst->HICUMnVar[INNOIZ][i] = 0.0;
}
}
} else { /* data->delFreq != 0.0 (we have to integrate) */
/* In order to get the best curve fit, we have to integrate each component separately */
for (i=0; i < HICUMNSRCS; i++) {
if (i != HICUMTOTNOIZ) {
tempOnoise = Nintegrate(noizDens[i], lnNdens[i],
inst->HICUMnVar[LNLSTDENS][i], data);
tempInoise = Nintegrate(noizDens[i] * data->GainSqInv ,
lnNdens[i] + data->lnGainInv,
inst->HICUMnVar[LNLSTDENS][i] + data->lnGainInv,
data);
inst->HICUMnVar[LNLSTDENS][i] = lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if (job->NStpsSm != 0) {
inst->HICUMnVar[OUTNOIZ][i] += tempOnoise;
inst->HICUMnVar[OUTNOIZ][HICUMTOTNOIZ] += tempOnoise;
inst->HICUMnVar[INNOIZ][i] += tempInoise;
inst->HICUMnVar[INNOIZ][HICUMTOTNOIZ] += tempInoise;
}
}
}
}
if (data->prtSummary) {
for (i=0; i < HICUMNSRCS; i++) { /* print a summary report */
data->outpVector[data->outNumber++] = noizDens[i];
}
}
break;
case INT_NOIZ: /* already calculated, just output */
if (job->NStpsSm != 0) {
for (i=0; i < HICUMNSRCS; i++) {
data->outpVector[data->outNumber++] = inst->HICUMnVar[OUTNOIZ][i];
data->outpVector[data->outNumber++] = inst->HICUMnVar[INNOIZ][i];
}
} /* if */
break;
} /* switch (mode) */
break;
case N_CLOSE:
return (OK); /* do nothing, the main calling routine will close */
break; /* the plots */
} /* switch (operation) */
} /* for inst */
} /* for model */
return(OK);
}

View File

@ -0,0 +1,74 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* This routine sets instance parameters for
* HICUMs in the circuit.
*/
#include "ngspice/ngspice.h"
#include "ngspice/const.h"
#include "ngspice/ifsim.h"
#include "hicumdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
/* ARGSUSED */
int
HICUMparam(int param, IFvalue *value, GENinstance *instPtr, IFvalue *select)
{
HICUMinstance *here = (HICUMinstance*)instPtr;
NG_IGNORE(select);
switch(param) {
case HICUM_AREA:
here->HICUMarea = value->rValue;
here->HICUMareaGiven = TRUE;
break;
case HICUM_OFF:
here->HICUMoff = (value->iValue != 0);
break;
case HICUM_IC_VBE:
here->HICUMicVBE = value->rValue;
here->HICUMicVBEGiven = TRUE;
break;
case HICUM_IC_VCE:
here->HICUMicVCE = value->rValue;
here->HICUMicVCEGiven = TRUE;
break;
case HICUM_TEMP:
here->HICUMtemp = value->rValue+CONSTCtoK;
here->HICUMtempGiven = TRUE;
break;
case HICUM_DTEMP:
here->HICUMdtemp = value->rValue;
here->HICUMdtempGiven = TRUE;
break;
case HICUM_M:
here->HICUMm = value->rValue;
here->HICUMmGiven = TRUE;
break;
case HICUM_IC :
switch(value->v.numValue) {
case 2:
here->HICUMicVCE = *(value->v.vec.rVec+1);
here->HICUMicVCEGiven = TRUE;
case 1:
here->HICUMicVBE = *(value->v.vec.rVec);
here->HICUMicVBEGiven = TRUE;
break;
default:
return(E_BADPARM);
}
break;
default:
return(E_BADPARM);
}
return(OK);
}

View File

@ -0,0 +1,392 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* Function to load the COMPLEX circuit matrix using the
* small signal parameters saved during a previous DC operating
* point analysis.
*/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "hicumdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
{
HICUMinstance *here;
HICUMmodel *model = (HICUMmodel*)inModel;
double Ibpei_Vbpei;
double Ibiei_Vbiei;
double Ibici_Vbici;
double Ibpci_Vbpci;
double Isici_Vsici;
double Iciei_Vbiei;
double Iciei_Vbici;
double Ibbp_Vbbp;
double Isis_Vsis;
double Ieie_Veie;
double Ibpbi_Vbpbi, Ibpbi_Vciei, Ibpbi_Vbiei;
double Ibpsi_Vbpci, Ibpsi_Vsici;
double Icic_Vcic;
double XQrbi_Vbpbi;
// double XQrbi_Vbiei;
// double XQrbi_Vbici;
double XQdeix_Vbiei;
double XQjei_Vbiei;
double XQdci_Vbici;
double XQjci_Vbici;
double XQjep_Vbpei;
double Xqjcx0_t_i_Vbci;
double Xqjcx0_t_ii_Vbpci;
double XQdsu_Vbpci;
// double XQdsu_Vsici;
double XQjs_Vsici;
double XQscp_Vsc;
double XQbepar1_Vbe;
double XQbepar2_Vbpe;
double XQbcpar1_Vbci;
double XQbcpar2_Vbpci;
double XQsu_Vsis;
/* loop through all the models */
for( ; model != NULL; model = HICUMnextModel(model)) {
/* loop through all the instances of the model */
for( here = HICUMinstances(model); here!= NULL;
here = HICUMnextInstance(here)) {
Ibbp_Vbbp = 1/here->HICUMrbx_t;
Icic_Vcic = 1/here->HICUMrcx_t;
Ieie_Veie = 1/here->HICUMre_t;
Isis_Vsis = 1/model->HICUMrsu;
Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei);
Ibpei_Vbpei = *(ckt->CKTstate0 + here->HICUMibpei_Vbpei);
Iciei_Vbiei = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei);
Iciei_Vbici = *(ckt->CKTstate0 + here->HICUMiciei_Vbici);
Ibici_Vbici = *(ckt->CKTstate0 + here->HICUMibici_Vbici);
Ibpbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi);
Ibpbi_Vbiei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei);
Ibpbi_Vciei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbici);
Isici_Vsici = *(ckt->CKTstate0 + here->HICUMisici_Vsici);
Ibpsi_Vbpci = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci);
Ibpsi_Vsici = *(ckt->CKTstate0 + here->HICUMibpsi_Vsici);
Ibpci_Vbpci = *(ckt->CKTstate0 + here->HICUMibpci_Vbpci);
/*
c The real part
*/
/*
c Stamp element: Ibiei
*/
*(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbiei;
*(here->HICUMbaseBIEmitEIPtr) += -Ibiei_Vbiei;
*(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbiei;
*(here->HICUMemitEIEmitEIPtr) += Ibiei_Vbiei;
/*
c Stamp element: Ibpei
*/
*(here->HICUMbaseBPBaseBPPtr) += Ibpei_Vbpei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpei_Vbpei;
*(here->HICUMemitEIBaseBPPtr) += -Ibpei_Vbpei;
*(here->HICUMemitEIEmitEIPtr) += Ibpei_Vbpei;
/*
c Stamp element: Iciei
*/
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbiei;
*(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei;
*(here->HICUMemitEIEmitEIPtr) += Iciei_Vbiei;
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici;
*(here->HICUMcollCICollCIPtr) += -Iciei_Vbici;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici;
*(here->HICUMemitEICollCIPtr) += Iciei_Vbici;
/*
c Stamp element: Ibici
*/
*(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici;
*(here->HICUMbaseBICollCIPtr) += -Ibici_Vbici;
*(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbici;
*(here->HICUMcollCICollCIPtr) += Ibici_Vbici;
/*
c Stamp element: Ibpci
*/
*(here->HICUMbaseBPCollCIPtr) += Ibpci_Vbpci;
*(here->HICUMbaseBPBaseBPPtr) += -Ibpci_Vbpci;
*(here->HICUMcollCIBaseBPPtr) += -Ibpci_Vbpci;
*(here->HICUMcollCICollCIPtr) += Ibpci_Vbpci;
/*
c Stamp element: Rcx
*/
*(here->HICUMcollCollPtr) += Icic_Vcic;
*(here->HICUMcollCICollPtr) += -Icic_Vcic;
*(here->HICUMcollCollCIPtr) += -Icic_Vcic;
*(here->HICUMcollCICollCIPtr) += Icic_Vcic;
/*
c Stamp element: Rbx
*/
*(here->HICUMbaseBasePtr) += Ibbp_Vbbp;
*(here->HICUMbaseBPBasePtr) += -Ibbp_Vbbp;
*(here->HICUMbaseBaseBPPtr) += -Ibbp_Vbbp;
*(here->HICUMbaseBPBaseBPPtr) += Ibbp_Vbbp;
/*
c Stamp element: Ibpbi
*/
*(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi;
*(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi;
*(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei;
*(here->HICUMbaseBPCollCIPtr) += Ibpbi_Vciei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vciei;
*(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi;
*(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi;
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei;
*(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei;
*(here->HICUMbaseBICollCIPtr) += -Ibpbi_Vciei;
*(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vciei;
/*
c Stamp element: Re
*/
*(here->HICUMemitEmitPtr) += Ieie_Veie;
*(here->HICUMemitEIEmitPtr) += -Ieie_Veie;
*(here->HICUMemitEmitEIPtr) += -Ieie_Veie;
*(here->HICUMemitEIEmitEIPtr) += Ieie_Veie;
/*
c Stamp element: Isici
*/
*(here->HICUMsubsSISubsSIPtr) += Isici_Vsici;
*(here->HICUMsubsSICollCIPtr) += -Isici_Vsici;
*(here->HICUMcollCISubsSIPtr) += -Isici_Vsici;
*(here->HICUMcollCICollCIPtr) += Isici_Vsici;
/*
c Stamp element: Ibpsi
*/
*(here->HICUMbaseBPBaseBPPtr) += Ibpsi_Vbpci;
*(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vbpci;
*(here->HICUMbaseBPSubsSIPtr) += Ibpsi_Vsici;
*(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vsici;
*(here->HICUMsubsSIBaseBPPtr) += -Ibpsi_Vbpci;
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vbpci;
*(here->HICUMsubsSISubsSIPtr) += -Ibpsi_Vsici;
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vsici;
/*
c Stamp element: Rs
*/
*(here->HICUMsubsSubsPtr) += Isis_Vsis;
*(here->HICUMsubsSISubsPtr) += -Isis_Vsis;
*(here->HICUMsubsSubsSIPtr) += -Isis_Vsis;
*(here->HICUMsubsSISubsSIPtr) += Isis_Vsis;
/*
c The complex part
*/
//todo: Complete with partial dervatives e.g. Qjs_Vsici, Qrbi_Vbici
XQrbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMcqrbi) * ckt->CKTomega;
XQdeix_Vbiei = *(ckt->CKTstate0 + here->HICUMcqdeix) * ckt->CKTomega;
XQjei_Vbiei = *(ckt->CKTstate0 + here->HICUMcqjei) * ckt->CKTomega;
XQdci_Vbici = *(ckt->CKTstate0 + here->HICUMcqdci) * ckt->CKTomega;
XQjci_Vbici = *(ckt->CKTstate0 + here->HICUMcqjci) * ckt->CKTomega;
XQjep_Vbpei = *(ckt->CKTstate0 + here->HICUMcqjep) * ckt->CKTomega;
Xqjcx0_t_i_Vbci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_i) * ckt->CKTomega;
Xqjcx0_t_ii_Vbpci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii) * ckt->CKTomega;
XQdsu_Vbpci = *(ckt->CKTstate0 + here->HICUMcqdsu) * ckt->CKTomega;
XQjs_Vsici = *(ckt->CKTstate0 + here->HICUMcqjs) * ckt->CKTomega;
XQscp_Vsc = *(ckt->CKTstate0 + here->HICUMcqscp) * ckt->CKTomega;
XQbepar1_Vbe = *(ckt->CKTstate0 + here->HICUMcqbepar1) * ckt->CKTomega;
XQbepar2_Vbpe = *(ckt->CKTstate0 + here->HICUMcqbepar2) * ckt->CKTomega;
XQbcpar1_Vbci = *(ckt->CKTstate0 + here->HICUMcqbcpar1) * ckt->CKTomega;
XQbcpar2_Vbpci = *(ckt->CKTstate0 + here->HICUMcqbcpar2) * ckt->CKTomega;
XQsu_Vsis = *(ckt->CKTstate0 + here->HICUMcqsu) * ckt->CKTomega;
/*
c Stamp element: Qbepar1
*/
*(here->HICUMbaseBasePtr) += XQbepar1_Vbe * (s->real);
*(here->HICUMbaseEmitPtr) += -XQbepar1_Vbe * (s->real);
*(here->HICUMemitBasePtr) += -XQbepar1_Vbe * (s->real);
*(here->HICUMemitEmitPtr) += XQbepar1_Vbe * (s->real);
*(here->HICUMbaseBasePtr + 1) += XQbepar1_Vbe * (s->imag);
*(here->HICUMbaseEmitPtr + 1) += -XQbepar1_Vbe * (s->imag);
*(here->HICUMemitBasePtr + 1) += -XQbepar1_Vbe * (s->imag);
*(here->HICUMemitEmitPtr + 1) += XQbepar1_Vbe * (s->imag);
/*
c Stamp element: Qbepar2
*/
*(here->HICUMbaseBPBaseBPPtr) += XQbepar2_Vbpe * (s->real);
*(here->HICUMemitBaseBPPtr) += -XQbepar2_Vbpe * (s->real);
*(here->HICUMemitEmitPtr) += -XQbepar2_Vbpe * (s->real);
*(here->HICUMbaseBPEmitPtr) += XQbepar2_Vbpe * (s->real);
*(here->HICUMbaseBPBaseBPPtr + 1) += XQbepar2_Vbpe * (s->imag);
*(here->HICUMemitBaseBPPtr + 1) += -XQbepar2_Vbpe * (s->imag);
*(here->HICUMemitEmitPtr + 1) += -XQbepar2_Vbpe * (s->imag);
*(here->HICUMbaseBPEmitPtr + 1) += XQbepar2_Vbpe * (s->imag);
/*
c Stamp element: Qdeix, Qjei
*/
*(here->HICUMbaseBIBaseBIPtr) += XQdeix_Vbiei * (s->real);
*(here->HICUMbaseBIEmitEIPtr) += -XQdeix_Vbiei * (s->real);
*(here->HICUMemitEIBaseBIPtr) += -XQdeix_Vbiei * (s->real);
*(here->HICUMemitEIEmitEIPtr) += XQdeix_Vbiei * (s->real);
*(here->HICUMbaseBIBaseBIPtr + 1) += XQdeix_Vbiei * (s->imag);
*(here->HICUMbaseBIEmitEIPtr + 1) += -XQdeix_Vbiei * (s->imag);
*(here->HICUMemitEIBaseBIPtr + 1) += -XQdeix_Vbiei * (s->imag);
*(here->HICUMemitEIEmitEIPtr + 1) += XQdeix_Vbiei * (s->imag);
*(here->HICUMbaseBIBaseBIPtr) += XQjei_Vbiei * (s->real);
*(here->HICUMbaseBIEmitEIPtr) += -XQjei_Vbiei * (s->real);
*(here->HICUMemitEIBaseBIPtr) += -XQjei_Vbiei * (s->real);
*(here->HICUMemitEIEmitEIPtr) += XQjei_Vbiei * (s->real);
*(here->HICUMbaseBIBaseBIPtr + 1) += XQjei_Vbiei * (s->imag);
*(here->HICUMbaseBIEmitEIPtr + 1) += -XQjei_Vbiei * (s->imag);
*(here->HICUMemitEIBaseBIPtr + 1) += -XQjei_Vbiei * (s->imag);
*(here->HICUMemitEIEmitEIPtr + 1) += XQjei_Vbiei * (s->imag);
/*
c Stamp element: Qjep
*/
*(here->HICUMbaseBPBaseBPPtr) += XQjep_Vbpei * (s->real);
*(here->HICUMbaseBPEmitEIPtr) += -XQjep_Vbpei * (s->real);
*(here->HICUMemitEIBaseBPPtr) += -XQjep_Vbpei * (s->real);
*(here->HICUMemitEIEmitEIPtr) += XQjep_Vbpei * (s->real);
*(here->HICUMbaseBPBaseBPPtr + 1) += XQjep_Vbpei * (s->imag);
*(here->HICUMbaseBPEmitEIPtr + 1) += -XQjep_Vbpei * (s->imag);
*(here->HICUMemitEIBaseBPPtr + 1) += -XQjep_Vbpei * (s->imag);
*(here->HICUMemitEIEmitEIPtr + 1) += XQjep_Vbpei * (s->imag);
/*
c Stamp element: Qdci, Qjci
*/
*(here->HICUMbaseBIBaseBIPtr) += XQdci_Vbici * (s->real);
*(here->HICUMbaseBICollCIPtr) += -XQdci_Vbici * (s->real);
*(here->HICUMcollCIBaseBIPtr) += -XQdci_Vbici * (s->real);
*(here->HICUMcollCICollCIPtr) += XQdci_Vbici * (s->real);
*(here->HICUMbaseBIBaseBIPtr + 1) += XQdci_Vbici * (s->imag);
*(here->HICUMbaseBICollCIPtr + 1) += -XQdci_Vbici * (s->imag);
*(here->HICUMcollCIBaseBIPtr + 1) += -XQdci_Vbici * (s->imag);
*(here->HICUMcollCICollCIPtr + 1) += XQdci_Vbici * (s->imag);
*(here->HICUMbaseBIBaseBIPtr) += XQjci_Vbici * (s->real);
*(here->HICUMbaseBICollCIPtr) += -XQjci_Vbici * (s->real);
*(here->HICUMcollCIBaseBIPtr) += -XQjci_Vbici * (s->real);
*(here->HICUMcollCICollCIPtr) += XQjci_Vbici * (s->real);
*(here->HICUMbaseBIBaseBIPtr + 1) += XQjci_Vbici * (s->imag);
*(here->HICUMbaseBICollCIPtr + 1) += -XQjci_Vbici * (s->imag);
*(here->HICUMcollCIBaseBIPtr + 1) += -XQjci_Vbici * (s->imag);
*(here->HICUMcollCICollCIPtr + 1) += XQjci_Vbici * (s->imag);
/*
c Stamp element: Qbcpar1, qjcx0_i
*/
*(here->HICUMbaseBasePtr) += XQbcpar1_Vbci * (s->real);
*(here->HICUMbaseCollCIPtr) += -XQbcpar1_Vbci * (s->real);
*(here->HICUMcollCIBasePtr) += -XQbcpar1_Vbci * (s->real);
*(here->HICUMcollCICollCIPtr) += XQbcpar1_Vbci * (s->real);
*(here->HICUMbaseBasePtr + 1) += XQbcpar1_Vbci * (s->imag);
*(here->HICUMbaseCollCIPtr + 1) += -XQbcpar1_Vbci * (s->imag);
*(here->HICUMcollCIBasePtr + 1) += -XQbcpar1_Vbci * (s->imag);
*(here->HICUMcollCICollCIPtr + 1) += XQbcpar1_Vbci * (s->imag);
*(here->HICUMbaseBasePtr) += Xqjcx0_t_i_Vbci * (s->real);
*(here->HICUMbaseCollCIPtr) += -Xqjcx0_t_i_Vbci * (s->real);
*(here->HICUMcollCIBasePtr) += -Xqjcx0_t_i_Vbci * (s->real);
*(here->HICUMcollCICollCIPtr) += Xqjcx0_t_i_Vbci * (s->real);
*(here->HICUMbaseBasePtr + 1) += Xqjcx0_t_i_Vbci * (s->imag);
*(here->HICUMbaseCollCIPtr + 1) += -Xqjcx0_t_i_Vbci * (s->imag);
*(here->HICUMcollCIBasePtr + 1) += -Xqjcx0_t_i_Vbci * (s->imag);
*(here->HICUMcollCICollCIPtr + 1) += Xqjcx0_t_i_Vbci * (s->imag);
/*
c Stamp element: Qbcpar2, qjcx0_ii, Qdsu
*/
*(here->HICUMbaseBPBaseBPPtr) += XQbcpar2_Vbpci * (s->real);
*(here->HICUMcollCICollCIPtr) += XQbcpar2_Vbpci * (s->real);
*(here->HICUMbaseBPCollCIPtr) += -XQbcpar2_Vbpci * (s->real);
*(here->HICUMcollCIBaseBPPtr) += -XQbcpar2_Vbpci * (s->real);
*(here->HICUMbaseBPBaseBPPtr + 1) += XQbcpar2_Vbpci * (s->imag);
*(here->HICUMcollCICollCIPtr + 1) += XQbcpar2_Vbpci * (s->imag);
*(here->HICUMbaseBPCollCIPtr + 1) += -XQbcpar2_Vbpci * (s->imag);
*(here->HICUMcollCIBaseBPPtr + 1) += -XQbcpar2_Vbpci * (s->imag);
*(here->HICUMbaseBPCollCIPtr) += Xqjcx0_t_ii_Vbpci * (s->real);
*(here->HICUMbaseBPBaseBPPtr) += -Xqjcx0_t_ii_Vbpci * (s->real);
*(here->HICUMcollCIBaseBPPtr) += -Xqjcx0_t_ii_Vbpci * (s->real);
*(here->HICUMcollCICollCIPtr) += Xqjcx0_t_ii_Vbpci * (s->real);
*(here->HICUMbaseBPCollCIPtr + 1) += Xqjcx0_t_ii_Vbpci * (s->imag);
*(here->HICUMbaseBPBaseBPPtr + 1) += -Xqjcx0_t_ii_Vbpci * (s->imag);
*(here->HICUMcollCIBaseBPPtr + 1) += -Xqjcx0_t_ii_Vbpci * (s->imag);
*(here->HICUMcollCICollCIPtr + 1) += Xqjcx0_t_ii_Vbpci * (s->imag);
*(here->HICUMbaseBPCollCIPtr) += XQdsu_Vbpci * (s->real);
*(here->HICUMbaseBPBaseBPPtr) += -XQdsu_Vbpci * (s->real);
*(here->HICUMcollCIBaseBPPtr) += -XQdsu_Vbpci * (s->real);
*(here->HICUMcollCICollCIPtr) += XQdsu_Vbpci * (s->real);
*(here->HICUMbaseBPCollCIPtr + 1) += XQdsu_Vbpci * (s->imag);
*(here->HICUMbaseBPBaseBPPtr + 1) += -XQdsu_Vbpci * (s->imag);
*(here->HICUMcollCIBaseBPPtr + 1) += -XQdsu_Vbpci * (s->imag);
*(here->HICUMcollCICollCIPtr + 1) += XQdsu_Vbpci * (s->imag);
/*
c Stamp element: Qrbi
*/
*(here->HICUMbaseBPBaseBPPtr) += XQrbi_Vbpbi * (s->real);
*(here->HICUMbaseBPBaseBIPtr) += -XQrbi_Vbpbi * (s->real);
*(here->HICUMbaseBIBaseBPPtr) += -XQrbi_Vbpbi * (s->real);
*(here->HICUMbaseBIBaseBIPtr) += XQrbi_Vbpbi * (s->real);
*(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi * (s->imag);
*(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi * (s->imag);
*(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi * (s->imag);
*(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi * (s->imag);
//todo:
// *(here->HICUMbaseBPBaseBIPtr) += XQrbi_Vbiei * (s->real);
// *(here->HICUMbaseBPEmitEIPtr) += -XQrbi_Vbiei * (s->real);
// *(here->HICUMbaseBIBaseBIPtr) += -XQrbi_Vbiei * (s->real);
// *(here->HICUMbaseBIEmitEIPtr) += XQrbi_Vbiei * (s->real);
// *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei * (s->imag);
// *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei * (s->imag);
// *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei * (s->imag);
// *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei * (s->imag);
// *(here->HICUMbaseBPCollCIPtr) += XQrbi_Vbici * (s->real);
// *(here->HICUMbaseBPEmitEIPtr) += -XQrbi_Vbici * (s->real);
// *(here->HICUMbaseBICollCIPtr) += -XQrbi_Vbici * (s->real);
// *(here->HICUMbaseBIEmitEIPtr) += XQrbi_Vbici * (s->real);
// *(here->HICUMbaseBPCollCIPtr + 1) += XQrbi_Vbici * (s->imag);
// *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbici * (s->imag);
// *(here->HICUMbaseBICollCIPtr + 1) += -XQrbi_Vbici * (s->imag);
// *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbici * (s->imag);
/*
c Stamp element: Cscp
*/
*(here->HICUMsubsSubsPtr) += XQscp_Vsc * (s->real);
*(here->HICUMcollSubsPtr) += -XQscp_Vsc * (s->real);
*(here->HICUMcollCollPtr) += -XQscp_Vsc * (s->real);
*(here->HICUMsubsCollPtr) += XQscp_Vsc * (s->real);
*(here->HICUMsubsSubsPtr + 1) += XQscp_Vsc * (s->imag);
*(here->HICUMcollSubsPtr + 1) += -XQscp_Vsc * (s->imag);
*(here->HICUMcollCollPtr + 1) += -XQscp_Vsc * (s->imag);
*(here->HICUMsubsCollPtr + 1) += XQscp_Vsc * (s->imag);
/*
c Stamp element: Cjs
*/
*(here->HICUMsubsSISubsSIPtr) += XQjs_Vsici * (s->real);
*(here->HICUMsubsSICollCIPtr) += -XQjs_Vsici * (s->real);
*(here->HICUMcollCISubsSIPtr) += -XQjs_Vsici * (s->real);
*(here->HICUMcollCICollCIPtr) += XQjs_Vsici * (s->real);
*(here->HICUMsubsSISubsSIPtr + 1) += XQjs_Vsici * (s->imag);
*(here->HICUMsubsSICollCIPtr + 1) += -XQjs_Vsici * (s->imag);
*(here->HICUMcollCISubsSIPtr + 1) += -XQjs_Vsici * (s->imag);
*(here->HICUMcollCICollCIPtr + 1) += XQjs_Vsici * (s->imag);
/*
c Stamp element: Csu
*/
*(here->HICUMsubsSubsPtr) += XQsu_Vsis * (s->real);
*(here->HICUMsubsSISubsPtr) += -XQsu_Vsis * (s->real);
*(here->HICUMsubsSubsSIPtr) += -XQsu_Vsis * (s->real);
*(here->HICUMsubsSISubsSIPtr) += XQsu_Vsis * (s->real);
*(here->HICUMsubsSubsPtr + 1) += XQsu_Vsis * (s->imag);
*(here->HICUMsubsSISubsPtr + 1) += -XQsu_Vsis * (s->imag);
*(here->HICUMsubsSubsSIPtr + 1) += -XQsu_Vsis * (s->imag);
*(here->HICUMsubsSISubsSIPtr + 1) += XQsu_Vsis * (s->imag);
}
}
return(OK);
}

View File

@ -0,0 +1,708 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* This routine should only be called when circuit topology
* changes, since its computations do not depend on most
* device or model parameters, only on topology (as
* affected by emitter, collector, and base resistances)
*/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "ngspice/smpdefs.h"
#include "hicumdefs.h"
#include "ngspice/const.h"
#include "ngspice/sperror.h"
#include "ngspice/ifsim.h"
#include "ngspice/suffix.h"
#define MIN_R 0.001
int
HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
/* load the HICUM structure with those pointers needed later
* for fast matrix loading
*/
{
HICUMmodel *model = (HICUMmodel*)inModel;
HICUMinstance *here;
int error;
CKTnode *tmp;
/* loop through all the transistor models */
for( ; model != NULL; model = HICUMnextModel(model)) {
//Circuit simulator specific parameters
if(model->HICUMtype != NPN && model->HICUMtype != PNP) {
model->HICUMtype = NPN;
}
if(!model->HICUMtnomGiven) {
model->HICUMtnom = 27.0;
}
//Transfer current
if(!model->HICUMc10Given) {
model->HICUMc10 = 2e-30;
}
if(!model->HICUMqp0Given) {
model->HICUMqp0 = 2e-14;
}
if(!model->HICUMichGiven) {
model->HICUMich = 0.0;
}
if(!model->HICUMhf0Given) {
model->HICUMhf0 = 1.0;
}
if(!model->HICUMhfeGiven) {
model->HICUMhfe = 1.0;
}
if(!model->HICUMhfcGiven) {
model->HICUMhfc = 1.0;
}
if(!model->HICUMhjeiGiven) {
model->HICUMhjei = 1.0;
}
if(!model->HICUMahjeiGiven) {
model->HICUMahjei = 0.0;
}
if(!model->HICUMrhjeiGiven) {
model->HICUMrhjei = 1.0;
}
if(!model->HICUMhjciGiven) {
model->HICUMhjci = 1.0;
}
//Base-Emitter diode;
if(!model->HICUMibeisGiven) {
model->HICUMibeis = 1e-18;
}
if(!model->HICUMmbeiGiven) {
model->HICUMmbei = 1.0;
}
if(!model->HICUMireisGiven) {
model->HICUMireis = 0.0;
}
if(!model->HICUMmreiGiven) {
model->HICUMmrei = 2.0;
}
if(!model->HICUMibepsGiven) {
model->HICUMibeps = 0.0;
}
if(!model->HICUMmbepGiven) {
model->HICUMmbep = 1.0;
}
if(!model->HICUMirepsGiven) {
model->HICUMireps = 0.0;
}
if(!model->HICUMmrepGiven) {
model->HICUMmrep = 2.0;
}
if(!model->HICUMmcfGiven) {
model->HICUMmcf = 1.0;
}
//Transit time for excess recombination current at b-c barrier
if(!model->HICUMtbhrecGiven) {
model->HICUMtbhrec = 0.0;
}
//Base-Collector diode currents
if(!model->HICUMibcisGiven) {
model->HICUMibcis = 1e-16;
}
if(!model->HICUMmbciGiven) {
model->HICUMmbci = 1.0;
}
if(!model->HICUMibcxsGiven) {
model->HICUMibcxs = 0.0;
}
if(!model->HICUMmbcxGiven) {
model->HICUMmbcx = 1.0;
}
//Base-Emitter tunneling current
if(!model->HICUMibetsGiven) {
model->HICUMibets = 0.0;
}
if(!model->HICUMabetGiven) {
model->HICUMabet = 40.0;
}
if(!model->HICUMtunodeGiven) {
model->HICUMtunode = 1;
}
//Base-Collector avalanche current
if(!model->HICUMfavlGiven) {
model->HICUMfavl = 0.0;
}
if(!model->HICUMqavlGiven) {
model->HICUMqavl = 0.0;
}
if(!model->HICUMalfavGiven) {
model->HICUMalfav = 0.0;
}
if(!model->HICUMalqavGiven) {
model->HICUMalqav = 0.0;
}
//Series resistances
if(!model->HICUMrbi0Given) {
model->HICUMrbi0 = MIN_R;
}
if(!model->HICUMrbxGiven) {
model->HICUMrbx = MIN_R;
}
if(!model->HICUMfgeoGiven) {
model->HICUMfgeo = 0.6557;
}
if(!model->HICUMfdqr0Given) {
model->HICUMfdqr0 = 0.0;
}
if(!model->HICUMfcrbiGiven) {
model->HICUMfcrbi = 0.0;
}
if(!model->HICUMfqiGiven) {
model->HICUMfqi = 1.0;
}
if(!model->HICUMreGiven) {
model->HICUMre = MIN_R;
}
if(!model->HICUMrcxGiven) {
model->HICUMrcx = MIN_R;
}
//Substrate transistor
if(!model->HICUMitssGiven) {
model->HICUMitss = 0.0;
}
if(!model->HICUMmsfGiven) {
model->HICUMmsf = 1.0;
}
if(!model->HICUMiscsGiven) {
model->HICUMiscs = 0.0;
}
if(!model->HICUMmscGiven) {
model->HICUMmsc = 1.0;
}
if(!model->HICUMtsfGiven) {
model->HICUMtsf = 0.0;
}
//Intra-device substrate coupling
if(!model->HICUMrsuGiven) {
model->HICUMrsu = MIN_R;
}
if(!model->HICUMcsuGiven) {
model->HICUMcsu = 0.0;
}
//Depletion Capacitances
if(!model->HICUMcjei0Given) {
model->HICUMcjei0 = 1.0e-20;
}
if(!model->HICUMvdeiGiven) {
model->HICUMvdei = 0.9;
}
if(!model->HICUMzeiGiven) {
model->HICUMzei = 0.5;
}
if(!model->HICUMajeiGiven) {
model->HICUMajei = 2.5;
}
if(!model->HICUMcjep0Given) {
model->HICUMcjep0 = 1.0e-20;
}
if(!model->HICUMvdepGiven) {
model->HICUMvdep = 0.9;
}
if(!model->HICUMzepGiven) {
model->HICUMzep = 0.5;
}
if(!model->HICUMajepGiven) {
model->HICUMajep = 2.5;
}
if(!model->HICUMcjci0Given) {
model->HICUMcjci0 = 1.0e-20;
}
if(!model->HICUMvdciGiven) {
model->HICUMvdci = 0.7;
}
if(!model->HICUMzciGiven) {
model->HICUMzci = 0.4;
}
if(!model->HICUMvptciGiven) {
model->HICUMvptci = 100.0;
}
if(!model->HICUMcjcx0Given) {
model->HICUMcjcx0 = 1.0e-20;
}
if(!model->HICUMvdcxGiven) {
model->HICUMvdcx = 0.7;
}
if(!model->HICUMzcxGiven) {
model->HICUMzcx = 0.4;
}
if(!model->HICUMvptcxGiven) {
model->HICUMvptcx = 100.0;
}
if(!model->HICUMfbcparGiven) {
model->HICUMfbcpar = 0.0;
}
if(!model->HICUMfbeparGiven) {
model->HICUMfbepar = 1.0;
}
if(!model->HICUMcjs0Given) {
model->HICUMcjs0 = 0.0;
}
if(!model->HICUMvdsGiven) {
model->HICUMvds = 0.6;
}
if(!model->HICUMzsGiven) {
model->HICUMzs = 0.5;
}
if(!model->HICUMvptsGiven) {
model->HICUMvpts = 100.0;
}
if(!model->HICUMcscp0Given) {
model->HICUMcscp0 = 0.0;
}
if(!model->HICUMvdspGiven) {
model->HICUMvdsp = 0.6;
}
if(!model->HICUMzspGiven) {
model->HICUMzsp = 0.5;
}
if(!model->HICUMvptspGiven) {
model->HICUMvptsp = 100.0;
}
//Diffusion Capacitances
if(!model->HICUMt0Given) {
model->HICUMt0 = 0.0;
}
if(!model->HICUMdt0hGiven) {
model->HICUMdt0h = 0.0;
}
if(!model->HICUMtbvlGiven) {
model->HICUMtbvl = 0.0;
}
if(!model->HICUMtef0Given) {
model->HICUMtef0 = 0.0;
}
if(!model->HICUMgtfeGiven) {
model->HICUMgtfe = 1.0;
}
if(!model->HICUMthcsGiven) {
model->HICUMthcs = 0.0;
}
if(!model->HICUMahcGiven) {
model->HICUMahc = 0.1;
}
if(!model->HICUMfthcGiven) {
model->HICUMfthc = 0.0;
}
if(!model->HICUMrci0Given) {
model->HICUMrci0 = 150;
}
if(!model->HICUMvlimGiven) {
model->HICUMvlim = 0.5;
}
if(!model->HICUMvcesGiven) {
model->HICUMvces = 0.1;
}
if(!model->HICUMvptGiven) {
model->HICUMvpt = 100.0;
}
if(!model->HICUMaickGiven) {
model->HICUMaick = 1.0e-03;
}
if(!model->HICUMdelckGiven) {
model->HICUMdelck = 2.0;
}
if(!model->HICUMtrGiven) {
model->HICUMtr = 0.0;
}
if(!model->HICUMvcbarGiven) {
model->HICUMvcbar = 0.0;
}
if(!model->HICUMicbarGiven) {
model->HICUMicbar = 0.0;
}
if(!model->HICUMacbarGiven) {
model->HICUMacbar = 0.01;
}
//Isolation Capacitances
if(!model->HICUMcbeparGiven) {
model->HICUMcbepar = 0.0;
}
if(!model->HICUMcbcparGiven) {
model->HICUMcbcpar = 0.0;
}
//Non-quasi-static Effect
if(!model->HICUMalqfGiven) {
model->HICUMalqf = 0.167;
}
if(!model->HICUMalitGiven) {
model->HICUMalit = 0.333;
}
if(!model->HICUMflnqsGiven) {
model->HICUMflnqs = 0;
}
//Noise
if(!model->HICUMkfGiven) {
model->HICUMkf = 0.0;
}
if(!model->HICUMafGiven) {
model->HICUMaf = 2.0;
}
if(!model->HICUMcfbeGiven) {
model->HICUMcfbe = -1;
}
if(!model->HICUMflconoGiven) {
model->HICUMflcono = 0;
}
if(!model->HICUMkfreGiven) {
model->HICUMkfre = 0.0;
}
if(!model->HICUMafreGiven) {
model->HICUMafre = 2.0;
}
//Lateral Geometry Scaling (at high current densities)
if(!model->HICUMlatbGiven) {
model->HICUMlatb = 0.0;
}
if(!model->HICUMlatlGiven) {
model->HICUMlatl = 0.0;
}
//Temperature dependence
if(!model->HICUMvgbGiven) {
model->HICUMvgb = 1.17;
}
if(!model->HICUMalt0Given) {
model->HICUMalt0 = 0.0;
}
if(!model->HICUMkt0Given) {
model->HICUMkt0 = 0.0;
}
if(!model->HICUMzetaciGiven) {
model->HICUMzetaci = 0.0;
}
if(!model->HICUMalvsGiven) {
model->HICUMalvs = 0.0;
}
if(!model->HICUMalcesGiven) {
model->HICUMalces = 0.0;
}
if(!model->HICUMzetarbiGiven) {
model->HICUMzetarbi = 0.0;
}
if(!model->HICUMzetarbxGiven) {
model->HICUMzetarbx = 0.0;
}
if(!model->HICUMzetarcxGiven) {
model->HICUMzetarcx = 0.0;
}
if(!model->HICUMzetareGiven) {
model->HICUMzetare = 0.0;
}
if(!model->HICUMzetacxGiven) {
model->HICUMzetacx = 1.0;
}
if(!model->HICUMvgeGiven) {
model->HICUMvge = 1.17;
}
if(!model->HICUMvgcGiven) {
model->HICUMvgc = 1.17;
}
if(!model->HICUMvgsGiven) {
model->HICUMvgs = 1.17;
}
if(!model->HICUMf1vgGiven) {
model->HICUMf1vg = -1.02377e-4;
}
if(!model->HICUMf2vgGiven) {
model->HICUMf2vg = 4.3215e-4;
}
if(!model->HICUMzetactGiven) {
model->HICUMzetact = 3.0;
}
if(!model->HICUMzetabetGiven) {
model->HICUMzetabet = 3.5;
}
if(!model->HICUMalbGiven) {
model->HICUMalb = 0.0;
}
if(!model->HICUMdvgbeGiven) {
model->HICUMdvgbe = 0.0;
}
if(!model->HICUMzetahjeiGiven) {
model->HICUMzetahjei = 1.0;
}
if(!model->HICUMzetavgbeGiven) {
model->HICUMzetavgbe = 1.0;
}
//Self-Heating
if(!model->HICUMflshGiven) {
model->HICUMflsh = 0;
}
if(!model->HICUMrthGiven) {
model->HICUMrth = 0.0;
}
if(!model->HICUMzetarthGiven) {
model->HICUMzetarth = 0.0;
}
if(!model->HICUMalrthGiven) {
model->HICUMalrth = 0.0;
}
if(!model->HICUMcthGiven) {
model->HICUMcth = 0.0;
}
//Compatibility with V2.1
if(!model->HICUMflcompGiven) {
model->HICUMflcomp = 0.0;
}
if(!model->HICUMvbeMaxGiven) {
model->HICUMvbeMax = 1e99;
}
if(!model->HICUMvbcMaxGiven) {
model->HICUMvbcMax = 1e99;
}
if(!model->HICUMvceMaxGiven) {
model->HICUMvceMax = 1e99;
}
/* loop through all the instances of the model */
for (here = HICUMinstances(model); here != NULL ;
here=HICUMnextInstance(here)) {
CKTnode *tmpNode;
IFuid tmpName;
if(!here->HICUMareaGiven) {
here->HICUMarea = 1.0;
}
if(!here->HICUMmGiven) {
here->HICUMm = 1.0;
}
if(!here->HICUMdtempGiven) {
here->HICUMdtemp = 0.0;
}
here->HICUMstate = *states;
*states += HICUMnumStates;
if(model->HICUMrcx == 0) {
here->HICUMcollCINode = here->HICUMcollNode;
} else if(here->HICUMcollCINode == 0) {
error = CKTmkVolt(ckt,&tmp,here->HICUMname,"collCI");
if(error) return(error);
here->HICUMcollCINode = tmp->number;
if (ckt->CKTcopyNodesets) {
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
}
}
}
}
if(model->HICUMrbx == 0) {
here->HICUMbaseBPNode = here->HICUMbaseNode;
} else if(here->HICUMbaseBPNode == 0){
error = CKTmkVolt(ckt,&tmp,here->HICUMname, "baseBP");
if(error) return(error);
here->HICUMbaseBPNode = tmp->number;
if (ckt->CKTcopyNodesets) {
if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
}
}
}
}
if(model->HICUMre == 0) {
here->HICUMemitEINode = here->HICUMemitNode;
} else if(here->HICUMemitEINode == 0) {
error = CKTmkVolt(ckt,&tmp,here->HICUMname, "emitEI");
if(error) return(error);
here->HICUMemitEINode = tmp->number;
if (ckt->CKTcopyNodesets) {
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
}
}
}
}
if(model->HICUMrsu == 0) {
here->HICUMsubsSINode = here->HICUMsubsNode;
} else if(here->HICUMsubsSINode == 0) {
error = CKTmkVolt(ckt,&tmp,here->HICUMname, "subsSI");
if(error) return(error);
here->HICUMsubsSINode = tmp->number;
if (ckt->CKTcopyNodesets) {
if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
}
}
}
}
if(here->HICUMbaseBINode == 0) {
error = CKTmkVolt(ckt, &tmp, here->HICUMname, "baseBI");
if(error) return(error);
here->HICUMbaseBINode = tmp->number;
}
// if(here->HICUMxfNode == 0) {
// error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf");
// if(error) return(error);
// here->HICUMxfNode = tmp->number;
// }
//
// if(here->HICUMxf1Node == 0) {
// error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf1");
// if(error) return(error);
// here->HICUMxf1Node = tmp->number;
// }
//
// if(here->HICUMxf2Node == 0) {
// error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf2");
// if(error) return(error);
// here->HICUMxf2Node = tmp->number;
// }
if((model->HICUMrthGiven) && (model->HICUMcth < 1e-12))
model->HICUMcth = 1e-12;
/* macro to make elements with built in test for out of memory */
#define TSTALLOC(ptr,first,second) \
do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
return(E_NOMEM);\
} } while(0)
TSTALLOC(HICUMcollCollPtr,HICUMcollNode,HICUMcollNode);
TSTALLOC(HICUMbaseBasePtr,HICUMbaseNode,HICUMbaseNode);
TSTALLOC(HICUMemitEmitPtr,HICUMemitNode,HICUMemitNode);
TSTALLOC(HICUMsubsSubsPtr,HICUMsubsNode,HICUMsubsNode);
TSTALLOC(HICUMcollCICollCIPtr,HICUMcollCINode,HICUMcollCINode);
TSTALLOC(HICUMbaseBIBaseBIPtr,HICUMbaseBINode,HICUMbaseBINode);
TSTALLOC(HICUMemitEIEmitEIPtr,HICUMemitEINode,HICUMemitEINode);
TSTALLOC(HICUMbaseBPBaseBPPtr,HICUMbaseBPNode,HICUMbaseBPNode);
TSTALLOC(HICUMsubsSISubsSIPtr,HICUMsubsSINode,HICUMsubsSINode);
TSTALLOC(HICUMbaseEmitPtr,HICUMbaseNode,HICUMemitNode); //b-e
TSTALLOC(HICUMemitBasePtr,HICUMemitNode,HICUMbaseNode); //e-b
TSTALLOC(HICUMbaseBaseBPPtr,HICUMbaseNode,HICUMbaseBPNode); //b-bp
TSTALLOC(HICUMbaseBPBasePtr,HICUMbaseBPNode,HICUMbaseNode); //bp-b
TSTALLOC(HICUMemitEmitEIPtr,HICUMemitNode,HICUMemitEINode); //e-ei
TSTALLOC(HICUMemitEIEmitPtr,HICUMemitEINode,HICUMemitNode); //ei-e
TSTALLOC(HICUMsubsSubsSIPtr,HICUMsubsNode,HICUMsubsSINode); //s-si
TSTALLOC(HICUMsubsSISubsPtr,HICUMsubsSINode,HICUMsubsNode); //si-s
TSTALLOC(HICUMcollCIBasePtr,HICUMcollCINode,HICUMbaseNode); //b-ci
TSTALLOC(HICUMbaseCollCIPtr,HICUMbaseNode,HICUMcollCINode); //ci-b
TSTALLOC(HICUMcollCIEmitEIPtr,HICUMcollCINode,HICUMemitEINode); //ci-ei
TSTALLOC(HICUMemitEICollCIPtr,HICUMemitEINode,HICUMcollCINode); //ei-ci
TSTALLOC(HICUMbaseBPBaseBIPtr,HICUMbaseBPNode,HICUMbaseBINode); //bp-bi
TSTALLOC(HICUMbaseBIBaseBPPtr,HICUMbaseBINode,HICUMbaseBPNode); //bi-bp
TSTALLOC(HICUMbaseBPEmitEIPtr,HICUMbaseBPNode,HICUMemitEINode); //bp-ei
TSTALLOC(HICUMemitEIBaseBPPtr,HICUMemitEINode,HICUMbaseBPNode); //ei-bp
TSTALLOC(HICUMbaseBPEmitPtr,HICUMbaseBPNode,HICUMemitNode); //bp-e
TSTALLOC(HICUMemitBaseBPPtr,HICUMemitNode,HICUMbaseBPNode); //e-bp
TSTALLOC(HICUMbaseBPSubsSIPtr,HICUMbaseBPNode,HICUMsubsSINode); //bp-si
TSTALLOC(HICUMsubsSIBaseBPPtr,HICUMsubsSINode,HICUMbaseBPNode); //si-bp
TSTALLOC(HICUMbaseBIEmitEIPtr,HICUMbaseBINode,HICUMemitEINode); //ei-bi
TSTALLOC(HICUMemitEIBaseBIPtr,HICUMemitEINode,HICUMbaseBINode); //bi-ei
TSTALLOC(HICUMbaseBICollCIPtr,HICUMbaseBINode,HICUMcollCINode); //ci-bi
TSTALLOC(HICUMcollCIBaseBIPtr,HICUMcollCINode,HICUMbaseBINode); //bi-ci
TSTALLOC(HICUMbaseBPCollCIPtr,HICUMbaseBPNode,HICUMcollCINode); //bp-ci
TSTALLOC(HICUMcollCIBaseBPPtr,HICUMcollCINode,HICUMbaseBPNode); //ci-bp
TSTALLOC(HICUMsubsSICollCIPtr,HICUMsubsSINode,HICUMcollCINode); //si-ci
TSTALLOC(HICUMcollCISubsSIPtr,HICUMcollCINode,HICUMsubsSINode); //ci-si
TSTALLOC(HICUMcollCICollPtr,HICUMcollCINode,HICUMcollNode); //ci-c
TSTALLOC(HICUMcollCollCIPtr,HICUMcollNode,HICUMcollCINode); //c-ci
TSTALLOC(HICUMsubsCollPtr,HICUMsubsNode,HICUMcollNode); //s-c
TSTALLOC(HICUMcollSubsPtr,HICUMcollNode,HICUMsubsNode); //c-s
// TSTALLOC(HICUMxfXfPtr,HICUMxfNode,HICUMxfNode);
// TSTALLOC(HICUMxf1Xf1Ptr,HICUMxf1Node,HICUMxf1Node);
// TSTALLOC(HICUMxf2Xf2Ptr,HICUMxf2Node,HICUMxf2Node);
if (model->HICUMflsh) {
TSTALLOC(HICUMcollTempPtr,HICUMcollNode,HICUMtempNode);
TSTALLOC(HICUMbaseTempPtr,HICUMbaseNode,HICUMtempNode);
TSTALLOC(HICUMemitTempPtr,HICUMemitNode,HICUMtempNode);
TSTALLOC(HICUMcollCItempPtr,HICUMcollCINode,HICUMtempNode);
TSTALLOC(HICUMbaseBItempPtr,HICUMbaseBINode,HICUMtempNode);
TSTALLOC(HICUMbaseBPtempPtr,HICUMbaseBPNode,HICUMtempNode);
TSTALLOC(HICUMemitEItempPtr,HICUMemitEINode,HICUMtempNode);
TSTALLOC(HICUMsubsSItempPtr,HICUMsubsSINode,HICUMtempNode);
TSTALLOC(HICUMtempCollCIPtr,HICUMtempNode,HICUMcollCINode);
TSTALLOC(HICUMtempBaseBIPtr,HICUMtempNode,HICUMbaseBINode);
TSTALLOC(HICUMtempBaseBPPtr,HICUMtempNode,HICUMbaseBPNode);
TSTALLOC(HICUMtempEmitEIPtr,HICUMtempNode,HICUMemitEINode);
TSTALLOC(HICUMtempSubsSIPtr,HICUMtempNode,HICUMsubsSINode);
TSTALLOC(HICUMtempTempPtr,HICUMtempNode,HICUMtempNode);
}
}
}
return(OK);
}
int
HICUMunsetup(
GENmodel *inModel,
CKTcircuit *ckt)
{
HICUMmodel *model;
HICUMinstance *here;
for (model = (HICUMmodel *)inModel; model != NULL;
model = HICUMnextModel(model))
{
for (here = HICUMinstances(model); here != NULL;
here=HICUMnextInstance(here))
{
if (here->HICUMbaseBINode > 0)
CKTdltNNum(ckt, here->HICUMbaseBINode);
here->HICUMbaseBINode = 0;
if (here->HICUMsubsSINode > 0
&& here->HICUMsubsSINode != here->HICUMsubsNode)
CKTdltNNum(ckt, here->HICUMsubsSINode);
here->HICUMsubsSINode = 0;
if (here->HICUMemitEINode > 0
&& here->HICUMemitEINode != here->HICUMemitNode)
CKTdltNNum(ckt, here->HICUMemitEINode);
here->HICUMemitEINode = 0;
if (here->HICUMbaseBPNode > 0
&& here->HICUMbaseBPNode != here->HICUMbaseNode)
CKTdltNNum(ckt, here->HICUMbaseBPNode);
here->HICUMbaseBPNode = 0;
if (here->HICUMcollCINode > 0
&& here->HICUMcollCINode != here->HICUMcollNode)
CKTdltNNum(ckt, here->HICUMcollCINode);
here->HICUMcollCINode = 0;
}
}
return OK;
}

View File

@ -0,0 +1,72 @@
/**********
Copyright 2013 Dietmar Warning. All rights reserved.
Author: 2013 Dietmar Warning
**********/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "hicumdefs.h"
#include "ngspice/trandefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
#include "ngspice/cpdefs.h"
int
HICUMsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
{
HICUMmodel *model = (HICUMmodel *) inModel;
HICUMinstance *here;
double vbe, vbc, vce; /* actual bjt voltages */
int maxwarns;
static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0;
if (!ckt) {
warns_vbe = 0;
warns_vbc = 0;
warns_vce = 0;
return OK;
}
maxwarns = ckt->CKTsoaMaxWarns;
for (; model; model = HICUMnextModel(model)) {
for (here = HICUMinstances(model); here; here=HICUMnextInstance(here)) {
vbe = fabs(ckt->CKTrhsOld [here->HICUMbaseNode] -
ckt->CKTrhsOld [here->HICUMemitNode]);
vbc = fabs(ckt->CKTrhsOld [here->HICUMbaseNode] -
ckt->CKTrhsOld [here->HICUMcollNode]);
vce = fabs(ckt->CKTrhsOld [here->HICUMcollNode] -
ckt->CKTrhsOld [here->HICUMemitNode]);
if (vbe > model->HICUMvbeMax)
if (warns_vbe < maxwarns) {
soa_printf(ckt, (GENinstance*) here,
"|Vbe|=%g has exceeded Vbe_max=%g\n",
vbe, model->HICUMvbeMax);
warns_vbe++;
}
if (vbc > model->HICUMvbcMax)
if (warns_vbc < maxwarns) {
soa_printf(ckt, (GENinstance*) here,
"|Vbc|=%g has exceeded Vbc_max=%g\n",
vbc, model->HICUMvbcMax);
warns_vbc++;
}
if (vce > model->HICUMvceMax)
if (warns_vce < maxwarns) {
soa_printf(ckt, (GENinstance*) here,
"|Vce|=%g has exceeded Vce_max=%g\n",
vce, model->HICUMvceMax);
warns_vce++;
}
}
}
return OK;
}

View File

@ -0,0 +1,352 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "ngspice/smpdefs.h"
#include "hicumdefs.h"
#include "ngspice/const.h"
#include "ngspice/sperror.h"
#include "ngspice/ifsim.h"
#include "ngspice/suffix.h"
#define TMAX 326.85
#define TMIN -100.0
#define LN_EXP_LIMIT 11.0
void TMPHICJ(double , double , double , double , double ,
double , double , double , double , double , double ,
double *, double *, double *);
// TEMPERATURE UPDATE OF JUNCTION CAPACITANCE RELATED PARAMETERS
// INPUT:
// mostly model parameters
// x : zero bias junction capacitance
// y : junction built-in potential
// z : grading co-efficient
// w : ratio of maximum to zero-bias value of capacitance or punch-through voltage
// is_al : condition factor to check what "w" stands for
// vgeff : band-gap voltage
// IMPLICIT INPUT:
// vt : thermal voltage
// vt0,qtt0,ln_qtt0,mg : other model variables
// OUTPUT:
// c_j_t : temperature update of "c_j"
// vd_t : temperature update of "vd0"
// w_t : temperature update of "w"
void TMPHICJ(double vt, double vt0, double qtt0, double ln_qtt0, double mg,
double c_j, double vd0, double z, double w, double is_al, double vgeff,
double *c_j_t, double *vd_t, double *w_t)
{
double vdj0,vdjt,vdt;
if (c_j > 0.0) {
vdj0 = 2*vt0*log(exp(vd0*0.5/vt0)-exp(-0.5*vd0/vt0));
vdjt = vdj0*qtt0+vgeff*(1-qtt0)-mg*vt*ln_qtt0;
vdt = vdjt+2*vt*log(0.5*(1+sqrt(1+4*exp(-vdjt/vt))));
*vd_t = vdt;
*c_j_t = c_j*exp(z*log(vd0/(*vd_t)));
if (is_al == 1) {
*w_t = w*(*vd_t)/vd0;
} else {
*w_t = w;
}
} else {
*c_j_t = c_j;
*vd_t = vd0;
*w_t = w;
}
}
int iret, hicum_thermal_update(HICUMmodel *, HICUMinstance *);
int
HICUMtemp(GENmodel *inModel, CKTcircuit *ckt)
/* Pre-compute many useful parameters
*/
{
HICUMmodel *model = (HICUMmodel *)inModel;
HICUMinstance *here;
/* loop through all the bipolar models */
for( ; model != NULL; model = HICUMnextModel(model)) {
/* loop through all the instances of the model */
for (here = HICUMinstances(model); here != NULL ;
here=HICUMnextInstance(here)) {
if(!here->HICUMtempGiven) here->HICUMtemp = ckt->CKTtemp;
if(here->HICUMdtempGiven) here->HICUMtemp = here->HICUMtemp + here->HICUMdtemp;
iret = hicum_thermal_update(model, here);
}
}
return(OK);
}
int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance)
{
HICUMmodel *model = (HICUMmodel *)inModel;
HICUMinstance *here = (HICUMinstance *)inInstance;
double k10,k20,avs,vgb_t0,vge_t0,vgbe_t0,vgbe0,vgbc0,vgsc0;
double zetabci,zetabcxt,zetasct;
double k1,k2,dvg0,vge_t,vgb_t,vgbe_t,cratio_t,a;
double Tnom, dT, zetatef, cjcx01, cjcx02, C_1;
double cjci0_t, vdci_t, vptci_t, cjep0_t, vdep_t, ajep_t, vdcx_t, vptcx_t, cscp0_t, vdsp_t, vptsp_t, cjs0_t, vds_t, vpts_t;
Tnom = model->HICUMtnom;
k10 = model->HICUMf1vg*Tnom*log(Tnom);
k20 = model->HICUMf2vg*Tnom;
avs = model->HICUMalvs*Tnom;
vgb_t0 = model->HICUMvgb+k10+k20;
vge_t0 = model->HICUMvge+k10+k20;
vgbe_t0 = (vgb_t0+vge_t0)/2;
vgbe0 = (model->HICUMvgb+model->HICUMvge)/2;
vgbc0 = (model->HICUMvgb+model->HICUMvgc)/2;
vgsc0 = (model->HICUMvgs+model->HICUMvgc)/2;
here->HICUMmg = 3-model->HICUMf1vg/CONSTKoverQ;
zetabci = here->HICUMmg+1-model->HICUMzetaci;
zetabcxt= here->HICUMmg+1-model->HICUMzetacx;
zetasct = here->HICUMmg-1.5;
// Limit temperature to avoid FPEs in equations
if(here->HICUMtemp < TMIN + CONSTCtoK) {
here->HICUMtemp = TMIN + CONSTCtoK;
} else {
if (here->HICUMtemp > TMAX + CONSTCtoK) {
here->HICUMtemp = TMAX + CONSTCtoK;
}
}
here->HICUMvt0 = Tnom * CONSTKoverQ;
here->HICUMvt = here->HICUMtemp * CONSTKoverQ;
dT = here->HICUMtemp-Tnom;
here->HICUMqtt0 = here->HICUMtemp/Tnom;
here->HICUMln_qtt0 = log(here->HICUMqtt0);
k1 = model->HICUMf1vg*here->HICUMtemp*log(here->HICUMtemp);
k2 = model->HICUMf2vg*here->HICUMtemp;
vgb_t = model->HICUMvgb+k1+k2;
vge_t = model->HICUMvge+k1+k2;
vgbe_t = (vgb_t+vge_t)/2;
here->HICUMtVcrit = here->HICUMvt *
log(here->HICUMvt / (CONSTroot2*model->HICUMibeis*here->HICUMarea*here->HICUMm));
//Internal b-e junction capacitance
TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,model->HICUMcjei0,model->HICUMvdei,model->HICUMzei,model->HICUMajei,1,vgbe0,&here->HICUMcjei0_t,&here->HICUMvdei_t,&here->HICUMajei_t);
if (model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) {
double V_gT, r_VgVT, k;
V_gT = 3.0*here->HICUMvt*here->HICUMln_qtt0 + model->HICUMvgb*(here->HICUMqtt0-1.0);
r_VgVT = V_gT/here->HICUMvt;
//Internal b-e diode saturation currents
a = model->HICUMmcf*r_VgVT/model->HICUMmbei - model->HICUMalb*dT;
here->HICUMibeis_t = model->HICUMibeis*exp(a);
a = model->HICUMmcf*r_VgVT/model->HICUMmrei - model->HICUMalb*dT;
here->HICUMireis_t = model->HICUMireis*exp(a);
a = model->HICUMmcf*r_VgVT/model->HICUMmbep - model->HICUMalb*dT;
//Peripheral b-e diode saturation currents
here->HICUMibeps_t = model->HICUMibeps*exp(a);
a = model->HICUMmcf*r_VgVT/model->HICUMmrep - model->HICUMalb*dT;
here->HICUMireps_t = model->HICUMireps*exp(a);
//Internal b-c diode saturation current
a = r_VgVT/model->HICUMmbci;
here->HICUMibcis_t = model->HICUMibcis*exp(a);
//External b-c diode saturation currents
a = r_VgVT/model->HICUMmbcx;
here->HICUMibcxs_t = model->HICUMibcxs*exp(a);
//Saturation transfer current for substrate transistor
a = r_VgVT/model->HICUMmsf;
here->HICUMitss_t = model->HICUMitss*exp(a);
//Saturation current for c-s diode
a = r_VgVT/model->HICUMmsc;
here->HICUMiscs_t = model->HICUMiscs*exp(a);
//Zero bias hole charge
a = here->HICUMvdei_t/model->HICUMvdei;
here->HICUMqp0_t = model->HICUMqp0*(1.0+0.5*model->HICUMzei*(1.0-a));
//Voltage separating ohmic and saturation velocity regime
a = model->HICUMvlim*(1.0-model->HICUMalvs*dT)*exp(model->HICUMzetaci*here->HICUMln_qtt0);
k = (a-here->HICUMvt)/here->HICUMvt;
if (k < LN_EXP_LIMIT) {
here->HICUMvlim_t = here->HICUMvt + here->HICUMvt*log(1.0+exp(k));
} else {
here->HICUMvlim_t = a;
}
//Neutral emitter storage time
a = 1.0+model->HICUMalb*dT;
k = 0.5*(a+sqrt(a*a+0.01));
here->HICUMtef0_t = model->HICUMtef0*here->HICUMqtt0/k;
} else {
//Internal b-e diode saturation currents
here->HICUMibeis_t = model->HICUMibeis*exp(model->HICUMzetabet*here->HICUMln_qtt0+model->HICUMvge/here->HICUMvt*(here->HICUMqtt0-1));
if (model->HICUMflcomp>=2.3) {
here->HICUMireis_t = model->HICUMireis*exp(here->HICUMmg/model->HICUMmrei*here->HICUMln_qtt0+vgbe0/(model->HICUMmrei*here->HICUMvt)*(here->HICUMqtt0-1));
} else {
here->HICUMireis_t = model->HICUMireis*exp(0.5*here->HICUMmg*here->HICUMln_qtt0+0.5*vgbe0/here->HICUMvt*(here->HICUMqtt0-1));
}
//Peripheral b-e diode saturation currents
here->HICUMibeps_t = model->HICUMibeps*exp(model->HICUMzetabet*here->HICUMln_qtt0+model->HICUMvge/here->HICUMvt*(here->HICUMqtt0-1));
if (model->HICUMflcomp>=2.3) {
here->HICUMireps_t = model->HICUMireps*exp(here->HICUMmg/model->HICUMmrep*here->HICUMln_qtt0+vgbe0/(model->HICUMmrep*here->HICUMvt)*(here->HICUMqtt0-1));
} else {
here->HICUMireps_t = model->HICUMireps*exp(0.5*here->HICUMmg*here->HICUMln_qtt0+0.5*vgbe0/here->HICUMvt*(here->HICUMqtt0-1));
}
//Internal b-c diode saturation currents
here->HICUMibcis_t = model->HICUMibcis*exp(zetabci*here->HICUMln_qtt0+model->HICUMvgc/here->HICUMvt*(here->HICUMqtt0-1));
//External b-c diode saturation currents
here->HICUMibcxs_t = model->HICUMibcxs*exp(zetabcxt*here->HICUMln_qtt0+model->HICUMvgc/here->HICUMvt*(here->HICUMqtt0-1));
//Saturation transfer current for substrate transistor
here->HICUMitss_t = model->HICUMitss*exp(zetasct*here->HICUMln_qtt0+model->HICUMvgc/here->HICUMvt*(here->HICUMqtt0-1));
//Saturation current for c-s diode
here->HICUMiscs_t = model->HICUMiscs*exp(zetasct*here->HICUMln_qtt0+model->HICUMvgs/here->HICUMvt*(here->HICUMqtt0-1));
//Zero bias hole charge
a = exp(model->HICUMzei*log(here->HICUMvdei_t/model->HICUMvdei));
here->HICUMqp0_t = model->HICUMqp0*(2.0-a);
//Voltage separating ohmic and saturation velocity regime
here->HICUMvlim_t = model->HICUMvlim*exp((model->HICUMzetaci-avs)*here->HICUMln_qtt0);
//Neutral emitter storage time
if (model->HICUMflcomp >= 2.3) {
here->HICUMtef0_t = model->HICUMtef0;
} else {
zetatef = model->HICUMzetabet-model->HICUMzetact-0.5;
dvg0 = model->HICUMvgb-model->HICUMvge;
here->HICUMtef0_t = model->HICUMtef0*exp(zetatef*here->HICUMln_qtt0-dvg0/here->HICUMvt*(here->HICUMqtt0-1));
}
}
//GICCR prefactor
here->HICUMc10_t = model->HICUMc10*exp(model->HICUMzetact*here->HICUMln_qtt0+model->HICUMvgb/here->HICUMvt*(here->HICUMqtt0-1));
// Low-field internal collector resistance
here->HICUMrci0_t = model->HICUMrci0*exp(model->HICUMzetaci*here->HICUMln_qtt0);
//Voltage separating ohmic and saturation velocity regime
//vlim_t = model->HICUMvlim*exp((model->HICUMzetaci-avs)*here->HICUMln_qtt0);
//Internal c-e saturation voltage
here->HICUMvces_t = model->HICUMvces*(1+model->HICUMalces*dT);
//Internal b-c diode saturation current
//ibcis_t = model->HICUMibcis*exp(zetabci*here->HICUMln_qtt0+model->HICUMvgc/here->HICUMvt*(here->HICUMqtt0-1));
//Internal b-c junction capacitance
TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,model->HICUMcjci0,model->HICUMvdci,model->HICUMzci,model->HICUMvptci,0,vgbc0,&cjci0_t,&vdci_t,&vptci_t);
here->HICUMcjci0_t = cjci0_t;
here->HICUMvdci_t = vdci_t;
here->HICUMvptci_t = vptci_t;
//Low-current forward transit time
here->HICUMt0_t = model->HICUMt0*(1+model->HICUMalt0*dT+model->HICUMkt0*dT*dT);
//Saturation time constant at high current densities
here->HICUMthcs_t = model->HICUMthcs*exp((model->HICUMzetaci-1)*here->HICUMln_qtt0);
//Avalanche current factors
here->HICUMfavl_t = model->HICUMfavl*exp(model->HICUMalfav*dT);
here->HICUMqavl_t = model->HICUMqavl*exp(model->HICUMalqav*dT);
//Zero bias internal base resistance
here->HICUMrbi0_t = model->HICUMrbi0*exp(model->HICUMzetarbi*here->HICUMln_qtt0);
//Peripheral b-e junction capacitance
TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,model->HICUMcjep0,model->HICUMvdep,model->HICUMzep,model->HICUMajep,1,vgbe0,&cjep0_t,&vdep_t,&ajep_t);
here->HICUMcjep0_t = cjep0_t;
here->HICUMvdep_t = vdep_t;
here->HICUMajep_t = ajep_t;
//Tunneling current factors
if (model->HICUMibets > 0) { // HICTUN_T
double a_eg,ab,aa;
ab = 1.0;
aa = 1.0;
a_eg=vgbe_t0/vgbe_t;
if(model->HICUMtunode==1 && model->HICUMcjep0 > 0.0 && model->HICUMvdep >0.0) {
ab = (here->HICUMcjep0_t/model->HICUMcjep0)*sqrt(a_eg)*vdep_t*vdep_t/(model->HICUMvdep*model->HICUMvdep);
aa = (model->HICUMvdep/vdep_t)*(model->HICUMcjep0/here->HICUMcjep0_t)*pow(a_eg,-1.5);
} else if (model->HICUMtunode==0 && model->HICUMcjei0 > 0.0 && model->HICUMvdei >0.0) {
ab = (here->HICUMcjei0_t/model->HICUMcjei0)*sqrt(a_eg)*here->HICUMvdei_t*here->HICUMvdei_t/(model->HICUMvdei*model->HICUMvdei);
aa = (model->HICUMvdei/here->HICUMvdei_t)*(model->HICUMcjei0/here->HICUMcjei0_t)*pow(a_eg,-1.5);
}
here->HICUMibets_t = model->HICUMibets*ab;
here->HICUMabet_t = model->HICUMabet*aa;
} else {
here->HICUMibets_t = 0;
here->HICUMabet_t = 1;
}
//Depletion capacitance splitting at b-c junction
//Capacitances at peripheral and external base node
C_1 = (1.0-model->HICUMfbcpar)*(model->HICUMcjcx0+model->HICUMcbcpar);
if (C_1 >= model->HICUMcbcpar) {
cjcx01 = C_1-model->HICUMcbcpar;
cjcx02 = model->HICUMcjcx0-cjcx01;
} else {
cjcx01 = 0.0;
cjcx02 = model->HICUMcjcx0;
}
//Temperature mapping for tunneling current is done inside HICTUN
TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,1.0,model->HICUMvdcx,model->HICUMzcx,model->HICUMvptcx,0,vgbc0,&cratio_t,&vdcx_t,&vptcx_t);
here->HICUMcjcx01_t=cratio_t*cjcx01;
here->HICUMcjcx02_t=cratio_t*cjcx02;
here->HICUMvdcx_t = vdcx_t;
here->HICUMvptcx_t = vptcx_t;
//External b-c diode saturation currents
//ibcxs_t = model->HICUMibcxs*exp(zetabcxt*here->HICUMln_qtt0+model->HICUMvgc/here->HICUMvt*(qtt0-1));
//Constant external series resistances
here->HICUMrcx_t = model->HICUMrcx*exp(model->HICUMzetarcx*here->HICUMln_qtt0);
here->HICUMrbx_t = model->HICUMrbx*exp(model->HICUMzetarbx*here->HICUMln_qtt0);
here->HICUMre_t = model->HICUMre*exp(model->HICUMzetare*here->HICUMln_qtt0);
//Forward transit time in substrate transistor
here->HICUMtsf_t = model->HICUMtsf*exp((model->HICUMzetacx-1.0)*here->HICUMln_qtt0);
//Capacitance for c-s junction
TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,model->HICUMcjs0,model->HICUMvds,model->HICUMzs,model->HICUMvpts,0,vgsc0,&cjs0_t,&vds_t,&vpts_t);
here->HICUMcjs0_t = cjs0_t;
here->HICUMvds_t = vds_t;
here->HICUMvpts_t = vpts_t;
/*Peripheral s-c capacitance
* Note, thermal update only required for model->HICUMvds > 0
* Save computional effort otherwise
*/
if (model->HICUMvdsp > 0) {
TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,model->HICUMcscp0,model->HICUMvdsp,model->HICUMzsp,model->HICUMvptsp,0,vgsc0,&cscp0_t,&vdsp_t,&vptsp_t);
here->HICUMcscp0_t = cscp0_t;
here->HICUMvdsp_t = vdsp_t;
here->HICUMvptsp_t = vptsp_t;
} else {
// Avoid uninitialized variables
here->HICUMcscp0_t = model->HICUMcscp0;
here->HICUMvdsp_t = model->HICUMvdsp;
here->HICUMvptsp_t = model->HICUMvptsp;
}
here->HICUMahjei_t = model->HICUMahjei*exp(model->HICUMzetahjei*here->HICUMln_qtt0);
here->HICUMhjei0_t = model->HICUMhjei*exp(model->HICUMdvgbe/here->HICUMvt*(exp(model->HICUMzetavgbe*log(here->HICUMqtt0))-1));
here->HICUMhf0_t = model->HICUMhf0*exp(model->HICUMdvgbe/here->HICUMvt*(here->HICUMqtt0-1));
if (model->HICUMflcomp >= 2.3) {
here->HICUMhfe_t = model->HICUMhfe*exp((model->HICUMvgb-model->HICUMvge)/here->HICUMvt*(here->HICUMqtt0-1));
here->HICUMhfc_t = model->HICUMhfc*exp((model->HICUMvgb-model->HICUMvgc)/here->HICUMvt*(here->HICUMqtt0-1));
} else {
here->HICUMhfe_t = model->HICUMhfe;
here->HICUMhfc_t = model->HICUMhfc;
}
here->HICUMrth_t = model->HICUMrth*exp(model->HICUMzetarth*here->HICUMln_qtt0)*(1+model->HICUMalrth*dT);
return(0);
}

View File

@ -0,0 +1,44 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Model Author: 1990 Michael Schröter TU Dresden
Spice3 Implementation: 2019 Dietmar Warning
**********/
/*
* This routine performs truncation error calculations for
* HICUMs in the circuit.
*/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "hicumdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
HICUMtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
{
HICUMmodel *model = (HICUMmodel*)inModel;
HICUMinstance *here;
for( ; model != NULL; model = HICUMnextModel(model)) {
for(here=HICUMinstances(model);here!=NULL;
here = HICUMnextInstance(here)){
CKTterr(here->HICUMqrbi, ckt, timeStep);
CKTterr(here->HICUMqjei, ckt, timeStep);
CKTterr(here->HICUMqdeix, ckt, timeStep);
CKTterr(here->HICUMqjci, ckt, timeStep);
CKTterr(here->HICUMqdci, ckt, timeStep);
CKTterr(here->HICUMqjep, ckt, timeStep);
CKTterr(here->HICUMqjcx0_i, ckt, timeStep);
CKTterr(here->HICUMqjcx0_ii, ckt, timeStep);
CKTterr(here->HICUMqdsu, ckt, timeStep);
CKTterr(here->HICUMqjs, ckt, timeStep);
CKTterr(here->HICUMqscp, ckt, timeStep);
}
}
return(OK);
}