19 changed files with 1295 additions and 1296 deletions
-
21ChangeLog
-
644contrib/vbic/sgp2vbic
-
622contrib/vbic/vbic2sgp
-
30src/spicelib/devices/mos9/mos9temp.c
-
78src/xspice/examples/d_to_real/Makefile
-
82src/xspice/examples/d_to_real/cfunc.mod
-
64src/xspice/examples/d_to_real/ifspec.ifs
-
78src/xspice/examples/nco/Makefile
-
76src/xspice/examples/nco/ifspec.ifs
-
78src/xspice/examples/print_param_types/Makefile
-
62src/xspice/examples/print_param_types/cfunc.mod
-
224src/xspice/examples/print_param_types/ifspec.ifs
-
78src/xspice/examples/real_delay/Makefile
-
66src/xspice/examples/real_delay/ifspec.ifs
-
78src/xspice/examples/real_gain/Makefile
-
76src/xspice/examples/real_gain/cfunc.mod
-
90src/xspice/examples/real_gain/ifspec.ifs
-
78src/xspice/examples/real_to_v/Makefile
-
66src/xspice/examples/real_to_v/ifspec.ifs
@ -1,322 +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"}; |
|
||||
|
#!/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"}; |
||||
@ -1,311 +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"}; |
|
||||
|
#!/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"}; |
||||
@ -1,40 +1,38 @@ |
|||||
# $Id$
|
|
||||
#
|
|
||||
# Makefile for Code Model directories
|
|
||||
#
|
|
||||
|
|
||||
# Include global XSPICE selections for CC and other macros
|
|
||||
include /usr/local/xspice-1-0/include/make.include |
|
||||
|
|
||||
INCLUDE = -I. -I$(ROOT)/include/sim |
|
||||
|
|
||||
CFLAGS = -g |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# Edit the following definition to specify the object files that comprise
|
|
||||
# your code model. If your code model is completely specified in the
|
|
||||
# cfunc.mod file, there is no need to edit this definition.
|
|
||||
# DO NOT include the ifspec.o file.
|
|
||||
|
|
||||
CODE_MODEL_OBJECTS = cfunc.o |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
|
||||
|
|
||||
.SUFFIXES: $(SUFFIXES) .mod .ifs |
|
||||
|
|
||||
.mod.c: |
|
||||
$(BINDIR)/cmpp -mod $< |
|
||||
|
|
||||
.ifs.c: |
|
||||
$(BINDIR)/cmpp -ifs |
|
||||
|
|
||||
.c.o: $*.c |
|
||||
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
|
||||
|
|
||||
all : ifspec.o $(CODE_MODEL_OBJECTS) |
|
||||
|
|
||||
cfunc.o : cfunc.c |
|
||||
ifspec.o : ifspec.c |
|
||||
|
|
||||
|
|
||||
|
# $Id$
|
||||
|
#
|
||||
|
# Makefile for Code Model directories
|
||||
|
#
|
||||
|
|
||||
|
# Include global XSPICE selections for CC and other macros
|
||||
|
include /usr/local/xspice-1-0/include/make.include |
||||
|
|
||||
|
INCLUDE = -I. -I$(ROOT)/include/sim |
||||
|
|
||||
|
CFLAGS = -g |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# Edit the following definition to specify the object files that comprise
|
||||
|
# your code model. If your code model is completely specified in the
|
||||
|
# cfunc.mod file, there is no need to edit this definition.
|
||||
|
# DO NOT include the ifspec.o file.
|
||||
|
|
||||
|
CODE_MODEL_OBJECTS = cfunc.o |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
||||
|
|
||||
|
.SUFFIXES: $(SUFFIXES) .mod .ifs |
||||
|
|
||||
|
.mod.c: |
||||
|
$(BINDIR)/cmpp -mod $< |
||||
|
|
||||
|
.ifs.c: |
||||
|
$(BINDIR)/cmpp -ifs |
||||
|
|
||||
|
.c.o: $*.c |
||||
|
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
||||
|
|
||||
|
all : ifspec.o $(CODE_MODEL_OBJECTS) |
||||
|
|
||||
|
cfunc.o : cfunc.c |
||||
|
ifspec.o : ifspec.c |
||||
@ -1,43 +1,39 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
void ucm_d_to_real (ARGS) |
|
||||
{ |
|
||||
|
|
||||
Digital_State_t in; |
|
||||
|
|
||||
double *out; |
|
||||
double delay; |
|
||||
double zero; |
|
||||
double one; |
|
||||
double ena; |
|
||||
|
|
||||
|
|
||||
in = INPUT_STATE(in); |
|
||||
if(PORT_NULL(enable)) |
|
||||
ena = 1.0; |
|
||||
else if(INPUT_STATE(enable) == ONE) |
|
||||
ena = 1.0; |
|
||||
else |
|
||||
ena = 0.0; |
|
||||
out = OUTPUT(out); |
|
||||
|
|
||||
zero = PARAM(zero); |
|
||||
one = PARAM(one); |
|
||||
delay = PARAM(delay); |
|
||||
|
|
||||
|
|
||||
if(in == ZERO) |
|
||||
*out = zero * ena; |
|
||||
else if(in == UNKNOWN) |
|
||||
*out = (zero + one) / 2.0 * ena; |
|
||||
else |
|
||||
*out = one * ena; |
|
||||
|
|
||||
if(TIME > 0.0) |
|
||||
OUTPUT_DELAY(out) = delay; |
|
||||
|
|
||||
} |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
void ucm_d_to_real (ARGS) |
||||
|
{ |
||||
|
|
||||
|
Digital_State_t in; |
||||
|
|
||||
|
double *out; |
||||
|
double delay; |
||||
|
double zero; |
||||
|
double one; |
||||
|
double ena; |
||||
|
|
||||
|
|
||||
|
in = INPUT_STATE(in); |
||||
|
if(PORT_NULL(enable)) |
||||
|
ena = 1.0; |
||||
|
else if(INPUT_STATE(enable) == ONE) |
||||
|
ena = 1.0; |
||||
|
else |
||||
|
ena = 0.0; |
||||
|
out = OUTPUT(out); |
||||
|
|
||||
|
zero = PARAM(zero); |
||||
|
one = PARAM(one); |
||||
|
delay = PARAM(delay); |
||||
|
|
||||
|
|
||||
|
if(in == ZERO) |
||||
|
*out = zero * ena; |
||||
|
else if(in == UNKNOWN) |
||||
|
*out = (zero + one) / 2.0 * ena; |
||||
|
else |
||||
|
*out = one * ena; |
||||
|
|
||||
|
if(TIME > 0.0) |
||||
|
OUTPUT_DELAY(out) = delay; |
||||
|
|
||||
|
} |
||||
@ -1,32 +1,32 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
NAME_TABLE: |
|
||||
|
|
||||
Spice_Model_Name: d_to_real |
|
||||
C_Function_Name: ucm_d_to_real |
|
||||
Description: "Node bridge from digital to real with enable" |
|
||||
|
|
||||
|
|
||||
PORT_TABLE: |
|
||||
|
|
||||
Port_Name: in enable out |
|
||||
Description: "input" "enable" "output" |
|
||||
Direction: in in out |
|
||||
Default_Type: d d real |
|
||||
Allowed_Types: [d] [d] [real] |
|
||||
Vector: no no no |
|
||||
Vector_Bounds: - - - |
|
||||
Null_Allowed: no yes no |
|
||||
|
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: zero one delay |
|
||||
Description: "value for 0" "value for 1" "delay" |
|
||||
Data_Type: real real real |
|
||||
Default_Value: 0.0 1.0 1e-9 |
|
||||
Limits: - - [1e-15 -] |
|
||||
Vector: no no no |
|
||||
Vector_Bounds: - - - |
|
||||
Null_Allowed: yes yes yes |
|
||||
|
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
NAME_TABLE: |
||||
|
|
||||
|
Spice_Model_Name: d_to_real |
||||
|
C_Function_Name: ucm_d_to_real |
||||
|
Description: "Node bridge from digital to real with enable" |
||||
|
|
||||
|
|
||||
|
PORT_TABLE: |
||||
|
|
||||
|
Port_Name: in enable out |
||||
|
Description: "input" "enable" "output" |
||||
|
Direction: in in out |
||||
|
Default_Type: d d real |
||||
|
Allowed_Types: [d] [d] [real] |
||||
|
Vector: no no no |
||||
|
Vector_Bounds: - - - |
||||
|
Null_Allowed: no yes no |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: zero one delay |
||||
|
Description: "value for 0" "value for 1" "delay" |
||||
|
Data_Type: real real real |
||||
|
Default_Value: 0.0 1.0 1e-9 |
||||
|
Limits: - - [1e-15 -] |
||||
|
Vector: no no no |
||||
|
Vector_Bounds: - - - |
||||
|
Null_Allowed: yes yes yes |
||||
|
|
||||
@ -1,40 +1,38 @@ |
|||||
# $Id$
|
|
||||
#
|
|
||||
# Makefile for Code Model directories
|
|
||||
#
|
|
||||
|
|
||||
# Include global XSPICE selections for CC and other macros
|
|
||||
include /usr/local/xspice-1-0/include/make.include |
|
||||
|
|
||||
INCLUDE = -I. -I$(ROOT)/include/sim |
|
||||
|
|
||||
CFLAGS = -g |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# Edit the following definition to specify the object files that comprise
|
|
||||
# your code model. If your code model is completely specified in the
|
|
||||
# cfunc.mod file, there is no need to edit this definition.
|
|
||||
# DO NOT include the ifspec.o file.
|
|
||||
|
|
||||
CODE_MODEL_OBJECTS = cfunc.o |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
|
||||
|
|
||||
.SUFFIXES: $(SUFFIXES) .mod .ifs |
|
||||
|
|
||||
.mod.c: |
|
||||
$(BINDIR)/cmpp -mod $< |
|
||||
|
|
||||
.ifs.c: |
|
||||
$(BINDIR)/cmpp -ifs |
|
||||
|
|
||||
.c.o: $*.c |
|
||||
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
|
||||
|
|
||||
all : ifspec.o $(CODE_MODEL_OBJECTS) |
|
||||
|
|
||||
cfunc.o : cfunc.c |
|
||||
ifspec.o : ifspec.c |
|
||||
|
|
||||
|
|
||||
|
# $Id$
|
||||
|
#
|
||||
|
# Makefile for Code Model directories
|
||||
|
#
|
||||
|
|
||||
|
# Include global XSPICE selections for CC and other macros
|
||||
|
include /usr/local/xspice-1-0/include/make.include |
||||
|
|
||||
|
INCLUDE = -I. -I$(ROOT)/include/sim |
||||
|
|
||||
|
CFLAGS = -g |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# Edit the following definition to specify the object files that comprise
|
||||
|
# your code model. If your code model is completely specified in the
|
||||
|
# cfunc.mod file, there is no need to edit this definition.
|
||||
|
# DO NOT include the ifspec.o file.
|
||||
|
|
||||
|
CODE_MODEL_OBJECTS = cfunc.o |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
||||
|
|
||||
|
.SUFFIXES: $(SUFFIXES) .mod .ifs |
||||
|
|
||||
|
.mod.c: |
||||
|
$(BINDIR)/cmpp -mod $< |
||||
|
|
||||
|
.ifs.c: |
||||
|
$(BINDIR)/cmpp -ifs |
||||
|
|
||||
|
.c.o: $*.c |
||||
|
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
||||
|
|
||||
|
all : ifspec.o $(CODE_MODEL_OBJECTS) |
||||
|
|
||||
|
cfunc.o : cfunc.c |
||||
|
ifspec.o : ifspec.c |
||||
@ -1,38 +1,38 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
NAME_TABLE: |
|
||||
|
|
||||
Spice_Model_Name: nco |
|
||||
C_Function_Name: ucm_nco |
|
||||
Description: "A simple MIDI numerically controlled oscillator" |
|
||||
|
|
||||
|
|
||||
PORT_TABLE: |
|
||||
|
|
||||
Port_Name: in out |
|
||||
Description: "program input" "oscillator output" |
|
||||
Direction: in out |
|
||||
Default_Type: d d |
|
||||
Allowed_Types: [d] [d] |
|
||||
Vector: yes no |
|
||||
Vector_Bounds: [7 7] - |
|
||||
Null_Allowed: no no |
|
||||
|
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: delay mult_factor |
|
||||
Description: "output delay" "freq multiplier" |
|
||||
Data_Type: real real |
|
||||
Default_Value: 1e-9 1 |
|
||||
Limits: [1e-15 -] [1e-9 -] |
|
||||
Vector: no no |
|
||||
Vector_Bounds: - - |
|
||||
Null_Allowed: yes yes |
|
||||
|
|
||||
|
|
||||
STATIC_VAR_TABLE: |
|
||||
|
|
||||
Static_Var_Name: freq |
|
||||
Data_Type: pointer |
|
||||
Description: "frequencies of notes" |
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
NAME_TABLE: |
||||
|
|
||||
|
Spice_Model_Name: nco |
||||
|
C_Function_Name: ucm_nco |
||||
|
Description: "A simple MIDI numerically controlled oscillator" |
||||
|
|
||||
|
|
||||
|
PORT_TABLE: |
||||
|
|
||||
|
Port_Name: in out |
||||
|
Description: "program input" "oscillator output" |
||||
|
Direction: in out |
||||
|
Default_Type: d d |
||||
|
Allowed_Types: [d] [d] |
||||
|
Vector: yes no |
||||
|
Vector_Bounds: [7 7] - |
||||
|
Null_Allowed: no no |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: delay mult_factor |
||||
|
Description: "output delay" "freq multiplier" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 1e-9 1 |
||||
|
Limits: [1e-15 -] [1e-9 -] |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
STATIC_VAR_TABLE: |
||||
|
|
||||
|
Static_Var_Name: freq |
||||
|
Data_Type: pointer |
||||
|
Description: "frequencies of notes" |
||||
@ -1,40 +1,38 @@ |
|||||
# $Id$
|
|
||||
#
|
|
||||
# Makefile for Code Model directories
|
|
||||
#
|
|
||||
|
|
||||
# Include global XSPICE selections for CC and other macros
|
|
||||
include /usr/local/xspice-1-0/include/make.include |
|
||||
|
|
||||
INCLUDE = -I. -I$(ROOT)/include/sim |
|
||||
|
|
||||
CFLAGS = -g |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# Edit the following definition to specify the object files that comprise
|
|
||||
# your code model. If your code model is completely specified in the
|
|
||||
# cfunc.mod file, there is no need to edit this definition.
|
|
||||
# DO NOT include the ifspec.o file.
|
|
||||
|
|
||||
CODE_MODEL_OBJECTS = cfunc.o |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
|
||||
|
|
||||
.SUFFIXES: $(SUFFIXES) .mod .ifs |
|
||||
|
|
||||
.mod.c: |
|
||||
$(BINDIR)/cmpp -mod $< |
|
||||
|
|
||||
.ifs.c: |
|
||||
$(BINDIR)/cmpp -ifs |
|
||||
|
|
||||
.c.o: $*.c |
|
||||
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
|
||||
|
|
||||
all : ifspec.o $(CODE_MODEL_OBJECTS) |
|
||||
|
|
||||
cfunc.o : cfunc.c |
|
||||
ifspec.o : ifspec.c |
|
||||
|
|
||||
|
|
||||
|
# $Id$
|
||||
|
#
|
||||
|
# Makefile for Code Model directories
|
||||
|
#
|
||||
|
|
||||
|
# Include global XSPICE selections for CC and other macros
|
||||
|
include /usr/local/xspice-1-0/include/make.include |
||||
|
|
||||
|
INCLUDE = -I. -I$(ROOT)/include/sim |
||||
|
|
||||
|
CFLAGS = -g |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# Edit the following definition to specify the object files that comprise
|
||||
|
# your code model. If your code model is completely specified in the
|
||||
|
# cfunc.mod file, there is no need to edit this definition.
|
||||
|
# DO NOT include the ifspec.o file.
|
||||
|
|
||||
|
CODE_MODEL_OBJECTS = cfunc.o |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
||||
|
|
||||
|
.SUFFIXES: $(SUFFIXES) .mod .ifs |
||||
|
|
||||
|
.mod.c: |
||||
|
$(BINDIR)/cmpp -mod $< |
||||
|
|
||||
|
.ifs.c: |
||||
|
$(BINDIR)/cmpp -ifs |
||||
|
|
||||
|
.c.o: $*.c |
||||
|
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
||||
|
|
||||
|
all : ifspec.o $(CODE_MODEL_OBJECTS) |
||||
|
|
||||
|
cfunc.o : cfunc.c |
||||
|
ifspec.o : ifspec.c |
||||
@ -1,33 +1,29 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
void ucm_print_param_types (ARGS) |
|
||||
{ |
|
||||
int i; |
|
||||
|
|
||||
if(INIT) { |
|
||||
/* Print scalar parameters */ |
|
||||
printf("\nScalar parameters\n\n"); |
|
||||
printf("integer = %d\n", PARAM(integer)); |
|
||||
printf("real = %e\n", PARAM(real)); |
|
||||
printf("complex = <%e %e>\n", PARAM(complex).real, |
|
||||
PARAM(complex).imag); |
|
||||
printf("string = %s\n", PARAM(string)); |
|
||||
|
|
||||
/* Print vector parameters */ |
|
||||
printf("\nVector parameters\n\n"); |
|
||||
for(i = 0; i < PARAM_SIZE(integer_array); i++) |
|
||||
printf("integer = %d\n", PARAM(integer_array[i])); |
|
||||
for(i = 0; i < PARAM_SIZE(real_array); i++) |
|
||||
printf("real = %e\n", PARAM(real_array[i])); |
|
||||
for(i = 0; i < PARAM_SIZE(complex_array); i++) |
|
||||
printf("complex = <%e %e>\n", PARAM(complex_array[i]).real, |
|
||||
PARAM(complex_array[i]).imag); |
|
||||
for(i = 0; i < PARAM_SIZE(string_array); i++) |
|
||||
printf("string = %s\n", PARAM(string_array[i])); |
|
||||
|
|
||||
} |
|
||||
} |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
void ucm_print_param_types (ARGS) |
||||
|
{ |
||||
|
int i; |
||||
|
|
||||
|
if(INIT) { |
||||
|
/* Print scalar parameters */ |
||||
|
printf("\nScalar parameters\n\n"); |
||||
|
printf("integer = %d\n", PARAM(integer)); |
||||
|
printf("real = %e\n", PARAM(real)); |
||||
|
printf("complex = <%e %e>\n", PARAM(complex).real, |
||||
|
PARAM(complex).imag); |
||||
|
printf("string = %s\n", PARAM(string)); |
||||
|
|
||||
|
/* Print vector parameters */ |
||||
|
printf("\nVector parameters\n\n"); |
||||
|
for(i = 0; i < PARAM_SIZE(integer_array); i++) |
||||
|
printf("integer = %d\n", PARAM(integer_array[i])); |
||||
|
for(i = 0; i < PARAM_SIZE(real_array); i++) |
||||
|
printf("real = %e\n", PARAM(real_array[i])); |
||||
|
for(i = 0; i < PARAM_SIZE(complex_array); i++) |
||||
|
printf("complex = <%e %e>\n", PARAM(complex_array[i]).real, |
||||
|
PARAM(complex_array[i]).imag); |
||||
|
for(i = 0; i < PARAM_SIZE(string_array); i++) |
||||
|
printf("string = %s\n", PARAM(string_array[i])); |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -1,112 +1,112 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
NAME_TABLE: |
|
||||
|
|
||||
Spice_Model_Name: print_param_types |
|
||||
C_Function_Name: ucm_print_param_types |
|
||||
Description: "ignores its input, but prints its parameters" |
|
||||
|
|
||||
|
|
||||
PORT_TABLE: |
|
||||
|
|
||||
|
|
||||
Port_Name: in |
|
||||
Description: "input" |
|
||||
Direction: in |
|
||||
Default_Type: v |
|
||||
Allowed_Types: [v,vd,i,id,vnam] |
|
||||
Vector: yes |
|
||||
Vector_Bounds: - |
|
||||
Null_Allowed: no |
|
||||
|
|
||||
|
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: integer |
|
||||
Description: "integer parameter" |
|
||||
Data_Type: int |
|
||||
Default_Value: 1 |
|
||||
Limits: - |
|
||||
Vector: no |
|
||||
Vector_Bounds: - |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: real |
|
||||
Description: "real parameter" |
|
||||
Data_Type: real |
|
||||
Default_Value: 1 |
|
||||
Limits: - |
|
||||
Vector: no |
|
||||
Vector_Bounds: - |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: complex |
|
||||
Description: "complex parameter" |
|
||||
Data_Type: complex |
|
||||
Default_Value: <1.0, 1.0> |
|
||||
Limits: - |
|
||||
Vector: no |
|
||||
Vector_Bounds: - |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: string |
|
||||
Description: "string parameter" |
|
||||
Data_Type: string |
|
||||
Default_Value: "one" |
|
||||
Limits: - |
|
||||
Vector: no |
|
||||
Vector_Bounds: - |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: integer_array |
|
||||
Description: "integer array parameter" |
|
||||
Data_Type: int |
|
||||
Default_Value: 1 |
|
||||
Limits: - |
|
||||
Vector: yes |
|
||||
Vector_Bounds: in |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: real_array |
|
||||
Description: "real array parameter" |
|
||||
Data_Type: real |
|
||||
Default_Value: 1 |
|
||||
Limits: - |
|
||||
Vector: yes |
|
||||
Vector_Bounds: in |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: complex_array |
|
||||
Description: "complex array parameter" |
|
||||
Data_Type: complex |
|
||||
Default_Value: <1.0 1.0> |
|
||||
Limits: - |
|
||||
Vector: yes |
|
||||
Vector_Bounds: in |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: string_array |
|
||||
Description: "string array parameter" |
|
||||
Data_Type: string |
|
||||
Default_Value: "one" |
|
||||
Limits: - |
|
||||
Vector: yes |
|
||||
Vector_Bounds: in |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
|
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
NAME_TABLE: |
||||
|
|
||||
|
Spice_Model_Name: print_param_types |
||||
|
C_Function_Name: ucm_print_param_types |
||||
|
Description: "ignores its input, but prints its parameters" |
||||
|
|
||||
|
|
||||
|
PORT_TABLE: |
||||
|
|
||||
|
|
||||
|
Port_Name: in |
||||
|
Description: "input" |
||||
|
Direction: in |
||||
|
Default_Type: v |
||||
|
Allowed_Types: [v,vd,i,id,vnam] |
||||
|
Vector: yes |
||||
|
Vector_Bounds: - |
||||
|
Null_Allowed: no |
||||
|
|
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: integer |
||||
|
Description: "integer parameter" |
||||
|
Data_Type: int |
||||
|
Default_Value: 1 |
||||
|
Limits: - |
||||
|
Vector: no |
||||
|
Vector_Bounds: - |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: real |
||||
|
Description: "real parameter" |
||||
|
Data_Type: real |
||||
|
Default_Value: 1 |
||||
|
Limits: - |
||||
|
Vector: no |
||||
|
Vector_Bounds: - |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: complex |
||||
|
Description: "complex parameter" |
||||
|
Data_Type: complex |
||||
|
Default_Value: <1.0, 1.0> |
||||
|
Limits: - |
||||
|
Vector: no |
||||
|
Vector_Bounds: - |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: string |
||||
|
Description: "string parameter" |
||||
|
Data_Type: string |
||||
|
Default_Value: "one" |
||||
|
Limits: - |
||||
|
Vector: no |
||||
|
Vector_Bounds: - |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: integer_array |
||||
|
Description: "integer array parameter" |
||||
|
Data_Type: int |
||||
|
Default_Value: 1 |
||||
|
Limits: - |
||||
|
Vector: yes |
||||
|
Vector_Bounds: in |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: real_array |
||||
|
Description: "real array parameter" |
||||
|
Data_Type: real |
||||
|
Default_Value: 1 |
||||
|
Limits: - |
||||
|
Vector: yes |
||||
|
Vector_Bounds: in |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: complex_array |
||||
|
Description: "complex array parameter" |
||||
|
Data_Type: complex |
||||
|
Default_Value: <1.0 1.0> |
||||
|
Limits: - |
||||
|
Vector: yes |
||||
|
Vector_Bounds: in |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: string_array |
||||
|
Description: "string array parameter" |
||||
|
Data_Type: string |
||||
|
Default_Value: "one" |
||||
|
Limits: - |
||||
|
Vector: yes |
||||
|
Vector_Bounds: in |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
|
||||
@ -1,40 +1,38 @@ |
|||||
# $Id$
|
|
||||
#
|
|
||||
# Makefile for Code Model directories
|
|
||||
#
|
|
||||
|
|
||||
# Include global XSPICE selections for CC and other macros
|
|
||||
include /usr/local/xspice-1-0/include/make.include |
|
||||
|
|
||||
INCLUDE = -I. -I$(ROOT)/include/sim |
|
||||
|
|
||||
CFLAGS = -g |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# Edit the following definition to specify the object files that comprise
|
|
||||
# your code model. If your code model is completely specified in the
|
|
||||
# cfunc.mod file, there is no need to edit this definition.
|
|
||||
# DO NOT include the ifspec.o file.
|
|
||||
|
|
||||
CODE_MODEL_OBJECTS = cfunc.o |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
|
||||
|
|
||||
.SUFFIXES: $(SUFFIXES) .mod .ifs |
|
||||
|
|
||||
.mod.c: |
|
||||
$(BINDIR)/cmpp -mod $< |
|
||||
|
|
||||
.ifs.c: |
|
||||
$(BINDIR)/cmpp -ifs |
|
||||
|
|
||||
.c.o: $*.c |
|
||||
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
|
||||
|
|
||||
all : ifspec.o $(CODE_MODEL_OBJECTS) |
|
||||
|
|
||||
cfunc.o : cfunc.c |
|
||||
ifspec.o : ifspec.c |
|
||||
|
|
||||
|
|
||||
|
# $Id$
|
||||
|
#
|
||||
|
# Makefile for Code Model directories
|
||||
|
#
|
||||
|
|
||||
|
# Include global XSPICE selections for CC and other macros
|
||||
|
include /usr/local/xspice-1-0/include/make.include |
||||
|
|
||||
|
INCLUDE = -I. -I$(ROOT)/include/sim |
||||
|
|
||||
|
CFLAGS = -g |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# Edit the following definition to specify the object files that comprise
|
||||
|
# your code model. If your code model is completely specified in the
|
||||
|
# cfunc.mod file, there is no need to edit this definition.
|
||||
|
# DO NOT include the ifspec.o file.
|
||||
|
|
||||
|
CODE_MODEL_OBJECTS = cfunc.o |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
||||
|
|
||||
|
.SUFFIXES: $(SUFFIXES) .mod .ifs |
||||
|
|
||||
|
.mod.c: |
||||
|
$(BINDIR)/cmpp -mod $< |
||||
|
|
||||
|
.ifs.c: |
||||
|
$(BINDIR)/cmpp -ifs |
||||
|
|
||||
|
.c.o: $*.c |
||||
|
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
||||
|
|
||||
|
all : ifspec.o $(CODE_MODEL_OBJECTS) |
||||
|
|
||||
|
cfunc.o : cfunc.c |
||||
|
ifspec.o : ifspec.c |
||||
@ -1,33 +1,33 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
NAME_TABLE: |
|
||||
|
|
||||
Spice_Model_Name: real_delay |
|
||||
C_Function_Name: ucm_real_delay |
|
||||
Description: "A Z ** -1 block working on real data" |
|
||||
|
|
||||
|
|
||||
PORT_TABLE: |
|
||||
|
|
||||
Port_Name: in clk out |
|
||||
Description: "input" "clock" "output" |
|
||||
Direction: in in out |
|
||||
Default_Type: real d real |
|
||||
Allowed_Types: [real] [d] [real] |
|
||||
Vector: no no no |
|
||||
Vector_Bounds: - - - |
|
||||
Null_Allowed: no no no |
|
||||
|
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: delay |
|
||||
Description: "delay from clk to out" |
|
||||
Data_Type: real |
|
||||
Default_Value: 1e-9 |
|
||||
Limits: [1e-15 -] |
|
||||
Vector: no |
|
||||
Vector_Bounds: - |
|
||||
Null_Allowed: yes |
|
||||
|
|
||||
|
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
NAME_TABLE: |
||||
|
|
||||
|
Spice_Model_Name: real_delay |
||||
|
C_Function_Name: ucm_real_delay |
||||
|
Description: "A Z ** -1 block working on real data" |
||||
|
|
||||
|
|
||||
|
PORT_TABLE: |
||||
|
|
||||
|
Port_Name: in clk out |
||||
|
Description: "input" "clock" "output" |
||||
|
Direction: in in out |
||||
|
Default_Type: real d real |
||||
|
Allowed_Types: [real] [d] [real] |
||||
|
Vector: no no no |
||||
|
Vector_Bounds: - - - |
||||
|
Null_Allowed: no no no |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: delay |
||||
|
Description: "delay from clk to out" |
||||
|
Data_Type: real |
||||
|
Default_Value: 1e-9 |
||||
|
Limits: [1e-15 -] |
||||
|
Vector: no |
||||
|
Vector_Bounds: - |
||||
|
Null_Allowed: yes |
||||
|
|
||||
|
|
||||
@ -1,40 +1,38 @@ |
|||||
# $Id$
|
|
||||
#
|
|
||||
# Makefile for Code Model directories
|
|
||||
#
|
|
||||
|
|
||||
# Include global XSPICE selections for CC and other macros
|
|
||||
include /usr/local/xspice-1-0/include/make.include |
|
||||
|
|
||||
INCLUDE = -I. -I$(ROOT)/include/sim |
|
||||
|
|
||||
CFLAGS = -g |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# Edit the following definition to specify the object files that comprise
|
|
||||
# your code model. If your code model is completely specified in the
|
|
||||
# cfunc.mod file, there is no need to edit this definition.
|
|
||||
# DO NOT include the ifspec.o file.
|
|
||||
|
|
||||
CODE_MODEL_OBJECTS = cfunc.o |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
|
||||
|
|
||||
.SUFFIXES: $(SUFFIXES) .mod .ifs |
|
||||
|
|
||||
.mod.c: |
|
||||
$(BINDIR)/cmpp -mod $< |
|
||||
|
|
||||
.ifs.c: |
|
||||
$(BINDIR)/cmpp -ifs |
|
||||
|
|
||||
.c.o: $*.c |
|
||||
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
|
||||
|
|
||||
all : ifspec.o $(CODE_MODEL_OBJECTS) |
|
||||
|
|
||||
cfunc.o : cfunc.c |
|
||||
ifspec.o : ifspec.c |
|
||||
|
|
||||
|
|
||||
|
# $Id$
|
||||
|
#
|
||||
|
# Makefile for Code Model directories
|
||||
|
#
|
||||
|
|
||||
|
# Include global XSPICE selections for CC and other macros
|
||||
|
include /usr/local/xspice-1-0/include/make.include |
||||
|
|
||||
|
INCLUDE = -I. -I$(ROOT)/include/sim |
||||
|
|
||||
|
CFLAGS = -g |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# Edit the following definition to specify the object files that comprise
|
||||
|
# your code model. If your code model is completely specified in the
|
||||
|
# cfunc.mod file, there is no need to edit this definition.
|
||||
|
# DO NOT include the ifspec.o file.
|
||||
|
|
||||
|
CODE_MODEL_OBJECTS = cfunc.o |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
||||
|
|
||||
|
.SUFFIXES: $(SUFFIXES) .mod .ifs |
||||
|
|
||||
|
.mod.c: |
||||
|
$(BINDIR)/cmpp -mod $< |
||||
|
|
||||
|
.ifs.c: |
||||
|
$(BINDIR)/cmpp -ifs |
||||
|
|
||||
|
.c.o: $*.c |
||||
|
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
||||
|
|
||||
|
all : ifspec.o $(CODE_MODEL_OBJECTS) |
||||
|
|
||||
|
cfunc.o : cfunc.c |
||||
|
ifspec.o : ifspec.c |
||||
@ -1,39 +1,37 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
void ucm_real_gain (ARGS) |
|
||||
{ |
|
||||
double *in; |
|
||||
double *out; |
|
||||
|
|
||||
double in_offset; |
|
||||
double gain; |
|
||||
double out_offset; |
|
||||
double delay; |
|
||||
double ic; |
|
||||
|
|
||||
|
|
||||
/* Get the input and output pointers */ |
|
||||
in = INPUT(in); |
|
||||
out = OUTPUT(out); |
|
||||
|
|
||||
/* Get the parameters */ |
|
||||
in_offset = PARAM(in_offset); |
|
||||
gain = PARAM(gain); |
|
||||
out_offset = PARAM(out_offset); |
|
||||
delay = PARAM(delay); |
|
||||
ic = PARAM(ic); |
|
||||
|
|
||||
|
|
||||
/* Assign the output and delay */ |
|
||||
if(ANALYSIS == DC) { |
|
||||
*out = ic; |
|
||||
if(INIT) |
|
||||
cm_event_queue(delay); |
|
||||
} |
|
||||
else { |
|
||||
*out = gain * (*in + in_offset) + out_offset; |
|
||||
OUTPUT_DELAY(out) = delay; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
|
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
void ucm_real_gain (ARGS) |
||||
|
{ |
||||
|
double *in; |
||||
|
double *out; |
||||
|
|
||||
|
double in_offset; |
||||
|
double gain; |
||||
|
double out_offset; |
||||
|
double delay; |
||||
|
double ic; |
||||
|
|
||||
|
|
||||
|
/* Get the input and output pointers */ |
||||
|
in = INPUT(in); |
||||
|
out = OUTPUT(out); |
||||
|
|
||||
|
/* Get the parameters */ |
||||
|
in_offset = PARAM(in_offset); |
||||
|
gain = PARAM(gain); |
||||
|
out_offset = PARAM(out_offset); |
||||
|
delay = PARAM(delay); |
||||
|
ic = PARAM(ic); |
||||
|
|
||||
|
|
||||
|
/* Assign the output and delay */ |
||||
|
if(ANALYSIS == DC) { |
||||
|
*out = ic; |
||||
|
if(INIT) |
||||
|
cm_event_queue(delay); |
||||
|
} |
||||
|
else { |
||||
|
*out = gain * (*in + in_offset) + out_offset; |
||||
|
OUTPUT_DELAY(out) = delay; |
||||
|
} |
||||
|
} |
||||
@ -1,45 +1,45 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
NAME_TABLE: |
|
||||
|
|
||||
Spice_Model_Name: real_gain |
|
||||
C_Function_Name: ucm_real_gain |
|
||||
Description: "A gain block for event-driven real data" |
|
||||
|
|
||||
|
|
||||
PORT_TABLE: |
|
||||
|
|
||||
Port_Name: in out |
|
||||
Description: "input" "output" |
|
||||
Direction: in out |
|
||||
Default_Type: real real |
|
||||
Allowed_Types: [real] [real] |
|
||||
Vector: no no |
|
||||
Vector_Bounds: - - |
|
||||
Null_Allowed: no no |
|
||||
|
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: in_offset gain out_offset |
|
||||
Description: "input offset" "gain" "output offset" |
|
||||
Data_Type: real real real |
|
||||
Default_Value: 0.0 1.0 0.0 |
|
||||
Limits: - - - |
|
||||
Vector: no no no |
|
||||
Vector_Bounds: - - - |
|
||||
Null_Allowed: yes yes yes |
|
||||
|
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: delay ic |
|
||||
Description: "delay" "initial condition" |
|
||||
Data_Type: real real |
|
||||
Default_Value: 1.0e-9 0.0 |
|
||||
Limits: - - |
|
||||
Vector: no no |
|
||||
Vector_Bounds: - - |
|
||||
Null_Allowed: yes yes |
|
||||
|
|
||||
|
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
NAME_TABLE: |
||||
|
|
||||
|
Spice_Model_Name: real_gain |
||||
|
C_Function_Name: ucm_real_gain |
||||
|
Description: "A gain block for event-driven real data" |
||||
|
|
||||
|
|
||||
|
PORT_TABLE: |
||||
|
|
||||
|
Port_Name: in out |
||||
|
Description: "input" "output" |
||||
|
Direction: in out |
||||
|
Default_Type: real real |
||||
|
Allowed_Types: [real] [real] |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: no no |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: in_offset gain out_offset |
||||
|
Description: "input offset" "gain" "output offset" |
||||
|
Data_Type: real real real |
||||
|
Default_Value: 0.0 1.0 0.0 |
||||
|
Limits: - - - |
||||
|
Vector: no no no |
||||
|
Vector_Bounds: - - - |
||||
|
Null_Allowed: yes yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: delay ic |
||||
|
Description: "delay" "initial condition" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 1.0e-9 0.0 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
@ -1,40 +1,38 @@ |
|||||
# $Id$
|
|
||||
#
|
|
||||
# Makefile for Code Model directories
|
|
||||
#
|
|
||||
|
|
||||
# Include global XSPICE selections for CC and other macros
|
|
||||
include /usr/local/xspice-1-0/include/make.include |
|
||||
|
|
||||
INCLUDE = -I. -I$(ROOT)/include/sim |
|
||||
|
|
||||
CFLAGS = -g |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# Edit the following definition to specify the object files that comprise
|
|
||||
# your code model. If your code model is completely specified in the
|
|
||||
# cfunc.mod file, there is no need to edit this definition.
|
|
||||
# DO NOT include the ifspec.o file.
|
|
||||
|
|
||||
CODE_MODEL_OBJECTS = cfunc.o |
|
||||
|
|
||||
#-----------------------------------------------------------------------------
|
|
||||
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
|
||||
|
|
||||
.SUFFIXES: $(SUFFIXES) .mod .ifs |
|
||||
|
|
||||
.mod.c: |
|
||||
$(BINDIR)/cmpp -mod $< |
|
||||
|
|
||||
.ifs.c: |
|
||||
$(BINDIR)/cmpp -ifs |
|
||||
|
|
||||
.c.o: $*.c |
|
||||
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
|
||||
|
|
||||
all : ifspec.o $(CODE_MODEL_OBJECTS) |
|
||||
|
|
||||
cfunc.o : cfunc.c |
|
||||
ifspec.o : ifspec.c |
|
||||
|
|
||||
|
|
||||
|
# $Id$
|
||||
|
#
|
||||
|
# Makefile for Code Model directories
|
||||
|
#
|
||||
|
|
||||
|
# Include global XSPICE selections for CC and other macros
|
||||
|
include /usr/local/xspice-1-0/include/make.include |
||||
|
|
||||
|
INCLUDE = -I. -I$(ROOT)/include/sim |
||||
|
|
||||
|
CFLAGS = -g |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# Edit the following definition to specify the object files that comprise
|
||||
|
# your code model. If your code model is completely specified in the
|
||||
|
# cfunc.mod file, there is no need to edit this definition.
|
||||
|
# DO NOT include the ifspec.o file.
|
||||
|
|
||||
|
CODE_MODEL_OBJECTS = cfunc.o |
||||
|
|
||||
|
#-----------------------------------------------------------------------------
|
||||
|
# DO NOT MODIFY THE FOLLOWING DEFINITIONS:
|
||||
|
|
||||
|
.SUFFIXES: $(SUFFIXES) .mod .ifs |
||||
|
|
||||
|
.mod.c: |
||||
|
$(BINDIR)/cmpp -mod $< |
||||
|
|
||||
|
.ifs.c: |
||||
|
$(BINDIR)/cmpp -ifs |
||||
|
|
||||
|
.c.o: $*.c |
||||
|
${CC} ${CFLAGS} ${INCLUDE} -c $*.c |
||||
|
|
||||
|
all : ifspec.o $(CODE_MODEL_OBJECTS) |
||||
|
|
||||
|
cfunc.o : cfunc.c |
||||
|
ifspec.o : ifspec.c |
||||
@ -1,33 +1,33 @@ |
|||||
/* $Id$ */ |
|
||||
|
|
||||
NAME_TABLE: |
|
||||
|
|
||||
Spice_Model_Name: real_to_v |
|
||||
C_Function_Name: ucm_real_to_v |
|
||||
Description: "Node bridge from real to analog voltage" |
|
||||
|
|
||||
|
|
||||
PORT_TABLE: |
|
||||
|
|
||||
Port_Name: in out |
|
||||
Description: "input" "output" |
|
||||
Direction: in out |
|
||||
Default_Type: real v |
|
||||
Allowed_Types: [real] [v, vd, i, id] |
|
||||
Vector: no no |
|
||||
Vector_Bounds: - - |
|
||||
Null_Allowed: no no |
|
||||
|
|
||||
|
|
||||
PARAMETER_TABLE: |
|
||||
|
|
||||
Parameter_Name: gain transition_time |
|
||||
Description: "gain" "output transition time" |
|
||||
Data_Type: real real |
|
||||
Default_Value: 1.0 1e-9 |
|
||||
Limits: - [1e-15 -] |
|
||||
Vector: no no |
|
||||
Vector_Bounds: - - |
|
||||
Null_Allowed: yes yes |
|
||||
|
|
||||
|
|
||||
|
/* $Id$ */ |
||||
|
|
||||
|
NAME_TABLE: |
||||
|
|
||||
|
Spice_Model_Name: real_to_v |
||||
|
C_Function_Name: ucm_real_to_v |
||||
|
Description: "Node bridge from real to analog voltage" |
||||
|
|
||||
|
|
||||
|
PORT_TABLE: |
||||
|
|
||||
|
Port_Name: in out |
||||
|
Description: "input" "output" |
||||
|
Direction: in out |
||||
|
Default_Type: real v |
||||
|
Allowed_Types: [real] [v, vd, i, id] |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: no no |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: gain transition_time |
||||
|
Description: "gain" "output transition time" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 1.0 1e-9 |
||||
|
Limits: - [1e-15 -] |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue