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