41 changed files with 7479 additions and 46 deletions
-
19DEVICES
-
4contrib/vbic/README
-
322contrib/vbic/sgp2vbic
-
311contrib/vbic/vbic2sgp
-
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