41 changed files with 7479 additions and 46 deletions
-
19DEVICES
-
4contrib/vbic/README
-
322contrib/vbic/sgp2vbic
-
311contrib/vbic/vbic2sgp
-
4src/Makefile.am
-
1src/spicelib/devices/Makefile.am
-
55src/spicelib/devices/dev.c
-
33src/spicelib/devices/vbic/Makefile.am
-
194src/spicelib/devices/vbic/vbic.c
-
245src/spicelib/devices/vbic/vbicacld.c
-
198src/spicelib/devices/vbic/vbicask.c
-
177src/spicelib/devices/vbic/vbicconv.c
-
725src/spicelib/devices/vbic/vbicdefs.h
-
40src/spicelib/devices/vbic/vbicdel.c
-
46src/spicelib/devices/vbic/vbicdest.c
-
29src/spicelib/devices/vbic/vbicext.h
-
49src/spicelib/devices/vbic/vbicgetic.c
-
81src/spicelib/devices/vbic/vbicinit.c
-
13src/spicelib/devices/vbic/vbicinit.h
-
12src/spicelib/devices/vbic/vbicitf.h
-
2134src/spicelib/devices/vbic/vbicload.c
-
360src/spicelib/devices/vbic/vbicmask.c
-
41src/spicelib/devices/vbic/vbicmdel.c
-
477src/spicelib/devices/vbic/vbicmpar.c
-
269src/spicelib/devices/vbic/vbicnoise.c
-
72src/spicelib/devices/vbic/vbicparam.c
-
273src/spicelib/devices/vbic/vbicpzld.c
-
557src/spicelib/devices/vbic/vbicsetup.c
-
468src/spicelib/devices/vbic/vbictemp.c
-
41src/spicelib/devices/vbic/vbictrunc.c
-
1src/spicelib/parser/inp2q.c
-
29src/spicelib/parser/inpdomod.c
-
26tests/vbic/CEamp.sp
-
21tests/vbic/FG.sp
-
20tests/vbic/FO.sp
-
45tests/vbic/diffamp.sp
-
19tests/vbic/diode.sp
-
25tests/vbic/noise_scale_test.sp
-
20tests/vbic/temp.sp
-
23tests/vbic/tran_aplac_test.sp
-
46tests/vbic/vbic.sp
@ -0,0 +1,4 @@ |
|||
Two scripts from Colin McAndrew for vbic model. |
|||
|
|||
sgp2vbic - converts a Spice Gummel-Poon model card to a vbic model card. |
|||
vbis2sgb - converts a vbic model card to a Spice Gummel-Poom model card. |
|||
@ -0,0 +1,322 @@ |
|||
#!/bin/sh -- # perl |
|||
eval 'exec perl -S -x -w $0 ${1+"$@"}' |
|||
if 0; |
|||
|
|||
# |
|||
# sgp2vbic: program to convert an SGP .model card to VBIC |
|||
# |
|||
# Vers Date Who Comments |
|||
# ==== ========== ============= ======== |
|||
# 2.0 06/01/00 Colin McAndrew translated from shell/nawk version |
|||
# |
|||
|
|||
sub usage() { |
|||
print " |
|||
$prog: convert SGP .model card to VBIC .model card |
|||
|
|||
Usage: $prog [options] modelFile |
|||
|
|||
Files: |
|||
modelFile file with SGP .model card |
|||
|
|||
Options: |
|||
-d debug mode |
|||
-h print this help message |
|||
-i print detailed information |
|||
-v verbose mode |
|||
-vbeif Vbe do fwd Early voltage map at Vbe ($Vbeif) |
|||
-vceif Vce do fwd Early voltage map at Vce ($Vceif) |
|||
-vbcir Vbc do rev Early voltage map at Vbc ($Vbcir) |
|||
-vecir Vec do rev Early voltage map at Vec ($Vecir) |
|||
"; |
|||
} # End of: sub usage |
|||
|
|||
sub info() { |
|||
print " |
|||
This program maps an SGP .model card into a VBIC .model card. |
|||
For many parameters there is a 1-to-1 mapping between the two, |
|||
and the default VBIC parameters are such that the model extensions |
|||
that are not part of SGP are turned off. |
|||
|
|||
There are two fundamental and non-mappable differences between |
|||
the two models. First, the IRB emitter crowding based resistance |
|||
modulation model is not supported in VBIC. This parameter is |
|||
ignored. Second, the Early effect model is different, the bias |
|||
dependence is substantially better in VBIC than in SGP. This means |
|||
the models can be made to match only at specific biases. |
|||
These biases can be specified by the -vxxi[fr] flags. |
|||
"; |
|||
} # End of: sub info |
|||
|
|||
# |
|||
# Set program names and variables. |
|||
# |
|||
|
|||
$\="\n"; |
|||
$,=" "; |
|||
$Debug=""; |
|||
$Verbose=""; |
|||
$Number='([+-]?[0-9]+[.]?[0-9]*|[+-]?[0-9]+[.]?[0-9]*[eE][+-]?[0-9]+|[+-]?[.][0-9]+|[+-]?[.][0-9]+[eE][+-]?[0-9]+)'; |
|||
@prog=split("/",$0); |
|||
$prog=$prog[$#prog]; |
|||
$Pi=atan2(0,-1); |
|||
$Vbeif=0.6; |
|||
$Vceif=2.5; |
|||
$Vbcir=0.5; |
|||
$Vecir=2.5; |
|||
|
|||
# |
|||
# Parse command line arguments, allow argument |
|||
# flags to be any case. |
|||
# |
|||
|
|||
for (;;){ |
|||
if ($#ARGV < 0) { |
|||
last; |
|||
} elsif ($ARGV[0] =~ /^-d/i) { |
|||
$Debug="-d";$Verbose="-v"; |
|||
} elsif ($ARGV[0] =~ /^-h/i) { |
|||
&usage();exit(0); |
|||
} elsif ($ARGV[0] =~ /^-i/i) { |
|||
&info();exit(0); |
|||
} elsif ($ARGV[0] =~ /^-v$/i) { |
|||
$Verbose="-v"; |
|||
} elsif ($ARGV[0] =~ /^-vbeif$/i) { |
|||
shift(@ARGV); |
|||
if (!defined($ARGV[0])) { |
|||
die("ERROR: no value specified for -vbeif flag, stopped"); |
|||
} |
|||
$Vbeif=$ARGV[0]; |
|||
if ($Vbeif !~ /$Number/) { |
|||
die("ERROR: value for -vbeif flag must be a number, stopped"); |
|||
} |
|||
} elsif ($ARGV[0] =~ /^-vceif$/i) { |
|||
shift(@ARGV); |
|||
if (!defined($ARGV[0])) { |
|||
die("ERROR: no value specified for -vceif flag, stopped"); |
|||
} |
|||
$Vceif=$ARGV[0]; |
|||
if ($Vceif !~ /$Number/) { |
|||
die("ERROR: value for -vceif flag must be a number, stopped"); |
|||
} |
|||
} elsif ($ARGV[0] =~ /^-vbcir$/i) { |
|||
shift(@ARGV); |
|||
if (!defined($ARGV[0])) { |
|||
die("ERROR: no value specified for -vbcir flag, stopped"); |
|||
} |
|||
$Vbcir=$ARGV[0]; |
|||
if ($Vbcir !~ /$Number/) { |
|||
die("ERROR: value for -vbcir flag must be a number, stopped"); |
|||
} |
|||
} elsif ($ARGV[0] =~ /^-vecir$/i) { |
|||
shift(@ARGV); |
|||
if (!defined($ARGV[0])) { |
|||
die("ERROR: no value specified for -vecir flag, stopped"); |
|||
} |
|||
$Vecir=$ARGV[0]; |
|||
if ($Vecir !~ /$Number/) { |
|||
die("ERROR: value for -vecir flag must be a number, stopped"); |
|||
} |
|||
} elsif ($ARGV[0] =~ /^-/) { |
|||
&usage(); |
|||
die("ERROR: unknown flag $ARGV[0], stopped"); |
|||
} else { |
|||
last; |
|||
} |
|||
shift(@ARGV); |
|||
} |
|||
if ($#ARGV < 0) { |
|||
&usage();exit(1); # exit if no file name is specified |
|||
} |
|||
|
|||
$ModelFile=$ARGV[0]; |
|||
|
|||
sub QCDEPL { |
|||
my($vj,$p,$m,$f)=@_; |
|||
my($w,$xx,$cj,$qj); |
|||
|
|||
$w=1.0-$vj/$p; |
|||
if($w>=1.0-$f){ |
|||
$cj=$w**(-$m); |
|||
$qj=$p*(1.0-$w*$cj)/(1.0-$m); |
|||
} else { |
|||
$xx=(1.0-$f)**(-(1.0+$m)); |
|||
$cj=$xx*(1.0-$f*(1.0+$m)+$m*$vj/$p); |
|||
$qj=$xx*((1.0-$f*(1.0+$m))*($vj-$f*$p)+0.5*$m*($vj*$vj-$f*$f*$p*$p)/$p)+$p*(1.0-$xx*(1.0-$f)**2)/(1.0-$m); |
|||
} |
|||
return($qj,$cj); |
|||
} |
|||
|
|||
# |
|||
# Parse model file |
|||
# |
|||
|
|||
open(IF,"$ModelFile") || |
|||
die("ERROR: cannot open file $ModelFile, stopped"); |
|||
$inModel="no"; |
|||
while (<IF>) { |
|||
chomp;tr/A-Z/a-z/; |
|||
if ($_ =~ /^\s*$/) {next;} |
|||
if ($_ =~ /^\s*\*/) {next;} |
|||
last if ($_ !~ /^\+/ && $inModel eq "yes"); |
|||
if ($_ =~ /^\s*\.mod/) { |
|||
$inModel="yes";$model=$_;next; |
|||
} |
|||
if ($inModel eq "yes") { |
|||
$_=~s/^\+\s*/ /;$model.=$_;next; |
|||
} |
|||
} |
|||
close(IF); |
|||
$model=~s/\s*=\s*/=/g; |
|||
|
|||
# |
|||
# Set SGP parameters from .model card |
|||
# |
|||
|
|||
$val{"is"}=1.0e-16; |
|||
$val{"bf"}=100.0; |
|||
$val{"nf"}=1.0; |
|||
$val{"vaf"}=0.0; |
|||
$val{"ikf"}=0.0; |
|||
$val{"ise"}=0.0; |
|||
$val{"ne"}=1.5; |
|||
$val{"br"}=1.0; |
|||
$val{"nr"}=1.0; |
|||
$val{"var"}=0.0; |
|||
$val{"ikr"}=0.0; |
|||
$val{"isc"}=0.0; |
|||
$val{"nc"}=2.0; |
|||
$val{"rb"}=0.0; |
|||
$val{"rbm"}=0.0; |
|||
$val{"re"}=0.0; |
|||
$val{"rc"}=0.0; |
|||
$val{"cje"}=0.0; |
|||
$val{"vje"}=0.75; |
|||
$val{"mje"}=0.33; |
|||
$val{"cjc"}=0.0; |
|||
$val{"vjc"}=0.75; |
|||
$val{"mjc"}=0.33; |
|||
$val{"xcjc"}=1.0; |
|||
$val{"cjs"}=0.0; |
|||
$val{"vjs"}=0.75; |
|||
$val{"mjs"}=0.0; |
|||
$val{"fc"}=0.5; |
|||
$val{"tf"}=0.0; |
|||
$val{"xtf"}=0.0; |
|||
$val{"vtf"}=0.0; |
|||
$val{"itf"}=0.0; |
|||
$val{"ptf"}=0.0; |
|||
$val{"tr"}=0.0; |
|||
$val{"kf"}=0.0; |
|||
$val{"af"}=1.0; |
|||
$val{"eg"}=1.11; |
|||
$val{"xtb"}=0.0; |
|||
$val{"xti"}=3.0; |
|||
$alias{"va"}="vaf"; |
|||
$alias{"ik"}="ikf"; |
|||
$alias{"c2"}="ise"; |
|||
$alias{"vb"}="var"; |
|||
$alias{"c4"}="isc"; |
|||
$alias{"pe"}="vje"; |
|||
$alias{"me"}="mje"; |
|||
$alias{"pc"}="vjc"; |
|||
$alias{"mc"}="mjc"; |
|||
$alias{"ccs"}="cjs"; |
|||
$alias{"ps"}="vjs"; |
|||
$alias{"ms"}="mjs"; |
|||
$alias{"pt"}="xti"; |
|||
|
|||
@Field=split(/\s+/,$model); |
|||
$name=$Field[1]; |
|||
for ($i=3;$i<=$#Field;++$i) { |
|||
die("ERROR: term $Field[$i] is not in name=value format, stopped") |
|||
if ($Field[$i] !~ /=/); |
|||
($param,$value)=split(/=/,$Field[$i]); |
|||
die("ERROR: parameter $param must be a number, stopped") |
|||
if ($value !~ /$Number/); |
|||
if (defined($alias{$param})) {$param=$alias{$param};} |
|||
if ($param eq "irb") { |
|||
print STDERR "* WARNING: IRB parameter is not supported in vbic"; |
|||
next; |
|||
} |
|||
if (!defined($val{$param})) { |
|||
print STDERR "* WARNING: parameter $param is not supported in vbic"; |
|||
next; |
|||
} |
|||
$val{$param}=$value; |
|||
if ($param eq "rbm") {$done{"rbm"}="yes";} |
|||
} |
|||
if (!defined($done{"rbm"})) {$val{"rbm"}=$val{"rb"};} |
|||
if($val{"ise"}>1) {$val{"ise"}=$val{"ise"}*$val{"is"};} |
|||
if($val{"isc"}>1) {$val{"isc"}=$val{"isc"}*$val{"is"};} |
|||
$Vbcif=$Vbeif-$Vceif; |
|||
$Vbeir=$Vbcir-$Vecir; |
|||
($qjbef,$cj )=&QCDEPL($Vbeif,$val{"vje"},$val{"mje"},$val{"fc"}); |
|||
($qjbcf,$cjbcf)=&QCDEPL($Vbcif,$val{"vjc"},$val{"mjc"},$val{"fc"}); |
|||
($qjber,$cjber)=&QCDEPL($Vbeir,$val{"vje"},$val{"mje"},$val{"fc"}); |
|||
($qjbcr,$cj )=&QCDEPL($Vbcir,$val{"vjc"},$val{"mjc"},$val{"fc"}); |
|||
$ivaf=$val{"vaf"};if($ivaf>0){$ivaf=1/$ivaf;} |
|||
$ivar=$val{"var"};if($ivar>0){$ivar=1/$ivar;} |
|||
$godIf=$ivaf/(1-$Vbeif*$ivar-$Vbcif*$ivaf); |
|||
if($godIf<1e-10) {$godIf=1e-10;} |
|||
$godIr=$ivar/(1-$Vbeir*$ivar-$Vbcir*$ivaf); |
|||
if($godIr<1e-10) {$godIr=1e-10;} |
|||
$a11=$qjbcf-$cjbcf/$godIf; |
|||
$a12=$qjbef; |
|||
$r1=-1.0; |
|||
$a21=$qjbcr; |
|||
$a22=$qjber-$cjber/$godIr; |
|||
$r2=-1.0; |
|||
$det=$a11*$a22-$a12*$a21; |
|||
$ivef=($r1*$a22-$r2*$a12)/$det; |
|||
$iver=($r2*$a11-$r1*$a21)/$det; |
|||
$vef=1/$ivef;$ver=1/$iver; |
|||
|
|||
print '.model '.$name.' vbic |
|||
+ rcx = '.$val{"rc"}.' |
|||
+ rci = '."0.0".' |
|||
+ rbx = '.$val{"rbm"}.' |
|||
+ rbi = '.($val{"rb"}-$val{"rbm"}).' |
|||
+ re = '.$val{"re"}.' |
|||
+ is = '.$val{"is"}.' |
|||
+ nf = '.$val{"nf"}.' |
|||
+ nr = '.$val{"nr"}.' |
|||
+ fc = '.$val{"fc"}.' |
|||
+ cje = '.$val{"cje"}.' |
|||
+ pe = '.$val{"vje"}.' |
|||
+ me = '.$val{"mje"}.' |
|||
+ cjc = '.($val{"cjc"}*$val{"xcjc"}).' |
|||
+ cjep = '.($val{"cjc"}*(1.0-$val{"xcjc"})).' |
|||
+ pc = '.$val{"vjc"}.' |
|||
+ mc = '.$val{"mjc"}.' |
|||
+ cjcp = '.$val{"cjs"}.' |
|||
+ ps = '.$val{"vjs"}.' |
|||
+ ms = '.$val{"mjs"}.' |
|||
+ ibei = '.($val{"is"}/$val{"bf"}).' |
|||
+ nei = '.$val{"nf"}.' |
|||
+ iben = '.$val{"ise"}.' |
|||
+ nen = '.$val{"ne"}.' |
|||
+ ibci = '.($val{"is"}/$val{"br"}).' |
|||
+ nci = '.$val{"nr"}.' |
|||
+ ibcn = '.$val{"isc"}.' |
|||
+ ncn = '.$val{"nc"}.' |
|||
+ vef = '.$vef.' |
|||
+ ver = '.$ver.' |
|||
+ ikf = '.$val{"ikf"}.' |
|||
+ ikr = '.$val{"ikr"}.' |
|||
+ tf = '.$val{"tf"}.' |
|||
+ xtf = '.$val{"xtf"}.' |
|||
+ vtf = '.$val{"vtf"}.' |
|||
+ itf = '.$val{"itf"}.' |
|||
+ tr = '.$val{"tr"}.' |
|||
+ td = '.($val{"tf"}*$val{"ptf"}*$Pi/180.0).' |
|||
+ ea = '.$val{"eg"}.' |
|||
+ eaie = '.$val{"eg"}.' |
|||
+ eaic = '.$val{"eg"}.' |
|||
+ eane = '.$val{"eg"}.' |
|||
+ eanc = '.$val{"eg"}.' |
|||
+ xis = '.$val{"xti"}.' |
|||
+ xii = '.($val{"xti"}-$val{"xtb"}).' |
|||
+ xin = '.($val{"xti"}-$val{"ne"}*$val{"xtb"}).' |
|||
+ kfn = '.$val{"kf"}.' |
|||
+ afn = '.$val{"af"}; |
|||
@ -0,0 +1,311 @@ |
|||
#!/bin/sh -- # perl |
|||
eval 'exec perl -S -x -w $0 ${1+"$@"}' |
|||
if 0; |
|||
|
|||
# |
|||
# vbic2sgp: program to convert a VBIC .model card to SGP |
|||
# |
|||
# Vers Date Who Comments |
|||
# ==== ========== ============= ======== |
|||
# 1.0 07/17/00 Colin McAndrew modified sgp2vbic |
|||
# |
|||
|
|||
sub usage() { |
|||
print " |
|||
$prog: convert VBIC .model card to SGP .model card |
|||
|
|||
Usage: $prog [options] modelFile |
|||
|
|||
Files: |
|||
modelFile file with VBIC .model card |
|||
|
|||
Options: |
|||
-d debug mode |
|||
-h print this help message |
|||
-i print detailed information |
|||
-v verbose mode |
|||
-vbeif Vbe do fwd Early voltage map at Vbe ($Vbeif) |
|||
-vceif Vce do fwd Early voltage map at Vce ($Vceif) |
|||
-vbcir Vbc do rev Early voltage map at Vbc ($Vbcir) |
|||
-vecir Vec do rev Early voltage map at Vec ($Vecir) |
|||
"; |
|||
} # End of: sub usage |
|||
|
|||
sub info() { |
|||
print " |
|||
This program maps a VBIC .model card into an SGP .model card. |
|||
For many parameters there is a 1-to-1 mapping between the two, |
|||
and the default VBIC parameters are such that the model extensions |
|||
that are not part of SGP are turned off. However if the extensions |
|||
in VBIC are used, clearly they are not translated into SGP. |
|||
|
|||
In particular, note that using the separate ideality coefficients |
|||
for base current in VBIC will give a model that will NOT translate |
|||
into SGP properly. A simple calculation of BF(SGP)=IS(VBIC)/IBEI(VBIC) |
|||
is done, that will not be accurate if NEI(VBIC) is not equal to NF(VBIC). |
|||
|
|||
The Early effect model is different between VBIC and SGP, the bias |
|||
dependence is substantially better in VBIC than in SGP. This means |
|||
the models can be made to match only at specific biases. |
|||
These biases can be specified by the -vxxi[fr] flags. |
|||
"; |
|||
} # End of: sub info |
|||
|
|||
# |
|||
# Set program names and variables. |
|||
# |
|||
|
|||
$\="\n"; |
|||
$,=" "; |
|||
$Debug=""; |
|||
$Verbose=""; |
|||
$Number='([+-]?[0-9]+[.]?[0-9]*|[+-]?[0-9]+[.]?[0-9]*[eE][+-]?[0-9]+|[+-]?[.][0-9]+|[+-]?[.][0-9]+[eE][+-]?[0-9]+)'; |
|||
@prog=split("/",$0); |
|||
$prog=$prog[$#prog]; |
|||
$Pi=atan2(0,-1); |
|||
$Vbeif=0.6; |
|||
$Vceif=2.5; |
|||
$Vbcir=0.5; |
|||
$Vecir=2.5; |
|||
|
|||
# |
|||
# Parse command line arguments, allow argument |
|||
# flags to be any case. |
|||
# |
|||
|
|||
for (;;){ |
|||
if ($#ARGV < 0) { |
|||
last; |
|||
} elsif ($ARGV[0] =~ /^-d/i) { |
|||
$Debug="-d";$Verbose="-v"; |
|||
} elsif ($ARGV[0] =~ /^-h/i) { |
|||
&usage();exit(0); |
|||
} elsif ($ARGV[0] =~ /^-i/i) { |
|||
&info();exit(0); |
|||
} elsif ($ARGV[0] =~ /^-v$/i) { |
|||
$Verbose="-v"; |
|||
} elsif ($ARGV[0] =~ /^-vbeif$/i) { |
|||
shift(@ARGV); |
|||
if (!defined($ARGV[0])) { |
|||
die("ERROR: no value specified for -vbeif flag, stopped"); |
|||
} |
|||
$Vbeif=$ARGV[0]; |
|||
if ($Vbeif !~ /$Number/) { |
|||
die("ERROR: value for -vbeif flag must be a number, stopped"); |
|||
} |
|||
} elsif ($ARGV[0] =~ /^-vceif$/i) { |
|||
shift(@ARGV); |
|||
if (!defined($ARGV[0])) { |
|||
die("ERROR: no value specified for -vceif flag, stopped"); |
|||
} |
|||
$Vceif=$ARGV[0]; |
|||
if ($Vceif !~ /$Number/) { |
|||
die("ERROR: value for -vceif flag must be a number, stopped"); |
|||
} |
|||
} elsif ($ARGV[0] =~ /^-vbcir$/i) { |
|||
shift(@ARGV); |
|||
if (!defined($ARGV[0])) { |
|||
die("ERROR: no value specified for -vbcir flag, stopped"); |
|||
} |
|||
$Vbcir=$ARGV[0]; |
|||
if ($Vbcir !~ /$Number/) { |
|||
die("ERROR: value for -vbcir flag must be a number, stopped"); |
|||
} |
|||
} elsif ($ARGV[0] =~ /^-vecir$/i) { |
|||
shift(@ARGV); |
|||
if (!defined($ARGV[0])) { |
|||
die("ERROR: no value specified for -vecir flag, stopped"); |
|||
} |
|||
$Vecir=$ARGV[0]; |
|||
if ($Vecir !~ /$Number/) { |
|||
die("ERROR: value for -vecir flag must be a number, stopped"); |
|||
} |
|||
} elsif ($ARGV[0] =~ /^-/) { |
|||
&usage(); |
|||
die("ERROR: unknown flag $ARGV[0], stopped"); |
|||
} else { |
|||
last; |
|||
} |
|||
shift(@ARGV); |
|||
} |
|||
if ($#ARGV < 0) { |
|||
&usage();exit(1); # exit if no file name is specified |
|||
} |
|||
|
|||
$ModelFile=$ARGV[0]; |
|||
|
|||
sub QCDEPL { |
|||
my($vj,$p,$m,$f)=@_; |
|||
my($w,$xx,$cj,$qj); |
|||
|
|||
$w=1.0-$vj/$p; |
|||
if($w>=1.0-$f){ |
|||
$cj=$w**(-$m); |
|||
$qj=$p*(1.0-$w*$cj)/(1.0-$m); |
|||
} else { |
|||
$xx=(1.0-$f)**(-(1.0+$m)); |
|||
$cj=$xx*(1.0-$f*(1.0+$m)+$m*$vj/$p); |
|||
$qj=$xx*((1.0-$f*(1.0+$m))*($vj-$f*$p)+0.5*$m*($vj*$vj-$f*$f*$p*$p)/$p)+$p*(1.0-$xx*(1.0-$f)**2)/(1.0-$m); |
|||
} |
|||
return($qj,$cj); |
|||
} |
|||
|
|||
# |
|||
# Parse model file |
|||
# |
|||
|
|||
open(IF,"$ModelFile") || |
|||
die("ERROR: cannot open file $ModelFile, stopped"); |
|||
$inModel="no"; |
|||
while (<IF>) { |
|||
chomp;tr/A-Z/a-z/; |
|||
if ($_ =~ /^\s*$/) {next;} |
|||
if ($_ =~ /^\s*\*/) {next;} |
|||
last if ($_ !~ /^\+/ && $inModel eq "yes"); |
|||
if ($_ =~ /^\s*\.mod/) { |
|||
$inModel="yes";$model=$_;next; |
|||
} |
|||
if ($inModel eq "yes") { |
|||
$_=~s/^\+\s*/ /;$model.=$_;next; |
|||
} |
|||
} |
|||
close(IF); |
|||
$model=~s/\s*=\s*/=/g; |
|||
|
|||
# |
|||
# Set VBIC parameters from .model card |
|||
# |
|||
|
|||
$val{"is"}=1.0e-16; |
|||
$val{"nf"}=1.0; |
|||
$val{"nr"}=1.0; |
|||
$val{"ibei"}=1.0e-18; |
|||
$val{"nei"}=1.0; |
|||
$val{"vef"}=0.0; |
|||
$val{"ikf"}=0.0; |
|||
$val{"iben"}=0.0; |
|||
$val{"nen"}=1.5; |
|||
$val{"ibci"}=1.0e-16; |
|||
$val{"nci"}=1.0; |
|||
$val{"ver"}=0.0; |
|||
$val{"ikr"}=0.0; |
|||
$val{"ibcn"}=0.0; |
|||
$val{"ncn"}=2.0; |
|||
$val{"rbx"}=0.0; |
|||
$val{"rbi"}=0.0; |
|||
$val{"re"}=0.0; |
|||
$val{"rcx"}=0.0; |
|||
$val{"rci"}=0.0; |
|||
$val{"cje"}=0.0; |
|||
$val{"vje"}=0.75; |
|||
$val{"mje"}=0.33; |
|||
$val{"fc"}=0.9; |
|||
$val{"cjc"}=0.0; |
|||
$val{"cjep"}=0.0; |
|||
$val{"vjc"}=0.75; |
|||
$val{"mjc"}=0.33; |
|||
$val{"cjcp"}=0.0; |
|||
$val{"vjs"}=0.75; |
|||
$val{"mjs"}=0.0; |
|||
$val{"tf"}=0.0; |
|||
$val{"xtf"}=0.0; |
|||
$val{"vtf"}=0.0; |
|||
$val{"itf"}=0.0; |
|||
$val{"tr"}=0.0; |
|||
$val{"td"}=0.0; |
|||
$val{"kfn"}=0.0; |
|||
$val{"afn"}=1.0; |
|||
$val{"ea"}=1.12; |
|||
$val{"eaie"}=1.12; |
|||
$val{"eaic"}=1.12; |
|||
$val{"eane"}=1.12; |
|||
$val{"eanc"}=1.12; |
|||
$val{"xis"}=3; |
|||
$val{"xii"}=3; |
|||
$val{"xin"}=3; |
|||
$alias{"ik"}="ikf"; |
|||
$alias{"pe"}="vje"; |
|||
$alias{"me"}="mje"; |
|||
$alias{"pc"}="vjc"; |
|||
$alias{"mc"}="mjc"; |
|||
$alias{"ps"}="vjs"; |
|||
$alias{"ms"}="mjs"; |
|||
|
|||
@Field=split(/\s+/,$model); |
|||
$name=$Field[1]; |
|||
for ($i=3;$i<=$#Field;++$i) { |
|||
die("ERROR: term $Field[$i] is not in name=value format, stopped") |
|||
if ($Field[$i] !~ /=/); |
|||
($param,$value)=split(/=/,$Field[$i]); |
|||
die("ERROR: parameter $param must be a number, stopped") |
|||
if ($value !~ /$Number/); |
|||
if (defined($alias{$param})) {$param=$alias{$param};} |
|||
if (!defined($val{$param})) { |
|||
print STDERR "* WARNING: parameter $param is not supported in sgp"; |
|||
next; |
|||
} |
|||
$val{$param}=$value; |
|||
} |
|||
$Vbcif=$Vbeif-$Vceif; |
|||
$Vbeir=$Vbcir-$Vecir; |
|||
($qjbef,$cj )=&QCDEPL($Vbeif,$val{"vje"},$val{"mje"},$val{"fc"}); |
|||
($qjbcf,$cjbcf)=&QCDEPL($Vbcif,$val{"vjc"},$val{"mjc"},$val{"fc"}); |
|||
($qjber,$cjber)=&QCDEPL($Vbeir,$val{"vje"},$val{"mje"},$val{"fc"}); |
|||
($qjbcr,$cj )=&QCDEPL($Vbcir,$val{"vjc"},$val{"mjc"},$val{"fc"}); |
|||
$ivef=$val{"vef"};if($ivef>0){$ivef=1/$ivef;} |
|||
$iver=$val{"ver"};if($iver>0){$iver=1/$iver;} |
|||
$godIf=$cjbcf*$ivef/(1+$qjbef*$iver+$qjbcf*$ivef); |
|||
if($godIf<1e-10) {$godIf=1e-10;} |
|||
$godIr=$cjber*$iver/(1+$qjber*$iver+$qjbcr*$ivef); |
|||
if($godIr<1e-10) {$godIr=1e-10;} |
|||
$a11=-$Vbcif-1.0/$godIf; |
|||
$a12=-$Vbeif; |
|||
$r1 =-1.0; |
|||
$a21=-$Vbcir; |
|||
$a22=-$Vbeir-1.0/$godIr; |
|||
$r2 =-1.0; |
|||
$det=$a11*$a22-$a12*$a21; |
|||
$ivaf=($r1*$a22-$r2*$a12)/$det; |
|||
$ivar=($r2*$a11-$r1*$a21)/$det; |
|||
$vaf=1/$ivaf;$var=1/$ivar; |
|||
|
|||
print '.model '.$name.' sgp |
|||
+ rc = '.($val{"rcx"}+$val{"rci"}).' |
|||
+ rbm = '.$val{"rbx"}.' |
|||
+ rb = '.($val{"rbx"}+$val{"rbi"}).' |
|||
+ re = '.$val{"re"}.' |
|||
+ is = '.$val{"is"}.' |
|||
+ nf = '.$val{"nf"}.' |
|||
+ nr = '.$val{"nr"}.' |
|||
+ fc = '.$val{"fc"}.' |
|||
+ cje = '.$val{"cje"}.' |
|||
+ vje = '.$val{"vje"}.' |
|||
+ mje = '.$val{"mje"}.' |
|||
+ cjc = '.($val{"cjc"}+$val{"cjep"}).' |
|||
+ xcjc = '.($val{"cjc"}/($val{"cjc"}+$val{"cjep"})).' |
|||
+ pjc = '.$val{"vjc"}.' |
|||
+ mjc = '.$val{"mjc"}.' |
|||
+ cjs = '.$val{"cjcp"}.' |
|||
+ pjs = '.$val{"vjs"}.' |
|||
+ mjs = '.$val{"mjs"}.' |
|||
+ bf = '.($val{"is"}/$val{"ibei"}).' |
|||
+ ise = '.$val{"iben"}.' |
|||
+ ne = '.$val{"nen"}.' |
|||
+ br = '.($val{"is"}/$val{"ibci"}).' |
|||
+ isc = '.$val{"ibcn"}.' |
|||
+ nc = '.$val{"ncn"}.' |
|||
+ vaf = '.$vaf.' |
|||
+ var = '.$var.' |
|||
+ ikf = '.$val{"ikf"}.' |
|||
+ ikr = '.$val{"ikr"}.' |
|||
+ tf = '.$val{"tf"}.' |
|||
+ xtf = '.$val{"xtf"}.' |
|||
+ vtf = '.$val{"vtf"}.' |
|||
+ itf = '.$val{"itf"}.' |
|||
+ tr = '.$val{"tr"}.' |
|||
+ ptf = '.($val{"td"}*180.0/($val{"tf"}*$Pi)).' |
|||
+ eg = '.$val{"ea"}.' |
|||
+ xti = '.$val{"xis"}.' |
|||
+ xtb = '.($val{"xis"}-$val{"xii"}).' |
|||
+ kf = '.$val{"kfn"}.' |
|||
+ af = '.$val{"afn"}; |
|||
@ -0,0 +1,33 @@ |
|||
## Process this file with automake to produce Makefile.in
|
|||
|
|||
noinst_LIBRARIES = libvbic.a |
|||
|
|||
libvbic_a_SOURCES = \
|
|||
vbic.c \
|
|||
vbicacld.c \
|
|||
vbicask.c \
|
|||
vbicconv.c \
|
|||
vbicdefs.h \
|
|||
vbicdel.c \
|
|||
vbicdest.c \
|
|||
vbicext.h \
|
|||
vbicgetic.c \
|
|||
vbicinit.c \
|
|||
vbicinit.h \
|
|||
vbicitf.h \
|
|||
vbicload.c \
|
|||
vbicmask.c \
|
|||
vbicmdel.c \
|
|||
vbicmpar.c \
|
|||
vbicnoise.c \
|
|||
vbicparam.c \
|
|||
vbicpzld.c \
|
|||
vbicsetup.c \
|
|||
vbictemp.c \
|
|||
vbictrunc.c |
|||
|
|||
|
|||
|
|||
INCLUDES = -I$(top_srcdir)/src/include |
|||
|
|||
MAINTAINERCLEANFILES = Makefile.in |
|||
@ -0,0 +1,194 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This file defines the VBIC data structures that are |
|||
* available to the next level(s) up the calling hierarchy |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "devdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "suffix.h" |
|||
|
|||
IFparm VBICpTable[] = { /* parameters */ |
|||
IOPU("area", VBIC_AREA, IF_REAL, "Area factor"), |
|||
IOPU("off", VBIC_OFF, IF_FLAG, "Device initially off"), |
|||
IP("ic", VBIC_IC, IF_REALVEC, "Initial condition vector"), |
|||
IOPAU("icvbe", VBIC_IC_VBE, IF_REAL, "Initial B-E voltage"), |
|||
IOPAU("icvce", VBIC_IC_VCE, IF_REAL, "Initial C-E voltage"), |
|||
IOPU("temp", VBIC_TEMP, IF_REAL, "Instance temperature"), |
|||
IOPU("dtemp", VBIC_DTEMP, IF_REAL, "Instance delta temperature"), |
|||
IOPU("m", VBIC_M, IF_REAL, "Multiplier"), |
|||
|
|||
OPU("collnode", VBIC_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"), |
|||
OPU("basenode", VBIC_QUEST_BASENODE, IF_INTEGER, "Number of base node"), |
|||
OPU("emitnode", VBIC_QUEST_EMITNODE, IF_INTEGER, "Number of emitter node"), |
|||
OPU("collCXnode",VBIC_QUEST_COLLCXNODE,IF_INTEGER, "Internal collector node"), |
|||
OPU("collCInode",VBIC_QUEST_COLLCINODE,IF_INTEGER, "Internal collector node"), |
|||
OPU("baseBXnode",VBIC_QUEST_BASEBXNODE,IF_INTEGER, "Internal base node"), |
|||
OPU("baseBInode",VBIC_QUEST_BASEBINODE,IF_INTEGER, "Internal base node"), |
|||
OPU("baseBPnode",VBIC_QUEST_BASEBPNODE,IF_INTEGER, "Internal base node"), |
|||
OPU("emitEInode",VBIC_QUEST_EMITEINODE,IF_INTEGER, "Internal emitter node"), |
|||
OP("vbe", VBIC_QUEST_VBE, IF_REAL, "B-E voltage"), |
|||
OP("vbc", VBIC_QUEST_VBC, IF_REAL, "B-C voltage"), |
|||
OP("ic", VBIC_QUEST_CC, IF_REAL, "Collector current"), |
|||
OP("ib", VBIC_QUEST_CB, IF_REAL, "Base current"), |
|||
OP("ie", VBIC_QUEST_CE, IF_REAL, "Emitter current"), |
|||
OP("gm", VBIC_QUEST_GM, IF_REAL, "Small signal transconductance dIc/dVbe"), |
|||
OP("go", VBIC_QUEST_GO, IF_REAL, "Small signal output conductance dIc/dVbc"), |
|||
OP("gpi", VBIC_QUEST_GPI, IF_REAL, "Small signal input conductance dIb/dVbe"), |
|||
OP("gmu", VBIC_QUEST_GMU, IF_REAL, "Small signal conductance dIb/dVbc"), |
|||
OP("gx", VBIC_QUEST_GX, IF_REAL, "Conductance from base to internal base"), |
|||
OP("cbe", VBIC_QUEST_CBE, IF_REAL, "Internal base to emitter capacitance"), |
|||
OP("cbex", VBIC_QUEST_CBEX, IF_REAL, "External base to emitter capacitance"), |
|||
OP("cbc", VBIC_QUEST_CBC, IF_REAL, "Internal base to collector capacitance"), |
|||
OP("cbcx", VBIC_QUEST_CBCX, IF_REAL, "External Base to collector capacitance"), |
|||
OP("p", VBIC_QUEST_POWER,IF_REAL, "Power dissipation"), |
|||
OPU("geqcb",VBIC_QUEST_GEQCB,IF_REAL, "Internal C-B-base cap. equiv. cond."), |
|||
OPU("geqbx",VBIC_QUEST_GEQBX,IF_REAL, "External C-B-base cap. equiv. cond."), |
|||
OPU("qbe", VBIC_QUEST_QBE, IF_REAL, "Charge storage B-E junction"), |
|||
OPU("cqbe", VBIC_QUEST_CQBE, IF_REAL, "Cap. due to charge storage in B-E jct."), |
|||
OPU("qbc", VBIC_QUEST_QBC, IF_REAL, "Charge storage B-C junction"), |
|||
OPU("cqbc", VBIC_QUEST_CQBC, IF_REAL, "Cap. due to charge storage in B-C jct."), |
|||
OPU("qbx", VBIC_QUEST_QBX, IF_REAL, "Charge storage B-X junction"), |
|||
OPU("cqbx", VBIC_QUEST_CQBX, IF_REAL, "Cap. due to charge storage in B-X jct."), |
|||
OPU("sens_dc", VBIC_QUEST_SENS_DC, IF_REAL, "DC sensitivity "), |
|||
OPU("sens_real",VBIC_QUEST_SENS_REAL, IF_REAL, "Real part of AC sensitivity"), |
|||
OPU("sens_imag",VBIC_QUEST_SENS_IMAG,IF_REAL, "DC sens. & imag part of AC sens."), |
|||
OPU("sens_mag", VBIC_QUEST_SENS_MAG, IF_REAL, "Sensitivity of AC magnitude"), |
|||
OPU("sens_ph", VBIC_QUEST_SENS_PH, IF_REAL, "Sensitivity of AC phase"), |
|||
OPU("sens_cplx",VBIC_QUEST_SENS_CPLX, IF_COMPLEX, "AC sensitivity") |
|||
}; |
|||
|
|||
IFparm VBICmPTable[] = { /* model parameters */ |
|||
OP("type", VBIC_MOD_TYPE, IF_STRING, "NPN or PNP"), |
|||
IOPU("npn", VBIC_MOD_NPN, IF_FLAG, "NPN type device"), |
|||
IOPU("pnp", VBIC_MOD_PNP, IF_FLAG, "PNP type device"), |
|||
IOP("tnom", VBIC_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), |
|||
IOP("rcx", VBIC_MOD_RCX, IF_REAL, "Extrinsic coll resistance"), |
|||
IOP("rci", VBIC_MOD_RCI, IF_REAL, "Intrinsic coll resistance"), |
|||
IOP("vo", VBIC_MOD_VO, IF_REAL, "Epi drift saturation voltage"), |
|||
IOP("gamm", VBIC_MOD_GAMM, IF_REAL, "Epi doping parameter"), |
|||
IOP("hrcf", VBIC_MOD_HRCF, IF_REAL, "High current RC factor"), |
|||
IOP("rbx", VBIC_MOD_RBX, IF_REAL, "Extrinsic base resistance"), |
|||
IOP("rbi", VBIC_MOD_RBI, IF_REAL, "Intrinsic base resistance"), |
|||
IOP("re", VBIC_MOD_RE, IF_REAL, "Intrinsic emitter resistance"), |
|||
IOP("rs", VBIC_MOD_RS, IF_REAL, "Intrinsic substrate resistance"), |
|||
IOP("rbp", VBIC_MOD_RBP, IF_REAL, "Parasitic base resistance"), |
|||
IOP("is", VBIC_MOD_IS, IF_REAL, "Transport saturation current"), |
|||
IOP("nf", VBIC_MOD_NF, IF_REAL, "Forward emission coefficient"), |
|||
IOP("nr", VBIC_MOD_NR, IF_REAL, "Reverse emission coefficient"), |
|||
IOP("fc", VBIC_MOD_FC, IF_REAL, "Fwd bias depletion capacitance limit"), |
|||
IOP("cbeo", VBIC_MOD_CBEO, IF_REAL, "Extrinsic B-E overlap capacitance"), |
|||
IOP("cje", VBIC_MOD_CJE, IF_REAL, "Zero bias B-E depletion capacitance"), |
|||
IOP("pe", VBIC_MOD_PE, IF_REAL, "B-E built in potential"), |
|||
IOP("me", VBIC_MOD_ME, IF_REAL, "B-E junction grading coefficient"), |
|||
IOP("aje", VBIC_MOD_AJE, IF_REAL, "B-E capacitance smoothing factor"), |
|||
IOP("cbco", VBIC_MOD_CBCO, IF_REAL, "Extrinsic B-C overlap capacitance"), |
|||
IOP("cjc", VBIC_MOD_CJC, IF_REAL, "Zero bias B-C depletion capacitance"), |
|||
IOP("qco", VBIC_MOD_QCO, IF_REAL, "Epi charge parameter"), |
|||
IOP("cjep", VBIC_MOD_CJEP, IF_REAL, "B-C extrinsic zero bias capacitance"), |
|||
IOP("pc", VBIC_MOD_PC, IF_REAL, "B-C built in potential"), |
|||
IOP("mc", VBIC_MOD_MC, IF_REAL, "B-C junction grading coefficient"), |
|||
IOP("ajc", VBIC_MOD_AJC, IF_REAL, "B-C capacitance smoothing factor"), |
|||
IOP("cjcp", VBIC_MOD_CJCP, IF_REAL, "Zero bias S-C capacitance"), |
|||
IOP("ps", VBIC_MOD_PS, IF_REAL, "S-C junction built in potential"), |
|||
IOP("ms", VBIC_MOD_MS, IF_REAL, "S-C junction grading coefficient"), |
|||
IOP("ajs", VBIC_MOD_AJS, IF_REAL, "S-C capacitance smoothing factor"), |
|||
IOP("ibei", VBIC_MOD_IBEI, IF_REAL, "Ideal B-E saturation current"), |
|||
IOP("wbe", VBIC_MOD_WBE, IF_REAL, "Portion of IBEI from Vbei, 1-WBE from Vbex"), |
|||
IOP("nei", VBIC_MOD_NEI, IF_REAL, "Ideal B-E emission coefficient"), |
|||
IOP("iben", VBIC_MOD_IBEN, IF_REAL, "Non-ideal B-E saturation current"), |
|||
IOP("nen", VBIC_MOD_NEN, IF_REAL, "Non-ideal B-E emission coefficient"), |
|||
IOP("ibci", VBIC_MOD_IBCI, IF_REAL, "Ideal B-C saturation current"), |
|||
IOP("nci", VBIC_MOD_NCI, IF_REAL, "Ideal B-C emission coefficient"), |
|||
IOP("ibcn", VBIC_MOD_IBCN, IF_REAL, "Non-ideal B-C saturation current"), |
|||
IOP("ncn", VBIC_MOD_NCN, IF_REAL, "Non-ideal B-C emission coefficient"), |
|||
IOP("avc1", VBIC_MOD_AVC1, IF_REAL, "B-C weak avalanche parameter 1"), |
|||
IOP("avc2", VBIC_MOD_AVC2, IF_REAL, "B-C weak avalanche parameter 2"), |
|||
IOP("isp", VBIC_MOD_ISP, IF_REAL, "Parasitic transport saturation current"), |
|||
IOP("wsp", VBIC_MOD_WSP, IF_REAL, "Portion of ICCP"), |
|||
IOP("nfp", VBIC_MOD_NFP, IF_REAL, "Parasitic fwd emission coefficient"), |
|||
IOP("ibeip", VBIC_MOD_IBEIP, IF_REAL, "Ideal parasitic B-E saturation current"), |
|||
IOP("ibenp", VBIC_MOD_IBENP, IF_REAL, "Non-ideal parasitic B-E saturation current"), |
|||
IOP("ibcip", VBIC_MOD_IBCIP, IF_REAL, "Ideal parasitic B-C saturation current"), |
|||
IOP("ncip", VBIC_MOD_NCIP, IF_REAL, "Ideal parasitic B-C emission coefficient"), |
|||
IOP("ibcnp", VBIC_MOD_IBCNP, IF_REAL, "Nonideal parasitic B-C saturation current"), |
|||
IOP("ncnp", VBIC_MOD_NCNP, IF_REAL, "Nonideal parasitic B-C emission coefficient"), |
|||
IOP("vef", VBIC_MOD_VEF, IF_REAL, "Forward Early voltage"), |
|||
IOP("ver", VBIC_MOD_VER, IF_REAL, "Reverse Early voltage"), |
|||
IOP("ikf", VBIC_MOD_IKF, IF_REAL, "Forward knee current"), |
|||
IOP("ikr", VBIC_MOD_IKR, IF_REAL, "Reverse knee current"), |
|||
IOP("ikp", VBIC_MOD_IKP, IF_REAL, "Parasitic knee current"), |
|||
IOP("tf", VBIC_MOD_TF, IF_REAL, "Ideal forward transit time"), |
|||
IOP("qtf", VBIC_MOD_QTF, IF_REAL, "Variation of TF with base-width modulation"), |
|||
IOP("xtf", VBIC_MOD_XTF, IF_REAL, "Coefficient for bias dependence of TF"), |
|||
IOP("vtf", VBIC_MOD_VTF, IF_REAL, "Voltage giving VBC dependence of TF"), |
|||
IOP("itf", VBIC_MOD_ITF, IF_REAL, "High current dependence of TF"), |
|||
IOP("tr", VBIC_MOD_TR, IF_REAL, "Ideal reverse transit time"), |
|||
IOP("td", VBIC_MOD_TD, IF_REAL, "Forward excess-phase delay time"), |
|||
IOP("kfn", VBIC_MOD_KFN, IF_REAL, "B-E Flicker Noise Coefficient"), |
|||
IOP("afn", VBIC_MOD_AFN, IF_REAL, "B-E Flicker Noise Exponent"), |
|||
IOP("bfn", VBIC_MOD_BFN, IF_REAL, "B-E Flicker Noise 1/f dependence"), |
|||
IOP("xre", VBIC_MOD_XRE, IF_REAL, "Temperature exponent of RE"), |
|||
IOP("xrbi", VBIC_MOD_XRBI, IF_REAL, "Temperature exponent of RBI"), |
|||
IOP("xrci", VBIC_MOD_XRCI, IF_REAL, "Temperature exponent of RCI"), |
|||
IOP("xrs", VBIC_MOD_XRS, IF_REAL, "Temperature exponent of RS"), |
|||
IOP("xvo", VBIC_MOD_XVO, IF_REAL, "Temperature exponent of VO"), |
|||
IOP("ea", VBIC_MOD_EA, IF_REAL, "Activation energy for IS"), |
|||
IOP("eaie", VBIC_MOD_EAIE, IF_REAL, "Activation energy for IBEI"), |
|||
IOP("eaic", VBIC_MOD_EAIS, IF_REAL, "Activation energy for IBCI/IBEIP"), |
|||
IOP("eais", VBIC_MOD_EAIS, IF_REAL, "Activation energy for IBCIP"), |
|||
IOP("eane", VBIC_MOD_EANE, IF_REAL, "Activation energy for IBEN"), |
|||
IOP("eanc", VBIC_MOD_EANC, IF_REAL, "Activation energy for IBCN/IBENP"), |
|||
IOP("eans", VBIC_MOD_EANS, IF_REAL, "Activation energy for IBCNP"), |
|||
IOP("xis", VBIC_MOD_XIS, IF_REAL, "Temperature exponent of IS"), |
|||
IOP("xii", VBIC_MOD_XII, IF_REAL, "Temperature exponent of IBEI,IBCI,IBEIP,IBCIP"), |
|||
IOP("xin", VBIC_MOD_XIN, IF_REAL, "Temperature exponent of IBEN,IBCN,IBENP,IBCNP"), |
|||
IOP("tnf", VBIC_MOD_TNF, IF_REAL, "Temperature exponent of NF"), |
|||
IOP("tavc", VBIC_MOD_TAVC, IF_REAL, "Temperature exponent of AVC2"), |
|||
IOP("rth", VBIC_MOD_RTH, IF_REAL, "Thermal resistance"), |
|||
IOP("cth", VBIC_MOD_CTH, IF_REAL, "Thermal capacitance"), |
|||
IOP("vrt", VBIC_MOD_VRT, IF_REAL, "Punch-through voltage of internal B-C junction"), |
|||
IOP("art", VBIC_MOD_ART, IF_REAL, "Smoothing parameter for reach-through"), |
|||
IOP("ccso", VBIC_MOD_CCSO, IF_REAL, "Fixed C-S capacitance"), |
|||
IOP("qbm", VBIC_MOD_QBM, IF_REAL, "Select SGP qb formulation"), |
|||
IOP("nkf", VBIC_MOD_NKF, IF_REAL, "High current beta rolloff"), |
|||
IOP("xikf", VBIC_MOD_XIKF, IF_REAL, "Temperature exponent of IKF"), |
|||
IOP("xrcx", VBIC_MOD_XRCX, IF_REAL, "Temperature exponent of RCX"), |
|||
IOP("xrbx", VBIC_MOD_XRBX, IF_REAL, "Temperature exponent of RBX"), |
|||
IOP("xrbp", VBIC_MOD_XRBP, IF_REAL, "Temperature exponent of RBP"), |
|||
IOP("isrr", VBIC_MOD_ISRR, IF_REAL, "Separate IS for fwd and rev"), |
|||
IOP("xisr", VBIC_MOD_XISR, IF_REAL, "Temperature exponent of ISR"), |
|||
IOP("dear", VBIC_MOD_DEAR, IF_REAL, "Delta activation energy for ISRR"), |
|||
IOP("eap", VBIC_MOD_EAP, IF_REAL, "Exitivation energy for ISP"), |
|||
IOP("vbbe", VBIC_MOD_VBBE, IF_REAL, "B-E breakdown voltage"), |
|||
IOP("nbbe", VBIC_MOD_NBBE, IF_REAL, "B-E breakdown emission coefficient"), |
|||
IOP("ibbe", VBIC_MOD_IBBE, IF_REAL, "B-E breakdown current"), |
|||
IOP("tvbbe1",VBIC_MOD_TVBBE1,IF_REAL, "Linear temperature coefficient of VBBE"), |
|||
IOP("tvbbe2",VBIC_MOD_TVBBE2,IF_REAL, "Quadratic temperature coefficient of VBBE"), |
|||
IOP("tnbbe", VBIC_MOD_TNBBE, IF_REAL, "Temperature coefficient of NBBE"), |
|||
IOP("ebbe", VBIC_MOD_EBBE, IF_REAL, "exp(-VBBE/(NBBE*Vtv))"), |
|||
IOP("dtemp", VBIC_MOD_DTEMP, IF_REAL, "Locale Temperature difference"), |
|||
IOP("vers", VBIC_MOD_VERS, IF_REAL, "Revision Version"), |
|||
IOP("vref", VBIC_MOD_VREF, IF_REAL, "Reference Version"), |
|||
}; |
|||
|
|||
char *VBICnames[] = { |
|||
"collector", |
|||
"base", |
|||
"emitter", |
|||
"substrate" |
|||
}; |
|||
|
|||
|
|||
int VBICnSize = NUMELEMS(VBICnames); |
|||
int VBICpTSize = NUMELEMS(VBICpTable); |
|||
int VBICmPTSize = NUMELEMS(VBICmPTable); |
|||
int VBICiSize = sizeof(VBICinstance); |
|||
int VBICmSize = sizeof(VBICmodel); |
|||
@ -0,0 +1,245 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* Function to load the COMPLEX circuit matrix using the |
|||
* small signal parameters saved during a previous DC operating |
|||
* point analysis. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
VBICacLoad(GENmodel *inModel, CKTcircuit *ckt) |
|||
{ |
|||
VBICinstance *here; |
|||
VBICmodel *model = (VBICmodel*)inModel; |
|||
double Ibe_Vbei,Ibex_Vbex |
|||
,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci |
|||
,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci |
|||
,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei |
|||
,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci; |
|||
double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci, |
|||
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci; |
|||
|
|||
/* loop through all the models */ |
|||
for( ; model != NULL; model = model->VBICnextModel) { |
|||
|
|||
/* loop through all the instances of the model */ |
|||
for( here = model->VBICinstances; here!= NULL; |
|||
here = here->VBICnextInstance) { |
|||
|
|||
if (here->VBICowner != ARCHme) continue; |
|||
|
|||
Ircx_Vrcx = 1.0 / here->VBICtextCollResist * here->VBICarea * here->VBICm; |
|||
Irbx_Vrbx = 1.0 / here->VBICtextBaseResist * here->VBICarea * here->VBICm; |
|||
Ire_Vre = 1.0 / here->VBICtemitterResist * here->VBICarea * here->VBICm; |
|||
|
|||
Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); |
|||
Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex); |
|||
Itzf_Vbei = *(ckt->CKTstate0 + here->VBICitzf_Vbei); |
|||
Itzf_Vbci = *(ckt->CKTstate0 + here->VBICitzf_Vbci); |
|||
Itzr_Vbci = *(ckt->CKTstate0 + here->VBICitzr_Vbci); |
|||
Itzr_Vbei = *(ckt->CKTstate0 + here->VBICitzr_Vbei); |
|||
Ibc_Vbci = *(ckt->CKTstate0 + here->VBICibc_Vbci); |
|||
Ibc_Vbei = *(ckt->CKTstate0 + here->VBICibc_Vbei); |
|||
Ibep_Vbep = *(ckt->CKTstate0 + here->VBICibep_Vbep); |
|||
Irci_Vrci = *(ckt->CKTstate0 + here->VBICirci_Vrci); |
|||
Irci_Vbci = *(ckt->CKTstate0 + here->VBICirci_Vbci); |
|||
Irci_Vbcx = *(ckt->CKTstate0 + here->VBICirci_Vbcx); |
|||
Irbi_Vrbi = *(ckt->CKTstate0 + here->VBICirbi_Vrbi); |
|||
Irbi_Vbei = *(ckt->CKTstate0 + here->VBICirbi_Vbei); |
|||
Irbi_Vbci = *(ckt->CKTstate0 + here->VBICirbi_Vbci); |
|||
Irbp_Vrbp = *(ckt->CKTstate0 + here->VBICirbp_Vrbp); |
|||
Irbp_Vbep = *(ckt->CKTstate0 + here->VBICirbp_Vbep); |
|||
Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci); |
|||
|
|||
/* |
|||
c The real part |
|||
*/ |
|||
/* |
|||
c Stamp element: Ibe |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr) += Ibe_Vbei; |
|||
*(here->VBICbaseBIEmitEIPtr) += -Ibe_Vbei; |
|||
*(here->VBICemitEIBaseBIPtr) += -Ibe_Vbei; |
|||
*(here->VBICemitEIEmitEIPtr) += Ibe_Vbei; |
|||
/* |
|||
c Stamp element: Ibex |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr) += Ibex_Vbex; |
|||
*(here->VBICbaseBXEmitEIPtr) += -Ibex_Vbex; |
|||
*(here->VBICemitEIBaseBXPtr) += -Ibex_Vbex; |
|||
*(here->VBICemitEIEmitEIPtr) += Ibex_Vbex; |
|||
/* |
|||
c Stamp element: Itzf |
|||
*/ |
|||
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbei; |
|||
*(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei; |
|||
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbci; |
|||
*(here->VBICcollCICollCIPtr) += -Itzf_Vbci; |
|||
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei; |
|||
*(here->VBICemitEIEmitEIPtr) += Itzf_Vbei; |
|||
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci; |
|||
*(here->VBICemitEICollCIPtr) += Itzf_Vbci; |
|||
/* |
|||
c Stamp element: Itzr |
|||
*/ |
|||
*(here->VBICemitEIBaseBIPtr) += Itzr_Vbci; |
|||
*(here->VBICemitEICollCIPtr) += -Itzr_Vbci; |
|||
*(here->VBICemitEIBaseBIPtr) += Itzr_Vbei; |
|||
*(here->VBICemitEIEmitEIPtr) += -Itzr_Vbei; |
|||
*(here->VBICcollCIBaseBIPtr) += -Itzr_Vbci; |
|||
*(here->VBICcollCICollCIPtr) += Itzr_Vbci; |
|||
*(here->VBICcollCIBaseBIPtr) += -Itzr_Vbei; |
|||
*(here->VBICcollCIEmitEIPtr) += Itzr_Vbei; |
|||
/* |
|||
c Stamp element: Ibc |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr) += Ibc_Vbci; |
|||
*(here->VBICbaseBICollCIPtr) += -Ibc_Vbci; |
|||
*(here->VBICbaseBIBaseBIPtr) += Ibc_Vbei; |
|||
*(here->VBICbaseBIEmitEIPtr) += -Ibc_Vbei; |
|||
*(here->VBICcollCIBaseBIPtr) += -Ibc_Vbci; |
|||
*(here->VBICcollCICollCIPtr) += Ibc_Vbci; |
|||
*(here->VBICcollCIBaseBIPtr) += -Ibc_Vbei; |
|||
*(here->VBICcollCIEmitEIPtr) += Ibc_Vbei; |
|||
/* |
|||
c Stamp element: Ibep |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr) += Ibep_Vbep; |
|||
*(here->VBICbaseBXBaseBPPtr) += -Ibep_Vbep; |
|||
*(here->VBICbaseBPBaseBXPtr) += -Ibep_Vbep; |
|||
*(here->VBICbaseBPBaseBPPtr) += Ibep_Vbep; |
|||
/* |
|||
c Stamp element: Ircx |
|||
*/ |
|||
*(here->VBICcollCollPtr) += Ircx_Vrcx; |
|||
*(here->VBICcollCXCollCXPtr) += Ircx_Vrcx; |
|||
*(here->VBICcollCXCollPtr) += -Ircx_Vrcx; |
|||
*(here->VBICcollCollCXPtr) += -Ircx_Vrcx; |
|||
/* |
|||
c Stamp element: Irci |
|||
*/ |
|||
*(here->VBICcollCXCollCXPtr) += Irci_Vrci; |
|||
*(here->VBICcollCXCollCIPtr) += -Irci_Vrci; |
|||
*(here->VBICcollCXBaseBIPtr) += Irci_Vbci; |
|||
*(here->VBICcollCXCollCIPtr) += -Irci_Vbci; |
|||
*(here->VBICcollCXBaseBIPtr) += Irci_Vbcx; |
|||
*(here->VBICcollCXCollCXPtr) += -Irci_Vbcx; |
|||
*(here->VBICcollCICollCXPtr) += -Irci_Vrci; |
|||
*(here->VBICcollCICollCIPtr) += Irci_Vrci; |
|||
*(here->VBICcollCIBaseBIPtr) += -Irci_Vbci; |
|||
*(here->VBICcollCICollCIPtr) += Irci_Vbci; |
|||
*(here->VBICcollCIBaseBIPtr) += -Irci_Vbcx; |
|||
*(here->VBICcollCICollCXPtr) += Irci_Vbcx; |
|||
/* |
|||
c Stamp element: Irbx |
|||
*/ |
|||
*(here->VBICbaseBasePtr) += Irbx_Vrbx; |
|||
*(here->VBICbaseBXBaseBXPtr) += Irbx_Vrbx; |
|||
*(here->VBICbaseBXBasePtr) += -Irbx_Vrbx; |
|||
*(here->VBICbaseBaseBXPtr) += -Irbx_Vrbx; |
|||
/* |
|||
c Stamp element: Irbi |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr) += Irbi_Vrbi; |
|||
*(here->VBICbaseBXBaseBIPtr) += -Irbi_Vrbi; |
|||
*(here->VBICbaseBXBaseBIPtr) += Irbi_Vbei; |
|||
*(here->VBICbaseBXEmitEIPtr) += -Irbi_Vbei; |
|||
*(here->VBICbaseBXBaseBIPtr) += Irbi_Vbci; |
|||
*(here->VBICbaseBXCollCIPtr) += -Irbi_Vbci; |
|||
*(here->VBICbaseBIBaseBXPtr) += -Irbi_Vrbi; |
|||
*(here->VBICbaseBIBaseBIPtr) += Irbi_Vrbi; |
|||
*(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbei; |
|||
*(here->VBICbaseBIEmitEIPtr) += Irbi_Vbei; |
|||
*(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbci; |
|||
*(here->VBICbaseBICollCIPtr) += Irbi_Vbci; |
|||
/* |
|||
c Stamp element: Ire |
|||
*/ |
|||
*(here->VBICemitEmitPtr) += Ire_Vre; |
|||
*(here->VBICemitEIEmitEIPtr) += Ire_Vre; |
|||
*(here->VBICemitEIEmitPtr) += -Ire_Vre; |
|||
*(here->VBICemitEmitEIPtr) += -Ire_Vre; |
|||
/* |
|||
c Stamp element: Irbp |
|||
*/ |
|||
*(here->VBICbaseBPBaseBPPtr) += Irbp_Vrbp; |
|||
*(here->VBICbaseBPCollCXPtr) += -Irbp_Vrbp; |
|||
*(here->VBICbaseBPBaseBXPtr) += Irbp_Vbep; |
|||
*(here->VBICbaseBPBaseBPPtr) += -Irbp_Vbep; |
|||
*(here->VBICbaseBPBaseBIPtr) += Irbp_Vbci; |
|||
*(here->VBICbaseBPCollCIPtr) += -Irbp_Vbci; |
|||
*(here->VBICcollCXBaseBPPtr) += -Irbp_Vrbp; |
|||
*(here->VBICcollCXCollCXPtr) += Irbp_Vrbp; |
|||
*(here->VBICcollCXBaseBXPtr) += -Irbp_Vbep; |
|||
*(here->VBICcollCXBaseBPPtr) += Irbp_Vbep; |
|||
*(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci; |
|||
*(here->VBICcollCXCollCIPtr) += Irbp_Vbci; |
|||
/* |
|||
c The complex part |
|||
*/ |
|||
XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe) * ckt->CKTomega; |
|||
XQbe_Vbci = *(ckt->CKTstate0 + here->VBICcqbeci) * ckt->CKTomega; |
|||
XQbex_Vbex = *(ckt->CKTstate0 + here->VBICcqbex) * ckt->CKTomega; |
|||
XQbc_Vbci = *(ckt->CKTstate0 + here->VBICcqbc) * ckt->CKTomega; |
|||
XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx) * ckt->CKTomega; |
|||
XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep) * ckt->CKTomega; |
|||
XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci) * ckt->CKTomega; |
|||
/* |
|||
c Stamp element: Qbe |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbei; |
|||
*(here->VBICbaseBIEmitEIPtr + 1) += -XQbe_Vbei; |
|||
*(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbci; |
|||
*(here->VBICbaseBICollCIPtr + 1) += -XQbe_Vbci; |
|||
*(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbei; |
|||
*(here->VBICemitEIEmitEIPtr + 1) += XQbe_Vbei; |
|||
*(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbci; |
|||
*(here->VBICemitEICollCIPtr + 1) += XQbe_Vbci; |
|||
/* |
|||
c Stamp element: Qbex |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr + 1) += XQbex_Vbex; |
|||
*(here->VBICbaseBXEmitEIPtr + 1) += -XQbex_Vbex; |
|||
*(here->VBICemitEIBaseBXPtr + 1) += -XQbex_Vbex; |
|||
*(here->VBICemitEIEmitEIPtr + 1) += XQbex_Vbex; |
|||
/* |
|||
c Stamp element: Qbc |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr + 1) += XQbc_Vbci; |
|||
*(here->VBICbaseBICollCIPtr + 1) += -XQbc_Vbci; |
|||
*(here->VBICcollCIBaseBIPtr + 1) += -XQbc_Vbci; |
|||
*(here->VBICcollCICollCIPtr + 1) += XQbc_Vbci; |
|||
/* |
|||
c Stamp element: Qbcx |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr + 1) += XQbcx_Vbcx; |
|||
*(here->VBICbaseBICollCXPtr + 1) += -XQbcx_Vbcx; |
|||
*(here->VBICcollCXBaseBIPtr + 1) += -XQbcx_Vbcx; |
|||
*(here->VBICcollCXCollCXPtr + 1) += XQbcx_Vbcx; |
|||
/* |
|||
c Stamp element: Qbep |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr + 1) += XQbep_Vbep; |
|||
*(here->VBICbaseBXBaseBPPtr + 1) += -XQbep_Vbep; |
|||
*(here->VBICbaseBXBaseBIPtr + 1) += XQbep_Vbci; |
|||
*(here->VBICbaseBXCollCIPtr + 1) += -XQbep_Vbci; |
|||
*(here->VBICbaseBPBaseBXPtr + 1) += -XQbep_Vbep; |
|||
*(here->VBICbaseBPBaseBPPtr + 1) += XQbep_Vbep; |
|||
*(here->VBICbaseBPBaseBIPtr + 1) += -XQbep_Vbci; |
|||
*(here->VBICbaseBPCollCIPtr + 1) += XQbep_Vbci; |
|||
|
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -0,0 +1,198 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Mathew Lew and Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine gives access to the internal device |
|||
* parameters for VBICs |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "const.h" |
|||
#include "cktdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "ifsim.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
/*ARGSUSED*/ |
|||
int |
|||
VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select) |
|||
{ |
|||
VBICinstance *here = (VBICinstance*)instPtr; |
|||
int itmp; |
|||
double vr; |
|||
double vi; |
|||
double sr; |
|||
double si; |
|||
double vm; |
|||
static char *msg = "Current and power not available for ac analysis"; |
|||
switch(which) { |
|||
case VBIC_AREA: |
|||
value->rValue = here->VBICarea; |
|||
return(OK); |
|||
case VBIC_OFF: |
|||
value->iValue = here->VBICoff; |
|||
return(OK); |
|||
case VBIC_IC_VBE: |
|||
value->rValue = here->VBICicVBE; |
|||
return(OK); |
|||
case VBIC_IC_VCE: |
|||
value->rValue = here->VBICicVCE; |
|||
return(OK); |
|||
case VBIC_TEMP: |
|||
value->rValue = here->VBICtemp - CONSTCtoK; |
|||
return(OK); |
|||
case VBIC_M: |
|||
value->rValue = here->VBICm; |
|||
return(OK); |
|||
case VBIC_QUEST_COLLNODE: |
|||
value->iValue = here->VBICcollNode; |
|||
return(OK); |
|||
case VBIC_QUEST_BASENODE: |
|||
value->iValue = here->VBICbaseNode; |
|||
return(OK); |
|||
case VBIC_QUEST_EMITNODE: |
|||
value->iValue = here->VBICemitNode; |
|||
return(OK); |
|||
case VBIC_QUEST_COLLCXNODE: |
|||
value->iValue = here->VBICcollCXNode; |
|||
return(OK); |
|||
case VBIC_QUEST_BASEBXNODE: |
|||
value->iValue = here->VBICbaseBXNode; |
|||
return(OK); |
|||
case VBIC_QUEST_EMITEINODE: |
|||
value->iValue = here->VBICemitEINode; |
|||
return(OK); |
|||
case VBIC_QUEST_VBE: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICvbei); |
|||
return(OK); |
|||
case VBIC_QUEST_VBC: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICvbci); |
|||
return(OK); |
|||
case VBIC_QUEST_CC: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICitzf) - |
|||
*(ckt->CKTstate0 + here->VBICitzr) - |
|||
*(ckt->CKTstate0 + here->VBICibc); |
|||
return(OK); |
|||
case VBIC_QUEST_CB: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICibe) + |
|||
*(ckt->CKTstate0 + here->VBICibc) + |
|||
*(ckt->CKTstate0 + here->VBICibep) + |
|||
*(ckt->CKTstate0 + here->VBICibex); |
|||
return(OK); |
|||
case VBIC_QUEST_CE: |
|||
value->rValue = - *(ckt->CKTstate0 + here->VBICibe) - |
|||
*(ckt->CKTstate0 + here->VBICibex) - |
|||
*(ckt->CKTstate0 + here->VBICitzf) + |
|||
*(ckt->CKTstate0 + here->VBICitzr); |
|||
return(OK); |
|||
case VBIC_QUEST_POWER: |
|||
value->rValue = fabs(*(ckt->CKTstate0 + here->VBICitzf) - *(ckt->CKTstate0 + here->VBICitzr)) |
|||
* fabs(*(ckt->CKTstate0 + here->VBICvbei) - *(ckt->CKTstate0 + here->VBICvbci)) + |
|||
fabs(*(ckt->CKTstate0 + here->VBICibe) * *(ckt->CKTstate0 + here->VBICvbei)) + |
|||
fabs(*(ckt->CKTstate0 + here->VBICibex) * *(ckt->CKTstate0 + here->VBICvbex)) + |
|||
fabs(*(ckt->CKTstate0 + here->VBICibc) * *(ckt->CKTstate0 + here->VBICvbci)); |
|||
return(OK); |
|||
case VBIC_QUEST_GM: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICitzf_Vbei); |
|||
return(OK); |
|||
case VBIC_QUEST_GO: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICitzf_Vbci); |
|||
return(OK); |
|||
case VBIC_QUEST_GPI: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICibe_Vbei); |
|||
return(OK); |
|||
case VBIC_QUEST_GMU: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICibc_Vbci); |
|||
return(OK); |
|||
case VBIC_QUEST_GX: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICirbi_Vrbi); |
|||
return(OK); |
|||
case VBIC_QUEST_CBE: |
|||
value->rValue = here->VBICcapbe; |
|||
return(OK); |
|||
case VBIC_QUEST_CBEX: |
|||
value->rValue = here->VBICcapbex; |
|||
return(OK); |
|||
case VBIC_QUEST_CBC: |
|||
value->rValue = here->VBICcapbc; |
|||
return(OK); |
|||
case VBIC_QUEST_CBCX: |
|||
value->rValue = here->VBICcapbcx; |
|||
return(OK); |
|||
case VBIC_QUEST_QBE: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICqbe); |
|||
return(OK); |
|||
case VBIC_QUEST_QBC: |
|||
value->rValue = *(ckt->CKTstate0 + here->VBICqbc); |
|||
return(OK); |
|||
case VBIC_QUEST_SENS_DC: |
|||
if(ckt->CKTsenInfo){ |
|||
value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+ |
|||
here->VBICsenParmNo); |
|||
} |
|||
return(OK); |
|||
case VBIC_QUEST_SENS_REAL: |
|||
if(ckt->CKTsenInfo){ |
|||
value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ |
|||
here->VBICsenParmNo); |
|||
} |
|||
return(OK); |
|||
case VBIC_QUEST_SENS_IMAG: |
|||
if(ckt->CKTsenInfo){ |
|||
value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ |
|||
here->VBICsenParmNo); |
|||
} |
|||
return(OK); |
|||
case VBIC_QUEST_SENS_MAG: |
|||
if(ckt->CKTsenInfo){ |
|||
vr = *(ckt->CKTrhsOld + select->iValue + 1); |
|||
vi = *(ckt->CKTirhsOld + select->iValue + 1); |
|||
vm = sqrt(vr*vr + vi*vi); |
|||
if(vm == 0){ |
|||
value->rValue = 0; |
|||
return(OK); |
|||
} |
|||
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ |
|||
here->VBICsenParmNo); |
|||
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ |
|||
here->VBICsenParmNo); |
|||
value->rValue = (vr * sr + vi * si)/vm; |
|||
} |
|||
return(OK); |
|||
case VBIC_QUEST_SENS_PH: |
|||
if(ckt->CKTsenInfo){ |
|||
vr = *(ckt->CKTrhsOld + select->iValue + 1); |
|||
vi = *(ckt->CKTirhsOld + select->iValue + 1); |
|||
vm = vr*vr + vi*vi; |
|||
if(vm == 0){ |
|||
value->rValue = 0; |
|||
return(OK); |
|||
} |
|||
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+ |
|||
here->VBICsenParmNo); |
|||
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+ |
|||
here->VBICsenParmNo); |
|||
|
|||
value->rValue = (vr * si - vi * sr)/vm; |
|||
} |
|||
return(OK); |
|||
case VBIC_QUEST_SENS_CPLX: |
|||
if(ckt->CKTsenInfo){ |
|||
itmp = select->iValue + 1; |
|||
value->cValue.real= *(ckt->CKTsenInfo->SEN_RHS[itmp]+ |
|||
here->VBICsenParmNo); |
|||
value->cValue.imag= *(ckt->CKTsenInfo->SEN_iRHS[itmp]+ |
|||
here->VBICsenParmNo); |
|||
} |
|||
return(OK); |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
/* NOTREACHED */ |
|||
} |
|||
|
|||
@ -0,0 +1,177 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine performs the device convergence test for |
|||
* VBICs in the circuit. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
VBICconvTest(GENmodel *inModel, CKTcircuit *ckt) |
|||
{ |
|||
VBICinstance *here; |
|||
VBICmodel *model = (VBICmodel *) inModel; |
|||
double tol; |
|||
double delvbei; |
|||
double delvbex; |
|||
double delvbci; |
|||
double delvbcx; |
|||
double delvbep; |
|||
double delvrci; |
|||
double delvrbi; |
|||
double delvrbp; |
|||
double ibehat; |
|||
double ibexhat; |
|||
double itzfhat; |
|||
double itzrhat; |
|||
double ibchat; |
|||
double ibephat; |
|||
double ircihat; |
|||
double irbihat; |
|||
double irbphat; |
|||
double Vbei, Vbex, Vbci, Vbcx, Vbep, Vrci, Vrbi, Vrbp; |
|||
double Ibe, Ibex, Itzf, Itzr, Ibc, Ibep, Irci, Irbi, Irbp; |
|||
|
|||
for( ; model != NULL; model = model->VBICnextModel) { |
|||
for(here=model->VBICinstances;here!=NULL; |
|||
here = here->VBICnextInstance) { |
|||
if (here->VBICowner != ARCHme) continue; |
|||
|
|||
Vbei=model->VBICtype*( |
|||
*(ckt->CKTrhsOld+here->VBICbaseBINode)- |
|||
*(ckt->CKTrhsOld+here->VBICemitEINode)); |
|||
Vbex=model->VBICtype*( |
|||
*(ckt->CKTrhsOld+here->VBICbaseBXNode)- |
|||
*(ckt->CKTrhsOld+here->VBICemitEINode)); |
|||
Vbci =model->VBICtype*( |
|||
*(ckt->CKTrhsOld+here->VBICbaseBINode)- |
|||
*(ckt->CKTrhsOld+here->VBICcollCINode)); |
|||
Vbcx =model->VBICtype*( |
|||
*(ckt->CKTrhsOld+here->VBICbaseBINode)- |
|||
*(ckt->CKTrhsOld+here->VBICcollCXNode)); |
|||
Vbep =model->VBICtype*( |
|||
*(ckt->CKTrhsOld+here->VBICbaseBXNode)- |
|||
*(ckt->CKTrhsOld+here->VBICbaseBPNode)); |
|||
Vrci =model->VBICtype*( |
|||
*(ckt->CKTrhsOld+here->VBICcollCXNode)- |
|||
*(ckt->CKTrhsOld+here->VBICcollCINode)); |
|||
Vrbi =model->VBICtype*( |
|||
*(ckt->CKTrhsOld+here->VBICbaseBXNode)- |
|||
*(ckt->CKTrhsOld+here->VBICbaseBINode)); |
|||
Vrbp =model->VBICtype*( |
|||
*(ckt->CKTrhsOld+here->VBICbaseBPNode)- |
|||
*(ckt->CKTrhsOld+here->VBICcollCXNode)); |
|||
delvbei = Vbei - *(ckt->CKTstate0 + here->VBICvbei); |
|||
delvbex = Vbex - *(ckt->CKTstate0 + here->VBICvbex); |
|||
delvbci = Vbci - *(ckt->CKTstate0 + here->VBICvbci); |
|||
delvbcx = Vbcx - *(ckt->CKTstate0 + here->VBICvbcx); |
|||
delvbep = Vbep - *(ckt->CKTstate0 + here->VBICvbep); |
|||
delvrci = Vrci - *(ckt->CKTstate0 + here->VBICvrci); |
|||
delvrbi = Vrbi - *(ckt->CKTstate0 + here->VBICvrbi); |
|||
delvrbp = Vrbp - *(ckt->CKTstate0 + here->VBICvrbp); |
|||
ibehat = *(ckt->CKTstate0 + here->VBICibe) + |
|||
*(ckt->CKTstate0 + here->VBICibe_Vbei)*delvbei; |
|||
ibexhat = *(ckt->CKTstate0 + here->VBICibex) + |
|||
*(ckt->CKTstate0 + here->VBICibex_Vbex)*delvbex; |
|||
itzfhat = *(ckt->CKTstate0 + here->VBICitzf) + |
|||
*(ckt->CKTstate0 + here->VBICitzf_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICitzf_Vbci)*delvbci; |
|||
itzrhat = *(ckt->CKTstate0 + here->VBICitzr) + |
|||
*(ckt->CKTstate0 + here->VBICitzr_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICitzr_Vbci)*delvbci; |
|||
ibchat = *(ckt->CKTstate0 + here->VBICibc) + |
|||
*(ckt->CKTstate0 + here->VBICibc_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICibc_Vbci)*delvbci; |
|||
ibephat = *(ckt->CKTstate0 + here->VBICibep) + |
|||
*(ckt->CKTstate0 + here->VBICibep_Vbep)*delvbep; |
|||
ircihat = *(ckt->CKTstate0 + here->VBICirci) + *(ckt->CKTstate0 + here->VBICirci_Vrci)*delvrci + |
|||
*(ckt->CKTstate0 + here->VBICirci_Vbcx)*delvbcx + *(ckt->CKTstate0 + here->VBICirci_Vbci)*delvbci; |
|||
irbihat = *(ckt->CKTstate0 + here->VBICirbi) + *(ckt->CKTstate0 + here->VBICirbi_Vrbi)*delvrbi + |
|||
*(ckt->CKTstate0 + here->VBICirbi_Vbei)*delvbei + *(ckt->CKTstate0 + here->VBICirbi_Vbci)*delvbci; |
|||
irbphat = *(ckt->CKTstate0 + here->VBICirbp) + *(ckt->CKTstate0 + here->VBICirbp_Vrbp)*delvrbp + |
|||
*(ckt->CKTstate0 + here->VBICirbp_Vbep)*delvbep + *(ckt->CKTstate0 + here->VBICirbp_Vbci)*delvbci; |
|||
Ibe = *(ckt->CKTstate0 + here->VBICibe); |
|||
Ibex = *(ckt->CKTstate0 + here->VBICibex); |
|||
Itzf = *(ckt->CKTstate0 + here->VBICitzf); |
|||
Itzr = *(ckt->CKTstate0 + here->VBICitzr); |
|||
Ibc = *(ckt->CKTstate0 + here->VBICibc); |
|||
Ibep = *(ckt->CKTstate0 + here->VBICibep); |
|||
Irci = *(ckt->CKTstate0 + here->VBICirci); |
|||
Irbi = *(ckt->CKTstate0 + here->VBICirbi); |
|||
Irbp = *(ckt->CKTstate0 + here->VBICirbp); |
|||
/* |
|||
* check convergence |
|||
*/ |
|||
tol=ckt->CKTreltol*MAX(fabs(ibehat),fabs(Ibe))+ckt->CKTabstol; |
|||
if (fabs(ibehat-Ibe) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} else { |
|||
tol=ckt->CKTreltol*MAX(fabs(ibexhat),fabs(Ibex))+ckt->CKTabstol; |
|||
if (fabs(ibexhat-Ibex) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} else { |
|||
tol=ckt->CKTreltol*MAX(fabs(itzfhat),fabs(Itzf))+ckt->CKTabstol; |
|||
if (fabs(itzfhat-Itzf) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} else { |
|||
tol=ckt->CKTreltol*MAX(fabs(itzrhat),fabs(Itzr))+ckt->CKTabstol; |
|||
if (fabs(itzrhat-Itzr) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} else { |
|||
tol=ckt->CKTreltol*MAX(fabs(ibchat),fabs(Ibc))+ckt->CKTabstol; |
|||
if (fabs(ibchat-Ibc) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} else { |
|||
tol=ckt->CKTreltol*MAX(fabs(ibephat),fabs(Ibep))+ckt->CKTabstol; |
|||
if (fabs(ibephat-Ibep) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} else { |
|||
tol=ckt->CKTreltol*MAX(fabs(ircihat),fabs(Irci))+ckt->CKTabstol; |
|||
if (fabs(ircihat-Irci) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} else { |
|||
tol=ckt->CKTreltol*MAX(fabs(irbihat),fabs(Irbi))+ckt->CKTabstol; |
|||
if (fabs(irbihat-Irbi) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} else { |
|||
tol=ckt->CKTreltol*MAX(fabs(irbphat),fabs(Irbp))+ckt->CKTabstol; |
|||
if (fabs(irbphat-Irbp) > tol) { |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); /* no reason to continue - we've failed... */ |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -0,0 +1,725 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
#ifndef VBIC |
|||
#define VBIC |
|||
|
|||
#include "cktdefs.h" |
|||
#include "ifsim.h" |
|||
#include "gendefs.h" |
|||
#include "complex.h" |
|||
#include "noisedef.h" |
|||
|
|||
/* structures to describe Bipolar Junction Transistors */ |
|||
|
|||
/* data needed to describe a single instance */ |
|||
|
|||
typedef struct sVBICinstance { |
|||
struct sVBICmodel *VBICmodPtr; /* backpointer to model */ |
|||
struct sVBICinstance *VBICnextInstance; /* pointer to next instance of |
|||
current model*/ |
|||
IFuid VBICname; /* pointer to character string naming this instance */ |
|||
int VBICowner; /* number of owner process */ |
|||
int VBICstate; /* pointer to start of state vector for vbic */ |
|||
|
|||
int VBICcollNode; /* number of collector node of vbic */ |
|||
int VBICbaseNode; /* number of base node of vbic */ |
|||
int VBICemitNode; /* number of emitter node of vbic */ |
|||
int VBICcollCXNode; /* number of internal collector node of vbic */ |
|||
int VBICcollCINode; /* number of internal collector node of vbic */ |
|||
int VBICbaseBXNode; /* number of internal base node of vbic */ |
|||
int VBICbaseBINode; /* number of internal base node of vbic */ |
|||
int VBICemitEINode; /* number of internal emitter node of vbic */ |
|||
int VBICbaseBPNode; /* number of internal base node of vbic */ |
|||
|
|||
double VBICarea; /* area factor for the vbic */ |
|||
double VBICicVBE; /* initial condition voltage B-E*/ |
|||
double VBICicVCE; /* initial condition voltage C-E*/ |
|||
double VBICtemp; /* instance temperature */ |
|||
double VBICdtemp; /* instance delta temperature */ |
|||
double VBICm; /* multiply factor for the vbic */ |
|||
|
|||
double VBICtVcrit; |
|||
double VBICttnom; /* temperature adjusted model parameters per instance */ |
|||
double VBICtextCollResist; |
|||
double VBICtintCollResist; |
|||
double VBICtepiSatVoltage; |
|||
double VBICtepiDoping; |
|||
double VBICtextBaseResist; |
|||
double VBICtintBaseResist; |
|||
double VBICtemitterResist; |
|||
double VBICtsubstrateResist; |
|||
double VBICtparBaseResist; |
|||
double VBICtsatCur; |
|||
double VBICtemissionCoeffF; |
|||
double VBICtemissionCoeffR; |
|||
double VBICtdepletionCapBE; |
|||
double VBICtpotentialBE; |
|||
double VBICtdepletionCapBC; |
|||
double VBICtextCapBC; |
|||
double VBICtpotentialBC; |
|||
double VBICtextCapSC; |
|||
double VBICtpotentialSC; |
|||
double VBICtidealSatCurBE; |
|||
double VBICtnidealSatCurBE; |
|||
double VBICtidealSatCurBC; |
|||
double VBICtnidealSatCurBC; |
|||
double VBICtavalanchePar2BC; |
|||
double VBICtparasitSatCur; |
|||
double VBICtidealParasitSatCurBE; |
|||
double VBICtnidealParasitSatCurBE; |
|||
double VBICtidealParasitSatCurBC; |
|||
double VBICtnidealParasitSatCurBC; |
|||
double VBICtrollOffF; |
|||
double VBICtsepISRR; |
|||
double VBICtvbbe; |
|||
double VBICtnbbe; |
|||
|
|||
double *VBICcollCollPtr; /* pointer to sparse matrix at |
|||
* (collector,collector) */ |
|||
double *VBICbaseBasePtr; /* pointer to sparse matrix at |
|||
* (base,base) */ |
|||
double *VBICemitEmitPtr; /* pointer to sparse matrix at |
|||
* (emitter,emitter) */ |
|||
double *VBICcollCXCollCXPtr; /* pointer to sparse matrix at |
|||
* (collector prime,collector prime) */ |
|||
double *VBICcollCICollCIPtr; /* pointer to sparse matrix at |
|||
* (collector prime,collector prime) */ |
|||
double *VBICbaseBXBaseBXPtr; /* pointer to sparse matrix at |
|||
* (base prime,base prime) */ |
|||
double *VBICbaseBIBaseBIPtr; /* pointer to sparse matrix at |
|||
* (collector prime,collector prime) */ |
|||
double *VBICbaseBPBaseBPPtr; /* pointer to sparse matrix at |
|||
* (collector prime,collector prime) */ |
|||
double *VBICemitEIEmitEIPtr; /* pointer to sparse matrix at |
|||
* (emitter prime,emitter prime) */ |
|||
|
|||
double *VBICbaseEmitPtr; /* pointer to sparse matrix at |
|||
* (base,emit) */ |
|||
double *VBICemitBasePtr; /* pointer to sparse matrix at |
|||
* (emit,base) */ |
|||
double *VBICbaseCollPtr; /* pointer to sparse matrix at |
|||
* (base,coll) */ |
|||
double *VBICcollBasePtr; /* pointer to sparse matrix at |
|||
* (coll,base) */ |
|||
double *VBICcollCollCXPtr; /* pointer to sparse matrix at |
|||
* (collector,collector prime) */ |
|||
double *VBICbaseBaseBXPtr; /* pointer to sparse matrix at |
|||
* (base,base prime) */ |
|||
double *VBICemitEmitEIPtr; /* pointer to sparse matrix at |
|||
* (emitter,emitter prime) */ |
|||
double *VBICcollCXCollCIPtr; /* pointer to sparse matrix at |
|||
* (collector prime,base prime) */ |
|||
double *VBICcollCXBaseBXPtr; /* pointer to sparse matrix at |
|||
* (collector prime,collector prime) */ |
|||
double *VBICcollCXBaseBIPtr; /* pointer to sparse matrix at |
|||
* (collector prime,collector prime) */ |
|||
double *VBICcollCXBaseBPPtr; /* pointer to sparse matrix at |
|||
* (collector prime,base prime) */ |
|||
double *VBICcollCIBaseBIPtr; /* pointer to sparse matrix at |
|||
* (collector prime,base) */ |
|||
double *VBICcollCIEmitEIPtr; /* pointer to sparse matrix at |
|||
* (collector prime,emitter prime) */ |
|||
double *VBICbaseBXBaseBIPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
double *VBICbaseBXEmitEIPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
double *VBICbaseBXBaseBPPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
double *VBICbaseBIEmitEIPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
|
|||
double *VBICcollCXCollPtr; /* pointer to sparse matrix at |
|||
* (collector prime,collector) */ |
|||
double *VBICbaseBXBasePtr; /* pointer to sparse matrix at |
|||
* (base prime,base ) */ |
|||
double *VBICemitEIEmitPtr; /* pointer to sparse matrix at |
|||
* (emitter prime,emitter) */ |
|||
double *VBICcollCICollCXPtr; /* pointer to sparse matrix at |
|||
* (collector prime,base prime) */ |
|||
double *VBICbaseBICollCXPtr; /* pointer to sparse matrix at |
|||
* (base prime,collector prime) */ |
|||
double *VBICbaseBPCollCXPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
double *VBICbaseBXCollCIPtr; /* pointer to sparse matrix at |
|||
* (base,collector prime) */ |
|||
double *VBICbaseBICollCIPtr; /* pointer to sparse matrix at |
|||
* (base,collector prime) */ |
|||
double *VBICemitEICollCIPtr; /* pointer to sparse matrix at |
|||
* (emitter prime,collector prime) */ |
|||
double *VBICbaseBPCollCIPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
double *VBICbaseBIBaseBXPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
double *VBICemitEIBaseBXPtr; /* pointer to sparse matrix at |
|||
* (emitter prime,base prime) */ |
|||
double *VBICbaseBPBaseBXPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
double *VBICemitEIBaseBIPtr; /* pointer to sparse matrix at |
|||
* (emitter prime,base prime) */ |
|||
double *VBICbaseBPBaseBIPtr; /* pointer to sparse matrix at |
|||
* (base primt,emitter prime) */ |
|||
|
|||
unsigned VBICareaGiven :1; /* flag to indicate area was specified */ |
|||
unsigned VBICoff :1; /* 'off' flag for vbic */ |
|||
unsigned VBICicVBEGiven :1; /* flag to indicate VBE init. cond. given */ |
|||
unsigned VBICicVCEGiven :1; /* flag to indicate VCE init. cond. given */ |
|||
unsigned VBICtempGiven :1; /* temperature given for vbic instance*/ |
|||
unsigned VBICdtempGiven :1; /* delta temperature given for vbic instance*/ |
|||
unsigned VBICmGiven :1; /* flag to indicate multiplier was specified */ |
|||
unsigned VBICsenPertFlag :1; /* indictes whether the the parameter of |
|||
the particular instance is to be perturbed */ |
|||
|
|||
int VBICsenParmNo; /* parameter # for sensitivity use; |
|||
set equal to 0 if not a design parameter */ |
|||
double VBICcapbe; |
|||
double VBICcapbex; |
|||
double VBICcapbc; |
|||
double VBICcapbcx; |
|||
double VBICcapbep; |
|||
double *VBICsens; |
|||
|
|||
#define VBICsenGpi VBICsens /* stores the perturbed values of gpi */ |
|||
#define VBICsenGmu VBICsens+5 /* stores the perturbed values of gmu */ |
|||
#define VBICsenGm VBICsens+10 /* stores the perturbed values of gm */ |
|||
#define VBICsenGo VBICsens+15 /* stores the perturbed values of go */ |
|||
#define VBICsenGx VBICsens+20 /* stores the perturbed values of gx */ |
|||
#define VBICsenCpi VBICsens+25 /* stores the perturbed values of cpi */ |
|||
#define VBICsenCmu VBICsens+30 /* stores the perturbed values of cmu */ |
|||
#define VBICsenCbx VBICsens+35 /* stores the perturbed values of cbx */ |
|||
#define VBICsenCmcb VBICsens+40 /* stores the perturbed values of cmcb */ |
|||
#define VBICsenCsub VBICsens+45 /* stores the perturbed values of csub */ |
|||
|
|||
|
|||
/* indices to array of VBIC noise sources */ |
|||
|
|||
#define VBICRCNOIZ 0 |
|||
#define VBICRCINOIZ 1 |
|||
#define VBICRBNOIZ 2 |
|||
#define VBICRBINOIZ 3 |
|||
#define VBICRENOIZ 4 |
|||
#define VBICRBPNOIZ 5 |
|||
#define VBICICNOIZ 6 |
|||
#define VBICIBNOIZ 7 |
|||
#define VBICIBEPNOIZ 8 |
|||
#define VBICFLBENOIZ 9 |
|||
#define VBICFLBEPNOIZ 10 |
|||
#define VBICTOTNOIZ 11 |
|||
|
|||
#define VBICNSRCS 12 /* the number of VBIC noise sources */ |
|||
|
|||
#ifndef NONOISE |
|||
double VBICnVar[NSTATVARS][VBICNSRCS]; |
|||
#else /*NONOISE*/ |
|||
double **VBICnVar; |
|||
#endif /*NONOISE*/ |
|||
/* the above to avoid allocating memory when it is not needed */ |
|||
|
|||
} VBICinstance ; |
|||
|
|||
/* entries in the state vector for vbic: */ |
|||
|
|||
#define VBICvbei VBICstate |
|||
#define VBICvbex VBICstate+1 |
|||
#define VBICvbci VBICstate+2 |
|||
#define VBICvbcx VBICstate+3 |
|||
#define VBICvbep VBICstate+4 |
|||
#define VBICvrci VBICstate+6 |
|||
#define VBICvrbi VBICstate+7 |
|||
#define VBICvrbp VBICstate+8 |
|||
|
|||
#define VBICibe VBICstate+9 |
|||
#define VBICibe_Vbei VBICstate+10 |
|||
|
|||
#define VBICibex VBICstate+11 |
|||
#define VBICibex_Vbex VBICstate+12 |
|||
|
|||
#define VBICitzf VBICstate+13 |
|||
#define VBICitzf_Vbei VBICstate+14 |
|||
#define VBICitzf_Vbci VBICstate+15 |
|||
|
|||
#define VBICitzr VBICstate+16 |
|||
#define VBICitzr_Vbci VBICstate+17 |
|||
#define VBICitzr_Vbei VBICstate+18 |
|||
|
|||
#define VBICibc VBICstate+19 |
|||
#define VBICibc_Vbci VBICstate+20 |
|||
#define VBICibc_Vbei VBICstate+21 |
|||
|
|||
#define VBICibep VBICstate+22 |
|||
#define VBICibep_Vbep VBICstate+23 |
|||
|
|||
#define VBICirci VBICstate+24 |
|||
#define VBICirci_Vrci VBICstate+25 |
|||
#define VBICirci_Vbci VBICstate+26 |
|||
#define VBICirci_Vbcx VBICstate+27 |
|||
|
|||
#define VBICirbi VBICstate+28 |
|||
#define VBICirbi_Vrbi VBICstate+29 |
|||
#define VBICirbi_Vbei VBICstate+30 |
|||
#define VBICirbi_Vbci VBICstate+31 |
|||
|
|||
#define VBICirbp VBICstate+32 |
|||
#define VBICirbp_Vrbp VBICstate+33 |
|||
#define VBICirbp_Vbep VBICstate+34 |
|||
#define VBICirbp_Vbci VBICstate+35 |
|||
|
|||
|
|||
#define VBICqbe VBICstate+36 |
|||
#define VBICcqbe VBICstate+37 |
|||
#define VBICcqbeci VBICstate+38 |
|||
|
|||
#define VBICqbex VBICstate+39 |
|||
#define VBICcqbex VBICstate+40 |
|||
|
|||
#define VBICqbc VBICstate+41 |
|||
#define VBICcqbc VBICstate+42 |
|||
|
|||
#define VBICqbcx VBICstate+43 |
|||
#define VBICcqbcx VBICstate+44 |
|||
|
|||
#define VBICqbep VBICstate+45 |
|||
#define VBICcqbep VBICstate+46 |
|||
#define VBICcqbepci VBICstate+47 |
|||
|
|||
#define VBICqbeo VBICstate+48 |
|||
#define VBICcqbeo VBICstate+49 |
|||
#define VBICgqbeo VBICstate+50 |
|||
|
|||
#define VBICqbco VBICstate+51 |
|||
#define VBICcqbco VBICstate+52 |
|||
#define VBICgqbco VBICstate+53 |
|||
|
|||
#define VBICnumStates 54 |
|||
|
|||
#define VBICsensxpbe VBICstate+54 /* charge sensitivities and their |
|||
derivatives. +55 for the derivatives - |
|||
pointer to the beginning of the array */ |
|||
#define VBICsensxpbex VBICstate+56 |
|||
#define VBICsensxpbc VBICstate+58 |
|||
#define VBICsensxpbcx VBICstate+60 |
|||
#define VBICsensxpbep VBICstate+62 |
|||
|
|||
#define VBICnumSenStates 10 |
|||
|
|||
|
|||
/* per model data */ |
|||
typedef struct sVBICmodel { /* model structure for a vbic */ |
|||
int VBICmodType; /* type index of this device type */ |
|||
struct sVBICmodel *VBICnextModel; /* pointer to next possible model in |
|||
linked list */ |
|||
VBICinstance * VBICinstances; /* pointer to list of instances that have |
|||
this model */ |
|||
IFuid VBICmodName; /* pointer to character string naming |
|||
this model */ |
|||
int VBICtype; |
|||
|
|||
double VBICtnom; |
|||
double VBICextCollResist; |
|||
double VBICintCollResist; |
|||
double VBICepiSatVoltage; |
|||
double VBICepiDoping; |
|||
double VBIChighCurFac; |
|||
double VBICextBaseResist; |
|||
double VBICintBaseResist; |
|||
double VBICemitterResist; |
|||
double VBICsubstrateResist; |
|||
double VBICparBaseResist; |
|||
double VBICsatCur; |
|||
double VBICemissionCoeffF; |
|||
double VBICemissionCoeffR; |
|||
double VBICdeplCapLimitF; |
|||
double VBICextOverlapCapBE; |
|||
double VBICdepletionCapBE; |
|||
double VBICpotentialBE; |
|||
double VBICjunctionExpBE; |
|||
double VBICsmoothCapBE; |
|||
double VBICextOverlapCapBC; |
|||
double VBICdepletionCapBC; |
|||
double VBICepiCharge; |
|||
double VBICextCapBC; |
|||
double VBICpotentialBC; |
|||
double VBICjunctionExpBC; |
|||
double VBICsmoothCapBC; |
|||
double VBICextCapSC; |
|||
double VBICpotentialSC; |
|||
double VBICjunctionExpSC; |
|||
double VBICsmoothCapSC; |
|||
double VBICidealSatCurBE; |
|||
double VBICportionIBEI; |
|||
double VBICidealEmissCoeffBE; |
|||
double VBICnidealSatCurBE; |
|||
double VBICnidealEmissCoeffBE; |
|||
double VBICidealSatCurBC; |
|||
double VBICidealEmissCoeffBC; |
|||
double VBICnidealSatCurBC; |
|||
double VBICnidealEmissCoeffBC; |
|||
double VBICavalanchePar1BC; |
|||
double VBICavalanchePar2BC; |
|||
double VBICparasitSatCur; |
|||
double VBICportionICCP; |
|||
double VBICparasitFwdEmissCoeff; |
|||
double VBICidealParasitSatCurBE; |
|||
double VBICnidealParasitSatCurBE; |
|||
double VBICidealParasitSatCurBC; |
|||
double VBICidealParasitEmissCoeffBC; |
|||
double VBICnidealParasitSatCurBC; |
|||
double VBICnidealParasitEmissCoeffBC; |
|||
double VBICearlyVoltF; |
|||
double VBICearlyVoltR; |
|||
double VBICrollOffF; |
|||
double VBICrollOffR; |
|||
double VBICparRollOff; |
|||
double VBICtransitTimeF; |
|||
double VBICvarTransitTimeF; |
|||
double VBICtransitTimeBiasCoeffF; |
|||
double VBICtransitTimeFVBC; |
|||
double VBICtransitTimeHighCurrentF; |
|||
double VBICtransitTimeR; |
|||
double VBICdelayTimeF; |
|||
double VBICfNcoef; |
|||
double VBICfNexpA; |
|||
double VBICfNexpB; |
|||
double VBICtempExpRE; |
|||
double VBICtempExpRBI; |
|||
double VBICtempExpRCI; |
|||
double VBICtempExpRS; |
|||
double VBICtempExpVO; |
|||
double VBICactivEnergyEA; |
|||
double VBICactivEnergyEAIE; |
|||
double VBICactivEnergyEAIC; |
|||
double VBICactivEnergyEAIS; |
|||
double VBICactivEnergyEANE; |
|||
double VBICactivEnergyEANC; |
|||
double VBICactivEnergyEANS; |
|||
double VBICtempExpIS; |
|||
double VBICtempExpII; |
|||
double VBICtempExpIN; |
|||
double VBICtempExpNF; |
|||
double VBICtempExpAVC; |
|||
double VBICthermalResist; |
|||
double VBICthermalCapacitance; |
|||
double VBICpunchThroughVoltageBC; |
|||
double VBICdeplCapCoeff1; |
|||
double VBICfixedCapacitanceCS; |
|||
double VBICsgpQBselector; |
|||
double VBIChighCurrentBetaRolloff; |
|||
double VBICtempExpIKF; |
|||
double VBICtempExpRCX; |
|||
double VBICtempExpRBX; |
|||
double VBICtempExpRBP; |
|||
double VBICsepISRR; |
|||
double VBICtempExpXISR; |
|||
double VBICdear; |
|||
double VBICeap; |
|||
double VBICvbbe; |
|||
double VBICnbbe; |
|||
double VBICibbe; |
|||
double VBICtvbbe1; |
|||
double VBICtvbbe2; |
|||
double VBICtnbbe; |
|||
double VBICebbe; |
|||
double VBIClocTempDiff; |
|||
double VBICrevVersion; |
|||
double VBICrefVersion; |
|||
|
|||
double VBICcollectorConduct; /* collector conductance */ |
|||
double VBICbaseConduct; /* base conductance */ |
|||
double VBICemitterConduct; /* emitter conductance */ |
|||
|
|||
unsigned VBICtnomGiven : 1; |
|||
unsigned VBICextCollResistGiven : 1; |
|||
unsigned VBICintCollResistGiven : 1; |
|||
unsigned VBICepiSatVoltageGiven : 1; |
|||
unsigned VBICepiDopingGiven : 1; |
|||
unsigned VBIChighCurFacGiven : 1; |
|||
unsigned VBICextBaseResistGiven : 1; |
|||
unsigned VBICintBaseResistGiven : 1; |
|||
unsigned VBICemitterResistGiven : 1; |
|||
unsigned VBICsubstrateResistGiven : 1; |
|||
unsigned VBICparBaseResistGiven : 1; |
|||
unsigned VBICsatCurGiven : 1; |
|||
unsigned VBICemissionCoeffFGiven : 1; |
|||
unsigned VBICemissionCoeffRGiven : 1; |
|||
unsigned VBICdeplCapLimitFGiven : 1; |
|||
unsigned VBICextOverlapCapBEGiven : 1; |
|||
unsigned VBICdepletionCapBEGiven : 1; |
|||
unsigned VBICpotentialBEGiven : 1; |
|||
unsigned VBICjunctionExpBEGiven : 1; |
|||
unsigned VBICsmoothCapBEGiven : 1; |
|||
unsigned VBICextOverlapCapBCGiven : 1; |
|||
unsigned VBICdepletionCapBCGiven : 1; |
|||
unsigned VBICepiChargeGiven : 1; |
|||
unsigned VBICextCapBCGiven : 1; |
|||
unsigned VBICpotentialBCGiven : 1; |
|||
unsigned VBICjunctionExpBCGiven : 1; |
|||
unsigned VBICsmoothCapBCGiven : 1; |
|||
unsigned VBICextCapSCGiven : 1; |
|||
unsigned VBICpotentialSCGiven : 1; |
|||
unsigned VBICjunctionExpSCGiven : 1; |
|||
unsigned VBICsmoothCapSCGiven : 1; |
|||
unsigned VBICidealSatCurBEGiven : 1; |
|||
unsigned VBICportionIBEIGiven : 1; |
|||
unsigned VBICidealEmissCoeffBEGiven : 1; |
|||
unsigned VBICnidealSatCurBEGiven : 1; |
|||
unsigned VBICnidealEmissCoeffBEGiven : 1; |
|||
unsigned VBICidealSatCurBCGiven : 1; |
|||
unsigned VBICidealEmissCoeffBCGiven : 1; |
|||
unsigned VBICnidealSatCurBCGiven : 1; |
|||
unsigned VBICnidealEmissCoeffBCGiven : 1; |
|||
unsigned VBICavalanchePar1BCGiven : 1; |
|||
unsigned VBICavalanchePar2BCGiven : 1; |
|||
unsigned VBICparasitSatCurGiven : 1; |
|||
unsigned VBICportionICCPGiven : 1; |
|||
unsigned VBICparasitFwdEmissCoeffGiven : 1; |
|||
unsigned VBICidealParasitSatCurBEGiven : 1; |
|||
unsigned VBICnidealParasitSatCurBEGiven : 1; |
|||
unsigned VBICidealParasitSatCurBCGiven : 1; |
|||
unsigned VBICidealParasitEmissCoeffBCGiven : 1; |
|||
unsigned VBICnidealParasitSatCurBCGiven : 1; |
|||
unsigned VBICnidealParasitEmissCoeffBCGiven : 1; |
|||
unsigned VBICearlyVoltFGiven : 1; |
|||
unsigned VBICearlyVoltRGiven : 1; |
|||
unsigned VBICrollOffFGiven : 1; |
|||
unsigned VBICrollOffRGiven : 1; |
|||
unsigned VBICparRollOffGiven : 1; |
|||
unsigned VBICtransitTimeFGiven : 1; |
|||
unsigned VBICvarTransitTimeFGiven : 1; |
|||
unsigned VBICtransitTimeBiasCoeffFGiven : 1; |
|||
unsigned VBICtransitTimeFVBCGiven : 1; |
|||
unsigned VBICtransitTimeHighCurrentFGiven : 1; |
|||
unsigned VBICtransitTimeRGiven : 1; |
|||
unsigned VBICdelayTimeFGiven : 1; |
|||
unsigned VBICfNcoefGiven : 1; |
|||
unsigned VBICfNexpAGiven : 1; |
|||
unsigned VBICfNexpBGiven : 1; |
|||
unsigned VBICtempExpREGiven : 1; |
|||
unsigned VBICtempExpRBIGiven : 1; |
|||
unsigned VBICtempExpRCIGiven : 1; |
|||
unsigned VBICtempExpRSGiven : 1; |
|||
unsigned VBICtempExpVOGiven : 1; |
|||
unsigned VBICactivEnergyEAGiven : 1; |
|||
unsigned VBICactivEnergyEAIEGiven : 1; |
|||
unsigned VBICactivEnergyEAICGiven : 1; |
|||
unsigned VBICactivEnergyEAISGiven : 1; |
|||
unsigned VBICactivEnergyEANEGiven : 1; |
|||
unsigned VBICactivEnergyEANCGiven : 1; |
|||
unsigned VBICactivEnergyEANSGiven : 1; |
|||
unsigned VBICtempExpISGiven : 1; |
|||
unsigned VBICtempExpIIGiven : 1; |
|||
unsigned VBICtempExpINGiven : 1; |
|||
unsigned VBICtempExpNFGiven : 1; |
|||
unsigned VBICtempExpAVCGiven : 1; |
|||
unsigned VBICthermalResistGiven : 1; |
|||
unsigned VBICthermalCapacitanceGiven : 1; |
|||
unsigned VBICpunchThroughVoltageBCGiven : 1; |
|||
unsigned VBICdeplCapCoeff1Given : 1; |
|||
unsigned VBICfixedCapacitanceCSGiven : 1; |
|||
unsigned VBICsgpQBselectorGiven : 1; |
|||
unsigned VBIChighCurrentBetaRolloffGiven : 1; |
|||
unsigned VBICtempExpIKFGiven : 1; |
|||
unsigned VBICtempExpRCXGiven : 1; |
|||
unsigned VBICtempExpRBXGiven : 1; |
|||
unsigned VBICtempExpRBPGiven : 1; |
|||
unsigned VBICsepISRRGiven : 1; |
|||
unsigned VBICtempExpXISRGiven : 1; |
|||
unsigned VBICdearGiven : 1; |
|||
unsigned VBICeapGiven : 1; |
|||
unsigned VBICvbbeGiven : 1; |
|||
unsigned VBICnbbeGiven : 1; |
|||
unsigned VBICibbeGiven : 1; |
|||
unsigned VBICtvbbe1Given : 1; |
|||
unsigned VBICtvbbe2Given : 1; |
|||
unsigned VBICtnbbeGiven : 1; |
|||
unsigned VBICebbeGiven : 1; |
|||
unsigned VBIClocTempDiffGiven : 1; |
|||
unsigned VBICrevVersionGiven : 1; |
|||
unsigned VBICrefVersionGiven : 1; |
|||
} VBICmodel; |
|||
|
|||
#ifndef NPN |
|||
#define NPN 1 |
|||
#define PNP -1 |
|||
#endif /*NPN*/ |
|||
|
|||
/* device parameters */ |
|||
#define VBIC_AREA 1 |
|||
#define VBIC_OFF 2 |
|||
#define VBIC_IC 3 |
|||
#define VBIC_IC_VBE 4 |
|||
#define VBIC_IC_VCE 5 |
|||
#define VBIC_TEMP 6 |
|||
#define VBIC_DTEMP 7 |
|||
#define VBIC_M 8 |
|||
|
|||
/* model parameters */ |
|||
#define VBIC_MOD_NPN 101 |
|||
#define VBIC_MOD_PNP 102 |
|||
#define VBIC_MOD_TNOM 103 |
|||
#define VBIC_MOD_RCX 104 |
|||
#define VBIC_MOD_RCI 105 |
|||
#define VBIC_MOD_VO 106 |
|||
#define VBIC_MOD_GAMM 107 |
|||
#define VBIC_MOD_HRCF 108 |
|||
#define VBIC_MOD_RBX 109 |
|||
#define VBIC_MOD_RBI 110 |
|||
#define VBIC_MOD_RE 111 |
|||
#define VBIC_MOD_RS 112 |
|||
#define VBIC_MOD_RBP 113 |
|||
#define VBIC_MOD_IS 114 |
|||
#define VBIC_MOD_NF 115 |
|||
#define VBIC_MOD_NR 116 |
|||
#define VBIC_MOD_FC 117 |
|||
#define VBIC_MOD_CBEO 118 |
|||
#define VBIC_MOD_CJE 119 |
|||
#define VBIC_MOD_PE 120 |
|||
#define VBIC_MOD_ME 121 |
|||
#define VBIC_MOD_AJE 122 |
|||
#define VBIC_MOD_CBCO 123 |
|||
#define VBIC_MOD_CJC 124 |
|||
#define VBIC_MOD_QCO 125 |
|||
#define VBIC_MOD_CJEP 126 |
|||
#define VBIC_MOD_PC 127 |
|||
#define VBIC_MOD_MC 128 |
|||
#define VBIC_MOD_AJC 129 |
|||
#define VBIC_MOD_CJCP 130 |
|||
#define VBIC_MOD_PS 131 |
|||
#define VBIC_MOD_MS 132 |
|||
#define VBIC_MOD_AJS 133 |
|||
#define VBIC_MOD_IBEI 134 |
|||
#define VBIC_MOD_WBE 135 |
|||
#define VBIC_MOD_NEI 136 |
|||
#define VBIC_MOD_IBEN 137 |
|||
#define VBIC_MOD_NEN 138 |
|||
#define VBIC_MOD_IBCI 139 |
|||
#define VBIC_MOD_NCI 140 |
|||
#define VBIC_MOD_IBCN 141 |
|||
#define VBIC_MOD_NCN 142 |
|||
#define VBIC_MOD_AVC1 143 |
|||
#define VBIC_MOD_AVC2 144 |
|||
#define VBIC_MOD_ISP 145 |
|||
#define VBIC_MOD_WSP 146 |
|||
#define VBIC_MOD_NFP 147 |
|||
#define VBIC_MOD_IBEIP 148 |
|||
#define VBIC_MOD_IBENP 149 |
|||
#define VBIC_MOD_IBCIP 150 |
|||
#define VBIC_MOD_NCIP 151 |
|||
#define VBIC_MOD_IBCNP 152 |
|||
#define VBIC_MOD_NCNP 153 |
|||
#define VBIC_MOD_VEF 154 |
|||
#define VBIC_MOD_VER 155 |
|||
#define VBIC_MOD_IKF 156 |
|||
#define VBIC_MOD_IKR 157 |
|||
#define VBIC_MOD_IKP 158 |
|||
#define VBIC_MOD_TF 159 |
|||
#define VBIC_MOD_QTF 160 |
|||
#define VBIC_MOD_XTF 161 |
|||
#define VBIC_MOD_VTF 162 |
|||
#define VBIC_MOD_ITF 163 |
|||
#define VBIC_MOD_TR 164 |
|||
#define VBIC_MOD_TD 165 |
|||
#define VBIC_MOD_KFN 166 |
|||
#define VBIC_MOD_AFN 167 |
|||
#define VBIC_MOD_BFN 168 |
|||
#define VBIC_MOD_XRE 169 |
|||
#define VBIC_MOD_XRBI 170 |
|||
#define VBIC_MOD_XRCI 171 |
|||
#define VBIC_MOD_XRS 172 |
|||
#define VBIC_MOD_XVO 173 |
|||
#define VBIC_MOD_EA 174 |
|||
#define VBIC_MOD_EAIE 175 |
|||
#define VBIC_MOD_EAIC 176 |
|||
#define VBIC_MOD_EAIS 177 |
|||
#define VBIC_MOD_EANE 178 |
|||
#define VBIC_MOD_EANC 179 |
|||
#define VBIC_MOD_EANS 180 |
|||
#define VBIC_MOD_XIS 181 |
|||
#define VBIC_MOD_XII 182 |
|||
#define VBIC_MOD_XIN 183 |
|||
#define VBIC_MOD_TNF 184 |
|||
#define VBIC_MOD_TAVC 185 |
|||
#define VBIC_MOD_RTH 186 |
|||
#define VBIC_MOD_CTH 187 |
|||
#define VBIC_MOD_VRT 188 |
|||
#define VBIC_MOD_ART 189 |
|||
#define VBIC_MOD_CCSO 190 |
|||
#define VBIC_MOD_QBM 191 |
|||
#define VBIC_MOD_NKF 192 |
|||
#define VBIC_MOD_XIKF 193 |
|||
#define VBIC_MOD_XRCX 194 |
|||
#define VBIC_MOD_XRBX 195 |
|||
#define VBIC_MOD_XRBP 196 |
|||
#define VBIC_MOD_ISRR 197 |
|||
#define VBIC_MOD_XISR 198 |
|||
#define VBIC_MOD_DEAR 199 |
|||
#define VBIC_MOD_EAP 200 |
|||
#define VBIC_MOD_VBBE 201 |
|||
#define VBIC_MOD_NBBE 202 |
|||
#define VBIC_MOD_IBBE 203 |
|||
#define VBIC_MOD_TVBBE1 204 |
|||
#define VBIC_MOD_TVBBE2 205 |
|||
#define VBIC_MOD_TNBBE 206 |
|||
#define VBIC_MOD_EBBE 207 |
|||
#define VBIC_MOD_DTEMP 208 |
|||
#define VBIC_MOD_VERS 209 |
|||
#define VBIC_MOD_VREF 210 |
|||
|
|||
|
|||
/* device questions */ |
|||
#define VBIC_QUEST_FT 211 |
|||
#define VBIC_QUEST_COLLNODE 212 |
|||
#define VBIC_QUEST_BASENODE 213 |
|||
#define VBIC_QUEST_EMITNODE 214 |
|||
#define VBIC_QUEST_COLLCXNODE 216 |
|||
#define VBIC_QUEST_COLLCINODE 217 |
|||
#define VBIC_QUEST_BASEBXNODE 218 |
|||
#define VBIC_QUEST_BASEBINODE 219 |
|||
#define VBIC_QUEST_BASEBPNODE 220 |
|||
#define VBIC_QUEST_EMITEINODE 221 |
|||
#define VBIC_QUEST_VBE 223 |
|||
#define VBIC_QUEST_VBC 224 |
|||
#define VBIC_QUEST_CC 225 |
|||
#define VBIC_QUEST_CB 226 |
|||
#define VBIC_QUEST_CE 227 |
|||
#define VBIC_QUEST_GM 228 |
|||
#define VBIC_QUEST_GO 229 |
|||
#define VBIC_QUEST_GPI 230 |
|||
#define VBIC_QUEST_GMU 231 |
|||
#define VBIC_QUEST_GX 232 |
|||
#define VBIC_QUEST_QBE 233 |
|||
#define VBIC_QUEST_CQBE 234 |
|||
#define VBIC_QUEST_QBC 235 |
|||
#define VBIC_QUEST_CQBC 236 |
|||
#define VBIC_QUEST_QSUB 237 |
|||
#define VBIC_QUEST_CQSUB 238 |
|||
#define VBIC_QUEST_QBX 239 |
|||
#define VBIC_QUEST_CQBX 240 |
|||
#define VBIC_QUEST_CEXBC 241 |
|||
#define VBIC_QUEST_GEQCB 242 |
|||
#define VBIC_QUEST_GCSUB 243 |
|||
#define VBIC_QUEST_GDSUB 244 |
|||
#define VBIC_QUEST_GEQBX 245 |
|||
#define VBIC_QUEST_CBE 246 |
|||
#define VBIC_QUEST_CBEX 247 |
|||
#define VBIC_QUEST_CBC 248 |
|||
#define VBIC_QUEST_CBCX 249 |
|||
#define VBIC_QUEST_SENS_REAL 250 |
|||
#define VBIC_QUEST_SENS_IMAG 251 |
|||
#define VBIC_QUEST_SENS_MAG 252 |
|||
#define VBIC_QUEST_SENS_PH 253 |
|||
#define VBIC_QUEST_SENS_CPLX 254 |
|||
#define VBIC_QUEST_SENS_DC 255 |
|||
#define VBIC_QUEST_POWER 256 |
|||
|
|||
/* model questions */ |
|||
#define VBIC_MOD_COLLCONDUCT 301 |
|||
#define VBIC_MOD_BASECONDUCT 302 |
|||
#define VBIC_MOD_EMITTERCONDUCT 303 |
|||
#define VBIC_MOD_TYPE 304 |
|||
|
|||
#include "vbicext.h" |
|||
#endif /*VBIC*/ |
|||
@ -0,0 +1,40 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine deletes a VBIC instance from the circuit and frees |
|||
* the storage it was using. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
VBICdelete(GENmodel *inModel, IFuid name, GENinstance **kill) |
|||
{ |
|||
VBICmodel *model = (VBICmodel*)inModel; |
|||
VBICinstance **fast = (VBICinstance**)kill; |
|||
|
|||
VBICinstance **prev = NULL; |
|||
VBICinstance *here; |
|||
|
|||
for( ; model ; model = model->VBICnextModel) { |
|||
prev = &(model->VBICinstances); |
|||
for(here = *prev; here ; here = *prev) { |
|||
if(here->VBICname == name || (fast && here==*fast) ) { |
|||
*prev= here->VBICnextInstance; |
|||
FREE(here); |
|||
return(OK); |
|||
} |
|||
prev = &(here->VBICnextInstance); |
|||
} |
|||
} |
|||
return(E_NODEV); |
|||
} |
|||
@ -0,0 +1,46 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine deletes all VBICs from the circuit and frees |
|||
* all storage they were using. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "vbicdefs.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
void |
|||
VBICdestroy(GENmodel **inModel) |
|||
{ |
|||
|
|||
VBICmodel **model = (VBICmodel**)inModel; |
|||
VBICinstance *here; |
|||
VBICinstance *prev = NULL; |
|||
VBICmodel *mod = *model; |
|||
VBICmodel *oldmod = NULL; |
|||
|
|||
for( ; mod ; mod = mod->VBICnextModel) { |
|||
if(oldmod) FREE(oldmod); |
|||
oldmod = mod; |
|||
prev = (VBICinstance *)NULL; |
|||
for(here = mod->VBICinstances ; here ; here = here->VBICnextInstance) { |
|||
if(prev){ |
|||
if(prev->VBICsens) FREE(prev->VBICsens); |
|||
FREE(prev); |
|||
} |
|||
prev = here; |
|||
} |
|||
if(prev){ |
|||
if(prev->VBICsens) FREE(prev->VBICsens); |
|||
FREE(prev); |
|||
} |
|||
} |
|||
if(oldmod) FREE(oldmod); |
|||
*model = NULL; |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
#ifndef __VBICEXT_H |
|||
#define __VBICEXT_H |
|||
|
|||
|
|||
extern int VBICacLoad(GENmodel *,CKTcircuit*); |
|||
extern int VBICask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); |
|||
extern int VBICconvTest(GENmodel*,CKTcircuit*); |
|||
extern int VBICdelete(GENmodel*,IFuid,GENinstance**); |
|||
extern void VBICdestroy(GENmodel**); |
|||
extern int VBICgetic(GENmodel*,CKTcircuit*); |
|||
extern int VBICload(GENmodel*,CKTcircuit*); |
|||
extern int VBICmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); |
|||
extern int VBICmDelete(GENmodel**,IFuid,GENmodel*); |
|||
extern int VBICmParam(int,IFvalue*,GENmodel*); |
|||
extern int VBICparam(int,IFvalue*,GENinstance*,IFvalue*); |
|||
extern int VBICpzLoad(GENmodel*, CKTcircuit*, SPcomplex*); |
|||
extern int VBICsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); |
|||
extern int VBICunsetup(GENmodel*,CKTcircuit*); |
|||
extern int VBICtemp(GENmodel*,CKTcircuit*); |
|||
extern int VBICtrunc(GENmodel*,CKTcircuit*,double*); |
|||
extern int VBICnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); |
|||
|
|||
#endif |
|||
@ -0,0 +1,49 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine gets the device initial conditions for the VBICs |
|||
* from the RHS vector |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
VBICgetic(GENmodel *inModel, CKTcircuit *ckt) |
|||
{ |
|||
|
|||
VBICmodel *model = (VBICmodel*)inModel; |
|||
VBICinstance *here; |
|||
/* |
|||
* grab initial conditions out of rhs array. User specified, so use |
|||
* external nodes to get values |
|||
*/ |
|||
|
|||
for( ; model ; model = model->VBICnextModel) { |
|||
for(here = model->VBICinstances; here ; here = here->VBICnextInstance) { |
|||
|
|||
if (here->VBICowner != ARCHme) continue; |
|||
|
|||
if(!here->VBICicVBEGiven) { |
|||
here->VBICicVBE = |
|||
*(ckt->CKTrhs + here->VBICbaseNode) - |
|||
*(ckt->CKTrhs + here->VBICemitNode); |
|||
} |
|||
if(!here->VBICicVCEGiven) { |
|||
here->VBICicVCE = |
|||
*(ckt->CKTrhs + here->VBICcollNode) - |
|||
*(ckt->CKTrhs + here->VBICemitNode); |
|||
} |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -0,0 +1,81 @@ |
|||
#include "config.h" |
|||
|
|||
#include "devdefs.h" |
|||
|
|||
#include "vbicitf.h" |
|||
#include "vbicext.h" |
|||
#include "vbicinit.h" |
|||
|
|||
|
|||
SPICEdev VBICinfo = { |
|||
{ |
|||
"VBIC", |
|||
"Vertical Bipolar Inter-Company Model (3-terminal)", |
|||
|
|||
&VBICnSize, |
|||
&VBICnSize, |
|||
VBICnames, |
|||
|
|||
&VBICpTSize, |
|||
VBICpTable, |
|||
|
|||
&VBICmPTSize, |
|||
VBICmPTable, |
|||
|
|||
#ifdef XSPICE |
|||
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
/*--------------------------- End of SDB fix -------------------------*/ |
|||
#endif |
|||
|
|||
DEV_DEFAULT |
|||
}, |
|||
|
|||
VBICparam, /* DEVparam */ |
|||
VBICmParam, /* DEVmodParam */ |
|||
VBICload, /* DEVload */ |
|||
VBICsetup, /* DEVsetup */ |
|||
VBICunsetup, /* DEVunsetup */ |
|||
VBICsetup, /* DEVpzSetup */ |
|||
VBICtemp, /* DEVtemperature */ |
|||
VBICtrunc, /* DEVtrunc */ |
|||
NULL, /* DEVfindBranch */ |
|||
VBICacLoad, /* DEVacLoad */ |
|||
NULL, /* DEVaccept */ |
|||
VBICdestroy, /* DEVdestroy */ |
|||
VBICmDelete, /* DEVmodDelete */ |
|||
VBICdelete, /* DEVdelete */ |
|||
VBICgetic, /* DEVsetic */ |
|||
VBICask, /* DEVask */ |
|||
VBICmAsk, /* DEVmodAsk */ |
|||
VBICpzLoad, /* DEVpzLoad */ |
|||
VBICconvTest, /* DEVconvTest */ |
|||
NULL, /* DEVsenSetup */ |
|||
NULL, /* DEVsenLoad */ |
|||
NULL, /* DEVsenUpdate */ |
|||
NULL, /* DEVsenAcLoad */ |
|||
NULL, /* DEVsenPrint */ |
|||
NULL, /* DEVsenTrunc */ |
|||
NULL, /* DEVdisto */ |
|||
VBICnoise, /* DEVnoise */ |
|||
|
|||
&VBICiSize, /* DEVinstSize */ |
|||
&VBICmSize /* DEVmodSize */ |
|||
|
|||
}; |
|||
|
|||
|
|||
SPICEdev * |
|||
get_vbic_info(void) |
|||
{ |
|||
return &VBICinfo; |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
#ifndef _VBICINIT_H |
|||
#define _VBICINIT_H |
|||
|
|||
extern IFparm VBICpTable[ ]; |
|||
extern IFparm VBICmPTable[ ]; |
|||
extern char *VBICnames[ ]; |
|||
extern int VBICpTSize; |
|||
extern int VBICmPTSize; |
|||
extern int VBICnSize; |
|||
extern int VBICiSize; |
|||
extern int VBICmSize; |
|||
|
|||
#endif |
|||
@ -0,0 +1,12 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
#ifndef DEV_VBIC |
|||
#define DEV_VBIC |
|||
|
|||
extern SPICEdev *get_vbic_info(void); |
|||
|
|||
#endif |
|||
2134
src/spicelib/devices/vbic/vbicload.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,360 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Mathew Lew and Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "const.h" |
|||
#include "ifsim.h" |
|||
#include "cktdefs.h" |
|||
#include "devdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
/*ARGSUSED*/ |
|||
int |
|||
VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) |
|||
{ |
|||
VBICmodel *here = (VBICmodel*)instPtr; |
|||
|
|||
switch(which) { |
|||
case VBIC_MOD_TNOM: |
|||
value->rValue = here->VBICtnom-CONSTCtoK; |
|||
return(OK); |
|||
case VBIC_MOD_RCX: |
|||
value->rValue = here->VBICextCollResist; |
|||
return(OK); |
|||
case VBIC_MOD_RCI: |
|||
value->rValue = here->VBICintCollResist; |
|||
return(OK); |
|||
case VBIC_MOD_VO: |
|||
value->rValue = here->VBICepiSatVoltage; |
|||
return(OK); |
|||
case VBIC_MOD_GAMM: |
|||
value->rValue = here->VBICepiDoping; |
|||
return(OK); |
|||
case VBIC_MOD_HRCF: |
|||
value->rValue = here->VBIChighCurFac; |
|||
return(OK); |
|||
case VBIC_MOD_RBX: |
|||
value->rValue = here->VBICextBaseResist; |
|||
return(OK); |
|||
case VBIC_MOD_RBI: |
|||
value->rValue = here->VBICintBaseResist; |
|||
return(OK); |
|||
case VBIC_MOD_RE: |
|||
value->rValue = here->VBICemitterResist; |
|||
return(OK); |
|||
case VBIC_MOD_RS: |
|||
value->rValue = here->VBICsubstrateResist; |
|||
return(OK); |
|||
case VBIC_MOD_RBP: |
|||
value->rValue = here->VBICparBaseResist; |
|||
return(OK); |
|||
case VBIC_MOD_IS: |
|||
value->rValue = here->VBICsatCur; |
|||
return(OK); |
|||
case VBIC_MOD_NF: |
|||
value->rValue = here->VBICemissionCoeffF; |
|||
return(OK); |
|||
case VBIC_MOD_NR: |
|||
value->rValue = here->VBICemissionCoeffR; |
|||
return(OK); |
|||
case VBIC_MOD_FC: |
|||
value->rValue = here->VBICdeplCapLimitF; |
|||
return(OK); |
|||
case VBIC_MOD_CBEO: |
|||
value->rValue = here->VBICextOverlapCapBE; |
|||
return(OK); |
|||
case VBIC_MOD_CJE: |
|||
value->rValue = here->VBICdepletionCapBE; |
|||
return(OK); |
|||
case VBIC_MOD_PE: |
|||
value->rValue = here->VBICpotentialBE; |
|||
return(OK); |
|||
case VBIC_MOD_ME: |
|||
value->rValue = here->VBICjunctionExpBE; |
|||
return(OK); |
|||
case VBIC_MOD_AJE: |
|||
value->rValue = here->VBICsmoothCapBE; |
|||
return(OK); |
|||
case VBIC_MOD_CBCO: |
|||
value->rValue = here->VBICextOverlapCapBC; |
|||
return(OK); |
|||
case VBIC_MOD_CJC: |
|||
value->rValue = here->VBICdepletionCapBC; |
|||
return(OK); |
|||
case VBIC_MOD_QCO: |
|||
value->rValue = here->VBICepiCharge; |
|||
return(OK); |
|||
case VBIC_MOD_CJEP: |
|||
value->rValue = here->VBICextCapBC; |
|||
return(OK); |
|||
case VBIC_MOD_PC: |
|||
value->rValue = here->VBICpotentialBC; |
|||
return(OK); |
|||
case VBIC_MOD_MC: |
|||
value->rValue = here->VBICjunctionExpBC; |
|||
return(OK); |
|||
case VBIC_MOD_AJC: |
|||
value->rValue = here->VBICsmoothCapBC; |
|||
return(OK); |
|||
case VBIC_MOD_CJCP: |
|||
value->rValue = here->VBICextCapSC; |
|||
return(OK); |
|||
case VBIC_MOD_PS: |
|||
value->rValue = here->VBICpotentialSC; |
|||
return(OK); |
|||
case VBIC_MOD_MS: |
|||
value->rValue = here->VBICjunctionExpSC; |
|||
return(OK); |
|||
case VBIC_MOD_AJS: |
|||
value->rValue = here->VBICsmoothCapSC; |
|||
return(OK); |
|||
case VBIC_MOD_IBEI: |
|||
value->rValue = here->VBICidealSatCurBE; |
|||
return(OK); |
|||
case VBIC_MOD_WBE: |
|||
value->rValue = here->VBICportionIBEI; |
|||
return(OK); |
|||
case VBIC_MOD_NEI: |
|||
value->rValue = here->VBICidealEmissCoeffBE; |
|||
return(OK); |
|||
case VBIC_MOD_IBEN: |
|||
value->rValue = here->VBICnidealSatCurBE; |
|||
return(OK); |
|||
case VBIC_MOD_NEN: |
|||
value->rValue = here->VBICnidealEmissCoeffBE; |
|||
return(OK); |
|||
case VBIC_MOD_IBCI: |
|||
value->rValue = here->VBICidealSatCurBC; |
|||
return(OK); |
|||
case VBIC_MOD_NCI: |
|||
value->rValue = here->VBICidealEmissCoeffBC; |
|||
return(OK); |
|||
case VBIC_MOD_IBCN: |
|||
value->rValue = here->VBICnidealSatCurBC; |
|||
return(OK); |
|||
case VBIC_MOD_NCN: |
|||
value->rValue = here->VBICnidealEmissCoeffBC; |
|||
return(OK); |
|||
case VBIC_MOD_AVC1: |
|||
value->rValue = here->VBICavalanchePar1BC; |
|||
return(OK); |
|||
case VBIC_MOD_AVC2: |
|||
value->rValue = here->VBICavalanchePar2BC; |
|||
return(OK); |
|||
case VBIC_MOD_ISP: |
|||
value->rValue = here->VBICparasitSatCur; |
|||
return(OK); |
|||
case VBIC_MOD_WSP: |
|||
value->rValue = here->VBICportionICCP; |
|||
return(OK); |
|||
case VBIC_MOD_NFP: |
|||
value->rValue = here->VBICparasitFwdEmissCoeff; |
|||
return(OK); |
|||
case VBIC_MOD_IBEIP: |
|||
value->rValue = here->VBICidealParasitSatCurBE; |
|||
return(OK); |
|||
case VBIC_MOD_IBENP: |
|||
value->rValue = here->VBICnidealParasitSatCurBE; |
|||
return(OK); |
|||
case VBIC_MOD_IBCIP: |
|||
value->rValue = here->VBICidealParasitSatCurBC; |
|||
return(OK); |
|||
case VBIC_MOD_NCIP: |
|||
value->rValue = here->VBICidealParasitEmissCoeffBC; |
|||
return(OK); |
|||
case VBIC_MOD_IBCNP: |
|||
value->rValue = here->VBICnidealParasitSatCurBC; |
|||
return(OK); |
|||
case VBIC_MOD_NCNP: |
|||
value->rValue = here->VBICnidealParasitEmissCoeffBC; |
|||
return(OK); |
|||
case VBIC_MOD_VEF: |
|||
value->rValue = here->VBICearlyVoltF; |
|||
return(OK); |
|||
case VBIC_MOD_VER: |
|||
value->rValue = here->VBICearlyVoltR; |
|||
return(OK); |
|||
case VBIC_MOD_IKF: |
|||
value->rValue = here->VBICrollOffF; |
|||
return(OK); |
|||
case VBIC_MOD_IKR: |
|||
value->rValue = here->VBICrollOffR; |
|||
return(OK); |
|||
case VBIC_MOD_IKP: |
|||
value->rValue = here->VBICparRollOff; |
|||
return(OK); |
|||
case VBIC_MOD_TF: |
|||
value->rValue = here->VBICtransitTimeF; |
|||
return(OK); |
|||
case VBIC_MOD_QTF: |
|||
value->rValue = here->VBICvarTransitTimeF; |
|||
return(OK); |
|||
case VBIC_MOD_XTF: |
|||
value->rValue = here->VBICtransitTimeBiasCoeffF; |
|||
return(OK); |
|||
case VBIC_MOD_VTF: |
|||
value->rValue = here->VBICtransitTimeFVBC; |
|||
return(OK); |
|||
case VBIC_MOD_ITF: |
|||
value->rValue = here->VBICtransitTimeHighCurrentF; |
|||
return(OK); |
|||
case VBIC_MOD_TR: |
|||
value->rValue = here->VBICtransitTimeR; |
|||
return(OK); |
|||
case VBIC_MOD_TD: |
|||
value->rValue = here->VBICdelayTimeF; |
|||
return(OK); |
|||
case VBIC_MOD_KFN: |
|||
value->rValue = here->VBICfNcoef; |
|||
return(OK); |
|||
case VBIC_MOD_AFN: |
|||
value->rValue = here->VBICfNexpA; |
|||
return(OK); |
|||
case VBIC_MOD_BFN: |
|||
value->rValue = here->VBICfNexpB; |
|||
return(OK); |
|||
case VBIC_MOD_XRE: |
|||
value->rValue = here->VBICtempExpRE; |
|||
return(OK); |
|||
case VBIC_MOD_XRBI: |
|||
value->rValue = here->VBICtempExpRBI; |
|||
return(OK); |
|||
case VBIC_MOD_XRCI: |
|||
value->rValue = here->VBICtempExpRCI; |
|||
return(OK); |
|||
case VBIC_MOD_XRS: |
|||
value->rValue = here->VBICtempExpRS; |
|||
return(OK); |
|||
case VBIC_MOD_XVO: |
|||
value->rValue = here->VBICtempExpVO; |
|||
return(OK); |
|||
case VBIC_MOD_EA: |
|||
value->rValue = here->VBICactivEnergyEA; |
|||
return(OK); |
|||
case VBIC_MOD_EAIE: |
|||
value->rValue = here->VBICactivEnergyEAIE; |
|||
return(OK); |
|||
case VBIC_MOD_EAIC: |
|||
value->rValue = here->VBICactivEnergyEAIC; |
|||
return(OK); |
|||
case VBIC_MOD_EAIS: |
|||
value->rValue = here->VBICactivEnergyEAIS; |
|||
return(OK); |
|||
case VBIC_MOD_EANE: |
|||
value->rValue = here->VBICactivEnergyEANE; |
|||
return(OK); |
|||
case VBIC_MOD_EANC: |
|||
value->rValue = here->VBICactivEnergyEANC; |
|||
return(OK); |
|||
case VBIC_MOD_EANS: |
|||
value->rValue = here->VBICactivEnergyEANS; |
|||
return(OK); |
|||
case VBIC_MOD_XIS: |
|||
value->rValue = here->VBICtempExpIS; |
|||
return(OK); |
|||
case VBIC_MOD_XII: |
|||
value->rValue = here->VBICtempExpII; |
|||
return(OK); |
|||
case VBIC_MOD_XIN: |
|||
value->rValue = here->VBICtempExpIN; |
|||
return(OK); |
|||
case VBIC_MOD_TNF: |
|||
value->rValue = here->VBICtempExpNF; |
|||
return(OK); |
|||
case VBIC_MOD_TAVC: |
|||
value->rValue = here->VBICtempExpAVC; |
|||
return(OK); |
|||
case VBIC_MOD_RTH: |
|||
value->rValue = here->VBICthermalResist; |
|||
return(OK); |
|||
case VBIC_MOD_CTH: |
|||
value->rValue = here->VBICthermalCapacitance; |
|||
return(OK); |
|||
case VBIC_MOD_VRT: |
|||
value->rValue = here->VBICpunchThroughVoltageBC; |
|||
return(OK); |
|||
case VBIC_MOD_ART: |
|||
value->rValue = here->VBICdeplCapCoeff1; |
|||
return(OK); |
|||
case VBIC_MOD_CCSO: |
|||
value->rValue = here->VBICfixedCapacitanceCS; |
|||
return(OK); |
|||
case VBIC_MOD_QBM: |
|||
value->rValue = here->VBICsgpQBselector; |
|||
return(OK); |
|||
case VBIC_MOD_NKF: |
|||
value->rValue = here->VBIChighCurrentBetaRolloff; |
|||
return(OK); |
|||
case VBIC_MOD_XIKF: |
|||
value->rValue = here->VBICtempExpIKF; |
|||
return(OK); |
|||
case VBIC_MOD_XRCX: |
|||
value->rValue = here->VBICtempExpRCX; |
|||
return(OK); |
|||
case VBIC_MOD_XRBX: |
|||
value->rValue = here->VBICtempExpRBX; |
|||
return(OK); |
|||
case VBIC_MOD_XRBP: |
|||
value->rValue = here->VBICtempExpRBP; |
|||
return(OK); |
|||
case VBIC_MOD_ISRR: |
|||
value->rValue = here->VBICsepISRR; |
|||
return(OK); |
|||
case VBIC_MOD_XISR: |
|||
value->rValue = here->VBICtempExpXISR; |
|||
return(OK); |
|||
case VBIC_MOD_DEAR: |
|||
value->rValue = here->VBICdear; |
|||
return(OK); |
|||
case VBIC_MOD_EAP: |
|||
value->rValue = here->VBICeap; |
|||
return(OK); |
|||
case VBIC_MOD_VBBE: |
|||
value->rValue = here->VBICvbbe; |
|||
return(OK); |
|||
case VBIC_MOD_NBBE: |
|||
value->rValue = here->VBICnbbe; |
|||
return(OK); |
|||
case VBIC_MOD_IBBE: |
|||
value->rValue = here->VBICibbe; |
|||
return(OK); |
|||
case VBIC_MOD_TVBBE1: |
|||
value->rValue = here->VBICtvbbe1; |
|||
return(OK); |
|||
case VBIC_MOD_TVBBE2: |
|||
value->rValue = here->VBICtvbbe2; |
|||
return(OK); |
|||
case VBIC_MOD_TNBBE: |
|||
value->rValue = here->VBICtnbbe; |
|||
return(OK); |
|||
case VBIC_MOD_EBBE: |
|||
value->rValue = here->VBICebbe; |
|||
return(OK); |
|||
case VBIC_MOD_DTEMP: |
|||
value->rValue = here->VBIClocTempDiff; |
|||
return(OK); |
|||
case VBIC_MOD_VERS: |
|||
value->rValue = here->VBICrevVersion; |
|||
return(OK); |
|||
case VBIC_MOD_VREF: |
|||
value->rValue = here->VBICrefVersion; |
|||
return(OK); |
|||
case VBIC_MOD_TYPE: |
|||
if (here->VBICtype == NPN) |
|||
value->sValue = "npn"; |
|||
else |
|||
value->sValue = "pnp"; |
|||
return(OK); |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
/* NOTREACHED */ |
|||
} |
|||
|
|||
@ -0,0 +1,41 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine deletes a VBIC model from the circuit and frees |
|||
* the storage it was using. |
|||
* returns an error if the model has instances |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
VBICmDelete(GENmodel **inModels, IFuid modname, GENmodel *kill) |
|||
{ |
|||
VBICmodel **model = (VBICmodel**)inModels; |
|||
VBICmodel *modfast = (VBICmodel*)kill; |
|||
|
|||
VBICmodel **oldmod; |
|||
oldmod = model; |
|||
for( ; *model ; model = &((*model)->VBICnextModel)) { |
|||
if( (*model)->VBICmodName == modname || |
|||
(modfast && *model == modfast) ) goto delgot; |
|||
oldmod = model; |
|||
} |
|||
return(E_NOMOD); |
|||
|
|||
delgot: |
|||
if( (*model)->VBICinstances ) return(E_NOTEMPTY); |
|||
*oldmod = (*model)->VBICnextModel; /* cut deleted device out of list */ |
|||
FREE(*model); |
|||
return(OK); |
|||
|
|||
} |
|||
@ -0,0 +1,477 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine sets model parameters for |
|||
* VBICs in the circuit. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "const.h" |
|||
#include "ifsim.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
VBICmParam(int param, IFvalue *value, GENmodel *inModel) |
|||
{ |
|||
VBICmodel *mods = (VBICmodel*)inModel; |
|||
|
|||
switch(param) { |
|||
case VBIC_MOD_NPN: |
|||
if(value->iValue) { |
|||
mods->VBICtype = NPN; |
|||
} |
|||
break; |
|||
case VBIC_MOD_PNP: |
|||
if(value->iValue) { |
|||
mods->VBICtype = PNP; |
|||
} |
|||
break; |
|||
|
|||
case VBIC_MOD_TNOM: |
|||
mods->VBICtnom = value->rValue; |
|||
mods->VBICtnomGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_RCX: |
|||
mods->VBICextCollResist = value->rValue; |
|||
mods->VBICextCollResistGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_RCI: |
|||
mods->VBICintCollResist = value->rValue; |
|||
if (mods->VBICintCollResist < 0.1) mods->VBICintCollResist = 0.1; |
|||
mods->VBICintCollResistGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_VO: |
|||
mods->VBICepiSatVoltage = value->rValue; |
|||
mods->VBICepiSatVoltageGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_GAMM: |
|||
mods->VBICepiDoping = value->rValue; |
|||
mods->VBICepiDopingGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_HRCF: |
|||
mods->VBIChighCurFac = value->rValue; |
|||
mods->VBIChighCurFacGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_RBX: |
|||
mods->VBICextBaseResist = value->rValue; |
|||
mods->VBICextBaseResistGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_RBI: |
|||
mods->VBICintBaseResist = value->rValue; |
|||
if (mods->VBICintBaseResist < 0.1) mods->VBICintBaseResist = 0.1; |
|||
mods->VBICintBaseResistGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_RE: |
|||
mods->VBICemitterResist = value->rValue; |
|||
mods->VBICemitterResistGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_RS: |
|||
mods->VBICsubstrateResist = value->rValue; |
|||
mods->VBICsubstrateResistGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_RBP: |
|||
mods->VBICparBaseResist = value->rValue; |
|||
if (mods->VBICparBaseResist < 0.1) mods->VBICparBaseResist = 0.1; |
|||
mods->VBICparBaseResistGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IS: |
|||
mods->VBICsatCur = value->rValue; |
|||
mods->VBICsatCurGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NF: |
|||
mods->VBICemissionCoeffF = value->rValue; |
|||
mods->VBICemissionCoeffFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NR: |
|||
mods->VBICemissionCoeffR = value->rValue; |
|||
mods->VBICemissionCoeffRGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_FC: |
|||
mods->VBICdeplCapLimitF = value->rValue; |
|||
mods->VBICdeplCapLimitFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_CBEO: |
|||
mods->VBICextOverlapCapBE = value->rValue; |
|||
mods->VBICextOverlapCapBEGiven=TRUE; |
|||
break; |
|||
case VBIC_MOD_CJE: |
|||
mods->VBICdepletionCapBE = value->rValue; |
|||
mods->VBICdepletionCapBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_PE: |
|||
mods->VBICpotentialBE = value->rValue; |
|||
mods->VBICpotentialBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_ME: |
|||
mods->VBICjunctionExpBE = value->rValue; |
|||
mods->VBICjunctionExpBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_AJE: |
|||
mods->VBICsmoothCapBE = value->rValue; |
|||
mods->VBICsmoothCapBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_CBCO: |
|||
mods->VBICextOverlapCapBC = value->rValue; |
|||
mods->VBICextOverlapCapBCGiven=TRUE; |
|||
break; |
|||
case VBIC_MOD_CJC: |
|||
mods->VBICdepletionCapBC = value->rValue; |
|||
mods->VBICdepletionCapBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_QCO: |
|||
mods->VBICepiCharge = value->rValue; |
|||
mods->VBICepiChargeGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_CJEP: |
|||
mods->VBICextCapBC = value->rValue; |
|||
mods->VBICextCapBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_PC: |
|||
mods->VBICpotentialBC = value->rValue; |
|||
mods->VBICpotentialBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_MC: |
|||
mods->VBICjunctionExpBC = value->rValue; |
|||
mods->VBICjunctionExpBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_AJC: |
|||
mods->VBICsmoothCapBC = value->rValue; |
|||
mods->VBICsmoothCapBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_CJCP: |
|||
mods->VBICextCapSC = value->rValue; |
|||
mods->VBICextCapSCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_PS: |
|||
mods->VBICpotentialSC = value->rValue; |
|||
mods->VBICpotentialSCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_MS: |
|||
mods->VBICjunctionExpSC = value->rValue; |
|||
mods->VBICjunctionExpSCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_AJS: |
|||
mods->VBICsmoothCapSC = value->rValue; |
|||
mods->VBICsmoothCapSCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBEI: |
|||
mods->VBICidealSatCurBE = value->rValue; |
|||
mods->VBICidealSatCurBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_WBE: |
|||
mods->VBICportionIBEI = value->rValue; |
|||
mods->VBICportionIBEIGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NEI: |
|||
mods->VBICidealEmissCoeffBE = value->rValue; |
|||
mods->VBICidealEmissCoeffBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBEN: |
|||
mods->VBICnidealSatCurBE = value->rValue; |
|||
mods->VBICnidealSatCurBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NEN: |
|||
mods->VBICnidealEmissCoeffBE = value->rValue; |
|||
mods->VBICnidealEmissCoeffBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBCI: |
|||
mods->VBICidealSatCurBC = value->rValue; |
|||
mods->VBICidealSatCurBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NCI: |
|||
mods->VBICidealEmissCoeffBC = value->rValue; |
|||
mods->VBICidealEmissCoeffBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBCN: |
|||
mods->VBICnidealSatCurBC = value->rValue; |
|||
mods->VBICnidealSatCurBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NCN: |
|||
mods->VBICnidealEmissCoeffBC = value->rValue; |
|||
mods->VBICnidealEmissCoeffBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_AVC1: |
|||
mods->VBICavalanchePar1BC = value->rValue; |
|||
mods->VBICavalanchePar1BCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_AVC2: |
|||
mods->VBICavalanchePar2BC = value->rValue; |
|||
mods->VBICavalanchePar2BCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_ISP: |
|||
mods->VBICparasitSatCur = value->rValue; |
|||
mods->VBICparasitSatCurGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_WSP: |
|||
mods->VBICportionICCP = value->rValue; |
|||
mods->VBICportionICCPGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NFP: |
|||
mods->VBICparasitFwdEmissCoeff = value->rValue; |
|||
mods->VBICparasitFwdEmissCoeffGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBEIP: |
|||
mods->VBICidealParasitSatCurBE = value->rValue; |
|||
mods->VBICidealParasitSatCurBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBENP: |
|||
mods->VBICnidealParasitSatCurBE = value->rValue; |
|||
mods->VBICnidealParasitSatCurBEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBCIP: |
|||
mods->VBICidealParasitSatCurBC = value->rValue; |
|||
mods->VBICidealParasitSatCurBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NCIP: |
|||
mods->VBICidealParasitEmissCoeffBC = value->rValue; |
|||
mods->VBICidealParasitEmissCoeffBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBCNP: |
|||
mods->VBICnidealParasitSatCurBC = value->rValue; |
|||
mods->VBICnidealParasitSatCurBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NCNP: |
|||
mods->VBICnidealParasitEmissCoeffBC = value->rValue; |
|||
mods->VBICnidealParasitEmissCoeffBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_VEF: |
|||
mods->VBICearlyVoltF = value->rValue; |
|||
mods->VBICearlyVoltFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_VER: |
|||
mods->VBICearlyVoltR = value->rValue; |
|||
mods->VBICearlyVoltRGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IKF: |
|||
mods->VBICrollOffF = value->rValue; |
|||
mods->VBICrollOffFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IKR: |
|||
mods->VBICrollOffR = value->rValue; |
|||
mods->VBICrollOffRGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IKP: |
|||
mods->VBICparRollOff = value->rValue; |
|||
mods->VBICparRollOffGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_TF: |
|||
mods->VBICtransitTimeF = value->rValue; |
|||
mods->VBICtransitTimeFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_QTF: |
|||
mods->VBICvarTransitTimeF = value->rValue; |
|||
mods->VBICvarTransitTimeFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XTF: |
|||
mods->VBICtransitTimeBiasCoeffF = value->rValue; |
|||
mods->VBICtransitTimeBiasCoeffFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_VTF: |
|||
mods->VBICtransitTimeFVBC = value->rValue; |
|||
mods->VBICtransitTimeFVBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_ITF: |
|||
mods->VBICtransitTimeHighCurrentF = value->rValue; |
|||
mods->VBICtransitTimeHighCurrentFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_TR: |
|||
mods->VBICtransitTimeR = value->rValue; |
|||
mods->VBICtransitTimeRGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_TD: |
|||
mods->VBICdelayTimeF = value->rValue; |
|||
mods->VBICdelayTimeFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_KFN: |
|||
mods->VBICfNcoef = value->rValue; |
|||
mods->VBICfNcoefGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_AFN: |
|||
mods->VBICfNexpA = value->rValue; |
|||
mods->VBICfNexpAGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_BFN: |
|||
mods->VBICfNexpB = value->rValue; |
|||
mods->VBICfNexpBGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XRE: |
|||
mods->VBICtempExpRE = value->rValue; |
|||
mods->VBICtempExpREGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XRBI: |
|||
mods->VBICtempExpRBI = value->rValue; |
|||
mods->VBICtempExpRBIGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XRCI: |
|||
mods->VBICtempExpRCI = value->rValue; |
|||
mods->VBICtempExpRCIGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XRS: |
|||
mods->VBICtempExpRS = value->rValue; |
|||
mods->VBICtempExpRSGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XVO: |
|||
mods->VBICtempExpVO = value->rValue; |
|||
mods->VBICtempExpVOGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EA: |
|||
mods->VBICactivEnergyEA = value->rValue; |
|||
mods->VBICactivEnergyEAGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EAIE: |
|||
mods->VBICactivEnergyEAIE = value->rValue; |
|||
mods->VBICactivEnergyEAIEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EAIC: |
|||
mods->VBICactivEnergyEAIC = value->rValue; |
|||
mods->VBICactivEnergyEAICGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EAIS: |
|||
mods->VBICactivEnergyEAIS = value->rValue; |
|||
mods->VBICactivEnergyEAISGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EANE: |
|||
mods->VBICactivEnergyEANE = value->rValue; |
|||
mods->VBICactivEnergyEANEGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EANC: |
|||
mods->VBICactivEnergyEANC = value->rValue; |
|||
mods->VBICactivEnergyEANCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EANS: |
|||
mods->VBICactivEnergyEANS = value->rValue; |
|||
mods->VBICactivEnergyEANSGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XIS: |
|||
mods->VBICtempExpIS = value->rValue; |
|||
mods->VBICtempExpISGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XII: |
|||
mods->VBICtempExpII = value->rValue; |
|||
mods->VBICtempExpIIGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XIN: |
|||
mods->VBICtempExpIN = value->rValue; |
|||
mods->VBICtempExpINGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_TNF: |
|||
mods->VBICtempExpNF = value->rValue; |
|||
mods->VBICtempExpNFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_TAVC: |
|||
mods->VBICtempExpAVC = value->rValue; |
|||
mods->VBICtempExpAVCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_RTH: |
|||
mods->VBICthermalResist = value->rValue; |
|||
mods->VBICthermalResistGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_CTH: |
|||
mods->VBICthermalCapacitance = value->rValue; |
|||
mods->VBICthermalCapacitanceGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_VRT: |
|||
mods->VBICpunchThroughVoltageBC = value->rValue; |
|||
mods->VBICpunchThroughVoltageBCGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_ART: |
|||
mods->VBICdeplCapCoeff1 = value->rValue; |
|||
mods->VBICdeplCapCoeff1Given = TRUE; |
|||
break; |
|||
case VBIC_MOD_CCSO: |
|||
mods->VBICfixedCapacitanceCS = value->rValue; |
|||
mods->VBICfixedCapacitanceCSGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_QBM: |
|||
mods->VBICsgpQBselector = value->rValue; |
|||
mods->VBICsgpQBselectorGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NKF: |
|||
mods->VBIChighCurrentBetaRolloff = value->rValue; |
|||
mods->VBIChighCurrentBetaRolloffGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XIKF: |
|||
mods->VBICtempExpIKF = value->rValue; |
|||
mods->VBICtempExpIKFGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XRCX: |
|||
mods->VBICtempExpRCX = value->rValue; |
|||
mods->VBICtempExpRCXGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XRBX: |
|||
mods->VBICtempExpRBX = value->rValue; |
|||
mods->VBICtempExpRBXGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XRBP: |
|||
mods->VBICtempExpRBP = value->rValue; |
|||
mods->VBICtempExpRBPGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_ISRR: |
|||
mods->VBICsepISRR = value->rValue; |
|||
mods->VBICsepISRRGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_XISR: |
|||
mods->VBICtempExpXISR = value->rValue; |
|||
mods->VBICtempExpXISRGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_DEAR: |
|||
mods->VBICdear = value->rValue; |
|||
mods->VBICdearGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EAP: |
|||
mods->VBICeap = value->rValue; |
|||
mods->VBICeapGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_VBBE: |
|||
mods->VBICvbbe = value->rValue; |
|||
mods->VBICvbbeGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_NBBE: |
|||
mods->VBICnbbe = value->rValue; |
|||
mods->VBICnbbeGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_IBBE: |
|||
mods->VBICibbe = value->rValue; |
|||
mods->VBICibbeGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_TVBBE1: |
|||
mods->VBICtvbbe1 = value->rValue; |
|||
mods->VBICtvbbe1Given = TRUE; |
|||
break; |
|||
case VBIC_MOD_TVBBE2: |
|||
mods->VBICtvbbe2 = value->rValue; |
|||
mods->VBICtvbbe2Given = TRUE; |
|||
break; |
|||
case VBIC_MOD_TNBBE: |
|||
mods->VBICtnbbe = value->rValue; |
|||
mods->VBICtnbbeGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_EBBE: |
|||
mods->VBICebbe = value->rValue; |
|||
mods->VBICebbeGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_DTEMP: |
|||
mods->VBIClocTempDiff = value->rValue; |
|||
mods->VBIClocTempDiffGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_VERS: |
|||
mods->VBICrevVersion = value->rValue; |
|||
mods->VBICrevVersionGiven = TRUE; |
|||
break; |
|||
case VBIC_MOD_VREF: |
|||
mods->VBICrefVersion = value->rValue; |
|||
mods->VBICrefVersionGiven = TRUE; |
|||
break; |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -0,0 +1,269 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Gary W. Ng |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "vbicdefs.h" |
|||
#include "cktdefs.h" |
|||
#include "iferrmsg.h" |
|||
#include "noisedef.h" |
|||
#include "suffix.h" |
|||
|
|||
/* |
|||
* VBICnoise (mode, operation, firstModel, ckt, data, OnDens) |
|||
* |
|||
* This routine names and evaluates all of the noise sources |
|||
* associated with VBIC'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 VBIC's is summed with the variable "OnDens". |
|||
*/ |
|||
|
|||
extern void NevalSrc(); |
|||
extern double Nintegrate(); |
|||
|
|||
int |
|||
VBICnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens) |
|||
{ |
|||
VBICmodel *firstModel = (VBICmodel *) genmodel; |
|||
VBICmodel *model; |
|||
VBICinstance *inst; |
|||
char name[N_MXVLNTH]; |
|||
double tempOnoise; |
|||
double tempInoise; |
|||
double noizDens[VBICNSRCS]; |
|||
double lnNdens[VBICNSRCS]; |
|||
int i; |
|||
|
|||
/* define the names of the noise sources */ |
|||
|
|||
static char *VBICnNames[VBICNSRCS] = { |
|||
/* Note that we have to keep the order consistent with the |
|||
strchr definitions in VBICdefs.h */ |
|||
"_rc", /* noise due to rc */ |
|||
"_rci", /* noise due to rci */ |
|||
"_rb", /* noise due to rb */ |
|||
"_rbi", /* noise due to rbi */ |
|||
"_re", /* noise due to re */ |
|||
"_rbp", /* noise due to rbp */ |
|||
"_ic", /* noise due to ic */ |
|||
"_ib", /* noise due to ib */ |
|||
"_ibep", /* noise due to ib */ |
|||
"_1overfbe", /* flicker (1/f) noise */ |
|||
"_1overfbep", /* flicker (1/f) noise */ |
|||
"" /* total transistor noise */ |
|||
}; |
|||
|
|||
for (model=firstModel; model != NULL; model=model->VBICnextModel) { |
|||
for (inst=model->VBICinstances; inst != NULL; |
|||
inst=inst->VBICnextInstance) { |
|||
|
|||
if (inst->VBICowner != ARCHme) continue; |
|||
|
|||
switch (operation) { |
|||
|
|||
case N_OPEN: |
|||
|
|||
/* see if we have to to produce a summary report */ |
|||
/* if so, name all the noise generators */ |
|||
|
|||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { |
|||
switch (mode) { |
|||
|
|||
case N_DENS: |
|||
for (i=0; i < VBICNSRCS; i++) { |
|||
(void)sprintf(name,"onoise_%s%s", |
|||
inst->VBICname,VBICnNames[i]); |
|||
|
|||
|
|||
data->namelist = (IFuid *) |
|||
trealloc((char *)data->namelist, |
|||
(data->numPlots + 1)*sizeof(IFuid)); |
|||
if (!data->namelist) return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid))(ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid)NULL,name,UID_OTHER,(void **)NULL); |
|||
/* we've added one more plot */ |
|||
} |
|||
break; |
|||
|
|||
case INT_NOIZ: |
|||
for (i=0; i < VBICNSRCS; i++) { |
|||
(void)sprintf(name,"onoise_total_%s%s", |
|||
inst->VBICname,VBICnNames[i]); |
|||
|
|||
data->namelist = (IFuid *) |
|||
trealloc((char *)data->namelist, |
|||
(data->numPlots + 1)*sizeof(IFuid)); |
|||
if (!data->namelist) return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid))(ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid)NULL,name,UID_OTHER,(void **)NULL); |
|||
/* we've added one more plot */ |
|||
|
|||
(void)sprintf(name,"inoise_total_%s%s", |
|||
inst->VBICname,VBICnNames[i]); |
|||
|
|||
data->namelist = (IFuid *)trealloc((char *)data->namelist,(data->numPlots + 1)*sizeof(IFuid)); |
|||
if (!data->namelist) return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid))(ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid)NULL,name,UID_OTHER,(void **)NULL); |
|||
/* we've added one more plot */ |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case N_CALC: |
|||
switch (mode) { |
|||
|
|||
case N_DENS: |
|||
NevalSrc(&noizDens[VBICRCNOIZ],&lnNdens[VBICRCNOIZ], |
|||
ckt,THERMNOISE,inst->VBICcollCXNode,inst->VBICcollNode, |
|||
model->VBICcollectorConduct * inst->VBICarea * inst->VBICm); |
|||
|
|||
NevalSrc(&noizDens[VBICRCINOIZ],&lnNdens[VBICRCINOIZ], |
|||
ckt,THERMNOISE,inst->VBICcollCXNode,inst->VBICcollCINode, |
|||
*(ckt->CKTstate0 + inst->VBICirci_Vrci)); |
|||
|
|||
NevalSrc(&noizDens[VBICRBNOIZ],&lnNdens[VBICRBNOIZ], |
|||
ckt,THERMNOISE,inst->VBICbaseBXNode,inst->VBICbaseNode, |
|||
model->VBICbaseConduct * inst->VBICarea * inst->VBICm); |
|||
|
|||
NevalSrc(&noizDens[VBICRBINOIZ],&lnNdens[VBICRBINOIZ], |
|||
ckt,THERMNOISE,inst->VBICbaseBXNode,inst->VBICbaseBINode, |
|||
*(ckt->CKTstate0 + inst->VBICirbi_Vrbi)); |
|||
|
|||
NevalSrc(&noizDens[VBICRENOIZ],&lnNdens[VBICRENOIZ], |
|||
ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode, |
|||
model->VBICemitterConduct * inst->VBICarea * inst->VBICm); |
|||
|
|||
NevalSrc(&noizDens[VBICRBPNOIZ],&lnNdens[VBICRBPNOIZ], |
|||
ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode, |
|||
*(ckt->CKTstate0 + inst->VBICirbp_Vrbp)); |
|||
|
|||
|
|||
NevalSrc(&noizDens[VBICICNOIZ],&lnNdens[VBICICNOIZ], |
|||
ckt,SHOTNOISE,inst->VBICcollCINode, inst->VBICemitEINode, |
|||
*(ckt->CKTstate0 + inst->VBICitzf)); |
|||
|
|||
NevalSrc(&noizDens[VBICIBNOIZ],&lnNdens[VBICIBNOIZ], |
|||
ckt,SHOTNOISE,inst->VBICbaseBINode, inst->VBICemitEINode, |
|||
*(ckt->CKTstate0 + inst->VBICibe)); |
|||
|
|||
NevalSrc(&noizDens[VBICIBEPNOIZ],&lnNdens[VBICIBEPNOIZ], |
|||
ckt,SHOTNOISE,inst->VBICbaseBXNode, inst->VBICbaseBPNode, |
|||
*(ckt->CKTstate0 + inst->VBICibep)); |
|||
|
|||
|
|||
NevalSrc(&noizDens[VBICFLBENOIZ],(double*)NULL,ckt, |
|||
N_GAIN,inst->VBICbaseBINode, inst->VBICemitEINode, |
|||
(double)0.0); |
|||
noizDens[VBICFLBENOIZ] *= inst->VBICm * model->VBICfNcoef * |
|||
exp(model->VBICfNexpA * |
|||
log(MAX(fabs(*(ckt->CKTstate0 + inst->VBICibe)/inst->VBICm),N_MINLOG))) / |
|||
pow(data->freq, model->VBICfNexpB); |
|||
lnNdens[VBICFLBENOIZ] = |
|||
log(MAX(noizDens[VBICFLBENOIZ],N_MINLOG)); |
|||
|
|||
NevalSrc(&noizDens[VBICFLBEPNOIZ],(double*)NULL,ckt, |
|||
N_GAIN,inst->VBICbaseBXNode, inst->VBICbaseBPNode, |
|||
(double)0.0); |
|||
noizDens[VBICFLBEPNOIZ] *= inst->VBICm * model->VBICfNcoef * |
|||
exp(model->VBICfNexpA * |
|||
log(MAX(fabs(*(ckt->CKTstate0 + inst->VBICibep)/inst->VBICm),N_MINLOG))) / |
|||
pow(data->freq, model->VBICfNexpB); |
|||
lnNdens[VBICFLBEPNOIZ] = |
|||
log(MAX(noizDens[VBICFLBEPNOIZ],N_MINLOG)); |
|||
|
|||
|
|||
noizDens[VBICTOTNOIZ] = noizDens[VBICRCNOIZ] + |
|||
noizDens[VBICRCINOIZ] + |
|||
noizDens[VBICRBNOIZ] + |
|||
noizDens[VBICRBINOIZ] + |
|||
noizDens[VBICRENOIZ] + |
|||
noizDens[VBICRBPNOIZ] + |
|||
noizDens[VBICICNOIZ] + |
|||
noizDens[VBICIBNOIZ] + |
|||
noizDens[VBICIBEPNOIZ] + |
|||
noizDens[VBICFLBENOIZ] + |
|||
noizDens[VBICFLBEPNOIZ]; |
|||
|
|||
lnNdens[VBICTOTNOIZ] = |
|||
log(noizDens[VBICTOTNOIZ]); |
|||
|
|||
*OnDens += noizDens[VBICTOTNOIZ]; |
|||
|
|||
if (data->delFreq == 0.0) { |
|||
|
|||
/* if we haven't done any previous integration, we need to */ |
|||
/* initialize our "history" variables */ |
|||
|
|||
for (i=0; i < VBICNSRCS; i++) { |
|||
inst->VBICnVar[LNLSTDENS][i] = lnNdens[i]; |
|||
} |
|||
|
|||
/* clear out our integration variables if it's the first pass */ |
|||
|
|||
if (data->freq == ((NOISEAN*)ckt->CKTcurJob)->NstartFreq) { |
|||
for (i=0; i < VBICNSRCS; i++) { |
|||
inst->VBICnVar[OUTNOIZ][i] = 0.0; |
|||
inst->VBICnVar[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 < VBICNSRCS; i++) { |
|||
if (i != VBICTOTNOIZ) { |
|||
tempOnoise = Nintegrate(noizDens[i], lnNdens[i], |
|||
inst->VBICnVar[LNLSTDENS][i], data); |
|||
tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , |
|||
lnNdens[i] + data->lnGainInv, |
|||
inst->VBICnVar[LNLSTDENS][i] + data->lnGainInv, |
|||
data); |
|||
inst->VBICnVar[LNLSTDENS][i] = lnNdens[i]; |
|||
data->outNoiz += tempOnoise; |
|||
data->inNoise += tempInoise; |
|||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { |
|||
inst->VBICnVar[OUTNOIZ][i] += tempOnoise; |
|||
inst->VBICnVar[OUTNOIZ][VBICTOTNOIZ] += tempOnoise; |
|||
inst->VBICnVar[INNOIZ][i] += tempInoise; |
|||
inst->VBICnVar[INNOIZ][VBICTOTNOIZ] += tempInoise; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
if (data->prtSummary) { |
|||
for (i=0; i < VBICNSRCS; i++) { /* print a summary report */ |
|||
data->outpVector[data->outNumber++] = noizDens[i]; |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case INT_NOIZ: /* already calculated, just output */ |
|||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { |
|||
for (i=0; i < VBICNSRCS; i++) { |
|||
data->outpVector[data->outNumber++] = inst->VBICnVar[OUTNOIZ][i]; |
|||
data->outpVector[data->outNumber++] = inst->VBICnVar[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); |
|||
} |
|||
@ -0,0 +1,72 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine sets instance parameters for |
|||
* VBICs in the circuit. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "const.h" |
|||
#include "ifsim.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
/* ARGSUSED */ |
|||
int |
|||
VBICparam(int param, IFvalue *value, GENinstance *instPtr, IFvalue *select) |
|||
{ |
|||
VBICinstance *here = (VBICinstance*)instPtr; |
|||
|
|||
switch(param) { |
|||
case VBIC_AREA: |
|||
here->VBICarea = value->rValue; |
|||
here->VBICareaGiven = TRUE; |
|||
break; |
|||
case VBIC_OFF: |
|||
here->VBICoff = value->iValue; |
|||
break; |
|||
case VBIC_IC_VBE: |
|||
here->VBICicVBE = value->rValue; |
|||
here->VBICicVBEGiven = TRUE; |
|||
break; |
|||
case VBIC_IC_VCE: |
|||
here->VBICicVCE = value->rValue; |
|||
here->VBICicVCEGiven = TRUE; |
|||
break; |
|||
case VBIC_TEMP: |
|||
here->VBICtemp = value->rValue+CONSTCtoK; |
|||
here->VBICtempGiven = TRUE; |
|||
break; |
|||
case VBIC_DTEMP: |
|||
here->VBICdtemp = value->rValue; |
|||
here->VBICdtempGiven = TRUE; |
|||
break; |
|||
case VBIC_M: |
|||
here->VBICm = value->rValue; |
|||
here->VBICmGiven = TRUE; |
|||
break; |
|||
case VBIC_IC : |
|||
switch(value->v.numValue) { |
|||
case 2: |
|||
here->VBICicVCE = *(value->v.vec.rVec+1); |
|||
here->VBICicVCEGiven = TRUE; |
|||
case 1: |
|||
here->VBICicVBE = *(value->v.vec.rVec); |
|||
here->VBICicVBEGiven = TRUE; |
|||
break; |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
break; |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -0,0 +1,273 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* Function to load the COMPLEX circuit matrix using the |
|||
* small signal parameters saved during a previous DC operating |
|||
* point analysis. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
VBICpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) |
|||
{ |
|||
VBICinstance *here; |
|||
VBICmodel *model = (VBICmodel*)inModel; |
|||
double Ibe_Vbei,Ibex_Vbex |
|||
,Itzf_Vbei,Itzf_Vbci,Itzr_Vbci,Itzr_Vbei,Ibc_Vbci |
|||
,Ibc_Vbei,Ibep_Vbep,Ircx_Vrcx,Irci_Vrci |
|||
,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei |
|||
,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci; |
|||
double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci, |
|||
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci; |
|||
|
|||
/* loop through all the models */ |
|||
for( ; model != NULL; model = model->VBICnextModel) { |
|||
|
|||
/* loop through all the instances of the model */ |
|||
for( here = model->VBICinstances; here!= NULL; |
|||
here = here->VBICnextInstance) { |
|||
if (here->VBICowner != ARCHme) continue; |
|||
|
|||
|
|||
Ircx_Vrcx = 1.0 / model->VBICextCollResist * here->VBICarea * here->VBICm; |
|||
Irbx_Vrbx = 1.0 / model->VBICextBaseResist * here->VBICarea * here->VBICm; |
|||
Ire_Vre = 1.0 / model->VBICemitterResist * here->VBICarea * here->VBICm; |
|||
|
|||
Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); |
|||
Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex); |
|||
Itzf_Vbei = *(ckt->CKTstate0 + here->VBICitzf_Vbei); |
|||
Itzf_Vbci = *(ckt->CKTstate0 + here->VBICitzf_Vbci); |
|||
Itzr_Vbci = *(ckt->CKTstate0 + here->VBICitzr_Vbci); |
|||
Itzr_Vbei = *(ckt->CKTstate0 + here->VBICitzr_Vbei); |
|||
Ibc_Vbci = *(ckt->CKTstate0 + here->VBICibc_Vbci); |
|||
Ibc_Vbei = *(ckt->CKTstate0 + here->VBICibc_Vbei); |
|||
Ibep_Vbep = *(ckt->CKTstate0 + here->VBICibep_Vbep); |
|||
Irci_Vrci = *(ckt->CKTstate0 + here->VBICirci_Vrci); |
|||
Irci_Vbci = *(ckt->CKTstate0 + here->VBICirci_Vbci); |
|||
Irci_Vbcx = *(ckt->CKTstate0 + here->VBICirci_Vbcx); |
|||
Irbi_Vrbi = *(ckt->CKTstate0 + here->VBICirbi_Vrbi); |
|||
Irbi_Vbei = *(ckt->CKTstate0 + here->VBICirbi_Vbei); |
|||
Irbi_Vbci = *(ckt->CKTstate0 + here->VBICirbi_Vbci); |
|||
Irbp_Vrbp = *(ckt->CKTstate0 + here->VBICirbp_Vrbp); |
|||
Irbp_Vbep = *(ckt->CKTstate0 + here->VBICirbp_Vbep); |
|||
Irbp_Vbci = *(ckt->CKTstate0 + here->VBICirbp_Vbci); |
|||
|
|||
/* |
|||
c The real part |
|||
*/ |
|||
/* |
|||
c Stamp element: Ibe |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr) += Ibe_Vbei; |
|||
*(here->VBICbaseBIEmitEIPtr) += -Ibe_Vbei; |
|||
*(here->VBICemitEIBaseBIPtr) += -Ibe_Vbei; |
|||
*(here->VBICemitEIEmitEIPtr) += Ibe_Vbei; |
|||
/* |
|||
c Stamp element: Ibex |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr) += Ibex_Vbex; |
|||
*(here->VBICbaseBXEmitEIPtr) += -Ibex_Vbex; |
|||
*(here->VBICemitEIBaseBXPtr) += -Ibex_Vbex; |
|||
*(here->VBICemitEIEmitEIPtr) += Ibex_Vbex; |
|||
/* |
|||
c Stamp element: Itzf |
|||
*/ |
|||
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbei; |
|||
*(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei; |
|||
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbci; |
|||
*(here->VBICcollCICollCIPtr) += -Itzf_Vbci; |
|||
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei; |
|||
*(here->VBICemitEIEmitEIPtr) += Itzf_Vbei; |
|||
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci; |
|||
*(here->VBICemitEICollCIPtr) += Itzf_Vbci; |
|||
/* |
|||
c Stamp element: Itzr |
|||
*/ |
|||
*(here->VBICemitEIBaseBIPtr) += Itzr_Vbci; |
|||
*(here->VBICemitEICollCIPtr) += -Itzr_Vbci; |
|||
*(here->VBICemitEIBaseBIPtr) += Itzr_Vbei; |
|||
*(here->VBICemitEIEmitEIPtr) += -Itzr_Vbei; |
|||
*(here->VBICcollCIBaseBIPtr) += -Itzr_Vbci; |
|||
*(here->VBICcollCICollCIPtr) += Itzr_Vbci; |
|||
*(here->VBICcollCIBaseBIPtr) += -Itzr_Vbei; |
|||
*(here->VBICcollCIEmitEIPtr) += Itzr_Vbei; |
|||
/* |
|||
c Stamp element: Ibc |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr) += Ibc_Vbci; |
|||
*(here->VBICbaseBICollCIPtr) += -Ibc_Vbci; |
|||
*(here->VBICbaseBIBaseBIPtr) += Ibc_Vbei; |
|||
*(here->VBICbaseBIEmitEIPtr) += -Ibc_Vbei; |
|||
*(here->VBICcollCIBaseBIPtr) += -Ibc_Vbci; |
|||
*(here->VBICcollCICollCIPtr) += Ibc_Vbci; |
|||
*(here->VBICcollCIBaseBIPtr) += -Ibc_Vbei; |
|||
*(here->VBICcollCIEmitEIPtr) += Ibc_Vbei; |
|||
/* |
|||
c Stamp element: Ibep |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr) += Ibep_Vbep; |
|||
*(here->VBICbaseBXBaseBPPtr) += -Ibep_Vbep; |
|||
*(here->VBICbaseBPBaseBXPtr) += -Ibep_Vbep; |
|||
*(here->VBICbaseBPBaseBPPtr) += Ibep_Vbep; |
|||
/* |
|||
c Stamp element: Ircx |
|||
*/ |
|||
*(here->VBICcollCollPtr) += Ircx_Vrcx; |
|||
*(here->VBICcollCXCollCXPtr) += Ircx_Vrcx; |
|||
*(here->VBICcollCXCollPtr) += -Ircx_Vrcx; |
|||
*(here->VBICcollCollCXPtr) += -Ircx_Vrcx; |
|||
/* |
|||
c Stamp element: Irci |
|||
*/ |
|||
*(here->VBICcollCXCollCXPtr) += Irci_Vrci; |
|||
*(here->VBICcollCXCollCIPtr) += -Irci_Vrci; |
|||
*(here->VBICcollCXBaseBIPtr) += Irci_Vbci; |
|||
*(here->VBICcollCXCollCIPtr) += -Irci_Vbci; |
|||
*(here->VBICcollCXBaseBIPtr) += Irci_Vbcx; |
|||
*(here->VBICcollCXCollCXPtr) += -Irci_Vbcx; |
|||
*(here->VBICcollCICollCXPtr) += -Irci_Vrci; |
|||
*(here->VBICcollCICollCIPtr) += Irci_Vrci; |
|||
*(here->VBICcollCIBaseBIPtr) += -Irci_Vbci; |
|||
*(here->VBICcollCICollCIPtr) += Irci_Vbci; |
|||
*(here->VBICcollCIBaseBIPtr) += -Irci_Vbcx; |
|||
*(here->VBICcollCICollCXPtr) += Irci_Vbcx; |
|||
/* |
|||
c Stamp element: Irbx |
|||
*/ |
|||
*(here->VBICbaseBasePtr) += Irbx_Vrbx; |
|||
*(here->VBICbaseBXBaseBXPtr) += Irbx_Vrbx; |
|||
*(here->VBICbaseBXBasePtr) += -Irbx_Vrbx; |
|||
*(here->VBICbaseBaseBXPtr) += -Irbx_Vrbx; |
|||
/* |
|||
c Stamp element: Irbi |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr) += Irbi_Vrbi; |
|||
*(here->VBICbaseBXBaseBIPtr) += -Irbi_Vrbi; |
|||
*(here->VBICbaseBXBaseBIPtr) += Irbi_Vbei; |
|||
*(here->VBICbaseBXEmitEIPtr) += -Irbi_Vbei; |
|||
*(here->VBICbaseBXBaseBIPtr) += Irbi_Vbci; |
|||
*(here->VBICbaseBXCollCIPtr) += -Irbi_Vbci; |
|||
*(here->VBICbaseBIBaseBXPtr) += -Irbi_Vrbi; |
|||
*(here->VBICbaseBIBaseBIPtr) += Irbi_Vrbi; |
|||
*(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbei; |
|||
*(here->VBICbaseBIEmitEIPtr) += Irbi_Vbei; |
|||
*(here->VBICbaseBIBaseBIPtr) += -Irbi_Vbci; |
|||
*(here->VBICbaseBICollCIPtr) += Irbi_Vbci; |
|||
/* |
|||
c Stamp element: Ire |
|||
*/ |
|||
*(here->VBICemitEmitPtr) += Ire_Vre; |
|||
*(here->VBICemitEIEmitEIPtr) += Ire_Vre; |
|||
*(here->VBICemitEIEmitPtr) += -Ire_Vre; |
|||
*(here->VBICemitEmitEIPtr) += -Ire_Vre; |
|||
/* |
|||
c Stamp element: Irbp |
|||
*/ |
|||
*(here->VBICbaseBPBaseBPPtr) += Irbp_Vrbp; |
|||
*(here->VBICbaseBPCollCXPtr) += -Irbp_Vrbp; |
|||
*(here->VBICbaseBPBaseBXPtr) += Irbp_Vbep; |
|||
*(here->VBICbaseBPBaseBPPtr) += -Irbp_Vbep; |
|||
*(here->VBICbaseBPBaseBIPtr) += Irbp_Vbci; |
|||
*(here->VBICbaseBPCollCIPtr) += -Irbp_Vbci; |
|||
*(here->VBICcollCXBaseBPPtr) += -Irbp_Vrbp; |
|||
*(here->VBICcollCXCollCXPtr) += Irbp_Vrbp; |
|||
*(here->VBICcollCXBaseBXPtr) += -Irbp_Vbep; |
|||
*(here->VBICcollCXBaseBPPtr) += Irbp_Vbep; |
|||
*(here->VBICcollCXBaseBIPtr) += -Irbp_Vbci; |
|||
*(here->VBICcollCXCollCIPtr) += Irbp_Vbci; |
|||
/* |
|||
c The complex part |
|||
*/ |
|||
XQbe_Vbei = *(ckt->CKTstate0 + here->VBICcqbe); |
|||
XQbe_Vbci = *(ckt->CKTstate0 + here->VBICcqbeci); |
|||
XQbex_Vbex = *(ckt->CKTstate0 + here->VBICcqbex); |
|||
XQbc_Vbci = *(ckt->CKTstate0 + here->VBICcqbc); |
|||
XQbcx_Vbcx = *(ckt->CKTstate0 + here->VBICcqbcx); |
|||
XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep); |
|||
XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci); |
|||
/* |
|||
c Stamp element: Qbe |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr) += (XQbe_Vbei * (s->real)); |
|||
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbe_Vbei * (s->imag)); |
|||
*(here->VBICbaseBIEmitEIPtr) += (-XQbe_Vbei * (s->real)); |
|||
*(here->VBICbaseBIEmitEIPtr + 1) += (-XQbe_Vbei * (s->imag)); |
|||
*(here->VBICbaseBIBaseBIPtr) += (XQbe_Vbci * (s->real)); |
|||
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbe_Vbci * (s->imag)); |
|||
*(here->VBICbaseBICollCIPtr) += (-XQbe_Vbci * (s->real)); |
|||
*(here->VBICbaseBICollCIPtr + 1) += (-XQbe_Vbci * (s->imag)); |
|||
*(here->VBICemitEIBaseBIPtr) += (-XQbe_Vbei * (s->real)); |
|||
*(here->VBICemitEIBaseBIPtr + 1) += (-XQbe_Vbei * (s->imag)); |
|||
*(here->VBICemitEIEmitEIPtr) += (XQbe_Vbei * (s->real)); |
|||
*(here->VBICemitEIEmitEIPtr + 1) += (XQbe_Vbei * (s->imag)); |
|||
*(here->VBICemitEIBaseBIPtr) += (-XQbe_Vbci * (s->real)); |
|||
*(here->VBICemitEIBaseBIPtr + 1) += (-XQbe_Vbci * (s->imag)); |
|||
*(here->VBICemitEICollCIPtr) += (XQbe_Vbci * (s->real)); |
|||
*(here->VBICemitEICollCIPtr + 1) += (XQbe_Vbci * (s->imag)); |
|||
/* |
|||
c Stamp element: Qbex |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr) += (XQbex_Vbex * (s->real)); |
|||
*(here->VBICbaseBXBaseBXPtr + 1) += (XQbex_Vbex * (s->imag)); |
|||
*(here->VBICbaseBXEmitEIPtr) += (-XQbex_Vbex * (s->real)); |
|||
*(here->VBICbaseBXEmitEIPtr + 1) += (-XQbex_Vbex * (s->imag)); |
|||
*(here->VBICemitEIBaseBXPtr) += (-XQbex_Vbex * (s->real)); |
|||
*(here->VBICemitEIBaseBXPtr + 1) += (-XQbex_Vbex * (s->imag)); |
|||
*(here->VBICemitEIEmitEIPtr ) += (XQbex_Vbex * (s->real)); |
|||
*(here->VBICemitEIEmitEIPtr + 1) += (XQbex_Vbex * (s->imag)); |
|||
/* |
|||
c Stamp element: Qbc |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr) += (XQbc_Vbci * (s->real)); |
|||
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbc_Vbci * (s->imag)); |
|||
*(here->VBICbaseBICollCIPtr) += (-XQbc_Vbci * (s->real)); |
|||
*(here->VBICbaseBICollCIPtr + 1) += (-XQbc_Vbci * (s->imag)); |
|||
*(here->VBICcollCIBaseBIPtr) += (-XQbc_Vbci * (s->real)); |
|||
*(here->VBICcollCIBaseBIPtr + 1) += (-XQbc_Vbci * (s->imag)); |
|||
*(here->VBICcollCICollCIPtr) += (XQbc_Vbci * (s->real)); |
|||
*(here->VBICcollCICollCIPtr + 1) += (XQbc_Vbci * (s->imag)); |
|||
/* |
|||
c Stamp element: Qbcx |
|||
*/ |
|||
*(here->VBICbaseBIBaseBIPtr) += (XQbcx_Vbcx * (s->real)); |
|||
*(here->VBICbaseBIBaseBIPtr + 1) += (XQbcx_Vbcx * (s->imag)); |
|||
*(here->VBICbaseBICollCXPtr) += (-XQbcx_Vbcx * (s->real)); |
|||
*(here->VBICbaseBICollCXPtr + 1) += (-XQbcx_Vbcx * (s->imag)); |
|||
*(here->VBICcollCXBaseBIPtr) += (-XQbcx_Vbcx * (s->real)); |
|||
*(here->VBICcollCXBaseBIPtr + 1) += (-XQbcx_Vbcx * (s->imag)); |
|||
*(here->VBICcollCXCollCXPtr) += (XQbcx_Vbcx * (s->real)); |
|||
*(here->VBICcollCXCollCXPtr + 1) += (XQbcx_Vbcx * (s->imag)); |
|||
/* |
|||
c Stamp element: Qbep |
|||
*/ |
|||
*(here->VBICbaseBXBaseBXPtr) += (XQbep_Vbep * (s->real)); |
|||
*(here->VBICbaseBXBaseBXPtr + 1) += (XQbep_Vbep * (s->imag)); |
|||
*(here->VBICbaseBXBaseBPPtr) += (-XQbep_Vbep * (s->real)); |
|||
*(here->VBICbaseBXBaseBPPtr + 1) += (-XQbep_Vbep * (s->imag)); |
|||
*(here->VBICbaseBXBaseBIPtr) += (XQbep_Vbci * (s->real)); |
|||
*(here->VBICbaseBXBaseBIPtr + 1) += (XQbep_Vbci * (s->imag)); |
|||
*(here->VBICbaseBXCollCIPtr) += (-XQbep_Vbci * (s->real)); |
|||
*(here->VBICbaseBXCollCIPtr + 1) += (-XQbep_Vbci * (s->imag)); |
|||
*(here->VBICbaseBPBaseBXPtr) += (-XQbep_Vbep * (s->real)); |
|||
*(here->VBICbaseBPBaseBXPtr + 1) += (-XQbep_Vbep * (s->imag)); |
|||
*(here->VBICbaseBPBaseBPPtr) += (XQbep_Vbep * (s->real)); |
|||
*(here->VBICbaseBPBaseBPPtr + 1) += (XQbep_Vbep * (s->imag)); |
|||
*(here->VBICbaseBPBaseBIPtr) += (-XQbep_Vbci * (s->real)); |
|||
*(here->VBICbaseBPBaseBIPtr + 1) += (-XQbep_Vbci * (s->imag)); |
|||
*(here->VBICbaseBPCollCIPtr) += (XQbep_Vbci * (s->real)); |
|||
*(here->VBICbaseBPCollCIPtr + 1) += (XQbep_Vbci * (s->imag)); |
|||
|
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -0,0 +1,557 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine 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.h" |
|||
#include "cktdefs.h" |
|||
#include "smpdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "const.h" |
|||
#include "sperror.h" |
|||
#include "ifsim.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) |
|||
/* load the VBIC structure with those pointers needed later |
|||
* for fast matrix loading |
|||
*/ |
|||
{ |
|||
VBICmodel *model = (VBICmodel*)inModel; |
|||
VBICinstance *here; |
|||
int error; |
|||
CKTnode *tmp; |
|||
|
|||
/* loop through all the transistor models */ |
|||
for( ; model != NULL; model = model->VBICnextModel ) { |
|||
|
|||
if(model->VBICtype != NPN && model->VBICtype != PNP) { |
|||
model->VBICtype = NPN; |
|||
} |
|||
if(!model->VBICtnomGiven) { |
|||
model->VBICtnom = 27.0; |
|||
} |
|||
if(!model->VBICextCollResistGiven) { |
|||
model->VBICextCollResist = 0.0; |
|||
} |
|||
if(!model->VBICintCollResistGiven) { |
|||
model->VBICintCollResist = 0.1; |
|||
} |
|||
if(!model->VBICepiSatVoltageGiven) { |
|||
model->VBICepiSatVoltage = 0.0; |
|||
} |
|||
if(!model->VBICepiDopingGiven) { |
|||
model->VBICepiDoping = 0.0; |
|||
} |
|||
if(!model->VBIChighCurFacGiven) { |
|||
model->VBIChighCurFac = 1.0; |
|||
} |
|||
if(!model->VBICextBaseResistGiven) { |
|||
model->VBICextBaseResist = 0.0; |
|||
} |
|||
if(!model->VBICintBaseResistGiven) { |
|||
model->VBICintBaseResist = 0.1; |
|||
} |
|||
if(!model->VBICemitterResistGiven) { |
|||
model->VBICemitterResist = 0.0; |
|||
} |
|||
if(!model->VBICsubstrateResistGiven) { |
|||
model->VBICsubstrateResist = 0.0; |
|||
} |
|||
if(!model->VBICparBaseResistGiven) { |
|||
model->VBICparBaseResist = 0.1; |
|||
} |
|||
if(!model->VBICsatCurGiven) { |
|||
model->VBICsatCur = 1e-16; |
|||
} |
|||
if(!model->VBICemissionCoeffFGiven) { |
|||
model->VBICemissionCoeffF = 1.0; |
|||
} |
|||
if(!model->VBICemissionCoeffRGiven) { |
|||
model->VBICemissionCoeffR = 1.0; |
|||
} |
|||
if(!model->VBICdeplCapLimitFGiven) { |
|||
model->VBICdeplCapLimitF = 0.9; |
|||
} |
|||
if(!model->VBICextOverlapCapBEGiven) { |
|||
model->VBICextOverlapCapBE = 0.0; |
|||
} |
|||
if(!model->VBICdepletionCapBEGiven) { |
|||
model->VBICdepletionCapBE = 0.0; |
|||
} |
|||
if(!model->VBICpotentialBEGiven) { |
|||
model->VBICpotentialBE = 0.75; |
|||
} |
|||
if(!model->VBICjunctionExpBEGiven) { |
|||
model->VBICjunctionExpBE = 0.33; |
|||
} |
|||
if(!model->VBICsmoothCapBEGiven) { |
|||
model->VBICsmoothCapBE = -0.5; |
|||
} |
|||
if(!model->VBICextOverlapCapBCGiven) { |
|||
model->VBICextOverlapCapBC = 0.0; |
|||
} |
|||
if(!model->VBICdepletionCapBCGiven) { |
|||
model->VBICdepletionCapBC = 0.0; |
|||
} |
|||
if(!model->VBICepiChargeGiven) { |
|||
model->VBICepiCharge = 0.0; |
|||
} |
|||
if(!model->VBICextCapBCGiven) { |
|||
model->VBICextCapBC = 0.0; |
|||
} |
|||
if(!model->VBICpotentialBCGiven) { |
|||
model->VBICpotentialBC = 0.75; |
|||
} |
|||
if(!model->VBICjunctionExpBCGiven) { |
|||
model->VBICjunctionExpBC = 0.33; |
|||
} |
|||
if(!model->VBICsmoothCapBCGiven) { |
|||
model->VBICsmoothCapBC = -0.5; |
|||
} |
|||
if(!model->VBICextCapSCGiven) { |
|||
model->VBICextCapSC = 0.0; |
|||
} |
|||
if(!model->VBICpotentialSCGiven) { |
|||
model->VBICpotentialSC = 0.75; |
|||
} |
|||
if(!model->VBICjunctionExpSCGiven) { |
|||
model->VBICjunctionExpSC = 0.33; |
|||
} |
|||
if(!model->VBICsmoothCapSCGiven) { |
|||
model->VBICsmoothCapSC = -0.5; |
|||
} |
|||
if(!model->VBICidealSatCurBEGiven) { |
|||
model->VBICidealSatCurBE = 1e-18; |
|||
} |
|||
if(!model->VBICportionIBEIGiven) { |
|||
model->VBICportionIBEI = 1.0; |
|||
} |
|||
if(!model->VBICidealEmissCoeffBEGiven) { |
|||
model->VBICidealEmissCoeffBE = 1.0; |
|||
} |
|||
if(!model->VBICnidealSatCurBEGiven) { |
|||
model->VBICnidealSatCurBE = 0.0; |
|||
} |
|||
if(!model->VBICnidealEmissCoeffBEGiven) { |
|||
model->VBICnidealEmissCoeffBE = 2.0; |
|||
} |
|||
if(!model->VBICidealSatCurBCGiven) { |
|||
model->VBICidealSatCurBC = 1e-16; |
|||
} |
|||
if(!model->VBICidealEmissCoeffBCGiven) { |
|||
model->VBICidealEmissCoeffBC = 1.0; |
|||
} |
|||
if(!model->VBICnidealSatCurBCGiven) { |
|||
model->VBICnidealSatCurBC = 0.0; |
|||
} |
|||
if(!model->VBICnidealEmissCoeffBCGiven) { |
|||
model->VBICnidealEmissCoeffBC = 2.0; |
|||
} |
|||
if(!model->VBICavalanchePar1BCGiven) { |
|||
model->VBICavalanchePar1BC = 0.0; |
|||
} |
|||
if(!model->VBICavalanchePar2BCGiven) { |
|||
model->VBICavalanchePar2BC = 0.0; |
|||
} |
|||
if(!model->VBICparasitSatCurGiven) { |
|||
model->VBICparasitSatCur = 0.0; |
|||
} |
|||
if(!model->VBICportionICCPGiven) { |
|||
model->VBICportionICCP = 1.0; |
|||
} |
|||
if(!model->VBICparasitFwdEmissCoeffGiven) { |
|||
model->VBICparasitFwdEmissCoeff = 1.0; |
|||
} |
|||
if(!model->VBICidealParasitSatCurBEGiven) { |
|||
model->VBICidealParasitSatCurBE = 0.0; |
|||
} |
|||
if(!model->VBICnidealParasitSatCurBEGiven) { |
|||
model->VBICnidealParasitSatCurBE = 0.0; |
|||
} |
|||
if(!model->VBICidealParasitSatCurBCGiven) { |
|||
model->VBICidealParasitSatCurBC = 0.0; |
|||
} |
|||
if(!model->VBICidealParasitEmissCoeffBCGiven) { |
|||
model->VBICidealParasitEmissCoeffBC = 1.0; |
|||
} |
|||
if(!model->VBICnidealParasitSatCurBCGiven) { |
|||
model->VBICnidealParasitSatCurBC = 0.0; |
|||
} |
|||
if(!model->VBICnidealParasitEmissCoeffBCGiven) { |
|||
model->VBICnidealParasitEmissCoeffBC = 2.0; |
|||
} |
|||
if(!model->VBICearlyVoltFGiven) { |
|||
model->VBICearlyVoltF = 0.0; |
|||
} |
|||
if(!model->VBICearlyVoltRGiven) { |
|||
model->VBICearlyVoltR = 0.0; |
|||
} |
|||
if(!model->VBICrollOffFGiven) { |
|||
model->VBICrollOffF = 0.0; |
|||
} |
|||
if(!model->VBICrollOffRGiven) { |
|||
model->VBICrollOffR = 0.0; |
|||
} |
|||
if(!model->VBICparRollOffGiven) { |
|||
model->VBICparRollOff = 0.0; |
|||
} |
|||
if(!model->VBICtransitTimeFGiven) { |
|||
model->VBICtransitTimeF = 0.0; |
|||
} |
|||
if(!model->VBICvarTransitTimeFGiven) { |
|||
model->VBICvarTransitTimeF = 0.0; |
|||
} |
|||
if(!model->VBICtransitTimeBiasCoeffFGiven) { |
|||
model->VBICtransitTimeBiasCoeffF = 0.0; |
|||
} |
|||
if(!model->VBICtransitTimeFVBCGiven) { |
|||
model->VBICtransitTimeFVBC = 0.0; |
|||
} |
|||
if(!model->VBICtransitTimeHighCurrentFGiven) { |
|||
model->VBICtransitTimeHighCurrentF = 0.0; |
|||
} |
|||
if(!model->VBICtransitTimeRGiven) { |
|||
model->VBICtransitTimeR = 0.0; |
|||
} |
|||
if(!model->VBICdelayTimeFGiven) { |
|||
model->VBICdelayTimeF = 0.0; |
|||
} |
|||
if(!model->VBICfNcoefGiven) { |
|||
model->VBICfNcoef = 0.0; |
|||
} |
|||
if(!model->VBICfNexpAGiven) { |
|||
model->VBICfNexpA = 1.0; |
|||
} |
|||
if(!model->VBICfNexpBGiven) { |
|||
model->VBICfNexpB = 1.0; |
|||
} |
|||
if(!model->VBICtempExpREGiven) { |
|||
model->VBICtempExpRE = 0.0; |
|||
} |
|||
if(!model->VBICtempExpRBIGiven) { |
|||
model->VBICtempExpRBI = 0.0; |
|||
} |
|||
if(!model->VBICtempExpRCIGiven) { |
|||
model->VBICtempExpRCI = 0.0; |
|||
} |
|||
if(!model->VBICtempExpRSGiven) { |
|||
model->VBICtempExpRS = 0.0; |
|||
} |
|||
if(!model->VBICtempExpVOGiven) { |
|||
model->VBICtempExpVO = 0.0; |
|||
} |
|||
if(!model->VBICactivEnergyEAGiven) { |
|||
model->VBICactivEnergyEA = 1.12; |
|||
} |
|||
if(!model->VBICactivEnergyEAIEGiven) { |
|||
model->VBICactivEnergyEAIE = 1.12; |
|||
} |
|||
if(!model->VBICactivEnergyEAICGiven) { |
|||
model->VBICactivEnergyEAIC = 1.12; |
|||
} |
|||
if(!model->VBICactivEnergyEAISGiven) { |
|||
model->VBICactivEnergyEAIS = 1.12; |
|||
} |
|||
if(!model->VBICactivEnergyEANEGiven) { |
|||
model->VBICactivEnergyEANE = 1.12; |
|||
} |
|||
if(!model->VBICactivEnergyEANCGiven) { |
|||
model->VBICactivEnergyEANC = 1.12; |
|||
} |
|||
if(!model->VBICactivEnergyEANSGiven) { |
|||
model->VBICactivEnergyEANS = 1.12; |
|||
} |
|||
if(!model->VBICtempExpISGiven) { |
|||
model->VBICtempExpIS = 3.0; |
|||
} |
|||
if(!model->VBICtempExpIIGiven) { |
|||
model->VBICtempExpII = 3.0; |
|||
} |
|||
if(!model->VBICtempExpINGiven) { |
|||
model->VBICtempExpIN = 3.0; |
|||
} |
|||
if(!model->VBICtempExpNFGiven) { |
|||
model->VBICtempExpNF = 0.0; |
|||
} |
|||
if(!model->VBICtempExpAVCGiven) { |
|||
model->VBICtempExpAVC = 0.0; |
|||
} |
|||
if(!model->VBICthermalResistGiven) { |
|||
model->VBICthermalResist = 0.0; |
|||
} |
|||
if(!model->VBICthermalCapacitanceGiven) { |
|||
model->VBICthermalCapacitance = 0.0; |
|||
} |
|||
if(!model->VBICpunchThroughVoltageBCGiven) { |
|||
model->VBICpunchThroughVoltageBC = 0.0; |
|||
} |
|||
if(!model->VBICdeplCapCoeff1Given) { |
|||
model->VBICdeplCapCoeff1 = 0.1; |
|||
} |
|||
if(!model->VBICfixedCapacitanceCSGiven) { |
|||
model->VBICfixedCapacitanceCS = 0.0; |
|||
} |
|||
if(!model->VBICsgpQBselectorGiven) { |
|||
model->VBICsgpQBselector = 0.0; |
|||
} |
|||
if(!model->VBIChighCurrentBetaRolloffGiven) { |
|||
model->VBIChighCurrentBetaRolloff = 0.5; |
|||
} |
|||
if(!model->VBICtempExpIKFGiven) { |
|||
model->VBICtempExpIKF = 0.0; |
|||
} |
|||
if(!model->VBICtempExpRCXGiven) { |
|||
model->VBICtempExpRCX = 0.0; |
|||
} |
|||
if(!model->VBICtempExpRBXGiven) { |
|||
model->VBICtempExpRBX = 0.0; |
|||
} |
|||
if(!model->VBICtempExpRBPGiven) { |
|||
model->VBICtempExpRBP = 0.0; |
|||
} |
|||
if(!model->VBICsepISRRGiven) { |
|||
model->VBICsepISRR = 1.0; |
|||
} |
|||
if(!model->VBICtempExpXISRGiven) { |
|||
model->VBICtempExpXISR = 0.0; |
|||
} |
|||
if(!model->VBICdearGiven) { |
|||
model->VBICdear = 0.0; |
|||
} |
|||
if(!model->VBICeapGiven) { |
|||
model->VBICeap = 1.12; |
|||
} |
|||
if(!model->VBICvbbeGiven) { |
|||
model->VBICvbbe = 0.0; |
|||
} |
|||
if(!model->VBICnbbeGiven) { |
|||
model->VBICnbbe = 1.0; |
|||
} |
|||
if(!model->VBICibbeGiven) { |
|||
model->VBICibbe = 1e-06; |
|||
} |
|||
if(!model->VBICtvbbe1Given) { |
|||
model->VBICtvbbe1 = 0.0; |
|||
} |
|||
if(!model->VBICtvbbe2Given) { |
|||
model->VBICtvbbe2 = 0.0; |
|||
} |
|||
if(!model->VBICtnbbeGiven) { |
|||
model->VBICtnbbe = 0.0; |
|||
} |
|||
if(!model->VBICebbeGiven) { |
|||
model->VBICebbe = 0.0; |
|||
} |
|||
if(!model->VBIClocTempDiffGiven) { |
|||
model->VBIClocTempDiff = 0.0; |
|||
} |
|||
if(!model->VBICrevVersionGiven) { |
|||
model->VBICrevVersion = 1.2; |
|||
} |
|||
if(!model->VBICrefVersionGiven) { |
|||
model->VBICrefVersion = 0.0; |
|||
} |
|||
|
|||
/* loop through all the instances of the model */ |
|||
for (here = model->VBICinstances; here != NULL ; |
|||
here=here->VBICnextInstance) { |
|||
CKTnode *tmpNode; |
|||
IFuid tmpName; |
|||
|
|||
if (here->VBICowner != ARCHme) |
|||
goto matrixpointers; |
|||
|
|||
if(!here->VBICareaGiven) { |
|||
here->VBICarea = 1.0; |
|||
} |
|||
if(!here->VBICmGiven) { |
|||
here->VBICm = 1.0; |
|||
} |
|||
if(!here->VBICdtempGiven) { |
|||
here->VBICdtemp = 0.0; |
|||
} |
|||
|
|||
here->VBICstate = *states; |
|||
*states += VBICnumStates; |
|||
if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) ){ |
|||
*states += 8 * (ckt->CKTsenInfo->SENparms); |
|||
} |
|||
|
|||
matrixpointers: |
|||
if(model->VBICextCollResist == 0) { |
|||
here->VBICcollCXNode = here->VBICcollNode; |
|||
} else if(here->VBICcollCXNode == 0) { |
|||
error = CKTmkVolt(ckt,&tmp,here->VBICname,"collector"); |
|||
if(error) return(error); |
|||
here->VBICcollCXNode = 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->VBICextBaseResist == 0) { |
|||
here->VBICbaseBXNode = here->VBICbaseNode; |
|||
} else if(here->VBICbaseBXNode == 0){ |
|||
error = CKTmkVolt(ckt,&tmp,here->VBICname, "base"); |
|||
if(error) return(error); |
|||
here->VBICbaseBXNode = 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->VBICemitterResist == 0) { |
|||
here->VBICemitEINode = here->VBICemitNode; |
|||
} else if(here->VBICemitEINode == 0) { |
|||
error = CKTmkVolt(ckt,&tmp,here->VBICname, "emitter"); |
|||
if(error) return(error); |
|||
here->VBICemitEINode = tmp->number; |
|||
if (ckt->CKTcopyNodesets) { |
|||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { |
|||
if (tmpNode->nsGiven) { |
|||
tmp->nodeset=tmpNode->nodeset; |
|||
tmp->nsGiven=tmpNode->nsGiven; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
error = CKTmkVolt(ckt, &tmp, here->VBICname, "collCI"); |
|||
if(error) return(error); |
|||
here->VBICcollCINode = tmp->number; |
|||
|
|||
error = CKTmkVolt(ckt, &tmp, here->VBICname, "baseBP"); |
|||
if(error) return(error); |
|||
here->VBICbaseBPNode = tmp->number; |
|||
|
|||
error = CKTmkVolt(ckt, &tmp, here->VBICname, "baseBI"); |
|||
if(error) return(error); |
|||
here->VBICbaseBINode = tmp->number; |
|||
|
|||
/* macro to make elements with built in test for out of memory */ |
|||
#define TSTALLOC(ptr,first,second) \ |
|||
if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ |
|||
return(E_NOMEM);\ |
|||
} |
|||
TSTALLOC(VBICcollCollPtr,VBICcollNode,VBICcollNode) |
|||
TSTALLOC(VBICbaseBasePtr,VBICbaseNode,VBICbaseNode) |
|||
TSTALLOC(VBICemitEmitPtr,VBICemitNode,VBICemitNode) |
|||
TSTALLOC(VBICcollCXCollCXPtr,VBICcollCXNode,VBICcollCXNode) |
|||
TSTALLOC(VBICcollCICollCIPtr,VBICcollCINode,VBICcollCINode) |
|||
TSTALLOC(VBICbaseBXBaseBXPtr,VBICbaseBXNode,VBICbaseBXNode) |
|||
TSTALLOC(VBICbaseBIBaseBIPtr,VBICbaseBINode,VBICbaseBINode) |
|||
TSTALLOC(VBICemitEIEmitEIPtr,VBICemitEINode,VBICemitEINode) |
|||
TSTALLOC(VBICbaseBPBaseBPPtr,VBICbaseBPNode,VBICbaseBPNode) |
|||
|
|||
TSTALLOC(VBICbaseEmitPtr,VBICbaseNode,VBICemitNode) |
|||
TSTALLOC(VBICemitBasePtr,VBICemitNode,VBICbaseNode) |
|||
TSTALLOC(VBICbaseCollPtr,VBICbaseNode,VBICcollNode) |
|||
TSTALLOC(VBICcollBasePtr,VBICcollNode,VBICbaseNode) |
|||
TSTALLOC(VBICcollCollCXPtr,VBICcollNode,VBICcollCXNode) |
|||
TSTALLOC(VBICbaseBaseBXPtr,VBICbaseNode,VBICbaseBXNode) |
|||
TSTALLOC(VBICemitEmitEIPtr,VBICemitNode,VBICemitEINode) |
|||
TSTALLOC(VBICcollCXCollCIPtr,VBICcollCXNode,VBICcollCINode) |
|||
TSTALLOC(VBICcollCXBaseBXPtr,VBICcollCXNode,VBICbaseBXNode) |
|||
TSTALLOC(VBICcollCXBaseBIPtr,VBICcollCXNode,VBICbaseBINode) |
|||
TSTALLOC(VBICcollCXBaseBPPtr,VBICcollCXNode,VBICbaseBPNode) |
|||
TSTALLOC(VBICcollCIBaseBIPtr,VBICcollCINode,VBICbaseBINode) |
|||
TSTALLOC(VBICcollCIEmitEIPtr,VBICcollCINode,VBICemitEINode) |
|||
TSTALLOC(VBICbaseBXBaseBIPtr,VBICbaseBXNode,VBICbaseBINode) |
|||
TSTALLOC(VBICbaseBXEmitEIPtr,VBICbaseBXNode,VBICemitEINode) |
|||
TSTALLOC(VBICbaseBXBaseBPPtr,VBICbaseBXNode,VBICbaseBPNode) |
|||
TSTALLOC(VBICbaseBIEmitEIPtr,VBICbaseBINode,VBICemitEINode) |
|||
|
|||
TSTALLOC(VBICcollCXCollPtr,VBICcollCXNode,VBICcollNode) |
|||
TSTALLOC(VBICbaseBXBasePtr,VBICbaseBXNode,VBICbaseNode) |
|||
TSTALLOC(VBICemitEIEmitPtr,VBICemitEINode,VBICemitNode) |
|||
TSTALLOC(VBICcollCICollCXPtr,VBICcollCINode,VBICcollCXNode) |
|||
TSTALLOC(VBICbaseBICollCXPtr,VBICbaseBINode,VBICcollCXNode) |
|||
TSTALLOC(VBICbaseBPCollCXPtr,VBICbaseBPNode,VBICcollCXNode) |
|||
TSTALLOC(VBICbaseBXCollCIPtr,VBICbaseBXNode,VBICcollCINode) |
|||
TSTALLOC(VBICbaseBICollCIPtr,VBICbaseBINode,VBICcollCINode) |
|||
TSTALLOC(VBICemitEICollCIPtr,VBICemitEINode,VBICcollCINode) |
|||
TSTALLOC(VBICbaseBPCollCIPtr,VBICbaseBPNode,VBICcollCINode) |
|||
TSTALLOC(VBICbaseBIBaseBXPtr,VBICbaseBINode,VBICbaseBXNode) |
|||
TSTALLOC(VBICemitEIBaseBXPtr,VBICemitEINode,VBICbaseBXNode) |
|||
TSTALLOC(VBICbaseBPBaseBXPtr,VBICbaseBPNode,VBICbaseBXNode) |
|||
TSTALLOC(VBICemitEIBaseBIPtr,VBICemitEINode,VBICbaseBINode) |
|||
TSTALLOC(VBICbaseBPBaseBIPtr,VBICbaseBPNode,VBICbaseBINode) |
|||
|
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
|
|||
int |
|||
VBICunsetup(inModel,ckt) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
{ |
|||
VBICmodel *model; |
|||
VBICinstance *here; |
|||
|
|||
for (model = (VBICmodel *)inModel; model != NULL; |
|||
model = model->VBICnextModel) |
|||
{ |
|||
for (here = model->VBICinstances; here != NULL; |
|||
here=here->VBICnextInstance) |
|||
{ |
|||
if (here->VBICcollCXNode |
|||
&& here->VBICcollCXNode != here->VBICcollNode) |
|||
{ |
|||
CKTdltNNum(ckt, here->VBICcollCXNode); |
|||
here->VBICcollCXNode = 0; |
|||
} |
|||
if (here->VBICcollCINode |
|||
&& here->VBICcollCINode != here->VBICcollNode) |
|||
{ |
|||
CKTdltNNum(ckt, here->VBICcollCINode); |
|||
here->VBICcollCINode = 0; |
|||
} |
|||
if (here->VBICbaseBXNode |
|||
&& here->VBICbaseBXNode != here->VBICbaseNode) |
|||
{ |
|||
CKTdltNNum(ckt, here->VBICbaseBXNode); |
|||
here->VBICbaseBXNode = 0; |
|||
} |
|||
if (here->VBICbaseBINode |
|||
&& here->VBICbaseBINode != here->VBICbaseNode) |
|||
{ |
|||
CKTdltNNum(ckt, here->VBICbaseBINode); |
|||
here->VBICbaseBINode = 0; |
|||
} |
|||
if (here->VBICbaseBPNode |
|||
&& here->VBICbaseBPNode != here->VBICbaseNode) |
|||
{ |
|||
CKTdltNNum(ckt, here->VBICbaseBPNode); |
|||
here->VBICbaseBPNode = 0; |
|||
} |
|||
if (here->VBICemitEINode |
|||
&& here->VBICemitEINode != here->VBICemitNode) |
|||
{ |
|||
CKTdltNNum(ckt, here->VBICemitEINode); |
|||
here->VBICemitEINode = 0; |
|||
} |
|||
} |
|||
} |
|||
return OK; |
|||
} |
|||
@ -0,0 +1,468 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "smpdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "const.h" |
|||
#include "sperror.h" |
|||
#include "ifsim.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
/* ARGSUSED */ |
|||
int |
|||
VBICtemp(GENmodel *inModel, CKTcircuit *ckt) |
|||
/* Pre-compute many useful parameters |
|||
*/ |
|||
{ |
|||
VBICmodel *model = (VBICmodel *)inModel; |
|||
VBICinstance *here; |
|||
double p[108], pnom[108], TAMB; |
|||
int iret, vbic_3T_it_cf_t(double *, double *, double *); |
|||
double vt; |
|||
|
|||
/* loop through all the bipolar models */ |
|||
for( ; model != NULL; model = model->VBICnextModel ) { |
|||
|
|||
if(!model->VBICtnomGiven) model->VBICtnom = ckt->CKTnomTemp - CONSTCtoK; |
|||
|
|||
if(model->VBICextCollResistGiven && model->VBICextCollResist != 0.0) { |
|||
model->VBICcollectorConduct = 1.0 / model->VBICextCollResist; |
|||
} else { |
|||
model->VBICcollectorConduct = 0.0; |
|||
} |
|||
if(model->VBICextBaseResistGiven && model->VBICextBaseResist != 0.0) { |
|||
model->VBICbaseConduct = 1.0 / model->VBICextBaseResist; |
|||
} else { |
|||
model->VBICbaseConduct = 0.0; |
|||
} |
|||
if(model->VBICemitterResistGiven && model->VBICemitterResist != 0.0) { |
|||
model->VBICemitterConduct = 1.0 / model->VBICemitterResist; |
|||
} else { |
|||
model->VBICemitterConduct = 0.0; |
|||
} |
|||
|
|||
/* loop through all the instances of the model */ |
|||
for (here = model->VBICinstances; here != NULL ; |
|||
here=here->VBICnextInstance) { |
|||
if (here->VBICowner != ARCHme) continue; |
|||
|
|||
if(!here->VBICtempGiven) here->VBICtemp = ckt->CKTtemp; |
|||
|
|||
if(here->VBICdtempGiven) here->VBICtemp = here->VBICtemp + here->VBICdtemp; |
|||
|
|||
TAMB = here->VBICtemp - CONSTCtoK; |
|||
|
|||
pnom[0] = model->VBICtnom; |
|||
pnom[1] = model->VBICextCollResist; |
|||
pnom[2] = model->VBICintCollResist; |
|||
pnom[3] = model->VBICepiSatVoltage; |
|||
pnom[4] = model->VBICepiDoping; |
|||
pnom[5] = model->VBIChighCurFac; |
|||
pnom[6] = model->VBICextBaseResist; |
|||
pnom[7] = model->VBICintBaseResist; |
|||
pnom[8] = model->VBICemitterResist; |
|||
pnom[9] = model->VBICsubstrateResist; |
|||
pnom[10] = model->VBICparBaseResist; |
|||
pnom[11] = model->VBICsatCur; |
|||
pnom[12] = model->VBICemissionCoeffF; |
|||
pnom[13] = model->VBICemissionCoeffR; |
|||
pnom[14] = model->VBICdeplCapLimitF; |
|||
pnom[15] = model->VBICextOverlapCapBE; |
|||
pnom[16] = model->VBICdepletionCapBE; |
|||
pnom[17] = model->VBICpotentialBE; |
|||
pnom[18] = model->VBICjunctionExpBE; |
|||
pnom[19] = model->VBICsmoothCapBE; |
|||
pnom[20] = model->VBICextOverlapCapBC; |
|||
pnom[21] = model->VBICdepletionCapBC; |
|||
pnom[22] = model->VBICepiCharge; |
|||
pnom[23] = model->VBICextCapBC; |
|||
pnom[24] = model->VBICpotentialBC; |
|||
pnom[25] = model->VBICjunctionExpBC; |
|||
pnom[26] = model->VBICsmoothCapBC; |
|||
pnom[27] = model->VBICextCapSC; |
|||
pnom[28] = model->VBICpotentialSC; |
|||
pnom[29] = model->VBICjunctionExpSC; |
|||
pnom[30] = model->VBICsmoothCapSC; |
|||
pnom[31] = model->VBICidealSatCurBE; |
|||
pnom[32] = model->VBICportionIBEI; |
|||
pnom[33] = model->VBICidealEmissCoeffBE; |
|||
pnom[34] = model->VBICnidealSatCurBE; |
|||
pnom[35] = model->VBICnidealEmissCoeffBE; |
|||
pnom[36] = model->VBICidealSatCurBC; |
|||
pnom[37] = model->VBICidealEmissCoeffBC; |
|||
pnom[38] = model->VBICnidealSatCurBC; |
|||
pnom[39] = model->VBICnidealEmissCoeffBC; |
|||
pnom[40] = model->VBICavalanchePar1BC; |
|||
pnom[41] = model->VBICavalanchePar2BC; |
|||
pnom[42] = model->VBICparasitSatCur; |
|||
pnom[43] = model->VBICportionICCP; |
|||
pnom[44] = model->VBICparasitFwdEmissCoeff; |
|||
pnom[45] = model->VBICidealParasitSatCurBE; |
|||
pnom[46] = model->VBICnidealParasitSatCurBE; |
|||
pnom[47] = model->VBICidealParasitSatCurBC; |
|||
pnom[48] = model->VBICidealParasitEmissCoeffBC; |
|||
pnom[49] = model->VBICnidealParasitSatCurBC; |
|||
pnom[50] = model->VBICnidealParasitEmissCoeffBC; |
|||
pnom[51] = model->VBICearlyVoltF; |
|||
pnom[52] = model->VBICearlyVoltR; |
|||
pnom[53] = model->VBICrollOffF; |
|||
pnom[54] = model->VBICrollOffR; |
|||
pnom[55] = model->VBICparRollOff; |
|||
pnom[56] = model->VBICtransitTimeF; |
|||
pnom[57] = model->VBICvarTransitTimeF; |
|||
pnom[58] = model->VBICtransitTimeBiasCoeffF; |
|||
pnom[59] = model->VBICtransitTimeFVBC; |
|||
pnom[60] = model->VBICtransitTimeHighCurrentF; |
|||
pnom[61] = model->VBICtransitTimeR; |
|||
pnom[62] = model->VBICdelayTimeF; |
|||
pnom[63] = model->VBICfNcoef; |
|||
pnom[64] = model->VBICfNexpA; |
|||
pnom[65] = model->VBICfNexpB; |
|||
pnom[66] = model->VBICtempExpRE; |
|||
pnom[67] = model->VBICtempExpRBI; |
|||
pnom[68] = model->VBICtempExpRCI; |
|||
pnom[69] = model->VBICtempExpRS; |
|||
pnom[70] = model->VBICtempExpVO; |
|||
pnom[71] = model->VBICactivEnergyEA; |
|||
pnom[72] = model->VBICactivEnergyEAIE; |
|||
pnom[73] = model->VBICactivEnergyEAIC; |
|||
pnom[74] = model->VBICactivEnergyEAIS; |
|||
pnom[75] = model->VBICactivEnergyEANE; |
|||
pnom[76] = model->VBICactivEnergyEANC; |
|||
pnom[77] = model->VBICactivEnergyEANS; |
|||
pnom[78] = model->VBICtempExpIS; |
|||
pnom[79] = model->VBICtempExpII; |
|||
pnom[80] = model->VBICtempExpIN; |
|||
pnom[81] = model->VBICtempExpNF; |
|||
pnom[82] = model->VBICtempExpAVC; |
|||
pnom[83] = model->VBICthermalResist; |
|||
pnom[84] = model->VBICthermalCapacitance; |
|||
pnom[85] = model->VBICpunchThroughVoltageBC; |
|||
pnom[86] = model->VBICdeplCapCoeff1; |
|||
pnom[87] = model->VBICfixedCapacitanceCS; |
|||
pnom[88] = model->VBICsgpQBselector; |
|||
pnom[89] = model->VBIChighCurrentBetaRolloff; |
|||
pnom[90] = model->VBICtempExpIKF; |
|||
pnom[91] = model->VBICtempExpRCX; |
|||
pnom[92] = model->VBICtempExpRBX; |
|||
pnom[93] = model->VBICtempExpRBP; |
|||
pnom[94] = model->VBICsepISRR; |
|||
pnom[95] = model->VBICtempExpXISR; |
|||
pnom[96] = model->VBICdear; |
|||
pnom[97] = model->VBICeap; |
|||
pnom[98] = model->VBICvbbe; |
|||
pnom[99] = model->VBICnbbe; |
|||
pnom[100] = model->VBICibbe; |
|||
pnom[101] = model->VBICtvbbe1; |
|||
pnom[102] = model->VBICtvbbe2; |
|||
pnom[103] = model->VBICtnbbe; |
|||
pnom[104] = model->VBICebbe; |
|||
pnom[105] = model->VBIClocTempDiff; |
|||
pnom[106] = model->VBICrevVersion; |
|||
pnom[107] = model->VBICrefVersion; |
|||
|
|||
iret = vbic_3T_it_cf_t(p,pnom,&TAMB); |
|||
|
|||
here->VBICttnom = p[0]; |
|||
here->VBICtextCollResist = p[1]; |
|||
here->VBICtintCollResist = p[2]; |
|||
here->VBICtepiSatVoltage = p[3]; |
|||
here->VBICtepiDoping = p[4]; |
|||
here->VBICtextBaseResist = p[6]; |
|||
here->VBICtintBaseResist = p[7]; |
|||
here->VBICtemitterResist = p[8]; |
|||
here->VBICtsubstrateResist = p[9]; |
|||
here->VBICtparBaseResist = p[10]; |
|||
here->VBICtsatCur = p[11]; |
|||
here->VBICtemissionCoeffF = p[12]; |
|||
here->VBICtemissionCoeffR = p[13]; |
|||
here->VBICtdepletionCapBE = p[16]; |
|||
here->VBICtpotentialBE = p[17]; |
|||
here->VBICtdepletionCapBC = p[21]; |
|||
here->VBICtextCapBC = p[23]; |
|||
here->VBICtpotentialBC = p[24]; |
|||
here->VBICtextCapSC = p[27]; |
|||
here->VBICtpotentialSC = p[28]; |
|||
here->VBICtidealSatCurBE = p[31]; |
|||
here->VBICtnidealSatCurBE = p[34]; |
|||
here->VBICtidealSatCurBC = p[36]; |
|||
here->VBICtnidealSatCurBC = p[38]; |
|||
here->VBICtavalanchePar2BC = p[41]; |
|||
here->VBICtparasitSatCur = p[42]; |
|||
here->VBICtidealParasitSatCurBE = p[45]; |
|||
here->VBICtnidealParasitSatCurBE = p[46]; |
|||
here->VBICtidealParasitSatCurBC = p[47]; |
|||
here->VBICtnidealParasitSatCurBC = p[49]; |
|||
here->VBICtrollOffF = p[53]; |
|||
here->VBICtsepISRR = p[94]; |
|||
here->VBICtvbbe = p[98]; |
|||
here->VBICtnbbe = p[99]; |
|||
|
|||
vt = here->VBICtemp * CONSTKoverQ; |
|||
here->VBICtVcrit = vt * |
|||
log(vt / (CONSTroot2*model->VBICsatCur*here->VBICarea*here->VBICm)); |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
|
|||
int vbic_3T_it_cf_t(p,pnom,TAMB) |
|||
double *p, *pnom, *TAMB; |
|||
{ |
|||
double Tini, Tdev, Vtv, rT, dT, xvar1; |
|||
double xvar2, xvar3, xvar4, xvar5, xvar6, psiio; |
|||
double psiin; |
|||
|
|||
/* Direct copy p<-pnom for temperature independent parameters */ |
|||
|
|||
p[5]=pnom[5]; |
|||
p[14]=pnom[14]; |
|||
p[15]=pnom[15]; |
|||
p[18]=pnom[18]; |
|||
p[19]=pnom[19]; |
|||
p[20]=pnom[20]; |
|||
p[22]=pnom[22]; |
|||
p[25]=pnom[25]; |
|||
p[26]=pnom[26]; |
|||
p[29]=pnom[29]; |
|||
p[30]=pnom[30]; |
|||
p[32]=pnom[32]; |
|||
p[33]=pnom[33]; |
|||
p[35]=pnom[35]; |
|||
p[37]=pnom[37]; |
|||
p[39]=pnom[39]; |
|||
p[40]=pnom[40]; |
|||
p[43]=pnom[43]; |
|||
p[44]=pnom[44]; |
|||
p[48]=pnom[48]; |
|||
p[50]=pnom[50]; |
|||
p[51]=pnom[51]; |
|||
p[52]=pnom[52]; |
|||
p[54]=pnom[54]; |
|||
p[55]=pnom[55]; |
|||
p[56]=pnom[56]; |
|||
p[57]=pnom[57]; |
|||
p[58]=pnom[58]; |
|||
p[59]=pnom[59]; |
|||
p[60]=pnom[60]; |
|||
p[61]=pnom[61]; |
|||
p[62]=pnom[62]; |
|||
p[63]=pnom[63]; |
|||
p[64]=pnom[64]; |
|||
p[65]=pnom[65]; |
|||
p[66]=pnom[66]; |
|||
p[67]=pnom[67]; |
|||
p[68]=pnom[68]; |
|||
p[69]=pnom[69]; |
|||
p[70]=pnom[70]; |
|||
p[71]=pnom[71]; |
|||
p[72]=pnom[72]; |
|||
p[73]=pnom[73]; |
|||
p[74]=pnom[74]; |
|||
p[75]=pnom[75]; |
|||
p[76]=pnom[76]; |
|||
p[77]=pnom[77]; |
|||
p[78]=pnom[78]; |
|||
p[79]=pnom[79]; |
|||
p[80]=pnom[80]; |
|||
p[81]=pnom[81]; |
|||
p[82]=pnom[82]; |
|||
p[83]=pnom[83]; |
|||
p[84]=pnom[84]; |
|||
p[85]=pnom[85]; |
|||
p[86]=pnom[86]; |
|||
p[87]=pnom[87]; |
|||
p[88]=pnom[88]; |
|||
p[89]=pnom[89]; |
|||
p[90]=pnom[90]; |
|||
p[91]=pnom[91]; |
|||
p[92]=pnom[92]; |
|||
p[93]=pnom[93]; |
|||
p[95]=pnom[95]; |
|||
p[96]=pnom[96]; |
|||
p[97]=pnom[97]; |
|||
p[100]=pnom[100]; |
|||
p[101]=pnom[101]; |
|||
p[102]=pnom[102]; |
|||
p[103]=pnom[103]; |
|||
p[105]=pnom[105]; |
|||
p[106]=pnom[106]; |
|||
p[107]=pnom[107]; |
|||
|
|||
/* Temperature mappings for model parameters */ |
|||
|
|||
Tini=2.731500e+02+pnom[0]; |
|||
Tdev=(2.731500e+02+(*TAMB))+pnom[105]; |
|||
Vtv=1.380662e-23*Tdev/1.602189e-19; |
|||
rT=Tdev/Tini; |
|||
dT=Tdev-Tini; |
|||
xvar1=pow(rT,pnom[90]); |
|||
p[53]=pnom[53]*xvar1; |
|||
xvar1=pow(rT,pnom[91]); |
|||
p[1]=pnom[1]*xvar1; |
|||
xvar1=pow(rT,pnom[68]); |
|||
p[2]=pnom[2]*xvar1; |
|||
xvar1=pow(rT,pnom[92]); |
|||
p[6]=pnom[6]*xvar1; |
|||
xvar1=pow(rT,pnom[67]); |
|||
p[7]=pnom[7]*xvar1; |
|||
xvar1=pow(rT,pnom[66]); |
|||
p[8]=pnom[8]*xvar1; |
|||
xvar1=pow(rT,pnom[69]); |
|||
p[9]=pnom[9]*xvar1; |
|||
xvar1=pow(rT,pnom[93]); |
|||
p[10]=pnom[10]*xvar1; |
|||
xvar2=pow(rT,pnom[78]); |
|||
xvar3=-pnom[71]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[12]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[11]=pnom[11]*xvar6; |
|||
xvar2=pow(rT,pnom[95]); |
|||
xvar3=-pnom[96]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[13]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[94]=pnom[94]*xvar6; |
|||
xvar2=pow(rT,pnom[78]); |
|||
xvar3=-pnom[97]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[44]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[42]=pnom[42]*xvar6; |
|||
xvar2=pow(rT,pnom[79]); |
|||
xvar3=-pnom[72]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[33]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[31]=pnom[31]*xvar6; |
|||
xvar2=pow(rT,pnom[80]); |
|||
xvar3=-pnom[75]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[35]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[34]=pnom[34]*xvar6; |
|||
xvar2=pow(rT,pnom[79]); |
|||
xvar3=-pnom[73]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[37]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[36]=pnom[36]*xvar6; |
|||
xvar2=pow(rT,pnom[80]); |
|||
xvar3=-pnom[76]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[39]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[38]=pnom[38]*xvar6; |
|||
xvar2=pow(rT,pnom[79]); |
|||
xvar3=-pnom[73]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[37]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[45]=pnom[45]*xvar6; |
|||
xvar2=pow(rT,pnom[80]); |
|||
xvar3=-pnom[76]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[39]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[46]=pnom[46]*xvar6; |
|||
xvar2=pow(rT,pnom[79]); |
|||
xvar3=-pnom[74]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[48]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[47]=pnom[47]*xvar6; |
|||
xvar2=pow(rT,pnom[80]); |
|||
xvar3=-pnom[77]*(1.0-rT)/Vtv; |
|||
xvar4=exp(xvar3); |
|||
xvar1=(xvar2*xvar4); |
|||
xvar5=(1.0/pnom[50]); |
|||
xvar6=pow(xvar1,xvar5); |
|||
p[49]=pnom[49]*xvar6; |
|||
p[12]=pnom[12]*(1.0+dT*pnom[81]); |
|||
p[13]=pnom[13]*(1.0+dT*pnom[81]); |
|||
p[41]=pnom[41]*(1.0+dT*pnom[82]); |
|||
p[98]=pnom[98]*(1.0+dT*(pnom[101]+dT*pnom[102])); |
|||
p[99]=pnom[99]*(1.0+dT*pnom[103]); |
|||
xvar2=0.5*pnom[17]*rT/Vtv; |
|||
xvar3=exp(xvar2); |
|||
xvar4=-0.5*pnom[17]*rT/Vtv; |
|||
xvar5=exp(xvar4); |
|||
xvar1=xvar3-xvar5; |
|||
xvar6=log(xvar1); |
|||
psiio=2.0*(Vtv/rT)*xvar6; |
|||
xvar1=log(rT); |
|||
psiin=psiio*rT-3.0*Vtv*xvar1-pnom[72]*(rT-1.0); |
|||
xvar2=-psiin/Vtv; |
|||
xvar3=exp(xvar2); |
|||
xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); |
|||
xvar4=log(xvar1); |
|||
p[17]=psiin+2.0*Vtv*xvar4; |
|||
xvar2=0.5*pnom[24]*rT/Vtv; |
|||
xvar3=exp(xvar2); |
|||
xvar4=-0.5*pnom[24]*rT/Vtv; |
|||
xvar5=exp(xvar4); |
|||
xvar1=xvar3-xvar5; |
|||
xvar6=log(xvar1); |
|||
psiio=2.0*(Vtv/rT)*xvar6; |
|||
xvar1=log(rT); |
|||
psiin=psiio*rT-3.0*Vtv*xvar1-pnom[73]*(rT-1.0); |
|||
xvar2=-psiin/Vtv; |
|||
xvar3=exp(xvar2); |
|||
xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); |
|||
xvar4=log(xvar1); |
|||
p[24]=psiin+2.0*Vtv*xvar4; |
|||
xvar2=0.5*pnom[28]*rT/Vtv; |
|||
xvar3=exp(xvar2); |
|||
xvar4=-0.5*pnom[28]*rT/Vtv; |
|||
xvar5=exp(xvar4); |
|||
xvar1=xvar3-xvar5; |
|||
xvar6=log(xvar1); |
|||
psiio=2.0*(Vtv/rT)*xvar6; |
|||
xvar1=log(rT); |
|||
psiin=psiio*rT-3.0*Vtv*xvar1-pnom[74]*(rT-1.0); |
|||
xvar2=-psiin/Vtv; |
|||
xvar3=exp(xvar2); |
|||
xvar1=0.5*(1.0+sqrt(1.0+4.0*xvar3)); |
|||
xvar4=log(xvar1); |
|||
p[28]=psiin+2.0*Vtv*xvar4; |
|||
xvar1=pnom[17]/p[17]; |
|||
xvar2=pow(xvar1,pnom[18]); |
|||
p[16]=pnom[16]*xvar2; |
|||
xvar1=pnom[24]/p[24]; |
|||
xvar2=pow(xvar1,pnom[25]); |
|||
p[21]=pnom[21]*xvar2; |
|||
xvar1=pnom[24]/p[24]; |
|||
xvar2=pow(xvar1,pnom[25]); |
|||
p[23]=pnom[23]*xvar2; |
|||
xvar1=pnom[28]/p[28]; |
|||
xvar2=pow(xvar1,pnom[29]); |
|||
p[27]=pnom[27]*xvar2; |
|||
xvar1=pow(rT,pnom[78]); |
|||
xvar2=-pnom[71]*(1.0-rT)/Vtv; |
|||
xvar3=exp(xvar2); |
|||
p[4]=pnom[4]*xvar1*xvar3; |
|||
xvar1=pow(rT,pnom[70]); |
|||
p[3]=pnom[3]*xvar1; |
|||
xvar1=-p[98]/(p[99]*Vtv); |
|||
p[104]=exp(xvar1); |
|||
p[0]=(*TAMB)+p[105]; |
|||
return(0); |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1985 Thomas L. Quarles |
|||
Model Author: 1995 Colin McAndrew Motorola |
|||
Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine performs truncation error calculations for |
|||
* VBICs in the circuit. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "vbicdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
VBICtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) |
|||
{ |
|||
VBICmodel *model = (VBICmodel*)inModel; |
|||
VBICinstance *here; |
|||
|
|||
for( ; model != NULL; model = model->VBICnextModel) { |
|||
for(here=model->VBICinstances;here!=NULL; |
|||
here = here->VBICnextInstance){ |
|||
if (here->VBICowner != ARCHme) continue; |
|||
|
|||
CKTterr(here->VBICqbe,ckt,timeStep); |
|||
CKTterr(here->VBICqbex,ckt,timeStep); |
|||
CKTterr(here->VBICqbc,ckt,timeStep); |
|||
CKTterr(here->VBICqbcx,ckt,timeStep); |
|||
CKTterr(here->VBICqbep,ckt,timeStep); |
|||
CKTterr(here->VBICqbeo,ckt,timeStep); |
|||
CKTterr(here->VBICqbco,ckt,timeStep); |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
VBIC Pole Zero Test |
|||
|
|||
Vcc 3 0 5 |
|||
Rc 2 3 1k |
|||
Rb 3 1 200k |
|||
I1 0 1 AC 1 |
|||
Vmeas 4 2 |
|||
Cshunt 4 0 .1u |
|||
|
|||
Q1 2 1 0 0 N1 |
|||
|
|||
.control |
|||
ac dec 100 0.1Meg 10G |
|||
plot db(i(vmeas)) |
|||
plot ph(i(vmeas)) |
|||
pz 1 0 4 0 cur pz |
|||
print all |
|||
.endc |
|||
|
|||
.MODEL N1 NPN LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.END |
|||
@ -0,0 +1,21 @@ |
|||
VBIC Gummel Test |
|||
V1 Q1_E 0 5.0 |
|||
VC Q1_C 0 0.0 |
|||
VB Q1_B 0 0.0 |
|||
Q1 Q1_C Q1_B Q1_E P1 |
|||
.DC V1 0.2 1.2 10m |
|||
.OPTIONS GMIN=1e-13 |
|||
|
|||
.control |
|||
run |
|||
plot abs(i(vc)) abs(i(vb)) ylimit 1e-15 0.1 ylog |
|||
plot abs(i(vc))/abs(i(vb)) vs abs(-i(vc)) xlimit 1e-09 0.1 xlog |
|||
.endc |
|||
|
|||
.MODEL P1 PNP LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.END |
|||
@ -0,0 +1,20 @@ |
|||
VBIC Output Test |
|||
V1 V1_P V1_N 0.0 |
|||
VB V1_N 0 0.5 |
|||
VC Q1_C 0 0.0 |
|||
Q1 Q1_C V1_P 0 N1 |
|||
.DC VC 0 5 50M VB 700M 1 50M |
|||
|
|||
.control |
|||
run |
|||
plot -i(vc) |
|||
plot -i(vb) |
|||
.endc |
|||
|
|||
.MODEL N1 NPN LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.END |
|||
@ -0,0 +1,45 @@ |
|||
VBIC DiffAmp Test |
|||
Q8 Q8_B Q8_B VCC P1 |
|||
Q9 Q9_B Q9_B Q8_B P1 |
|||
V1 VCC 0 3.3 |
|||
V2 V2_P R3_N AC 1 DC 0 Sine(0 10m 10Meg 0 0) |
|||
I1 VCC I1_N 10u |
|||
Q12 Q9_B I1_N 0 N1 M=2 |
|||
Q13 Q5_B I1_N 0 N1 M=2 |
|||
Q10 Q1_E I1_N 0 N1 |
|||
Q11 I1_N I1_N 0 N1 |
|||
E1 E1_P 0 Q3_C Q4_C 1 |
|||
rl e1_p 0 1e6 |
|||
Q2 Q6_C R3_N Q1_E N1 |
|||
R4 R3_N 0 1K |
|||
Q3 Q3_C Q9_B Q5_C P1 |
|||
Q1 Q5_C V2_P Q1_E N1 |
|||
Q6 Q6_C Q5_B VCC P1 |
|||
R1 Q3_C 0 100k |
|||
Q7 Q5_B Q5_B VCC P1 |
|||
Q4 Q4_C Q9_B Q6_C P1 |
|||
R2 Q4_C 0 100k |
|||
R3 VCC R3_N 1K |
|||
Q5 Q5_C Q5_B VCC P1 |
|||
*.OP |
|||
.TRAN 1n 1u 0 10n |
|||
*.AC DEC 25 100k 1G |
|||
|
|||
.control |
|||
run |
|||
plot v(e1_p) |
|||
.endc |
|||
|
|||
.MODEL N1 NPN LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.MODEL P1 PNP LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.END |
|||
@ -0,0 +1,19 @@ |
|||
VBIC diode test |
|||
Q1 0 0 VCC P1 |
|||
V1 VCC 0 1.0 |
|||
|
|||
.OP |
|||
|
|||
.MODEL N1 NPN LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.MODEL P1 PNP LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.END |
|||
@ -0,0 +1,25 @@ |
|||
VBIC Noise Scale Test |
|||
V1 R3_P 0 5 |
|||
V2 V2_P 0 5 AC 1 |
|||
C1 R3_N V2_P 1n |
|||
R4 R3_N 0 100k |
|||
Q1 VOUT R3_N Q1_E N1 M=2 |
|||
*Q2 VOUT R3_N Q1_E N1 |
|||
R1 R3_P VOUT 100k |
|||
R2 Q1_E 0 10k |
|||
R3 R3_P R3_N 500k |
|||
.NOISE v(vout) V2 DEC 25 1k 100Meg |
|||
|
|||
.control |
|||
run |
|||
plot sqrt(onoise_spectrum) loglog |
|||
.endc |
|||
|
|||
.MODEL N1 NPN LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 |
|||
+ RTH=300 KFN=10e-15 AFN=1 BFN=1 |
|||
|
|||
.END |
|||
@ -0,0 +1,20 @@ |
|||
VBIC Temp test |
|||
V1 1 0 1.0 |
|||
VC 1 Q1_C 0.0 |
|||
VB 1 Q1_B 0.0 |
|||
Q1 Q1_C Q1_B 0 N1 |
|||
.OPTIONS TEMP=150 |
|||
.DC V1 0.2 1.2 10m |
|||
|
|||
.control |
|||
run |
|||
plot i(vc) i(vb) |
|||
.endc |
|||
|
|||
.MODEL N1 NPN LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.END |
|||
@ -0,0 +1,23 @@ |
|||
VBIC Aplac Transient Test |
|||
V1 R3_P 0 5 |
|||
V2 V2_P 0 5 Pulse(0 100m 0 10n 10n 490.1n 1u) |
|||
C1 R3_N V2_P 1n |
|||
R4 R3_N 0 100k |
|||
Q1 R1_N R3_N Q1_E N1 |
|||
R1 R3_P R1_N 100k |
|||
R2 Q1_E 0 10k |
|||
R3 R3_P R3_N 500k |
|||
|
|||
.control |
|||
tran 10n 10u |
|||
run |
|||
plot v(Q1_E) |
|||
.endc |
|||
|
|||
.MODEL N1 NPN LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.END |
|||
@ -0,0 +1,46 @@ |
|||
VBIC Test |
|||
VC 1 0 DC 2.0 |
|||
VB 2 0 DC 0.7 |
|||
VE 3 0 DC 0.0 |
|||
*VS 4 0 DC 0.0 |
|||
Q1 1 2 3 VBIC_HSPICE |
|||
.OPTIONS GMIN=1e-13 |
|||
*.OP |
|||
.DC VB 0.2 1.0 0.01 |
|||
|
|||
.control |
|||
run |
|||
plot abs(-i(vc)) abs(-i(vb)) ylimit 1e-12 0.1 ylog |
|||
plot abs(-i(vc))/abs(-i(vb)) vs abs(-i(vc)) xlimit 1e-09 0.1 xlog |
|||
.endc |
|||
|
|||
.MODEL VBIC NPN LEVEL=4 |
|||
+ RCX=10 RCI=10 RBX=1 RBI=10 RE=1 RBP=10 RS=10 |
|||
+ IBEN=1.0E-13 |
|||
+ RTH=100 |
|||
|
|||
.MODEL VBIC_HSPICE NPN LEVEL=4 |
|||
+ AFN=1 AJC=-0.5 AJE=0.5 AJS=0.5 |
|||
+ AVC1=0 AVC2=0 BFN=1 CBCO=0 CBEO=0 CJC=2E-14 |
|||
+ CJCP=4E-13 CJE=1E-13 CJEP=1E-13 CTH=0 |
|||
+ EA=1.12 EAIC=1.12 EAIE=1.12 EAIS=1.12 EANC=1.12 |
|||
+ EANE=1.12 EANS=1.12 FC=0.9 GAMM=2E-11 HRCF=2 |
|||
+ IBCI=2E-17 IBCIP=0 IBCN=5E-15 IBCNP=0 |
|||
+ IBEI=1E-18 IBEIP=0 IBEN=5E-15 IBENP=0 |
|||
+ IKF=2E-3 IKP=2E-4 IKR=2E-4 IS=1E-16 ISP=1E-15 ITF=8E-2 |
|||
+ KFN=0 MC=0.33 ME=0.33 MS=0.33 |
|||
+ NCI=1 NCIP=1 NCN=2 NCNP=2 NEI=1 NEN=2 |
|||
+ NF=1 NFP=1 NR=1 PC=0.75 PE=0.75 PS=0.75 QCO=1E-12 QTF=0 |
|||
+ RBI=4 RBP=4 RBX=1 RCI=6 RCX=1 RE=0.2 RS=2 |
|||
+ RTH=300 TAVC=0 TD=2E-11 TF=10E-12 TNF=0 TR=100E-12 |
|||
+ TNOM=25 VEF=10 VER=4 VO=2 |
|||
+ VTF=0 WBE=1 WSP=1 |
|||
+ XII=3 XIN=3 XIS=3 XRBI=1 XRCI=1 XRE=1 XRS=1 XTF=20 XVO=0 |
|||
|
|||
.MODEL VBIC_APLAC NPN LEVEL=4 |
|||
+ IS=1e-16 IBEI=1e-18 IBEN=5e-15 IBCI=2e-17 IBCN=5e-15 ISP=1e-15 RCX=10 |
|||
+ RCI=60 RBX=10 RBI=40 RE=2 RS=20 RBP=40 VEF=10 VER=4 IKF=2e-3 ITF=8e-2 |
|||
+ XTF=20 IKR=2e-4 IKP=2e-4 CJE=1e-13 CJC=2e-14 CJEP=1e-13 CJCP=4e-13 VO=2 |
|||
+ GAMM=2e-11 HRCF=2 QCO=1e-12 AVC1=2 AVC2=15 TF=10e-12 TR=100e-12 TD=2e-11 RTH=300 |
|||
|
|||
.END |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue