Update autoconf scripts and applied Niessner patch to remove compiler warnings.
This commit is contained in:
parent
eb890a8ef6
commit
1260ae08db
|
|
@ -1,3 +1,12 @@
|
|||
2004-07-08 Paolo Nenzi <p.nenzi@ieee.org>
|
||||
|
||||
* Applied Al Niessner <Al.Niessner@jpl.nasa.gov> negabyte patch
|
||||
that removed all compiler warnings.
|
||||
|
||||
* configure.in, src/xspice/icm/makedefs.in, tests/Makefile.am,
|
||||
xgraph/aclocal.m4, xgraph/configure.in, xgraph/configure: updated
|
||||
configuration files for autoconf V2.59 automake V1.8.
|
||||
|
||||
2004-07-05 Paolo Nenzi <p.nenzi@ieee.org>
|
||||
|
||||
* src/frontend/resource.c: added __APPLE__ for mac osx support as in
|
||||
|
|
|
|||
|
|
@ -97,3 +97,7 @@
|
|||
|
||||
/* get system memory and time */
|
||||
#undef HAVE__MEMAVL
|
||||
|
||||
/* define whether size_t is int or is long */
|
||||
#undef IS_SIZE_T_LONG
|
||||
|
||||
|
|
|
|||
50
configure.in
50
configure.in
|
|
@ -3,10 +3,11 @@ dnl
|
|||
dnl This file is part of ngspice.
|
||||
dnl
|
||||
dnl (Process this file with autoconf to produce a configure script.)
|
||||
AC_INIT(src/main.c)
|
||||
AC_INIT
|
||||
AC_CONFIG_SRCDIR([src/main.c])
|
||||
|
||||
dnl Create a configuration header
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
dnl Initialize automake stuff
|
||||
AM_INIT_AUTOMAKE(ng-spice-rework,15)
|
||||
|
|
@ -174,7 +175,14 @@ dnl Checks for ANSI-C header files.
|
|||
AC_HEADER_STDC
|
||||
|
||||
if test "$enable_ansi" = "yes"; then
|
||||
AM_PROG_CC_STDC
|
||||
AC_PROG_CC()
|
||||
AC_DIAGNOSE([obsolete],[AM_PROG_CC_STDC:
|
||||
your code should no longer depend upon `am_cv_prog_cc_stdc', but upon
|
||||
`ac_cv_prog_cc_stdc'. Remove this warning and the assignment when
|
||||
you adjust the code. You can also remove the above call to
|
||||
AC_PROG_CC if you already called it elsewhere.])
|
||||
am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
|
||||
|
||||
if test ! "$am_cv_prog_cc_stdc"="yes"; then
|
||||
AC_MSG_WARN(Failed to find Ansi flag!)
|
||||
fi
|
||||
|
|
@ -265,6 +273,18 @@ AC_STRUCT_TM
|
|||
AC_STRUCT_TIMEZONE
|
||||
AC_CHECK_FUNCS(localtime)
|
||||
|
||||
dnl Some special AMD64 processor issues. This change may be common to many
|
||||
dnl 64 bit processors, but I have only this platform to work with and did not
|
||||
dnl find a good way of automatically determining this information.
|
||||
case $host in
|
||||
x86_64-*-linux*)
|
||||
AC_DEFINE(IS_SIZE_T_LONG, 1)
|
||||
;;
|
||||
*)
|
||||
AC_DEFINE(IS_SIZE_T_LONG, 0)
|
||||
;;
|
||||
esac
|
||||
|
||||
case $host_os in
|
||||
*cygwin* )
|
||||
AC_CHECK_FUNCS(ftime)
|
||||
|
|
@ -280,7 +300,7 @@ AC_CHECK_HEADERS(termios.h termio.h sgtty.h , break)
|
|||
AC_CHECK_FUNCS(isatty tcgetattr tcsetattr)
|
||||
|
||||
dnl Check for a few functions:
|
||||
AC_FUNC_VFORK
|
||||
AC_FUNC_FORK([])
|
||||
AC_CHECK_FUNCS(access bcopy qsort dup2 popen)
|
||||
AC_CHECK_FUNCS(strchr index , break)
|
||||
AC_CHECK_FUNCS(getcwd getwd , break)
|
||||
|
|
@ -303,26 +323,18 @@ AC_CHECK_FUNCS(asprintf,,AC_CHECK_LIB(iberty,asprintf,AC_DEFINE(HAVE_ASPRINTF) L
|
|||
|
||||
dnl Check for va_copy
|
||||
AC_CACHE_CHECK([for va_copy], ac_cv_c_va_copy,
|
||||
AC_TRY_LINK(
|
||||
[#include <stdarg.h>],
|
||||
[va_list ap1, ap2;
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>]], [[va_list ap1, ap2;
|
||||
va_copy(ap1,ap2);
|
||||
],
|
||||
[ac_cv_c_va_copy="yes"],
|
||||
[ac_cv_c_va_copy="no"])
|
||||
]])],[ac_cv_c_va_copy="yes"],[ac_cv_c_va_copy="no"])
|
||||
)
|
||||
if test "$ac_cv_c_va_copy" = "yes"
|
||||
then
|
||||
AC_DEFINE(HAVE_VA_COPY, 1, [Define if we have va_copy])
|
||||
fi
|
||||
AC_CACHE_CHECK([for __va_copy], ac_cv_c___va_copy,
|
||||
AC_TRY_LINK(
|
||||
[#include <stdarg.h>],
|
||||
[va_list ap1, ap2;
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>]], [[va_list ap1, ap2;
|
||||
__va_copy(ap1,ap2);
|
||||
],
|
||||
[ac_cv_c___va_copy="yes"],
|
||||
[ac_cv_c___va_copy="no"])
|
||||
]])],[ac_cv_c___va_copy="yes"],[ac_cv_c___va_copy="no"])
|
||||
)
|
||||
if test "$ac_cv_c___va_copy" = "yes"
|
||||
then
|
||||
|
|
@ -572,7 +584,7 @@ fi
|
|||
|
||||
|
||||
|
||||
AC_OUTPUT( \
|
||||
AC_CONFIG_FILES([\
|
||||
Makefile \
|
||||
doc/Makefile \
|
||||
man/Makefile \
|
||||
|
|
@ -603,7 +615,6 @@ src/spicelib/devices/ccvs/Makefile \
|
|||
src/spicelib/devices/csw/Makefile \
|
||||
src/spicelib/devices/cpl/Makefile \
|
||||
src/spicelib/devices/dio/Makefile \
|
||||
dnl src/spicelib/devices/ekv/Makefile \
|
||||
src/spicelib/devices/ind/Makefile \
|
||||
src/spicelib/devices/isrc/Makefile \
|
||||
src/spicelib/devices/hfet1/Makefile \
|
||||
|
|
@ -708,4 +719,5 @@ tests/proc2mod/Makefile \
|
|||
tests/transmission/Makefile \
|
||||
tests/resistance/Makefile \
|
||||
tests/vbic/Makefile
|
||||
)
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
|
|
|||
6975
doc/texinfo.tex
6975
doc/texinfo.tex
File diff suppressed because it is too large
Load Diff
|
|
@ -4,9 +4,9 @@
|
|||
|
||||
#include "conf.h"
|
||||
|
||||
char Spice_Version[ ] = VERSION;
|
||||
char Spice_Notice[ ] = "Please submit bug-reports to: ngspice-devel@lists.sourceforge.net";
|
||||
char Spice_Build_Date[ ] = NGSPICEBUILDDATE;
|
||||
char Spice_Version[] = VERSION;
|
||||
char Spice_Notice[] = "Please submit bug-reports to: ngspice-devel@lists.sourceforge.net";
|
||||
char Spice_Build_Date[] = NGSPICEBUILDDATE;
|
||||
/*
|
||||
char *Spice_Exec_Dir = "/spice_win/bin";
|
||||
char *Spice_Lib_Dir = "/spice_win/lib";
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ cp_histsubst(wordlist *wlist)
|
|||
return (wlist);
|
||||
}
|
||||
if (b < s) {
|
||||
(void) sprintf(buf, "%.*s%s", s - b, b,
|
||||
(void) sprintf(buf, "%.*s%s", (int)(s-b), b,
|
||||
n->wl_word);
|
||||
tfree(n->wl_word);
|
||||
n->wl_word = copy(buf);
|
||||
|
|
|
|||
|
|
@ -819,8 +819,8 @@ cp_evloop(char *string)
|
|||
}
|
||||
|
||||
/* This blows away the control structures... */
|
||||
void
|
||||
cp_resetcontrol(void)
|
||||
void cp_free_control(void); /* needed by resetcontrol */
|
||||
void cp_resetcontrol(void)
|
||||
{
|
||||
fprintf(cp_err, "Warning: clearing control structures\n");
|
||||
if (cend[stackp] && cend[stackp]->co_parent)
|
||||
|
|
|
|||
|
|
@ -577,7 +577,6 @@ com_alter_common(wordlist *wl, int do_model)
|
|||
char *param;
|
||||
struct dvec *dv;
|
||||
struct pnode *names;
|
||||
char *hlp=NULL;
|
||||
|
||||
if (!ft_curckt) {
|
||||
fprintf(cp_err, "Error: no circuit loaded\n");
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@ ft_cktcoms(bool terse)
|
|||
static void
|
||||
fixdotplot(wordlist *wl)
|
||||
{
|
||||
char buf[BSIZE_SP], *s;
|
||||
char *s;
|
||||
char numbuf[128]; /* Printnum Fix */
|
||||
double *d, d1, d2;
|
||||
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ static struct dvec *
|
|||
doop(char what,
|
||||
void*(*func) (void *data1, void *data2,
|
||||
short int datatype1, short int datatype2,
|
||||
int length),
|
||||
int length, ...),
|
||||
struct pnode *arg1,
|
||||
struct pnode *arg2)
|
||||
{
|
||||
|
|
@ -707,14 +707,11 @@ apply_func(struct func *func, struct pnode *arg)
|
|||
}
|
||||
(void) signal(SIGILL, (SIGNAL_FUNCTION) sig_matherr);
|
||||
|
||||
/* FIXME: The call to (*func->fu_func) has too many arguments;
|
||||
hence the compiler quits. How to circumvent this (without
|
||||
losing function prototypes)? For now, these functions have
|
||||
been disabled. */
|
||||
if (eq(func->fu_name, "interpolate")
|
||||
|| eq(func->fu_name, "deriv")) /* Ack */
|
||||
{
|
||||
void *(*f)()=func->fu_func; /* va, a type cast, which loses function prototypes, a warning */
|
||||
void *(*f)(void *data, short int type, int length,
|
||||
int *newlength, short int *newtype, ...)=func->fu_func;
|
||||
data = ((*f) ((isreal(v) ? (void *) v->v_realdata : (void *) v->v_compdata),
|
||||
(short) (isreal(v) ? VF_REAL : VF_COMPLEX),
|
||||
v->v_length, &len, &type,
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ static struct pnode * mkunode(int op, struct pnode *arg);
|
|||
static struct pnode * mkfnode(char *func, struct pnode *arg);
|
||||
static struct pnode * mknnode(double number);
|
||||
static struct pnode * mksnode(char *string);
|
||||
static void print_elem(struct element *elem); /* va: for debugging */
|
||||
static char * get_token_name(int e_token); /* va, for debugging */
|
||||
/*static void print_elem(struct element *elem); / va: for debugging /
|
||||
static char * get_token_name(int e_token); / va, for debugging */
|
||||
|
||||
|
||||
static int lasttoken = END, lasttype;
|
||||
|
|
@ -582,9 +582,10 @@ makepnode(struct element *elem)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
static char * get_token_name(int e_token)
|
||||
{
|
||||
/* see include/fteparse.h */
|
||||
/ see include/fteparse.h /
|
||||
switch (e_token) {
|
||||
case 0: return "END ";
|
||||
case 1: return "PLUS ";
|
||||
|
|
@ -612,6 +613,7 @@ static char * get_token_name(int e_token)
|
|||
default : return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
||||
static void print_elem(struct element *elem)
|
||||
{
|
||||
printf("e_token = %d(%s)", elem->e_token, get_token_name(elem->e_token));
|
||||
|
|
@ -631,7 +633,7 @@ static void print_elem(struct element *elem)
|
|||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* Some auxiliary functions for building the parse tree. */
|
||||
|
|
@ -700,12 +702,8 @@ struct func ft_funcs[] = {
|
|||
{ "vecmin", cx_min } ,
|
||||
{ "vecmax", cx_max } ,
|
||||
{ "vecd", cx_d } ,
|
||||
/* va, deactivate function prototype testing for this 2 functions, only. Gives a warning. */
|
||||
#define INTERPOL_FUNC (void *(*)())
|
||||
/* These functions have been temporarily been disabled. See
|
||||
their definitions for the reason. */
|
||||
{ "interpolate", INTERPOL_FUNC cx_interpolate } ,
|
||||
{ "deriv", INTERPOL_FUNC cx_deriv } ,
|
||||
{ "interpolate", cx_interpolate } ,
|
||||
{ "deriv", cx_deriv } ,
|
||||
{ "v", NULL } ,
|
||||
{ NULL, NULL }
|
||||
} ;
|
||||
|
|
|
|||
|
|
@ -896,7 +896,8 @@ X11_Input(REQUEST *request, RESPONSE *response)
|
|||
{
|
||||
|
||||
XEvent ev;
|
||||
int nfds, readfds;
|
||||
int nfds;
|
||||
fd_set rfds;
|
||||
|
||||
switch (request->option) {
|
||||
case char_option:
|
||||
|
|
@ -913,15 +914,19 @@ X11_Input(REQUEST *request, RESPONSE *response)
|
|||
XtDispatchEvent(&ev);
|
||||
}
|
||||
|
||||
readfds = 1 << fileno(request->fp) |
|
||||
1 << ConnectionNumber(display);
|
||||
|
||||
/* block on ConnectionNumber and request->fp */
|
||||
/* PN: added fd_set * casting */
|
||||
select(nfds + 1, (fd_set *)&readfds, (fd_set *) NULL, (fd_set *) NULL, NULL);
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_SET(fileno(request->fp), &rfds);
|
||||
FD_SET(ConnectionNumber(display), &rfds);
|
||||
select (nfds + 1,
|
||||
&rfds,
|
||||
(fd_set *)NULL,
|
||||
(fd_set *)NULL,
|
||||
NULL);
|
||||
|
||||
/* handle X events first */
|
||||
if (readfds & (1 << ConnectionNumber(display))) {
|
||||
if (FD_ISSET (ConnectionNumber(display), &rfds)) {
|
||||
/* handle ALL X events */
|
||||
while (XtPending()) {
|
||||
XtNextEvent(&ev);
|
||||
|
|
@ -929,7 +934,7 @@ X11_Input(REQUEST *request, RESPONSE *response)
|
|||
}
|
||||
}
|
||||
|
||||
if (readfds & (1 << fileno(request->fp))) {
|
||||
if (FD_ISSET (fileno(request->fp), &rfds)) {
|
||||
response->reply.ch = inchar(request->fp);
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -282,7 +282,11 @@ raw_read(char *name)
|
|||
struct variable *vv;
|
||||
wordlist *wl, *nwl;
|
||||
FILE *fp, *lastin, *lastout, *lasterr;
|
||||
|
||||
|
||||
#ifdef __MINGW32__
|
||||
bool binary = TRUE;
|
||||
#endif
|
||||
|
||||
if (!(fp = fopen(name, "r"))) {
|
||||
perror(name);
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ if_sens_run(char *t, wordlist *args, INPtables *tab)
|
|||
char *steptype;
|
||||
char *name;
|
||||
char *line;
|
||||
struct line deck;
|
||||
struct line deck[1];
|
||||
int i;
|
||||
int j;
|
||||
int error;
|
||||
|
|
@ -51,12 +51,12 @@ if_sens_run(char *t, wordlist *args, INPtables *tab)
|
|||
int which = -1;
|
||||
|
||||
(void) sprintf(buf, ".%s", wl_flatten(args));
|
||||
deck.li_next = deck.li_actual = NULL;
|
||||
deck.li_error = NULL;
|
||||
deck.li_linenum = 0;
|
||||
deck.li_line = buf;
|
||||
deck[0].li_next = deck[0].li_actual = NULL;
|
||||
deck[0].li_error = NULL;
|
||||
deck[0].li_linenum = 0;
|
||||
deck[0].li_line = buf;
|
||||
|
||||
current = (card *) &deck;
|
||||
current = (card *)deck;
|
||||
line = current->line;
|
||||
INPgetTok(&line,&token,1);
|
||||
|
||||
|
|
|
|||
|
|
@ -195,7 +195,7 @@ if_run(char *t, char *what, wordlist *args, char *tab)
|
|||
{
|
||||
void *ckt = (void *) t;
|
||||
int err;
|
||||
struct line deck;
|
||||
struct line deck[1];
|
||||
char buf[BSIZE_SP];
|
||||
int j;
|
||||
int which = -1;
|
||||
|
|
@ -219,10 +219,10 @@ if_run(char *t, char *what, wordlist *args, char *tab)
|
|||
s = wl_flatten(args); /* va: tfree char's tmalloc'ed in wl_flatten */
|
||||
(void) sprintf(buf, ".%s", s);
|
||||
tfree(s);
|
||||
deck.li_next = deck.li_actual = NULL;
|
||||
deck.li_error = NULL;
|
||||
deck.li_linenum = 0;
|
||||
deck.li_line = buf;
|
||||
deck[0].li_next = deck[0].li_actual = NULL;
|
||||
deck[0].li_error = NULL;
|
||||
deck[0].li_linenum = 0;
|
||||
deck[0].li_line = buf;
|
||||
|
||||
/*CDHW Delete any previous special task CDHW*/
|
||||
|
||||
|
|
@ -296,10 +296,10 @@ ci_specTask will point to it CDHW*/
|
|||
|
||||
/*CDHW ci_curTask and ci_specTask point to the interactive task AAA CDHW*/
|
||||
|
||||
INPpas2(ckt, (card *) &deck, (INPtables *)tab, ft_curckt->ci_specTask);
|
||||
INPpas2(ckt, (card *)deck, (INPtables *)tab, ft_curckt->ci_specTask);
|
||||
|
||||
if (deck.li_error) {
|
||||
fprintf(cp_err, "Warning: %s\n", deck.li_error);
|
||||
if (deck[0].li_error) {
|
||||
fprintf(cp_err, "Warning: %s\n", deck[0].li_error);
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
|
@ -559,8 +559,8 @@ spif_getparam(void *ckt, char **name, char *param, int ind, int do_model)
|
|||
IFvalue *pv;
|
||||
IFparm *opt;
|
||||
int typecode, i;
|
||||
GENinstance *dev=(GENinstance *)NULL;
|
||||
GENmodel *mod=(GENmodel *)NULL;
|
||||
GENinstance *dev[1]={ (GENinstance *)NULL };
|
||||
GENmodel *mod[1]= { (GENmodel *)NULL };
|
||||
IFdevice *device;
|
||||
|
||||
/* fprintf(cp_err, "Calling if_getparam(%s, %s)\n", *name, param); */
|
||||
|
|
@ -570,7 +570,7 @@ spif_getparam(void *ckt, char **name, char *param, int ind, int do_model)
|
|||
/* MW. My "special routine here" */
|
||||
INPretrieve(name,(INPtables *)ft_curckt->ci_symtab);
|
||||
|
||||
typecode = finddev(ckt, *name,(void**) &dev,(void **) &mod);
|
||||
typecode = finddev(ckt, *name,(void**)dev,(void **)mod);
|
||||
if (typecode == -1) {
|
||||
fprintf(cp_err,
|
||||
"Error: no such device or model name %s\n",
|
||||
|
|
@ -583,7 +583,7 @@ spif_getparam(void *ckt, char **name, char *param, int ind, int do_model)
|
|||
if(opt->dataType & IF_REDUNDANT || !opt->description)
|
||||
continue;
|
||||
if(!(opt->dataType & IF_ASK)) continue;
|
||||
pv = doask(ckt, typecode, dev, mod, opt, ind);
|
||||
pv = doask(ckt, typecode, dev[0], mod[0], opt, ind);
|
||||
if (pv) {
|
||||
tv = parmtovar(pv, opt);
|
||||
if (vv)
|
||||
|
|
@ -600,7 +600,7 @@ spif_getparam(void *ckt, char **name, char *param, int ind, int do_model)
|
|||
|
||||
/* MW. */
|
||||
INPretrieve(name,(INPtables *)ft_curckt->ci_symtab);
|
||||
typecode = finddev(ckt, *name, (void**)&dev, (void **)&mod);
|
||||
typecode = finddev(ckt, *name, (void**)dev, (void **)mod);
|
||||
if (typecode == -1) {
|
||||
fprintf(cp_err,
|
||||
"Error: no such device or model name %s\n",
|
||||
|
|
@ -608,13 +608,13 @@ spif_getparam(void *ckt, char **name, char *param, int ind, int do_model)
|
|||
return (NULL);
|
||||
}
|
||||
device = ft_sim->devices[typecode];
|
||||
opt = parmlookup(device, &dev, param, do_model, 0);
|
||||
opt = parmlookup(device, dev, param, do_model, 0);
|
||||
if (!opt) {
|
||||
fprintf(cp_err, "Error: no such parameter %s.\n",
|
||||
param);
|
||||
return (NULL);
|
||||
}
|
||||
pv = doask(ckt, typecode, dev, mod, opt, ind);
|
||||
pv = doask(ckt, typecode, dev[0], mod[0], opt, ind);
|
||||
if (pv)
|
||||
vv = parmtovar(pv, opt);
|
||||
return (vv);
|
||||
|
|
@ -627,19 +627,19 @@ if_setparam(void *ckt, char **name, char *param, struct dvec *val, int do_model)
|
|||
{
|
||||
IFparm *opt;
|
||||
IFdevice *device;
|
||||
GENmodel *mod=(GENmodel *)NULL;
|
||||
GENinstance *dev=(GENinstance *)NULL;
|
||||
GENmodel *mod[1]={(GENmodel *)NULL};
|
||||
GENinstance *dev[1]={(GENinstance *)NULL};
|
||||
int typecode;
|
||||
|
||||
/* PN */
|
||||
INPretrieve(name,(INPtables *)ft_curckt->ci_symtab);
|
||||
typecode = finddev(ckt, *name, (void**)&dev, (void **)&mod);
|
||||
typecode = finddev(ckt, *name, (void**)dev, (void **)mod);
|
||||
if (typecode == -1) {
|
||||
fprintf(cp_err, "Error: no such device or model name %s\n", *name);
|
||||
return;
|
||||
}
|
||||
device = ft_sim->devices[typecode];
|
||||
opt = parmlookup(device, &dev, param, do_model, 1);
|
||||
opt = parmlookup(device, dev, param, do_model, 1);
|
||||
if (!opt) {
|
||||
if (param)
|
||||
fprintf(cp_err, "Error: no such parameter %s.\n", param);
|
||||
|
|
@ -647,11 +647,11 @@ if_setparam(void *ckt, char **name, char *param, struct dvec *val, int do_model)
|
|||
fprintf(cp_err, "Error: no default parameter.\n");
|
||||
return;
|
||||
}
|
||||
if (do_model && !mod) {
|
||||
mod = dev->GENmodPtr;
|
||||
dev = (GENinstance *)NULL;
|
||||
if (do_model && !mod[0]) {
|
||||
mod[0] = dev[0]->GENmodPtr;
|
||||
dev[1] = (GENinstance *)NULL;
|
||||
}
|
||||
doset(ckt, typecode, dev, mod, opt, val);
|
||||
doset(ckt, typecode, dev[0], mod[0], opt, val);
|
||||
}
|
||||
|
||||
static struct variable *
|
||||
|
|
|
|||
|
|
@ -61,14 +61,10 @@ extern char * nupa_copy(char *s, int linenum);
|
|||
extern int nupa_eval(char *s, int linenum);
|
||||
extern int nupa_signal(int sig, char *info);
|
||||
static char NumParams='y';
|
||||
static char DoGarbage='n';
|
||||
|
||||
#else
|
||||
#define nupa_copy(x,y) copy(x)
|
||||
#define nupa_eval(x,y) 1
|
||||
#define nupa_signal(x,y) 1
|
||||
static char NumParams='n';
|
||||
static char DoGarbage='n';
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -539,4 +539,4 @@ int WIN_DiagramReady()
|
|||
return 0;
|
||||
}
|
||||
|
||||
#endif /* HAS_WINDOWS */
|
||||
#endif /* HAS_WINDOWS */
|
||||
|
|
|
|||
|
|
@ -337,7 +337,7 @@ extern int CKTsenUpdate( CKTcircuit *);
|
|||
extern int CKTsetAnalPm( void *, void *, int , IFvalue *, IFvalue *);
|
||||
extern int CKTsetBreak( CKTcircuit *, double );
|
||||
extern int CKTsetNodPm( void *, void *, int , IFvalue *, IFvalue *);
|
||||
extern int CKTsetOpt( void *, void *, int , IFvalue *);
|
||||
extern int CKTsetOpt( CKTcircuit *, void *, int , IFvalue *);
|
||||
extern int CKTsetup( CKTcircuit *);
|
||||
extern int CKTunsetup(CKTcircuit *);
|
||||
extern int CKTtemp( CKTcircuit *);
|
||||
|
|
|
|||
|
|
@ -78,61 +78,61 @@ extern bool clip_to_circle();
|
|||
/* cmath1.c */
|
||||
|
||||
extern bool cx_degrees;
|
||||
extern void *cx_mag(void *, short int , int , int *, short int *);
|
||||
extern void *cx_ph(void *, short int , int , int *, short int *);
|
||||
extern void *cx_j(void *, short int , int , int *, short int *);
|
||||
extern void *cx_real(void *, short int , int , int *, short int *);
|
||||
extern void *cx_imag(void *, short int , int , int *, short int *);
|
||||
extern void *cx_pos(void *, short int , int , int *, short int *);
|
||||
extern void *cx_db(void *, short int , int , int *, short int *);
|
||||
extern void *cx_log(void *, short int , int , int *, short int *);
|
||||
extern void *cx_ln(void *, short int , int , int *, short int *);
|
||||
extern void *cx_exp(void *, short int , int , int *, short int *);
|
||||
extern void *cx_sqrt(void *, short int , int , int *, short int *);
|
||||
extern void *cx_sin(void *, short int , int , int *, short int *);
|
||||
extern void *cx_cos(void *, short int , int , int *, short int *);
|
||||
extern void *cx_mag(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_ph(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_j(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_real(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_imag(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_pos(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_db(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_log(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_ln(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_exp(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_sqrt(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_sin(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_cos(void *, short int , int , int *, short int *, ...);
|
||||
|
||||
/* cmath2.c */
|
||||
|
||||
extern void *cx_tan(void *, short int , int , int *, short int *);
|
||||
extern void *cx_atan(void *, short int , int , int *, short int *);
|
||||
extern void *cx_norm(void *, short int , int , int *, short int *);
|
||||
extern void *cx_uminus(void *, short int , int , int *, short int *);
|
||||
extern void *cx_rnd(void *, short int , int , int *, short int *);
|
||||
extern void *cx_mean(void *, short int , int , int *, short int *);
|
||||
extern void *cx_length(void *, short int , int , int *, short int *);
|
||||
extern void *cx_vector(void *, short int , int , int *, short int *);
|
||||
extern void *cx_unitvec(void *, short int , int , int *, short int *);
|
||||
extern void *cx_tan(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_atan(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_norm(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_uminus(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_rnd(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_mean(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_length(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_vector(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_unitvec(void *, short int , int , int *, short int *, ...);
|
||||
|
||||
/* Routoure JM : somme useful functions */
|
||||
extern void *cx_min(void *, short int , int , int *, short int *);
|
||||
extern void *cx_max(void *, short int , int , int *, short int *);
|
||||
extern void *cx_d(void *, short int , int , int *, short int *);
|
||||
extern void *cx_min(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_max(void *, short int , int , int *, short int *, ...);
|
||||
extern void *cx_d(void *, short int , int , int *, short int *, ...);
|
||||
|
||||
extern void *cx_plus(void *, void *, short int , short int , int );
|
||||
extern void *cx_minus(void *, void *, short int , short int , int );
|
||||
extern void *cx_times(void *, void *, short int , short int , int );
|
||||
extern void *cx_mod(void *, void *, short int , short int , int );
|
||||
extern void *cx_plus(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_minus(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_times(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_mod(void *, void *, short int , short int , int, ...);
|
||||
|
||||
/* cmath3.c */
|
||||
|
||||
extern void *cx_divide(void *, void *, short int , short int , int );
|
||||
extern void *cx_comma(void *, void *, short int , short int , int );
|
||||
extern void *cx_power(void *, void *, short int , short int , int );
|
||||
extern void *cx_eq(void *, void *, short int , short int , int );
|
||||
extern void *cx_gt(void *, void *, short int , short int , int );
|
||||
extern void *cx_lt(void *, void *, short int , short int , int );
|
||||
extern void *cx_ge(void *, void *, short int , short int , int );
|
||||
extern void *cx_le(void *, void *, short int , short int , int );
|
||||
extern void *cx_ne(void *, void *, short int , short int , int );
|
||||
extern void *cx_divide(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_comma(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_power(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_eq(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_gt(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_lt(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_ge(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_le(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_ne(void *, void *, short int , short int , int, ...);
|
||||
|
||||
/* cmath4.c */
|
||||
|
||||
extern void *cx_and(void *, void *, short int , short int , int );
|
||||
extern void *cx_or(void *, void *, short int , short int , int );
|
||||
extern void *cx_not(void *, short int , int , int *, short int * );
|
||||
extern void *cx_interpolate(void *, short int , int , int *, short int *, struct plot *, struct plot *, int );
|
||||
extern void *cx_deriv(void *, short int , int , int *, short int *, struct plot *, struct plot *, int );
|
||||
extern void *cx_and(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_or(void *, void *, short int , short int , int, ...);
|
||||
extern void *cx_not(void *, short int , int , int *, short int * , ...);
|
||||
extern void *cx_interpolate(void *, short int , int , int *, short int *, ...); /* struct plot *, struct plot *, int ); */
|
||||
extern void *cx_deriv(void *, short int , int , int *, short int *, ...); /*struct plot *, struct plot *, int );*/
|
||||
|
||||
/* cmdtab.c */
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ struct func {
|
|||
|
||||
/* The function. */
|
||||
void *(*fu_func)(void *data, short int type, int length,
|
||||
int *newlength, short int *newtype);
|
||||
int *newlength, short int *newtype, ...);
|
||||
} ;
|
||||
|
||||
/* User-definable functions. The idea of ud_name is that the args are
|
||||
|
|
|
|||
|
|
@ -160,9 +160,9 @@ extern int AsciiRawFile;
|
|||
extern char *Spice_Host;
|
||||
extern char *Spiced_Log;
|
||||
|
||||
extern char Spice_Notice[ ];
|
||||
extern char Spice_Version[ ];
|
||||
extern char Spice_Build_Date[ ];
|
||||
extern char Spice_Version[];
|
||||
extern char Spice_Notice[];
|
||||
extern char Spice_Build_Date[];
|
||||
|
||||
extern char *News_File;
|
||||
extern char *Default_MFB_Cap;
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ c_tan(complex *cc, int length)
|
|||
}
|
||||
|
||||
void *
|
||||
cx_tan(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_tan(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
*newlength = length;
|
||||
if (type == VF_REAL) {
|
||||
|
|
@ -81,7 +81,7 @@ cx_tan(void *data, short int type, int length, int *newlength, short int *newtyp
|
|||
|
||||
|
||||
void *
|
||||
cx_atan(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_atan(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
double *d;
|
||||
|
||||
|
|
@ -131,7 +131,7 @@ cx_max_local(void *data, short int type, int length)
|
|||
/* Normalize the data so that the magnitude of the greatest value is 1. */
|
||||
|
||||
void *
|
||||
cx_norm(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_norm(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
double largest = 0.0;
|
||||
|
||||
|
|
@ -170,7 +170,7 @@ cx_norm(void *data, short int type, int length, int *newlength, short int *newty
|
|||
}
|
||||
|
||||
void *
|
||||
cx_uminus(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_uminus(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
*newlength = length;
|
||||
if (type == VF_COMPLEX) {
|
||||
|
|
@ -199,7 +199,7 @@ cx_uminus(void *data, short int type, int length, int *newlength, short int *new
|
|||
}
|
||||
|
||||
void *
|
||||
cx_rnd(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_rnd(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
*newlength = length;
|
||||
if (type == VF_COMPLEX) {
|
||||
|
|
@ -238,7 +238,7 @@ cx_rnd(void *data, short int type, int length, int *newlength, short int *newtyp
|
|||
/* Compute the mean of a vector. */
|
||||
|
||||
void *
|
||||
cx_mean(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_mean(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
*newlength = 1;
|
||||
rcheck(length > 0, "mean");
|
||||
|
|
@ -272,7 +272,7 @@ cx_mean(void *data, short int type, int length, int *newlength, short int *newty
|
|||
|
||||
|
||||
void *
|
||||
cx_length(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_length(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
double *d;
|
||||
|
||||
|
|
@ -289,7 +289,7 @@ cx_length(void *data, short int type, int length, int *newlength, short int *new
|
|||
|
||||
|
||||
void *
|
||||
cx_vector(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_vector(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
complex *cc = (complex *) data;
|
||||
double *dd = (double *) data;
|
||||
|
|
@ -314,7 +314,7 @@ cx_vector(void *data, short int type, int length, int *newlength, short int *new
|
|||
|
||||
|
||||
void *
|
||||
cx_unitvec(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_unitvec(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
complex *cc = (complex *) data;
|
||||
double *dd = (double *) data;
|
||||
|
|
@ -344,7 +344,7 @@ cx_unitvec(void *data, short int type, int length, int *newlength, short int *ne
|
|||
*/
|
||||
|
||||
void *
|
||||
cx_plus(void *data1, void *data2, short int datatype1, short int datatype2, int length)
|
||||
cx_plus(void *data1, void *data2, short int datatype1, short int datatype2, int length, ...)
|
||||
{
|
||||
double *dd1 = (double *) data1;
|
||||
double *dd2 = (double *) data2;
|
||||
|
|
@ -384,7 +384,7 @@ cx_plus(void *data1, void *data2, short int datatype1, short int datatype2, int
|
|||
}
|
||||
|
||||
void *
|
||||
cx_minus(void *data1, void *data2, short int datatype1, short int datatype2, int length)
|
||||
cx_minus(void *data1, void *data2, short int datatype1, short int datatype2, int length, ...)
|
||||
{
|
||||
double *dd1 = (double *) data1;
|
||||
double *dd2 = (double *) data2;
|
||||
|
|
@ -424,7 +424,7 @@ cx_minus(void *data1, void *data2, short int datatype1, short int datatype2, int
|
|||
}
|
||||
|
||||
void *
|
||||
cx_times(void *data1, void *data2, short int datatype1, short int datatype2, int length)
|
||||
cx_times(void *data1, void *data2, short int datatype1, short int datatype2, int length, ...)
|
||||
{
|
||||
double *dd1 = (double *) data1;
|
||||
double *dd2 = (double *) data2;
|
||||
|
|
@ -466,7 +466,7 @@ cx_times(void *data1, void *data2, short int datatype1, short int datatype2, int
|
|||
}
|
||||
|
||||
void *
|
||||
cx_mod(void *data1, void *data2, short int datatype1, short int datatype2, int length)
|
||||
cx_mod(void *data1, void *data2, short int datatype1, short int datatype2, int length, ...)
|
||||
{
|
||||
double *dd1 = (double *) data1;
|
||||
double *dd2 = (double *) data2;
|
||||
|
|
@ -525,7 +525,7 @@ cx_mod(void *data1, void *data2, short int datatype1, short int datatype2, int l
|
|||
/* Routoure JM : Compute the max of a vector. */
|
||||
|
||||
void *
|
||||
cx_max(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_max(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
*newlength = 1;
|
||||
/* test if length >0 et affiche un message d'erreur */
|
||||
|
|
@ -566,7 +566,7 @@ cx_max(void *data, short int type, int length, int *newlength, short int *newtyp
|
|||
/* Routoure JM : Compute the min of a vector. */
|
||||
|
||||
void *
|
||||
cx_min(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_min(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
*newlength = 1;
|
||||
/* test if length >0 et affiche un message d'erreur */
|
||||
|
|
@ -609,7 +609,7 @@ cx_min(void *data, short int type, int length, int *newlength, short int *newtyp
|
|||
/* Routoure JM : Compute the differential of a vector. */
|
||||
|
||||
void *
|
||||
cx_d(void *data, short int type, int length, int *newlength, short int *newtype)
|
||||
cx_d(void *data, short int type, int length, int *newlength, short int *newtype, ...)
|
||||
{
|
||||
*newlength = length;
|
||||
/* test if length >0 et affiche un message d'erreur */
|
||||
|
|
|
|||
|
|
@ -7,22 +7,22 @@
|
|||
#define CMATH2_H_INCLUDED
|
||||
|
||||
|
||||
void * cx_tan(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_atan(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_norm(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_uminus(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_rnd(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_mean(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_length(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_vector(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_unitvec(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_plus(void *data1, void *data2, short int datatype1, short int datatype2, int length);
|
||||
void * cx_minus(void *data1, void *data2, short int datatype1, short int datatype2, int length);
|
||||
void * cx_times(void *data1, void *data2, short int datatype1, short int datatype2, int length);
|
||||
void * cx_mod(void *data1, void *data2, short int datatype1, short int datatype2, int length);
|
||||
void * cx_max(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_min(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_d(void *data, short int type, int length, int *newlength, short int *newtype);
|
||||
void * cx_tan(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_atan(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_norm(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_uminus(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_rnd(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_mean(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_length(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_vector(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_unitvec(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_plus(void *data1, void *data2, short int datatype1, short int datatype2, int length, ...);
|
||||
void * cx_minus(void *data1, void *data2, short int datatype1, short int datatype2, int length, ...);
|
||||
void * cx_times(void *data1, void *data2, short int datatype1, short int datatype2, int length, ...);
|
||||
void * cx_mod(void *data1, void *data2, short int datatype1, short int datatype2, int length, ...);
|
||||
void * cx_max(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_min(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
void * cx_d(void *data, short int type, int length, int *newlength, short int *newtype, ...);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -185,7 +185,6 @@ spFindElement( void *eMatrix, int Row, int Col )
|
|||
{
|
||||
MatrixPtr Matrix = (MatrixPtr)eMatrix;
|
||||
RealNumber *pElement;
|
||||
int index;
|
||||
ElementPtr spcFindElementInCol();
|
||||
void Translate();
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@
|
|||
* Matrix type and macro definitions for the sparse matrix routines.
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define spINSIDE_SPARSE
|
||||
#include "spconfig.h"
|
||||
|
|
|
|||
|
|
@ -28,7 +28,12 @@ tmalloc(size_t num)
|
|||
s = calloc(num,1);
|
||||
if (!s){
|
||||
fprintf(stderr,
|
||||
"malloc: Internal Error: can't allocate %d bytes. \n", num);
|
||||
#if IS_SIZE_T_LONG
|
||||
"malloc: Internal Error: can't allocate %ld bytes. \n",
|
||||
#else
|
||||
"malloc: Internal Error: can't allocate %d bytes. \n",
|
||||
#endif
|
||||
num);
|
||||
exit(EXIT_BAD);
|
||||
}
|
||||
return(s);
|
||||
|
|
@ -51,8 +56,13 @@ trealloc(void *ptr, size_t num)
|
|||
s = realloc(ptr, num);
|
||||
|
||||
if (!s) {
|
||||
fprintf(stderr,
|
||||
"realloc: Internal Error: can't allocate %d bytes.\n", num);
|
||||
fprintf(stderr,
|
||||
#if IS_SIZE_T_LONG
|
||||
"realloc: Internal Error: can't allocate %ld bytes.\n",
|
||||
#else
|
||||
"realloc: Internal Error: can't allocate %d bytes.\n",
|
||||
#endif
|
||||
num);
|
||||
exit(EXIT_BAD);
|
||||
}
|
||||
return(s);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@
|
|||
* 1999 E. Rouat
|
||||
************/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef STRING_H_INCLUDED
|
||||
#define STRING_H_INCLUDED
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ char *
|
|||
tildexpand(char *string)
|
||||
{
|
||||
char buf[BSIZE_SP];
|
||||
char *result, *k, c;
|
||||
char *result = NULL, *k, c;
|
||||
|
||||
if (!string)
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@ bool cp_interactive = FALSE;
|
|||
|
||||
char *hlp_filelist[] = { "ngspice", 0 };
|
||||
|
||||
extern void ivars();
|
||||
|
||||
int
|
||||
main(int ac, char **av)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ Author: 1990 Jaijeet Roychowdury
|
|||
extern void usage();
|
||||
extern void comments();
|
||||
extern double phi();
|
||||
extern void spErrorMessage(char*, FILE*, char*);
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
|
|
@ -30,7 +31,7 @@ int
|
|||
double l,c,ctot,r=0.0,g=0.0,k=0.0,lm=0.0,cm=0.0,len;
|
||||
unsigned gotl=0,gotc=0,gotr=0,gotg=0,gotk=0,gotcm=0,gotlen=0;
|
||||
unsigned gotname=0, gotnum=0;
|
||||
char *name;
|
||||
char *name = "";
|
||||
double **matrix, **inverse;
|
||||
double *tpeigenvalues, *gammaj;
|
||||
char *options;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
/* Configuration file for nutmeg */
|
||||
#include <config.h>
|
||||
|
||||
#include "conf.h"
|
||||
|
||||
|
||||
/*
|
||||
* Devices
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
/* Configuration file for ng-spice */
|
||||
#include <config.h>
|
||||
|
||||
#include "conf.h"
|
||||
|
||||
/**********
|
||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||
**********/
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ int CKTsenUpdate( CKTcircuit *);
|
|||
int CKTsetAnalPm( void *, void *, int , IFvalue *, IFvalue *);
|
||||
int CKTsetBreak( CKTcircuit *, double );
|
||||
int CKTsetNodPm( void *, void *, int , IFvalue *, IFvalue *);
|
||||
int CKTsetOpt( void *, void *, int , IFvalue *);
|
||||
int CKTsetOpt( CKTcircuit *, void *, int , IFvalue *);
|
||||
int CKTsetup( CKTcircuit *);
|
||||
int CKTunsetup(CKTcircuit *ckt);
|
||||
int CKTtemp( CKTcircuit *);
|
||||
|
|
|
|||
|
|
@ -21,21 +21,21 @@ int
|
|||
CKTmodCrt(void *ckt, int type, void **modfast, IFuid name)
|
||||
{
|
||||
extern SPICEdev **DEVices;
|
||||
GENmodel *mymodfast = NULL;
|
||||
GENmodel *mymodfast[1] = { NULL };
|
||||
int error;
|
||||
|
||||
error = CKTfndMod(ckt,&type,(void**)&mymodfast,name);
|
||||
error = CKTfndMod (ckt, &type, (void**)mymodfast, name);
|
||||
if(error == E_NOMOD) {
|
||||
mymodfast = (GENmodel *)MALLOC(*(DEVices[type]->DEVmodSize));
|
||||
if(mymodfast == (GENmodel *)NULL) return(E_NOMEM);
|
||||
mymodfast->GENmodType = type;
|
||||
mymodfast->GENmodName = name;
|
||||
mymodfast->GENnextModel =(GENmodel *)((CKTcircuit *)ckt)->CKThead[type];
|
||||
((CKTcircuit *)ckt)->CKThead[type]=(GENmodel *)mymodfast;
|
||||
if(modfast) *modfast=(void *)mymodfast;
|
||||
mymodfast[0] = (GENmodel *)MALLOC(*(DEVices[type]->DEVmodSize));
|
||||
if(mymodfast[0] == (GENmodel *)NULL) return(E_NOMEM);
|
||||
mymodfast[0]->GENmodType = type;
|
||||
mymodfast[0]->GENmodName = name;
|
||||
mymodfast[0]->GENnextModel =(GENmodel *)((CKTcircuit *)ckt)->CKThead[type];
|
||||
((CKTcircuit *)ckt)->CKThead[type]=(GENmodel *)mymodfast[0];
|
||||
if(modfast) *modfast=(void *)mymodfast[0];
|
||||
return(OK);
|
||||
} else if (error==0) {
|
||||
if(modfast) *modfast=(void *)mymodfast;
|
||||
if(modfast) *modfast=(void *)mymodfast[0];
|
||||
return(E_EXISTS);
|
||||
} else {
|
||||
return(error);
|
||||
|
|
|
|||
|
|
@ -24,16 +24,16 @@ CKTmkCur(CKTcircuit *ckt, CKTnode **node, IFuid basename, char *suffix)
|
|||
IFuid uid;
|
||||
int error;
|
||||
CKTnode *mynode;
|
||||
CKTnode *checknode;
|
||||
CKTnode *checknode[1];
|
||||
|
||||
error = CKTmkNode(ckt,&mynode);
|
||||
if(error) return(error);
|
||||
checknode = mynode;
|
||||
checknode[0] = mynode;
|
||||
error = (*(SPfrontEnd->IFnewUid))((void *)ckt,&uid,basename,
|
||||
suffix,UID_SIGNAL,(void**)&checknode);
|
||||
suffix,UID_SIGNAL,(void**)checknode);
|
||||
if(error) {
|
||||
FREE(mynode);
|
||||
if(node) *node = checknode;
|
||||
if(node) *node = checknode[0];
|
||||
return(error);
|
||||
}
|
||||
mynode->name = uid;
|
||||
|
|
|
|||
|
|
@ -22,16 +22,16 @@ CKTmkVolt(CKTcircuit *ckt, CKTnode **node, IFuid basename, char *suffix)
|
|||
IFuid uid;
|
||||
int error;
|
||||
CKTnode *mynode;
|
||||
CKTnode *checknode;
|
||||
CKTnode *checknode[1];
|
||||
|
||||
error = CKTmkNode(ckt,&mynode);
|
||||
if(error) return(error);
|
||||
checknode = mynode;
|
||||
checknode[0] = mynode;
|
||||
error = (*(SPfrontEnd->IFnewUid))((void *)ckt,&uid,basename,
|
||||
suffix,UID_SIGNAL,(void**)&checknode);
|
||||
suffix,UID_SIGNAL,(void**)checknode);
|
||||
if(error) {
|
||||
FREE(mynode);
|
||||
if(node) *node = checknode;
|
||||
if(node) *node = checknode[0];
|
||||
return(error);
|
||||
}
|
||||
mynode->name = uid;
|
||||
|
|
|
|||
|
|
@ -522,7 +522,7 @@ CKTpzRunTrial(CKTcircuit *ckt, PZtrial **new_trialp, PZtrial **set)
|
|||
PZtrial *p, *prev;
|
||||
SPcomplex def_frac, diff_frac;
|
||||
double reltol, abstol;
|
||||
int def_mag, diff_mag, error;
|
||||
int def_mag, diff_mag, error = 0;
|
||||
int i;
|
||||
int pretest, shifted, was_shifted;
|
||||
int repeat;
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ int sens_sens(CKTcircuit *ckt, int restart)
|
|||
static int is_dc;
|
||||
int k, j, n;
|
||||
int num_vars, branch_eq=0;
|
||||
char *sen_data=NULL;
|
||||
char *sen_data[1] = {NULL};
|
||||
char namebuf[513];
|
||||
IFuid *output_names, freq_name;
|
||||
int bypass;
|
||||
|
|
@ -187,7 +187,7 @@ int sens_sens(CKTcircuit *ckt, int restart)
|
|||
error = (*SPfrontEnd->OUTpBeginPlot)((void *) ckt,
|
||||
(void *) ckt->CKTcurJob,
|
||||
ckt->CKTcurJob->JOBname, freq_name, IF_REAL, num_vars,
|
||||
output_names, type, (void **) &sen_data);
|
||||
output_names, type, (void **)sen_data);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
@ -199,7 +199,7 @@ int sens_sens(CKTcircuit *ckt, int restart)
|
|||
output_values = NULL;
|
||||
output_cvalues = NEWN(IFcomplex, num_vars);
|
||||
if (sen_info->step_type != SENS_LINEAR)
|
||||
(*(SPfrontEnd->OUTattributes))((void *)sen_data,
|
||||
(*(SPfrontEnd->OUTattributes))((void *)sen_data[0],
|
||||
NULL, OUT_SCALE_LOG, NULL);
|
||||
|
||||
}
|
||||
|
|
@ -562,13 +562,13 @@ int sens_sens(CKTcircuit *ckt, int restart)
|
|||
|
||||
value.rValue = freq;
|
||||
|
||||
(*(SPfrontEnd->OUTpData))(sen_data, &value, &nvalue);
|
||||
(*(SPfrontEnd->OUTpData))(sen_data[0], &value, &nvalue);
|
||||
|
||||
freq = inc_freq(freq, sen_info->step_type, step_size);
|
||||
|
||||
}
|
||||
|
||||
(*SPfrontEnd->OUTendPlot)((void *) sen_data);
|
||||
(*SPfrontEnd->OUTendPlot)((void *) sen_data[0]);
|
||||
|
||||
if (is_dc) {
|
||||
FREE(output_values); /* XXX free various vectors */
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ Modified: 2000 AlansFixes
|
|||
|
||||
/* ARGSUSED */
|
||||
int
|
||||
CKTsetOpt(void *ckt, void *anal, int opt, IFvalue *val)
|
||||
CKTsetOpt(CKTcircuit *ckt, void *anal, int opt, IFvalue *val)
|
||||
{
|
||||
TSKtask *task = (TSKtask *)anal;
|
||||
|
||||
|
|
@ -150,33 +150,33 @@ CKTsetOpt(void *ckt, void *anal, int opt, IFvalue *val)
|
|||
/* gtri - begin - wbk - add new options */
|
||||
#ifdef XSPICE
|
||||
case OPT_EVT_MAX_OP_ALTER:
|
||||
((CKTcircuit *) ckt)->evt->limits.max_op_alternations = val->iValue;
|
||||
ckt->evt->limits.max_op_alternations = val->iValue;
|
||||
break;
|
||||
|
||||
case OPT_EVT_MAX_EVT_PASSES:
|
||||
((CKTcircuit *) ckt)->evt->limits.max_event_passes = val->iValue;
|
||||
ckt->evt->limits.max_event_passes = val->iValue;
|
||||
break;
|
||||
|
||||
case OPT_ENH_NOOPALTER:
|
||||
((CKTcircuit *) ckt)->evt->options.op_alternate = MIF_FALSE;
|
||||
ckt->evt->options.op_alternate = MIF_FALSE;
|
||||
break;
|
||||
|
||||
case OPT_ENH_RAMPTIME:
|
||||
((CKTcircuit *) ckt)->enh->ramp.ramptime = val->rValue;
|
||||
ckt->enh->ramp.ramptime = val->rValue;
|
||||
break;
|
||||
|
||||
case OPT_ENH_CONV_LIMIT:
|
||||
((CKTcircuit *) ckt)->enh->conv_limit.enabled = MIF_TRUE;
|
||||
ckt->enh->conv_limit.enabled = MIF_TRUE;
|
||||
break;
|
||||
|
||||
case OPT_ENH_CONV_STEP:
|
||||
((CKTcircuit *) ckt)->enh->conv_limit.step = val->rValue;
|
||||
((CKTcircuit *) ckt)->enh->conv_limit.enabled = MIF_TRUE;
|
||||
ckt->enh->conv_limit.step = val->rValue;
|
||||
ckt->enh->conv_limit.enabled = MIF_TRUE;
|
||||
break;
|
||||
|
||||
case OPT_ENH_CONV_ABS_STEP:
|
||||
((CKTcircuit *) ckt)->enh->conv_limit.abs_step = val->rValue;
|
||||
((CKTcircuit *) ckt)->enh->conv_limit.enabled = MIF_TRUE;
|
||||
ckt->enh->conv_limit.abs_step = val->rValue;
|
||||
ckt->enh->conv_limit.enabled = MIF_TRUE;
|
||||
break;
|
||||
|
||||
case OPT_MIF_AUTO_PARTIAL:
|
||||
|
|
@ -185,8 +185,8 @@ CKTsetOpt(void *ckt, void *anal, int opt, IFvalue *val)
|
|||
|
||||
case OPT_ENH_RSHUNT:
|
||||
if(val->rValue > 1.0e-30) {
|
||||
((CKTcircuit *) ckt)->enh->rshunt_data.enabled = MIF_TRUE;
|
||||
((CKTcircuit *) ckt)->enh->rshunt_data.gshunt = 1.0 / val->rValue;
|
||||
ckt->enh->rshunt_data.enabled = MIF_TRUE;
|
||||
ckt->enh->rshunt_data.gshunt = 1.0 / val->rValue;
|
||||
}
|
||||
else {
|
||||
printf("WARNING - Rshunt option too small. Ignored.\n");
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ Modified: 2001 AlansFixes
|
|||
#include "sperror.h"
|
||||
#include "vsrc/vsrcdefs.h"
|
||||
#include "isrc/isrcdefs.h"
|
||||
#include "src/maths/ni/niniter.h" /* va, NInzIter */
|
||||
#include "../maths/ni/niniter.h" /* va, NInzIter */
|
||||
|
||||
extern int CKTnoise( CKTcircuit *, int, int, Ndata * );
|
||||
|
||||
|
|
@ -37,7 +37,7 @@ NOISEan (CKTcircuit *ckt, int restart)
|
|||
int code;
|
||||
int step;
|
||||
IFuid freqUid;
|
||||
char *inst;
|
||||
char *inst[1];
|
||||
double freqTol; /* tolerence parameter for finding final frequency; hack */
|
||||
|
||||
NOISEAN *job = (NOISEAN*) (ckt->CKTcurJob);
|
||||
|
|
@ -47,12 +47,12 @@ NOISEan (CKTcircuit *ckt, int restart)
|
|||
negOutNode = ((CKTnode*) (job->outputRef))->number;
|
||||
|
||||
/* see if the source specified is AC */
|
||||
inst = NULL;
|
||||
inst[0] = NULL;
|
||||
code = CKTtypelook("Vsource");
|
||||
if (code != -1) {
|
||||
error = CKTfndDev((void *)ckt,&code,(void **)&inst,
|
||||
error = CKTfndDev((void *)ckt, &code,(void **)inst,
|
||||
job->input, (void *)NULL, (IFuid)NULL);
|
||||
if (!error && !((VSRCinstance *)inst)->VSRCacGiven) {
|
||||
if (!error && !((VSRCinstance *)inst[0])->VSRCacGiven) {
|
||||
errMsg = MALLOC(strlen(noacinput)+1);
|
||||
strcpy(errMsg,noacinput);
|
||||
return (E_NOACINPUT);
|
||||
|
|
@ -60,8 +60,8 @@ NOISEan (CKTcircuit *ckt, int restart)
|
|||
}
|
||||
|
||||
code = CKTtypelook("Isource");
|
||||
if (code != -1 && inst==NULL) {
|
||||
error = CKTfndDev((void *)ckt,&code, (void **)&inst,
|
||||
if (code != -1 && inst[0]==NULL) {
|
||||
error = CKTfndDev((void *)ckt,&code, (void **)inst,
|
||||
job->input, (void *)NULL,(IFuid)NULL);
|
||||
if (error) {
|
||||
/* XXX ??? */
|
||||
|
|
@ -70,7 +70,7 @@ NOISEan (CKTcircuit *ckt, int restart)
|
|||
&job->input);
|
||||
return (E_NOTFOUND);
|
||||
}
|
||||
if (!((ISRCinstance *)inst)->ISRCacGiven) {
|
||||
if (!((ISRCinstance *)inst[0])->ISRCacGiven) {
|
||||
errMsg = MALLOC(strlen(noacinput)+1);
|
||||
strcpy(errMsg,noacinput);
|
||||
return (E_NOACINPUT);
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ TFanal(CKTcircuit *ckt, int restart)
|
|||
/* forced restart flag */
|
||||
{
|
||||
int size;
|
||||
int insrc,outsrc;
|
||||
int insrc = 0, outsrc = 0;
|
||||
double outputs[3];
|
||||
IFvalue outdata; /* structure for output data vector, will point to
|
||||
* outputs vector above */
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@ Author: 1988 Jaijeet S Roychowdhury
|
|||
|
||||
/* actually load the current resistance value into the sparse matrix
|
||||
* previously provided */
|
||||
int
|
||||
BJTdSetup(GENmodel *inModel, CKTcircuit *ckt)
|
||||
void TanDeriv(Dderivs *new, Dderivs *old);
|
||||
int BJTdSetup(GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
BJTmodel *model = (BJTmodel*)inModel;
|
||||
BJTinstance *here;
|
||||
|
|
|
|||
|
|
@ -31,10 +31,10 @@ BJTsAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double vbeOp;
|
||||
double vbcOp;
|
||||
double A0;
|
||||
double DELA;
|
||||
double DELA = 0.0;
|
||||
double Apert;
|
||||
double DELAinv;
|
||||
double vte;
|
||||
double vte = 0.0;
|
||||
double gcpr;
|
||||
double gepr;
|
||||
double gpi;
|
||||
|
|
@ -78,7 +78,7 @@ BJTsAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double ce0,ice0;
|
||||
double ceprm0,iceprm0;
|
||||
double cs0,ics0;
|
||||
double DvDp;
|
||||
double DvDp = 0.0;
|
||||
int iparmno,i;
|
||||
SENstruct *info;
|
||||
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
/* loop through all the instances of the model */
|
||||
for (here = model->BJTinstances; here != NULL ;
|
||||
here=here->BJTnextInstance) {
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
if (here->BJTowner != ARCHme)
|
||||
|
|
@ -176,10 +176,10 @@ matrixpointers:
|
|||
if(error) return(error);
|
||||
here->BJTcolPrimeNode = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void**)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
/* fprintf(stderr, "Nodeset copied from %s\n", tmpName);
|
||||
fprintf(stderr, " to %s\n", tmp->name);
|
||||
fprintf(stderr, " value %g\n",
|
||||
|
|
@ -195,10 +195,10 @@ matrixpointers:
|
|||
if(error) return(error);
|
||||
here->BJTbasePrimeNode = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,2,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
/* fprintf(stderr, "Nodeset copied from %s\n", tmpName);
|
||||
fprintf(stderr, " to %s\n", tmp->name);
|
||||
fprintf(stderr, " value %g\n",
|
||||
|
|
@ -214,10 +214,10 @@ matrixpointers:
|
|||
if(error) return(error);
|
||||
here->BJTemitPrimeNode = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
/* fprintf(stderr, "Nodeset copied from %s\n", tmpName);
|
||||
fprintf(stderr, " to %s\n", tmp->name);
|
||||
fprintf(stderr, " value %g\n",
|
||||
|
|
|
|||
|
|
@ -60,10 +60,10 @@ BJTsLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double qcs;
|
||||
double qbx0;
|
||||
double qbx;
|
||||
double DqbeDp;
|
||||
double DqbcDp;
|
||||
double DqcsDp;
|
||||
double DqbxDp;
|
||||
double DqbeDp = 0.0;
|
||||
double DqbcDp = 0.0;
|
||||
double DqcsDp = 0.0;
|
||||
double DqbxDp = 0.0;
|
||||
double Osxpbe;
|
||||
double Osxpbc;
|
||||
double Osxpcs;
|
||||
|
|
|
|||
|
|
@ -25,18 +25,18 @@ BJT2disto(int mode, GENmodel *genmodel, CKTcircuit *ckt)
|
|||
double r1h1x,i1h1x;
|
||||
double r1h1y,i1h1y;
|
||||
double r1h1z, i1h1z;
|
||||
double r1h2x, i1h2x;
|
||||
double r1h2y, i1h2y;
|
||||
double r1h2z, i1h2z;
|
||||
double r1hm2x,i1hm2x;
|
||||
double r1hm2y,i1hm2y;
|
||||
double r1hm2z, i1hm2z;
|
||||
double r2h11x,i2h11x;
|
||||
double r2h11y,i2h11y;
|
||||
double r2h11z, i2h11z;
|
||||
double r2h1m2x,i2h1m2x;
|
||||
double r2h1m2y,i2h1m2y;
|
||||
double r2h1m2z, i2h1m2z;
|
||||
double r1h2x = 0.0, i1h2x = 0.0;
|
||||
double r1h2y = 0.0, i1h2y = 0.0;
|
||||
double r1h2z = 0.0, i1h2z = 0.0;
|
||||
double r1hm2x = 0.0,i1hm2x = 0.0;
|
||||
double r1hm2y = 0.0,i1hm2y = 0.0;
|
||||
double r1hm2z = 0.0, i1hm2z = 0.0;
|
||||
double r2h11x = 0.0,i2h11x = 0.0;
|
||||
double r2h11y = 0.0,i2h11y = 0.0;
|
||||
double r2h11z = 0.0, i2h11z = 0.0;
|
||||
double r2h1m2x = 0.0,i2h1m2x = 0.0;
|
||||
double r2h1m2y = 0.0,i2h1m2y = 0.0;
|
||||
double r2h1m2z = 0.0, i2h1m2z = 0.0;
|
||||
double temp, itemp;
|
||||
register BJT2instance *here;
|
||||
#ifdef DISTODEBUG
|
||||
|
|
|
|||
|
|
@ -17,9 +17,8 @@ Modified: Alan Gillespie
|
|||
* This function initialises the Taylor coeffs for the
|
||||
* BJT2's in the circuit
|
||||
*/
|
||||
|
||||
int
|
||||
BJT2dSetup(GENmodel *inModel, CKTcircuit *ckt)
|
||||
void TanDeriv(Dderivs *new, Dderivs *old);
|
||||
int BJT2dSetup(GENmodel *inModel, CKTcircuit *ckt)
|
||||
/* actually load the current resistance value into the
|
||||
* sparse matrix previously provided
|
||||
*/
|
||||
|
|
@ -31,7 +30,7 @@ BJT2dSetup(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double c4;
|
||||
double lcapbe1,lcapbe2,lcapbe3;
|
||||
double lcapbx1,lcapbx2,lcapbx3;
|
||||
double cb;
|
||||
double cb = 0.0;
|
||||
double cbc;
|
||||
double cbcn;
|
||||
double cbe;
|
||||
|
|
@ -55,7 +54,7 @@ BJT2dSetup(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double f3;
|
||||
double fcpc;
|
||||
double fcpe;
|
||||
double gbb1;
|
||||
double gbb1 = 0.0;
|
||||
double gbc;
|
||||
double gbcn;
|
||||
double gbe;
|
||||
|
|
@ -64,7 +63,7 @@ BJT2dSetup(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double gben2,gben3;
|
||||
double gbcn2,gbcn3;
|
||||
double gben;
|
||||
double gbb2, gbb3;
|
||||
double gbb2 = 0.0, gbb3 = 0.0;
|
||||
double oik;
|
||||
double oikr;
|
||||
double ovtf;
|
||||
|
|
@ -233,7 +232,7 @@ for( ; model != NULL; model = model->BJT2nextModel ) {
|
|||
/*
|
||||
* determine dc current and derivitives
|
||||
*/
|
||||
next1: vtn=vt*model->BJT2emissionCoeffF;
|
||||
vtn=vt*model->BJT2emissionCoeffF;
|
||||
if(vbe > -5*vtn){
|
||||
evbe=exp(vbe/vtn);
|
||||
cbe=csat*(evbe-1)+ckt->CKTgmin*vbe;
|
||||
|
|
|
|||
|
|
@ -109,13 +109,12 @@ BJT2load(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double td;
|
||||
double temp;
|
||||
double tf;
|
||||
double tol;
|
||||
double tr;
|
||||
double vbc;
|
||||
double vbe;
|
||||
double vbx;
|
||||
double vbx = 0.0;
|
||||
double vce;
|
||||
double vsub;
|
||||
double vsub = 0.0;
|
||||
double vt;
|
||||
double vtc;
|
||||
double vte;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ BJT2noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt,
|
|||
double tempInoise;
|
||||
double noizDens[BJT2NSRCS];
|
||||
double lnNdens[BJT2NSRCS];
|
||||
int error;
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
|
|
|
|||
|
|
@ -32,10 +32,10 @@ BJT2sAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double vbeOp;
|
||||
double vbcOp;
|
||||
double A0;
|
||||
double DELA;
|
||||
double DELA = 0.0;
|
||||
double Apert;
|
||||
double DELAinv;
|
||||
double vte;
|
||||
double vte = 0.0;
|
||||
double gcpr;
|
||||
double gepr;
|
||||
double gpi;
|
||||
|
|
@ -79,7 +79,7 @@ BJT2sAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double ce0,ice0;
|
||||
double ceprm0,iceprm0;
|
||||
double cs0,ics0;
|
||||
double DvDp;
|
||||
double DvDp = 0.0;
|
||||
int iparmno,i;
|
||||
SENstruct *info;
|
||||
|
||||
|
|
@ -155,7 +155,7 @@ BJT2sAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
|
||||
/* store the unperturbed values of small signal parameters */
|
||||
|
||||
if(error = BJT2load((GENmodel*)model,ckt)) return(error);
|
||||
if ((error = BJT2load((GENmodel*)model,ckt))) return(error);
|
||||
|
||||
*(here->BJT2senGpi)= *(ckt->CKTstate0 + here->BJT2gpi);
|
||||
*(here->BJT2senGmu)= *(ckt->CKTstate0 + here->BJT2gmu);
|
||||
|
|
@ -271,7 +271,7 @@ BJT2sAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
/* store the small signal parameters
|
||||
* corresponding to perturbed area
|
||||
*/
|
||||
if(error = BJT2load((GENmodel*)model,ckt)) return(error);
|
||||
if ((error = BJT2load((GENmodel*)model,ckt))) return(error);
|
||||
|
||||
*(here->BJT2senGpi + 1)= *(ckt->CKTstate0 + here->BJT2gpi);
|
||||
*(here->BJT2senGmu + 1)= *(ckt->CKTstate0 + here->BJT2gmu);
|
||||
|
|
@ -310,7 +310,7 @@ pertvbx: /* Perturbation of vbx */
|
|||
/* store the small signal parameters
|
||||
* corresponding to perturbed vbx
|
||||
*/
|
||||
if(error = BJT2load((GENmodel*)model,ckt)) return(error);
|
||||
if((error = BJT2load((GENmodel*)model,ckt))) return(error);
|
||||
|
||||
*(here->BJT2senGpi + 2)= *(ckt->CKTstate0 + here->BJT2gpi);
|
||||
*(here->BJT2senGmu + 2)= *(ckt->CKTstate0 + here->BJT2gmu);
|
||||
|
|
@ -349,7 +349,7 @@ pertvbe: /* Perturbation of vbe */
|
|||
/* store the small signal parameters
|
||||
* corresponding to perturbed vbe
|
||||
*/
|
||||
if(error = BJT2load((GENmodel*)model,ckt)) return(error);
|
||||
if((error = BJT2load((GENmodel*)model,ckt))) return(error);
|
||||
|
||||
*(here->BJT2senGpi + 3)= *(ckt->CKTstate0 + here->BJT2gpi);
|
||||
*(here->BJT2senGmu + 3)= *(ckt->CKTstate0 + here->BJT2gmu);
|
||||
|
|
@ -391,7 +391,7 @@ pertvbc: /* Perturbation of vbc */
|
|||
/* store the small signal parameters
|
||||
* corresponding to perturbed vbc
|
||||
*/
|
||||
if(error = BJT2load((GENmodel*)model,ckt)) return(error);
|
||||
if((error = BJT2load((GENmodel*)model,ckt))) return(error);
|
||||
*(here->BJT2senGpi + 4)= *(ckt->CKTstate0 + here->BJT2gpi);
|
||||
*(here->BJT2senGmu + 4)= *(ckt->CKTstate0 + here->BJT2gmu);
|
||||
*(here->BJT2senGm + 4)= *(ckt->CKTstate0 + here->BJT2gm);
|
||||
|
|
@ -430,7 +430,7 @@ pertvcs: /* Perturbation of vcs */
|
|||
/* store the small signal parameters
|
||||
* corresponding to perturbed vcs
|
||||
*/
|
||||
if(error = BJT2load((GENmodel*)model,ckt)) return(error);
|
||||
if((error = BJT2load((GENmodel*)model,ckt))) return(error);
|
||||
*(here->BJT2senCsub + 5)= *(ckt->CKTstate0 + here->BJT2cqsub);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ BJT2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
/* loop through all the instances of the model */
|
||||
for (here = model->BJT2instances; here != NULL ;
|
||||
here=here->BJT2nextInstance) {
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
if (here->BJT2owner != ARCHme)
|
||||
|
|
@ -220,10 +220,10 @@ matrixpointers:
|
|||
if(error) return(error);
|
||||
here->BJT2colPrimeNode = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
/* fprintf(stderr, "Nodeset copied from %s\n", tmpName);
|
||||
fprintf(stderr, " to %s\n", tmp->name);
|
||||
fprintf(stderr, " value %g\n",
|
||||
|
|
@ -239,10 +239,10 @@ matrixpointers:
|
|||
if(error) return(error);
|
||||
here->BJT2basePrimeNode = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,2,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
/* fprintf(stderr, "Nodeset copied from %s\n", tmpName);
|
||||
fprintf(stderr, " to %s\n", tmp->name);
|
||||
fprintf(stderr, " value %g\n",
|
||||
|
|
@ -258,10 +258,10 @@ matrixpointers:
|
|||
if(error) return(error);
|
||||
here->BJT2emitPrimeNode = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
/* fprintf(stderr, "Nodeset copied from %s\n", tmpName);
|
||||
fprintf(stderr, " to %s\n", tmp->name);
|
||||
fprintf(stderr, " value %g\n",
|
||||
|
|
|
|||
|
|
@ -61,10 +61,10 @@ BJT2sLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double qcs;
|
||||
double qbx0;
|
||||
double qbx;
|
||||
double DqbeDp;
|
||||
double DqbcDp;
|
||||
double DqcsDp;
|
||||
double DqbxDp;
|
||||
double DqbeDp = 0.0;
|
||||
double DqbcDp = 0.0;
|
||||
double DqcsDp = 0.0;
|
||||
double DqbxDp = 0.0;
|
||||
double Osxpbe;
|
||||
double Osxpbc;
|
||||
double Osxpcs;
|
||||
|
|
|
|||
|
|
@ -27,18 +27,18 @@ B1evaluate(double vds, double vbs, double vgs, B1instance *here, B1model *model,
|
|||
double gm;
|
||||
double gds;
|
||||
double gmbs;
|
||||
double qg;
|
||||
double qb;
|
||||
double qd;
|
||||
double cggb;
|
||||
double cgdb;
|
||||
double cgsb;
|
||||
double cbgb;
|
||||
double cbdb;
|
||||
double cbsb;
|
||||
double cdgb;
|
||||
double cddb;
|
||||
double cdsb;
|
||||
double qg = 0.0;
|
||||
double qb = 0.0;
|
||||
double qd = 0.0;
|
||||
double cggb = 0.0;
|
||||
double cgdb = 0.0;
|
||||
double cgsb = 0.0;
|
||||
double cbgb = 0.0;
|
||||
double cbdb = 0.0;
|
||||
double cbsb = 0.0;
|
||||
double cdgb = 0.0;
|
||||
double cddb = 0.0;
|
||||
double cdsb = 0.0;
|
||||
double Vfb;
|
||||
double Phi;
|
||||
double K1;
|
||||
|
|
@ -83,7 +83,7 @@ B1evaluate(double vds, double vbs, double vgs, B1instance *here, B1model *model,
|
|||
double dBetadVgs;
|
||||
double dBetadVds;
|
||||
double dBetadVbs;
|
||||
double VdsSat;
|
||||
double VdsSat = 0.0;
|
||||
double Argl1;
|
||||
double Argl2;
|
||||
double Vc;
|
||||
|
|
|
|||
|
|
@ -273,7 +273,7 @@ B1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
|||
for (here = model->B1instances; here != NULL ;
|
||||
here=here->B1nextInstance) {
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
if (here->B1owner == ARCHme) {
|
||||
|
|
@ -334,10 +334,10 @@ B1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
|||
if(error) return(error);
|
||||
here->B1dNodePrime = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -354,10 +354,10 @@ B1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
|||
if(error) return(error);
|
||||
here->B1sNodePrime = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,16 +21,17 @@ B2evaluate(double Vds, double Vbs, double Vgs, B2instance *here, B2model *model,
|
|||
double *cdg, double *cdd, double *cds, double *Ids, double *von,
|
||||
double *vdsat, CKTcircuit *ckt)
|
||||
{
|
||||
double Vth, Vdsat;
|
||||
double Vth, Vdsat = 0.0;
|
||||
double Phisb, T1s, Eta, Gg, Aa, Inv_Aa, U1, U1s, Vc, Kk, SqrtKk;
|
||||
double dPhisb_dVb, dT1s_dVb, dVth_dVb, dVth_dVd, dAa_dVb, dVc_dVd;
|
||||
double dVc_dVg, dVc_dVb, dKk_dVc, dVdsat_dVd, dVdsat_dVg, dVdsat_dVb;
|
||||
double dVc_dVg, dVc_dVb, dKk_dVc;
|
||||
double dVdsat_dVd = 0.0, dVdsat_dVg = 0.0, dVdsat_dVb = 0.0;
|
||||
double dUvert_dVg, dUvert_dVd, dUvert_dVb, Inv_Kk;
|
||||
double dUtot_dVd, dUtot_dVb, dUtot_dVg, Ai, Bi, Vghigh, Vglow, Vgeff, Vof;
|
||||
double Vbseff, Vgst, Vgdt, Qbulk, Utot;
|
||||
double T0, T1, T2, T3, T4, T5, Arg1, Arg2, Exp0;
|
||||
double tmp, tmp1, tmp2, tmp3, Uvert, Beta1, Beta2, Beta0, dGg_dVb, Exp1;
|
||||
double T6, T7, T8, T9, n, ExpArg, ExpArg1;
|
||||
double T0, T1, T2, T3, T4, T5, Arg1, Arg2, Exp0 = 0.0, Exp1 = 0.0;
|
||||
double tmp, tmp1, tmp2, tmp3, Uvert, Beta1, Beta2, Beta0, dGg_dVb;
|
||||
double T6, T7, T8, T9, n = 0.0, ExpArg, ExpArg1;
|
||||
double Beta, dQbulk_dVb, dVgdt_dVg, dVgdt_dVd;
|
||||
double dVbseff_dVb, Ua, Ub, dVgdt_dVb, dQbulk_dVd;
|
||||
double Con1, Con3, Con4, SqrVghigh, SqrVglow, CubVghigh, CubVglow;
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ B2load(GENmodel *inModel, CKTcircuit *ckt)
|
|||
double DrainPerimeter;
|
||||
double SourcePerimeter;
|
||||
double arg;
|
||||
double capbd;
|
||||
double capbs;
|
||||
double capbd = 0.0;
|
||||
double capbs = 0.0;
|
||||
double cbd;
|
||||
double cbhat;
|
||||
double cbs;
|
||||
|
|
|
|||
|
|
@ -493,13 +493,13 @@ B2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
if(error) return(error);
|
||||
here->B2dNodePrime = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -517,13 +517,13 @@ B2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
return(error);
|
||||
here->B2sNodePrime = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,8 @@ double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
|
|||
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
|
||||
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs;
|
||||
double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, xcqbb;
|
||||
double dxpart, sxpart, xgtg, xgtd, xgts, xgtb;
|
||||
double xcqgb = 0.0, xcqdb = 0.0, xcqsb = 0.0, xcqbb = 0.0;
|
||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
|
||||
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||
double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs;
|
||||
|
|
|
|||
|
|
@ -42,13 +42,14 @@ double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
|||
double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd = 0.0, dVfbeff_dVb, V3, V4;
|
||||
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb;
|
||||
double gcsgb, gcssb, MJ, MJSW, MJSWG;
|
||||
double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
|
||||
double qgate, qbulk, qdrn, qsrc, qinoi, cqgate, cqbulk, cqdrn;
|
||||
double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc;
|
||||
double qinoi, cqgate, cqbulk, cqdrn;
|
||||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd;
|
||||
double Vgs_eff, Vfb, dVfb_dVb = 0.0, dVfb_dVd = 0.0;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd;
|
||||
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm;
|
||||
double Vtm;
|
||||
|
|
@ -107,8 +108,8 @@ double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
|||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
||||
double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift;
|
||||
double gcqdb,gcqsb,gcqgb,gcqbb;
|
||||
double qcheq = 0.0, qdef, gqdef = 0.0, cqdef, cqcheq, gtau_diff, gtau_drift;
|
||||
double gcqdb = 0.0,gcqsb = 0.0, gcqgb = 0.0,gcqbb = 0.0;
|
||||
double dxpart, sxpart, ggtg, ggtd, ggts, ggtb;
|
||||
double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs;
|
||||
double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs;
|
||||
|
|
@ -118,7 +119,8 @@ double gbdpdp, gbdpg, gbdpb, gbdpsp;
|
|||
double Cgg, Cgd, Cgb, Cdg, Cdd, Cds;
|
||||
double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0;
|
||||
double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb;
|
||||
double dQac0_dVg, dQac0_dVd = 0.0, dQac0_dVb, dQsub0_dVg;
|
||||
double dQsub0_dVd, dQsub0_dVb;
|
||||
|
||||
double m;
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb;
|
|||
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, Gm, Gmbs;
|
||||
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap;
|
||||
double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, xcqbb;
|
||||
double dxpart, sxpart, xgtg, xgtd, xgts, xgtb;
|
||||
double xcqgb = 0.0, xcqdb = 0.0, xcqsb = 0.0, xcqbb = 0.0;
|
||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
|
||||
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||
double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs;
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ BSIM3instance *here;
|
|||
int error;
|
||||
CKTnode *tmp;
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
/* loop through all the BSIM3 device models */
|
||||
|
|
@ -947,10 +947,10 @@ IFuid tmpName;
|
|||
here->BSIM3dNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -976,10 +976,10 @@ IFuid tmpName;
|
|||
here->BSIM3sNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ double gbbg, gbbdp, gbbb, gbbp, gbbsp, gbbT;
|
|||
double gddpg, gddpdp, gddpsp, gddpb, gddpT;
|
||||
double gsspg, gsspdp, gsspsp, gsspb, gsspT;
|
||||
double gppb, gppp;
|
||||
double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTtdp, gTtsp;
|
||||
double xcTt, cTt, gTtt, gTtg, gTtb, gTtdp, gTtsp;
|
||||
double EDextrinsicCap, ESextrinsicCap;
|
||||
double xcedb, xcesb;
|
||||
|
||||
|
|
|
|||
|
|
@ -94,13 +94,13 @@ B3SOImodel *model = (B3SOImodel*)inModel;
|
|||
B3SOIinstance *here;
|
||||
int selfheat;
|
||||
|
||||
double SourceSatCurrent, DrainSatCurrent, Gmin;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double Gmin;
|
||||
double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst = 0.0;
|
||||
double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double evbd, evbs, arg, sarg;
|
||||
double arg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double tol, PhiB, PhiBSWG, MJSWG;
|
||||
double PhiBSWG, MJSWG;
|
||||
double gcgdb, gcggb, gcgsb, gcgeb, gcgT;
|
||||
double gcsdb, gcsgb, gcssb, gcseb, gcsT;
|
||||
double gcddb, gcdgb, gcdsb, gcdeb, gcdT;
|
||||
|
|
@ -110,50 +110,45 @@ double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp;
|
|||
double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
|
||||
double vg, vd, vs, vp, ve, vb;
|
||||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT;
|
||||
double Vgs_eff, Vfb = 0.0, dVfb_dVb, dVfb_dVd, dVfb_dT;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT;
|
||||
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm;
|
||||
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm;
|
||||
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg;
|
||||
double n, dn_dVb, Vtm;
|
||||
double ExpArg, V0;
|
||||
double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;
|
||||
double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0;
|
||||
double Esat, Vdsat;
|
||||
double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat, dAlphaz_dVg, dAlphaz_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT;
|
||||
double Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
|
||||
double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
|
||||
double Vbseff, dVbseff_dVb;
|
||||
double Alphaz, CoxWL;
|
||||
double dVgdt_dVg, dVgdt_dVd, dVgdt_dVb;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVrg, dT0_dT;
|
||||
double CoxWL;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dT;
|
||||
double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT;
|
||||
double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT;
|
||||
double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dT;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT;
|
||||
double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT;
|
||||
double T7, dT7_dVg, dT7_dVd, dT7_dVb;
|
||||
double T8, dT8_dVg, dT8_dVd, dT8_dVb, dT8_dVrg;
|
||||
double T9, dT9_dVg, dT9_dVd, dT9_dVb, dT9_dVrg;
|
||||
double T10, dT10_dVg, dT10_dVb, dT10_dVd;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT = 0.0;
|
||||
double T4, dT4_dVd, dT4_dVb, dT4_dT;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT = 0.0;
|
||||
double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT = 0.0;
|
||||
double T7;
|
||||
double T8, dT8_dVd;
|
||||
double T9, dT9_dVd;
|
||||
double T10, dT10_dVb, dT10_dVd;
|
||||
double T11, T12;
|
||||
double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double T100, T101;
|
||||
double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT;
|
||||
double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT;
|
||||
double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb;
|
||||
double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb;
|
||||
double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT;
|
||||
double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb;
|
||||
double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg;
|
||||
double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb;
|
||||
double dRout_Vgs_factor_dVd;
|
||||
double tempv, a1;
|
||||
double Theta0, dTheta0_dVb;
|
||||
double TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg;
|
||||
double a1;
|
||||
|
||||
double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT;
|
||||
double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;
|
||||
double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
|
||||
double diffVds, diffVdsCV;
|
||||
double diffVds;
|
||||
double dAbulk_dVg, dn_dVd ;
|
||||
double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT;
|
||||
double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT;
|
||||
|
|
@ -163,7 +158,7 @@ double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT;
|
|||
double Ids, Gm, Gds, Gmb;
|
||||
double CoxWovL;
|
||||
double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds;
|
||||
double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
|
@ -171,42 +166,39 @@ double qgdo, qgso, cgdo, cgso;
|
|||
double dxpart, sxpart;
|
||||
|
||||
struct b3soiSizeDependParam *pParam;
|
||||
int ByPass, Check, ChargeComputationNeeded, J, error, I;
|
||||
double junk[50];
|
||||
int ByPass, Check, ChargeComputationNeeded = 0, error;
|
||||
|
||||
double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT;
|
||||
double gddpsp, gddpdp, gddpg, gddpb, gddpT;
|
||||
double gsspsp, gsspdp, gsspg, gsspb, gsspT;
|
||||
double Gbpbs, Gbpps;
|
||||
double vse, vde, ves, ved, veb, vge, delves, vedo, delved;
|
||||
double ves, ved, veb, vge = 0.0, delves, vedo, delved;
|
||||
double vps, vpd, Vps, delvps;
|
||||
double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT;
|
||||
double Vbd, Ves, Vesfb, DeltVthtemp, dDeltVthtemp_dT;
|
||||
double Vbp, dVbp_dVb;
|
||||
double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT;
|
||||
double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT;
|
||||
double dDIBL_Sft_dVb;
|
||||
double diffVdsii ;
|
||||
double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg;
|
||||
double Gjsd, Gjss, Gjsb, GjsT, Gjdd, Gjdb, GjdT;
|
||||
double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT;
|
||||
double Ibp, Iii, Giid, Giig, Giib, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon;
|
||||
double gppb, gppp;
|
||||
double delTemp, deldelTemp, Temp;
|
||||
double ceqth, ceqqth;
|
||||
double K1, WL;
|
||||
double qjs, gcjsbs, gcjsT;
|
||||
double qjd, gcjdbs, gcjdds, gcjdT;
|
||||
double K1;
|
||||
double qjs = 0.0, gcjsbs, gcjsT;
|
||||
double qjd = 0.0, gcjdbs, gcjdds, gcjdT;
|
||||
double qge;
|
||||
double ceqqe;
|
||||
double ni, Eg, Cbox, Nfb, CboxWL;
|
||||
double ni, Eg, Cbox, CboxWL;
|
||||
double cjsbs;
|
||||
double dVfbeff_dVrg;
|
||||
double qinv, qgate, qbody, qdrn, qsrc, qsub, cqgate, cqbody, cqdrn, cqsub, cqtemp;
|
||||
double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd;
|
||||
double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb;
|
||||
double qinv, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0;
|
||||
double cqgate, cqbody, cqdrn, cqsub, cqtemp;
|
||||
double Cgg, Cgd, Cgb;
|
||||
double Csg, Csd, Csb, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1;
|
||||
double Vbseff0;
|
||||
double Vdsatii ,dVdsatii_dVg ,dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT;
|
||||
double Ibjt ,dIbjt_dVb ,dIbjt_dVd ,dIbjt_dT;
|
||||
double Vdsatii;
|
||||
double Ibs1 ,dIbs1_dVb ,dIbs1_dT;
|
||||
double Ibs2 ,dIbs2_dVb ,dIbs2_dT;
|
||||
double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT;
|
||||
|
|
@ -215,31 +207,25 @@ double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT;
|
|||
double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT;
|
||||
double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT;
|
||||
double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT;
|
||||
double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT;
|
||||
double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT;
|
||||
double ExpVbs4, dExpVbs4_dVb, dExpVbs4_dT;
|
||||
double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT;
|
||||
double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT;
|
||||
double ExpVbd4, dExpVbd4_dVb, dExpVbd4_dT;
|
||||
double WTsi, NVtm1, NVtm2;
|
||||
double Ic ,dIc_dVb ,dIc_dVd;
|
||||
double Ibs ,dIbs_dVb ,dIbs_dVd ;
|
||||
double Ibd ,dIbd_dVb;
|
||||
double Ibs;
|
||||
double Ibd;
|
||||
double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT;
|
||||
double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ;
|
||||
double Qac0 ,dQac0_dVb ,dQac0_dVd;
|
||||
double Qdep0 ,dQdep0_dVb;
|
||||
double Qsub0 = 0.0, dQsub0_dVg, dQsub0_dVb, dQsub0_dVd ;
|
||||
double Qac0 = 0.0 ,dQac0_dVb ,dQac0_dVd;
|
||||
double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT;
|
||||
double Ce1b ,Ce1e, Ce1T;
|
||||
double dQac0_dVrg, dQsub0_dVrg;
|
||||
|
||||
/* for self-heating */
|
||||
double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, u0temp, vsattemp;
|
||||
double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun;
|
||||
double u0temp, vsattemp;
|
||||
double rds0, ua, ub, uc;
|
||||
double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT;
|
||||
double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT;
|
||||
double dVfbeff_dT, dQac0_dT, dQsub0_dT;
|
||||
double CbT, CsT, CgT, CeT;
|
||||
double CbT, CsT, CgT;
|
||||
|
||||
|
||||
/* v2.0 release */
|
||||
|
|
@ -249,14 +235,15 @@ double T13, T14;
|
|||
double dT11_dVb, dT13_dVb, dT14_dVb;
|
||||
double dVgst_dVd;
|
||||
double Vdsatii0, dVdsatii0_dT;
|
||||
double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT, dTempRatio_dT;
|
||||
double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd;
|
||||
double dRatio_dT, dTempRatio_dT;
|
||||
double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT;
|
||||
double dNVtm1_dT, dNVtm2_dT;
|
||||
double dNVtm1_dT;
|
||||
double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT;
|
||||
double TempRatioMinus1;
|
||||
double Ahli, dAhli_dT;
|
||||
double WsTsi, WdTsi;
|
||||
double dPhiBSWG_dT, dcjsbs_dT, darg_dT, ddT3_dVb_dT;
|
||||
double dPhiBSWG_dT, dcjsbs_dT, darg_dT = 0.0, ddT3_dVb_dT = 0.0;
|
||||
double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7;
|
||||
double CoxWLb, CoxWLcenb;
|
||||
double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT;
|
||||
|
|
@ -274,14 +261,18 @@ double cjdbs, dcjdbs_dT;
|
|||
double wdios, wdiod, wdiosCV, wdiodCV;
|
||||
|
||||
/* for capMod3 */
|
||||
double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVb;
|
||||
double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb;
|
||||
double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, qbulk;
|
||||
double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff;
|
||||
double dCoxeff_dVg, dCoxeff_dVb;
|
||||
double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg;
|
||||
double dDeltaPhi_dVd, dDeltaPhi_dVb;
|
||||
double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT;
|
||||
double qinoi, qbulk;
|
||||
|
||||
double T3zb, lt1zb, ltwzb, Theta0zb;
|
||||
double Delt_vthzb, dDelt_vthzb_dT;
|
||||
double DeltVthwzb, dDeltVthwzb_dT;
|
||||
double DeltVthtempzb, dDeltVthtempzb_dT;
|
||||
double Vthzb, dVthzb_dT, Vfbzb, dVfbzb_dT;
|
||||
double Vthzb = 0.0, dVthzb_dT = 0.0, Vfbzb, dVfbzb_dT;
|
||||
|
||||
/* v3.0 */
|
||||
double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb, Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd;
|
||||
|
|
@ -295,31 +286,34 @@ double gIgtotg, gIgtotd, gIgtotb, gIgtots, Igtoteq;
|
|||
/* v3.0 */
|
||||
double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT;
|
||||
double dIgb1_dVe, gige, Giie, dT0_dVe, dRatio_dVe, dVdiff_dVe;
|
||||
double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe, dVaux_dVe;
|
||||
double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe = 0.0, dVaux_dVe;
|
||||
double Gme, gTte, gbbe, gddpe, gsspe;
|
||||
double Vbsdio, dVbsdio_dVg, dVbsdio_dVd, dVbsdio_dVe, dVbsdio_dVb, dVbsdio_dT;
|
||||
double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVb, dVbs0_dVe, dVbs0_dT;
|
||||
double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT;
|
||||
double Vbs0mos, dVbs0mos_dVe, dVbs0mos_dT;
|
||||
double Vbsmos, dVbsmos_dVg, dVbsmos_dVd, dVbsmos_dVb, dVbsmos_dVe, dVbsmos_dT;
|
||||
double PhiON, dPhiON_dVg, dPhiON_dVd, dPhiON_dVb, dPhiON_dVe, dPhiON_dT;
|
||||
double PhiFD, dPhiFD_dVg, dPhiFD_dVd, dPhiFD_dVb, dPhiFD_dVe, dPhiFD_dT;
|
||||
double Vbs0t, dVbs0t_dVg, dVbs0t_dVd, dVbs0t_dVb, dVbs0t_dVe, dVbs0t_dT;
|
||||
double PhiON, dPhiON_dVg, dPhiON_dVd, dPhiON_dVe, dPhiON_dT;
|
||||
double PhiFD, dPhiFD_dVg, dPhiFD_dVd, dPhiFD_dVe, dPhiFD_dT;
|
||||
double Vbs0t, dVbs0t_dVg, dVbs0t_dVd, dVbs0t_dVe, dVbs0t_dT;
|
||||
double VthFD, dVthFD_dVd, dVthFD_dVb, dVthFD_dVe, dVthFD_dT;
|
||||
double VtgsFD, ExpVtgsFD, VgstFD, ExpVgstFD;
|
||||
double VtgseffFD, dVtgseffFD_dVd, dVtgseffFD_dVg, dVtgseffFD_dVe, dVtgseffFD_dT;
|
||||
double VgsteffFD, dVgsteffFD_dVd, dVgsteffFD_dVg, dVgsteffFD_dVe, dVgsteffFD_dT;
|
||||
double VtgseffFD, dVtgseffFD_dVd, dVtgseffFD_dVg, dVtgseffFD_dVe;
|
||||
double dVtgseffFD_dT;
|
||||
double VgsteffFD, dVgsteffFD_dVd, dVgsteffFD_dVg, dVgsteffFD_dVe;
|
||||
double dVgsteffFD_dT;
|
||||
double dT2_dVe, dVbsh_dVg, dVbsh_dVd, dVbsh_dVe, dVbsh_dT;
|
||||
double dVgsteff_dVe, dVbseff_dVg, dVbseff_dVd, dVbseff_dVe, dVbseff_dT;
|
||||
|
||||
/* v2.2 release */
|
||||
double Vgb, dVgb_dVg, dVgb_dVb, Vox, dVox_dVg, dVox_dVd, dVox_dVb;
|
||||
double Vgb = 0.0, dVgb_dVg = 0.0, dVgb_dVb = 0.0, Vox, dVox_dVg;
|
||||
double dVox_dVd, dVox_dVb;
|
||||
double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb;
|
||||
double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb;
|
||||
double ceqgate;
|
||||
double dT0_dVox, Voxeff, dVoxeff_dVox;
|
||||
double dVox_dT, dVaux_dT, dIgb_dT;
|
||||
double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVb, dVoxacc_dT;
|
||||
double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd, dVoxdepinv_dT;
|
||||
double dVox_dT, dVaux_dT = 0.0, dIgb_dT;
|
||||
double Voxacc = 0.0, dVoxacc_dVg = 0.0, dVoxacc_dVd = 0.0, dVoxacc_dVb = 0.0;
|
||||
double Voxdepinv = 0.0, dVoxdepinv_dVg = 0.0, dVoxdepinv_dVb = 0.0;
|
||||
double dVoxdepinv_dVd = 0.0, dVoxdepinv_dT = 0.0;
|
||||
double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT;
|
||||
double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT;
|
||||
double gigs, gigd, gigb, gigg;
|
||||
|
|
|
|||
|
|
@ -48,9 +48,8 @@ B3SOIStrongInversionNoiseEval(double vgs, double vds, B3SOImodel *model,
|
|||
B3SOIinstance *here, double freq, double temp)
|
||||
{
|
||||
struct b3soiSizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Vgst;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
|
||||
double req, ceq;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->B3SOIcd) * here->B3SOIm;
|
||||
|
|
@ -107,11 +106,10 @@ double noizDens[B3SOINSRCS];
|
|||
double lnNdens[B3SOINSRCS];
|
||||
|
||||
double vgs, vds, Slimit;
|
||||
double N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
|
||||
double n, ExpArg, Ssi, Swi;
|
||||
double T1, T10, T11;
|
||||
double Ssi, Swi;
|
||||
|
||||
int error, i;
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *B3SOInNames[B3SOINSRCS] =
|
||||
|
|
|
|||
|
|
@ -19,9 +19,10 @@ B3SOIpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
|||
B3SOImodel *model = (B3SOImodel*)inModel;
|
||||
B3SOIinstance *here;
|
||||
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
|
||||
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
|
||||
double gdpr, gspr, gds, gbd, gbs;
|
||||
double capbd = 0.0, capbs = 0.0, xcsgb, xcdsb, xcsdb;
|
||||
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0;
|
||||
double FwdSum, RevSum, Gm, Gmbs;
|
||||
|
||||
double m;
|
||||
|
|
|
|||
|
|
@ -36,13 +36,11 @@ B3SOIinstance *here;
|
|||
int error;
|
||||
CKTnode *tmp;
|
||||
|
||||
double tmp1, tmp2;
|
||||
double nfb0, Cboxt;
|
||||
int itmp1;
|
||||
double Cboxt;
|
||||
|
||||
|
||||
/* Alan's Nodeset Fix */
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
|
||||
|
|
@ -1236,10 +1234,10 @@ IFuid tmpName;
|
|||
here->B3SOIdNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1258,10 +1256,10 @@ IFuid tmpName;
|
|||
here->B3SOIsNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,14 +49,14 @@ B3SOItemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
{
|
||||
B3SOImodel *model = (B3SOImodel*) inModel;
|
||||
B3SOIinstance *here;
|
||||
struct b3soiSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
|
||||
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;
|
||||
double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
|
||||
struct b3soiSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam = NULL;
|
||||
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
|
||||
double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
|
||||
double SDphi, SDgamma;
|
||||
int Size_Not_Found;
|
||||
|
||||
/* v2.0 release */
|
||||
double tmp3, T7, T8, T9;
|
||||
double tmp3, T7;
|
||||
|
||||
|
||||
/* loop through all the B3SOI device models */
|
||||
|
|
|
|||
|
|
@ -41,10 +41,9 @@ double gbbg, gbbdp, gbbb, gbbe, gbbp, gbbsp, gbbT;
|
|||
double gddpg, gddpdp, gddpsp, gddpb, gddpe, gddpT;
|
||||
double gsspg, gsspdp, gsspsp, gsspb, gsspe, gsspT;
|
||||
double gppg, gppdp, gppb, gppe, gppp, gppsp, gppT;
|
||||
double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp;
|
||||
double xcTt, cTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp;
|
||||
|
||||
double Dum1, Dum2, Dum3, Dum4, Dum5;
|
||||
FILE *fpdebug;
|
||||
FILE *fpdebug = NULL;
|
||||
|
||||
double m;
|
||||
|
||||
|
|
|
|||
|
|
@ -55,8 +55,6 @@ double
|
|||
B3SOIDDSmartVbs(double New, double Old, B3SOIDDinstance *here,
|
||||
CKTcircuit *ckt, int *check)
|
||||
{
|
||||
double T0, T1, del;
|
||||
|
||||
/* only do it for floating body and DC */
|
||||
if (here->B3SOIDDfloat && (ckt->CKTmode & (MODEDC | MODEDCOP)))
|
||||
{
|
||||
|
|
@ -104,13 +102,13 @@ B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
|
|||
B3SOIDDinstance *here;
|
||||
int selfheat;
|
||||
|
||||
double SourceSatCurrent, DrainSatCurrent, Gmin;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double Gmin;
|
||||
double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst = 0.0;
|
||||
double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double evbd, evbs, arg, sarg;
|
||||
double arg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double tol, PhiB, PhiBSW, MJ, MJSW, PhiBSWG, MJSWG;
|
||||
double Vfbeff, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double PhiBSWG, MJSWG;
|
||||
double gcgdb, gcggb, gcgsb, gcgeb, gcgT;
|
||||
double gcsdb, gcsgb, gcssb, gcseb, gcsT;
|
||||
double gcddb, gcdgb, gcdsb, gcdeb, gcdT;
|
||||
|
|
@ -121,59 +119,56 @@ double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
|
|||
double vg, vd, vs, vp, ve, vb;
|
||||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT;
|
||||
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm;
|
||||
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth = 0.0;
|
||||
double dVth_dVb, dVth_dVd, dVth_dT;
|
||||
double Vgst, dVgs_eff_dVg;
|
||||
double n, dn_dVb, Vtm;
|
||||
double ExpArg, V0;
|
||||
double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;
|
||||
double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0;
|
||||
double ueff = 0.0, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;
|
||||
double Esat, Vdsat = 0.0;
|
||||
double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat, dAlphaz_dVg, dAlphaz_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT;
|
||||
double Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
|
||||
double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb;
|
||||
double One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL;
|
||||
double dVgdt_dVg, dVgdt_dVd, dVgdt_dVb;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVc, dT0_dVe, dT0_dVrg, dT0_dT;
|
||||
double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
|
||||
double Vbseff, dVbseff_dVb;
|
||||
double One_Third_CoxWL, Two_Third_CoxWL, CoxWL;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVc, dT0_dVe, dT0_dT;
|
||||
double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dVc, dT1_dVe, dT1_dT;
|
||||
double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dVc, dT2_dVe, dT2_dT;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dVc, dT3_dVe, dT3_dT;
|
||||
double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dVc, dT4_dVe, dT4_dT;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dVc, dT5_dVe, dT5_dT;
|
||||
double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dVc, dT6_dVe, dT6_dT;
|
||||
double T7, dT7_dVg, dT7_dVd, dT7_dVb;
|
||||
double T8, dT8_dVg, dT8_dVd, dT8_dVb, dT8_dVc, dT8_dVe, dT8_dVrg;
|
||||
double T9, dT9_dVg, dT9_dVd, dT9_dVb, dT9_dVc, dT9_dVe, dT9_dVrg;
|
||||
double T10, dT10_dVg, dT10_dVb, dT10_dVd;
|
||||
double T7;
|
||||
double T8;
|
||||
double T9;
|
||||
double T10;
|
||||
double T11, T12;
|
||||
double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double T100, T101;
|
||||
double Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT;
|
||||
double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT;
|
||||
double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb;
|
||||
double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb;
|
||||
double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT;
|
||||
double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb;
|
||||
double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg;
|
||||
double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb;
|
||||
double dRout_Vgs_factor_dVd;
|
||||
double tempv, a1;
|
||||
double Theta0, dTheta0_dVb;
|
||||
double TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg;
|
||||
double a1;
|
||||
|
||||
double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dVe, dVgsteff_dT;
|
||||
double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;
|
||||
double Vgsteff = 0.0, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb;
|
||||
double dVgsteff_dVe, dVgsteff_dT;
|
||||
double Vdseff = 0.0, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;
|
||||
double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
|
||||
double diffVds, diffVdsCV;
|
||||
double diffVds;
|
||||
double dAbulk_dVg, dn_dVd ;
|
||||
double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT;
|
||||
double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT;
|
||||
double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT;
|
||||
double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT;
|
||||
double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT;
|
||||
double Ids, Gm, Gds, Gmb;
|
||||
double Ids = 0.0, Gm, Gds = 0.0, Gmb;
|
||||
double CoxWovL;
|
||||
double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds;
|
||||
double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
|
@ -181,14 +176,13 @@ double qgdo, qgso, cgdo, cgso;
|
|||
double dxpart, sxpart;
|
||||
|
||||
struct b3soiddSizeDependParam *pParam;
|
||||
int ByPass, Check, ChargeComputationNeeded, J, error, I;
|
||||
double junk[50];
|
||||
int ByPass, Check, ChargeComputationNeeded = 0, error;
|
||||
|
||||
double gbbsp, gbbdp, gbbg, gbbb, gbbe, gbbp, gbbT;
|
||||
double gddpsp, gddpdp, gddpg, gddpb, gddpe, gddpT;
|
||||
double gsspsp, gsspdp, gsspg, gsspb, gsspe, gsspT;
|
||||
double Gbpbs, Gbpgs, Gbpds, Gbpes, Gbpps, GbpT;
|
||||
double vse, vde, ves, ved, veb, vge, delves, vedo, delved;
|
||||
double ves, ved, veb, vge = 0.0, delves, vedo, delved;
|
||||
double vps, vpd, Vps, delvps;
|
||||
double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT;
|
||||
double Vbp, dVbp_dVp, dVbp_dVb, dVbp_dVg, dVbp_dVd, dVbp_dVe, dVbp_dT;
|
||||
|
|
@ -200,92 +194,101 @@ double dfgche1_dVc, dfgche2_dVc, dgche_dVc, dVdseff_dVc, dIdl_dVc;
|
|||
double Gm0, Gds0, Gmb0, GmT0, Gmc, Gme, GmT, dVbseff_dVg;
|
||||
double dDIBL_Sft_dVb, BjtA, dBjtA_dVd;
|
||||
double diffVdsii ;
|
||||
double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg;
|
||||
double Gjsd, Gjss, Gjsb, GjsT, Gjdd, Gjdb, GjdT;
|
||||
double Ibp, Iii, Giid, Giig, Giib, Giie, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon;
|
||||
double gppg, gppdp, gppb, gppe, gppp, gppsp, gppT;
|
||||
double Idgidl = 0.0, Gdgidld, Gdgidlg, Isgidl = 0.0, Gsgidlg;
|
||||
double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT;
|
||||
double Ibp = 0.0, Iii = 0.0, Giid, Giig, Giib, Giie, GiiT, Gcd, Gcb, GcT;
|
||||
double ceqbody, ceqbodcon = 0.0;
|
||||
double gppg = 0.0, gppdp = 0.0, gppb = 0.0, gppe = 0.0, gppp = 0.0;
|
||||
double gppsp = 0.0, gppT;
|
||||
double delTemp, deldelTemp, Temp;
|
||||
double ceqth, ceqqth;
|
||||
double K1, WL;
|
||||
double qjs, gcjsbs, gcjsT;
|
||||
double qjd, gcjdbs, gcjdds, gcjdT;
|
||||
double K1;
|
||||
double qjs = 0.0, gcjsbs, gcjsT;
|
||||
double qjd = 0.0, gcjdbs, gcjdds, gcjdT;
|
||||
double qge;
|
||||
double ceqqe;
|
||||
double ni, Eg, Cbox, Nfb, CboxWL;
|
||||
double cjsbs;
|
||||
double Qbf0, Qsicv, dVfbeff_dVrg, Cbe ;
|
||||
double qinv, qgate, qbody, qdrn, qsrc, qsub, cqgate, cqbody, cqdrn, cqsub, cqtemp;
|
||||
double Cgg, Cgd, Cgs, Cgb, Cge, Cdg, Cdd, Cds, Cdb, Qg, Qd;
|
||||
double Csg, Csd, Css, Csb, Cse, Cbg, Cbd, Cbs, Cbb, Qs, Qb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1;
|
||||
double Vbs0t, dVbs0t_dT ;
|
||||
double Vbs0 ,dVbs0_dVe, dVbs0_dT;
|
||||
double Vbs0eff ,dVbs0eff_dVg ,dVbs0eff_dVd ,dVbs0eff_dVe, dVbs0eff_dT;
|
||||
double Vbs0teff,dVbs0teff_dVg ,dVbs0teff_dVd, dVbs0teff_dVe, dVbs0teff_dT;
|
||||
double Vbsdio, dVbsdio_dVg, dVbsdio_dVd, dVbsdio_dVe, dVbsdio_dVb, dVbsdio_dT;
|
||||
double Vbseff0;
|
||||
double Vthfd ,dVthfd_dVd ,dVthfd_dVe, dVthfd_dT;
|
||||
double Vbs0mos ,dVbs0mos_dVe, dVbs0mos_dT;
|
||||
double Qbf0, Qsicv, dVfbeff_dVrg, Cbe = 0.0;
|
||||
double qinv = 0.0, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0;
|
||||
double cqgate, cqbody = 0.0, cqdrn = 0.0, cqsub, cqtemp;
|
||||
double Cgg, Cgd, Cgb, Cge;
|
||||
double Csg, Csd, Csb, Cse, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0;
|
||||
double Cgg1, Cgb1, Cgd1, Csg1, Csd1, Csb1;
|
||||
double Vbs0t = 0.0, dVbs0t_dT ;
|
||||
double Vbs0 = 0.0 ,dVbs0_dVe, dVbs0_dT;
|
||||
double Vbs0eff = 0.0 ,dVbs0eff_dVg ,dVbs0eff_dVd ,dVbs0eff_dVe, dVbs0eff_dT;
|
||||
double Vbs0teff = 0.0,dVbs0teff_dVg ,dVbs0teff_dVd, dVbs0teff_dVe;
|
||||
double dVbs0teff_dT;
|
||||
double Vbsdio = 0.0, dVbsdio_dVg, dVbsdio_dVd, dVbsdio_dVe, dVbsdio_dVb;
|
||||
double dVbsdio_dT;
|
||||
double Vthfd = 0.0 ,dVthfd_dVd ,dVthfd_dVe, dVthfd_dT;
|
||||
double Vbs0mos = 0.0 ,dVbs0mos_dVe, dVbs0mos_dT;
|
||||
double Vbsmos ,dVbsmos_dVg ,dVbsmos_dVb ,dVbsmos_dVd, dVbsmos_dVe, dVbsmos_dT;
|
||||
double Abeff ,dAbeff_dVg ,dAbeff_dVb, dAbeff_dVc;
|
||||
double Vcs ,dVcs_dVg ,dVcs_dVb ,dVcs_dVd ,dVcs_dVe, dVcs_dT;
|
||||
double Xcsat ,dXcsat_dVg ,dXcsat_dVb, dXcsat_dVc;
|
||||
double Xcsat = 0.0, dXcsat_dVg, dXcsat_dVc;
|
||||
double Vdsatii ,dVdsatii_dVg ,dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT;
|
||||
double Vdseffii ,dVdseffii_dVg ,dVdseffii_dVd, dVdseffii_dVb, dVdseffii_dT;
|
||||
double VcsCV ,dVcsCV_dVg ,dVcsCV_dVb ,dVcsCV_dVd ,dVcsCV_dVc ,dVcsCV_dVe;
|
||||
double VdsCV ,dVdsCV_dVg ,dVdsCV_dVb ,dVdsCV_dVd ,dVdsCV_dVc;
|
||||
double VcsCV = 0.0 ,dVcsCV_dVg = 0.0 ,dVcsCV_dVb = 0.0;
|
||||
double dVcsCV_dVd = 0.0 ,dVcsCV_dVc = 0.0;
|
||||
double VdsCV = 0.0 ,dVdsCV_dVg = 0.0 ,dVdsCV_dVb = 0.0;
|
||||
double dVdsCV_dVd = 0.0 ,dVdsCV_dVc = 0.0;
|
||||
double Phisc ,dPhisc_dVg ,dPhisc_dVb ,dPhisc_dVd, dPhisc_dVc;
|
||||
double Phisd ,dPhisd_dVg ,dPhisd_dVb ,dPhisd_dVd, dPhisd_dVc;
|
||||
double sqrtPhisc ,dsqrtPhisc_dVg ,dsqrtPhisc_dVb;
|
||||
double sqrtPhisd ,dsqrtPhisd_dVg ,dsqrtPhisd_dVb;
|
||||
double Xc ,dXc_dVg ,dXc_dVb ,dXc_dVd ,dXc_dVc;
|
||||
double Ibjt ,dIbjt_dVb ,dIbjt_dVd ,dIbjt_dT;
|
||||
double Ibs1 ,dIbs1_dVb ,dIbs1_dT;
|
||||
double Ibs2 ,dIbs2_dVb ,dIbs2_dT;
|
||||
double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT;
|
||||
double Ibs4 ,dIbs4_dVb ,dIbs4_dT;
|
||||
double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT;
|
||||
double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT;
|
||||
double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT;
|
||||
double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT;
|
||||
double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT;
|
||||
double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT;
|
||||
double ExpVbs4, dExpVbs4_dVb, dExpVbs4_dT;
|
||||
double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT;
|
||||
double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT;
|
||||
double ExpVbd4, dExpVbd4_dVb, dExpVbd4_dT;
|
||||
double sqrtPhisc;
|
||||
double sqrtPhisd;
|
||||
double Xc = 0.0 ,dXc_dVg = 0.0 ,dXc_dVb = 0.0 ,dXc_dVd = 0.0 ,dXc_dVc = 0.0;
|
||||
double Ibjt = 0.0 ,dIbjt_dVb ,dIbjt_dVd ,dIbjt_dT = 0.0;
|
||||
double Ibs1 ,dIbs1_dVb ,dIbs1_dT = 0.0;
|
||||
double Ibs2 ,dIbs2_dVb ,dIbs2_dT = 0.0;
|
||||
double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT = 0.0;
|
||||
double Ibs4 ,dIbs4_dVb ,dIbs4_dT = 0.0;
|
||||
double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT = 0.0;
|
||||
double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT = 0.0;
|
||||
double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT = 0.0;
|
||||
double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT = 0.0;
|
||||
double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT = 0.0;
|
||||
double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT = 0.0;
|
||||
double ExpVbs4 = 0.0, dExpVbs4_dVb = 0.0, dExpVbs4_dT = 0.0;
|
||||
double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT = 0.0;
|
||||
double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT = 0.0;
|
||||
double ExpVbd4 = 0.0, dExpVbd4_dVb = 0.0, dExpVbd4_dT = 0.0;
|
||||
double WTsi, NVtm1, NVtm2;
|
||||
double Ic ,dIc_dVb ,dIc_dVd;
|
||||
double Ibs ,dIbs_dVb ,dIbs_dVd ,dIbs_dVe;
|
||||
double Ibd ,dIbd_dVb;
|
||||
double Ic = 0.0;
|
||||
double Ibs = 0.0;
|
||||
double Ibd = 0.0;
|
||||
double Nomi ,dNomi_dVg ,dNomi_dVb ,dNomi_dVd ,dNomi_dVc;
|
||||
double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dVc, dDenomi_dT;
|
||||
double Qbf ,dQbf_dVg ,dQbf_dVb ,dQbf_dVd ,dQbf_dVc ,dQbf_dVe;
|
||||
double Qsubs1 ,dQsubs1_dVg ,dQsubs1_dVb ,dQsubs1_dVd ,dQsubs1_dVc ,dQsubs1_dVe;
|
||||
double Qsubs2 ,dQsubs2_dVg ,dQsubs2_dVb ,dQsubs2_dVd ,dQsubs2_dVc ,dQsubs2_dVe;
|
||||
double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ;
|
||||
double Qac0 ,dQac0_dVb ,dQac0_dVd;
|
||||
double Qbf = 0.0 ,dQbf_dVg = 0.0 ,dQbf_dVb = 0.0 ,dQbf_dVd = 0.0;
|
||||
double dQbf_dVc = 0.0 ,dQbf_dVe = 0.0;
|
||||
double Qsubs1 = 0.0 ,dQsubs1_dVg ,dQsubs1_dVb ,dQsubs1_dVd ,dQsubs1_dVc;
|
||||
double Qsubs2 = 0.0 ,dQsubs2_dVg ,dQsubs2_dVb ,dQsubs2_dVd ,dQsubs2_dVc ,dQsubs2_dVe;
|
||||
double Qsub0 = 0.0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ;
|
||||
double Qac0 = 0.0 ,dQac0_dVb ,dQac0_dVd;
|
||||
double Qdep0 ,dQdep0_dVb;
|
||||
double Qe1 , dQe1_dVg ,dQe1_dVb, dQe1_dVd, dQe1_dVe, dQe1_dT;
|
||||
double Qe1 = 0.0 , dQe1_dVg ,dQe1_dVb, dQe1_dVd, dQe1_dVe, dQe1_dT;
|
||||
double Ce1g ,Ce1b ,Ce1d ,Ce1e, Ce1T;
|
||||
double Ce2g ,Ce2b ,Ce2d ,Ce2e, Ce2T;
|
||||
double Qe2 , dQe2_dVg ,dQe2_dVb, dQe2_dVd, dQe2_dVe, dQe2_dT;
|
||||
double dQbf_dVrg, dQac0_dVrg, dQsub0_dVrg;
|
||||
double dQsubs1_dVrg, dQsubs2_dVrg, dQbf0_dVe, dQbf0_dT;
|
||||
double Qe2 = 0.0 , dQe2_dVg ,dQe2_dVb, dQe2_dVd, dQe2_dVe, dQe2_dT;
|
||||
double dQbf_dVrg = 0.0, dQac0_dVrg, dQsub0_dVrg;
|
||||
double dQsubs2_dVrg, dQbf0_dVe, dQbf0_dT;
|
||||
|
||||
/* for self-heating */
|
||||
double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, u0temp, vsattemp;
|
||||
double rds0, ua, ub, uc;
|
||||
double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT;
|
||||
double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT;
|
||||
double dVfbeff_dT, dQac0_dT, dQsub0_dT, dQbf_dT, dVdsCV_dT, dPhisd_dT;
|
||||
double dNomi_dT,dXc_dT,dQsubs1_dT,dQsubs2_dT, dVcsCV_dT, dPhisc_dT, dQsicv_dT;
|
||||
double CbT, CsT, CgT, CeT;
|
||||
double dVfbeff_dT, dQac0_dT, dQsub0_dT;
|
||||
double dQbf_dT = 0.0, dVdsCV_dT = 0.0, dPhisd_dT;
|
||||
double dNomi_dT, dXc_dT = 0.0, dQsubs1_dT, dQsubs2_dT;
|
||||
double dVcsCV_dT = 0.0, dPhisc_dT, dQsicv_dT;
|
||||
double CbT, CsT, CgT;
|
||||
|
||||
double Qex, dQex_dVg, dQex_dVb, dQex_dVd, dQex_dVe, dQex_dT;
|
||||
|
||||
/* clean up last */
|
||||
FILE *fpdebug;
|
||||
FILE *fpdebug = NULL;
|
||||
/* end clean up */
|
||||
int nandetect;
|
||||
static int nanfound = 0;
|
||||
|
|
@ -294,7 +297,7 @@ char nanmessage [12];
|
|||
double m;
|
||||
|
||||
|
||||
for (; model != NULL; model = model->B3SOIDDnextModel)
|
||||
for (; model != NULL; model = model->B3SOIDDnextModel)
|
||||
{ for (here = model->B3SOIDDinstances; here != NULL;
|
||||
here = here->B3SOIDDnextInstance)
|
||||
{
|
||||
|
|
@ -4210,44 +4213,44 @@ if (here->B3SOIDDdebugMod > 2)
|
|||
/* Here NaN will be detected in any conductance or equivalent current. Note
|
||||
that nandetect is initialized within the "if" statements */
|
||||
|
||||
if (nandetect = isnan (*(here->B3SOIDDGbPtr)))
|
||||
if ((nandetect = isnan (*(here->B3SOIDDGbPtr))))
|
||||
{ strcpy (nanmessage, "GbPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDEbPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDEbPtr))))
|
||||
{ strcpy (nanmessage, "EbPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDDPbPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDDPbPtr))))
|
||||
{ strcpy (nanmessage, "DPbPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDSPbPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDSPbPtr))))
|
||||
{ strcpy (nanmessage, "SPbPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDBbPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDBbPtr))))
|
||||
{ strcpy (nanmessage, "BbPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDBgPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDBgPtr))))
|
||||
{ strcpy (nanmessage, "BgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDBePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDBePtr))))
|
||||
{ strcpy (nanmessage, "BePtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDBdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDBdpPtr))))
|
||||
{ strcpy (nanmessage, "BdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDBspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDBspPtr))))
|
||||
{ strcpy (nanmessage, "BspPtr"); }
|
||||
|
||||
if (nandetect = isnan (*(here->B3SOIDDGgPtr)))
|
||||
if ((nandetect = isnan (*(here->B3SOIDDGgPtr))))
|
||||
{ strcpy (nanmessage, "GgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDGdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDGdpPtr))))
|
||||
{ strcpy (nanmessage, "GdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDGspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDGspPtr))))
|
||||
{ strcpy (nanmessage, "GspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDDPgPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDDPgPtr))))
|
||||
{ strcpy (nanmessage, "DPgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDDPdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDDPdpPtr))))
|
||||
{ strcpy (nanmessage, "DPdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDDPspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDDPspPtr))))
|
||||
{ strcpy (nanmessage, "DPspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDSPgPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDSPgPtr))))
|
||||
{ strcpy (nanmessage, "SPgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDSPdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDSPdpPtr))))
|
||||
{ strcpy (nanmessage, "SPdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDSPspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDSPspPtr))))
|
||||
{ strcpy (nanmessage, "SPspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDEePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDEePtr))))
|
||||
{ strcpy (nanmessage, "EePtr"); }
|
||||
|
||||
/* At this point, nandetect = 0 if none of the
|
||||
|
|
@ -4255,17 +4258,17 @@ if (here->B3SOIDDdebugMod > 2)
|
|||
|
||||
if (nandetect == 0)
|
||||
{
|
||||
if (nandetect = isnan (*(here->B3SOIDDEgPtr)))
|
||||
if ((nandetect = isnan (*(here->B3SOIDDEgPtr))))
|
||||
{ strcpy (nanmessage, "EgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDEdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDEdpPtr))))
|
||||
{ strcpy (nanmessage, "EdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDEspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDEspPtr))))
|
||||
{ strcpy (nanmessage, "EspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDGePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDGePtr))))
|
||||
{ strcpy (nanmessage, "GePtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDDPePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDDPePtr))))
|
||||
{ strcpy (nanmessage, "DPePtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDSPePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDSPePtr))))
|
||||
{ strcpy (nanmessage, "SPePtr"); } }
|
||||
|
||||
/* Now check if self-heating caused NaN if nothing else
|
||||
|
|
@ -4273,29 +4276,29 @@ if (here->B3SOIDDdebugMod > 2)
|
|||
|
||||
if (selfheat && nandetect == 0)
|
||||
{
|
||||
if (nandetect = isnan (*(here->B3SOIDDTemptempPtr)))
|
||||
if ((nandetect = isnan (*(here->B3SOIDDTemptempPtr))))
|
||||
{ strcpy (nanmessage, "TemptempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDTempgPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDTempgPtr))))
|
||||
{ strcpy (nanmessage, "TempgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDTempbPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDTempbPtr))))
|
||||
{ strcpy (nanmessage, "TempbPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDTempePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDTempePtr))))
|
||||
{ strcpy (nanmessage, "TempePtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDTempdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDTempdpPtr))))
|
||||
{ strcpy (nanmessage, "TempdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDTempspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDTempspPtr))))
|
||||
{ strcpy (nanmessage, "TempspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDGtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDGtempPtr))))
|
||||
{ strcpy (nanmessage, "GtempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDDPtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDDPtempPtr))))
|
||||
{ strcpy (nanmessage, "DPtempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDSPtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDSPtempPtr))))
|
||||
{ strcpy (nanmessage, "SPtempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDEtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDEtempPtr))))
|
||||
{ strcpy (nanmessage, "EtempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIDDBtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIDDBtempPtr))))
|
||||
{ strcpy (nanmessage, "BtempPtr"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs + here->B3SOIDDtempNode)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs + here->B3SOIDDtempNode))))
|
||||
{ strcpy (nanmessage, "tempNode"); }
|
||||
}
|
||||
|
||||
|
|
@ -4304,20 +4307,20 @@ if (here->B3SOIDDdebugMod > 2)
|
|||
|
||||
if (nandetect == 0)
|
||||
{
|
||||
if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDgNode)))
|
||||
if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDgNode))))
|
||||
{ strcpy (nanmessage, "gNode"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDbNode)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDbNode))))
|
||||
{ strcpy (nanmessage, "bNode"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDdNodePrime)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDdNodePrime))))
|
||||
{ strcpy (nanmessage, "dpNode"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDsNodePrime)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDsNodePrime))))
|
||||
{ strcpy (nanmessage, "spNode"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDeNode)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIDDeNode))))
|
||||
{ strcpy (nanmessage, "eNode"); }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -55,8 +55,7 @@ B3SOIDDStrongInversionNoiseEval(double vgs, double vds, B3SOIDDmodel *model,
|
|||
{
|
||||
struct b3soiddSizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Vgst;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
|
||||
double req, ceq;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->B3SOIDDcd) * here->B3SOIDDm;
|
||||
|
|
@ -111,11 +110,10 @@ double noizDens[B3SOIDDNSRCS];
|
|||
double lnNdens[B3SOIDDNSRCS];
|
||||
|
||||
double vgs, vds, Slimit;
|
||||
double N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
|
||||
double n, ExpArg, Ssi, Swi;
|
||||
double T1, T10, T11;
|
||||
double Ssi, Swi;
|
||||
|
||||
int error, i;
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *B3SOIDDnNames[B3SOIDDNSRCS] =
|
||||
|
|
|
|||
|
|
@ -24,9 +24,10 @@ B3SOIDDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
|||
B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
|
||||
B3SOIDDinstance *here;
|
||||
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
|
||||
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
|
||||
double gdpr, gspr, gds, gbd, gbs, capbd = 0.0, capbs = 0.0;
|
||||
double xcsgb, xcdsb, xcsdb;
|
||||
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0;
|
||||
double FwdSum, RevSum, Gm, Gmbs;
|
||||
|
||||
double m;
|
||||
|
|
|
|||
|
|
@ -41,9 +41,8 @@ CKTnode *tmp;
|
|||
|
||||
double tmp1, tmp2;
|
||||
double nfb0, Cboxt;
|
||||
int itmp1;
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
|
||||
|
|
@ -938,10 +937,10 @@ IFuid tmpName;
|
|||
if(error) return(error);
|
||||
here->B3SOIDDdNodePrime = tmp->number;
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void**)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -960,10 +959,10 @@ IFuid tmpName;
|
|||
here->B3SOIDDsNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void**)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@ B3SOIDDtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
{
|
||||
B3SOIDDmodel *model = (B3SOIDDmodel*) inModel;
|
||||
B3SOIDDinstance *here;
|
||||
struct b3soiddSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
|
||||
struct b3soiddSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL;
|
||||
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
|
||||
double SDphi, SDgamma;
|
||||
int Size_Not_Found;
|
||||
|
||||
|
|
|
|||
|
|
@ -42,10 +42,9 @@ double gbbg, gbbdp, gbbb, gbbe, gbbp, gbbsp, gbbT;
|
|||
double gddpg, gddpdp, gddpsp, gddpb, gddpe, gddpT;
|
||||
double gsspg, gsspdp, gsspsp, gsspb, gsspe, gsspT;
|
||||
double gppg, gppdp, gppb, gppe, gppp, gppsp, gppT;
|
||||
double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp;
|
||||
double xcTt, cTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp;
|
||||
|
||||
double Dum1, Dum2, Dum3, Dum4, Dum5;
|
||||
FILE *fpdebug;
|
||||
FILE *fpdebug = NULL;
|
||||
|
||||
double m;
|
||||
|
||||
|
|
|
|||
|
|
@ -55,8 +55,6 @@ double
|
|||
B3SOIFDSmartVbs(double New, double Old, B3SOIFDinstance *here,
|
||||
CKTcircuit *ckt, int *check)
|
||||
{
|
||||
double T0, T1, del;
|
||||
|
||||
/* only do it for floating body and DC */
|
||||
if (here->B3SOIFDfloat && (ckt->CKTmode & (MODEDC | MODEDCOP)))
|
||||
{
|
||||
|
|
@ -104,13 +102,10 @@ B3SOIFDmodel *model = (B3SOIFDmodel*)inModel;
|
|||
B3SOIFDinstance *here;
|
||||
int selfheat;
|
||||
|
||||
double SourceSatCurrent, DrainSatCurrent, Gmin;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst = 0.0;
|
||||
double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double evbd, evbs, arg, sarg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double tol, PhiB, PhiBSW, MJ, MJSW, PhiBSWG, MJSWG;
|
||||
double Vfbeff, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double gcgdb, gcggb, gcgsb, gcgeb, gcgT;
|
||||
double gcsdb, gcsgb, gcssb, gcseb, gcsT;
|
||||
double gcddb, gcdgb, gcdsb, gcdeb, gcdT;
|
||||
|
|
@ -121,59 +116,56 @@ double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
|
|||
double vg, vd, vs, vp, ve, vb;
|
||||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT;
|
||||
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm;
|
||||
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth = 0.0, dVth_dVb;
|
||||
double dVth_dVd, dVth_dT;
|
||||
double Vgst, dVgs_eff_dVg;
|
||||
double n, dn_dVb, Vtm;
|
||||
double ExpArg, V0;
|
||||
double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;
|
||||
double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0;
|
||||
double ueff = 0.0, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;
|
||||
double Esat, Vdsat = 0.0;
|
||||
double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat, dAlphaz_dVg, dAlphaz_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT;
|
||||
double Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
|
||||
double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb;
|
||||
double One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL;
|
||||
double dVgdt_dVg, dVgdt_dVd, dVgdt_dVb;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVc, dT0_dVe, dT0_dVrg, dT0_dT;
|
||||
double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
|
||||
double Vbseff, dVbseff_dVb;
|
||||
double One_Third_CoxWL, Two_Third_CoxWL, CoxWL;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVc, dT0_dVe, dT0_dT;
|
||||
double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dVc, dT1_dVe, dT1_dT;
|
||||
double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dVc, dT2_dVe, dT2_dT;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dVc, dT3_dVe, dT3_dT;
|
||||
double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dVc, dT4_dVe, dT4_dT;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dVc, dT5_dVe, dT5_dT;
|
||||
double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dVc, dT6_dVe, dT6_dT;
|
||||
double T7, dT7_dVg, dT7_dVd, dT7_dVb;
|
||||
double T8, dT8_dVg, dT8_dVd, dT8_dVb, dT8_dVc, dT8_dVe, dT8_dVrg;
|
||||
double T9, dT9_dVg, dT9_dVd, dT9_dVb, dT9_dVc, dT9_dVe, dT9_dVrg;
|
||||
double T10, dT10_dVg, dT10_dVb, dT10_dVd;
|
||||
double T11, T12;
|
||||
double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double T100, T101;
|
||||
double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dVe, dT4_dT;
|
||||
double T5, dT5_dVe;
|
||||
double T6, dT6_dVe, dT6_dT;
|
||||
double T7;
|
||||
double T8;
|
||||
double T9;
|
||||
double T10;
|
||||
double T11;
|
||||
double Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT;
|
||||
double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT;
|
||||
double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb;
|
||||
double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb;
|
||||
double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT;
|
||||
double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb;
|
||||
double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg;
|
||||
double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb;
|
||||
double dRout_Vgs_factor_dVd;
|
||||
double tempv, a1;
|
||||
double Theta0, dTheta0_dVb;
|
||||
double TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg;
|
||||
double a1;
|
||||
|
||||
double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dVe, dVgsteff_dT;
|
||||
double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;
|
||||
double Vgsteff = 0.0, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb;
|
||||
double dVgsteff_dVe, dVgsteff_dT;
|
||||
double Vdseff = 0.0, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;
|
||||
double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
|
||||
double diffVds, diffVdsCV;
|
||||
double diffVds;
|
||||
double dAbulk_dVg, dn_dVd ;
|
||||
double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT;
|
||||
double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT;
|
||||
double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT;
|
||||
double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT;
|
||||
double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT;
|
||||
double Ids, Gm, Gds, Gmb;
|
||||
double Ids = 0.0, Gm, Gds = 0.0, Gmb;
|
||||
double CoxWovL;
|
||||
double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds;
|
||||
double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
|
@ -181,14 +173,13 @@ double qgdo, qgso, cgdo, cgso;
|
|||
double dxpart, sxpart;
|
||||
|
||||
struct b3soifdSizeDependParam *pParam;
|
||||
int ByPass, Check, ChargeComputationNeeded, J, error, I;
|
||||
double junk[50];
|
||||
int ByPass, Check, ChargeComputationNeeded = 0, error;
|
||||
|
||||
double gbbsp, gbbdp, gbbg, gbbb, gbbe, gbbp, gbbT;
|
||||
double gddpsp, gddpdp, gddpg, gddpb, gddpe, gddpT;
|
||||
double gsspsp, gsspdp, gsspg, gsspb, gsspe, gsspT;
|
||||
double Gbpbs, Gbpgs, Gbpds, Gbpes, Gbpps, GbpT;
|
||||
double vse, vde, ves, ved, veb, vge, delves, vedo, delved;
|
||||
double ves, ved, veb, vge = 0.0, delves, vedo, delved;
|
||||
double vps, vpd, Vps, delvps;
|
||||
double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT;
|
||||
double Vbp, dVbp_dVp, dVbp_dVb, dVbp_dVg, dVbp_dVd, dVbp_dVe, dVbp_dT;
|
||||
|
|
@ -198,94 +189,77 @@ double dVbseff_dVd, dVbseff_dVe, dVbseff_dT;
|
|||
double dVdsat_dVc, dVasat_dVc, dVACLM_dVc, dVADIBL_dVc, dVa_dVc;
|
||||
double dfgche1_dVc, dfgche2_dVc, dgche_dVc, dVdseff_dVc, dIdl_dVc;
|
||||
double Gm0, Gds0, Gmb0, GmT0, Gmc, Gme, GmT, dVbseff_dVg;
|
||||
double dDIBL_Sft_dVb, BjtA, dBjtA_dVd;
|
||||
double dDIBL_Sft_dVb;
|
||||
double diffVdsii ;
|
||||
double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg;
|
||||
double Gjsd, Gjss, Gjsb, GjsT, Gjdd, Gjdb, GjdT;
|
||||
double Ibp, Iii, Giid, Giig, Giib, Giie, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon;
|
||||
double gppg, gppdp, gppb, gppe, gppp, gppsp, gppT;
|
||||
double Idgidl = 0.0, Gdgidld, Gdgidlg, Isgidl = 0.0, Gsgidlg;
|
||||
double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT;
|
||||
double Ibp = 0.0, Iii = 0.0, Giid, Giig, Giib, Giie, GiiT, Gcd, Gcb, GcT;
|
||||
double ceqbody, ceqbodcon = 0.0;
|
||||
double gppg = 0.0, gppdp = 0.0, gppb = 0.0, gppe = 0.0;
|
||||
double gppp = 0.0, gppsp = 0.0, gppT;
|
||||
double delTemp, deldelTemp, Temp;
|
||||
double ceqth, ceqqth;
|
||||
double K1, WL;
|
||||
double qjs, gcjsbs, gcjsT;
|
||||
double qjd, gcjdbs, gcjdds, gcjdT;
|
||||
double K1;
|
||||
double qjs = 0.0, gcjsbs, gcjsT;
|
||||
double qjd = 0.0, gcjdbs, gcjdds, gcjdT;
|
||||
double qge;
|
||||
double ceqqe;
|
||||
double ni, Eg, Cbox, Nfb, CboxWL;
|
||||
double cjsbs;
|
||||
double Qbf0, Qsicv, dVfbeff_dVrg, Cbe ;
|
||||
double qinv, qgate, qbody, qdrn, qsrc, qsub, cqgate, cqbody, cqdrn, cqsub, cqtemp;
|
||||
double Cgg, Cgd, Cgs, Cgb, Cge, Cdg, Cdd, Cds, Cdb, Qg, Qd;
|
||||
double Csg, Csd, Css, Csb, Cse, Cbg, Cbd, Cbs, Cbb, Qs, Qb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1;
|
||||
double Vbs0t, dVbs0t_dT ;
|
||||
double Vbs0 ,dVbs0_dVe, dVbs0_dT;
|
||||
double Vbs0eff ,dVbs0eff_dVg ,dVbs0eff_dVd ,dVbs0eff_dVe, dVbs0eff_dT;
|
||||
double Vbs0teff,dVbs0teff_dVg ,dVbs0teff_dVd, dVbs0teff_dVe, dVbs0teff_dT;
|
||||
double Vbsdio, dVbsdio_dVg, dVbsdio_dVd, dVbsdio_dVe, dVbsdio_dVb, dVbsdio_dT;
|
||||
double Vbseff0;
|
||||
double Vthfd ,dVthfd_dVd ,dVthfd_dVe, dVthfd_dT;
|
||||
double Vbs0mos ,dVbs0mos_dVe, dVbs0mos_dT;
|
||||
double dVfbeff_dVrg, Cbe = 0.0;
|
||||
double qinv = 0.0, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0;
|
||||
double cqgate, cqbody = 0.0, cqdrn = 0.0, cqsub, cqtemp;
|
||||
double Cgg, Cgd, Cgb, Cge;
|
||||
double Csg, Csd, Csb, Cse, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0;
|
||||
double Cgg1, Cgb1, Cgd1, Csg1, Csd1, Csb1;
|
||||
double Vbs0t = 0.0, dVbs0t_dT ;
|
||||
double Vbs0 = 0.0,dVbs0_dVe, dVbs0_dT;
|
||||
double Vbs0eff = 0.0 ,dVbs0eff_dVg ,dVbs0eff_dVd ,dVbs0eff_dVe, dVbs0eff_dT;
|
||||
double Vbs0teff = 0.0, dVbs0teff_dVg, dVbs0teff_dVd;
|
||||
double dVbs0teff_dVe, dVbs0teff_dT;
|
||||
double dVbsdio_dVg, dVbsdio_dVd, dVbsdio_dVe;
|
||||
double dVbsdio_dVb, dVbsdio_dT;
|
||||
double Vthfd = 0.0,dVthfd_dVd ,dVthfd_dVe, dVthfd_dT;
|
||||
double Vbs0mos = 0.0 ,dVbs0mos_dVe, dVbs0mos_dT;
|
||||
double Vbsmos ,dVbsmos_dVg ,dVbsmos_dVb ,dVbsmos_dVd, dVbsmos_dVe, dVbsmos_dT;
|
||||
double Abeff ,dAbeff_dVg ,dAbeff_dVb, dAbeff_dVc;
|
||||
double Vcs ,dVcs_dVg ,dVcs_dVb ,dVcs_dVd ,dVcs_dVe, dVcs_dT;
|
||||
double Xcsat ,dXcsat_dVg ,dXcsat_dVb, dXcsat_dVc;
|
||||
double Xcsat = 0.0 ,dXcsat_dVg , dXcsat_dVc;
|
||||
double Vdsatii ,dVdsatii_dVg ,dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT;
|
||||
double Vdseffii ,dVdseffii_dVg ,dVdseffii_dVd, dVdseffii_dVb, dVdseffii_dT;
|
||||
double VcsCV ,dVcsCV_dVg ,dVcsCV_dVb ,dVcsCV_dVd ,dVcsCV_dVc ,dVcsCV_dVe;
|
||||
double VdsCV ,dVdsCV_dVg ,dVdsCV_dVb ,dVdsCV_dVd ,dVdsCV_dVc;
|
||||
double Phisc ,dPhisc_dVg ,dPhisc_dVb ,dPhisc_dVd, dPhisc_dVc;
|
||||
double VcsCV = 0.0;
|
||||
double VdsCV = 0.0, dVdsCV_dVg = 0.0, dVdsCV_dVb = 0.0;
|
||||
double dVdsCV_dVd = 0.0, dVdsCV_dVc = 0.0;
|
||||
double Phisd ,dPhisd_dVg ,dPhisd_dVb ,dPhisd_dVd, dPhisd_dVc;
|
||||
double sqrtPhisc ,dsqrtPhisc_dVg ,dsqrtPhisc_dVb;
|
||||
double sqrtPhisd ,dsqrtPhisd_dVg ,dsqrtPhisd_dVb;
|
||||
double Xc ,dXc_dVg ,dXc_dVb ,dXc_dVd ,dXc_dVc;
|
||||
double Ibjt ,dIbjt_dVb ,dIbjt_dVd ,dIbjt_dT;
|
||||
double Ibs1 ,dIbs1_dVb ,dIbs1_dT;
|
||||
double Ibs2 ,dIbs2_dVb ,dIbs2_dT;
|
||||
double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT;
|
||||
double Ibs4 ,dIbs4_dVb ,dIbs4_dT;
|
||||
double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT;
|
||||
double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT;
|
||||
double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT;
|
||||
double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT;
|
||||
double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT;
|
||||
double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT;
|
||||
double ExpVbs4, dExpVbs4_dVb, dExpVbs4_dT;
|
||||
double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT;
|
||||
double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT;
|
||||
double ExpVbd4, dExpVbd4_dVb, dExpVbd4_dT;
|
||||
double WTsi, NVtm1, NVtm2;
|
||||
double Ic ,dIc_dVb ,dIc_dVd;
|
||||
double Ibs ,dIbs_dVb ,dIbs_dVd ,dIbs_dVe;
|
||||
double Ibd ,dIbd_dVb;
|
||||
double Nomi ,dNomi_dVg ,dNomi_dVb ,dNomi_dVd ,dNomi_dVc;
|
||||
double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dVc, dDenomi_dT;
|
||||
double Qbf ,dQbf_dVg ,dQbf_dVb ,dQbf_dVd ,dQbf_dVc ,dQbf_dVe;
|
||||
double Qsubs1 ,dQsubs1_dVg ,dQsubs1_dVb ,dQsubs1_dVd ,dQsubs1_dVc ,dQsubs1_dVe;
|
||||
double Qsubs2 ,dQsubs2_dVg ,dQsubs2_dVb ,dQsubs2_dVd ,dQsubs2_dVc ,dQsubs2_dVe;
|
||||
double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ;
|
||||
double Qac0 ,dQac0_dVb ,dQac0_dVd;
|
||||
double sqrtPhisd;
|
||||
double Xc = 0.0;
|
||||
double Ic = 0.0;
|
||||
double Ibs = 0.0;
|
||||
double Ibd = 0.0;
|
||||
double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb , dDenomi_dT;
|
||||
double Qbf = 0.0;
|
||||
double Qsubs1 = 0.0;
|
||||
double Qsubs2 = 0.0;
|
||||
double Qsub0 = 0.0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ;
|
||||
double Qac0 = 0.0 ,dQac0_dVb ,dQac0_dVd;
|
||||
double Qdep0 ,dQdep0_dVb;
|
||||
double Qe1 , dQe1_dVg ,dQe1_dVb, dQe1_dVd, dQe1_dVe, dQe1_dT;
|
||||
double Qe1 = 0.0;
|
||||
double Ce1g ,Ce1b ,Ce1d ,Ce1e, Ce1T;
|
||||
double Ce2g ,Ce2b ,Ce2d ,Ce2e, Ce2T;
|
||||
double Qe2 , dQe2_dVg ,dQe2_dVb, dQe2_dVd, dQe2_dVe, dQe2_dT;
|
||||
double dQbf_dVrg, dQac0_dVrg, dQsub0_dVrg;
|
||||
double dQsubs1_dVrg, dQsubs2_dVrg, dQbf0_dVe, dQbf0_dT;
|
||||
double Qe2 = 0.0;
|
||||
double dQac0_dVrg, Vbsdio = 0.0, dQsub0_dVrg;
|
||||
|
||||
/* for self-heating */
|
||||
double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, u0temp, vsattemp;
|
||||
double rds0, ua, ub, uc;
|
||||
double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT;
|
||||
double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT;
|
||||
double dVfbeff_dT, dQac0_dT, dQsub0_dT, dQbf_dT, dVdsCV_dT, dPhisd_dT;
|
||||
double dNomi_dT,dXc_dT,dQsubs1_dT,dQsubs2_dT, dVcsCV_dT, dPhisc_dT, dQsicv_dT;
|
||||
double CbT, CsT, CgT, CeT;
|
||||
double dVfbeff_dT, dQac0_dT, dQsub0_dT, dVdsCV_dT = 0.0, dPhisd_dT;
|
||||
double CbT, CsT, CgT;
|
||||
|
||||
double Qex, dQex_dVg, dQex_dVb, dQex_dVd, dQex_dVe, dQex_dT;
|
||||
|
||||
/* clean up last */
|
||||
FILE *fpdebug;
|
||||
FILE *fpdebug = NULL;
|
||||
/* end clean up */
|
||||
int nandetect;
|
||||
static int nanfound = 0;
|
||||
|
|
@ -338,7 +312,9 @@ for (; model != NULL; model = model->B3SOIFDnextModel)
|
|||
}
|
||||
if (here->B3SOIFDdebugMod > 0)
|
||||
{
|
||||
fprintf(stderr,"DC op. point converge with %d iterations\n");
|
||||
fprintf(stderr,
|
||||
"DC op. point converge with %d iterations\n",
|
||||
here->B3SOIFDiterations);
|
||||
}
|
||||
}
|
||||
else if ((ckt->CKTmode & MODEINITTRAN))
|
||||
|
|
@ -3344,25 +3320,25 @@ if (here->B3SOIFDdebugMod > 2)
|
|||
/* Here NaN will be detected in any conductance or equivalent current. Note
|
||||
that nandetect is initialized within the "if" statements */
|
||||
|
||||
if (nandetect = isnan (*(here->B3SOIFDGgPtr)))
|
||||
if ((nandetect = isnan (*(here->B3SOIFDGgPtr))))
|
||||
{ strcpy (nanmessage, "GgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDGdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDGdpPtr))))
|
||||
{ strcpy (nanmessage, "GdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDGspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDGspPtr))))
|
||||
{ strcpy (nanmessage, "GspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDDPgPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDDPgPtr))))
|
||||
{ strcpy (nanmessage, "DPgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDDPdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDDPdpPtr))))
|
||||
{ strcpy (nanmessage, "DPdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDDPspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDDPspPtr))))
|
||||
{ strcpy (nanmessage, "DPspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDSPgPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDSPgPtr))))
|
||||
{ strcpy (nanmessage, "SPgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDSPdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDSPdpPtr))))
|
||||
{ strcpy (nanmessage, "SPdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDSPspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDSPspPtr))))
|
||||
{ strcpy (nanmessage, "SPspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDEePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDEePtr))))
|
||||
{ strcpy (nanmessage, "EePtr"); }
|
||||
|
||||
/* At this point, nandetect = 0 if none of the
|
||||
|
|
@ -3370,17 +3346,17 @@ if (here->B3SOIFDdebugMod > 2)
|
|||
|
||||
if (nandetect == 0)
|
||||
{
|
||||
if (nandetect = isnan (*(here->B3SOIFDEgPtr)))
|
||||
if ((nandetect = isnan (*(here->B3SOIFDEgPtr))))
|
||||
{ strcpy (nanmessage, "EgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDEdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDEdpPtr))))
|
||||
{ strcpy (nanmessage, "EdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDEspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDEspPtr))))
|
||||
{ strcpy (nanmessage, "EspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDGePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDGePtr))))
|
||||
{ strcpy (nanmessage, "GePtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDDPePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDDPePtr))))
|
||||
{ strcpy (nanmessage, "DPePtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDSPePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDSPePtr))))
|
||||
{ strcpy (nanmessage, "SPePtr"); } }
|
||||
|
||||
/* Now check if self-heating caused NaN if nothing else
|
||||
|
|
@ -3388,29 +3364,29 @@ if (here->B3SOIFDdebugMod > 2)
|
|||
|
||||
if (selfheat && nandetect == 0)
|
||||
{
|
||||
if (nandetect = isnan (*(here->B3SOIFDTemptempPtr)))
|
||||
if ((nandetect = isnan (*(here->B3SOIFDTemptempPtr))))
|
||||
{ strcpy (nanmessage, "TemptempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDTempgPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDTempgPtr))))
|
||||
{ strcpy (nanmessage, "TempgPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDTempbPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDTempbPtr))))
|
||||
{ strcpy (nanmessage, "TempbPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDTempePtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDTempePtr))))
|
||||
{ strcpy (nanmessage, "TempePtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDTempdpPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDTempdpPtr))))
|
||||
{ strcpy (nanmessage, "TempdpPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDTempspPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDTempspPtr))))
|
||||
{ strcpy (nanmessage, "TempspPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDGtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDGtempPtr))))
|
||||
{ strcpy (nanmessage, "GtempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDDPtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDDPtempPtr))))
|
||||
{ strcpy (nanmessage, "DPtempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDSPtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDSPtempPtr))))
|
||||
{ strcpy (nanmessage, "SPtempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDEtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDEtempPtr))))
|
||||
{ strcpy (nanmessage, "EtempPtr"); }
|
||||
else if (nandetect = isnan (*(here->B3SOIFDBtempPtr)))
|
||||
else if ((nandetect = isnan (*(here->B3SOIFDBtempPtr))))
|
||||
{ strcpy (nanmessage, "BtempPtr"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs + here->B3SOIFDtempNode)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs + here->B3SOIFDtempNode))))
|
||||
{ strcpy (nanmessage, "tempNode"); }
|
||||
}
|
||||
|
||||
|
|
@ -3419,20 +3395,20 @@ if (here->B3SOIFDdebugMod > 2)
|
|||
|
||||
if (nandetect == 0)
|
||||
{
|
||||
if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDgNode)))
|
||||
if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDgNode))))
|
||||
{ strcpy (nanmessage, "gNode"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDbNode)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDbNode))))
|
||||
{ strcpy (nanmessage, "bNode"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDdNodePrime)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDdNodePrime))))
|
||||
{ strcpy (nanmessage, "dpNode"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDsNodePrime)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDsNodePrime))))
|
||||
{ strcpy (nanmessage, "spNode"); }
|
||||
else if (nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDeNode)))
|
||||
else if ((nandetect = isnan (*(ckt->CKTrhs
|
||||
+ here->B3SOIFDeNode))))
|
||||
{ strcpy (nanmessage, "eNode"); }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -55,8 +55,7 @@ B3SOIFDStrongInversionNoiseEval(double vgs, double vds, B3SOIFDmodel *model,
|
|||
{
|
||||
struct b3soifdSizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Vgst;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
|
||||
double req, ceq;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->B3SOIFDcd) * here->B3SOIFDm;
|
||||
|
|
@ -111,11 +110,10 @@ double noizDens[B3SOIFDNSRCS];
|
|||
double lnNdens[B3SOIFDNSRCS];
|
||||
|
||||
double vgs, vds, Slimit;
|
||||
double N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
|
||||
double n, ExpArg, Ssi, Swi;
|
||||
double T1, T10, T11;
|
||||
double Ssi, Swi;
|
||||
|
||||
int error, i;
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *B3SOIFDnNames[B3SOIFDNSRCS] =
|
||||
|
|
|
|||
|
|
@ -23,9 +23,10 @@ B3SOIFDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
|||
B3SOIFDmodel *model = (B3SOIFDmodel*)inModel;
|
||||
B3SOIFDinstance *here;
|
||||
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
|
||||
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
|
||||
double gdpr, gspr, gds, gbd, gbs, capbd = 0.0, capbs = 0.0;
|
||||
double xcsgb, xcdsb, xcsdb;
|
||||
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0;
|
||||
double FwdSum, RevSum, Gm, Gmbs;
|
||||
|
||||
double m;
|
||||
|
|
|
|||
|
|
@ -41,9 +41,8 @@ CKTnode *tmp;
|
|||
|
||||
double tmp1, tmp2;
|
||||
double nfb0, Cboxt;
|
||||
int itmp1;
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
|
||||
|
|
@ -941,10 +940,10 @@ IFuid tmpName;
|
|||
here->B3SOIFDdNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void**)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -963,10 +962,10 @@ IFuid tmpName;
|
|||
here->B3SOIFDsNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void**)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@ B3SOIFDtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
{
|
||||
B3SOIFDmodel *model = (B3SOIFDmodel*) inModel;
|
||||
B3SOIFDinstance *here;
|
||||
struct b3soifdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
|
||||
struct b3soifdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL;
|
||||
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
|
||||
double SDphi, SDgamma;
|
||||
int Size_Not_Found;
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ double gbbg, gbbdp, gbbb, gbbp, gbbsp, gbbT;
|
|||
double gddpg, gddpdp, gddpsp, gddpb, gddpT;
|
||||
double gsspg, gsspdp, gsspsp, gsspb, gsspT;
|
||||
double gppdp, gppb, gppp, gppT;
|
||||
double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTtdp, gTtsp;
|
||||
double xcTt, cTt, gTtt, gTtg, gTtb, gTtdp, gTtsp;
|
||||
double EDextrinsicCap, ESextrinsicCap;
|
||||
double xcedb, xcesb;
|
||||
|
||||
|
|
|
|||
|
|
@ -97,13 +97,13 @@ B3SOIPDmodel *model = (B3SOIPDmodel*)inModel;
|
|||
B3SOIPDinstance *here;
|
||||
int selfheat;
|
||||
|
||||
double SourceSatCurrent, DrainSatCurrent, Gmin;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double Gmin;
|
||||
double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst = 0.0;
|
||||
double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double evbd, evbs, arg, sarg;
|
||||
double arg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double tol, PhiB, PhiBSWG, MJSWG;
|
||||
double PhiBSWG, MJSWG;
|
||||
double gcgdb, gcggb, gcgsb, gcgeb, gcgT;
|
||||
double gcsdb, gcsgb, gcssb, gcseb, gcsT;
|
||||
double gcddb, gcdgb, gcdsb, gcdeb, gcdT;
|
||||
|
|
@ -115,48 +115,43 @@ double vg, vd, vs, vp, ve, vb;
|
|||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT;
|
||||
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm;
|
||||
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm;
|
||||
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg;
|
||||
double n, dn_dVb, Vtm;
|
||||
double ExpArg, V0;
|
||||
double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;
|
||||
double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0;
|
||||
double Esat, Vdsat;
|
||||
double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat, dAlphaz_dVg, dAlphaz_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT;
|
||||
double Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
|
||||
double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
|
||||
double Vbseff, dVbseff_dVb;
|
||||
double Alphaz, CoxWL;
|
||||
double dVgdt_dVg, dVgdt_dVd, dVgdt_dVb;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVrg, dT0_dT;
|
||||
double CoxWL;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dT;
|
||||
double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT;
|
||||
double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT;
|
||||
double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dT;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT;
|
||||
double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT;
|
||||
double T7, dT7_dVg, dT7_dVd, dT7_dVb;
|
||||
double T8, dT8_dVg, dT8_dVd, dT8_dVb, dT8_dVrg;
|
||||
double T9, dT9_dVg, dT9_dVd, dT9_dVb, dT9_dVrg;
|
||||
double T10, dT10_dVg, dT10_dVb, dT10_dVd;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT = 0.0;
|
||||
double T4, dT4_dVd, dT4_dVb, dT4_dT;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT = 0.0;
|
||||
double T6, dT6_dT = 0.0;
|
||||
double T7, Vdsatii;
|
||||
double T8;
|
||||
double T9;
|
||||
double T10, dT10_dVb;
|
||||
double T11, T12;
|
||||
double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double T100, T101;
|
||||
double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT;
|
||||
double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT;
|
||||
double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb;
|
||||
double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb;
|
||||
double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT;
|
||||
double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb;
|
||||
double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg;
|
||||
double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb;
|
||||
double dRout_Vgs_factor_dVd;
|
||||
double tempv, a1;
|
||||
double Theta0, dTheta0_dVb;
|
||||
double TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg;
|
||||
double a1;
|
||||
|
||||
double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT;
|
||||
double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;
|
||||
double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
|
||||
double diffVds, diffVdsCV;
|
||||
double diffVds;
|
||||
double dAbulk_dVg, dn_dVd ;
|
||||
double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT;
|
||||
double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT;
|
||||
|
|
@ -166,7 +161,7 @@ double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT;
|
|||
double Ids, Gm, Gds, Gmb;
|
||||
double CoxWovL;
|
||||
double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds;
|
||||
double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
|
@ -174,42 +169,38 @@ double qgdo, qgso, cgdo, cgso;
|
|||
double dxpart, sxpart;
|
||||
|
||||
struct b3soipdSizeDependParam *pParam;
|
||||
int ByPass, Check, ChargeComputationNeeded, J, error, I;
|
||||
double junk[50];
|
||||
int ByPass, Check, ChargeComputationNeeded = 0, error;
|
||||
|
||||
double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT;
|
||||
double gddpsp, gddpdp, gddpg, gddpb, gddpT;
|
||||
double gsspsp, gsspdp, gsspg, gsspb, gsspT;
|
||||
double Gbpbs, Gbpps;
|
||||
double vse, vde, ves, ved, veb, vge, delves, vedo, delved;
|
||||
double ves, ved, veb, vge = 0.0, delves, vedo, delved;
|
||||
double vps, vpd, Vps, delvps;
|
||||
double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT;
|
||||
double Vbd, Ves, Vesfb, DeltVthtemp, dDeltVthtemp_dT;
|
||||
double Vbp, dVbp_dVb;
|
||||
double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT;
|
||||
double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT;
|
||||
double dDIBL_Sft_dVb;
|
||||
double diffVdsii ;
|
||||
double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg;
|
||||
double Gjsd, Gjss, Gjsb, GjsT, Gjdd, Gjdb, GjdT;
|
||||
double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT;
|
||||
double Ibp, Iii, Giid, Giig, Giib, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon;
|
||||
double gppb, gppp, gppT;
|
||||
double delTemp, deldelTemp, Temp;
|
||||
double ceqth, ceqqth;
|
||||
double K1, WL;
|
||||
double qjs, gcjsbs, gcjsT;
|
||||
double qjd, gcjdbs, gcjdds, gcjdT;
|
||||
double K1;
|
||||
double qjs = 0.0, gcjsbs, gcjsT;
|
||||
double qjd = 0.0, gcjdbs, gcjdds, gcjdT;
|
||||
double qge;
|
||||
double ceqqe;
|
||||
double ni, Eg, Cbox, Nfb, CboxWL;
|
||||
double ni, Eg, Cbox, CboxWL;
|
||||
double cjsbs;
|
||||
double dVfbeff_dVrg;
|
||||
double qinv, qgate, qbody, qdrn, qsrc, qsub, cqgate, cqbody, cqdrn, cqsub, cqtemp;
|
||||
double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd;
|
||||
double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb;
|
||||
double qinv, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0;
|
||||
double cqgate, cqbody, cqdrn, cqsub, cqtemp;
|
||||
double Cgg, Cgd, Cgb;
|
||||
double Csg, Csd, Csb, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1;
|
||||
double Vbseff0;
|
||||
double Vdsatii ,dVdsatii_dVg ,dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT;
|
||||
double Ibjt ,dIbjt_dVb ,dIbjt_dVd ,dIbjt_dT;
|
||||
double Ibs1 ,dIbs1_dVb ,dIbs1_dT;
|
||||
double Ibs2 ,dIbs2_dVb ,dIbs2_dT;
|
||||
double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT;
|
||||
|
|
@ -218,20 +209,13 @@ double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT;
|
|||
double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT;
|
||||
double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT;
|
||||
double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT;
|
||||
double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT;
|
||||
double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT;
|
||||
double ExpVbs4, dExpVbs4_dVb, dExpVbs4_dT;
|
||||
double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT;
|
||||
double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT;
|
||||
double ExpVbd4, dExpVbd4_dVb, dExpVbd4_dT;
|
||||
double WTsi, NVtm1, NVtm2;
|
||||
double Ic ,dIc_dVb ,dIc_dVd;
|
||||
double Ibs ,dIbs_dVb ,dIbs_dVd ;
|
||||
double Ibd ,dIbd_dVb;
|
||||
double Ibs;
|
||||
double Ibd;
|
||||
double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT;
|
||||
double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ;
|
||||
double Qac0 ,dQac0_dVb ,dQac0_dVd;
|
||||
double Qdep0 ,dQdep0_dVb;
|
||||
double Qsub0 = 0.0, dQsub0_dVg, dQsub0_dVb, dQsub0_dVd;
|
||||
double Qac0 = 0.0, dQac0_dVb, dQac0_dVd;
|
||||
double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT;
|
||||
double Ce1b ,Ce1e, Ce1T;
|
||||
double dQac0_dVrg, dQsub0_dVrg;
|
||||
|
|
@ -242,7 +226,7 @@ double rds0, ua, ub, uc;
|
|||
double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT;
|
||||
double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT;
|
||||
double dVfbeff_dT, dQac0_dT, dQsub0_dT;
|
||||
double CbT, CsT, CgT, CeT;
|
||||
double CbT, CsT, CgT;
|
||||
|
||||
|
||||
/* v2.0 release */
|
||||
|
|
@ -254,12 +238,12 @@ double dVgst_dVd;
|
|||
double Vdsatii0, dVdsatii0_dT;
|
||||
double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT, dTempRatio_dT;
|
||||
double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT;
|
||||
double dNVtm1_dT, dNVtm2_dT;
|
||||
double dNVtm1_dT;
|
||||
double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT;
|
||||
double TempRatioMinus1;
|
||||
double Ahli, dAhli_dT;
|
||||
double WsTsi, WdTsi;
|
||||
double dPhiBSWG_dT, dcjsbs_dT, darg_dT, ddT3_dVb_dT;
|
||||
double dPhiBSWG_dT, dcjsbs_dT, darg_dT = 0.0, ddT3_dVb_dT = 0.0;
|
||||
double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7;
|
||||
double CoxWLb, CoxWLcenb;
|
||||
double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT;
|
||||
|
|
@ -284,7 +268,7 @@ double T3zb, lt1zb, ltwzb, Theta0zb;
|
|||
double Delt_vthzb, dDelt_vthzb_dT;
|
||||
double DeltVthwzb, dDeltVthwzb_dT;
|
||||
double DeltVthtempzb, dDeltVthtempzb_dT;
|
||||
double Vthzb, dVthzb_dT, Vfbzb, dVfbzb_dT;
|
||||
double Vthzb = 0.0, dVthzb_dT = 0.0, Vfbzb, dVfbzb_dT;
|
||||
|
||||
|
||||
/* v2.2 release */
|
||||
|
|
@ -293,9 +277,10 @@ double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb;
|
|||
double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb;
|
||||
double ceqgate;
|
||||
double dT0_dVox, Voxeff, dVoxeff_dVox;
|
||||
double dVox_dT, dVaux_dT, dIgb_dT;
|
||||
double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVb, dVoxacc_dT;
|
||||
double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd, dVoxdepinv_dT;
|
||||
double dVox_dT = 0.0, dVaux_dT = 0.0, dIgb_dT;
|
||||
double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVb;
|
||||
double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd;
|
||||
double dVoxdepinv_dT = 0.0;
|
||||
double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT;
|
||||
double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT;
|
||||
double gigs, gigd, gigb, gigg;
|
||||
|
|
|
|||
|
|
@ -54,9 +54,8 @@ B3SOIPDStrongInversionNoiseEval(double vgs, double vds, B3SOIPDmodel *model,
|
|||
double temp)
|
||||
{
|
||||
struct b3soipdSizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Vgst;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
|
||||
double req, ceq;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->B3SOIPDcd) * here->B3SOIPDm;
|
||||
|
|
@ -113,11 +112,10 @@ double noizDens[B3SOIPDNSRCS];
|
|||
double lnNdens[B3SOIPDNSRCS];
|
||||
|
||||
double vgs, vds, Slimit;
|
||||
double N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
|
||||
double n, ExpArg, Ssi, Swi;
|
||||
double T1, T10, T11;
|
||||
double Ssi, Swi;
|
||||
|
||||
int error, i;
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *B3SOIPDnNames[B3SOIPDNSRCS] =
|
||||
|
|
|
|||
|
|
@ -23,9 +23,10 @@ B3SOIPDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
|||
B3SOIPDmodel *model = (B3SOIPDmodel*)inModel;
|
||||
B3SOIPDinstance *here;
|
||||
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
|
||||
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
|
||||
double gdpr, gspr, gds, gbd, gbs, capbd = 0.0, capbs = 0.0;
|
||||
double xcsgb, xcdsb, xcsdb;
|
||||
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap;
|
||||
double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0;
|
||||
double FwdSum, RevSum, Gm, Gmbs;
|
||||
|
||||
double m;
|
||||
|
|
|
|||
|
|
@ -40,11 +40,9 @@ B3SOIPDinstance *here;
|
|||
int error;
|
||||
CKTnode *tmp;
|
||||
|
||||
double tmp1, tmp2;
|
||||
double nfb0, Cboxt;
|
||||
int itmp1;
|
||||
double Cboxt;
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
|
||||
|
|
@ -1131,10 +1129,10 @@ IFuid tmpName;
|
|||
here->B3SOIPDdNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void**)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1153,10 +1151,10 @@ IFuid tmpName;
|
|||
here->B3SOIPDsNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void**)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,14 +53,14 @@ B3SOIPDtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
{
|
||||
B3SOIPDmodel *model = (B3SOIPDmodel*) inModel;
|
||||
B3SOIPDinstance *here;
|
||||
struct b3soipdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
|
||||
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;
|
||||
double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
|
||||
struct b3soipdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL;
|
||||
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
|
||||
double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
|
||||
double SDphi, SDgamma;
|
||||
int Size_Not_Found;
|
||||
|
||||
/* v2.0 release */
|
||||
double tmp3, T7, T8, T9;
|
||||
double tmp3, T7;
|
||||
|
||||
|
||||
/* loop through all the B3SOIPD device models */
|
||||
|
|
|
|||
|
|
@ -32,59 +32,52 @@ BSIM3v0load(GENmodel *inModel, CKTcircuit *ckt)
|
|||
BSIM3v0model *model = (BSIM3v0model*)inModel;
|
||||
BSIM3v0instance *here;
|
||||
double SourceSatCurrent, DrainSatCurrent;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat = 0.0, VgstNVt, ExpVgst = 0.0;
|
||||
double cdrain, cdhat = 0.0, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double czbd, czbdsw, czbs, czbssw, evbd, evbs, arg, sarg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb;
|
||||
double gcsgb, gcssb, tol, PhiB, PhiBSW, MJ, MJSW;
|
||||
double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
|
||||
double qgate, qbulk, qdrn, qsrc, cqgate, cqbulk, cqdrn;
|
||||
double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc, cqgate, cqbulk, cqdrn;
|
||||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVbs_dVb;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd;
|
||||
double Vgst, dVgs_eff_dVg;
|
||||
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm;
|
||||
double ExpArg, ExpArg1;
|
||||
double n, dn_dVb, Vtm;
|
||||
double ExpArg;
|
||||
double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb;
|
||||
double ueff, dueff_dVg, dueff_dVd, dueff_dVb;
|
||||
double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0;
|
||||
double Esat, Vdsat;
|
||||
double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb;
|
||||
double Ilimit, Iexp, dIexp_dVg, dIexp_dVd, dIexp_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb;
|
||||
double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb;
|
||||
double Arg1, Arg2, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL;
|
||||
double dqbulk_dVb, dVgdt_dVg, dVgdt_dVd, dVgdt_dVb;
|
||||
double Arg1, One_Third_CoxWL, Two_Third_CoxWL, CoxWL;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb;
|
||||
double T1, dT1_dVg, dT1_dVd, dT1_dVb;
|
||||
double T2, dT2_dVg, dT2_dVd, dT2_dVb;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb;
|
||||
double T4, dT4_dVg, dT4_dVd, dT4_dVb;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb;
|
||||
double T6, dT6_dVg, dT6_dVd, dT6_dVb;
|
||||
double T7, dT7_dVg, dT7_dVd, dT7_dVb;
|
||||
double T8, dT8_dVg, dT8_dVd, dT8_dVb;
|
||||
double T9, dT9_dVg, dT9_dVd, dT9_dVb;
|
||||
double T10, dT10_dVg, dT10_dVb, dT10_dVd;
|
||||
double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double T100, T101;
|
||||
double T5;
|
||||
double T6;
|
||||
double T7;
|
||||
double T8;
|
||||
double T10;
|
||||
double Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb;
|
||||
double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb;
|
||||
double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb;
|
||||
double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb;
|
||||
double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb;
|
||||
double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Pmos_factor;
|
||||
double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb;
|
||||
double dRout_Vgs_factor_dVd;
|
||||
double Theta0, dTheta0_dVb;
|
||||
double TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, Pmos_factor;
|
||||
double tempv, a1;
|
||||
|
||||
double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb;
|
||||
double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb;
|
||||
double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
|
||||
double diffVds, diffVdsCV;
|
||||
double diffVds;
|
||||
double dAbulk_dVg, dn_dVd ;
|
||||
double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb;
|
||||
double gche, dgche_dVg, dgche_dVd, dgche_dVb;
|
||||
|
|
@ -93,31 +86,29 @@ double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb;
|
|||
double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb;
|
||||
double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb;
|
||||
double Ids, Gm, Gds, Gmb;
|
||||
double Isub, Isubd, Isubs, Gbd, Gbg, Gbb;
|
||||
double Isub, Gbd, Gbg, Gbb;
|
||||
double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb;
|
||||
double CoxWovL;
|
||||
double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds;
|
||||
double Vgst2Vtm, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff = 0.0, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
||||
double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift, csreq;
|
||||
double gcqdb,gcqsb,gcqgb,gcqbb,vss;
|
||||
double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift;
|
||||
double gcqdb,gcqsb,gcqgb,gcqbb;
|
||||
double dxpart, sxpart;
|
||||
|
||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp;
|
||||
double gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||
double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd;
|
||||
double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1, Qac0, Qsub0;
|
||||
double Cgg, Cgd, Cgb;
|
||||
double Csg, Csd, Csb, Cbg, Cbd, Cbb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0;
|
||||
double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb;
|
||||
|
||||
struct bsim3v0SizeDependParam *pParam;
|
||||
int ByPass, Check, ChargeComputationNeeded, J, error, I;
|
||||
double junk[50];
|
||||
|
||||
double m;
|
||||
int ByPass, Check, ChargeComputationNeeded = 0, error;
|
||||
double m = 0.0;
|
||||
|
||||
for (; model != NULL; model = model->BSIM3v0nextModel)
|
||||
{ for (here = model->BSIM3v0instances; here != NULL;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ StrongInversionNoiseEval(double vgs, double vds, BSIM3v0model *model,
|
|||
{
|
||||
struct bsim3v0SizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Vgst;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->BSIM3v0cd) * here->BSIM3v0m;
|
||||
|
|
@ -85,11 +85,10 @@ double noizDens[BSIM3v0NSRCS];
|
|||
double lnNdens[BSIM3v0NSRCS];
|
||||
|
||||
double vgs, vds, Slimit;
|
||||
double N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
|
||||
double n, ExpArg, Ssi, Swi;
|
||||
double T1, T10, T11;
|
||||
double Ssi, Swi;
|
||||
|
||||
int error, i;
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *BSIM3v0nNames[BSIM3v0NSRCS] =
|
||||
|
|
|
|||
|
|
@ -31,9 +31,7 @@ BSIM3v0instance *here;
|
|||
int error;
|
||||
CKTnode *tmp;
|
||||
|
||||
double tmp1, tmp2;
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
/* loop through all the BSIM3v0 device models */
|
||||
|
|
@ -801,10 +799,10 @@ IFuid tmpName;
|
|||
here->BSIM3v0dNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -822,10 +820,10 @@ IFuid tmpName;
|
|||
here->BSIM3v0sNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,9 +30,9 @@ BSIM3v0temp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
{
|
||||
register BSIM3v0model *model = (BSIM3v0model*) inModel;
|
||||
register BSIM3v0instance *here;
|
||||
struct bsim3v0SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
|
||||
double tmp, tmp1, tmp2, Eg, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
|
||||
struct bsim3v0SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam = NULL;
|
||||
double tmp1, tmp2, Eg, ni, T0, T1, T2, T3, Ldrn, Wdrn;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
|
||||
int Size_Not_Found;
|
||||
|
||||
/* loop through all the BSIM3v0 device models */
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@ Author: 1991 JianHui Huang and Min-Chie Jeng.
|
|||
File: bsim3v0itf.h
|
||||
**********/
|
||||
|
||||
#ifdef DEV_bsim3v0
|
||||
#ifndef DEV_bsim3v0
|
||||
#define DEV_bsim3v0
|
||||
|
||||
SPICEdev *get_bsim3v0_info(void);
|
||||
|
||||
|
|
|
|||
|
|
@ -38,60 +38,54 @@ BSIM3v1load(GENmodel *inModel, CKTcircuit *ckt)
|
|||
BSIM3v1model *model = (BSIM3v1model*)inModel;
|
||||
BSIM3v1instance *here;
|
||||
double SourceSatCurrent, DrainSatCurrent;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst = 0.0;
|
||||
double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb;
|
||||
double gcsgb, gcssb, tol, PhiB, PhiBSW, MJ, MJSW, PhiBSWG, MJSWG;
|
||||
double gcsgb, gcssb, PhiB, PhiBSW, MJ, MJSW, PhiBSWG, MJSWG;
|
||||
double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
|
||||
double qgate, qbulk, qdrn, qsrc, cqgate, cqbulk, cqdrn;
|
||||
double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc, cqgate, cqbulk, cqdrn;
|
||||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVbs_dVb;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd;
|
||||
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm;
|
||||
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm;
|
||||
double ExpArg, ExpArg1, V0;
|
||||
double n, dn_dVb, Vtm;
|
||||
double ExpArg, V0;
|
||||
double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb;
|
||||
double ueff, dueff_dVg, dueff_dVd, dueff_dVb;
|
||||
double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0;
|
||||
double Esat, Vdsat;
|
||||
double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb;
|
||||
double Ilimit, Iexp, dIexp_dVg, dIexp_dVd, dIexp_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb;
|
||||
double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb;
|
||||
double Arg1, Arg2, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL;
|
||||
double dqbulk_dVb, dVgdt_dVg, dVgdt_dVd, dVgdt_dVb;
|
||||
double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb;
|
||||
double T1, dT1_dVg, dT1_dVd, dT1_dVb;
|
||||
double T2, dT2_dVg, dT2_dVd, dT2_dVb;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb;
|
||||
double T4, dT4_dVg, dT4_dVd, dT4_dVb;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb;
|
||||
double T6, dT6_dVg, dT6_dVd, dT6_dVb;
|
||||
double T7, dT7_dVg, dT7_dVd, dT7_dVb;
|
||||
double T8, dT8_dVg, dT8_dVd, dT8_dVb;
|
||||
double T9, dT9_dVg, dT9_dVd, dT9_dVb;
|
||||
double T10, dT10_dVg, dT10_dVb, dT10_dVd;
|
||||
double T4;
|
||||
double T5;
|
||||
double T6;
|
||||
double T7;
|
||||
double T8;
|
||||
double T9;
|
||||
double T10;
|
||||
double T11, T12;
|
||||
double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double T100, T101;
|
||||
double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb;
|
||||
double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb;
|
||||
double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb;
|
||||
double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb;
|
||||
double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb;
|
||||
double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg;
|
||||
double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb;
|
||||
double dRout_Vgs_factor_dVd;
|
||||
double Theta0, dTheta0_dVb;
|
||||
double TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg;
|
||||
double tempv, a1;
|
||||
|
||||
double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb;
|
||||
double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb;
|
||||
double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
|
||||
double diffVds, diffVdsCV;
|
||||
double diffVds;
|
||||
double dAbulk_dVg, dn_dVd ;
|
||||
double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb;
|
||||
double gche, dgche_dVg, dgche_dVd, dgche_dVb;
|
||||
|
|
@ -100,31 +94,30 @@ double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb;
|
|||
double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb;
|
||||
double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb;
|
||||
double Ids, Gm, Gds, Gmb;
|
||||
double Isub, Isubd, Isubs, Gbd, Gbg, Gbb;
|
||||
double Isub, Gbd, Gbg, Gbb;
|
||||
double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb;
|
||||
double CoxWovL;
|
||||
double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds;
|
||||
double Vgst2Vtm, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff = 0.0, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
||||
double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift, csreq;
|
||||
double gcqdb,gcqsb,gcqgb,gcqbb,vss;
|
||||
double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift;
|
||||
double gcqdb,gcqsb,gcqgb,gcqbb;
|
||||
double dxpart, sxpart;
|
||||
|
||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp;
|
||||
double gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||
double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd;
|
||||
double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1, Qac0, Qsub0;
|
||||
double Cgg, Cgd, Cgb;
|
||||
double Csg, Csd, Csb, Cbg, Cbd, Cbb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0;
|
||||
double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb;
|
||||
|
||||
double m;
|
||||
double m = 0.0;
|
||||
|
||||
struct bsim3v1SizeDependParam *pParam;
|
||||
int ByPass, Check, ChargeComputationNeeded, J, error, I;
|
||||
double junk[50];
|
||||
int ByPass, Check, ChargeComputationNeeded = 0, error;
|
||||
|
||||
for (; model != NULL; model = model->BSIM3v1nextModel)
|
||||
{ for (here = model->BSIM3v1instances; here != NULL;
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ StrongInversionNoiseEval_b3v1(double vgs, double vds, BSIM3v1model *model,
|
|||
{
|
||||
struct bsim3v1SizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Vgst;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->BSIM3v1cd) * here->BSIM3v1m;
|
||||
|
|
@ -107,11 +107,10 @@ double noizDens[BSIM3v1NSRCS];
|
|||
double lnNdens[BSIM3v1NSRCS];
|
||||
|
||||
double vgs, vds, Slimit;
|
||||
double N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
|
||||
double n, ExpArg, Ssi, Swi;
|
||||
double T1, T10, T11;
|
||||
double Ssi, Swi;
|
||||
|
||||
int error, i;
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *BSIM3v1nNames[BSIM3v1NSRCS] =
|
||||
|
|
|
|||
|
|
@ -37,9 +37,7 @@ BSIM3v1instance *here;
|
|||
int error;
|
||||
CKTnode *tmp;
|
||||
|
||||
double tmp1, tmp2;
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
/* loop through all the BSIM3v1 device models */
|
||||
|
|
@ -826,10 +824,10 @@ IFuid tmpName;
|
|||
here->BSIM3v1dNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -848,10 +846,10 @@ IFuid tmpName;
|
|||
here->BSIM3v1sNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ BSIM3v1temp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
{
|
||||
BSIM3v1model *model = (BSIM3v1model*) inModel;
|
||||
BSIM3v1instance *here;
|
||||
struct bsim3v1SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
|
||||
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
|
||||
struct bsim3v1SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam = NULL;
|
||||
double tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, Ldrn, Wdrn;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
|
||||
int Size_Not_Found;
|
||||
|
||||
/* loop through all the BSIM3v1 device models */
|
||||
|
|
|
|||
|
|
@ -33,59 +33,52 @@ BSIM3v1Aload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
BSIM3v1Amodel *model = (BSIM3v1Amodel*)inModel;
|
||||
BSIM3v1Ainstance *here;
|
||||
double SourceSatCurrent, DrainSatCurrent;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst = 0.0;
|
||||
double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double czbd, czbdsw, czbs, czbssw, evbd, evbs, arg, sarg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
|
||||
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb;
|
||||
double gcsgb, gcssb, tol, PhiB, PhiBSW, MJ, MJSW;
|
||||
double gcsgb, gcssb, PhiB, PhiBSW, MJ, MJSW;
|
||||
double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
|
||||
double qgate, qbulk, qdrn, qsrc, cqgate, cqbulk, cqdrn;
|
||||
double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc, cqgate, cqbulk, cqdrn;
|
||||
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVbs_dVb;
|
||||
double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd;
|
||||
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd;
|
||||
double Vgst, dVgs_eff_dVg;
|
||||
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm;
|
||||
double ExpArg, ExpArg1;
|
||||
double n, dn_dVb, Vtm;
|
||||
double ExpArg;
|
||||
double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb;
|
||||
double ueff, dueff_dVg, dueff_dVd, dueff_dVb;
|
||||
double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0;
|
||||
double Esat, Vdsat;
|
||||
double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb;
|
||||
double Ilimit, Iexp, dIexp_dVg, dIexp_dVd, dIexp_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb;
|
||||
double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat;
|
||||
double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb;
|
||||
double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb;
|
||||
double Arg1, Arg2, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL;
|
||||
double dqbulk_dVb, dVgdt_dVg, dVgdt_dVd, dVgdt_dVb;
|
||||
double Arg1, One_Third_CoxWL, Two_Third_CoxWL, CoxWL;
|
||||
double T0, dT0_dVg, dT0_dVd, dT0_dVb;
|
||||
double T1, dT1_dVg, dT1_dVd, dT1_dVb;
|
||||
double T2, dT2_dVg, dT2_dVd, dT2_dVb;
|
||||
double T3, dT3_dVg, dT3_dVd, dT3_dVb;
|
||||
double T4, dT4_dVg, dT4_dVd, dT4_dVb;
|
||||
double T5, dT5_dVg, dT5_dVd, dT5_dVb;
|
||||
double T6, dT6_dVg, dT6_dVd, dT6_dVb;
|
||||
double T7, dT7_dVg, dT7_dVd, dT7_dVb;
|
||||
double T8, dT8_dVg, dT8_dVd, dT8_dVb;
|
||||
double T9, dT9_dVg, dT9_dVd, dT9_dVb;
|
||||
double T10, dT10_dVg, dT10_dVb, dT10_dVd;
|
||||
double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double T100, T101;
|
||||
double T5;
|
||||
double T6;
|
||||
double T7;
|
||||
double T8;
|
||||
double T10;
|
||||
double Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;
|
||||
double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb;
|
||||
double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb;
|
||||
double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb;
|
||||
double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb;
|
||||
double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb;
|
||||
double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Pmos_factor;
|
||||
double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb;
|
||||
double dRout_Vgs_factor_dVd;
|
||||
double Theta0, dTheta0_dVb;
|
||||
double TempRatio, tmp1, tmp2, tmp3, tmp4;
|
||||
double DIBL_Sft, dDIBL_Sft_dVd, Pmos_factor;
|
||||
double tempv, a1;
|
||||
|
||||
double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb;
|
||||
double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb;
|
||||
double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
|
||||
double diffVds, diffVdsCV;
|
||||
double diffVds;
|
||||
double dAbulk_dVg, dn_dVd ;
|
||||
double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb;
|
||||
double gche, dgche_dVg, dgche_dVd, dgche_dVb;
|
||||
|
|
@ -94,31 +87,30 @@ double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb;
|
|||
double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb;
|
||||
double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb;
|
||||
double Ids, Gm, Gds, Gmb;
|
||||
double Isub, Isubd, Isubs, Gbd, Gbg, Gbb;
|
||||
double Isub, Gbd, Gbg, Gbb;
|
||||
double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb;
|
||||
double CoxWovL;
|
||||
double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds;
|
||||
double Vgst2Vtm, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff = 0.0, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
||||
double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift, csreq;
|
||||
double gcqdb,gcqsb,gcqgb,gcqbb,vss;
|
||||
double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift;
|
||||
double gcqdb,gcqsb,gcqgb,gcqbb;
|
||||
double dxpart, sxpart;
|
||||
|
||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp;
|
||||
double gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||
double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd;
|
||||
double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1, Qac0, Qsub0;
|
||||
double Cgg, Cgd, Cgb;
|
||||
double Csg, Csd, Csb, Cbg, Cbd, Cbb;
|
||||
double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0;
|
||||
double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb;
|
||||
|
||||
double m;
|
||||
double m = 0.0;
|
||||
|
||||
struct bsim3v1aSizeDependParam *pParam;
|
||||
int ByPass, Check, ChargeComputationNeeded, J, error, I;
|
||||
double junk[50];
|
||||
int ByPass, Check, ChargeComputationNeeded = 0, error;
|
||||
|
||||
for (; model != NULL; model = model->BSIM3v1AnextModel)
|
||||
{ for (here = model->BSIM3v1Ainstances; here != NULL;
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ StrongInversionNoiseEval_b3v1a(double vgs, double vds, BSIM3v1Amodel *model,
|
|||
{
|
||||
struct bsim3v1aSizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl, Vgst;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||
|
||||
pParam = here->pParam;
|
||||
cd = fabs(here->BSIM3v1Acd) * here->BSIM3v1Am;
|
||||
|
|
@ -86,11 +86,10 @@ double noizDens[BSIM3v1ANSRCS];
|
|||
double lnNdens[BSIM3v1ANSRCS];
|
||||
|
||||
double vgs, vds, Slimit;
|
||||
double N0, Nl;
|
||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
|
||||
double n, ExpArg, Ssi, Swi;
|
||||
double T1, T10, T11;
|
||||
double Ssi, Swi;
|
||||
|
||||
int error, i;
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *BSIM3v1AnNames[BSIM3v1ANSRCS] =
|
||||
|
|
|
|||
|
|
@ -32,9 +32,7 @@ BSIM3v1Ainstance *here;
|
|||
int error;
|
||||
CKTnode *tmp;
|
||||
|
||||
double tmp1, tmp2;
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
/* loop through all the BSIM3v1A device models */
|
||||
|
|
@ -802,10 +800,10 @@ IFuid tmpName;
|
|||
here->BSIM3v1AdNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -824,10 +822,10 @@ IFuid tmpName;
|
|||
here->BSIM3v1AsNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,9 +31,9 @@ BSIM3v1Atemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
{
|
||||
BSIM3v1Amodel *model = (BSIM3v1Amodel*) inModel;
|
||||
BSIM3v1Ainstance *here;
|
||||
struct bsim3v1aSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
|
||||
double tmp, tmp1, tmp2, Eg, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
|
||||
struct bsim3v1aSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam = NULL;
|
||||
double tmp1, tmp2, Eg, ni, T0, T1, T2, T3, Ldrn, Wdrn;
|
||||
double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
|
||||
int Size_Not_Found;
|
||||
|
||||
/* loop through all the BSIM3v1A device models */
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ BSIM3v1Sload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
BSIM3v1Smodel *model = (BSIM3v1Smodel*)inModel;
|
||||
BSIM3v1Sinstance *here;
|
||||
double SourceSatCurrent, DrainSatCurrent;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;
|
||||
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst = 0.0;
|
||||
double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;
|
||||
double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg;
|
||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||
|
|
@ -63,7 +63,7 @@ double T3, dT3_dVg, dT3_dVd, dT3_dVb;
|
|||
double T4;
|
||||
double T5;
|
||||
double T6;
|
||||
double T7, dT7_dVg, dT7_dVd, dT7_dVb;
|
||||
double T7;
|
||||
double T8;
|
||||
double T9;
|
||||
double T10;
|
||||
|
|
@ -94,7 +94,7 @@ double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb;
|
|||
double CoxWovL;
|
||||
double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds;
|
||||
double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;
|
||||
double Leff, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double Leff = 0.0, Weff, dWeff_dVg, dWeff_dVb;
|
||||
double AbulkCV, dAbulkCV_dVb;
|
||||
double qgdo, qgso, cgdo, cgso;
|
||||
|
||||
|
|
@ -110,7 +110,7 @@ double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0;
|
|||
double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb;
|
||||
|
||||
struct bsim3v1sSizeDependParam *pParam;
|
||||
int ByPass, Check, ChargeComputationNeeded, error;
|
||||
int ByPass, Check, ChargeComputationNeeded = 0, error;
|
||||
|
||||
for (; model != NULL; model = model->BSIM3v1SnextModel)
|
||||
{ for (here = model->BSIM3v1Sinstances; here != NULL;
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ BSIM3v1Sinstance *here;
|
|||
int error;
|
||||
CKTnode *tmp;
|
||||
|
||||
CKTnode *tmpNode;
|
||||
CKTnode *tmpNode[1];
|
||||
IFuid tmpName;
|
||||
|
||||
|
||||
|
|
@ -854,10 +854,10 @@ IFuid tmpName;
|
|||
here->BSIM3v1SdNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,1,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -876,10 +876,10 @@ IFuid tmpName;
|
|||
here->BSIM3v1SsNodePrime = tmp->number;
|
||||
|
||||
if (ckt->CKTcopyNodesets) {
|
||||
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode->nsGiven) {
|
||||
tmp->nodeset=tmpNode->nodeset;
|
||||
tmp->nsGiven=tmpNode->nsGiven;
|
||||
if (CKTinst2Node(ckt,here,3,(void **)tmpNode,&tmpName)==OK) {
|
||||
if (tmpNode[0]->nsGiven) {
|
||||
tmp->nodeset=tmpNode[0]->nodeset;
|
||||
tmp->nsGiven=tmpNode[0]->nsGiven;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue