From 4e4124e5cb9ed8608cdbd2553ccbdd518d067d82 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 31 Mar 2013 22:54:08 +0200 Subject: [PATCH 001/257] Removed a duplicate entry in the setup routine of the BSIM3SOIDD model --- src/spicelib/devices/bsim3soi_dd/b3soiddset.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddset.c b/src/spicelib/devices/bsim3soi_dd/b3soiddset.c index a15f9b899..f103ddff1 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddset.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddset.c @@ -1268,7 +1268,6 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(B3SOIDDBspPtr, B3SOIDDbNode, B3SOIDDsNodePrime) TSTALLOC(B3SOIDDBbPtr, B3SOIDDbNode, B3SOIDDbNode) - TSTALLOC(B3SOIDDEbPtr, B3SOIDDeNode, B3SOIDDbNode) TSTALLOC(B3SOIDDEePtr, B3SOIDDeNode, B3SOIDDeNode) TSTALLOC(B3SOIDDGgPtr, B3SOIDDgNode, B3SOIDDgNode) From 6196ba6e0f2442dba433e5f9eb9bb950db71efde Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 31 Mar 2013 23:28:10 +0200 Subject: [PATCH 002/257] Removed a duplicate entry in the setup routine of the BSIM3SOIPD model --- src/spicelib/devices/bsim3soi_pd/b3soipdset.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c b/src/spicelib/devices/bsim3soi_pd/b3soipdset.c index 81f8272a5..eeb731037 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdset.c @@ -1395,7 +1395,6 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(B3SOIPDDPePtr, B3SOIPDdNodePrime, B3SOIPDeNode) TSTALLOC(B3SOIPDSPePtr, B3SOIPDsNodePrime, B3SOIPDeNode) - TSTALLOC(B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode) TSTALLOC(B3SOIPDEePtr, B3SOIPDeNode, B3SOIPDeNode) TSTALLOC(B3SOIPDGgPtr, B3SOIPDgNode, B3SOIPDgNode) From 5cfc92eac3a7104c982adce00e7c9f92cbb45238 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 1 Apr 2013 02:24:12 +0200 Subject: [PATCH 003/257] Whitespaces --- src/spicelib/devices/bsim4v5/b4v5set.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/bsim4v5/b4v5set.c b/src/spicelib/devices/bsim4v5/b4v5set.c index d84db6a15..3d23a91a8 100644 --- a/src/spicelib/devices/bsim4v5/b4v5set.c +++ b/src/spicelib/devices/bsim4v5/b4v5set.c @@ -2034,7 +2034,7 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(BSIM4v5BbpPtr, BSIM4v5bNode, BSIM4v5bNodePrime) TSTALLOC(BSIM4v5BsbPtr, BSIM4v5bNode, BSIM4v5sbNode) TSTALLOC(BSIM4v5BbPtr, BSIM4v5bNode, BSIM4v5bNode) - } + } if (model->BSIM4v5rdsMod) { TSTALLOC(BSIM4v5DgpPtr, BSIM4v5dNode, BSIM4v5gNodePrime) From 5c388d85cf71eae66160caac113168a48114ae59 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 1 Apr 2013 16:08:31 +0200 Subject: [PATCH 004/257] sharedspice.c: update stopping printsend thread --- src/sharedspice.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/sharedspice.c b/src/sharedspice.c index 941db8386..e95c8ec96 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -244,7 +244,6 @@ mutexType fputsMutex; static bool is_initialized = FALSE; static char* no_init = "Error: ngspice is not initialized!\n Run ngSpice_Init first"; -static bool printstopp = FALSE; /*helper function*//* static struct plot * @@ -293,6 +292,9 @@ static threadId_t tid, printtid, bgtid = (threadId_t) 0; static bool fl_running = FALSE; static bool fl_exited = TRUE; +static bool printstopp = FALSE; +static bool ps_exited = TRUE; + #if defined(__MINGW32__) || defined(_MSC_VER) #define EXPORT_FLAVOR WINAPI #else @@ -381,6 +383,7 @@ runc(char* command) char buf[1024] = ""; sighandler oldHandler; #ifdef THREADS + int timeout = 0; char *string; bool fl_bg = FALSE; command_id = threadid_self(); @@ -392,12 +395,26 @@ runc(char* command) #ifndef low_latency /* stop the printf thread 'printsend()' */ else if (cieq("bg_pstop", command)) { - printstopp = TRUE; + while (!ps_exited && timeout < 100) { + printstopp = TRUE; + #if defined(__MINGW32__) || defined(_MSC_VER) - Sleep(100); // va: windows native + Sleep(100); // va: windows native #else - usleep(10000); + usleep(10000); #endif + timeout++; + } + if (!ps_exited) { + fprintf(stderr, "Error: Couldn't stop printsend thread\n"); + return EXIT_BAD; + } + else + fprintf(stdout, "Printsend thread stopped with timeout = %d\n", timeout); +#ifdef HAVE_LIBPTHREAD + pthread_join(printtid, NULL); +#endif + printstopp = FALSE; return 2; } #endif @@ -408,7 +425,7 @@ runc(char* command) #endif /* Catch Ctrl-C to break simulations */ -#if !defined(_MSC_VER) /*&& !defined(__MINGW32__) */ +#if 1 //!defined(_MSC_VER) /*&& !defined(__MINGW32__) */ oldHandler = signal(SIGINT, (SIGNAL_FUNCTION) ft_sigintr); if (SETJMP(jbuf, 1) != 0) { signal(SIGINT, oldHandler); @@ -627,7 +644,14 @@ bot: } #endif - com_version(NULL); +// com_version(NULL); + fprintf(cp_out, + "******\n" + "** %s-%s\n", + ft_sim->simulator, ft_sim->version); + if (Spice_Build_Date != NULL && *Spice_Build_Date != 0) + fprintf(cp_out, "** Creation Date: %s\n", Spice_Build_Date); + fprintf(cp_out, "******\n"); is_initialized = TRUE; @@ -722,6 +746,7 @@ int ngSpice_Circ(char** circa){ if ( ! setjmp(errbufm) ) { intermj = 0; + immediate = FALSE; /* count the entries */ while (circa[entries]) { entries++; @@ -1187,6 +1212,8 @@ static char *outsend = NULL; static void printsend(void) { + ps_exited = FALSE; + printstopp = FALSE; for (;;) { #if defined(__MINGW32__) || defined(_MSC_VER) Sleep(50); // loop delay @@ -1198,6 +1225,7 @@ printsend(void) mutex_lock(&fputsMutex); outsend = outstorage(NULL, FALSE); mutex_unlock(&fputsMutex); + break; } mutex_lock(&fputsMutex); @@ -1210,6 +1238,7 @@ printsend(void) tfree(outsend); } } + ps_exited = TRUE; } /* remove the first entry of a wordlist, but keep wl->wl_word */ From eaa830601be8f64e2d0cf8cd1a1d8270ac28daa6 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 1 Apr 2013 17:22:06 +0200 Subject: [PATCH 005/257] Aligned all the TSTALLOC calls in the setup routine of the JFET model --- src/spicelib/devices/jfet/jfetset.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/spicelib/devices/jfet/jfetset.c b/src/spicelib/devices/jfet/jfetset.c index b23b4a8a8..4bcf17d70 100644 --- a/src/spicelib/devices/jfet/jfetset.c +++ b/src/spicelib/devices/jfet/jfetset.c @@ -166,24 +166,18 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(JFETdrainDrainPrimePtr,JFETdrainNode,JFETdrainPrimeNode) TSTALLOC(JFETgateDrainPrimePtr,JFETgateNode,JFETdrainPrimeNode) TSTALLOC(JFETgateSourcePrimePtr,JFETgateNode,JFETsourcePrimeNode) - TSTALLOC(JFETsourceSourcePrimePtr,JFETsourceNode, - JFETsourcePrimeNode) + TSTALLOC(JFETsourceSourcePrimePtr,JFETsourceNode,JFETsourcePrimeNode) TSTALLOC(JFETdrainPrimeDrainPtr,JFETdrainPrimeNode,JFETdrainNode) TSTALLOC(JFETdrainPrimeGatePtr,JFETdrainPrimeNode,JFETgateNode) - TSTALLOC(JFETdrainPrimeSourcePrimePtr,JFETdrainPrimeNode, - JFETsourcePrimeNode) + TSTALLOC(JFETdrainPrimeSourcePrimePtr,JFETdrainPrimeNode,JFETsourcePrimeNode) TSTALLOC(JFETsourcePrimeGatePtr,JFETsourcePrimeNode,JFETgateNode) - TSTALLOC(JFETsourcePrimeSourcePtr,JFETsourcePrimeNode, - JFETsourceNode) - TSTALLOC(JFETsourcePrimeDrainPrimePtr,JFETsourcePrimeNode, - JFETdrainPrimeNode) + TSTALLOC(JFETsourcePrimeSourcePtr,JFETsourcePrimeNode,JFETsourceNode) + TSTALLOC(JFETsourcePrimeDrainPrimePtr,JFETsourcePrimeNode,JFETdrainPrimeNode) TSTALLOC(JFETdrainDrainPtr,JFETdrainNode,JFETdrainNode) TSTALLOC(JFETgateGatePtr,JFETgateNode,JFETgateNode) TSTALLOC(JFETsourceSourcePtr,JFETsourceNode,JFETsourceNode) - TSTALLOC(JFETdrainPrimeDrainPrimePtr,JFETdrainPrimeNode, - JFETdrainPrimeNode) - TSTALLOC(JFETsourcePrimeSourcePrimePtr,JFETsourcePrimeNode, - JFETsourcePrimeNode) + TSTALLOC(JFETdrainPrimeDrainPrimePtr,JFETdrainPrimeNode,JFETdrainPrimeNode) + TSTALLOC(JFETsourcePrimeSourcePrimePtr,JFETsourcePrimeNode,JFETsourcePrimeNode) } } return(OK); From d8646bf488fcc15c994f603210411d4394140869 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 1 Apr 2013 17:27:56 +0200 Subject: [PATCH 006/257] Aligned all the TSTALLOC calls in the setup routine of the JFET2 model --- src/spicelib/devices/jfet2/jfet2set.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/spicelib/devices/jfet2/jfet2set.c b/src/spicelib/devices/jfet2/jfet2set.c index a7b27793a..af6964496 100644 --- a/src/spicelib/devices/jfet2/jfet2set.c +++ b/src/spicelib/devices/jfet2/jfet2set.c @@ -106,24 +106,18 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(JFET2drainDrainPrimePtr,JFET2drainNode,JFET2drainPrimeNode) TSTALLOC(JFET2gateDrainPrimePtr,JFET2gateNode,JFET2drainPrimeNode) TSTALLOC(JFET2gateSourcePrimePtr,JFET2gateNode,JFET2sourcePrimeNode) - TSTALLOC(JFET2sourceSourcePrimePtr,JFET2sourceNode, - JFET2sourcePrimeNode) + TSTALLOC(JFET2sourceSourcePrimePtr,JFET2sourceNode,JFET2sourcePrimeNode) TSTALLOC(JFET2drainPrimeDrainPtr,JFET2drainPrimeNode,JFET2drainNode) TSTALLOC(JFET2drainPrimeGatePtr,JFET2drainPrimeNode,JFET2gateNode) - TSTALLOC(JFET2drainPrimeSourcePrimePtr,JFET2drainPrimeNode, - JFET2sourcePrimeNode) + TSTALLOC(JFET2drainPrimeSourcePrimePtr,JFET2drainPrimeNode,JFET2sourcePrimeNode) TSTALLOC(JFET2sourcePrimeGatePtr,JFET2sourcePrimeNode,JFET2gateNode) - TSTALLOC(JFET2sourcePrimeSourcePtr,JFET2sourcePrimeNode, - JFET2sourceNode) - TSTALLOC(JFET2sourcePrimeDrainPrimePtr,JFET2sourcePrimeNode, - JFET2drainPrimeNode) + TSTALLOC(JFET2sourcePrimeSourcePtr,JFET2sourcePrimeNode,JFET2sourceNode) + TSTALLOC(JFET2sourcePrimeDrainPrimePtr,JFET2sourcePrimeNode,JFET2drainPrimeNode) TSTALLOC(JFET2drainDrainPtr,JFET2drainNode,JFET2drainNode) TSTALLOC(JFET2gateGatePtr,JFET2gateNode,JFET2gateNode) TSTALLOC(JFET2sourceSourcePtr,JFET2sourceNode,JFET2sourceNode) - TSTALLOC(JFET2drainPrimeDrainPrimePtr,JFET2drainPrimeNode, - JFET2drainPrimeNode) - TSTALLOC(JFET2sourcePrimeSourcePrimePtr,JFET2sourcePrimeNode, - JFET2sourcePrimeNode) + TSTALLOC(JFET2drainPrimeDrainPrimePtr,JFET2drainPrimeNode,JFET2drainPrimeNode) + TSTALLOC(JFET2sourcePrimeSourcePrimePtr,JFET2sourcePrimeNode,JFET2sourcePrimeNode) } } return(OK); From 86b0a89886a95d5fbf40506506b60278d60cdc0f Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 1 Apr 2013 17:44:20 +0200 Subject: [PATCH 007/257] Aligned all the TSTALLOC calls in the setup routine of the MES model --- src/spicelib/devices/mes/messetup.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/spicelib/devices/mes/messetup.c b/src/spicelib/devices/mes/messetup.c index 3fb6e26ba..129b93da6 100644 --- a/src/spicelib/devices/mes/messetup.c +++ b/src/spicelib/devices/mes/messetup.c @@ -139,24 +139,18 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(MESdrainDrainPrimePtr,MESdrainNode,MESdrainPrimeNode) TSTALLOC(MESgateDrainPrimePtr,MESgateNode,MESdrainPrimeNode) TSTALLOC(MESgateSourcePrimePtr,MESgateNode,MESsourcePrimeNode) - TSTALLOC(MESsourceSourcePrimePtr,MESsourceNode, - MESsourcePrimeNode) + TSTALLOC(MESsourceSourcePrimePtr,MESsourceNode,MESsourcePrimeNode) TSTALLOC(MESdrainPrimeDrainPtr,MESdrainPrimeNode,MESdrainNode) TSTALLOC(MESdrainPrimeGatePtr,MESdrainPrimeNode,MESgateNode) - TSTALLOC(MESdrainPrimeSourcePrimePtr,MESdrainPrimeNode, - MESsourcePrimeNode) + TSTALLOC(MESdrainPrimeSourcePrimePtr,MESdrainPrimeNode,MESsourcePrimeNode) TSTALLOC(MESsourcePrimeGatePtr,MESsourcePrimeNode,MESgateNode) - TSTALLOC(MESsourcePrimeSourcePtr,MESsourcePrimeNode, - MESsourceNode) - TSTALLOC(MESsourcePrimeDrainPrimePtr,MESsourcePrimeNode, - MESdrainPrimeNode) + TSTALLOC(MESsourcePrimeSourcePtr,MESsourcePrimeNode,MESsourceNode) + TSTALLOC(MESsourcePrimeDrainPrimePtr,MESsourcePrimeNode,MESdrainPrimeNode) TSTALLOC(MESdrainDrainPtr,MESdrainNode,MESdrainNode) TSTALLOC(MESgateGatePtr,MESgateNode,MESgateNode) TSTALLOC(MESsourceSourcePtr,MESsourceNode,MESsourceNode) - TSTALLOC(MESdrainPrimeDrainPrimePtr,MESdrainPrimeNode, - MESdrainPrimeNode) - TSTALLOC(MESsourcePrimeSourcePrimePtr,MESsourcePrimeNode, - MESsourcePrimeNode) + TSTALLOC(MESdrainPrimeDrainPrimePtr,MESdrainPrimeNode,MESdrainPrimeNode) + TSTALLOC(MESsourcePrimeSourcePrimePtr,MESsourcePrimeNode,MESsourcePrimeNode) } } return(OK); From f38bab6b1060fb1ee0929830d5068d8cc1bf4286 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 1 Apr 2013 20:08:56 +0200 Subject: [PATCH 008/257] inp.c: add function prototype --- src/frontend/inp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/inp.c b/src/frontend/inp.c index 00ba77153..5ff2e0715 100644 --- a/src/frontend/inp.c +++ b/src/frontend/inp.c @@ -52,6 +52,7 @@ static struct line *com_options = NULL; static void cktislinear(CKTcircuit *ckt, struct line *deck); void line_free_x(struct line *deck, bool recurse); +void com_circbyline(wordlist *wl); From 34441352ea7635f80702acdf161217a51a4bf2da Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 1 Apr 2013 20:10:00 +0200 Subject: [PATCH 009/257] sharedspice.c: remove sigsev fault under LINUX --- src/sharedspice.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sharedspice.c b/src/sharedspice.c index e95c8ec96..8f62ea0ac 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -411,9 +411,7 @@ runc(char* command) } else fprintf(stdout, "Printsend thread stopped with timeout = %d\n", timeout); -#ifdef HAVE_LIBPTHREAD - pthread_join(printtid, NULL); -#endif + printstopp = FALSE; return 2; } From 2632c1f540c6b60f451dfa78da379764bbe52267 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 1 Apr 2013 20:11:01 +0200 Subject: [PATCH 010/257] /icm/makedefs.in: add -lm for self-consistent shared libs --- src/xspice/icm/makedefs.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xspice/icm/makedefs.in b/src/xspice/icm/makedefs.in index ffc488f30..151e37367 100644 --- a/src/xspice/icm/makedefs.in +++ b/src/xspice/icm/makedefs.in @@ -42,7 +42,7 @@ endif CMPP = $(top_builddir)/src/xspice/cmpp/cmpp # Flags to use when linking shared library -LDFLAGS = -shared +LDFLAGS = -shared -lm ifeq ($(ISMINGW), 1) LDFLAGS = -shared @LDFLAGS@ endif From 7b3b5285f0c91a63c8fdbecc17363fe69d0bfdb7 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Wed, 3 Apr 2013 20:56:28 +0200 Subject: [PATCH 011/257] sharedspice.c: small updates --- src/sharedspice.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/sharedspice.c b/src/sharedspice.c index 8f62ea0ac..df9debaf1 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -16,7 +16,10 @@ #define STDERR_FILENO 2 #endif -//#define low_latency + +/* The Delphi Interface has high latency times during printing, + therefore undef the following line */ +#define low_latency /**********************************************************************/ /* Header files for C functions */ @@ -593,12 +596,9 @@ ngSpice_Init(SendChar* printfcn, SendStat* statusfcn, ControlledExit* ngspiceexi struct passwd *pw; pw = getpwuid(getuid()); -#ifdef HAVE_ASPRINTF - asprintf(&s, "%s%s", pw->pw_dir, INITSTR); -#else s = TMALLOC(char, 1 + strlen(pw->pw_dir) + strlen(INITSTR)); sprintf(s, "%s%s", pw->pw_dir, INITSTR); -#endif + if (access(s, 0) == 0) inp_source(s); } @@ -660,7 +660,7 @@ bot: /* If caller has sent valid address for pfcn */ if (!noprintfwanted) #ifdef HAVE_LIBPTHREAD - pthread_create(&tid, NULL, (void * (*)(void *))printsend, (void *)NULL); + pthread_create(&printtid, NULL, (void * (*)(void *))printsend, (void *)NULL); #elif defined _MSC_VER || defined __MINGW32__ printtid = (HANDLE)_beginthreadex(NULL, 0, (unsigned int (__stdcall *)(void *))printsend, (void*) NULL, 0, NULL); @@ -770,7 +770,7 @@ char* ngSpice_CurPlot(void) } /* return to the caller a pointer to an array of all plots created -by ngspice.dll */ +by ngspice. Last entry in the array is NULL. */ IMPEXP char** ngSpice_AllPlots(void) { @@ -794,7 +794,7 @@ char** ngSpice_AllPlots(void) } /* return to the caller a pointer to an array of vector names in the plot -named by plotname */ +named by plotname. Last entry in the array is NULL. */ IMPEXP char** ngSpice_AllVecs(char* plotname) { @@ -998,7 +998,7 @@ sh_fputc(const char inp, FILE* f) static char* outstringerr = NULL; static char* outstringout = NULL; -#ifdef low_latency +#if defined (low_latency) || !defined(THREADS) /* using the strings by the caller sent directly to the caller has to fast enough (low latency) */ int From eb9060376c9580025355a7c5d72d5d0d7a86543c Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 7 Apr 2013 16:21:08 +0200 Subject: [PATCH 012/257] fix sense2, which is unsupported code --- configure.ac | 4 ++++ src/Makefile.am | 12 ++++++++++-- src/include/ngspice/cktdefs.h | 6 +++++- src/spicelib/analysis/analysis.c | 7 +++++++ src/spicelib/analysis/cktsetup.c | 4 +++- src/spicelib/analysis/dcop.c | 10 +++++++++- src/spicelib/analysis/dctran.c | 17 ++++++++++++++--- src/spicelib/analysis/dctrcurv.c | 6 +++++- src/spicelib/parser/inp2dot.c | 2 ++ src/unsupported/Makefile.am | 20 ++++++++++++++++++++ src/unsupported/cktsenac.c | 13 ++++++++----- src/unsupported/cktsenup.c | 7 +++---- src/unsupported/cktsncom.c | 7 +++---- src/unsupported/cktsndct.c | 5 ++--- src/unsupported/cktsnld.c | 7 +++---- src/unsupported/cktsnprt.c | 7 +++---- src/unsupported/cktsnset.c | 10 ++++------ src/unsupported/sen2dest.c | 8 +++----- src/unsupported/sen2setp.c | 12 +++++------- src/unsupported/snaskq.c | 12 ++++++------ src/unsupported/snstart.c | 13 ++++++++----- 21 files changed, 127 insertions(+), 62 deletions(-) create mode 100644 src/unsupported/Makefile.am diff --git a/configure.ac b/configure.ac index 7f159419d..59e7bf33c 100644 --- a/configure.ac +++ b/configure.ac @@ -801,6 +801,7 @@ AC_MSG_RESULT([Settings which were chosen:]) if test "x$enable_sense2" = xyes; then AC_DEFINE([WANT_SENSE2], [], [Define if we want spice2 sensitivity analysis]) AC_MSG_RESULT([Spice2 sensitivity analysis enabled]) + AC_MSG_WARN([This feature is UNSUPPORTED]) fi if test "x$enable_nobypass" = xyes; then AC_DEFINE([NOBYPASS], [], [Define if we want NOBYPASS]) @@ -944,6 +945,8 @@ AM_CONDITIONAL([NUMDEV_WANTED], [test "x$enable_cider" = xyes]) AM_CONDITIONAL([PSS_WANTED], [test "x$enable_pss" = xyes]) +AM_CONDITIONAL([SENSE2_WANTED], [test "x$enable_sense2" = xyes]) + # adms option if test "x$enable_adms" = xyes ; then AC_MSG_RESULT([********************************** @@ -1168,6 +1171,7 @@ AC_CONFIG_FILES([Makefile src/xspice/enh/Makefile src/xspice/ipc/Makefile src/xspice/idn/Makefile + src/unsupported/Makefile tests/Makefile tests/bsim1/Makefile tests/bsim2/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 1a61492a5..526ba0d55 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ ## Process this file with automake to produce Makefile.in SUBDIRS = misc maths frontend spicelib include/ngspice -DIST_SUBDIRS = misc maths frontend spicelib include/ngspice xspice ciderlib +DIST_SUBDIRS = misc maths frontend spicelib include/ngspice xspice ciderlib unsupported if XSPICE_WANTED SUBDIRS += xspice @@ -11,6 +11,10 @@ if CIDER_WANTED SUBDIRS += ciderlib endif +if SENSE2_WANTED +SUBDIRS += unsupported +endif + if !TCL_MODULE if !SHARED_MODULE bin_PROGRAMS = ngspice ngnutmeg @@ -27,7 +31,7 @@ endif !SHARED_MODULE endif !TCL_MODULE EXTRA_DIST = ngspice.txt setplot spectrum \ - devload devaxis ciderinit winmain.c winmain.h unsupported \ + devload devaxis ciderinit winmain.c winmain.h \ tclspice.c tclspice.map pkgIndex.tcl.in spinit.in tclspinit.in \ main.c sharedspice.c @@ -137,6 +141,10 @@ ngspice_LDADD += \ spicelib/analysis/libckt.la \ spicelib/devices/libdev.la +if SENSE2_WANTED +ngspice_LDADD += unsupported/libunsupported.la +endif + if XSPICE_WANTED ngspice_LDADD += \ xspice/cm/libcmxsp.la \ diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index f4b2aba47..80ac6259e 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -382,10 +382,14 @@ extern int PZinit(CKTcircuit *); extern int PZpost(CKTcircuit *); extern int PZaskQuest(CKTcircuit *, JOB *, int , IFvalue *); extern int PZsetParm(CKTcircuit *, JOB *, int , IFvalue *); + +#ifdef WANT_SENSE2 extern int SENaskQuest(CKTcircuit *, JOB *, int , IFvalue *); extern void SENdestroy(SENstruct *); extern int SENsetParm(CKTcircuit *, JOB *, int , IFvalue *); -extern int SENstartup(CKTcircuit *); +extern int SENstartup(CKTcircuit *, int); +#endif + extern int SPIinit(IFfrontEnd *, IFsimulator **); extern int TFanal(CKTcircuit *, int); extern int TFaskQuest(CKTcircuit *, JOB *, int , IFvalue *); diff --git a/src/spicelib/analysis/analysis.c b/src/spicelib/analysis/analysis.c index cbb3bd4ec..ecb9279a6 100644 --- a/src/spicelib/analysis/analysis.c +++ b/src/spicelib/analysis/analysis.c @@ -20,6 +20,10 @@ extern SPICEanalysis SENSinfo; extern SPICEanalysis PSSinfo; #endif +#ifdef WANT_SENSE2 +extern SPICEanalysis SEN2info; +#endif + SPICEanalysis *analInfo[] = { &OPTinfo, &ACinfo, @@ -34,6 +38,9 @@ SPICEanalysis *analInfo[] = { #ifdef WITH_PSS &PSSinfo, #endif +#ifdef WANT_SENSE2 + &SEN2info, +#endif }; diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 49a99d80d..446749094 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -43,7 +43,9 @@ CKTsetup(CKTcircuit *ckt) #ifdef WANT_SENSE2 if(ckt->CKTsenInfo){ - if (error = CKTsenSetup(ckt)) return(error); + error = CKTsenSetup(ckt); + if (error) + return(error); } #endif diff --git a/src/spicelib/analysis/dcop.c b/src/spicelib/analysis/dcop.c index 64d5d85d2..55c79d90e 100644 --- a/src/spicelib/analysis/dcop.c +++ b/src/spicelib/analysis/dcop.c @@ -21,6 +21,11 @@ Modified: 2000 AlansFixes int DCop(CKTcircuit *ckt, int notused) { +#ifdef WANT_SENSE2 + int i, senmode, size; + long save; +#endif + int converged; int error; IFuid *nameList; /* va: tmalloc'ed list */ @@ -133,7 +138,10 @@ DCop(CKTcircuit *ckt, int notused) for(i = 1; i<=size ; i++){ ckt->CKTrhsOp[i] = ckt->CKTrhsOld[i]; } - if(error = CKTsenDCtran(ckt)) return(error); + error = CKTsenDCtran(ckt); + if (error) + return(error); + ckt->CKTmode = save; ckt->CKTsenInfo->SENmode = senmode; diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index 708af9130..ff9dee3e7 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -78,6 +78,8 @@ DCtran(CKTcircuit *ckt, int firsttime; int error; #ifdef WANT_SENSE2 + int save, save2, size; + long save1; #ifdef SENSDEBUG FILE *outsen; #endif /* SENSDEBUG */ @@ -316,7 +318,10 @@ DCtran(CKTcircuit *ckt, save2 = ckt->CKTorder; ckt->CKTmode = save_mode; ckt->CKTorder = save_order; - if(error = CKTsenDCtran(ckt)) return(error); + error = CKTsenDCtran(ckt); + if (error) + return(error); + ckt->CKTmode = save1; ckt->CKTorder = save2; } @@ -792,7 +797,10 @@ resume: save2 = ckt->CKTorder; ckt->CKTmode = save_mode; ckt->CKTorder = save_order; - if(error = CKTsenDCtran(ckt)) return(error); + error = CKTsenDCtran (ckt); + if (error) + return(error); + ckt->CKTmode = save1; ckt->CKTorder = save2; } @@ -852,7 +860,10 @@ resume: save2 = ckt->CKTorder; ckt->CKTmode = save_mode; ckt->CKTorder = save_order; - if(error = CKTsenDCtran(ckt)) return(error); + error = CKTsenDCtran(ckt); + if (error) + return (error); + ckt->CKTmode = save1; ckt->CKTorder = save2; } diff --git a/src/spicelib/analysis/dctrcurv.c b/src/spicelib/analysis/dctrcurv.c index 49e4742b9..f4d4f82c9 100644 --- a/src/spicelib/analysis/dctrcurv.c +++ b/src/spicelib/analysis/dctrcurv.c @@ -50,6 +50,7 @@ DCtrCurv(CKTcircuit *ckt, int restart) static runDesc *plot = NULL; #ifdef WANT_SENSE2 + long save; #ifdef SENSDEBUG if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&DCSEN) ){ printf("\nDC Sensitivity Results\n\n"); @@ -458,7 +459,10 @@ resume: senmode = ckt->CKTsenInfo->SENmode; save = ckt->CKTmode; ckt->CKTsenInfo->SENmode = DCSEN; - if(error = CKTsenDCtran(ckt)) return (error); + error = CKTsenDCtran(ckt); + if (error) + return(error); + ckt->CKTmode = save; ckt->CKTsenInfo->SENmode = senmode; diff --git a/src/spicelib/parser/inp2dot.c b/src/spicelib/parser/inp2dot.c index 206c534ba..69b1ab283 100644 --- a/src/spicelib/parser/inp2dot.c +++ b/src/spicelib/parser/inp2dot.c @@ -567,6 +567,8 @@ dot_sens2(char *line, CKTcircuit *ckt, INPtables *tab, card *current, int i; /* generic loop variable */ char *token; /* a token from the line */ + NG_IGNORE(gnode); + /* .sens {AC} {DC} {TRAN} [dev=nnn parm=nnn]* */ which = -1; for (i = 0; i < ft_sim->numAnalyses; i++) { diff --git a/src/unsupported/Makefile.am b/src/unsupported/Makefile.am new file mode 100644 index 000000000..61adfdcce --- /dev/null +++ b/src/unsupported/Makefile.am @@ -0,0 +1,20 @@ +## Process this file with automake to produce Makefile.in + +noinst_LTLIBRARIES = libunsupported.la + +libunsupported_la_SOURCES = \ + cktsenac.c \ + cktsenup.c \ + cktsncom.c \ + cktsndct.c \ + cktsnset.c \ + cktsnld.c \ + sen2dest.c \ + sen2setp.c \ + snaskq.c \ + snstart.c + + +AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include +AM_CFLAGS = $(STATIC) +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/unsupported/cktsenac.c b/src/unsupported/cktsenac.c index 07b18e71a..609956d7d 100644 --- a/src/unsupported/cktsenac.c +++ b/src/unsupported/cktsenac.c @@ -5,7 +5,7 @@ Author: 1985 Thomas L. Quarles /* */ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -20,8 +20,7 @@ Author: 1985 Thomas L. Quarles */ int -CKTsenAC(ckt) -register CKTcircuit *ckt; +CKTsenAC(CKTcircuit *ckt) { int error; @@ -30,13 +29,17 @@ register CKTcircuit *ckt; #endif /* SENSDEBUG */ - if(error = CKTsenLoad(ckt)) return(error); + error = CKTsenLoad(ckt); + if (error) + return(error); #ifdef SENSDEBUG printf("after CKTsenLoad\n"); #endif /* SENSDEBUG */ - if(error = CKTsenComp(ckt)) return(error); + error = CKTsenComp(ckt); + if (error) + return(error); #ifdef SENSDEBUG printf("after CKTsenComp\n"); diff --git a/src/unsupported/cktsenup.c b/src/unsupported/cktsenup.c index 830370f4c..32c17430e 100644 --- a/src/unsupported/cktsenup.c +++ b/src/unsupported/cktsenup.c @@ -11,7 +11,7 @@ Author: 1985 Thomas L. Quarles * in the given circuit */ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -22,10 +22,9 @@ Author: 1985 Thomas L. Quarles int -CKTsenUpdate(ckt) -register CKTcircuit *ckt; +CKTsenUpdate(CKTcircuit *ckt) { - register int i; + int i; int error; diff --git a/src/unsupported/cktsncom.c b/src/unsupported/cktsncom.c index 619b31f40..9b90f6eb2 100644 --- a/src/unsupported/cktsncom.c +++ b/src/unsupported/cktsncom.c @@ -10,7 +10,7 @@ Author: 1985 Thomas L. Quarles * of the given circuit */ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -21,10 +21,9 @@ Author: 1985 Thomas L. Quarles int -CKTsenComp(ckt) -register CKTcircuit *ckt; +CKTsenComp(CKTcircuit *ckt) { - register int size; + int size; int row; int col; SENstruct *info; diff --git a/src/unsupported/cktsndct.c b/src/unsupported/cktsndct.c index 195c0e7be..4cd70ba96 100644 --- a/src/unsupported/cktsndct.c +++ b/src/unsupported/cktsndct.c @@ -10,7 +10,7 @@ Author: 1985 Thomas L. Quarles * calculations */ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -21,8 +21,7 @@ Author: 1985 Thomas L. Quarles int -CKTsenDCtran(ckt) -register CKTcircuit *ckt; +CKTsenDCtran(CKTcircuit *ckt) { int error; diff --git a/src/unsupported/cktsnld.c b/src/unsupported/cktsnld.c index 57e7ce436..051d5dc71 100644 --- a/src/unsupported/cktsnld.c +++ b/src/unsupported/cktsnld.c @@ -12,7 +12,7 @@ Author: 1985 Thomas L. Quarles * in the given circuit */ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -23,10 +23,9 @@ Author: 1985 Thomas L. Quarles int -CKTsenLoad(ckt) -register CKTcircuit *ckt; +CKTsenLoad(CKTcircuit *ckt) { - register int i; + int i; int size,row,col; int error; diff --git a/src/unsupported/cktsnprt.c b/src/unsupported/cktsnprt.c index fb6b1b3c6..35c7d91dd 100644 --- a/src/unsupported/cktsnprt.c +++ b/src/unsupported/cktsnprt.c @@ -5,7 +5,7 @@ Author: 1985 Thomas L. Quarles /* */ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -22,10 +22,9 @@ Author: 1985 Thomas L. Quarles */ void -CKTsenPrint(ckt) -register CKTcircuit *ckt; +CKTsenPrint(CKTcircuit *ckt) { - register int i; + int i; for (i=0;iDEVsenPrint && ckt->CKThead[i] ) { diff --git a/src/unsupported/cktsnset.c b/src/unsupported/cktsnset.c index 2cb344b60..5faeeb03a 100644 --- a/src/unsupported/cktsnset.c +++ b/src/unsupported/cktsnset.c @@ -13,7 +13,7 @@ Author: 1985 Thomas L. Quarles * in the given circuit */ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -24,13 +24,11 @@ Author: 1985 Thomas L. Quarles int -CKTsenSetup(ckt) -register CKTcircuit *ckt; - +CKTsenSetup(CKTcircuit *ckt) { - register int i; + int i; int error; - register SENstruct *info; + SENstruct *info; #ifdef SENSDEBUG printf("CKTsenSetup\n"); #endif /* SENSDEBUG */ diff --git a/src/unsupported/sen2dest.c b/src/unsupported/sen2dest.c index 583871016..141019b00 100644 --- a/src/unsupported/sen2dest.c +++ b/src/unsupported/sen2dest.c @@ -9,20 +9,18 @@ Author: 1985 Thomas L. Quarles * given circuit */ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/cktdefs.h" #include "ngspice/devdefs.h" -#include "util.h" #include "ngspice/ifsim.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" void -SENdestroy(info) - SENstruct *info; +SENdestroy(SENstruct *info) { - register int i; + int i; int size; diff --git a/src/unsupported/sen2setp.c b/src/unsupported/sen2setp.c index b407e3b4d..a46898f41 100644 --- a/src/unsupported/sen2setp.c +++ b/src/unsupported/sen2setp.c @@ -3,23 +3,21 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/ifsim.h" #include "ngspice/iferrmsg.h" #include "ngspice/sen2defs.h" #include "ngspice/cktdefs.h" -#include "util.h" #include "ngspice/suffix.h" +#include "../spicelib/analysis/analysis.h" /* ARGSUSED */ int -SENsetParm(ckt,anal,which,value) - CKTcircuit *ckt; - JOB *anal; - int which; - IFvalue *value; +SENsetParm(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value) { + NG_IGNORE(ckt); + switch(which) { case SEN_DC: diff --git a/src/unsupported/snaskq.c b/src/unsupported/snaskq.c index ddaf0d75c..0f7cb7d5a 100644 --- a/src/unsupported/snaskq.c +++ b/src/unsupported/snaskq.c @@ -3,7 +3,7 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/ifsim.h" #include "ngspice/iferrmsg.h" @@ -13,12 +13,12 @@ Author: 1985 Thomas L. Quarles /* ARGSUSED */ int -SENaskQuest(ckt,anal,which,value) - CKTcircuit *ckt; - JOB *anal; - int which; - IFvalue *value; +SENaskQuest(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value) { + NG_IGNORE(ckt); + NG_IGNORE(anal); + NG_IGNORE(value); + switch(which) { default: diff --git a/src/unsupported/snstart.c b/src/unsupported/snstart.c index 79449259c..5f2a99207 100644 --- a/src/unsupported/snstart.c +++ b/src/unsupported/snstart.c @@ -3,11 +3,10 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -#include "spice.h" +#include "ngspice/ngspice.h" #include #include "ngspice/ifsim.h" #include "ngspice/cktdefs.h" -#include "util.h" #include "ngspice/const.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" @@ -17,8 +16,7 @@ Author: 1985 Thomas L. Quarles */ int -SENstartup(ckt) - CKTcircuit *ckt; +SENstartup(CKTcircuit *ckt, int restart) { int i; int err; @@ -26,6 +24,11 @@ SENstartup(ckt) int type; GENinstance *fast; + if (restart) { + fprintf(stderr, "unsupported code, (SENstartup), doesn't support restart\n"); + exit(1); + } + #ifdef SENSDEBUG printf("SENstartup\n"); #endif /* SENSDEBUG */ @@ -38,7 +41,7 @@ SENstartup(ckt) for(i=0;iCKTsenInfo->SENnumVal;i++) { type = -1; fast = NULL; - err = CKTfndDev((GENERIC*)ckt,&type,(GENERIC**)&fast, + err = CKTfndDev(ckt,&type,&fast, ((ckt->CKTsenInfo->SENdevices)[i]), NULL, NULL); if(err != OK) return(err); From fd0f22701df2782e5e93581356f6f9e6aa4e00ff Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 7 Apr 2013 17:33:48 +0200 Subject: [PATCH 013/257] sense2, whitespace cleanup checked for object file invariance --- src/unsupported/cktsenac.c | 16 ++--- src/unsupported/cktsenup.c | 18 +++--- src/unsupported/cktsncom.c | 125 ++++++++++++++++++------------------- src/unsupported/cktsndct.c | 56 ++++++++++------- src/unsupported/cktsnld.c | 58 ++++++++--------- src/unsupported/cktsnprt.c | 18 +++--- src/unsupported/cktsnset.c | 30 ++++----- src/unsupported/sen2dest.c | 84 ++++++++++++++----------- src/unsupported/sen2setp.c | 60 +++++++++--------- src/unsupported/snaskq.c | 10 +-- src/unsupported/snstart.c | 39 +++++++----- 11 files changed, 264 insertions(+), 250 deletions(-) diff --git a/src/unsupported/cktsenac.c b/src/unsupported/cktsenac.c index 609956d7d..dd7d5a618 100644 --- a/src/unsupported/cktsenac.c +++ b/src/unsupported/cktsenac.c @@ -2,8 +2,6 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -/* - */ #include "ngspice/ngspice.h" #include @@ -26,25 +24,23 @@ CKTsenAC(CKTcircuit *ckt) #ifdef SENSDEBUG printf("CKTsenAC\n"); -#endif /* SENSDEBUG */ - +#endif error = CKTsenLoad(ckt); if (error) - return(error); + return error; #ifdef SENSDEBUG printf("after CKTsenLoad\n"); -#endif /* SENSDEBUG */ +#endif error = CKTsenComp(ckt); if (error) - return(error); + return error; #ifdef SENSDEBUG printf("after CKTsenComp\n"); -#endif /* SENSDEBUG */ +#endif - return(OK); + return OK; } - diff --git a/src/unsupported/cktsenup.c b/src/unsupported/cktsenup.c index 32c17430e..cbfd42e8a 100644 --- a/src/unsupported/cktsenup.c +++ b/src/unsupported/cktsenup.c @@ -2,13 +2,11 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -/* - */ /* CKTsenUpdate(ckt) * this is a driver program to iterate through all the various - * sensitivity update functions provided for the circuit elements - * in the given circuit + * sensitivity update functions provided for the circuit elements + * in the given circuit */ #include "ngspice/ngspice.h" @@ -27,12 +25,12 @@ CKTsenUpdate(CKTcircuit *ckt) int i; int error; - - for (i=0;iDEVsenUpdate && ckt->CKThead[i] ) { + for (i = 0; i < DEVmaxnum; i++) + if (DEVices[i]->DEVsenUpdate && ckt->CKThead[i]) { error = DEVices[i]->DEVsenUpdate (ckt->CKThead[i], ckt); - if(error) return(error); + if (error) + return error; } - } - return(OK); + + return OK; } diff --git a/src/unsupported/cktsncom.c b/src/unsupported/cktsncom.c index 9b90f6eb2..747bc3452 100644 --- a/src/unsupported/cktsncom.c +++ b/src/unsupported/cktsncom.c @@ -2,12 +2,10 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -/* - */ /* CKTsenComp(ckt) - * this is a program to solve the sensitivity equation - * of the given circuit + * this is a program to solve the sensitivity equation + * of the given circuit */ #include "ngspice/ngspice.h" @@ -27,142 +25,139 @@ CKTsenComp(CKTcircuit *ckt) int row; int col; SENstruct *info; + #ifdef SENSDEBUG char *rowe; SMPelement *elt; -#endif /* SENSDEBUG */ +#endif #ifdef SENSDEBUG printf("CKTsenComp\n"); -#endif /* SENSDEBUG */ +#endif size = SMPmatSize(ckt->CKTmatrix); info = ckt->CKTsenInfo; - if((info->SENmode == DCSEN)|| - (info->SENmode == TRANSEN)) - { + if ((info->SENmode == DCSEN) || (info->SENmode == TRANSEN)) { /* loop throgh all the columns of RHS matrix - each column corresponding to a design parameter */ - for (col=1;col<=info->SENparms;col++) { - for(row=1;row<=size;row++){ + for (col = 1; col <= info->SENparms; col++) { + + for (row = 1; row <= size; row++) { ckt->CKTsenRhs[row] = info->SEN_RHS[row][col]; } + /* solve for the sensitivity values */ - SMPsolve(ckt->CKTmatrix,ckt->CKTsenRhs,ckt->CKTrhsSpare); + SMPsolve(ckt->CKTmatrix, ckt->CKTsenRhs, ckt->CKTrhsSpare); /* store the sensitivity values */ - for(row=1;row<=size;row++){ + for (row = 1; row <= size; row++) { info->SEN_Sap[row][col] = ckt->CKTsenRhs[row]; info->SEN_RHS[row][col] = ckt->CKTsenRhs[row]; } } + #ifdef SENSDEBUG printf("\n"); printf("Sensitivity matrix :\n"); - for(row=1;row<=size;row++){ - rowe=CKTnodName(ckt,row) ; - if(strcmp("4",rowe)==0){ - for (col=1;col<=info->SENparms;col++) { + for (row = 1; row <= size; row++) { + rowe = CKTnodName(ckt, row); + if (strcmp("4", rowe) == 0) { + for (col = 1; col <= info->SENparms; col++) { printf("\t"); - printf("Sap(%s,%d) = %.5e\t",rowe,col, - info->SEN_Sap[row][col]); + printf("Sap(%s,%d) = %.5e\t", rowe, col, + info->SEN_Sap[row][col]); } printf("\n\n"); } } printf(" RHS matrix :\n"); - for(row=1;row<=size;row++){ - for (col=1;col<=info->SENparms;col++) { + for (row = 1; row <= size; row++) { + for (col = 1; col <= info->SENparms; col++) { printf(" "); - printf("RHS(%d,%d) = %.7e ",row,col, - info->SEN_RHS[row][col]); + printf("RHS(%d,%d) = %.7e ", row, col, + info->SEN_RHS[row][col]); } printf("\n"); } printf(" Jacobian matrix :\n"); - for(row=1; row<=size; row++){ - for(col=1; col<=size; col++){ - if(elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)){ - printf("%.7e ",elt->SMPvalue); - } - else{ + for (row = 1; row <= size; row++) { + for (col = 1; col <= size; col++) + if (elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)) + printf("%.7e ", elt->SMPvalue); + else printf("0.0000000e+00 "); - } - } printf("\n"); } -#endif +#endif } - if(info->SENmode == ACSEN){ + if (info->SENmode == ACSEN) { /* loop throgh all the columns of RHS matrix - each column corresponding to a design parameter */ - for (col=1;col<=info->SENparms;col++) { + for (col = 1; col <= info->SENparms; col++) { - for(row=1;row<=size;row++){ - ckt->CKTsenRhs[row] = info->SEN_RHS[row][col]; + for (row = 1; row <= size; row++) { + ckt->CKTsenRhs[row] = info->SEN_RHS[row][col]; ckt->CKTseniRhs[row] = info->SEN_iRHS[row][col]; } /* solve for the sensitivity values ( both real and imag parts)*/ - SMPcSolve(ckt->CKTmatrix,ckt->CKTsenRhs,ckt->CKTseniRhs, - ckt->CKTrhsSpare,ckt->CKTirhsSpare); + SMPcSolve(ckt->CKTmatrix, ckt->CKTsenRhs, ckt->CKTseniRhs, + ckt->CKTrhsSpare, ckt->CKTirhsSpare); /* store the sensitivity values ( both real and imag parts)*/ - for(row=1;row<=size;row++){ - info->SEN_RHS[row][col] = ckt->CKTsenRhs[row]; + for (row = 1; row <= size; row++) { + info->SEN_RHS[row][col] = ckt->CKTsenRhs[row]; info->SEN_iRHS[row][col] = ckt->CKTseniRhs[row]; - } + } } + #ifdef SENSDEBUG printf("\n"); - printf("CKTomega = %.7e rad/sec\t\n",ckt->CKTomega); + printf("CKTomega = %.7e rad/sec\t\n", ckt->CKTomega); printf("Sensitivity matrix :\n"); - for(row=1;row<=size;row++){ - rowe=CKTnodName(ckt,row); - for (col=1;col<=info->SENparms;col++) { + for (row = 1; row <= size; row++) { + rowe = CKTnodName(ckt, row); + for (col = 1; col <= info->SENparms; col++) { printf("\t"); - printf("RHS(%s,%d) = %.5e",rowe,col, - info->SEN_RHS[row][col]); - printf(" + j %.5e\t",info->SEN_iRHS[row][col]); + printf("RHS(%s,%d) = %.5e", rowe, col, + info->SEN_RHS[row][col]); + printf(" + j %.5e\t", info->SEN_iRHS[row][col]); printf("\n\n"); - } printf("\n"); } - - printf("CKTomega = %.7e rad/sec\t\n",ckt->CKTomega); + printf("CKTomega = %.7e rad/sec\t\n", ckt->CKTomega); printf(" RHS matrix :\n"); - for(row=1;row<=size;row++){ - for (col=1;col<=info->SENparms;col++) { + for (row = 1; row <= size; row++) { + for (col = 1; col <= info->SENparms; col++) { printf(" "); - printf("RHS(%d,%d) = %.7e ",row,col, - info->SEN_RHS[row][col]); - printf("+j %.7e ",info->SEN_iRHS[row][col]); + printf("RHS(%d,%d) = %.7e ", row, col, + info->SEN_RHS[row][col]); + printf("+j %.7e ", info->SEN_iRHS[row][col]); } printf("\n"); } printf(" Jacobian matrix for AC :\n"); - for(row=1; row<=size; row++){ - for(col=1; col<=size; col++){ - if(elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)){ - printf("%.7e ",elt->SMPvalue); - printf("+j%.7e\t",elt->SMPiValue); - } - else{ + for (row = 1; row <= size; row++) { + for (col = 1; col <= size; col++) { + if (elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)) { + printf("%.7e ", elt->SMPvalue); + printf("+j%.7e\t", elt->SMPiValue); + } else{ printf("0.0000000e+00 "); printf("+j0.0000000e+00\t"); } @@ -172,6 +167,6 @@ CKTsenComp(CKTcircuit *ckt) #endif } - return(OK); -} + return OK; +} diff --git a/src/unsupported/cktsndct.c b/src/unsupported/cktsndct.c index 4cd70ba96..fbb697c50 100644 --- a/src/unsupported/cktsndct.c +++ b/src/unsupported/cktsndct.c @@ -2,10 +2,8 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -/* - */ -/* +/* * This routine performs the DC and Transient sensitivity * calculations */ @@ -26,52 +24,62 @@ CKTsenDCtran(CKTcircuit *ckt) int error; #ifdef SENSDEBUG - printf("time = %.7e\n",ckt->CKTtime); + printf("time = %.7e\n", ckt->CKTtime); printf("CKTsenDCtran\n"); -#endif /* SENSDEBUG */ - - if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) && - (ckt->CKTmode & MODEINITTRAN)){ +#endif + if (ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) && + (ckt->CKTmode & MODEINITTRAN)) + { error = CKTsenLoad(ckt); - if(error) return(error); + if (error) + return error; + #ifdef SENSDEBUG printf("after inittran senload\n"); -#endif /* SENSDEBUG */ +#endif error = CKTsenUpdate(ckt); - if(error) return(error); + if (error) + return error; + #ifdef SENSDEBUG printf("after inittran senupdate\n"); -#endif /* SENSDEBUG */ +#endif + + } + + if (ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) && + !(ckt->CKTmode & MODETRANOP)) + { + ckt->CKTmode = (ckt->CKTmode & (~INITF)) | MODEINITFLOAT; } - if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)&& - !(ckt->CKTmode&MODETRANOP)) - ckt->CKTmode = (ckt->CKTmode&(~INITF))|MODEINITFLOAT; error = CKTsenLoad(ckt); - if(error) return(error); + if (error) + return error; #ifdef SENSDEBUG printf("after CKTsenLoad\n"); -#endif /* SENSDEBUG */ +#endif error = CKTsenComp(ckt); - if(error) return(error); + if (error) + return error; #ifdef SENSDEBUG printf("after CKTsenComp\n"); -#endif /* SENSDEBUG */ +#endif - if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&TRANSEN) ){ + if (ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)) { error = CKTsenUpdate(ckt); - if(error) return(error); + if (error) + return error; #ifdef SENSDEBUG printf("after CKTsenUpdate\n"); -#endif /* SENSDEBUG */ +#endif } - - return(OK); + return OK; } diff --git a/src/unsupported/cktsnld.c b/src/unsupported/cktsnld.c index 051d5dc71..a96ede9aa 100644 --- a/src/unsupported/cktsnld.c +++ b/src/unsupported/cktsnld.c @@ -2,14 +2,12 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -/* - */ -/* +/* * CKTsenLoad(ckt) * this is a driver program to iterate through all the various - * sensitivity load functions provided for the circuit elements - * in the given circuit + * sensitivity load functions provided for the circuit elements + * in the given circuit */ #include "ngspice/ngspice.h" @@ -30,36 +28,40 @@ CKTsenLoad(CKTcircuit *ckt) int error; size = SMPmatSize(ckt->CKTmatrix); + #ifdef SENSDEBUG printf("CKTsenLoad\n"); -#endif /* SENSDEBUG */ +#endif - if((ckt->CKTsenInfo->SENmode == DCSEN)|| - (ckt->CKTsenInfo->SENmode == TRANSEN)) { - for (col=0;col<=ckt->CKTsenInfo->SENparms;col++) { - for(row=0;row<=size;row++){ - ckt->CKTsenInfo->SEN_RHS[row][col]= 0; - } - } - for (i=0;iDEVsenLoad && ckt->CKThead[i] ) { + if ((ckt->CKTsenInfo->SENmode == DCSEN) || + (ckt->CKTsenInfo->SENmode == TRANSEN)) + { + for (col = 0; col <= ckt->CKTsenInfo->SENparms; col++) + for (row = 0; row <= size; row++) + ckt->CKTsenInfo->SEN_RHS[row][col] = 0; + + for (i = 0; i < DEVmaxnum; i++) + if (DEVices[i]->DEVsenLoad && ckt->CKThead[i]) { error = DEVices[i]->DEVsenLoad (ckt->CKThead[i], ckt); - if(error) return(error); + if (error) + return error; } - } - } else{ - for (col=0;col<=ckt->CKTsenInfo->SENparms;col++) { - for(row=0;row<=size;row++){ - ckt->CKTsenInfo->SEN_RHS[row][col]= 0; - ckt->CKTsenInfo->SEN_iRHS[row][col]= 0; + + } else { + + for (col = 0; col <= ckt->CKTsenInfo->SENparms; col++) + for (row = 0; row <= size; row++) { + ckt->CKTsenInfo->SEN_RHS[row][col] = 0; + ckt->CKTsenInfo->SEN_iRHS[row][col] = 0; } - } - for (i=0;iDEVsenAcLoad && ckt->CKThead[i] ) { + + for (i = 0; i < DEVmaxnum; i++) + if (DEVices[i]->DEVsenAcLoad && ckt->CKThead[i]) { error = DEVices[i]->DEVsenAcLoad (ckt->CKThead[i], ckt); - if(error) return(error); + if (error) + return error; } - } } - return(OK); + + return OK; } diff --git a/src/unsupported/cktsnprt.c b/src/unsupported/cktsnprt.c index 35c7d91dd..1a2bc224e 100644 --- a/src/unsupported/cktsnprt.c +++ b/src/unsupported/cktsnprt.c @@ -2,8 +2,6 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -/* - */ #include "ngspice/ngspice.h" #include @@ -15,20 +13,18 @@ Author: 1985 Thomas L. Quarles #include "ngspice/suffix.h" - /* CKTsenPrint(ckt) - * this is a driver program to iterate through all the - * various sensitivity print functions provided for - * the circuit elements in the given circuit - */ +/* CKTsenPrint(ckt) + * this is a driver program to iterate through all the + * various sensitivity print functions provided for + * the circuit elements in the given circuit + */ void CKTsenPrint(CKTcircuit *ckt) { int i; - for (i=0;iDEVsenPrint && ckt->CKThead[i] ) { + for (i = 0; i < DEVmaxnum; i++) + if (DEVices[i]->DEVsenPrint && ckt->CKThead[i]) DEVices[i]->DEVsenPrint (ckt->CKThead[i], ckt); - } - } } diff --git a/src/unsupported/cktsnset.c b/src/unsupported/cktsnset.c index 5faeeb03a..551697da0 100644 --- a/src/unsupported/cktsnset.c +++ b/src/unsupported/cktsnset.c @@ -2,15 +2,13 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -/* - */ /* * CKTsenSetup(ckt) * this is a driver program to iterate through all the various - * sensitivity setup functions provided for the circuit elements - * in the given circuit + * sensitivity setup functions provided for the circuit elements + * in the given circuit */ #include "ngspice/ngspice.h" @@ -29,22 +27,24 @@ CKTsenSetup(CKTcircuit *ckt) int i; int error; SENstruct *info; + #ifdef SENSDEBUG printf("CKTsenSetup\n"); -#endif /* SENSDEBUG */ - info = ckt->CKTsenInfo; - info->SENparms = 0; +#endif - for (i=0;iDEVsenSetup && ckt->CKThead[i] ) { + info = ckt->CKTsenInfo; + info->SENparms = 0; + + for (i = 0; i < DEVmaxnum; i++) + if (DEVices[i]->DEVsenSetup && ckt->CKThead[i]) { error = DEVices[i]->DEVsenSetup (info, ckt->CKThead[i]); - if(error) return(error); + if (error) + return error; } - } + #ifdef SENSDEBUG printf("CKTsenSetup end\n"); -#endif /* SENSDEBUG */ - return(OK); +#endif + + return OK; } - - diff --git a/src/unsupported/sen2dest.c b/src/unsupported/sen2dest.c index 141019b00..fa9f4be7d 100644 --- a/src/unsupported/sen2dest.c +++ b/src/unsupported/sen2dest.c @@ -3,11 +3,11 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ - /* SENdestroy(ckt) - * this is a driver program to iterate through all the various - * destroy functions provided for the circuit elements in the - * given circuit - */ +/* SENdestroy(ckt) + * this is a driver program to iterate through all the various + * destroy functions provided for the circuit elements in the + * given circuit + */ #include "ngspice/ngspice.h" #include @@ -23,43 +23,51 @@ SENdestroy(SENstruct *info) int i; int size; + size = info->SENsize; - size = info->SENsize; #ifdef SENSDEBUG - printf("size = %d\n",size); - printf("freeing sensitivity structure in SENdestroy\n"); -#endif /* SENSDEBUG */ - /* - if(info->SENdevices) FREE(info->SENdevices); - if(info->SENparmNames) FREE(info->SENparmNames); - */ - if(info->SEN_Sap){ + printf("size = %d\n", size); + printf("freeing sensitivity structure in SENdestroy\n"); +#endif + + /* + if (info->SENdevices) FREE(info->SENdevices); + if (info->SENparmNames) FREE(info->SENparmNames); + */ + + if (info->SEN_Sap) { + #ifdef SENSDEBUG - printf("freeing SEN_Sap in SENdestroy\n"); -#endif /* SENSDEBUG */ - for(i=0;i<=size;i++){ - if(info->SEN_Sap[i]) FREE(info->SEN_Sap[i]); - } - FREE(info->SEN_Sap); - } - if(info->SEN_RHS){ - for(i=0;i<=size;i++){ - if(info->SEN_RHS[i]) FREE(info->SEN_RHS[i]); - } - FREE(info->SEN_RHS); - } - if(info->SEN_iRHS){ - for(i=0;i<=size;i++){ - if(info->SEN_iRHS[i]) FREE(info->SEN_iRHS[i]); - } - FREE(info->SEN_Sap); - } - /* - FREE(info); - */ + printf("freeing SEN_Sap in SENdestroy\n"); +#endif + + for (i = 0; i <= size; i++) + if (info->SEN_Sap[i]) + FREE(info->SEN_Sap[i]); + FREE(info->SEN_Sap); + } + + if (info->SEN_RHS) { + for (i = 0; i <= size; i++) + if (info->SEN_RHS[i]) + FREE(info->SEN_RHS[i]); + FREE(info->SEN_RHS); + } + + if (info->SEN_iRHS) { + for (i = 0; i <= size; i++) + if (info->SEN_iRHS[i]) + FREE(info->SEN_iRHS[i]); + FREE(info->SEN_Sap); + } + + /* + FREE(info); + */ + #ifdef SENSDEBUG - printf("SENdestroy end\n"); -#endif /* SENSDEBUG */ + printf("SENdestroy end\n"); +#endif return; } diff --git a/src/unsupported/sen2setp.c b/src/unsupported/sen2setp.c index a46898f41..8547e6272 100644 --- a/src/unsupported/sen2setp.c +++ b/src/unsupported/sen2setp.c @@ -12,68 +12,72 @@ Author: 1985 Thomas L. Quarles #include "ngspice/suffix.h" #include "../spicelib/analysis/analysis.h" -/* ARGSUSED */ -int + +int SENsetParm(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value) { NG_IGNORE(ckt); - + switch(which) { case SEN_DC: - if(value->iValue) { + if (value->iValue) ((SENstruct *)anal)->SENmode |= DCSEN; - } break; + case SEN_AC: - if(value->iValue) { + if (value->iValue) ((SENstruct *)anal)->SENmode |= ACSEN; - } break; + case SEN_TRAN: - if(value->iValue) { + if (value->iValue) ((SENstruct *)anal)->SENmode |= TRANSEN; - } break; + case SEN_DEV: ((SENstruct *)anal)->SENnumVal += 1; - if( ! ((SENstruct *)anal)->SENdevices ) { + if ( ! ((SENstruct *)anal)->SENdevices ) { ((SENstruct *)anal)->SENdevices = TMALLOC(char *, ((SENstruct *)anal)->SENnumVal); - if( ((SENstruct *)anal)->SENdevices == NULL) return(E_NOMEM); + if (((SENstruct *)anal)->SENdevices == NULL) + return E_NOMEM; ((SENstruct *)anal)->SENparmNames = TMALLOC(char *, ((SENstruct *)anal)->SENnumVal); - if( ((SENstruct *)anal)->SENparmNames == NULL) return(E_NOMEM); + if (((SENstruct *)anal)->SENparmNames == NULL) + return E_NOMEM; } else { ((SENstruct *)anal)->SENdevices = TREALLOC(char *, ((SENstruct *)anal)->SENdevices, ((SENstruct *)anal)->SENnumVal); - if( ((SENstruct *)anal)->SENdevices == NULL) return(E_NOMEM); - ((SENstruct *)anal)->SENparmNames = TREALLOC(char *, ((SENstruct *)anal)->SENparmNames, ((SENstruct *)anal)->SENnumVal) ; - if( ((SENstruct *)anal)->SENparmNames == NULL) return(E_NOMEM); + if (((SENstruct *)anal)->SENdevices == NULL) + return E_NOMEM; + ((SENstruct *)anal)->SENparmNames = TREALLOC(char *, ((SENstruct *)anal)->SENparmNames, ((SENstruct *)anal)->SENnumVal); + if (((SENstruct *)anal)->SENparmNames == NULL) + return E_NOMEM; } - ((SENstruct *)anal)->SENdevices [ ((SENstruct *)anal)->SENnumVal - 1 ] = - value->sValue; + ((SENstruct *)anal)->SENdevices [ ((SENstruct *)anal)->SENnumVal - 1 ] = value->sValue; break; + case SEN_PARM: - ((SENstruct *)anal)->SENparmNames [ ((SENstruct *)anal)->SENnumVal - 1 ] = - value->sValue; + ((SENstruct *)anal)->SENparmNames [ ((SENstruct *)anal)->SENnumVal - 1 ] = value->sValue; break; default: - return(E_BADPARM); + return E_BADPARM; } - return(OK); + + return OK; } static IFparm SENparms[] = { - { "dc", SEN_DC, IF_SET|IF_FLAG, "sensitivity in DC analysis" }, - { "op", SEN_DC, IF_SET|IF_FLAG, "sensitivity in DCop analysis" }, - { "ac", SEN_AC, IF_SET|IF_FLAG, "sensitivity in AC analysis" }, - { "tran", SEN_TRAN, IF_SET|IF_FLAG, "sensitivity in transient analysis"}, + { "dc", SEN_DC, IF_SET|IF_FLAG, "sensitivity in DC analysis" }, + { "op", SEN_DC, IF_SET|IF_FLAG, "sensitivity in DCop analysis" }, + { "ac", SEN_AC, IF_SET|IF_FLAG, "sensitivity in AC analysis" }, + { "tran", SEN_TRAN, IF_SET|IF_FLAG, "sensitivity in transient analysis"}, { "dev", SEN_DEV, IF_SET|IF_INSTANCE, "instance with design param." }, - { "parm", SEN_PARM, IF_SET|IF_STRING, "name of design parameter" }, + { "parm", SEN_PARM, IF_SET|IF_STRING, "name of design parameter" }, }; -SPICEanalysis SEN2info = { - { +SPICEanalysis SEN2info = { + { "SENS2", "Sensitivity analysis", diff --git a/src/unsupported/snaskq.c b/src/unsupported/snaskq.c index 0f7cb7d5a..adb123315 100644 --- a/src/unsupported/snaskq.c +++ b/src/unsupported/snaskq.c @@ -11,19 +11,19 @@ Author: 1985 Thomas L. Quarles #include "ngspice/cktdefs.h" #include "ngspice/suffix.h" -/* ARGSUSED */ -int + +int SENaskQuest(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value) { NG_IGNORE(ckt); NG_IGNORE(anal); NG_IGNORE(value); - + switch(which) { default: break; } - return(E_BADPARM); -} + return E_BADPARM; +} diff --git a/src/unsupported/snstart.c b/src/unsupported/snstart.c index 5f2a99207..b251f807d 100644 --- a/src/unsupported/snstart.c +++ b/src/unsupported/snstart.c @@ -29,31 +29,38 @@ SENstartup(CKTcircuit *ckt, int restart) exit(1); } -#ifdef SENSDEBUG +#ifdef SENSDEBUG printf("SENstartup\n"); -#endif /* SENSDEBUG */ +#endif + ckt->CKTsenInfo->SENstatus = NORMAL; ckt->CKTsenInfo->SENpertfac = 1e-4; - ckt->CKTsenInfo->SENinitflag = ON;/* allocate memory in - NIsenReinit */ + ckt->CKTsenInfo->SENinitflag = ON; /* allocate memory in NIsenReinit */ parmtemp.iValue = 1; - for(i=0;iCKTsenInfo->SENnumVal;i++) { + + for (i = 0; i < ckt->CKTsenInfo->SENnumVal; i++) { type = -1; fast = NULL; - err = CKTfndDev(ckt,&type,&fast, - ((ckt->CKTsenInfo->SENdevices)[i]), - NULL, NULL); - if(err != OK) return(err); + + err = CKTfndDev(ckt, &type, &fast, + ckt->CKTsenInfo->SENdevices[i], + NULL, NULL); + if (err != OK) + return err; + err = CKTpName( - ((ckt->CKTsenInfo->SENparmNames)[i]), - &parmtemp,ckt ,type, - ((ckt->CKTsenInfo->SENdevices)[i]), + ckt->CKTsenInfo->SENparmNames[i], + &parmtemp, ckt, type, + ckt->CKTsenInfo->SENdevices[i], &fast); - if(err != OK) return(err); + if (err != OK) + return err; } -#ifdef SENSDEBUG + +#ifdef SENSDEBUG printf("SENstartup end\n"); -#endif /* SENSDEBUG */ - return(OK); +#endif + + return OK; } From d86c34aaca36c2a2e7c75a6aa12b642f82601c66 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 7 Apr 2013 17:34:59 +0200 Subject: [PATCH 014/257] sense2, cleanup, avoid (SENstruct *) casts --- src/unsupported/sen2setp.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/unsupported/sen2setp.c b/src/unsupported/sen2setp.c index 8547e6272..a571afea1 100644 --- a/src/unsupported/sen2setp.c +++ b/src/unsupported/sen2setp.c @@ -16,47 +16,49 @@ Author: 1985 Thomas L. Quarles int SENsetParm(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value) { + SENstruct *job = (SENstruct *) anal; + NG_IGNORE(ckt); switch(which) { case SEN_DC: if (value->iValue) - ((SENstruct *)anal)->SENmode |= DCSEN; + job->SENmode |= DCSEN; break; case SEN_AC: if (value->iValue) - ((SENstruct *)anal)->SENmode |= ACSEN; + job->SENmode |= ACSEN; break; case SEN_TRAN: if (value->iValue) - ((SENstruct *)anal)->SENmode |= TRANSEN; + job->SENmode |= TRANSEN; break; case SEN_DEV: - ((SENstruct *)anal)->SENnumVal += 1; - if ( ! ((SENstruct *)anal)->SENdevices ) { - ((SENstruct *)anal)->SENdevices = TMALLOC(char *, ((SENstruct *)anal)->SENnumVal); - if (((SENstruct *)anal)->SENdevices == NULL) + job->SENnumVal += 1; + if (!job->SENdevices) { + job->SENdevices = TMALLOC(char *, job->SENnumVal); + if (job->SENdevices == NULL) return E_NOMEM; - ((SENstruct *)anal)->SENparmNames = TMALLOC(char *, ((SENstruct *)anal)->SENnumVal); - if (((SENstruct *)anal)->SENparmNames == NULL) + job->SENparmNames = TMALLOC(char *, job->SENnumVal); + if (job->SENparmNames == NULL) return E_NOMEM; } else { - ((SENstruct *)anal)->SENdevices = TREALLOC(char *, ((SENstruct *)anal)->SENdevices, ((SENstruct *)anal)->SENnumVal); - if (((SENstruct *)anal)->SENdevices == NULL) + job->SENdevices = TREALLOC(char *, job->SENdevices, job->SENnumVal); + if (job->SENdevices == NULL) return E_NOMEM; - ((SENstruct *)anal)->SENparmNames = TREALLOC(char *, ((SENstruct *)anal)->SENparmNames, ((SENstruct *)anal)->SENnumVal); - if (((SENstruct *)anal)->SENparmNames == NULL) + job->SENparmNames = TREALLOC(char *, job->SENparmNames, job->SENnumVal); + if (job->SENparmNames == NULL) return E_NOMEM; } - ((SENstruct *)anal)->SENdevices [ ((SENstruct *)anal)->SENnumVal - 1 ] = value->sValue; + job->SENdevices [job->SENnumVal - 1] = value->sValue; break; case SEN_PARM: - ((SENstruct *)anal)->SENparmNames [ ((SENstruct *)anal)->SENnumVal - 1 ] = value->sValue; + job->SENparmNames [job->SENnumVal - 1] = value->sValue; break; default: From e134e9b1f96748d840e19a118e771d7d65c1cf3b Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 7 Apr 2013 19:12:29 +0200 Subject: [PATCH 015/257] xpsice, fix premature tfree() invocation reported by "Heini X" on the ngspice-users mailing list this bug was introduced in : commit 0af75f3bd968f8a29f88221a81da6f9dafd2fceb : Date: Sat Aug 18 18:31:23 2012 +0200 : : subckt.c, mif_inp2.c: plug XSPICE setup memory leaks --- src/xspice/mif/mif_inp2.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/xspice/mif/mif_inp2.c b/src/xspice/mif/mif_inp2.c index 62e9ece87..c1240e1b1 100644 --- a/src/xspice/mif/mif_inp2.c +++ b/src/xspice/mif/mif_inp2.c @@ -746,9 +746,6 @@ MIFget_port_type( *status = MIF_OK; } - - if (temp) - tfree(temp); } From efe5dcc3ab9c6c79b43e6b332858dc9e43548e8d Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 7 Apr 2013 20:48:52 +0200 Subject: [PATCH 016/257] sharedspice.c: remove bug causing sigsegv --- src/sharedspice.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sharedspice.c b/src/sharedspice.c index df9debaf1..c6b02beb3 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -1563,14 +1563,13 @@ int sh_vecinit(runDesc *run) data will be sent from sh_ExecutePerLoop() via datfcn() */ if (!curvecvalsall) { curvecvalsall = TMALLOC(vecvaluesall, 1); - curvecvalsall->veccount = veccount; } else { for (i = 0; i < curvecvalsall->veccount; i++) tfree(curvecvalsall->vecsa[i]); tfree(curvecvalsall->vecsa); } - + curvecvalsall->veccount = veccount; curvecvalsall->vecsa = TMALLOC(pvecvalues, veccount); for (i = 0, d = cur_run->runPlot->pl_dvecs; i < veccount; i++, d = d->v_next) { From d58e204cda9f95e11d46f5fa3e7fdbbfe6589839 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 8 Apr 2013 21:51:01 +0200 Subject: [PATCH 017/257] Corrected a prototype related warning --- src/frontend/inp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/frontend/inp.c b/src/frontend/inp.c index 5ff2e0715..551d3c4b9 100644 --- a/src/frontend/inp.c +++ b/src/frontend/inp.c @@ -52,8 +52,7 @@ static struct line *com_options = NULL; static void cktislinear(CKTcircuit *ckt, struct line *deck); void line_free_x(struct line *deck, bool recurse); -void com_circbyline(wordlist *wl); - +void create_circbyline(char *line); /* From e95632f3f03f48d9b5b3631a436fe325be4b5230 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Fri, 12 Apr 2013 23:59:27 +0200 Subject: [PATCH 018/257] sharedspice.c: improved comments --- src/sharedspice.c | 56 ++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/src/sharedspice.c b/src/sharedspice.c index c6b02beb3..bb6210fd4 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -17,8 +17,10 @@ #endif -/* The Delphi Interface has high latency times during printing, - therefore undef the following line */ +/* If a calling function has high latency times during printing, + causing memory access errors, you may undef the following line. + Printing messages are assembled in a wordlist, and sent to the caller + via a new thread. Delays may occur. */ #define low_latency /**********************************************************************/ @@ -304,6 +306,7 @@ static bool ps_exited = TRUE; #define EXPORT_FLAVOR #endif +/* starts a background thread, e.g. from command bg_run */ static void * EXPORT_FLAVOR _thread_run(void *string) { @@ -329,7 +332,7 @@ _thread_run(void *string) } -/*Stops a running thread, hopefully */ +/*Stops a running background thread, hopefully */ static int EXPORT_FLAVOR _thread_stop(void) { @@ -379,7 +382,7 @@ sighandler_sharedspice(int num) #endif /*THREADS*/ - +/* run a ngspice command */ static int runc(char* command) { @@ -487,7 +490,7 @@ runc(char* command) #ifdef THREADS -/* Checks if spice is running in the background */ +/* Checks if ngspice is running in the background */ IMPEXP bool ngSpice_running (void) @@ -497,7 +500,7 @@ ngSpice_running (void) #endif -/* Initialise spice and setup native methods */ +/* Initialise ngspice and setup native methods */ IMPEXP int ngSpice_Init(SendChar* printfcn, SendStat* statusfcn, ControlledExit* ngspiceexit, @@ -681,7 +684,6 @@ IMPEXP int ngSpice_Command(char* comexec) { if ( ! setjmp(errbufc) ) { -// HANDLE tid2; immediate = FALSE; intermj = 1; @@ -690,12 +692,9 @@ int ngSpice_Command(char* comexec) fprintf(stderr, no_init); return 1; } -// tid2 = (HANDLE)_beginthreadex(NULL, 0, (PTHREAD_START_ROUTINE)runc, (void*)comexec, -// 0, NULL); + runc(comexec); - /* main thread prepares immediate detaching of dll, - in case of controlled_exit from tid2 thread, caller is asked - to detach dll via fcn ngexit() */ + /* main thread prepares immediate detaching of dll */ immediate = TRUE; return 0; } @@ -832,8 +831,8 @@ char** ngSpice_AllVecs(char* plotname) /* Redefine the vfprintf() functions for callback */ /*------------------------------------------------------*/ -/* handling of escape characters (extra \ added) is removed, may be added by - un-commenting some lines */ +/* handling of escape characters (extra \ added) only, if + 'set addescape' is given in .spiceinit */ int sh_vfprintf(FILE *f, const char *fmt, va_list args) @@ -912,7 +911,7 @@ sh_vfprintf(FILE *f, const char *fmt, va_list args) } } - /* use sharedspice implementation of fputs (sh_fputs) + /* use sharedspice.c implementation of fputs (sh_fputs) to assess callback function derived from address printfcn received via Spice_Init() from caller of ngspice.dll */ @@ -926,9 +925,10 @@ sh_vfprintf(FILE *f, const char *fmt, va_list args) } -/*----------------------------------------------------------------------*/ -/* Reimplement fprintf() as a call to callback function pfcn */ -/*----------------------------------------------------------------------*/ +/*---------------------------------------------------------------------- + Reimplement fprintf() as a call to callback function pfcn + via sh_vfprintf, sh_fputs, and sh_fputsll + ----------------------------------------------------------------------*/ int sh_fprintf(FILE *f, const char *format, ...) @@ -944,9 +944,10 @@ sh_fprintf(FILE *f, const char *format, ...) } -/*----------------------------------------------------------------------*/ -/* Reimplement printf() as a call to callback function pfcn */ -/*----------------------------------------------------------------------*/ +/*---------------------------------------------------------------------- + Reimplement printf() as a call to callback function pfcn + via sh_vfprintf, sh_fputs, and sh_fputsll + ----------------------------------------------------------------------*/ int sh_printf(const char *format, ...) @@ -999,8 +1000,8 @@ static char* outstringerr = NULL; static char* outstringout = NULL; #if defined (low_latency) || !defined(THREADS) -/* using the strings by the caller sent directly to the caller - has to fast enough (low latency) */ +/* The strings issued by printf etc. are sent directly to the caller. + The callback has to be fast enough (low latency). */ int sh_fputsll(const char *input, FILE* outf) { @@ -1088,7 +1089,8 @@ sh_fputsll(const char *input, FILE* outf) return 0; } -/* provide a lock around printing function */ +/* provide a lock around printing function. + May become critical if latency of callback is too high.*/ int sh_fputs(const char *input, FILE* outf) { @@ -1278,7 +1280,7 @@ char* outstorage(char* wordin, bool write) /* New progress report to statfcn(). - Update only every DELTATIME milliseconds */ + An update occurs only every DELTATIME milliseconds. */ #define DELTATIME 150 void SetAnalyse( char * Analyse, /*in: analysis type */ @@ -1350,8 +1352,8 @@ void SetAnalyse( tfree(s); } -/* a dll or shared library should never exit, but ask for graceful shutdown - (e.g. being detached) via a callback function*/ +/* a dll or shared library should never exit, if loaded dynamically, + but ask for graceful shutdown (e.g. being detached) via a callback function*/ void shared_exit(int status) { /* alert caller to detach dll (if we are in the main thread), From 29752f37a97cccdc174c37cb6c1a75ec34546f6c Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 13 Apr 2013 10:33:46 +0200 Subject: [PATCH 019/257] sharedspice.c, *.h: interface update, more comments --- src/include/ngspice/sharedspice.h | 15 ++++++++------- src/sharedspice.c | 9 ++++++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/include/ngspice/sharedspice.h b/src/include/ngspice/sharedspice.h index f5852abe5..0dfcb94bd 100644 --- a/src/include/ngspice/sharedspice.h +++ b/src/include/ngspice/sharedspice.h @@ -123,16 +123,17 @@ typedef struct vector_info { } vector_info, *pvector_info; typedef struct vecvalues { - char* name; - double creal; - double cimag; - bool is_scale; - bool is_complex; + char* name; /* name of a specific vector */ + double creal; /* actual data value */ + double cimag; /* actual data value */ + bool is_scale;/* if 'name' is the scale vector */ + bool is_complex;/* if the data are complex numbers */ } vecvalues, *pvecvalues; typedef struct vecvaluesall { - int veccount; - pvecvalues *vecsa; + int veccount; /* number of vectors in plot */ + int vecindex; /* index of actual set of vectors */ + pvecvalues *vecsa; /* values of actual set of vectors */ } vecvaluesall, *pvecvaluesall; /* info for a specific vector */ diff --git a/src/sharedspice.c b/src/sharedspice.c index bb6210fd4..cfb856886 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -389,7 +389,9 @@ runc(char* command) char buf[1024] = ""; sighandler oldHandler; #ifdef THREADS +#ifndef low_latency int timeout = 0; +#endif char *string; bool fl_bg = FALSE; command_id = threadid_self(); @@ -1477,7 +1479,7 @@ int sh_ExecutePerLoop(void) { struct dvec *d; int i, veclen; - double testval; +// double testval; struct plot *pl = plot_cur; /* return immediately if callback not wanted */ if (nodatawanted) @@ -1485,11 +1487,12 @@ int sh_ExecutePerLoop(void) /* get the data of the last entry to the plot vector */ veclen = pl->pl_dvecs->v_length - 1; + curvecvalsall->vecindex = veclen; for (d = pl->pl_dvecs, i = 0; d; d = d->v_next, i++) { /* test if real */ if (d->v_flags & VF_REAL) { curvecvalsall->vecsa[i]->is_complex = FALSE; - testval = d->v_realdata[veclen]; +// testval = d->v_realdata[veclen]; curvecvalsall->vecsa[i]->creal = d->v_realdata[veclen]; curvecvalsall->vecsa[i]->cimag = 0.; } @@ -1507,7 +1510,7 @@ int sh_ExecutePerLoop(void) /* called once for a new plot from beginPlot() in outitf.c, - after the vectors in ngspice have been set. + after the vectors in ngspice for this plot have been set. Transfers vector information to the caller via callback datinitfcn() and sets transfer structure for use in sh_ExecutePerLoop() */ int sh_vecinit(runDesc *run) From 1200ce19fe964678b57ad33b3f3432245866878d Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 13 Apr 2013 15:30:12 +0200 Subject: [PATCH 020/257] =?UTF-8?q?sharedspice.c,=20.h,=20.vcproj:=20comme?= =?UTF-8?q?nts,=20update=20f=C3=BCr=20MS=20Visual=20Sudio=20build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/ngspice/sharedspice.h | 8 +++++--- src/sharedspice.c | 2 +- visualc-shared/sharedspice.vcproj | 9 +++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/include/ngspice/sharedspice.h b/src/include/ngspice/sharedspice.h index 0dfcb94bd..ca8f4b71e 100644 --- a/src/include/ngspice/sharedspice.h +++ b/src/include/ngspice/sharedspice.h @@ -112,7 +112,9 @@ struct ngcomplex { typedef struct ngcomplex ngcomplex_t; #endif -/* vector info obtained from any vector in ngspice.dll */ +/* vector info obtained from any vector in ngspice.dll. + Allows direct access to the ngspice internal vector structure, + as defined in include/ngspice/devc.h .*/ typedef struct vector_info { char *v_name; /* Same as so_vname. */ int v_type; /* Same as so_vtype. */ @@ -132,8 +134,8 @@ typedef struct vecvalues { typedef struct vecvaluesall { int veccount; /* number of vectors in plot */ - int vecindex; /* index of actual set of vectors */ - pvecvalues *vecsa; /* values of actual set of vectors */ + int vecindex; /* index of actual set of vectors. i.e. the number of accepted data points */ + pvecvalues *vecsa; /* values of actual set of vectors, indexed from 0 to veccount - 1 */ } vecvaluesall, *pvecvaluesall; /* info for a specific vector */ diff --git a/src/sharedspice.c b/src/sharedspice.c index cfb856886..fcad3a18a 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -650,7 +650,7 @@ bot: // com_version(NULL); fprintf(cp_out, "******\n" - "** %s-%s\n", + "** %s-%s shared library\n", ft_sim->simulator, ft_sim->version); if (Spice_Build_Date != NULL && *Spice_Build_Date != 0) fprintf(cp_out, "** Creation Date: %s\n", Spice_Build_Date); diff --git a/visualc-shared/sharedspice.vcproj b/visualc-shared/sharedspice.vcproj index 5ba6c21fc..95442db6c 100644 --- a/visualc-shared/sharedspice.vcproj +++ b/visualc-shared/sharedspice.vcproj @@ -26,6 +26,9 @@ /> Date: Sun, 14 Apr 2013 00:36:11 +0200 Subject: [PATCH 021/257] INSTALL add --with-ngshared --- INSTALL | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index 93ed9f4a6..5a4566b32 100644 --- a/INSTALL +++ b/INSTALL @@ -250,6 +250,14 @@ Most of the options now following are not well maintained, are not tested or eve "tclspice" is compiled and installed instead of plain ngspice. + --with-ngshared + This option let you compile ngspice as a shared + library or dll, allowing an application controlling + ngspice. This option excludes using --with-x or + --with-wingui. Useful additional options are + --enable-xspice --enable-cider --enable-openmp. + No graphics inetrface is provided, this has to be + handled by the controlling application. 1.4.3 Options Useful for Debugging Ngspice @@ -538,7 +546,7 @@ Most of the options now following are not well maintained, are not tested or eve 9.2 make ngspice with MS Visual Studio 2008 - ngspice may be compiled with MS Visual Studio 2008. + ngspice may be compiled with MS Visual Studio 2008 or 2010. CIDER and XSPICE are included, but the code models for XSPICE (*.cm) are not (yet) made. You may however use the code models From c5c9b8d301b05b8b672dd68ffa670ba2754d1829 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 22 Apr 2013 22:41:29 +0200 Subject: [PATCH 022/257] txldefs.h: update some comments --- src/spicelib/devices/txl/txldefs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/txl/txldefs.h b/src/spicelib/devices/txl/txldefs.h index c1dc5178d..ed8beda52 100644 --- a/src/spicelib/devices/txl/txldefs.h +++ b/src/spicelib/devices/txl/txldefs.h @@ -47,7 +47,7 @@ typedef struct sTXLinstance { unsigned TXLibr1Given : 1; unsigned TXLibr2Given : 1; unsigned TXLdcGiven : 1; - unsigned TXLlengthgiven : 1; /* flag to indicate C was specified */ + unsigned TXLlengthgiven : 1; /* flag to indicate that instance parameter len is specified */ } TXLinstance ; @@ -71,7 +71,7 @@ typedef struct sTXLmodel { /* model structure for a txl */ unsigned Lgiven : 1; /* flag to indicate L was specified */ unsigned Ggiven : 1; /* flag to indicate G was specified */ unsigned Cgiven : 1; /* flag to indicate C was specified */ - unsigned lengthgiven : 1; /* flag to indicate C was specified */ + unsigned lengthgiven : 1; /* flag to indicate length was specified */ } TXLmodel; From 1a3b74e9e7cafd3c3a043964911bfcadf1df5297 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 22 Apr 2013 22:44:58 +0200 Subject: [PATCH 023/257] swload.c: reinstate the truncation code from swtrunc.c (was removed in a patch from 2001 04 25) --- src/spicelib/devices/sw/swload.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/spicelib/devices/sw/swload.c b/src/spicelib/devices/sw/swload.c index 178cd8f98..72e16267f 100644 --- a/src/spicelib/devices/sw/swload.c +++ b/src/spicelib/devices/sw/swload.c @@ -138,6 +138,7 @@ SWload(GENmodel *inModel, CKTcircuit *ckt) // After analyzing the transient code, it seems that this is not a problem because state updating // occurs before the convergence loop in transient processing. *(ckt->CKTstates[0] + here->SWstate) = current_state; + *(ckt->CKTstates[0] + here->SWstate + 1) = v_ctrl; if ((current_state == REALLY_ON) || (current_state == HYST_ON)) g_now = model->SWonConduct; From ef7794de2e297ef664bf4e6b3cb3df4b58267beb Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 23 Apr 2013 09:12:42 +0200 Subject: [PATCH 024/257] code for SENSDEBUG fixed --- src/spicelib/analysis/dctrcurv.c | 2 +- src/spicelib/devices/bjt/bjtsacl.c | 4 ++-- src/spicelib/devices/dio/diosload.c | 22 +++++++++++----------- src/spicelib/devices/ind/indsacl.c | 6 +++--- src/spicelib/devices/ind/indsload.c | 12 ++++++------ src/spicelib/devices/vbic/vbicload.c | 1 - 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/spicelib/analysis/dctrcurv.c b/src/spicelib/analysis/dctrcurv.c index f4d4f82c9..b847f1649 100644 --- a/src/spicelib/analysis/dctrcurv.c +++ b/src/spicelib/analysis/dctrcurv.c @@ -451,7 +451,7 @@ resume: } if (job->TRCVvType[i] == TEMP_CODE) { /* Temperature */ printf("Current Circuit Temperature : %.5e C\n", - ckt-CKTtemp - CONSTCtoK); + ckt->CKTtemp - CONSTCtoK); } #endif /* SENSDEBUG */ diff --git a/src/spicelib/devices/bjt/bjtsacl.c b/src/spicelib/devices/bjt/bjtsacl.c index 46b957497..e083982f2 100644 --- a/src/spicelib/devices/bjt/bjtsacl.c +++ b/src/spicelib/devices/bjt/bjtsacl.c @@ -540,11 +540,11 @@ load: ,cbe,icbe,cce,icce); printf("cc = %.7e + j%.7e , ce = %.7e + j%.7e,", - ,cc,icc,ce,ice); + cc,icc,ce,ice); printf("ccprm = %.7e + j%.7e , ceprm = %.7e + j%.7e", ccprm,iccprm,ceprm,iceprm); printf("cb = %.7e + j%.7e , cbprm = %.7e + j%.7e , ", - cb,icb,cbprm,icbprm) + cb,icb,cbprm,icbprm); printf("cs = %.7e + j%.7e\n", cs,ics); #endif /* SENSDEBUG */ diff --git a/src/spicelib/devices/dio/diosload.c b/src/spicelib/devices/dio/diosload.c index 032358dc7..2a173501e 100644 --- a/src/spicelib/devices/dio/diosload.c +++ b/src/spicelib/devices/dio/diosload.c @@ -56,10 +56,10 @@ DIOsLoad(GENmodel *inModel, CKTcircuit *ckt) #ifdef SENSDEBUG printf("DIOsenload\n"); - fprintf(file,"DIOsenload\n"); - fprintf(file,"CKTtime = %.5e\n",ckt->CKTtime); - fprintf(file,"CKTorder = %.5e\n",ckt->CKTorder); - fprintf(file,"tag0 = %.5e tag1 = %.5e\n",tag0,tag1); + fprintf(stdout,"DIOsenload\n"); + fprintf(stdout,"CKTtime = %.5e\n",ckt->CKTtime); + fprintf(stdout,"CKTorder = %.5e\n",ckt->CKTorder); + fprintf(stdout,"tag0 = %.5e tag1 = %.5e\n",tag0,tag1); #endif /* SENSDEBUG */ /* loop through all the diode models */ @@ -70,7 +70,7 @@ DIOsLoad(GENmodel *inModel, CKTcircuit *ckt) here=here->DIOnextInstance) { #ifdef SENSDEBUG - fprintf(file,"pos = %d , posprm = %d ,neg = %d, senparmno = %d\n", + fprintf(stdout,"pos = %d , posprm = %d ,neg = %d, senparmno = %d\n", here->DIOposNode ,here->DIOposPrimeNode,here->DIOnegNode, here->DIOsenParmNo); #endif /* SENSDEBUG */ @@ -94,7 +94,7 @@ DIOsLoad(GENmodel *inModel, CKTcircuit *ckt) #ifdef SENSDEBUG - fprintf(file,"cd0 = %.7e \n",cd0); + fprintf(stdout,"cd0 = %.7e \n",cd0); #endif /* SENSDEBUG */ A0 = here->DIOarea; @@ -120,9 +120,9 @@ DIOsLoad(GENmodel *inModel, CKTcircuit *ckt) *(here->DIOdphidp) = DqdDp; #ifdef SENSDEBUG - fprintf(file,"cd0 = %.7e ,cd = %.7e,DcdDp=%.7e\n", cd0,cd,DcdDp); - fprintf(file,"cspr0 = %.7e ,DcsprDp=%.7e\n", cspr0,DcsprDp); - fprintf(file,"qd0 = %.7e ,qd = %.7e,DqdDp=%.7e\n", qd0,qd,DqdDp); + fprintf(stdout,"cd0 = %.7e ,cd = %.7e,DcdDp=%.7e\n", cd0,cd,DcdDp); + fprintf(stdout,"cspr0 = %.7e ,DcsprDp=%.7e\n", cspr0,DcsprDp); + fprintf(stdout,"qd0 = %.7e ,qd = %.7e,DqdDp=%.7e\n", qd0,qd,DqdDp); #endif /* SENSDEBUG */ if((info->SENmode == TRANSEN) && @@ -152,12 +152,12 @@ next: 2*(iparmno - 1) + 1); #ifdef SENSDEBUG - fprintf(file,"\n iparmno=%d,Osxp=%.7e\n",iparmno,Osxp); + fprintf(stdout,"\n iparmno=%d,Osxp=%.7e\n",iparmno,Osxp); #endif /* SENSDEBUG */ if(iparmno == here->DIOsenParmNo) Osxp = Osxp - tag0 * DqdDp; #ifdef SENSDEBUG - fprintf(file,"Osxp=%.7e\n",Osxp); + fprintf(stdout,"Osxp=%.7e\n",Osxp); #endif /* SENSDEBUG */ *(info->SEN_RHS[here->DIOposPrimeNode] + iparmno) += Osxp; diff --git a/src/spicelib/devices/ind/indsacl.c b/src/spicelib/devices/ind/indsacl.c index e344973f0..78fc36cc5 100644 --- a/src/spicelib/devices/ind/indsacl.c +++ b/src/spicelib/devices/ind/indsacl.c @@ -150,9 +150,9 @@ INDsAcLoad(GENmodel *inModel, CKTcircuit *ckt) ival = cind * ckt->CKTomega ; #ifdef SENSDEBUG - fprintf(file,"cind = %.5e,icind = %.5e\n",cind,icind); - fprintf(file,"val = %.5e,ival = %.5e\n",val,ival); - fprintf(file,"brEq = %.5e,senparmno = %.5e\n", + fprintf(stdout,"cind = %.5e,icind = %.5e\n",cind,icind); + fprintf(stdout,"val = %.5e,ival = %.5e\n",val,ival); + fprintf(stdout,"brEq = %.5e,senparmno = %.5e\n", here->INDbrEq,here->INDsenParmNo); #endif /* SENSDEBUG */ diff --git a/src/spicelib/devices/ind/indsload.c b/src/spicelib/devices/ind/indsload.c index 3a8e1c4ac..74f9f99cd 100644 --- a/src/spicelib/devices/ind/indsload.c +++ b/src/spicelib/devices/ind/indsload.c @@ -47,8 +47,8 @@ INDsLoad(GENmodel *inModel, CKTcircuit *ckt) if((info->SENmode == TRANSEN) && (ckt->CKTmode & MODEINITTRAN)) return(OK); #ifdef SENSDEBUG - fprintf(file,"INDsenLoad\n"); - fprintf(file,"time = %.5e\n",ckt->CKTtime); + fprintf(stdout,"INDsenLoad\n"); + fprintf(stdout,"time = %.5e\n",ckt->CKTtime); #endif /* SENSDEBUG */ @@ -109,7 +109,7 @@ INDsLoad(GENmodel *inModel, CKTcircuit *ckt) } #ifdef SENSDEBUG - fprintf(file,"cind1 = %.5e,cind2 = %.5e\n",cind1,cind2); + fprintf(stdout,"cind1 = %.5e,cind2 = %.5e\n",cind1,cind2); #endif /* SENSDEBUG */ } @@ -125,8 +125,8 @@ INDsLoad(GENmodel *inModel, CKTcircuit *ckt) #endif /* MUTUAL */ cind = *(ckt->CKTrhsOld + here->INDbrEq); #ifdef SENSDEBUG - fprintf(file,"\n cind=%.5e\n",cind); - fprintf(file,"\n tag0=%.5e,tag1=%.5e\n",tag0,tag1); + fprintf(stdout,"\n cind=%.5e\n",cind); + fprintf(stdout,"\n tag0=%.5e,tag1=%.5e\n",tag0,tag1); #endif /* SENSDEBUG */ for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ Osxp = tag0 * *(ckt->CKTstate1 + here->INDsensxp @@ -135,7 +135,7 @@ INDsLoad(GENmodel *inModel, CKTcircuit *ckt) + 2*(iparmno - 1) + 1); if(iparmno == here->INDsenParmNo) Osxp = Osxp - tag0 * cind; #ifdef SENSDEBUG - fprintf(file,"\n Osxp=%.5e\n",Osxp); + fprintf(stdout,"\n Osxp=%.5e\n",Osxp); #endif /* SENSDEBUG */ *(info->SEN_RHS[here->INDbrEq] + iparmno) -= Osxp; diff --git a/src/spicelib/devices/vbic/vbicload.c b/src/spicelib/devices/vbic/vbicload.c index 2a1890cc8..0a3f7ee5c 100644 --- a/src/spicelib/devices/vbic/vbicload.c +++ b/src/spicelib/devices/vbic/vbicload.c @@ -873,7 +873,6 @@ next1: printf("gpi = %.7e\n", Ibe_Vbei); printf("gmu = %.7e, gm = %.7e\n", Ibc_Vbci, Itzf_Vbei); printf("go = %.7e, gx = %.7e\n", Itzf_Vbci, Irbi_Vrbi); - printf("geqcb = %.7e, geqbx = %.7e\n", geqcb, geqbx); printf("cc = %.7e, cb = %.7e\n", Ibe+Itzf, Ibe); #endif /* SENSDEBUG */ continue; /* go to 1000 */ From 1f1d2db29613e3ab24375513e6b11405a9a3cc8b Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 23 Apr 2013 09:18:00 +0200 Subject: [PATCH 025/257] Makefile for SENSDEBUG fixed --- src/unsupported/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/src/unsupported/Makefile.am b/src/unsupported/Makefile.am index 61adfdcce..1c9ca4c06 100644 --- a/src/unsupported/Makefile.am +++ b/src/unsupported/Makefile.am @@ -9,6 +9,7 @@ libunsupported_la_SOURCES = \ cktsndct.c \ cktsnset.c \ cktsnld.c \ + cktsnprt.c \ sen2dest.c \ sen2setp.c \ snaskq.c \ From 3f971d0d8eccb55301e9be391cdd163933eeed2f Mon Sep 17 00:00:00 2001 From: rlar Date: Tue, 23 Apr 2013 18:43:56 +0200 Subject: [PATCH 026/257] bug fix, preserve filename case for `codemodel', `load' and `use' reported and fixed by Emil Lambrache in bug tracker "case sensitivity not preserved for file names - ID: 3611642" https://sourceforge.net/tracker/?func=detail&atid=423915&aid=3611642&group_id=38962 --- src/frontend/inpcom.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 50c3fc399..bbae8c97f 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -614,10 +614,23 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* loop through 'buffer' until end is reached. Then test for premature end. If premature end is reached, spew error and zap the line. */ - if (!ciprefix("write", buffer)) { // exclude 'write' command so filename case preserved + { char *s; - for (s = buffer; *s && (*s != '\n'); s++) - *s = (char) tolower(*s); + + if ( !ciprefix("write", buffer) && + !ciprefix("codemodel", buffer) && + !ciprefix("use", buffer) && + !ciprefix("load", buffer) + ) + { + for (s = buffer; *s && (*s != '\n'); s++) + *s = (char) tolower(*s); + } else { + // exclude some commands to preserve filename case + for (s = buffer; *s && (*s != '\n'); s++) + ; + } + if (!*s) { // fprintf(cp_err, "Warning: premature EOF\n"); } From 685ed9112df46e6a8795fd7d68fb228f9a452542 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 24 Apr 2013 20:55:21 +0200 Subject: [PATCH 027/257] fix a wrong GMIN implementation --- src/spicelib/devices/dio/dioload.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index 801de12da..a06ea41e5 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -272,8 +272,11 @@ next1: if (model->DIOsatSWCurGiven) { /* sidewall current */ if( (model->DIOforwardKneeCurrent > 0.0) && (cd > 1.0e-18) ) { ikf_area_m = here->DIOforwardKneeCurrent; sqrt_ikf = sqrt(cd/ikf_area_m); - gd = ((1+sqrt_ikf)*gd - cd*gd/(2*sqrt_ikf*ikf_area_m))/(1+2*sqrt_ikf + cd/ikf_area_m) + ckt->CKTgmin*vd; - cd = cd/(1+sqrt_ikf) + ckt->CKTgmin; + gd = ((1+sqrt_ikf)*gd - cd*gd/(2*sqrt_ikf*ikf_area_m))/(1+2*sqrt_ikf + cd/ikf_area_m) + ckt->CKTgmin; + cd = cd/(1+sqrt_ikf) + ckt->CKTgmin*vd; + } else { + gd = gd + ckt->CKTgmin; + cd = cd + ckt->CKTgmin*vd; } } else { /* limit reverse */ @@ -281,8 +284,11 @@ next1: if (model->DIOsatSWCurGiven) { /* sidewall current */ if( (model->DIOreverseKneeCurrent > 0.0) && (cd < -1.0e-18) ) { ikr_area_m = here->DIOreverseKneeCurrent; sqrt_ikr = sqrt(cd/(-ikr_area_m)); - gd = ((1+sqrt_ikr)*gd + cd*gd/(2*sqrt_ikr*ikr_area_m))/(1+2*sqrt_ikr - cd/ikr_area_m) + ckt->CKTgmin*vd; - cd = cd/(1+sqrt_ikr) + ckt->CKTgmin; + gd = ((1+sqrt_ikr)*gd + cd*gd/(2*sqrt_ikr*ikr_area_m))/(1+2*sqrt_ikr - cd/ikr_area_m) + ckt->CKTgmin; + cd = cd/(1+sqrt_ikr) + ckt->CKTgmin*vd; + } else { + gd = gd + ckt->CKTgmin; + cd = cd + ckt->CKTgmin*vd; } } From d95e098488656b4ea78af2781d22ec576adce3fe Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 25 Apr 2013 21:15:56 +0200 Subject: [PATCH 028/257] adapt the sense2 code to ngspice --- src/unsupported/cktsenup.c | 2 +- src/unsupported/cktsncom.c | 39 ++++++++++++++++++++++++++++++-------- src/unsupported/cktsnld.c | 4 ++-- src/unsupported/cktsnprt.c | 2 +- src/unsupported/cktsnset.c | 2 +- src/unsupported/snstart.c | 9 +++++++-- 6 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/unsupported/cktsenup.c b/src/unsupported/cktsenup.c index cbfd42e8a..0ce1acfbd 100644 --- a/src/unsupported/cktsenup.c +++ b/src/unsupported/cktsenup.c @@ -26,7 +26,7 @@ CKTsenUpdate(CKTcircuit *ckt) int error; for (i = 0; i < DEVmaxnum; i++) - if (DEVices[i]->DEVsenUpdate && ckt->CKThead[i]) { + if (DEVices[i] && DEVices[i]->DEVsenUpdate && ckt->CKThead[i]) { error = DEVices[i]->DEVsenUpdate (ckt->CKThead[i], ckt); if (error) return error; diff --git a/src/unsupported/cktsncom.c b/src/unsupported/cktsncom.c index 747bc3452..6fb4dafa3 100644 --- a/src/unsupported/cktsncom.c +++ b/src/unsupported/cktsncom.c @@ -28,7 +28,26 @@ CKTsenComp(CKTcircuit *ckt) #ifdef SENSDEBUG char *rowe; - SMPelement *elt; +// SMPelement *elt; + double *elt; +/* +in smpdefs.h steht: +typedef struct MatrixElement *SMPelement; +SMPelement * SMPfindElt( SMPmatrix *, int , int , int ); +(die Fkt. steht in spsmp.c und gibt einen auf SMPelement * gecasteten Elementptr. zurück) + +in sparse/spdefs.h steht: +struct MatrixElement +{ + RealNumber Real; + RealNumber Imag; + int Row; + int Col; + struct MatrixElement *NextInRow; + struct MatrixElement *NextInCol; +}; +typedef struct MatrixElement *ElementPtr; +*/ #endif #ifdef SENSDEBUG @@ -66,14 +85,14 @@ CKTsenComp(CKTcircuit *ckt) for (row = 1; row <= size; row++) { rowe = CKTnodName(ckt, row); - if (strcmp("4", rowe) == 0) { +// if (strcmp("4", rowe) == 0) { for (col = 1; col <= info->SENparms; col++) { printf("\t"); printf("Sap(%s,%d) = %.5e\t", rowe, col, info->SEN_Sap[row][col]); } printf("\n\n"); - } +// } } printf(" RHS matrix :\n"); @@ -89,8 +108,10 @@ CKTsenComp(CKTcircuit *ckt) printf(" Jacobian matrix :\n"); for (row = 1; row <= size; row++) { for (col = 1; col <= size; col++) - if (elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)) - printf("%.7e ", elt->SMPvalue); + if ((elt = (double *)SMPfindElt(ckt->CKTmatrix, row , col , 0))) +// printf("%.7e ", elt->SMPvalue); ------> gibts nicht +// printf("%.7e ", elt->Real); ------> gibts auch nicht + printf("%.7e ", *elt); // ------> geht aber nur für real Werte else printf("0.0000000e+00 "); printf("\n"); @@ -154,9 +175,11 @@ CKTsenComp(CKTcircuit *ckt) printf(" Jacobian matrix for AC :\n"); for (row = 1; row <= size; row++) { for (col = 1; col <= size; col++) { - if (elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)) { - printf("%.7e ", elt->SMPvalue); - printf("+j%.7e\t", elt->SMPiValue); + if ((elt = (double *)SMPfindElt(ckt->CKTmatrix, row , col , 0))) { +// printf("%.7e ", elt->SMPvalue); +// printf("+j%.7e\t", elt->SMPiValue); + printf("%.7e ", *elt); + printf("+j%.7e\t", *elt+1); } else{ printf("0.0000000e+00 "); printf("+j0.0000000e+00\t"); diff --git a/src/unsupported/cktsnld.c b/src/unsupported/cktsnld.c index a96ede9aa..7afeaf3a5 100644 --- a/src/unsupported/cktsnld.c +++ b/src/unsupported/cktsnld.c @@ -41,7 +41,7 @@ CKTsenLoad(CKTcircuit *ckt) ckt->CKTsenInfo->SEN_RHS[row][col] = 0; for (i = 0; i < DEVmaxnum; i++) - if (DEVices[i]->DEVsenLoad && ckt->CKThead[i]) { + if (DEVices[i] && DEVices[i]->DEVsenLoad && ckt->CKThead[i]) { error = DEVices[i]->DEVsenLoad (ckt->CKThead[i], ckt); if (error) return error; @@ -56,7 +56,7 @@ CKTsenLoad(CKTcircuit *ckt) } for (i = 0; i < DEVmaxnum; i++) - if (DEVices[i]->DEVsenAcLoad && ckt->CKThead[i]) { + if (DEVices[i] && DEVices[i]->DEVsenAcLoad && ckt->CKThead[i]) { error = DEVices[i]->DEVsenAcLoad (ckt->CKThead[i], ckt); if (error) return error; diff --git a/src/unsupported/cktsnprt.c b/src/unsupported/cktsnprt.c index 1a2bc224e..c0a6801c8 100644 --- a/src/unsupported/cktsnprt.c +++ b/src/unsupported/cktsnprt.c @@ -25,6 +25,6 @@ CKTsenPrint(CKTcircuit *ckt) int i; for (i = 0; i < DEVmaxnum; i++) - if (DEVices[i]->DEVsenPrint && ckt->CKThead[i]) + if (DEVices[i] && DEVices[i]->DEVsenPrint && ckt->CKThead[i]) DEVices[i]->DEVsenPrint (ckt->CKThead[i], ckt); } diff --git a/src/unsupported/cktsnset.c b/src/unsupported/cktsnset.c index 551697da0..d2984acce 100644 --- a/src/unsupported/cktsnset.c +++ b/src/unsupported/cktsnset.c @@ -36,7 +36,7 @@ CKTsenSetup(CKTcircuit *ckt) info->SENparms = 0; for (i = 0; i < DEVmaxnum; i++) - if (DEVices[i]->DEVsenSetup && ckt->CKThead[i]) { + if (DEVices[i] && DEVices[i]->DEVsenSetup && ckt->CKThead[i]) { error = DEVices[i]->DEVsenSetup (info, ckt->CKThead[i]); if (error) return error; diff --git a/src/unsupported/snstart.c b/src/unsupported/snstart.c index b251f807d..d3c0da9ca 100644 --- a/src/unsupported/snstart.c +++ b/src/unsupported/snstart.c @@ -23,12 +23,12 @@ SENstartup(CKTcircuit *ckt, int restart) IFvalue parmtemp; int type; GENinstance *fast; - +/* if (restart) { fprintf(stderr, "unsupported code, (SENstartup), doesn't support restart\n"); exit(1); } - +*/ #ifdef SENSDEBUG printf("SENstartup\n"); #endif @@ -38,6 +38,7 @@ SENstartup(CKTcircuit *ckt, int restart) ckt->CKTsenInfo->SENinitflag = ON; /* allocate memory in NIsenReinit */ parmtemp.iValue = 1; + parmtemp.rValue = 1.0; for (i = 0; i < ckt->CKTsenInfo->SENnumVal; i++) { type = -1; @@ -49,6 +50,10 @@ SENstartup(CKTcircuit *ckt, int restart) if (err != OK) return err; +#ifdef SENSDEBUG + printf("SENstartup Instance: %s Design parameter: %s\n", ckt->CKTsenInfo->SENdevices[i], + ckt->CKTsenInfo->SENparmNames[i]); +#endif err = CKTpName( ckt->CKTsenInfo->SENparmNames[i], &parmtemp, ckt, type, From f4241ef7ea57e1f09119c98d5a438a0809f2f491 Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 26 Apr 2013 18:43:38 +0200 Subject: [PATCH 029/257] fix an incorrect typedef and cast which was of no consequence, because nobody made use of it. ancient, already in the very first commit of ngspice Date: Thu Apr 27 20:03:57 2000 +0000 --- src/include/ngspice/smpdefs.h | 2 +- src/maths/sparse/spsmp.c | 2 +- src/unsupported/cktsncom.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/ngspice/smpdefs.h b/src/include/ngspice/smpdefs.h index bae1ad37a..b49e4fff6 100644 --- a/src/include/ngspice/smpdefs.h +++ b/src/include/ngspice/smpdefs.h @@ -2,7 +2,7 @@ #define ngspice_SMPDEFS_H typedef struct MatrixFrame SMPmatrix; -typedef struct MatrixElement *SMPelement; +typedef struct MatrixElement SMPelement; /********** Copyright 1990 Regents of the University of California. All rights reserved. diff --git a/src/maths/sparse/spsmp.c b/src/maths/sparse/spsmp.c index 2d66a44a8..6816ca771 100644 --- a/src/maths/sparse/spsmp.c +++ b/src/maths/sparse/spsmp.c @@ -464,7 +464,7 @@ SMPfindElt(SMPmatrix *eMatrix, int Row, int Col, int CreateIfMissing) Col = Matrix->ExtToIntColMap[Col]; Element = Matrix->FirstInCol[Col]; Element = spcFindElementInCol(Matrix, &Element, Row, Col, CreateIfMissing); - return (SMPelement *)Element; + return Element; } /* XXX The following should probably be implemented in spUtils */ diff --git a/src/unsupported/cktsncom.c b/src/unsupported/cktsncom.c index 6fb4dafa3..e4bca95fa 100644 --- a/src/unsupported/cktsncom.c +++ b/src/unsupported/cktsncom.c @@ -32,7 +32,7 @@ CKTsenComp(CKTcircuit *ckt) double *elt; /* in smpdefs.h steht: -typedef struct MatrixElement *SMPelement; +typedef struct MatrixElement SMPelement; SMPelement * SMPfindElt( SMPmatrix *, int , int , int ); (die Fkt. steht in spsmp.c und gibt einen auf SMPelement * gecasteten Elementptr. zurück) From ff0ed666a024a8b078c8796ef13b374a2f908574 Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 26 Apr 2013 20:25:23 +0200 Subject: [PATCH 030/257] workaround, make the opaque struct MatrixElement partially visible this struct is private to the `sparse' world, and lives in "maths/sparse/spdefs.h" which can't be included here, because it is incompatible to the rest of ngspice. this is the same problem as in ciderlib/oned/oneprint.c ciderlib/twod/twoprint.c --- src/unsupported/cktsncom.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/unsupported/cktsncom.c b/src/unsupported/cktsncom.c index e4bca95fa..78c5241d5 100644 --- a/src/unsupported/cktsncom.c +++ b/src/unsupported/cktsncom.c @@ -17,6 +17,22 @@ Author: 1985 Thomas L. Quarles #include "ngspice/trandefs.h" #include "ngspice/suffix.h" +// #include "../maths/sparse/spdefs.h" +// +// this include file from `sparse' is incompatible +// with the rest of ngspice +// so we can unfortunatly not include here +// instead we cheat a bit and +// introduce the opaque struct MatrixElement here +// (only the first struct members which are of importance to us) + + +struct MatrixElement +{ + double Real; + double Imag; + // ... +}; int CKTsenComp(CKTcircuit *ckt) @@ -28,8 +44,7 @@ CKTsenComp(CKTcircuit *ckt) #ifdef SENSDEBUG char *rowe; -// SMPelement *elt; - double *elt; + SMPelement *elt; /* in smpdefs.h steht: typedef struct MatrixElement SMPelement; @@ -108,10 +123,8 @@ typedef struct MatrixElement *ElementPtr; printf(" Jacobian matrix :\n"); for (row = 1; row <= size; row++) { for (col = 1; col <= size; col++) - if ((elt = (double *)SMPfindElt(ckt->CKTmatrix, row , col , 0))) -// printf("%.7e ", elt->SMPvalue); ------> gibts nicht -// printf("%.7e ", elt->Real); ------> gibts auch nicht - printf("%.7e ", *elt); // ------> geht aber nur für real Werte + if ((elt = SMPfindElt(ckt->CKTmatrix, row , col , 0))) + printf("%.7e ", elt->Real); else printf("0.0000000e+00 "); printf("\n"); @@ -175,11 +188,9 @@ typedef struct MatrixElement *ElementPtr; printf(" Jacobian matrix for AC :\n"); for (row = 1; row <= size; row++) { for (col = 1; col <= size; col++) { - if ((elt = (double *)SMPfindElt(ckt->CKTmatrix, row , col , 0))) { -// printf("%.7e ", elt->SMPvalue); -// printf("+j%.7e\t", elt->SMPiValue); - printf("%.7e ", *elt); - printf("+j%.7e\t", *elt+1); + if ((elt = SMPfindElt(ckt->CKTmatrix, row , col , 0))) { + printf("%.7e ", elt->Real); + printf("+j%.7e\t", elt->Imag); } else{ printf("0.0000000e+00 "); printf("+j0.0000000e+00\t"); From 8ea98aea6a4a78ea857f7cc9f571061dbfe0c3c6 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sat, 27 Apr 2013 11:01:02 +0200 Subject: [PATCH 031/257] cleanings for sens2 code wrt SENSDEBUG printout --- src/spicelib/analysis/dctran.c | 6 ------ src/spicelib/devices/bjt/bjtsupd.c | 5 ++--- src/unsupported/cktsncom.c | 28 ++++++---------------------- src/unsupported/snstart.c | 7 +++---- 4 files changed, 11 insertions(+), 35 deletions(-) diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index ff9dee3e7..9716e9fa3 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -80,9 +80,6 @@ DCtran(CKTcircuit *ckt, #ifdef WANT_SENSE2 int save, save2, size; long save1; -#ifdef SENSDEBUG - FILE *outsen; -#endif /* SENSDEBUG */ #endif int save_order; long save_mode; @@ -484,9 +481,6 @@ DCtran(CKTcircuit *ckt, #ifdef WANT_SENSE2 if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)){ ckt->CKTsenInfo->SENmode = save; -#ifdef SENSDEBUG - fclose(outsen); -#endif /* SENSDEBUG */ } #endif return(OK); diff --git a/src/spicelib/devices/bjt/bjtsupd.c b/src/spicelib/devices/bjt/bjtsupd.c index f2551e6c9..f76ef8f71 100644 --- a/src/spicelib/devices/bjt/bjtsupd.c +++ b/src/spicelib/devices/bjt/bjtsupd.c @@ -55,9 +55,8 @@ BJTsUpdate(GENmodel *inModel, CKTcircuit *ckt) sxpbx = 0; #ifdef SENSDEBUG printf("senupdate Instance name: %s\n",here->BJTname); - printf("iparmno = %d,CKTag[0] = %.2e,CKTag[1] = %.2e\n", - iparmno,ckt->CKTag[0],ckt->CKTag[1]); - + printf("CKTag[0] = %.2e,CKTag[1] = %.2e\n", + ckt->CKTag[0],ckt->CKTag[1]); printf("capbe = %.7e\n",here->BJTcapbe); printf("capbc = %.7e\n",here->BJTcapbc); printf("capsub = %.7e\n",here->BJTcapsub); diff --git a/src/unsupported/cktsncom.c b/src/unsupported/cktsncom.c index 78c5241d5..ec18e13c1 100644 --- a/src/unsupported/cktsncom.c +++ b/src/unsupported/cktsncom.c @@ -26,7 +26,6 @@ Author: 1985 Thomas L. Quarles // introduce the opaque struct MatrixElement here // (only the first struct members which are of importance to us) - struct MatrixElement { double Real; @@ -45,24 +44,6 @@ CKTsenComp(CKTcircuit *ckt) #ifdef SENSDEBUG char *rowe; SMPelement *elt; -/* -in smpdefs.h steht: -typedef struct MatrixElement SMPelement; -SMPelement * SMPfindElt( SMPmatrix *, int , int , int ); -(die Fkt. steht in spsmp.c und gibt einen auf SMPelement * gecasteten Elementptr. zurück) - -in sparse/spdefs.h steht: -struct MatrixElement -{ - RealNumber Real; - RealNumber Imag; - int Row; - int Col; - struct MatrixElement *NextInRow; - struct MatrixElement *NextInCol; -}; -typedef struct MatrixElement *ElementPtr; -*/ #endif #ifdef SENSDEBUG @@ -122,11 +103,13 @@ typedef struct MatrixElement *ElementPtr; printf(" Jacobian matrix :\n"); for (row = 1; row <= size; row++) { - for (col = 1; col <= size; col++) - if ((elt = SMPfindElt(ckt->CKTmatrix, row , col , 0))) + for (col = 1; col <= size; col++) { + elt = SMPfindElt(ckt->CKTmatrix, row , col , 0); + if (elt) printf("%.7e ", elt->Real); else printf("0.0000000e+00 "); + } printf("\n"); } #endif @@ -188,7 +171,8 @@ typedef struct MatrixElement *ElementPtr; printf(" Jacobian matrix for AC :\n"); for (row = 1; row <= size; row++) { for (col = 1; col <= size; col++) { - if ((elt = SMPfindElt(ckt->CKTmatrix, row , col , 0))) { + elt = SMPfindElt(ckt->CKTmatrix, row , col , 0); + if (elt) { printf("%.7e ", elt->Real); printf("+j%.7e\t", elt->Imag); } else{ diff --git a/src/unsupported/snstart.c b/src/unsupported/snstart.c index d3c0da9ca..9d812494a 100644 --- a/src/unsupported/snstart.c +++ b/src/unsupported/snstart.c @@ -23,12 +23,11 @@ SENstartup(CKTcircuit *ckt, int restart) IFvalue parmtemp; int type; GENinstance *fast; -/* + if (restart) { - fprintf(stderr, "unsupported code, (SENstartup), doesn't support restart\n"); - exit(1); + fprintf(stdout, "Sensitivity-2 analysis: unsupported code\n"); } -*/ + #ifdef SENSDEBUG printf("SENstartup\n"); #endif From e84ac7800f968aef4236488e9ca368baa80a01c9 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 20:06:10 +0200 Subject: [PATCH 032/257] sparse/*.c, drop unused artifacts --- src/maths/sparse/sputils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maths/sparse/sputils.c b/src/maths/sparse/sputils.c index 5b767460d..b615d7882 100644 --- a/src/maths/sparse/sputils.c +++ b/src/maths/sparse/sputils.c @@ -1124,7 +1124,7 @@ spStripMatrix(MatrixPtr eMatrix) /* Reset the element lists. */ { - ElementPtr pElement; + struct ElementListNodeStruct *pListNode; pListNode = Matrix->LastElementListNode = Matrix->FirstElementListNode; @@ -1134,7 +1134,7 @@ spStripMatrix(MatrixPtr eMatrix) /* Reset the fill-in lists. */ { - ElementPtr pFillin; + struct FillinListNodeStruct *pListNode; pListNode = Matrix->LastFillinListNode = Matrix->FirstFillinListNode; From ee5b7a1053c0195178f099626b418541771c1c74 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 13:47:50 +0200 Subject: [PATCH 033/257] sparse/*.c, drop unnecessary (void *) cast --- src/maths/sparse/spalloc.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/maths/sparse/spalloc.c b/src/maths/sparse/spalloc.c index fe8713e8b..1e7713ce8 100644 --- a/src/maths/sparse/spalloc.c +++ b/src/maths/sparse/spalloc.c @@ -190,7 +190,7 @@ spCreate(int Size, int Complex, int *pError) Matrix->ElementsRemaining = 0; Matrix->FillinsRemaining = 0; - RecordAllocation( Matrix, (void *)Matrix ); + RecordAllocation( Matrix, Matrix ); if (Matrix->Error == spNO_MEMORY) goto MemoryError; /* Take out the trash. */ @@ -311,7 +311,7 @@ spcGetElement(MatrixPtr Matrix) /* Allocate block of MatrixElements if necessary. */ if (Matrix->ElementsRemaining == 0) { pElements = SP_MALLOC(struct MatrixElement, ELEMENTS_PER_ALLOCATION); - RecordAllocation( Matrix, (void *)pElements ); + RecordAllocation( Matrix, pElements ); if (Matrix->Error == spNO_MEMORY) return NULL; Matrix->ElementsRemaining = ELEMENTS_PER_ALLOCATION; Matrix->NextAvailElement = pElements; @@ -331,14 +331,14 @@ spcGetElement(MatrixPtr Matrix) } else { /* Allocate block of elements. */ pElements = SP_MALLOC(struct MatrixElement, ELEMENTS_PER_ALLOCATION); - RecordAllocation( Matrix, (void *)pElements ); + RecordAllocation( Matrix, pElements ); if (Matrix->Error == spNO_MEMORY) return NULL; Matrix->ElementsRemaining = ELEMENTS_PER_ALLOCATION; Matrix->NextAvailElement = pElements; /* Allocate an element list structure. */ pListNode->Next = SP_MALLOC(struct ElementListNodeStruct,1); - RecordAllocation( Matrix, (void *)pListNode->Next ); + RecordAllocation( Matrix, pListNode->Next ); if (Matrix->Error == spNO_MEMORY) return NULL; Matrix->LastElementListNode = pListNode = pListNode->Next; @@ -402,14 +402,14 @@ InitializeElementBlocks(MatrixPtr Matrix, int InitialNumberOfElements, /* Allocate block of MatrixElements for elements. */ pElement = SP_MALLOC(struct MatrixElement, InitialNumberOfElements); - RecordAllocation( Matrix, (void *)pElement ); + RecordAllocation( Matrix, pElement ); if (Matrix->Error == spNO_MEMORY) return; Matrix->ElementsRemaining = InitialNumberOfElements; Matrix->NextAvailElement = pElement; /* Allocate an element list structure. */ Matrix->FirstElementListNode = SP_MALLOC(struct ElementListNodeStruct,1); - RecordAllocation( Matrix, (void *)Matrix->FirstElementListNode ); + RecordAllocation( Matrix, Matrix->FirstElementListNode ); if (Matrix->Error == spNO_MEMORY) return; Matrix->LastElementListNode = Matrix->FirstElementListNode; @@ -420,14 +420,14 @@ InitializeElementBlocks(MatrixPtr Matrix, int InitialNumberOfElements, /* Allocate block of MatrixElements for fill-ins. */ pElement = SP_MALLOC(struct MatrixElement, NumberOfFillinsExpected); - RecordAllocation( Matrix, (void *)pElement ); + RecordAllocation( Matrix, pElement ); if (Matrix->Error == spNO_MEMORY) return; Matrix->FillinsRemaining = NumberOfFillinsExpected; Matrix->NextAvailFillin = pElement; /* Allocate a fill-in list structure. */ Matrix->FirstFillinListNode = SP_MALLOC(struct FillinListNodeStruct,1); - RecordAllocation( Matrix, (void *)Matrix->FirstFillinListNode ); + RecordAllocation( Matrix, Matrix->FirstFillinListNode ); if (Matrix->Error == spNO_MEMORY) return; Matrix->LastFillinListNode = Matrix->FirstFillinListNode; @@ -487,14 +487,14 @@ spcGetFillin(MatrixPtr Matrix) } else { /* Allocate block of fill-ins. */ pFillins = SP_MALLOC(struct MatrixElement, ELEMENTS_PER_ALLOCATION); - RecordAllocation( Matrix, (void *)pFillins ); + RecordAllocation( Matrix, pFillins ); if (Matrix->Error == spNO_MEMORY) return NULL; Matrix->FillinsRemaining = ELEMENTS_PER_ALLOCATION; Matrix->NextAvailFillin = pFillins; /* Allocate a fill-in list structure. */ pListNode->Next = SP_MALLOC(struct FillinListNodeStruct,1); - RecordAllocation( Matrix, (void *)pListNode->Next ); + RecordAllocation( Matrix, pListNode->Next ); if (Matrix->Error == spNO_MEMORY) return NULL; Matrix->LastFillinListNode = pListNode = pListNode->Next; From a1e7036f4971caf9601a78631501806d55394c2a Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 18:54:18 +0200 Subject: [PATCH 034/257] sparse/*.c, avoid (RealNumber *) casts by proper use of ElementPr --- src/maths/sparse/spbuild.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/maths/sparse/spbuild.c b/src/maths/sparse/spbuild.c index c3601fc08..abf0a1f1b 100644 --- a/src/maths/sparse/spbuild.c +++ b/src/maths/sparse/spbuild.c @@ -184,7 +184,7 @@ RealNumber * spFindElement(MatrixPtr eMatrix, int Row, int Col) { MatrixPtr Matrix = eMatrix; -RealNumber *pElement; +ElementPtr pElement; /* Begin `spFindElement'. */ assert( IS_SPARSE( Matrix ) && Row >= 0 && Col >= 0 ); @@ -211,7 +211,7 @@ RealNumber *pElement; * is the first record in the MatrixElement structure. */ - if ((Row != Col) || ((pElement = (RealNumber *)Matrix->Diag[Row]) == NULL)) + if ((Row != Col) || ((pElement = Matrix->Diag[Row]) == NULL)) { /* * Element does not exist or does not reside along diagonal. Search @@ -219,11 +219,11 @@ RealNumber *pElement; * element which is returned by spcFindElementInCol is cast into a * pointer to Real, a RealNumber. */ - pElement = (RealNumber*)spcFindElementInCol( Matrix, + pElement = spcFindElementInCol( Matrix, &(Matrix->FirstInCol[Col]), Row, Col, NO ); } - return pElement; + return & pElement->Real; } @@ -267,7 +267,7 @@ RealNumber * spGetElement(MatrixPtr eMatrix, int Row, int Col) { MatrixPtr Matrix = eMatrix; - RealNumber *pElement; + ElementPtr pElement; /* Begin `spGetElement'. */ assert( IS_SPARSE( Matrix ) && Row >= 0 && Col >= 0 ); @@ -306,18 +306,18 @@ spGetElement(MatrixPtr eMatrix, int Row, int Col) * statement depends on the fact that Real is the first record in * the MatrixElement structure. */ - if ((Row != Col) || ((pElement = (RealNumber *)Matrix->Diag[Row]) == NULL)) + if ((Row != Col) || ((pElement = Matrix->Diag[Row]) == NULL)) { /* Element does not exist or does not reside along diagonal. * Search column for element. As in the if statement above, * the pointer to the element which is returned by * spcFindElementInCol is cast into a pointer to Real, a * RealNumber. */ - pElement = (RealNumber*)spcFindElementInCol( Matrix, + pElement = spcFindElementInCol( Matrix, &(Matrix->FirstInCol[Col]), Row, Col, YES ); } - return pElement; + return & pElement->Real; } @@ -1183,7 +1183,7 @@ spInitialize(MatrixPtr eMatrix, int (*pInit)(RealNumber*, void *InitInfo, int , } else { - Error = pInit ((RealNumber *)pElement, pElement->pInitInfo, + Error = pInit (& pElement->Real, pElement->pInitInfo, Matrix->IntToExtRowMap[pElement->Row], Col); if (Error) { From 82e215ca040725b0c37ccea4759a9d03b421119f Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 13:49:38 +0200 Subject: [PATCH 035/257] sparse/*.c, drop unnecessary (MatrixPtr) cast --- src/maths/sparse/spbuild.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maths/sparse/spbuild.c b/src/maths/sparse/spbuild.c index abf0a1f1b..c7265153d 100644 --- a/src/maths/sparse/spbuild.c +++ b/src/maths/sparse/spbuild.c @@ -645,7 +645,7 @@ spGetQuad(MatrixPtr Matrix, int Row1, int Row2, int Col1, int Col2, (Template->Element4Negated == NULL)) return spNO_MEMORY; - if (Template->Element1 == &((MatrixPtr)Matrix)->TrashCan.Real) + if (Template->Element1 == & Matrix->TrashCan.Real) SWAP( RealNumber *, Template->Element1, Template->Element2 ); return spOKAY; From e69b235d9e59eb417f8f60b9b3d28ad0c4b1ae9c Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 13:49:55 +0200 Subject: [PATCH 036/257] sparse/*.c, drop unnecessary (int *) cast --- src/maths/sparse/spfactor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maths/sparse/spfactor.c b/src/maths/sparse/spfactor.c index 25008ad04..ddff32fcd 100644 --- a/src/maths/sparse/spfactor.c +++ b/src/maths/sparse/spfactor.c @@ -603,8 +603,8 @@ spPartition(MatrixPtr eMatrix, int Mode) assert( Mode == spAUTO_PARTITION ); /* Otherwise, count all operations needed in when factoring matrix. */ - Nc = (int *)Matrix->MarkowitzRow; - No = (int *)Matrix->MarkowitzCol; + Nc = Matrix->MarkowitzRow; + No = Matrix->MarkowitzCol; Nm = (int *)Matrix->MarkowitzProd; /* Start mock-factorization. */ From 2cf997099633427e6705ddb134a72245a8ca87f7 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 13:50:13 +0200 Subject: [PATCH 037/257] sparse/*.c, drop unnecessary (double) cast --- src/maths/sparse/spoutput.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/maths/sparse/spoutput.c b/src/maths/sparse/spoutput.c index 6464e4fa0..cc5af829a 100644 --- a/src/maths/sparse/spoutput.c +++ b/src/maths/sparse/spoutput.c @@ -297,7 +297,7 @@ spPrint(MatrixPtr eMatrix, int PrintReordered, int Data, int Header) { /* Case where element exists */ if (Data) - printf(" %9.3g", (double)pElement->Real); + printf(" %9.3g", pElement->Real); else putchar('x'); @@ -328,7 +328,7 @@ spPrint(MatrixPtr eMatrix, int PrintReordered, int Data, int Header) if (pImagElements[J - StartCol] != NULL) { printf(" %8.2gj", - (double)pImagElements[J-StartCol]->Imag); + pImagElements[J-StartCol]->Imag); } else printf(" "); } @@ -520,7 +520,7 @@ spFileMatrix(MatrixPtr eMatrix, char *File, char *Label, int Reordered, } Err = fprintf ( pMatrixFile,"%d\t%d\t%-.15g\t%-.15g\n", - Row, Col, (double)pElement->Real, (double)pElement->Imag + Row, Col, pElement->Real, pElement->Imag ); if (Err < 0) return 0; pElement = pElement->NextInCol; @@ -543,7 +543,7 @@ spFileMatrix(MatrixPtr eMatrix, char *File, char *Label, int Reordered, Col = Matrix->IntToExtColMap[I]; Err = fprintf ( pMatrixFile,"%d\t%d\t%-.15g\n", - Row, Col, (double)pElement->Real + Row, Col, pElement->Real ); if (Err < 0) return 0; pElement = pElement->NextInCol; @@ -623,7 +623,7 @@ spFileVector(MatrixPtr eMatrix, char *File, RealVector RHS, RealVector iRHS) { Err = fprintf ( pMatrixFile, "%-.15g\t%-.15g\n", - (double)RHS[I], (double)iRHS[I] + RHS[I], iRHS[I] ); if (Err < 0) return 0; } @@ -632,7 +632,7 @@ spFileVector(MatrixPtr eMatrix, char *File, RealVector RHS, RealVector iRHS) { for (I = 1; I <= Size; I++) { - if (fprintf(pMatrixFile, "%-.15g\n", (double)RHS[I]) < 0) + if (fprintf(pMatrixFile, "%-.15g\n", RHS[I]) < 0) return 0; } } From 8cd5a15343ac22197469a07eb01a229d9b586834 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 13:50:33 +0200 Subject: [PATCH 038/257] sparse/*.c, drop unnecessary (spREAL) cast --- src/maths/sparse/spsmp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maths/sparse/spsmp.c b/src/maths/sparse/spsmp.c index 6816ca771..85607b185 100644 --- a/src/maths/sparse/spsmp.c +++ b/src/maths/sparse/spsmp.c @@ -184,7 +184,7 @@ SMPcReorder(SMPmatrix *Matrix, double PivTol, double PivRel, *NumSwaps = 1; spSetComplex( Matrix ); return spOrderAndFactor( Matrix, NULL, - (spREAL)PivRel, (spREAL)PivTol, YES ); + PivRel, PivTol, YES ); } /* @@ -196,7 +196,7 @@ SMPreorder(SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin) spSetReal( Matrix ); LoadGmin( Matrix, Gmin ); return spOrderAndFactor( Matrix, NULL, - (spREAL)PivRel, (spREAL)PivTol, YES ); + PivRel, PivTol, YES ); } /* From 4382d81dc4a995fb5748b9453505f3167885b794 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 13:51:41 +0200 Subject: [PATCH 039/257] sparse/*.c, unify, use local copy `Matrix' instead of `eMatrix' --- src/maths/sparse/spfactor.c | 4 ++-- src/maths/sparse/sputils.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/maths/sparse/spfactor.c b/src/maths/sparse/spfactor.c index ddff32fcd..103392a73 100644 --- a/src/maths/sparse/spfactor.c +++ b/src/maths/sparse/spfactor.c @@ -333,10 +333,10 @@ spFactor(MatrixPtr eMatrix) assert( IS_VALID(Matrix) && !Matrix->Factored); if (Matrix->NeedsOrdering) { - return spOrderAndFactor( eMatrix, NULL, + return spOrderAndFactor( Matrix, NULL, 0.0, 0.0, DIAG_PIVOTING_AS_DEFAULT ); } - if (!Matrix->Partitioned) spPartition( eMatrix, spDEFAULT_PARTITION ); + if (!Matrix->Partitioned) spPartition( Matrix, spDEFAULT_PARTITION ); if (Matrix->Complex) return FactorComplexMatrix( Matrix ); diff --git a/src/maths/sparse/sputils.c b/src/maths/sparse/sputils.c index b615d7882..5e173e376 100644 --- a/src/maths/sparse/sputils.c +++ b/src/maths/sparse/sputils.c @@ -2087,7 +2087,7 @@ spRoundoff(MatrixPtr eMatrix, RealNumber Rho) assert( IS_SPARSE(Matrix) && IS_FACTORED(Matrix) ); /* Compute Barlow's bound if it is not given. */ - if (Rho < 0.0) Rho = spLargestElement( eMatrix ); + if (Rho < 0.0) Rho = spLargestElement( Matrix ); /* Find the maximum number of off-diagonals in L if not previously computed. */ if (Matrix->MaxRowCountInLowerTri < 0) From 19fef8bff4fd272fba00ce604f227f1d515215c9 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 20:00:32 +0200 Subject: [PATCH 040/257] sparse/*.c, simplify, drop the local copy `Matrix' --- src/maths/sparse/spalloc.c | 12 ++++----- src/maths/sparse/spbuild.c | 16 ++++++------ src/maths/sparse/spfactor.c | 12 ++++----- src/maths/sparse/spoutput.c | 16 ++++++------ src/maths/sparse/spsmp.c | 20 +++++++------- src/maths/sparse/spsolve.c | 8 +++--- src/maths/sparse/sputils.c | 52 ++++++++++++++++++------------------- 7 files changed, 68 insertions(+), 68 deletions(-) diff --git a/src/maths/sparse/spalloc.c b/src/maths/sparse/spalloc.c index 1e7713ce8..56b8a31d7 100644 --- a/src/maths/sparse/spalloc.c +++ b/src/maths/sparse/spalloc.c @@ -646,9 +646,9 @@ AllocateBlockOfAllocationList(MatrixPtr Matrix) */ void -spDestroy(MatrixPtr eMatrix) +spDestroy(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + AllocationListPtr ListPtr, NextListPtr; @@ -741,9 +741,9 @@ spError(MatrixPtr eMatrix ) */ void -spWhereSingular(MatrixPtr eMatrix, int *pRow, int *pCol) +spWhereSingular(MatrixPtr Matrix, int *pRow, int *pCol) { - MatrixPtr Matrix = eMatrix; + /* Begin `spWhereSingular'. */ assert( IS_SPARSE( Matrix ) ); @@ -779,9 +779,9 @@ spWhereSingular(MatrixPtr eMatrix, int *pRow, int *pCol) */ int -spGetSize(MatrixPtr eMatrix, int External) +spGetSize(MatrixPtr Matrix, int External) { - MatrixPtr Matrix = eMatrix; + /* Begin `spGetSize'. */ assert( IS_SPARSE( Matrix ) ); diff --git a/src/maths/sparse/spbuild.c b/src/maths/sparse/spbuild.c index c7265153d..26cae49d5 100644 --- a/src/maths/sparse/spbuild.c +++ b/src/maths/sparse/spbuild.c @@ -94,9 +94,9 @@ static void ExpandTranslationArrays( MatrixPtr, int ); */ void -spClear(MatrixPtr eMatrix) +spClear(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; int I; @@ -181,9 +181,9 @@ spClear(MatrixPtr eMatrix) */ RealNumber * -spFindElement(MatrixPtr eMatrix, int Row, int Col) +spFindElement(MatrixPtr Matrix, int Row, int Col) { -MatrixPtr Matrix = eMatrix; + ElementPtr pElement; /* Begin `spFindElement'. */ @@ -264,9 +264,9 @@ ElementPtr pElement; */ RealNumber * -spGetElement(MatrixPtr eMatrix, int Row, int Col) +spGetElement(MatrixPtr Matrix, int Row, int Col) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; /* Begin `spGetElement'. */ @@ -1146,9 +1146,9 @@ spGetInitInfo(RealNumber *pElement) int -spInitialize(MatrixPtr eMatrix, int (*pInit)(RealNumber*, void *InitInfo, int , int Col)) +spInitialize(MatrixPtr Matrix, int (*pInit)(RealNumber*, void *InitInfo, int , int Col)) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; int J, Error, Col; diff --git a/src/maths/sparse/spfactor.c b/src/maths/sparse/spfactor.c index 103392a73..6c13b141d 100644 --- a/src/maths/sparse/spfactor.c +++ b/src/maths/sparse/spfactor.c @@ -189,10 +189,10 @@ static int ZeroPivot( MatrixPtr, int ); */ int -spOrderAndFactor(MatrixPtr eMatrix, RealNumber RHS[], RealNumber RelThreshold, +spOrderAndFactor(MatrixPtr Matrix, RealNumber RHS[], RealNumber RelThreshold, RealNumber AbsThreshold, int DiagPivoting) { - MatrixPtr Matrix = eMatrix; + ElementPtr pPivot; int Step, Size, ReorderingRequired; RealNumber LargestInCol; @@ -321,9 +321,9 @@ Done: * Error is cleared in this function. */ int -spFactor(MatrixPtr eMatrix) +spFactor(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; ElementPtr pColumn; int Step, Size; @@ -569,9 +569,9 @@ FactorComplexMatrix( MatrixPtr Matrix ) * spINDIRECT_PARTITION, or spAUTO_PARTITION. */ void -spPartition(MatrixPtr eMatrix, int Mode) +spPartition(MatrixPtr Matrix, int Mode) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement, pColumn; int Step, Size; int *Nc, *No, *Nm; diff --git a/src/maths/sparse/spoutput.c b/src/maths/sparse/spoutput.c index cc5af829a..1d229aad0 100644 --- a/src/maths/sparse/spoutput.c +++ b/src/maths/sparse/spoutput.c @@ -135,9 +135,9 @@ int Printer_Width = PRINTER_WIDTH; */ void -spPrint(MatrixPtr eMatrix, int PrintReordered, int Data, int Header) +spPrint(MatrixPtr Matrix, int PrintReordered, int Data, int Header) { - MatrixPtr Matrix = eMatrix; + int J = 0; int I, Row, Col, Size, Top; int StartCol = 1, StopCol, Columns, ElementCount = 0; @@ -438,10 +438,10 @@ spPrint(MatrixPtr eMatrix, int PrintReordered, int Data, int Header) */ int -spFileMatrix(MatrixPtr eMatrix, char *File, char *Label, int Reordered, +spFileMatrix(MatrixPtr Matrix, char *File, char *Label, int Reordered, int Data, int Header) { - MatrixPtr Matrix = eMatrix; + int I, Size; ElementPtr pElement; int Row, Col, Err; @@ -597,9 +597,9 @@ spFileMatrix(MatrixPtr eMatrix, char *File, char *Label, int Reordered, */ int -spFileVector(MatrixPtr eMatrix, char *File, RealVector RHS, RealVector iRHS) +spFileVector(MatrixPtr Matrix, char *File, RealVector RHS, RealVector iRHS) { - MatrixPtr Matrix = eMatrix; + int I, Size, Err; FILE *pMatrixFile; @@ -688,9 +688,9 @@ spFileVector(MatrixPtr eMatrix, char *File, RealVector RHS, RealVector iRHS) */ int -spFileStats(MatrixPtr eMatrix, char *File, char *Label) +spFileStats(MatrixPtr Matrix, char *File, char *Label) { - MatrixPtr Matrix = eMatrix; + int Size, I; ElementPtr pElement; int NumberOfElements; diff --git a/src/maths/sparse/spsmp.c b/src/maths/sparse/spsmp.c index 85607b185..1c8879d7e 100644 --- a/src/maths/sparse/spsmp.c +++ b/src/maths/sparse/spsmp.c @@ -420,9 +420,9 @@ SMPcDProd(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent) */ static void -LoadGmin(SMPmatrix *eMatrix, double Gmin) +LoadGmin(SMPmatrix *Matrix, double Gmin) { - MatrixPtr Matrix = eMatrix; + int I; ArrayOfElementPtrs Diag; ElementPtr diag; @@ -453,9 +453,9 @@ LoadGmin(SMPmatrix *eMatrix, double Gmin) */ SMPelement * -SMPfindElt(SMPmatrix *eMatrix, int Row, int Col, int CreateIfMissing) +SMPfindElt(SMPmatrix *Matrix, int Row, int Col, int CreateIfMissing) { - MatrixPtr Matrix = eMatrix; + ElementPtr Element; /* Begin `SMPfindElt'. */ @@ -473,9 +473,9 @@ SMPfindElt(SMPmatrix *eMatrix, int Row, int Col, int CreateIfMissing) * SMPcZeroCol() */ int -SMPcZeroCol(SMPmatrix *eMatrix, int Col) +SMPcZeroCol(SMPmatrix *Matrix, int Col) { - MatrixPtr Matrix = eMatrix; + ElementPtr Element; Col = Matrix->ExtToIntColMap[Col]; @@ -495,9 +495,9 @@ SMPcZeroCol(SMPmatrix *eMatrix, int Col) * SMPcAddCol() */ int -SMPcAddCol(SMPmatrix *eMatrix, int Accum_Col, int Addend_Col) +SMPcAddCol(SMPmatrix *Matrix, int Accum_Col, int Addend_Col) { - MatrixPtr Matrix = eMatrix; + ElementPtr Accum, Addend, *Prev; Accum_Col = Matrix->ExtToIntColMap[Accum_Col]; @@ -527,9 +527,9 @@ SMPcAddCol(SMPmatrix *eMatrix, int Accum_Col, int Addend_Col) * SMPzeroRow() */ int -SMPzeroRow(SMPmatrix *eMatrix, int Row) +SMPzeroRow(SMPmatrix *Matrix, int Row) { - MatrixPtr Matrix = eMatrix; + ElementPtr Element; Row = Matrix->ExtToIntColMap[Row]; diff --git a/src/maths/sparse/spsolve.c b/src/maths/sparse/spsolve.c index ca78f7133..01d37d1d7 100644 --- a/src/maths/sparse/spsolve.c +++ b/src/maths/sparse/spsolve.c @@ -124,10 +124,10 @@ static void SolveComplexTransposedMatrix( MatrixPtr, /*VARARGS3*/ void -spSolve(MatrixPtr eMatrix, RealVector RHS, RealVector Solution, +spSolve(MatrixPtr Matrix, RealVector RHS, RealVector Solution, RealVector iRHS, RealVector iSolution) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; RealVector Intermediate; RealNumber Temp; @@ -400,10 +400,10 @@ SolveComplexMatrix( MatrixPtr Matrix, RealVector RHS, RealVector Solution , Real /*VARARGS3*/ void -spSolveTransposed(MatrixPtr eMatrix, RealVector RHS, RealVector Solution, +spSolveTransposed(MatrixPtr Matrix, RealVector RHS, RealVector Solution, RealVector iRHS, RealVector iSolution) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; RealVector Intermediate; int I, *pExtOrder, Size; diff --git a/src/maths/sparse/sputils.c b/src/maths/sparse/sputils.c index 5e173e376..fda322218 100644 --- a/src/maths/sparse/sputils.c +++ b/src/maths/sparse/sputils.c @@ -174,9 +174,9 @@ static void ComplexTransposedMatrixMultiply( MatrixPtr, RealVector, RealVector, */ void -spMNA_Preorder(MatrixPtr eMatrix) +spMNA_Preorder(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + int J, Size; ElementPtr pTwin1, pTwin2; int Twins, StartAt = 1; @@ -368,9 +368,9 @@ SwapCols( MatrixPtr Matrix, ElementPtr pTwin1, ElementPtr pTwin2 ) */ void -spScale(MatrixPtr eMatrix, RealVector RHS_ScaleFactors, RealVector SolutionScaleFactors) +spScale(MatrixPtr Matrix, RealVector RHS_ScaleFactors, RealVector SolutionScaleFactors) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; int I, lSize, *pExtOrder; RealNumber ScaleFactor; @@ -571,14 +571,14 @@ MatrixPtr Matrix; */ void -spMultiply(MatrixPtr eMatrix, RealVector RHS, RealVector Solution, +spMultiply(MatrixPtr Matrix, RealVector RHS, RealVector Solution, RealVector iRHS, RealVector iSolution) { ElementPtr pElement; RealVector Vector; RealNumber Sum; int I, *pExtOrder; - MatrixPtr Matrix = eMatrix; + /* Begin `spMultiply'. */ assert( IS_SPARSE( Matrix ) && !Matrix->Factored ); @@ -717,14 +717,14 @@ ComplexMatrixMultiply( MatrixPtr Matrix, RealVector RHS, RealVector Solution , R */ void -spMultTransposed(MatrixPtr eMatrix, RealVector RHS, RealVector Solution, +spMultTransposed(MatrixPtr Matrix, RealVector RHS, RealVector Solution, RealVector iRHS, RealVector iSolution) { ElementPtr pElement; RealVector Vector; RealNumber Sum; int I, *pExtOrder; - MatrixPtr Matrix = eMatrix; + /* Begin `spMultTransposed'. */ assert( IS_SPARSE( Matrix ) && !Matrix->Factored ); @@ -878,10 +878,10 @@ ComplexTransposedMatrixMultiply( MatrixPtr Matrix, RealVector RHS, RealVector So */ void -spDeterminant(MatrixPtr eMatrix, int *pExponent, RealNumber *pDeterminant, +spDeterminant(MatrixPtr Matrix, int *pExponent, RealNumber *pDeterminant, RealNumber *piDeterminant) { - MatrixPtr Matrix = eMatrix; + int I, Size; RealNumber Norm, nr, ni; ComplexNumber Pivot, cDeterminant; @@ -1037,9 +1037,9 @@ spDeterminant(MatrixPtr eMatrix, int *pExponent, RealNumber *pDeterminant, */ void -spStripFills(MatrixPtr eMatrix) +spStripFills(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + struct FillinListNodeStruct *pListNode; /* Begin `spStripFills'. */ @@ -1109,9 +1109,9 @@ spStripFills(MatrixPtr eMatrix) * frame. This assumes that the matrix will be replaced with one of * the same size. */ void -spStripMatrix(MatrixPtr eMatrix) +spStripMatrix(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + /* Begin `spStripMatrix'. */ assert( IS_SPARSE( Matrix ) ); @@ -1197,9 +1197,9 @@ spStripMatrix(MatrixPtr eMatrix) */ void -spDeleteRowAndCol(MatrixPtr eMatrix, int Row, int Col) +spDeleteRowAndCol(MatrixPtr Matrix, int Row, int Col) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement, *ppElement, pLastElement; int Size, ExtRow, ExtCol; ElementPtr spcFindElementInCol(); @@ -1310,9 +1310,9 @@ spDeleteRowAndCol(MatrixPtr eMatrix, int Row, int Col) * Pointer to the matrix. */ RealNumber -spPseudoCondition(MatrixPtr eMatrix) +spPseudoCondition(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + int I; ArrayOfElementPtrs Diag; RealNumber MaxPivot, MinPivot, Mag; @@ -1401,9 +1401,9 @@ spPseudoCondition(MatrixPtr eMatrix) * spNO_MEMORY */ RealNumber -spCondition(MatrixPtr eMatrix, RealNumber NormOfMatrix, int *pError) +spCondition(MatrixPtr Matrix, RealNumber NormOfMatrix, int *pError) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; RealVector T, Tm; int I, K, Row; @@ -1829,9 +1829,9 @@ int *pError; */ RealNumber -spNorm(MatrixPtr eMatrix) +spNorm(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; int I; RealNumber Max = 0.0, AbsRowSum; @@ -1947,9 +1947,9 @@ spNorm(MatrixPtr eMatrix) */ RealNumber -spLargestElement(MatrixPtr eMatrix) +spLargestElement(MatrixPtr Matrix) { - MatrixPtr Matrix = eMatrix; + int I; RealNumber Mag, AbsColSum, Max = 0.0, MaxRow = 0.0, MaxCol = 0.0; RealNumber Pivot; @@ -2076,9 +2076,9 @@ spLargestElement(MatrixPtr eMatrix) */ RealNumber -spRoundoff(MatrixPtr eMatrix, RealNumber Rho) +spRoundoff(MatrixPtr Matrix, RealNumber Rho) { - MatrixPtr Matrix = eMatrix; + ElementPtr pElement; int Count, I, MaxCount = 0; RealNumber Reid, Gear; From 7794c7a53c36c2b5a93af435919414c6972aaa6c Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 20:04:23 +0200 Subject: [PATCH 041/257] sparse/*.c, rename `eMatrix' --> `Matrix' --- src/maths/sparse/spalloc.c | 38 +++++++++++++++++++------------------- src/maths/sparse/sputils.c | 12 ++++++------ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/maths/sparse/spalloc.c b/src/maths/sparse/spalloc.c index 56b8a31d7..0c2f846da 100644 --- a/src/maths/sparse/spalloc.c +++ b/src/maths/sparse/spalloc.c @@ -704,13 +704,13 @@ spDestroy(MatrixPtr Matrix) * eMatrix (void *) * The matrix for which the error status is desired. */ int -spError(MatrixPtr eMatrix ) +spError(MatrixPtr Matrix ) { /* Begin `spError'. */ - if (eMatrix != NULL) { - assert(eMatrix->ID == SPARSE_ID); - return eMatrix->Error; + if (Matrix != NULL) { + assert(Matrix->ID == SPARSE_ID); + return Matrix->Error; } else { /* This error may actually be spPANIC, no way to tell. */ return spNO_MEMORY; @@ -814,23 +814,23 @@ spGetSize(MatrixPtr Matrix, int External) */ void -spSetReal(MatrixPtr eMatrix) +spSetReal(MatrixPtr Matrix) { /* Begin `spSetReal'. */ - assert( IS_SPARSE( eMatrix )); - eMatrix->Complex = NO; + assert( IS_SPARSE( Matrix )); + Matrix->Complex = NO; return; } void -spSetComplex(MatrixPtr eMatrix) +spSetComplex(MatrixPtr Matrix) { /* Begin `spSetComplex'. */ - assert( IS_SPARSE( eMatrix )); - eMatrix->Complex = YES; + assert( IS_SPARSE( Matrix )); + Matrix->Complex = YES; return; } @@ -855,29 +855,29 @@ spSetComplex(MatrixPtr eMatrix) */ int -spFillinCount(MatrixPtr eMatrix) +spFillinCount(MatrixPtr Matrix) { /* Begin `spFillinCount'. */ - assert( IS_SPARSE( eMatrix ) ); - return eMatrix->Fillins; + assert( IS_SPARSE( Matrix ) ); + return Matrix->Fillins; } int -spElementCount(MatrixPtr eMatrix) +spElementCount(MatrixPtr Matrix) { /* Begin `spElementCount'. */ - assert( IS_SPARSE( eMatrix ) ); - return eMatrix->Elements; + assert( IS_SPARSE( Matrix ) ); + return Matrix->Elements; } int -spOriginalCount(MatrixPtr eMatrix) +spOriginalCount(MatrixPtr Matrix) { /* Begin `spOriginalCount'. */ - assert( IS_SPARSE( eMatrix ) ); - return eMatrix->Originals; + assert( IS_SPARSE( Matrix ) ); + return Matrix->Originals; } diff --git a/src/maths/sparse/sputils.c b/src/maths/sparse/sputils.c index fda322218..4fe5311f8 100644 --- a/src/maths/sparse/sputils.c +++ b/src/maths/sparse/sputils.c @@ -2143,17 +2143,17 @@ spRoundoff(MatrixPtr Matrix, RealNumber Rho) */ void -spErrorMessage(MatrixPtr eMatrix, FILE *Stream, char *Originator) +spErrorMessage(MatrixPtr Matrix, FILE *Stream, char *Originator) { int Row, Col, Error; /* Begin `spErrorMessage'. */ - if (eMatrix == NULL) + if (Matrix == NULL) Error = spNO_MEMORY; else { - assert(eMatrix->ID == SPARSE_ID); - Error = eMatrix->Error; + assert(Matrix->ID == SPARSE_ID); + Error = Matrix->Error; } if (Error == spOKAY) return; @@ -2172,13 +2172,13 @@ spErrorMessage(MatrixPtr eMatrix, FILE *Stream, char *Originator) fprintf( Stream, "insufficient memory available.\n"); else if (Error == spSINGULAR) { - spWhereSingular( eMatrix, &Row, &Col ); + spWhereSingular( Matrix, &Row, &Col ); fprintf( Stream, "singular matrix detected at row %d and column %d.\n", Row, Col); } else if (Error == spZERO_DIAG) { - spWhereSingular( eMatrix, &Row, &Col ); + spWhereSingular( Matrix, &Row, &Col ); fprintf( Stream, "zero diagonal detected at row %d and column %d.\n", Row, Col); } From 218ad514212ec2ce8d4656a188c625d2903f492c Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 13:54:47 +0200 Subject: [PATCH 042/257] sparse/*.c, rename `eMatrix' --> `Matrix' (prototypes) --- src/include/ngspice/smpdefs.h | 6 +++--- src/include/ngspice/spmatrix.h | 2 +- src/maths/sparse/spsmp.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/include/ngspice/smpdefs.h b/src/include/ngspice/smpdefs.h index b49e4fff6..51aa1f31e 100644 --- a/src/include/ngspice/smpdefs.h +++ b/src/include/ngspice/smpdefs.h @@ -36,8 +36,8 @@ void SMPgetError( SMPmatrix *, int *, int *); int SMPcProdDiag( SMPmatrix *, SPcomplex *, int *); int SMPcDProd(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent); SMPelement * SMPfindElt( SMPmatrix *, int , int , int ); -int SMPcZeroCol(SMPmatrix *eMatrix, int Col); -int SMPcAddCol(SMPmatrix *eMatrix, int Accum_Col, int Addend_Col); -int SMPzeroRow(SMPmatrix *eMatrix, int Row); +int SMPcZeroCol(SMPmatrix *Matrix, int Col); +int SMPcAddCol(SMPmatrix *Matrix, int Accum_Col, int Addend_Col); +int SMPzeroRow(SMPmatrix *Matrix, int Row); #endif diff --git a/src/include/ngspice/spmatrix.h b/src/include/ngspice/spmatrix.h index 4900a22e0..33780a56e 100644 --- a/src/include/ngspice/spmatrix.h +++ b/src/include/ngspice/spmatrix.h @@ -261,7 +261,7 @@ extern int spFileMatrix( MatrixPtr, char *, char *, int, int, int ); extern int spFileStats( MatrixPtr, char *, char * ); extern int spFillinCount( MatrixPtr ); extern int spGetAdmittance( MatrixPtr, int, int, struct spTemplate* ); -extern spREAL *spFindElement(MatrixPtr eMatrix, int Row, int Col ); +extern spREAL *spFindElement(MatrixPtr Matrix, int Row, int Col ); extern spREAL *spGetElement(MatrixPtr, int, int ); extern void *spGetInitInfo( spREAL* ); extern int spGetOnes( MatrixPtr, int, int, int, struct spTemplate* ); diff --git a/src/maths/sparse/spsmp.c b/src/maths/sparse/spsmp.c index 1c8879d7e..58983ee3d 100644 --- a/src/maths/sparse/spsmp.c +++ b/src/maths/sparse/spsmp.c @@ -106,7 +106,7 @@ extern double scalbn(double, int); extern double logb(double); #endif -static void LoadGmin(SMPmatrix *eMatrix, double Gmin); +static void LoadGmin(SMPmatrix *Matrix, double Gmin); /* From db799c4b85180d1d21c7a4c9602aeb61c3fab286 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 14:05:37 +0200 Subject: [PATCH 043/257] sparse/*.c, rename `eMatrix' --> `Matrix' (comments) --- src/maths/sparse/spalloc.c | 10 +++++----- src/maths/sparse/sputils.c | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/maths/sparse/spalloc.c b/src/maths/sparse/spalloc.c index 0c2f846da..62e249dae 100644 --- a/src/maths/sparse/spalloc.c +++ b/src/maths/sparse/spalloc.c @@ -701,7 +701,7 @@ spDestroy(MatrixPtr Matrix) * The error status of the given matrix. * * >>> Arguments: - * eMatrix (void *) + * Matrix (void *) * The matrix for which the error status is desired. */ int spError(MatrixPtr Matrix ) @@ -732,7 +732,7 @@ spError(MatrixPtr Matrix ) * detected as singular or where a zero was detected on the diagonal. * * >>> Arguments: - * eMatrix (void *) + * Matrix (void *) * The matrix for which the error status is desired. * pRow (int *) * The row number. @@ -769,7 +769,7 @@ spWhereSingular(MatrixPtr Matrix, int *pRow, int *pCol) * the matrix is returned. * * >>> Arguments: - * eMatrix (void *) + * Matrix (void *) * Pointer to matrix. * External (int) * If External is set TRUE, the external size , i.e., the value of the @@ -809,7 +809,7 @@ spGetSize(MatrixPtr Matrix, int External) * Forces matrix to be either real or complex. * * >>> Arguments: - * eMatrix (void *) + * Matrix (void *) * Pointer to matrix. */ @@ -850,7 +850,7 @@ spSetComplex(MatrixPtr Matrix) * of original elements can be returned. * * >>> Arguments: - * eMatrix (void *) + * Matrix (void *) * Pointer to matrix. */ diff --git a/src/maths/sparse/sputils.c b/src/maths/sparse/sputils.c index 4fe5311f8..d9942ef7c 100644 --- a/src/maths/sparse/sputils.c +++ b/src/maths/sparse/sputils.c @@ -151,7 +151,7 @@ static void ComplexTransposedMatrixMultiply( MatrixPtr, RealVector, RealVector, * Tom Quarles. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix to be preordered. * * >>> Local variables; @@ -346,7 +346,7 @@ SwapCols( MatrixPtr Matrix, ElementPtr pTwin1, ElementPtr pTwin2 ) * should not be executed before the function spMNA_Preorder. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix to be scaled. * SolutionScaleFactors (RealVector) * The array of Solution scale factors. These factors scale the columns. @@ -556,7 +556,7 @@ MatrixPtr Matrix; * before spMNA_Preorder(). * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix. * RHS (RealVector) * RHS is the right hand side. This is what is being solved for. @@ -702,7 +702,7 @@ ComplexMatrixMultiply( MatrixPtr Matrix, RealVector RHS, RealVector Solution , R * before spMNA_Preorder(). * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix. * RHS (RealVector) * RHS is the right hand side. This is what is being solved for. @@ -854,7 +854,7 @@ ComplexTransposedMatrixMultiply( MatrixPtr Matrix, RealVector RHS, RealVector So * reasonable value and the logarithm of the scale factor is returned. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * A pointer to the matrix for which the determinant is desired. * pExponent (int *) * The logarithm base 10 of the scale factor for the determinant. To find @@ -1171,7 +1171,7 @@ spStripMatrix(MatrixPtr Matrix) * doesn't exist. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix in which the row and column are to be deleted. * Row (int) * Row to be deleted. @@ -1306,7 +1306,7 @@ spDeleteRowAndCol(MatrixPtr Matrix, int Row, int Col) * previous factorization. If the matrix was singular, zero is returned. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix. */ RealNumber @@ -1388,7 +1388,7 @@ spPseudoCondition(MatrixPtr Matrix) * zero is returned. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix. * NormOfMatrix (RealNumber) * The L-infinity norm of the unfactored matrix as computed by @@ -1824,7 +1824,7 @@ int *pError; * The largest absolute row sum of matrix. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix. */ @@ -1942,7 +1942,7 @@ spNorm(MatrixPtr Matrix) * largest element in any of the reduced submatrices is returned. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix. */ @@ -2066,7 +2066,7 @@ spLargestElement(MatrixPtr Matrix) * Returns a bound on the magnitude of the largest element in E = A - LU. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Pointer to the matrix. * Rho (RealNumber) * The bound on the magnitude of the largest element in any of the @@ -2133,7 +2133,7 @@ spRoundoff(MatrixPtr Matrix, RealNumber Rho) * error state of sparse. No message is produced if there is no error. * * >>> Arguments: - * eMatrix (char *) + * Matrix (char *) * Matrix for which the error message is to be printed. * Stream (FILE *) * Stream to which the error message is to be printed. From b7ce5adfbfe7173aea38466a32940206af9fbe7b Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 28 Apr 2013 20:05:35 +0200 Subject: [PATCH 044/257] sparse/*.c, whitespace --- src/maths/sparse/spalloc.c | 5 ----- src/maths/sparse/spbuild.c | 4 ---- src/maths/sparse/spfactor.c | 3 --- src/maths/sparse/spoutput.c | 4 ---- src/maths/sparse/spsmp.c | 5 ----- src/maths/sparse/spsolve.c | 2 -- src/maths/sparse/sputils.c | 16 ---------------- 7 files changed, 39 deletions(-) diff --git a/src/maths/sparse/spalloc.c b/src/maths/sparse/spalloc.c index 62e249dae..b70031cbd 100644 --- a/src/maths/sparse/spalloc.c +++ b/src/maths/sparse/spalloc.c @@ -648,7 +648,6 @@ AllocateBlockOfAllocationList(MatrixPtr Matrix) void spDestroy(MatrixPtr Matrix) { - AllocationListPtr ListPtr, NextListPtr; @@ -743,8 +742,6 @@ spError(MatrixPtr Matrix ) void spWhereSingular(MatrixPtr Matrix, int *pRow, int *pCol) { - - /* Begin `spWhereSingular'. */ assert( IS_SPARSE( Matrix ) ); @@ -781,8 +778,6 @@ spWhereSingular(MatrixPtr Matrix, int *pRow, int *pCol) int spGetSize(MatrixPtr Matrix, int External) { - - /* Begin `spGetSize'. */ assert( IS_SPARSE( Matrix ) ); diff --git a/src/maths/sparse/spbuild.c b/src/maths/sparse/spbuild.c index 26cae49d5..0536bf624 100644 --- a/src/maths/sparse/spbuild.c +++ b/src/maths/sparse/spbuild.c @@ -96,7 +96,6 @@ static void ExpandTranslationArrays( MatrixPtr, int ); void spClear(MatrixPtr Matrix) { - ElementPtr pElement; int I; @@ -183,7 +182,6 @@ spClear(MatrixPtr Matrix) RealNumber * spFindElement(MatrixPtr Matrix, int Row, int Col) { - ElementPtr pElement; /* Begin `spFindElement'. */ @@ -266,7 +264,6 @@ ElementPtr pElement; RealNumber * spGetElement(MatrixPtr Matrix, int Row, int Col) { - ElementPtr pElement; /* Begin `spGetElement'. */ @@ -1148,7 +1145,6 @@ spGetInitInfo(RealNumber *pElement) int spInitialize(MatrixPtr Matrix, int (*pInit)(RealNumber*, void *InitInfo, int , int Col)) { - ElementPtr pElement; int J, Error, Col; diff --git a/src/maths/sparse/spfactor.c b/src/maths/sparse/spfactor.c index 6c13b141d..bd72a9788 100644 --- a/src/maths/sparse/spfactor.c +++ b/src/maths/sparse/spfactor.c @@ -192,7 +192,6 @@ int spOrderAndFactor(MatrixPtr Matrix, RealNumber RHS[], RealNumber RelThreshold, RealNumber AbsThreshold, int DiagPivoting) { - ElementPtr pPivot; int Step, Size, ReorderingRequired; RealNumber LargestInCol; @@ -323,7 +322,6 @@ Done: int spFactor(MatrixPtr Matrix) { - ElementPtr pElement; ElementPtr pColumn; int Step, Size; @@ -571,7 +569,6 @@ FactorComplexMatrix( MatrixPtr Matrix ) void spPartition(MatrixPtr Matrix, int Mode) { - ElementPtr pElement, pColumn; int Step, Size; int *Nc, *No, *Nm; diff --git a/src/maths/sparse/spoutput.c b/src/maths/sparse/spoutput.c index 1d229aad0..dc0832395 100644 --- a/src/maths/sparse/spoutput.c +++ b/src/maths/sparse/spoutput.c @@ -137,7 +137,6 @@ int Printer_Width = PRINTER_WIDTH; void spPrint(MatrixPtr Matrix, int PrintReordered, int Data, int Header) { - int J = 0; int I, Row, Col, Size, Top; int StartCol = 1, StopCol, Columns, ElementCount = 0; @@ -441,7 +440,6 @@ int spFileMatrix(MatrixPtr Matrix, char *File, char *Label, int Reordered, int Data, int Header) { - int I, Size; ElementPtr pElement; int Row, Col, Err; @@ -599,7 +597,6 @@ spFileMatrix(MatrixPtr Matrix, char *File, char *Label, int Reordered, int spFileVector(MatrixPtr Matrix, char *File, RealVector RHS, RealVector iRHS) { - int I, Size, Err; FILE *pMatrixFile; @@ -690,7 +687,6 @@ spFileVector(MatrixPtr Matrix, char *File, RealVector RHS, RealVector iRHS) int spFileStats(MatrixPtr Matrix, char *File, char *Label) { - int Size, I; ElementPtr pElement; int NumberOfElements; diff --git a/src/maths/sparse/spsmp.c b/src/maths/sparse/spsmp.c index 58983ee3d..748b73b80 100644 --- a/src/maths/sparse/spsmp.c +++ b/src/maths/sparse/spsmp.c @@ -422,7 +422,6 @@ SMPcDProd(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent) static void LoadGmin(SMPmatrix *Matrix, double Gmin) { - int I; ArrayOfElementPtrs Diag; ElementPtr diag; @@ -455,7 +454,6 @@ LoadGmin(SMPmatrix *Matrix, double Gmin) SMPelement * SMPfindElt(SMPmatrix *Matrix, int Row, int Col, int CreateIfMissing) { - ElementPtr Element; /* Begin `SMPfindElt'. */ @@ -475,7 +473,6 @@ SMPfindElt(SMPmatrix *Matrix, int Row, int Col, int CreateIfMissing) int SMPcZeroCol(SMPmatrix *Matrix, int Col) { - ElementPtr Element; Col = Matrix->ExtToIntColMap[Col]; @@ -497,7 +494,6 @@ SMPcZeroCol(SMPmatrix *Matrix, int Col) int SMPcAddCol(SMPmatrix *Matrix, int Accum_Col, int Addend_Col) { - ElementPtr Accum, Addend, *Prev; Accum_Col = Matrix->ExtToIntColMap[Accum_Col]; @@ -529,7 +525,6 @@ SMPcAddCol(SMPmatrix *Matrix, int Accum_Col, int Addend_Col) int SMPzeroRow(SMPmatrix *Matrix, int Row) { - ElementPtr Element; Row = Matrix->ExtToIntColMap[Row]; diff --git a/src/maths/sparse/spsolve.c b/src/maths/sparse/spsolve.c index 01d37d1d7..e24ebd09d 100644 --- a/src/maths/sparse/spsolve.c +++ b/src/maths/sparse/spsolve.c @@ -127,7 +127,6 @@ void spSolve(MatrixPtr Matrix, RealVector RHS, RealVector Solution, RealVector iRHS, RealVector iSolution) { - ElementPtr pElement; RealVector Intermediate; RealNumber Temp; @@ -403,7 +402,6 @@ void spSolveTransposed(MatrixPtr Matrix, RealVector RHS, RealVector Solution, RealVector iRHS, RealVector iSolution) { - ElementPtr pElement; RealVector Intermediate; int I, *pExtOrder, Size; diff --git a/src/maths/sparse/sputils.c b/src/maths/sparse/sputils.c index d9942ef7c..32e7e9f5b 100644 --- a/src/maths/sparse/sputils.c +++ b/src/maths/sparse/sputils.c @@ -176,7 +176,6 @@ static void ComplexTransposedMatrixMultiply( MatrixPtr, RealVector, RealVector, void spMNA_Preorder(MatrixPtr Matrix) { - int J, Size; ElementPtr pTwin1, pTwin2; int Twins, StartAt = 1; @@ -370,7 +369,6 @@ SwapCols( MatrixPtr Matrix, ElementPtr pTwin1, ElementPtr pTwin2 ) void spScale(MatrixPtr Matrix, RealVector RHS_ScaleFactors, RealVector SolutionScaleFactors) { - ElementPtr pElement; int I, lSize, *pExtOrder; RealNumber ScaleFactor; @@ -579,7 +577,6 @@ spMultiply(MatrixPtr Matrix, RealVector RHS, RealVector Solution, RealNumber Sum; int I, *pExtOrder; - /* Begin `spMultiply'. */ assert( IS_SPARSE( Matrix ) && !Matrix->Factored ); if (!Matrix->RowsLinked) @@ -725,7 +722,6 @@ spMultTransposed(MatrixPtr Matrix, RealVector RHS, RealVector Solution, RealNumber Sum; int I, *pExtOrder; - /* Begin `spMultTransposed'. */ assert( IS_SPARSE( Matrix ) && !Matrix->Factored ); if (!Matrix->InternalVectorsAllocated) @@ -881,7 +877,6 @@ void spDeterminant(MatrixPtr Matrix, int *pExponent, RealNumber *pDeterminant, RealNumber *piDeterminant) { - int I, Size; RealNumber Norm, nr, ni; ComplexNumber Pivot, cDeterminant; @@ -1039,7 +1034,6 @@ spDeterminant(MatrixPtr Matrix, int *pExponent, RealNumber *pDeterminant, void spStripFills(MatrixPtr Matrix) { - struct FillinListNodeStruct *pListNode; /* Begin `spStripFills'. */ @@ -1111,8 +1105,6 @@ spStripFills(MatrixPtr Matrix) void spStripMatrix(MatrixPtr Matrix) { - - /* Begin `spStripMatrix'. */ assert( IS_SPARSE( Matrix ) ); if (Matrix->Elements == 0) return; @@ -1124,7 +1116,6 @@ spStripMatrix(MatrixPtr Matrix) /* Reset the element lists. */ { - struct ElementListNodeStruct *pListNode; pListNode = Matrix->LastElementListNode = Matrix->FirstElementListNode; @@ -1134,7 +1125,6 @@ spStripMatrix(MatrixPtr Matrix) /* Reset the fill-in lists. */ { - struct FillinListNodeStruct *pListNode; pListNode = Matrix->LastFillinListNode = Matrix->FirstFillinListNode; @@ -1199,7 +1189,6 @@ spStripMatrix(MatrixPtr Matrix) void spDeleteRowAndCol(MatrixPtr Matrix, int Row, int Col) { - ElementPtr pElement, *ppElement, pLastElement; int Size, ExtRow, ExtCol; ElementPtr spcFindElementInCol(); @@ -1312,7 +1301,6 @@ spDeleteRowAndCol(MatrixPtr Matrix, int Row, int Col) RealNumber spPseudoCondition(MatrixPtr Matrix) { - int I; ArrayOfElementPtrs Diag; RealNumber MaxPivot, MinPivot, Mag; @@ -1403,7 +1391,6 @@ spPseudoCondition(MatrixPtr Matrix) RealNumber spCondition(MatrixPtr Matrix, RealNumber NormOfMatrix, int *pError) { - ElementPtr pElement; RealVector T, Tm; int I, K, Row; @@ -1831,7 +1818,6 @@ int *pError; RealNumber spNorm(MatrixPtr Matrix) { - ElementPtr pElement; int I; RealNumber Max = 0.0, AbsRowSum; @@ -1949,7 +1935,6 @@ spNorm(MatrixPtr Matrix) RealNumber spLargestElement(MatrixPtr Matrix) { - int I; RealNumber Mag, AbsColSum, Max = 0.0, MaxRow = 0.0, MaxCol = 0.0; RealNumber Pivot; @@ -2078,7 +2063,6 @@ spLargestElement(MatrixPtr Matrix) RealNumber spRoundoff(MatrixPtr Matrix, RealNumber Rho) { - ElementPtr pElement; int Count, I, MaxCount = 0; RealNumber Reid, Gear; From 5495f7c293c5a69fe92b507e1da119d77e766dbb Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 1 May 2013 23:33:22 +0200 Subject: [PATCH 045/257] only whitespaces --- src/spicelib/devices/res/restemp.c | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/spicelib/devices/res/restemp.c b/src/spicelib/devices/res/restemp.c index df227a7d7..0a729e0fe 100644 --- a/src/spicelib/devices/res/restemp.c +++ b/src/spicelib/devices/res/restemp.c @@ -36,8 +36,8 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) if(!model->REStc2Given) model->REStempCoeff2 = 0.0; if(!model->RESnarrowGiven) model->RESnarrow = 0.0; if(!model->RESshortGiven) model->RESshort = 0.0; - if(!model->RESfNcoefGiven) model->RESfNcoef = 0.0; - if(!model->RESfNexpGiven) model->RESfNexp = 1.0; + if(!model->RESfNcoefGiven) model->RESfNcoef = 0.0; + if(!model->RESfNexpGiven) model->RESfNexp = 1.0; /* loop through all the instances of the model */ for (here = model->RESinstances; here != NULL ; @@ -45,19 +45,19 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) /* Default Value Processing for Resistor Instance */ - if(!here->REStempGiven) { - here->REStemp = ckt->CKTtemp; - if(!here->RESdtempGiven) here->RESdtemp = 0.0; - } else { /* REStempGiven */ - here->RESdtemp = 0.0; - if (here->RESdtempGiven) - printf("%s: Instance temperature specified, dtemp ignored\n", here->RESname); - } - - if(!here->RESwidthGiven) here->RESwidth = model->RESdefWidth; + if(!here->REStempGiven) { + here->REStemp = ckt->CKTtemp; + if(!here->RESdtempGiven) here->RESdtemp = 0.0; + } else { /* REStempGiven */ + here->RESdtemp = 0.0; + if (here->RESdtempGiven) + printf("%s: Instance temperature specified, dtemp ignored\n", here->RESname); + } + + if(!here->RESwidthGiven) here->RESwidth = model->RESdefWidth; if(!here->RESlengthGiven) here->RESlength = 0.0; - if(!here->RESscaleGiven) here->RESscale = 1.0; - if(!here->RESmGiven) here->RESm = 1.0; + if(!here->RESscaleGiven) here->RESscale = 1.0; + if(!here->RESmGiven) here->RESm = 1.0; if(!here->RESnoisyGiven) here->RESnoisy = 1; if(!here->RESresGiven) { if(model->RESsheetResGiven && (model->RESsheetRes != 0) && @@ -73,19 +73,19 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) difference = (here->REStemp + here->RESdtemp) - model->REStnom; - factor = 1.0 + (model->REStempCoeff1)*difference + + factor = 1.0 + (model->REStempCoeff1)*difference + (model->REStempCoeff2)*difference*difference; here -> RESconduct = (1.0/(here->RESresist * factor * here->RESscale)); - - - /* Paolo Nenzi: AC value */ - if(here->RESacresGiven) - here->RESacConduct = (1.0/(here->RESacResist * factor * here->RESscale)); - else { - here -> RESacConduct = here -> RESconduct; - here -> RESacResist = here -> RESresist; - } + + + /* Paolo Nenzi: AC value */ + if(here->RESacresGiven) + here->RESacConduct = (1.0/(here->RESacResist * factor * here->RESscale)); + else { + here -> RESacConduct = here -> RESconduct; + here -> RESacResist = here -> RESresist; + } } } return(OK); From 602171979897475016af0e5f43ca81b45ce0557a Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 1 May 2013 23:35:12 +0200 Subject: [PATCH 046/257] add some parameter aliases to be compatible --- src/spicelib/devices/cap/cap.c | 4 ++++ src/spicelib/devices/res/res.c | 3 +++ src/spicelib/devices/res/resdefs.h | 15 +++++++++------ src/spicelib/devices/res/resmask.c | 3 +++ src/spicelib/devices/res/resmpar.c | 4 ++++ src/spicelib/devices/res/restemp.c | 5 +++-- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/spicelib/devices/cap/cap.c b/src/spicelib/devices/cap/cap.c index 2da2e549c..88841cae4 100644 --- a/src/spicelib/devices/cap/cap.c +++ b/src/spicelib/devices/cap/cap.c @@ -36,9 +36,13 @@ IFparm CAPpTable[] = { /* parameters */ IFparm CAPmPTable[] = { /* names of model parameters */ IOPA( "cap", CAP_MOD_CAP, IF_REAL, "Model capacitance"), IOPA( "cj", CAP_MOD_CJ, IF_REAL, "Bottom Capacitance per area"), + IOPR( "cox", CAP_MOD_CJ, IF_REAL, "Bottom Capacitance per area"), IOPA( "cjsw", CAP_MOD_CJSW, IF_REAL, "Sidewall capacitance per meter"), + IOPR( "capsw", CAP_MOD_CJSW, IF_REAL, "Sidewall capacitance per meter"), IOPX( "defw", CAP_MOD_DEFWIDTH, IF_REAL, "Default width"), + IOPR( "w", CAP_MOD_DEFWIDTH, IF_REAL, "Default width"), IOPX( "defl", CAP_MOD_DEFLENGTH,IF_REAL, "Default length"), + IOPR( "l", CAP_MOD_DEFLENGTH,IF_REAL, "Default length"), IOPA( "narrow", CAP_MOD_NARROW, IF_REAL, "width correction factor"), IOPA( "short", CAP_MOD_SHORT, IF_REAL, "length correction factor"), IOPA( "tc1", CAP_MOD_TC1, IF_REAL, "First order temp. coefficient"), diff --git a/src/spicelib/devices/res/res.c b/src/spicelib/devices/res/res.c index 228c8b8f0..f1aa474a6 100644 --- a/src/spicelib/devices/res/res.c +++ b/src/spicelib/devices/res/res.c @@ -45,9 +45,12 @@ IFparm RESmPTable[] = { /* model parameters */ IOPZ( "short", RES_MOD_SHORT, IF_REAL,"Shortening of resistor"), IOPR( "dlr", RES_MOD_SHORT, IF_REAL,"Shortening of resistor"), IOPQ( "tc1", RES_MOD_TC1, IF_REAL,"First order temp. coefficient"), + IOPR( "tc1r", RES_MOD_TC1, IF_REAL,"First order temp. coefficient"), IOPQO( "tc2", RES_MOD_TC2, IF_REAL,"Second order temp. coefficient"), + IOPR( "tc2r", RES_MOD_TC2, IF_REAL,"Second order temp. coefficient"), IOPX( "defw", RES_MOD_DEFWIDTH, IF_REAL,"Default device width"), IOPR( "w", RES_MOD_DEFWIDTH, IF_REAL,"Default device width"), + IOPX( "l", RES_MOD_DEFLENGTH,IF_REAL,"Default device length"), IOPQ( "kf", RES_MOD_KF, IF_REAL,"Flicker noise coefficient"), IOPQ( "af", RES_MOD_AF, IF_REAL,"Flicker noise exponent"), IOPXU( "tnom", RES_MOD_TNOM, IF_REAL,"Parameter measurement temperature"), diff --git a/src/spicelib/devices/res/resdefs.h b/src/spicelib/devices/res/resdefs.h index 18c701e76..eebda4793 100644 --- a/src/spicelib/devices/res/resdefs.h +++ b/src/spicelib/devices/res/resdefs.h @@ -99,6 +99,7 @@ typedef struct sRESmodel { /* model structure for a resistor */ double REStempCoeff2; /* second temperature coefficient of resistors */ double RESsheetRes; /* sheet resistance of devices in ohms/square */ double RESdefWidth; /* default width of a resistor */ + double RESdefLength; /* default length of a resistor */ double RESnarrow; /* amount by which device is narrower than drawn */ double RESshort; /* amount by which device is shorter than drawn */ double RESfNcoef; /* Flicker noise coefficient */ @@ -108,6 +109,7 @@ typedef struct sRESmodel { /* model structure for a resistor */ unsigned REStc2Given :1; /* flag to indicate tc2 was specified */ unsigned RESsheetResGiven :1; /* flag to indicate sheet resistance given*/ unsigned RESdefWidthGiven :1; /* flag to indicate default width given */ + unsigned RESdefLengthGiven :1; /* flag to indicate default length given */ unsigned RESnarrowGiven :1; /* flag to indicate narrow effect given */ unsigned RESshortGiven :1; /* flag to indicate short effect given */ unsigned RESfNcoefGiven :1; /* flag to indicate kf given */ @@ -139,12 +141,13 @@ typedef struct sRESmodel { /* model structure for a resistor */ #define RES_MOD_TC2 102 #define RES_MOD_RSH 103 #define RES_MOD_DEFWIDTH 104 -#define RES_MOD_NARROW 105 -#define RES_MOD_R 106 -#define RES_MOD_TNOM 107 -#define RES_MOD_SHORT 108 -#define RES_MOD_KF 109 -#define RES_MOD_AF 110 +#define RES_MOD_DEFLENGTH 105 +#define RES_MOD_NARROW 106 +#define RES_MOD_R 107 +#define RES_MOD_TNOM 108 +#define RES_MOD_SHORT 109 +#define RES_MOD_KF 110 +#define RES_MOD_AF 111 /* device questions */ #define RES_QUEST_SENS_REAL 201 diff --git a/src/spicelib/devices/res/resmask.c b/src/spicelib/devices/res/resmask.c index 4b541f737..437e0e504 100644 --- a/src/spicelib/devices/res/resmask.c +++ b/src/spicelib/devices/res/resmask.c @@ -39,6 +39,9 @@ RESmodAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) case RES_MOD_DEFWIDTH: value->rValue = model->RESdefWidth; return(OK); + case RES_MOD_DEFLENGTH: + value->rValue = model->RESdefLength; + return(OK); case RES_MOD_NARROW: value->rValue = model->RESnarrow; return(OK); diff --git a/src/spicelib/devices/res/resmpar.c b/src/spicelib/devices/res/resmpar.c index a08efceeb..172d01247 100644 --- a/src/spicelib/devices/res/resmpar.c +++ b/src/spicelib/devices/res/resmpar.c @@ -38,6 +38,10 @@ RESmParam(int param, IFvalue *value, GENmodel *inModel) model->RESdefWidth = value->rValue; model->RESdefWidthGiven = TRUE; break; + case RES_MOD_DEFLENGTH: + model->RESdefLength = value->rValue; + model->RESdefLengthGiven = TRUE; + break; case RES_MOD_NARROW: model->RESnarrow = value->rValue; model->RESnarrowGiven = TRUE; diff --git a/src/spicelib/devices/res/restemp.c b/src/spicelib/devices/res/restemp.c index 0a729e0fe..dc9f47dda 100644 --- a/src/spicelib/devices/res/restemp.c +++ b/src/spicelib/devices/res/restemp.c @@ -31,7 +31,8 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) /* Default Value Processing for Resistor Models */ if(!model->REStnomGiven) model->REStnom = ckt->CKTnomTemp; if(!model->RESsheetResGiven) model->RESsheetRes = 0.0; - if(!model->RESdefWidthGiven) model->RESdefWidth = 10.e-6; /*M*/ + if(!model->RESdefWidthGiven) model->RESdefWidth = 10e-6; /*M*/ + if(!model->RESdefLengthGiven) model->RESdefLength = 10e-6; if(!model->REStc1Given) model->REStempCoeff1 = 0.0; if(!model->REStc2Given) model->REStempCoeff2 = 0.0; if(!model->RESnarrowGiven) model->RESnarrow = 0.0; @@ -55,7 +56,7 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) } if(!here->RESwidthGiven) here->RESwidth = model->RESdefWidth; - if(!here->RESlengthGiven) here->RESlength = 0.0; + if(!here->RESlengthGiven) here->RESlength = model->RESdefLength; if(!here->RESscaleGiven) here->RESscale = 1.0; if(!here->RESmGiven) here->RESm = 1.0; if(!here->RESnoisyGiven) here->RESnoisy = 1; From a23a913db9aa967328b1d4500e765fb9c21f154a Mon Sep 17 00:00:00 2001 From: h_vogt Date: Fri, 3 May 2013 23:11:51 +0200 Subject: [PATCH 047/257] inpcom.c fcn nested ternary hot fix --- src/frontend/inpcom.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index bbae8c97f..768cfcaf3 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -97,6 +97,8 @@ static char *skip_non_ws(char *d) { while (*d && !isspace(*d)) d++; return static char *skip_back_ws(char *d) { while (isspace(*d)) d--; return d; } static char *skip_ws(char *d) { while (isspace(*d)) d++; return d; } +static void tprint(struct line *deck); + #ifndef XSPICE static void inp_poly_err(struct line *deck); #endif @@ -822,8 +824,8 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile inp_fix_macro_param_func_paren_io(working); inp_fix_ternary_operator(working); +//tprint(working); inp_grab_func(working); - inp_expand_macros_in_func(); inp_expand_macros_in_deck(working); inp_fix_param_values(working); @@ -1784,7 +1786,7 @@ inp_fix_ternary_operator_str(char *line, bool all) } else { return line; } - + all = TRUE; // get conditional question = strchr(str_ptr, '?'); str_ptr2 = skip_back_ws(question - 1); @@ -1871,6 +1873,8 @@ inp_fix_ternary_operator_str(char *line, bool all) fprintf(stderr, "ERROR: problem parsing ternary line %s!\n", line); controlled_exit(EXIT_FAILURE); } + if (*str_ptr2 == '\0') + str_ptr2--; else_str = inp_fix_ternary_operator_str(copy_substring(str_ptr, str_ptr2), all); if (*str_ptr2 != '}') end_str = inp_fix_ternary_operator_str(strdup(str_ptr2+1), all); @@ -5736,3 +5740,13 @@ inp_poly_err(struct line *deck) } } #endif +static void +tprint(struct line *deck) +{ + /*debug: print into file*/ + FILE *fd = fopen("tprint-out.txt", "w"); + struct line *t; + for (t = deck; t; t = t->li_next) + fprintf(fd, "%d %d %s\n", t->li_linenum_orig, t->li_linenum, t->li_line); + fclose(fd); +} From 1b8c8e6b7879d3ec7667b1ec2fd004260ab789f2 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 5 May 2013 11:43:26 +0200 Subject: [PATCH 048/257] only whitespaces --- src/spicelib/devices/bsim3/b3.c | 170 +- src/spicelib/devices/bsim3/b3ask.c | 106 +- src/spicelib/devices/bsim3/b3ld.c | 2252 ++++++++++++------------- src/spicelib/devices/bsim3/b3par.c | 10 +- src/spicelib/devices/bsim3/b3set.c | 4 +- src/spicelib/devices/bsim3/b3temp.c | 972 +++++------ src/spicelib/devices/bsim3/bsim3def.h | 656 +++---- 7 files changed, 2084 insertions(+), 2086 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index e5d288a79..a97598eaa 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -26,37 +26,37 @@ IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"), IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"), IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), IOP( "acnqsmod", BSIM3_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM3_GM, IF_REAL, "Gm"), -OP( "gds", BSIM3_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM3_VON, IF_REAL, "Vth"), -OP( "id", BSIM3_CD, IF_REAL, "Ids"), -OP( "vbs", BSIM3_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM3_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM3_VDS, IF_REAL, "Vds"), -OP( "ibd", BSIM3_CBD, IF_REAL, "Ibd"), /* newly added from here */ -OP( "ibs", BSIM3_CBS, IF_REAL, "Ibs"), -OP( "gbd", BSIM3_GBD, IF_REAL, "gbd"), -OP( "gbs", BSIM3_GBS, IF_REAL, "gbs"), -OP( "qb", BSIM3_QB, IF_REAL, "Qbulk"), -OP( "cqb", BSIM3_CQB, IF_REAL, "CQbulk"), -OP( "qg", BSIM3_QG, IF_REAL, "Qgate"), -OP( "cqg", BSIM3_CQG, IF_REAL, "CQgate"), -OP( "qd", BSIM3_QD, IF_REAL, "Qdrain"), -OP( "cqd", BSIM3_CQD, IF_REAL, "CQdrain"), -OP( "cgg", BSIM3_CGG, IF_REAL, "Cggb"), -OP( "cgd", BSIM3_CGD, IF_REAL, "Cgdb"), -OP( "cgs", BSIM3_CGS, IF_REAL, "Cgsb"), -OP( "cdg", BSIM3_CDG, IF_REAL, "Cdgb"), -OP( "cdd", BSIM3_CDD, IF_REAL, "Cddb"), -OP( "cds", BSIM3_CDS, IF_REAL, "Cdsb"), -OP( "cbg", BSIM3_CBG, IF_REAL, "Cbgb"), -OP( "cbd", BSIM3_CBDB, IF_REAL, "Cbdb"), -OP( "cbs", BSIM3_CBSB, IF_REAL, "Cbsb"), -OP( "capbd", BSIM3_CAPBD, IF_REAL, "Capbd"), -OP( "capbs", BSIM3_CAPBS, IF_REAL, "Capbs"), +IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), +OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), +OP( "gm", BSIM3_GM, IF_REAL, "Gm"), +OP( "gds", BSIM3_GDS, IF_REAL, "Gds"), +OP( "vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"), +OP( "vth", BSIM3_VON, IF_REAL, "Vth"), +OP( "id", BSIM3_CD, IF_REAL, "Ids"), +OP( "vbs", BSIM3_VBS, IF_REAL, "Vbs"), +OP( "vgs", BSIM3_VGS, IF_REAL, "Vgs"), +OP( "vds", BSIM3_VDS, IF_REAL, "Vds"), +OP( "ibd", BSIM3_CBD, IF_REAL, "Ibd"), /* newly added from here */ +OP( "ibs", BSIM3_CBS, IF_REAL, "Ibs"), +OP( "gbd", BSIM3_GBD, IF_REAL, "gbd"), +OP( "gbs", BSIM3_GBS, IF_REAL, "gbs"), +OP( "qb", BSIM3_QB, IF_REAL, "Qbulk"), +OP( "cqb", BSIM3_CQB, IF_REAL, "CQbulk"), +OP( "qg", BSIM3_QG, IF_REAL, "Qgate"), +OP( "cqg", BSIM3_CQG, IF_REAL, "CQgate"), +OP( "qd", BSIM3_QD, IF_REAL, "Qdrain"), +OP( "cqd", BSIM3_CQD, IF_REAL, "CQdrain"), +OP( "cgg", BSIM3_CGG, IF_REAL, "Cggb"), +OP( "cgd", BSIM3_CGD, IF_REAL, "Cgdb"), +OP( "cgs", BSIM3_CGS, IF_REAL, "Cgsb"), +OP( "cdg", BSIM3_CDG, IF_REAL, "Cdgb"), +OP( "cdd", BSIM3_CDD, IF_REAL, "Cddb"), +OP( "cds", BSIM3_CDS, IF_REAL, "Cdsb"), +OP( "cbg", BSIM3_CBG, IF_REAL, "Cbgb"), +OP( "cbd", BSIM3_CBDB, IF_REAL, "Cbdb"), +OP( "cbs", BSIM3_CBSB, IF_REAL, "Cbsb"), +OP( "capbd", BSIM3_CAPBD, IF_REAL, "Capbd"), +OP( "capbs", BSIM3_CAPBS, IF_REAL, "Capbs"), }; IFparm BSIM3mPTable[] = { /* model parameters */ @@ -71,15 +71,15 @@ IOP( "tox", BSIM3_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), IOP( "toxm", BSIM3_MOD_TOXM, IF_REAL, "Gate oxide thickness used in extraction"), IOP( "cdsc", BSIM3_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM3_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM3_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), +IOP( "cdscb", BSIM3_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), +IOP( "cdscd", BSIM3_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), IOP( "cit", BSIM3_MOD_CIT, IF_REAL, "Interface state capacitance"), IOP( "nfactor", BSIM3_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), IOP( "xj", BSIM3_MOD_XJ, IF_REAL, "Junction depth in meters"), IOP( "vsat", BSIM3_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), IOP( "at", BSIM3_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM3_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM3_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), +IOP( "a0", BSIM3_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), +IOP( "ags", BSIM3_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), IOP( "a1", BSIM3_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), IOP( "a2", BSIM3_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), IOP( "keta", BSIM3_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), @@ -128,21 +128,21 @@ IOP( "xpart", BSIM3_MOD_XPART, IF_REAL, "Channel charge partitioning"), IOP( "elm", BSIM3_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), IOP( "delta", BSIM3_MOD_DELTA, IF_REAL, "Effective Vds parameter"), IOP( "rsh", BSIM3_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM3_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), +IOP( "rdsw", BSIM3_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "prwg", BSIM3_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM3_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), +IOP( "prwg", BSIM3_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), +IOP( "prwb", BSIM3_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), -IOP( "prt", BSIM3_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), +IOP( "prt", BSIM3_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), IOP( "eta0", BSIM3_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), IOP( "etab", BSIM3_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), IOP( "pclm", BSIM3_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM3_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM3_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM3_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "pscbe1", BSIM3_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM3_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM3_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), +IOP( "pdiblc1", BSIM3_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblc2", BSIM3_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblcb", BSIM3_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), +IOP( "pscbe1", BSIM3_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pscbe2", BSIM3_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pvag", BSIM3_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), IOP( "js", BSIM3_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), IOP( "jsw", BSIM3_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), IOP( "pb", BSIM3_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), @@ -221,8 +221,8 @@ IOP( "lnfactor", BSIM3_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), IOP( "lxj", BSIM3_MOD_LXJ, IF_REAL, "Length dependence of xj"), IOP( "lvsat", BSIM3_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), IOP( "lat", BSIM3_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM3_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM3_MOD_LAGS, IF_REAL, "Length dependence of ags"), +IOP( "la0", BSIM3_MOD_LA0, IF_REAL, "Length dependence of a0"), +IOP( "lags", BSIM3_MOD_LAGS, IF_REAL, "Length dependence of ags"), IOP( "la1", BSIM3_MOD_LA1, IF_REAL, "Length dependence of a1"), IOP( "la2", BSIM3_MOD_LA2, IF_REAL, "Length dependence of a2"), IOP( "lketa", BSIM3_MOD_LKETA, IF_REAL, "Length dependence of keta"), @@ -264,21 +264,21 @@ IOP( "lute", BSIM3_MOD_LUTE, IF_REAL, "Length dependence of ute"), IOP( "lvoff", BSIM3_MOD_LVOFF, IF_REAL, "Length dependence of voff"), IOP( "lelm", BSIM3_MOD_LELM, IF_REAL, "Length dependence of elm"), IOP( "ldelta", BSIM3_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM3_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), +IOP( "lrdsw", BSIM3_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lprwg", BSIM3_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM3_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), +IOP( "lprwg", BSIM3_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), +IOP( "lprwb", BSIM3_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), -IOP( "lprt", BSIM3_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM3_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM3_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM3_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM3_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM3_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM3_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpscbe1", BSIM3_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM3_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM3_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), +IOP( "lprt", BSIM3_MOD_LPRT, IF_REAL, "Length dependence of prt "), +IOP( "leta0", BSIM3_MOD_LETA0, IF_REAL, "Length dependence of eta0"), +IOP( "letab", BSIM3_MOD_LETAB, IF_REAL, "Length dependence of etab"), +IOP( "lpclm", BSIM3_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), +IOP( "lpdiblc1", BSIM3_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), +IOP( "lpdiblc2", BSIM3_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), +IOP( "lpdiblcb", BSIM3_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), +IOP( "lpscbe1", BSIM3_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), +IOP( "lpscbe2", BSIM3_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), +IOP( "lpvag", BSIM3_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), IOP( "lwr", BSIM3_MOD_LWR, IF_REAL, "Length dependence of wr"), IOP( "ldwg", BSIM3_MOD_LDWG, IF_REAL, "Length dependence of dwg"), IOP( "ldwb", BSIM3_MOD_LDWB, IF_REAL, "Length dependence of dwb"), @@ -300,15 +300,15 @@ IOP( "lmoin", BSIM3_MOD_LMOIN, IF_REAL, "Length dependence of moin"), IOP( "lnoff", BSIM3_MOD_LNOFF, IF_REAL, "Length dependence of noff"), IOP( "lvoffcv", BSIM3_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), IOP( "wcdsc", BSIM3_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM3_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM3_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), +IOP( "wcdscb", BSIM3_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), +IOP( "wcdscd", BSIM3_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), IOP( "wcit", BSIM3_MOD_WCIT, IF_REAL, "Width dependence of cit"), IOP( "wnfactor", BSIM3_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), IOP( "wxj", BSIM3_MOD_WXJ, IF_REAL, "Width dependence of xj"), IOP( "wvsat", BSIM3_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), IOP( "wat", BSIM3_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM3_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM3_MOD_WAGS, IF_REAL, "Width dependence of ags"), +IOP( "wa0", BSIM3_MOD_WA0, IF_REAL, "Width dependence of a0"), +IOP( "wags", BSIM3_MOD_WAGS, IF_REAL, "Width dependence of ags"), IOP( "wa1", BSIM3_MOD_WA1, IF_REAL, "Width dependence of a1"), IOP( "wa2", BSIM3_MOD_WA2, IF_REAL, "Width dependence of a2"), IOP( "wketa", BSIM3_MOD_WKETA, IF_REAL, "Width dependence of keta"), @@ -356,15 +356,15 @@ IOP( "wprwg", BSIM3_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), IOP( "wprwb", BSIM3_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), IOP( "wprt", BSIM3_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM3_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM3_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM3_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM3_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM3_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM3_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpscbe1", BSIM3_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM3_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM3_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), +IOP( "weta0", BSIM3_MOD_WETA0, IF_REAL, "Width dependence of eta0"), +IOP( "wetab", BSIM3_MOD_WETAB, IF_REAL, "Width dependence of etab"), +IOP( "wpclm", BSIM3_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), +IOP( "wpdiblc1", BSIM3_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), +IOP( "wpdiblc2", BSIM3_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), +IOP( "wpdiblcb", BSIM3_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), +IOP( "wpscbe1", BSIM3_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), +IOP( "wpscbe2", BSIM3_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), +IOP( "wpvag", BSIM3_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), IOP( "wwr", BSIM3_MOD_WWR, IF_REAL, "Width dependence of wr"), IOP( "wdwg", BSIM3_MOD_WDWG, IF_REAL, "Width dependence of dwg"), IOP( "wdwb", BSIM3_MOD_WDWB, IF_REAL, "Width dependence of dwb"), @@ -387,14 +387,14 @@ IOP( "wnoff", BSIM3_MOD_WNOFF, IF_REAL, "Width dependence of noff"), IOP( "wvoffcv", BSIM3_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), IOP( "pcdsc", BSIM3_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM3_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), +IOP( "pcdscb", BSIM3_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), IOP( "pcdscd", BSIM3_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), IOP( "pcit", BSIM3_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), IOP( "pnfactor", BSIM3_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), IOP( "pxj", BSIM3_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), IOP( "pvsat", BSIM3_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), IOP( "pat", BSIM3_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM3_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), +IOP( "pa0", BSIM3_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), IOP( "pags", BSIM3_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), IOP( "pa1", BSIM3_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), IOP( "pa2", BSIM3_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), @@ -437,10 +437,10 @@ IOP( "pute", BSIM3_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), IOP( "pvoff", BSIM3_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), IOP( "pelm", BSIM3_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), IOP( "pdelta", BSIM3_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM3_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), +IOP( "prdsw", BSIM3_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "pprwg", BSIM3_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM3_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), +IOP( "pprwg", BSIM3_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), +IOP( "pprwb", BSIM3_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), IOP( "pprt", BSIM3_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), IOP( "peta0", BSIM3_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), @@ -451,7 +451,7 @@ IOP( "ppdiblc2", BSIM3_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2") IOP( "ppdiblcb", BSIM3_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), IOP( "ppscbe1", BSIM3_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), IOP( "ppscbe2", BSIM3_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM3_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), +IOP( "ppvag", BSIM3_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), IOP( "pwr", BSIM3_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), IOP( "pdwg", BSIM3_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), IOP( "pdwb", BSIM3_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), @@ -493,11 +493,9 @@ char *BSIM3names[] = { "Charge" }; -int BSIM3nSize = NUMELEMS(BSIM3names); -int BSIM3pTSize = NUMELEMS(BSIM3pTable); -int BSIM3mPTSize = NUMELEMS(BSIM3mPTable); -int BSIM3iSize = sizeof(BSIM3instance); -int BSIM3mSize = sizeof(BSIM3model); - - +int BSIM3nSize = NUMELEMS(BSIM3names); +int BSIM3pTSize = NUMELEMS(BSIM3pTable); +int BSIM3mPTSize = NUMELEMS(BSIM3mPTable); +int BSIM3iSize = sizeof(BSIM3instance); +int BSIM3mSize = sizeof(BSIM3model); diff --git a/src/spicelib/devices/bsim3/b3ask.c b/src/spicelib/devices/bsim3/b3ask.c index 5ff21ecf2..1a0138fae 100644 --- a/src/spicelib/devices/bsim3/b3ask.c +++ b/src/spicelib/devices/bsim3/b3ask.c @@ -28,7 +28,7 @@ BSIM3instance *here = (BSIM3instance*)inst; NG_IGNORE(select); - switch(which) + switch(which) { case BSIM3_L: value->rValue = here->BSIM3l; return(OK); @@ -94,11 +94,11 @@ BSIM3instance *here = (BSIM3instance*)inst; return(OK); case BSIM3_SOURCECONDUCT: value->rValue = here->BSIM3sourceConductance; - value->rValue *= here->BSIM3m; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_DRAINCONDUCT: value->rValue = here->BSIM3drainConductance; - value->rValue *= here->BSIM3m; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_VBD: value->rValue = *(ckt->CKTstate0 + here->BSIM3vbd); @@ -113,118 +113,118 @@ BSIM3instance *here = (BSIM3instance*)inst; value->rValue = *(ckt->CKTstate0 + here->BSIM3vds); return(OK); case BSIM3_CD: - value->rValue = here->BSIM3cd; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3cd; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CBS: - value->rValue = here->BSIM3cbs; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3cbs; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CBD: - value->rValue = here->BSIM3cbd; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3cbd; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_GM: - value->rValue = here->BSIM3gm; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3gm; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_GDS: - value->rValue = here->BSIM3gds; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3gds; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_GMBS: - value->rValue = here->BSIM3gmbs; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3gmbs; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_GBD: - value->rValue = here->BSIM3gbd; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3gbd; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_GBS: - value->rValue = here->BSIM3gbs; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3gbs; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qb); - value->rValue *= here->BSIM3m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3qb); + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqb); - value->rValue *= here->BSIM3m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqb); + value->rValue *= here->BSIM3m; return(OK); case BSIM3_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qg); - value->rValue *= here->BSIM3m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3qg); + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqg); - value->rValue *= here->BSIM3m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqg); + value->rValue *= here->BSIM3m; return(OK); case BSIM3_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qd); - value->rValue *= here->BSIM3m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3qd); + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqd); - value->rValue *= here->BSIM3m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqd); + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CGG: - value->rValue = here->BSIM3cggb; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3cggb; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CGD: value->rValue = here->BSIM3cgdb; - value->rValue *= here->BSIM3m; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CGS: value->rValue = here->BSIM3cgsb; - value->rValue *= here->BSIM3m; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CDG: - value->rValue = here->BSIM3cdgb; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3cdgb; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CDD: - value->rValue = here->BSIM3cddb; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3cddb; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CDS: - value->rValue = here->BSIM3cdsb; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3cdsb; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CBG: value->rValue = here->BSIM3cbgb; - value->rValue *= here->BSIM3m; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CBDB: value->rValue = here->BSIM3cbdb; - value->rValue *= here->BSIM3m; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CBSB: value->rValue = here->BSIM3cbsb; - value->rValue *= here->BSIM3m; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CAPBD: - value->rValue = here->BSIM3capbd; - value->rValue *= here->BSIM3m; + value->rValue = here->BSIM3capbd; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_CAPBS: value->rValue = here->BSIM3capbs; - value->rValue *= here->BSIM3m; + value->rValue *= here->BSIM3m; return(OK); case BSIM3_VON: - value->rValue = here->BSIM3von; + value->rValue = here->BSIM3von; return(OK); case BSIM3_VDSAT: - value->rValue = here->BSIM3vdsat; + value->rValue = here->BSIM3vdsat; return(OK); case BSIM3_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qbs); - value->rValue *= here->BSIM3m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3qbs); + value->rValue *= here->BSIM3m; return(OK); case BSIM3_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qbd); - value->rValue *= here->BSIM3m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3qbd); + value->rValue *= here->BSIM3m; return(OK); default: return(E_BADPARM); diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index c044e99ac..88a2ca769 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -58,7 +58,7 @@ CKTcircuit *ckt) } BSIM3LoadRhsMat(inModel, ckt); - + return good; } @@ -96,14 +96,14 @@ double DeltaPhi, dDeltaPhi_dVg, VgDP, dVgDP_dVg; double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; +double ueff, dueff_dVg, dueff_dVd, dueff_dVb; double Esat, Vdsat; double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; +double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; +double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; +double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_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; @@ -115,7 +115,7 @@ double T6; double T7; double T8; double T9; -double T10; +double T10; double T11, T12; double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; @@ -133,9 +133,9 @@ double tempv; #endif double a1, ScalingFactor; -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 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, dAbulk_dVg; double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; double gche, dgche_dVg, dgche_dVd, dgche_dVb; @@ -159,13 +159,13 @@ 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; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; +double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; +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_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; - + double m; struct bsim3SizeDependParam *pParam; @@ -177,67 +177,67 @@ model = here->BSIM3modPtr; #endif ScalingFactor = 1.0e-9; -ChargeComputationNeeded = +ChargeComputationNeeded = ((ckt->CKTmode & (MODEDCTRANCURVE | MODEAC | MODETRAN | MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; #ifndef USE_OMP for (; model != NULL; model = model->BSIM3nextModel) -{ for (here = model->BSIM3instances; here != NULL; +{ for (here = model->BSIM3instances; here != NULL; here = here->BSIM3nextInstance) { #endif Check = 1; ByPass = 0; - pParam = here->pParam; + pParam = here->pParam; if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->BSIM3vbs); + { vbs = *(ckt->CKTstate0 + here->BSIM3vbs); vgs = *(ckt->CKTstate0 + here->BSIM3vgs); vds = *(ckt->CKTstate0 + here->BSIM3vds); qdef = *(ckt->CKTstate0 + here->BSIM3qdef); } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->BSIM3vbs); + else if ((ckt->CKTmode & MODEINITTRAN)) + { vbs = *(ckt->CKTstate1 + here->BSIM3vbs); vgs = *(ckt->CKTstate1 + here->BSIM3vgs); vds = *(ckt->CKTstate1 + here->BSIM3vds); qdef = *(ckt->CKTstate1 + here->BSIM3qdef); } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3off) - { vds = model->BSIM3type * here->BSIM3icVDS; + else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3off) + { vds = model->BSIM3type * here->BSIM3icVDS; vgs = model->BSIM3type * here->BSIM3icVGS; vbs = model->BSIM3type * here->BSIM3icVBS; qdef = 0.0; - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && + if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; + { vbs = 0.0; vgs = model->BSIM3type * pParam->BSIM3vth0 + 0.1; vds = 0.1; } } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM3off)) + else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && + (here->BSIM3off)) { qdef = vbs = vgs = vds = 0.0; - } + } else - { + { #ifndef PREDICTOR if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3vbs) = + { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + *(ckt->CKTstate0 + here->BSIM3vbs) = *(ckt->CKTstate1 + here->BSIM3vbs); vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vbs)) - (xfact * (*(ckt->CKTstate2 + here->BSIM3vbs))); - *(ckt->CKTstate0 + here->BSIM3vgs) = + *(ckt->CKTstate0 + here->BSIM3vgs) = *(ckt->CKTstate1 + here->BSIM3vgs); vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vgs)) - (xfact * (*(ckt->CKTstate2 + here->BSIM3vgs))); - *(ckt->CKTstate0 + here->BSIM3vds) = + *(ckt->CKTstate0 + here->BSIM3vds) = *(ckt->CKTstate1 + here->BSIM3vds); vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vds)) - (xfact * (*(ckt->CKTstate2 + here->BSIM3vds))); - *(ckt->CKTstate0 + here->BSIM3vbd) = + *(ckt->CKTstate0 + here->BSIM3vbd) = *(ckt->CKTstate0 + here->BSIM3vbs) - *(ckt->CKTstate0 + here->BSIM3vds); *(ckt->CKTstate0 + here->BSIM3qdef) = @@ -245,14 +245,14 @@ for (; model != NULL; model = model->BSIM3nextModel) qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3qdef)) -(xfact * (*(ckt->CKTstate2 + here->BSIM3qdef))); } - else - { + else + { #endif /* PREDICTOR */ vbs = model->BSIM3type * (*(ckt->CKTrhsOld + here->BSIM3bNode) - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); vgs = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3gNode) + * (*(ckt->CKTrhsOld + here->BSIM3gNode) - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); vds = model->BSIM3type * (*(ckt->CKTrhsOld + here->BSIM3dNodePrime) @@ -316,7 +316,7 @@ for (; model != NULL; model = model->BSIM3nextModel) * MAX(fabs(cdhat),fabs(Idtot)) + ckt->CKTabstol)) { tempv = MAX(fabs(cbhat),fabs(Ibtot)) + ckt->CKTabstol; if ((fabs(cbhat - Ibtot)) < ckt->CKTreltol * tempv) - { /* bypass code */ + { /* bypass code */ vbs = *(ckt->CKTstate0 + here->BSIM3vbs); vbd = *(ckt->CKTstate0 + here->BSIM3vbd); vgs = *(ckt->CKTstate0 + here->BSIM3vgs); @@ -327,46 +327,46 @@ for (; model != NULL; model = model->BSIM3nextModel) vgb = vgs - vbs; cdrain = here->BSIM3cd; - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && + if ((ckt->CKTmode & (MODETRAN | MODEAC)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - { ByPass = 1; + { ByPass = 1; qgate = here->BSIM3qgate; qbulk = here->BSIM3qbulk; qdrn = here->BSIM3qdrn; - goto line755; + goto line755; + } + else + { goto line850; } - else - { goto line850; - } } } #endif /*NOBYPASS*/ von = here->BSIM3von; if (*(ckt->CKTstate0 + here->BSIM3vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3vgs), von); + { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3vgs), von); vds = vgs - vgd; vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3vds)); vgd = vgs - vds; } - else - { vgd = DEVfetlim(vgd, vgdo, von); + else + { vgd = DEVfetlim(vgd, vgdo, von); vds = vgs - vgd; vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3vds))); vgs = vgd + vds; } if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3vbs), + { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3vbs), CONSTvt0, model->BSIM3vcrit, &Check); vbd = vbs - vds; } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3vbd), - CONSTvt0, model->BSIM3vcrit, &Check); + else + { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3vbd), + CONSTvt0, model->BSIM3vcrit, &Check); vbs = vbd + vds; } } @@ -378,17 +378,17 @@ for (; model != NULL; model = model->BSIM3nextModel) /* Source/drain junction diode DC model begins */ Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM3sourceArea + if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) + { SourceSatCurrent = 1.0e-14; + } + else + { SourceSatCurrent = here->BSIM3sourceArea * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if (SourceSatCurrent <= 0.0) - { here->BSIM3gbs = ckt->CKTgmin; + + here->BSIM3sourcePerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + if (SourceSatCurrent <= 0.0) + { here->BSIM3gbs = ckt->CKTgmin; here->BSIM3cbs = here->BSIM3gbs * vbs; } else @@ -396,7 +396,7 @@ for (; model != NULL; model = model->BSIM3nextModel) { evbs = exp(vbs / Nvtm); here->BSIM3gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; here->BSIM3cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs; + + ckt->CKTgmin * vbs; } else { if (vbs < here->BSIM3vjsm) @@ -415,17 +415,17 @@ for (; model != NULL; model = model->BSIM3nextModel) } } - if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if (DrainSatCurrent <= 0.0) - { here->BSIM3gbd = ckt->CKTgmin; + if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + if (DrainSatCurrent <= 0.0) + { here->BSIM3gbd = ckt->CKTgmin; here->BSIM3cbd = here->BSIM3gbd * vbd; } else @@ -454,44 +454,44 @@ for (; model != NULL; model = model->BSIM3nextModel) /* End of diode DC model */ if (vds >= 0.0) - { /* normal mode */ + { /* normal mode */ here->BSIM3mode = 1; Vds = vds; Vgs = vgs; Vbs = vbs; } - else - { /* inverse mode */ + else + { /* inverse mode */ here->BSIM3mode = -1; Vds = -vds; Vgs = vgd; Vbs = vbd; } - T0 = Vbs - pParam->BSIM3vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3vbsc); - Vbseff = pParam->BSIM3vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); + T0 = Vbs - pParam->BSIM3vbsc - 0.001; + T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3vbsc); + Vbseff = pParam->BSIM3vbsc + 0.5 * (T0 + T1); + dVbseff_dVb = 0.5 * (1.0 + T0 / T1); if (Vbseff < Vbs) { Vbseff = Vbs; } if (Vbseff > 0.0) - { T0 = pParam->BSIM3phi / (pParam->BSIM3phi + Vbseff); + { T0 = pParam->BSIM3phi / (pParam->BSIM3phi + Vbseff); Phis = pParam->BSIM3phi * T0; dPhis_dVb = -T0 * T0; sqrtPhis = pParam->BSIM3phis3 / (pParam->BSIM3phi + 0.5 * Vbseff); dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3phis3; } - else - { Phis = pParam->BSIM3phi - Vbseff; + else + { Phis = pParam->BSIM3phi - Vbseff; dPhis_dVb = -1.0; sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; + dsqrtPhis_dVb = -0.5 / sqrtPhis; } Xdep = pParam->BSIM3Xdep0 * sqrtPhis / pParam->BSIM3sqrtPhi; dXdep_dVb = (pParam->BSIM3Xdep0 / pParam->BSIM3sqrtPhi) - * dsqrtPhis_dVb; + * dsqrtPhis_dVb; Leff = pParam->BSIM3leff; Vtm = model->BSIM3vtm; @@ -501,27 +501,27 @@ for (; model != NULL; model = model->BSIM3nextModel) T0 = pParam->BSIM3dvt2 * Vbseff; if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3dvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3dvt2 * T4 * T4; - } + { T1 = 1.0 + T0; + T2 = pParam->BSIM3dvt2; + } + else /* Added to avoid any discontinuity problems caused by dvt2 */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->BSIM3dvt2 * T4 * T4; + } lt1 = model->BSIM3factor1 * T3 * T1; dlt1_dVb = model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); T0 = pParam->BSIM3dvt2w * Vbseff; if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3dvt2w; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3dvt2w * T4 * T4; - } + { T1 = 1.0 + T0; + T2 = pParam->BSIM3dvt2w; + } + else /* Added to avoid any discontinuity problems caused by dvt2w */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->BSIM3dvt2w * T4 * T4; + } ltw = model->BSIM3factor1 * T3 * T1; dltw_dVb = model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); @@ -565,18 +565,18 @@ for (; model != NULL; model = model->BSIM3nextModel) + (pParam->BSIM3kt1 + pParam->BSIM3kt1l / Leff + pParam->BSIM3kt2 * Vbseff) * TempRatio; tmp2 = model->BSIM3tox * pParam->BSIM3phi - / (pParam->BSIM3weff + pParam->BSIM3w0); + / (pParam->BSIM3weff + pParam->BSIM3w0); - T3 = pParam->BSIM3eta0 + pParam->BSIM3etab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM3theta0vb0; + T3 = pParam->BSIM3eta0 + pParam->BSIM3etab * Vbseff; + if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ + { T9 = 1.0 / (3.0 - 2.0e4 * T3); + T3 = (2.0e-4 - T3) * T9; + T4 = T9 * T9; + } + else + { T4 = 1.0; + } + dDIBL_Sft_dVd = T3 * pParam->BSIM3theta0vb0; DIBL_Sft = dDIBL_Sft_dVd * Vds; Vth = model->BSIM3type * pParam->BSIM3vth0 - pParam->BSIM3k1 @@ -584,7 +584,7 @@ for (; model != NULL; model = model->BSIM3nextModel) - pParam->BSIM3k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM3k3 + pParam->BSIM3k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; - here->BSIM3von = Vth; + here->BSIM3von = Vth; dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb - pParam->BSIM3k2ox - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3k3b * tmp2 @@ -596,28 +596,28 @@ for (; model != NULL; model = model->BSIM3nextModel) tmp2 = pParam->BSIM3nfactor * EPSSI / Xdep; tmp3 = pParam->BSIM3cdsc + pParam->BSIM3cdscb * Vbseff + pParam->BSIM3cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3cit) / model->BSIM3cox; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3cit) / model->BSIM3cox; + if (tmp4 >= -0.5) + { n = 1.0 + tmp4; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox; dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox; - } - else - /* avoid discontinuity problems caused by tmp4 */ - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + } + else + /* avoid discontinuity problems caused by tmp4 */ + { T0 = 1.0 / (3.0 + 8.0 * tmp4); + n = (1.0 + 3.0 * tmp4) * T0; + T0 *= T0; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox * T0; dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox * T0; - } + } /* Poly Gate Si Depletion Effect */ - T0 = pParam->BSIM3vfb + pParam->BSIM3phi; - if ((pParam->BSIM3ngate > 1.e18) && (pParam->BSIM3ngate < 1.e25) + T0 = pParam->BSIM3vfb + pParam->BSIM3phi; + if ((pParam->BSIM3ngate > 1.e18) && (pParam->BSIM3ngate < 1.e25) && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ + /* added to avoid the problem caused by ngate */ { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3ngate / (model->BSIM3cox * model->BSIM3cox); T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); @@ -627,10 +627,10 @@ for (; model != NULL; model = model->BSIM3nextModel) T6 = sqrt(T7 * T7 + 0.224); T5 = 1.12 - 0.5 * (T7 + T6); Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); + dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); } - else - { Vgs_eff = Vgs; + else + { Vgs_eff = Vgs; dVgs_eff_dVg = 1.0; } Vgst = Vgs_eff - Vth; @@ -641,140 +641,140 @@ for (; model != NULL; model = model->BSIM3nextModel) VgstNVt = Vgst / T10; ExpArg = (2.0 * pParam->BSIM3voff - Vgst) / T10; - /* MCJ: Very small Vgst */ + /* MCJ: Very small Vgst */ if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst; + { Vgsteff = Vgst; dVgsteff_dVg = dVgs_eff_dVg; dVgsteff_dVd = -dVth_dVd; dVgsteff_dVb = -dVth_dVb; - } - else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->BSIM3voff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->BSIM3cdep0 / model->BSIM3cox * ExpVgst; + } + else if (ExpArg > EXP_THRESHOLD) + { T0 = (Vgst - pParam->BSIM3voff) / (n * Vtm); + ExpVgst = exp(T0); + Vgsteff = Vtm * pParam->BSIM3cdep0 / model->BSIM3cox * ExpVgst; dVgsteff_dVg = Vgsteff / (n * Vtm); dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg *= dVgs_eff_dVg; - } - else - { ExpVgst = exp(VgstNVt); + dVgsteff_dVg *= dVgs_eff_dVg; + } + else + { ExpVgst = exp(VgstNVt); T1 = T10 * log(1.0 + ExpVgst); dT1_dVg = ExpVgst / (1.0 + ExpVgst); dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; + + T1 / n * dn_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + + T1 / n * dn_dVd; - dT2_dVg = -model->BSIM3cox / (Vtm * pParam->BSIM3cdep0) - * exp(ExpArg); + dT2_dVg = -model->BSIM3cox / (Vtm * pParam->BSIM3cdep0) + * exp(ExpArg); T2 = 1.0 - T10 * dT2_dVg; dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; + + (T2 - 1.0) / n * dn_dVd; dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; + + (T2 - 1.0) / n * dn_dVb; Vgsteff = T1 / T2; - T3 = T2 * T2; + T3 = T2 * T2; dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - } - here->BSIM3Vgsteff = Vgsteff; + } + here->BSIM3Vgsteff = Vgsteff; /* Calculate Effective Channel Geometry */ T9 = sqrtPhis - pParam->BSIM3sqrtPhi; - Weff = pParam->BSIM3weff - 2.0 * (pParam->BSIM3dwg * Vgsteff - + pParam->BSIM3dwb * T9); + Weff = pParam->BSIM3weff - 2.0 * (pParam->BSIM3dwg * Vgsteff + + pParam->BSIM3dwb * T9); dWeff_dVg = -2.0 * pParam->BSIM3dwg; dWeff_dVb = -2.0 * pParam->BSIM3dwb * dsqrtPhis_dVb; if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; + { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); + Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; + T0 *= T0 * 4.0e-16; dWeff_dVg *= T0; - dWeff_dVb *= T0; + dWeff_dVb *= T0; } T0 = pParam->BSIM3prwg * Vgsteff + pParam->BSIM3prwb * T9; - if (T0 >= -0.9) - { Rds = pParam->BSIM3rds0 * (1.0 + T0); - dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg; + if (T0 >= -0.9) + { Rds = pParam->BSIM3rds0 * (1.0 + T0); + dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg; dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb; - } - else + } + else /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = pParam->BSIM3rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg * T1; + { T1 = 1.0 / (17.0 + 20.0 * T0); + Rds = pParam->BSIM3rds0 * (0.8 + T0) * T1; + T1 *= T1; + dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg * T1; dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb - * T1; - } - here->BSIM3rds = Rds; /* Noise Bugfix */ - + * T1; + } + here->BSIM3rds = Rds; /* Noise Bugfix */ + /* Calculate Abulk */ T1 = 0.5 * pParam->BSIM3k1ox / sqrtPhis; dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; T9 = sqrt(pParam->BSIM3xj * Xdep); tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; + T5 = Leff / tmp1; tmp2 = pParam->BSIM3a0 * T5; - tmp3 = pParam->BSIM3weff + pParam->BSIM3b1; + tmp3 = pParam->BSIM3weff + pParam->BSIM3b1; tmp4 = pParam->BSIM3b0 / tmp3; T2 = tmp2 + tmp4; dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; T6 = T5 * T5; T7 = T5 * T6; - Abulk0 = 1.0 + T1 * T2; + Abulk0 = 1.0 + T1 * T2; dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; T8 = pParam->BSIM3ags * pParam->BSIM3a0 * T7; dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; + Abulk = Abulk0 + dAbulk_dVg * Vgsteff; dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); + + 3.0 * T1 * dT2_dVb); if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } + { T9 = 1.0 / (3.0 - 20.0 * Abulk0); + Abulk0 = (0.2 - Abulk0) * T9; + dAbulk0_dVb *= T9 * T9; + } if (Abulk < 0.1) /* added to avoid the problems caused by Abulk */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; + { T9 = 1.0 / (3.0 - 20.0 * Abulk); + Abulk = (0.2 - Abulk) * T9; T10 = T9 * T9; - dAbulk_dVb *= T10; + dAbulk_dVb *= T10; dAbulk_dVg *= T10; - } - here->BSIM3Abulk = Abulk; + } + here->BSIM3Abulk = Abulk; T2 = pParam->BSIM3keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); + if (T2 >= -0.9) + { T0 = 1.0 / (1.0 + T2); dT0_dVb = -pParam->BSIM3keta * T0 * T0; - } - else + } + else /* added to avoid the problems caused by Keta */ - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; + { T1 = 1.0 / (0.8 + T2); + T0 = (17.0 + 20.0 * T2) * T1; dT0_dVb = -pParam->BSIM3keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; + } + dAbulk_dVg *= T0; + dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; + dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; + Abulk *= T0; + Abulk0 *= T0; /* Mobility calculation */ if (model->BSIM3mobMod == 1) - { T0 = Vgsteff + Vth + Vth; + { T0 = Vgsteff + Vth + Vth; T2 = pParam->BSIM3ua + pParam->BSIM3uc * Vbseff; T3 = T0 / model->BSIM3tox; T5 = T3 * (T2 + pParam->BSIM3ub * T3); @@ -782,49 +782,49 @@ for (; model != NULL; model = model->BSIM3nextModel) dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T3; } - else if (model->BSIM3mobMod == 2) - { T5 = Vgsteff / model->BSIM3tox * (pParam->BSIM3ua - + pParam->BSIM3uc * Vbseff + pParam->BSIM3ub * Vgsteff + else if (model->BSIM3mobMod == 2) + { T5 = Vgsteff / model->BSIM3tox * (pParam->BSIM3ua + + pParam->BSIM3uc * Vbseff + pParam->BSIM3ub * Vgsteff / model->BSIM3tox); dDenomi_dVg = (pParam->BSIM3ua + pParam->BSIM3uc * Vbseff - + 2.0 * pParam->BSIM3ub * Vgsteff / model->BSIM3tox) - / model->BSIM3tox; + + 2.0 * pParam->BSIM3ub * Vgsteff / model->BSIM3tox) + / model->BSIM3tox; dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3uc / model->BSIM3tox; + dDenomi_dVb = Vgsteff * pParam->BSIM3uc / model->BSIM3tox; } - else - { T0 = Vgsteff + Vth + Vth; + else + { T0 = Vgsteff + Vth + Vth; T2 = 1.0 + pParam->BSIM3uc * Vbseff; T3 = T0 / model->BSIM3tox; T4 = T3 * (pParam->BSIM3ua + pParam->BSIM3ub * T3); - T5 = T4 * T2; + T5 = T4 * T2; dDenomi_dVg = (pParam->BSIM3ua + 2.0 * pParam->BSIM3ub * T3) * T2 - / model->BSIM3tox; + / model->BSIM3tox; dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T4; } - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; + if (T5 >= -0.8) + { Denomi = 1.0 + T5; + } + else /* Added to avoid the discontinuity problem caused by ua and ub*/ + { T9 = 1.0 / (7.0 + 10.0 * T5); + Denomi = (0.6 + T5) * T9; + T9 *= T9; dDenomi_dVg *= T9; dDenomi_dVd *= T9; dDenomi_dVb *= T9; - } + } here->BSIM3ueff = ueff = pParam->BSIM3u0temp / Denomi; - T9 = -ueff / Denomi; + T9 = -ueff / Denomi; dueff_dVg = T9 * dDenomi_dVg; dueff_dVd = T9 * dDenomi_dVd; dueff_dVb = T9 * dDenomi_dVb; /* Saturation Drain Voltage Vdsat */ WVCox = Weff * pParam->BSIM3vsattemp * model->BSIM3cox; - WVCoxRds = WVCox * Rds; + WVCoxRds = WVCox * Rds; Esat = 2.0 * pParam->BSIM3vsattemp / ueff; EsatL = Esat * Leff; @@ -832,28 +832,28 @@ for (; model != NULL; model = model->BSIM3nextModel) dEsatL_dVg = T0 * dueff_dVg; dEsatL_dVd = T0 * dueff_dVd; dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ + + /* Sqrt() */ a1 = pParam->BSIM3a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM3a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) + if (a1 == 0.0) + { Lambda = pParam->BSIM3a2; + dLambda_dVg = 0.0; + } + else if (a1 > 0.0) /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->BSIM3a2; - T1 = T0 - pParam->BSIM3a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM3a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM3a2 + pParam->BSIM3a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); - } + { T0 = 1.0 - pParam->BSIM3a2; + T1 = T0 - pParam->BSIM3a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * T0); + Lambda = pParam->BSIM3a2 + T0 - 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); + } + else + { T1 = pParam->BSIM3a2 + pParam->BSIM3a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3a2); + Lambda = 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); + } Vgst2Vtm = Vgsteff + 2.0 * Vtm; here->BSIM3AbovVgst2Vtm = Abulk / Vgst2Vtm; @@ -865,48 +865,48 @@ for (; model != NULL; model = model->BSIM3nextModel) else { tmp2 = dWeff_dVg / Weff; tmp3 = dWeff_dVb / Weff; - } + } if ((Rds == 0.0) && (Lambda == 1.0)) { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; + T1 = T0 * T0; + T2 = Vgst2Vtm * T0; T3 = EsatL * Vgst2Vtm; Vdsat = T3 * T0; - + dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; + dT0_dVd = -(Abulk * dEsatL_dVd) * T1; + dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; + dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; } else { tmp1 = dLambda_dVg / (Lambda * Lambda); T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; + T8 = Abulk * T9; + T7 = Vgst2Vtm * T9; T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); + T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - + + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); + dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; + + (1.0 / Lambda - 1.0) * dAbulk_dVb); + dT0_dVd = 0.0; T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - + dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); + + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 + + T7 * tmp2 + T6 * dAbulk_dVg); dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); + + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); dT1_dVd = Abulk * dEsatL_dVd; T2 = Vgst2Vtm * (EsatL + 2.0 * T6); dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); + + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); dT2_dVd = Vgst2Vtm * dEsatL_dVd; @@ -914,16 +914,16 @@ for (; model != NULL; model = model->BSIM3nextModel) Vdsat = (T1 - T3) / T0; dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; + / T3; dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; + / T3; dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; + / T3; dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; + - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; + - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; } here->BSIM3vdsat = Vdsat; @@ -935,40 +935,40 @@ for (; model != NULL; model = model->BSIM3nextModel) dT1_dVb = dVdsat_dVb; T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3delta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->BSIM3delta / T2; + T0 = T1 / T2; + T3 = 2.0 * pParam->BSIM3delta / T2; dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); + dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); + dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); + dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); /* Added to eliminate non-zero Vdseff at Vds=0.0 */ if (Vds == 0.0) { Vdseff = 0.0; dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; + dVdseff_dVb = 0.0; } /* Calculate VAsat */ tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; + T8 = T9 / Vgst2Vtm; T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - + T7 = 2.0 * WVCoxRds * tmp4; dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - + - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm + + Vdsat * dAbulk_dVg); + dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; + T9 = WVCoxRds * Abulk; + T1 = 2.0 / Lambda - 1.0 + T9; dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; @@ -980,39 +980,39 @@ for (; model != NULL; model = model->BSIM3nextModel) if (Vdseff > Vds) Vdseff = Vds; diffVds = Vds - Vdseff; - here->BSIM3Vdseff = Vdseff; + here->BSIM3Vdseff = Vdseff; /* Calculate VACLM */ if ((pParam->BSIM3pclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->BSIM3pclm * Abulk * pParam->BSIM3litl); + { T0 = 1.0 / (pParam->BSIM3pclm * Abulk * pParam->BSIM3litl); dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); + dT0_dVg = -T0 / Abulk * dAbulk_dVg; + + T2 = Vgsteff / EsatL; + T1 = Leff * (Abulk + T2); dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); dT1_dVd = -T2 * dEsatL_dVd / Esat; - T9 = T0 * T1; + T9 = T0 * T1; VACLM = T9 * diffVds; dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg + T1 * diffVds * dT0_dVg; dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; + - T9 * dVdseff_dVb; dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); } - else - { VACLM = MAX_EXP; + else + { VACLM = MAX_EXP; dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; } /* Calculate VADIBL */ if (pParam->BSIM3thetaRout > 0.0) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; + { T8 = Abulk * Vdsat; + T0 = Vgst2Vtm * T8; dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; + + Vgst2Vtm * Vdsat * dAbulk_dVg; dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; @@ -1021,59 +1021,59 @@ for (; model != NULL; model = model->BSIM3nextModel) dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; dT1_dVd = Abulk * dVdsat_dVd; - T9 = T1 * T1; - T2 = pParam->BSIM3thetaRout; + T9 = T1 * T1; + T2 = pParam->BSIM3thetaRout; VADIBL = (Vgst2Vtm - T0 / T1) / T2; dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - T7 = pParam->BSIM3pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); + T7 = pParam->BSIM3pdiblb * Vbseff; + if (T7 >= -0.9) + { T3 = 1.0 / (1.0 + T7); VADIBL *= T3; dVADIBL_dVg *= T3; dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3pdiblb) - * T3; + * T3; dVADIBL_dVd *= T3; - } - else + } + else /* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; + { T4 = 1.0 / (0.8 + T7); + T3 = (17.0 + 20.0 * T7) * T4; dVADIBL_dVg *= T3; dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM3pdiblb * T4 * T4; + - VADIBL * pParam->BSIM3pdiblb * T4 * T4; dVADIBL_dVd *= T3; VADIBL *= T3; - } + } } - else - { VADIBL = MAX_EXP; + else + { VADIBL = MAX_EXP; dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; } /* Calculate VA */ - - T8 = pParam->BSIM3pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; + + T8 = pParam->BSIM3pvag / EsatL; + T9 = T8 * Vgsteff; + if (T9 > -0.9) + { T0 = 1.0 + T9; dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); dT0_dVb = -T9 * dEsatL_dVb / EsatL; dT0_dVd = -T9 * dEsatL_dVd / EsatL; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; + } + else /* Added to avoid the discontinuity problems caused by pvag */ + { T1 = 1.0 / (17.0 + 20.0 * T9); + T0 = (0.8 + T9) * T1; + T1 *= T1; dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; T9 *= T1 / EsatL; dT0_dVb = -T9 * dEsatL_dVb; dT0_dVd = -T9 * dEsatL_dVd; - } - + } + tmp1 = VACLM * VACLM; tmp2 = VADIBL * VADIBL; tmp3 = VACLM + VADIBL; @@ -1090,25 +1090,25 @@ for (; model != NULL; model = model->BSIM3nextModel) dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; /* Calculate VASCBE */ - if (pParam->BSIM3pscbe2 > 0.0) - { if (diffVds > pParam->BSIM3pscbe1 * pParam->BSIM3litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM3pscbe1 * pParam->BSIM3litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM3pscbe2; + if (pParam->BSIM3pscbe2 > 0.0) + { if (diffVds > pParam->BSIM3pscbe1 * pParam->BSIM3litl + / EXP_THRESHOLD) + { T0 = pParam->BSIM3pscbe1 * pParam->BSIM3litl / diffVds; + VASCBE = Leff * exp(T0) / pParam->BSIM3pscbe2; T1 = T0 * VASCBE / diffVds; dVASCBE_dVg = T1 * dVdseff_dVg; dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); dVASCBE_dVb = T1 * dVdseff_dVb; } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM3pscbe2; + else + { VASCBE = MAX_EXP * Leff/pParam->BSIM3pscbe2; dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; } - } - else - { VASCBE = MAX_EXP; + } + else + { VASCBE = MAX_EXP; dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } + } /* Calculate Ids */ CoxWovL = model->BSIM3cox * Weff / Leff; @@ -1118,48 +1118,48 @@ for (; model != NULL; model = model->BSIM3nextModel) dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; + dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) / Vgst2Vtm; fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; + dfgche1_dVg = Vgsteff * dT0_dVg + T0; + dfgche1_dVd = Vgsteff * dT0_dVd; + dfgche1_dVb = Vgsteff * dT0_dVb; T9 = Vdseff / EsatL; fgche2 = 1.0 + T9; dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - + gche = beta * fgche1 / fgche2; dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; + - gche * dfgche2_dVg) / fgche2; dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; + - gche * dfgche2_dVd) / fgche2; dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; + - gche * dfgche2_dVb) / fgche2; T0 = 1.0 + gche * Rds; T9 = Vdseff / T0; Idl = gche * T9; dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; + - Idl * gche / T0 * dRds_dVg ; - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; + dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; + dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb + - Idl * dRds_dVb * gche) / T0; T9 = diffVds / Va; T0 = 1.0 + T9; Idsa = Idl * T0; dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; + - T9 * dVa_dVd) / Va; dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; T9 = diffVds / VASCBE; @@ -1168,33 +1168,33 @@ for (; model != NULL; model = model->BSIM3nextModel) Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - - T9 * dVASCBE_dVd) / VASCBE; + - T9 * dVASCBE_dVd) / VASCBE; Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb - + T9 * dVASCBE_dVb) / VASCBE; + + T9 * dVASCBE_dVb) / VASCBE; Gds += Gm * dVgsteff_dVd; - Gmb += Gm * dVgsteff_dVb; - Gm *= dVgsteff_dVg; - Gmb *= dVbseff_dVb; + Gmb += Gm * dVgsteff_dVb; + Gm *= dVgsteff_dVg; + Gmb *= dVbseff_dVb; /* Substrate current begins */ tmp = pParam->BSIM3alpha0 + pParam->BSIM3alpha1 * Leff; if ((tmp <= 0.0) || (pParam->BSIM3beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; + { Isub = Gbd = Gbb = Gbg = 0.0; } - else - { T2 = tmp / Leff; - if (diffVds > pParam->BSIM3beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM3beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); + else + { T2 = tmp / Leff; + if (diffVds > pParam->BSIM3beta0 / EXP_THRESHOLD) + { T0 = -pParam->BSIM3beta0 / diffVds; + T1 = T2 * diffVds * exp(T0); + T3 = T1 / diffVds * (T0 - 1.0); dT1_dVg = T3 * dVdseff_dVg; dT1_dVd = T3 * (dVdseff_dVd - 1.0); dT1_dVb = T3 * dVdseff_dVb; } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; + else + { T3 = T2 * MIN_EXP; + T1 = T3 * diffVds; dT1_dVg = -T3 * dVdseff_dVg; dT1_dVd = T3 * (1.0 - dVdseff_dVd); dT1_dVb = -T3 * dVdseff_dVb; @@ -1205,59 +1205,59 @@ for (; model != NULL; model = model->BSIM3nextModel) Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; /* bug fixing */ + Gbb += Gbg * dVgsteff_dVb; + Gbg *= dVgsteff_dVg; + Gbb *= dVbseff_dVb; /* bug fixing */ } - + cdrain = Ids; here->BSIM3gds = Gds; here->BSIM3gm = Gm; here->BSIM3gmbs = Gmb; - + here->BSIM3gbbs = Gbb; here->BSIM3gbgs = Gbg; here->BSIM3gbds = Gbd; here->BSIM3csub = Isub; - /* BSIM3 thermal noise Qinv calculated from all capMod + /* BSIM3 thermal noise Qinv calculated from all capMod * 0, 1, 2 & 3 stored in here->BSIM3qinv 1/1998 */ if ((model->BSIM3xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; + { qgate = qdrn = qsrc = qbulk = 0.0; here->BSIM3cggb = here->BSIM3cgsb = here->BSIM3cgdb = 0.0; here->BSIM3cdgb = here->BSIM3cdsb = here->BSIM3cddb = 0.0; here->BSIM3cbgb = here->BSIM3cbsb = here->BSIM3cbdb = 0.0; - here->BSIM3cqdb = here->BSIM3cqsb = here->BSIM3cqgb + here->BSIM3cqdb = here->BSIM3cqsb = here->BSIM3cqgb = here->BSIM3cqbb = 0.0; here->BSIM3gtau = 0.0; goto finished; } - else if (model->BSIM3capMod == 0) - { + else if (model->BSIM3capMod == 0) + { if (Vbseff < 0.0) - { Vbseff = Vbs; + { Vbseff = Vbs; dVbseff_dVb = 1.0; } - else - { Vbseff = pParam->BSIM3phi - Phis; + else + { Vbseff = pParam->BSIM3phi - Phis; dVbseff_dVb = -dPhis_dVb; } Vfb = pParam->BSIM3vfbcv; - Vth = Vfb + pParam->BSIM3phi + pParam->BSIM3k1ox * sqrtPhis; + Vth = Vfb + pParam->BSIM3phi + pParam->BSIM3k1ox * sqrtPhis; Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb; + dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb; dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; + dVgst_dVg = dVgs_eff_dVg; CoxWL = model->BSIM3cox * pParam->BSIM3weffCV * pParam->BSIM3leffCV; Arg1 = Vgs_eff - Vbseff - Vfb; if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; + { qgate = CoxWL * Arg1; qbulk = -qgate; qdrn = 0.0; @@ -1274,18 +1274,18 @@ for (; model != NULL; model = model->BSIM3nextModel) here->BSIM3cbsb = -here->BSIM3cgsb; here->BSIM3qinv = 0.0; } - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM3k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM3k1ox * (T2 - T1); + else if (Vgst <= 0.0) + { T1 = 0.5 * pParam->BSIM3k1ox; + T2 = sqrt(T1 * T1 + Arg1); + qgate = CoxWL * pParam->BSIM3k1ox * (T2 - T1); qbulk = -qgate; qdrn = 0.0; - T0 = CoxWL * T1 / T2; - here->BSIM3cggb = T0 * dVgs_eff_dVg; - here->BSIM3cgdb = 0.0; + T0 = CoxWL * T1 / T2; + here->BSIM3cggb = T0 * dVgs_eff_dVg; + here->BSIM3cgdb = 0.0; here->BSIM3cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); - + here->BSIM3cdgb = 0.0; here->BSIM3cddb = 0.0; here->BSIM3cdsb = 0.0; @@ -1295,63 +1295,63 @@ for (; model != NULL; model = model->BSIM3nextModel) here->BSIM3cbsb = -here->BSIM3cgsb; here->BSIM3qinv = 0.0; } - else - { One_Third_CoxWL = CoxWL / 3.0; + else + { One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - Vdsat = Vgst / AbulkCV; - dVdsat_dVg = dVgs_eff_dVg / AbulkCV; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; + Vdsat = Vgst / AbulkCV; + dVdsat_dVg = dVgs_eff_dVg / AbulkCV; + dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; + { /* 0/100 Charge partition model */ + if (Vdsat <= Vds) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.0; - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); here->BSIM3cgdb = 0.0; - + here->BSIM3cdgb = 0.0; here->BSIM3cddb = 0.0; here->BSIM3cdsb = 0.0; - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbgb = -(here->BSIM3cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); here->BSIM3cbdb = 0.0; here->BSIM3qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + T7 = 2.0 * Vds - T1 - 3.0 * T3; + T8 = T3 - T1 - 2.0 * Vds; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3phi - 0.5 * (Vds - T3)); + T10 = T4 * T8; + qdrn = T4 * T7; + qbulk = -(qgate + qdrn + T10); + T5 = T3 / T1; here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; T11 = -CoxWL * T5 * dVdsat_dVb; here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); here->BSIM3cgsb = -(here->BSIM3cggb + T11 @@ -1363,7 +1363,7 @@ for (; model != NULL; model = model->BSIM3nextModel) T8 = T9 * T8; T9 = 2.0 * T4 * (1.0 - 3.0 * T5); here->BSIM3cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; + * dVdsat_dVg) * dVgs_eff_dVg; T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; here->BSIM3cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); here->BSIM3cdsb = -(here->BSIM3cdgb + T12 @@ -1371,200 +1371,200 @@ for (; model != NULL; model = model->BSIM3nextModel) T9 = 2.0 * T4 * (1.0 + T5); T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); + T12 = T4 * (2.0 * T2 + T5 - 1.0); T0 = -(T10 + T11 + T12); here->BSIM3cbgb = -(here->BSIM3cggb - + here->BSIM3cdgb + T10); - here->BSIM3cbdb = -(here->BSIM3cgdb - + here->BSIM3cddb + T12); + + here->BSIM3cdgb + T10); + here->BSIM3cbdb = -(here->BSIM3cgdb + + here->BSIM3cddb + T12); here->BSIM3cbsb = -(here->BSIM3cgsb - + here->BSIM3cdsb + T0); + + here->BSIM3cdsb + T0); here->BSIM3qinv = -(qgate + qbulk); } } - else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; + else if (model->BSIM3xpart < 0.5) + { /* 40/60 Charge partition model */ + if (Vds >= Vdsat) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.4 * T2; - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; + here->BSIM3cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cgdb = 0.0; + + T3 = 0.4 * Two_Third_CoxWL; here->BSIM3cdgb = -T3 * dVgs_eff_dVg; here->BSIM3cddb = 0.0; - T4 = T3 * dVth_dVb; + T4 = T3 * dVth_dVb; here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbgb = -(here->BSIM3cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); here->BSIM3cbdb = 0.0; here->BSIM3qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi - - 0.5 * (Vds - T3)); + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi + - 0.5 * (Vds - T3)); - T5 = T3 / T1; + T5 = T3 / T1; here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; tmp = -CoxWL * T5 * dVdsat_dVb; here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = -(here->BSIM3cggb - + here->BSIM3cgdb + tmp); + here->BSIM3cgsb = -(here->BSIM3cggb + + here->BSIM3cgdb + tmp); - T6 = 1.0 / Vdsat; + T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); + T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds + + 1.2 * Vds * Vds; + T8 = T2 / T1; + T7 = Vds - T1 - T8 * T6; + qdrn = T4 * T7; + T7 *= T9; + tmp = T8 / T1; + tmp1 = T4 * (2.0 - 4.0 * tmp * T6 + + T8 * (16.0 * Vdsat - 6.0 * Vds)); here->BSIM3cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; + * dVdsat_dVg) * dVgs_eff_dVg; T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; here->BSIM3cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM3cdsb = -(here->BSIM3cdgb - + T10 + here->BSIM3cddb); + * T1) + 2.0 * tmp) * T6 + T8 + * (6.0 * Vdsat - 2.4 * Vds)); + here->BSIM3cdsb = -(here->BSIM3cdgb + + T10 + here->BSIM3cddb); - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - here->BSIM3cdgb - - T0 * dVdsat_dVg) * dVgs_eff_dVg; - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM3cddb; + T7 = 2.0 * (T1 + T3); + qbulk = -(qgate - T4 * T7); + T7 *= T9; + T0 = 4.0 * T4 * (1.0 - T5); + T12 = (-T7 * dAlphaz_dVg - here->BSIM3cdgb + - T0 * dVdsat_dVg) * dVgs_eff_dVg; + T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; + T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) + - here->BSIM3cddb; tmp = -(T10 + T11 + T12); - here->BSIM3cbgb = -(here->BSIM3cggb - + here->BSIM3cdgb + T12); + here->BSIM3cbgb = -(here->BSIM3cggb + + here->BSIM3cdgb + T12); here->BSIM3cbdb = -(here->BSIM3cgdb - + here->BSIM3cddb + T10); /* bug fix */ + + here->BSIM3cddb + T10); /* bug fix */ here->BSIM3cbsb = -(here->BSIM3cgsb - + here->BSIM3cdsb + tmp); + + here->BSIM3cdsb + tmp); here->BSIM3qinv = -(qgate + qbulk); } } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; + else + { /* 50/50 partitioning */ + if (Vds >= Vdsat) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.5 * T2; + + here->BSIM3cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cgdb = 0.0; - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - here->BSIM3cdgb = -One_Third_CoxWL * dVgs_eff_dVg; here->BSIM3cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; + T4 = One_Third_CoxWL * dVth_dVb; here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbgb = -(here->BSIM3cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); here->BSIM3cbdb = 0.0; here->BSIM3qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi - - 0.5 * (Vds - T3)); + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi + - 0.5 * (Vds - T3)); - T5 = T3 / T1; + T5 = T3 / T1; here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; tmp = -CoxWL * T5 * dVdsat_dVb; here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = -(here->BSIM3cggb - + here->BSIM3cgdb + tmp); + here->BSIM3cgsb = -(here->BSIM3cggb + + here->BSIM3cgdb + tmp); - T6 = 1.0 / Vdsat; + T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); + T7 = T1 + T3; + qdrn = -T4 * T7; + qbulk = - (qgate + qdrn + qdrn); + T7 *= T9; + T0 = T4 * (2.0 * T5 - 2.0); here->BSIM3cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; + * dAlphaz_dVg) * dVgs_eff_dVg; + T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; here->BSIM3cddb = T4 * (1.0 - 2.0 * T2 - T5); here->BSIM3cdsb = -(here->BSIM3cdgb + T12 + here->BSIM3cddb); here->BSIM3cbgb = -(here->BSIM3cggb - + 2.0 * here->BSIM3cdgb); + + 2.0 * here->BSIM3cdgb); here->BSIM3cbdb = -(here->BSIM3cgdb - + 2.0 * here->BSIM3cddb); + + 2.0 * here->BSIM3cddb); here->BSIM3cbsb = -(here->BSIM3cgsb - + 2.0 * here->BSIM3cdsb); + + 2.0 * here->BSIM3cdsb); here->BSIM3qinv = -(qgate + qbulk); } - } - } - } - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; + } + } + } + else + { if (Vbseff < 0.0) + { VbseffCV = Vbseff; dVbseffCV_dVb = 1.0; } - else - { VbseffCV = pParam->BSIM3phi - Phis; + else + { VbseffCV = pParam->BSIM3phi - Phis; dVbseffCV_dVb = -dPhis_dVb; } CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; + * pParam->BSIM3leffCV; /* Seperate VgsteffCV with noff and voffcv */ noff = n * pParam->BSIM3noff; @@ -1598,84 +1598,84 @@ for (; model != NULL; model = model->BSIM3nextModel) dVgsteff_dVg *= dVgs_eff_dVg; } /* End of VgsteffCV */ - if (model->BSIM3capMod == 1) - { Vfb = pParam->BSIM3vfbzb; + if (model->BSIM3capMod == 1) + { Vfb = pParam->BSIM3vfbzb; Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; + { qgate = CoxWL * Arg1; Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); Cgd = -CoxWL * dVgsteff_dVd; Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); } - else - { T0 = 0.5 * pParam->BSIM3k1ox; - T1 = sqrt(T0 * T0 + Arg1); + else + { T0 = 0.5 * pParam->BSIM3k1ox; + T1 = sqrt(T0 * T0 + Arg1); T2 = CoxWL * T0 / T1; - + qgate = CoxWL * pParam->BSIM3k1ox * (T1 - T0); Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); Cgd = -T2 * dVgsteff_dVd; Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); } - qbulk = -qgate; - Cbg = -Cgg; - Cbd = -Cgd; - Cbb = -Cgb; + qbulk = -qgate; + Cbg = -Cgg; + Cbd = -Cgd; + Cbb = -Cgb; One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; + VdsatCV = Vgsteff / AbulkCV; if (VdsatCV < Vds) - { dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T0 = Vgsteff - VdsatCV / 3.0; + { dVdsatCV_dVg = 1.0 / AbulkCV; + dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + T0 = Vgsteff - VdsatCV / 3.0; dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; dT0_dVb = -dVdsatCV_dVb / 3.0; qgate += CoxWL * T0; - Cgg1 = CoxWL * dT0_dVg; + Cgg1 = CoxWL * dT0_dVg; Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; Cgd1 = Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; + Cgg1 *= dVgsteff_dVg; + Cgg += Cgg1; + Cgb += Cgb1; + Cgd += Cgd1; - T0 = VdsatCV - Vgsteff; - dT0_dVg = dVdsatCV_dVg - 1.0; - dT0_dVb = dVdsatCV_dVb; + T0 = VdsatCV - Vgsteff; + dT0_dVg = dVdsatCV_dVg - 1.0; + dT0_dVb = dVdsatCV_dVb; qbulk += One_Third_CoxWL * T0; Cbg1 = One_Third_CoxWL * dT0_dVg; - Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; - Cbd1 = Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; + Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; + Cbd1 = Cbg1 * dVgsteff_dVd; + Cbg1 *= dVgsteff_dVg; + Cbg += Cbg1; + Cbb += Cbb1; Cbd += Cbd1; if (model->BSIM3xpart > 0.5) - T0 = -Two_Third_CoxWL; + T0 = -Two_Third_CoxWL; else if (model->BSIM3xpart < 0.5) - T0 = -0.4 * CoxWL; + T0 = -0.4 * CoxWL; else - T0 = -One_Third_CoxWL; + T0 = -One_Third_CoxWL; qsrc = T0 * Vgsteff; Csg = T0 * dVgsteff_dVg; Csb = T0 * dVgsteff_dVb; Csd = T0 * dVgsteff_dVd; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; } - else - { T0 = AbulkCV * Vds; + else + { T0 = AbulkCV * Vds; T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); - T2 = Vds / T1; - T3 = T0 * T2; + T2 = Vds / T1; + T3 = T0 * T2; dT3_dVg = -12.0 * T2 * T2 * AbulkCV; dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; @@ -1684,137 +1684,137 @@ for (; model != NULL; model = model->BSIM3nextModel) Cgg1 = CoxWL * (1.0 + dT3_dVg); Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; + Cgg1 *= dVgsteff_dVg; + Cgg += Cgg1; + Cgb += Cgb1; + Cgd += Cgd1; qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); - Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); - Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb - + (0.5 * Vds - T3) * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd - + Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; + Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); + Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb + + (0.5 * Vds - T3) * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb; + Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd + + Cbg1 * dVgsteff_dVd; + Cbg1 *= dVgsteff_dVg; + Cbg += Cbg1; + Cbb += Cbb1; + Cbd += Cbd1; if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; + { /* 0/100 Charge petition model */ + T1 = T1 + T1; qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 - * AbulkCV); + - T0 * T0 / T1); + Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 + * AbulkCV); Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb - - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) - * dAbulkCV_dVb) + Csg * dVgsteff_dVb; - Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 - / T1 / T1 * (4.0 * Vgsteff - T0)) - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; + - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) + * dAbulkCV_dVb) + Csg * dVgsteff_dVb; + Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 + / T1 / T1 * (4.0 * Vgsteff - T0)) + + Csg * dVgsteff_dVd; + Csg *= dVgsteff_dVg; } - else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb - + Csg * dVgsteff_dVb; - Csd = (qsrc / T1 + T2 * T4) * AbulkCV - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; + else if (model->BSIM3xpart < 0.5) + { /* 40/60 Charge petition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb + + Csg * dVgsteff_dVb; + Csd = (qsrc / T1 + T2 * T4) * AbulkCV + + Csg * dVgsteff_dVd; + Csg *= dVgsteff_dVg; } - else - { /* 50/50 Charge petition model */ + else + { /* 50/50 Charge petition model */ qsrc = -0.5 * (qgate + qbulk); Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); } - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; } qdrn = -(qgate + qbulk + qsrc); here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; here->BSIM3qinv = -(qgate + qbulk); - } + } - else if (model->BSIM3capMod == 2) - { Vfb = pParam->BSIM3vfbzb; + else if (model->BSIM3capMod == 2) + { Vfb = pParam->BSIM3vfbzb; V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T2 = DELTA_3 / T0; - } + if (Vfb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); + T2 = -DELTA_3 / T0; + } + else + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); + T2 = DELTA_3 / T0; + } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVb = CoxWL * dVfbeff_dVb; + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1 * dVbseffCV_dVb; + Qac0 = CoxWL * (Vfbeff - Vfb); + dQac0_dVg = CoxWL * dVfbeff_dVg; + dQac0_dVb = CoxWL * dVfbeff_dVb; T0 = 0.5 * pParam->BSIM3k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; + T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; if (pParam->BSIM3k1ox == 0.0) { T1 = 0.0; T2 = 0.0; } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3k1ox; + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->BSIM3k1ox; T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); + } + else + { T1 = sqrt(T0 * T0 + T3); T2 = CoxWL * T0 / T1; - } + } - Qsub0 = CoxWL * pParam->BSIM3k1ox * (T1 - T0); + Qsub0 = CoxWL * pParam->BSIM3k1ox * (T1 - T0); dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb); AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; + VdsatCV = Vgsteff / AbulkCV; - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + V4 = VdsatCV - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + VdseffCV = VdsatCV - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + dVdseffCV_dVg = T3; + dVdseffCV_dVd = T1; + dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ if (Vds == 0.0) { VdseffCV = 0.0; @@ -1822,10 +1822,10 @@ for (; model != NULL; model = model->BSIM3nextModel) dVdseffCV_dVb = 0.0; } - T0 = AbulkCV * VdseffCV; + T0 = AbulkCV * VdseffCV; T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; + T2 = VdseffCV / T1; + T3 = T0 * T2; T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); @@ -1836,109 +1836,109 @@ for (; model != NULL; model = model->BSIM3nextModel) Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; + + Cgg1 * dVgsteff_dVb; + Cgg1 *= dVgsteff_dVg; - T7 = 1.0 - AbulkCV; + T7 = 1.0 - AbulkCV; qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); + T4 = -T7 * (T4 - 1.0); + T5 = -T7 * T5; + T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; + + Cbg1 * dVgsteff_dVb; + Cbg1 *= dVgsteff_dVg; if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; + { /* 0/100 Charge petition model */ + T1 = T1 + T1; qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); + - T0 * T0 / T1); + T7 = (4.0 * Vgsteff - T0) / (T1 * T1); + T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); + T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; + + Csg * dVgsteff_dVb; + Csg *= dVgsteff_dVg; } - else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); + else if (model->BSIM3xpart < 0.5) + { /* 40/60 Charge petition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + T5 = (qsrc / T1 + T2 * T7) * AbulkCV; + T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); Csg = (T4 + T5 * dVdseffCV_dVg); Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; + + Csg * dVgsteff_dVb; + Csg *= dVgsteff_dVg; } - else - { /* 50/50 Charge petition model */ + else + { /* 50/50 Charge petition model */ qsrc = -0.5 * (qgate + qbulk); Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); } - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); + qgate += Qac0 + Qsub0; + qbulk -= (Qac0 + Qsub0); qdrn = -(qgate + qbulk + qsrc); - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQsub0_dVd + Cgd1; - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; + Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; + Cgd = dQsub0_dVd + Cgd1; + Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; here->BSIM3qinv = qinoi; - } + } /* New Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM3capMod == 3) - { V3 = pParam->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (pParam->BSIM3vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * pParam->BSIM3vfbzb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * pParam->BSIM3vfbzb); - T2 = DELTA_3 / T0; - } + else if (model->BSIM3capMod == 3) + { V3 = pParam->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; + if (pParam->BSIM3vfbzb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + T2 = -DELTA_3 / T0; + } + else + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + T2 = DELTA_3 / T0; + } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = pParam->BSIM3vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = pParam->BSIM3vfbzb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1 * dVbseffCV_dVb; Cox = model->BSIM3cox; Tox = 1.0e8 * model->BSIM3tox; @@ -1983,8 +1983,8 @@ for (; model != NULL; model = model->BSIM3nextModel) QovCox = Qac0 / Coxeff; dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; + dQac0_dVb = CoxWLcen * dVfbeff_dVb + + QovCox * dCoxeff_dVb; T0 = 0.5 * pParam->BSIM3k1ox; T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; @@ -2009,21 +2009,21 @@ for (; model != NULL; model = model->BSIM3nextModel) dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) + QovCox * dCoxeff_dVb; - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM3k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM3moin * Vtm; + /* Gate-bias dependent delta Phis begins */ + if (pParam->BSIM3k1ox <= 0.0) + { Denomi = 0.25 * pParam->BSIM3moin * Vtm; T0 = 0.5 * pParam->BSIM3sqrtPhi; - } - else - { Denomi = pParam->BSIM3moin * Vtm - * pParam->BSIM3k1ox * pParam->BSIM3k1ox; + } + else + { Denomi = pParam->BSIM3moin * Vtm + * pParam->BSIM3k1ox * pParam->BSIM3k1ox; T0 = pParam->BSIM3k1ox * pParam->BSIM3sqrtPhi; - } + } T1 = 2.0 * T0 + Vgsteff; - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - /* End of delta Phis */ + DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); + dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); + /* End of delta Phis */ /* VgDP = Vgsteff - DeltaPhi */ T0 = Vgsteff - DeltaPhi - 0.001; @@ -2054,19 +2054,19 @@ for (; model != NULL; model = model->BSIM3nextModel) dTcen_dVd *= dT0_dVd; dTcen_dVg *= dVgsteff_dVg; - Ccen = EPSSI / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / Cox; + Ccen = EPSSI / Tcen; + T0 = Cox / (Cox + Ccen); + Coxeff = T0 * Ccen; + T1 = -Ccen / Tcen; + dCoxeff_dVg = T0 * T0 * T1; + dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + CoxWLcen = CoxWL * Coxeff / Cox; - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = VgDP / AbulkCV; + AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; + VdsatCV = VgDP / AbulkCV; T0 = VdsatCV - Vds - DELTA_4; dT0_dVg = dVgDP_dVg / AbulkCV; dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; @@ -2099,22 +2099,22 @@ for (; model != NULL; model = model->BSIM3nextModel) } T0 = AbulkCV * VdseffCV; - T1 = VgDP; + T1 = VgDP; T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); T3 = T0 / T2; T4 = 1.0 - 12.0 * T3 * T3; T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; + T6 = T5 * VdseffCV / AbulkCV; qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * dVgDP_dVg - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + QovCox = qgate / Coxeff; + Cgg1 = CoxWLcen * (T4 * dVgDP_dVg + + T5 * dVdseffCV_dVg); + Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; T7 = 1.0 - AbulkCV; @@ -2124,95 +2124,95 @@ for (; model != NULL; model = model->BSIM3nextModel) T11 = -T7 * T5 / AbulkCV; T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); + QovCox = qbulk / Coxeff; + Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); + Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; if (model->BSIM3xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; + { /* 0/100 partition */ + qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 + - 0.5 * T0 * T0 / T2); + QovCox = qsrc / Coxeff; + T2 += T2; + T3 = T2 * T2; + T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV; - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd + + QovCox * dCoxeff_dVd; + Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; } - else if (model->BSIM3xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 + else if (model->BSIM3xpart < 0.5) + { /* 40/60 partition */ + T2 = T2 / 12.0; + T3 = 0.5 * CoxWLcen / (T2 * T2); + T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; + qsrc = -T3 * T4; + QovCox = qsrc / Coxeff; + T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; + T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 + * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T6 = AbulkCV * (qsrc / T2 + T3 * T8); + T7 = T6 * VdseffCV / AbulkCV; - Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; + Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd + + QovCox * dCoxeff_dVd; + Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb + + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; } - else - { /* 50/50 partition */ + else + { /* 50/50 partition */ qsrc = -0.5 * qgate; Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; + Csd = -0.5 * Cgd1; + Csb = -0.5 * Cgb1; } - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); + qgate += Qac0 + Qsub0 - qbulk; + qbulk -= (Qac0 + Qsub0); qdrn = -(qgate + qbulk + qsrc); - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; Cgg = Cgg1 - Cbg; Cgd = Cgd1 - Cbd; Cgb = Cgb1 - Cbb; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; here->BSIM3qinv = -qinoi; - } /* End of CTM */ + } /* End of CTM */ } -finished: - /* Returning Values to Calling Routine */ +finished: + /* Returning Values to Calling Routine */ /* * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE */ @@ -2223,150 +2223,150 @@ finished: here->BSIM3cd = cdrain; if (ChargeComputationNeeded) - { /* charge storage elements + { /* charge storage elements * bulk-drain and bulk-source depletion capacitances * czbd : zero bias drain junction capacitance * czbs : zero bias source junction capacitance * czbdsw: zero bias drain junction sidewall capacitance - along field oxide + along field oxide * czbssw: zero bias source junction sidewall capacitance - along field oxide - * czbdswg: zero bias drain junction sidewall capacitance - along gate side - * czbsswg: zero bias source junction sidewall capacitance - along gate side + along field oxide + * czbdswg: zero bias drain junction sidewall capacitance + along gate side + * czbsswg: zero bias source junction sidewall capacitance + along gate side */ czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3drainPerimeter; + { + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3drainPerimeter; czbdsw = 0.0; } else { - czbdsw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3drainPerimeter - pParam->BSIM3weff); - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; + czbdsw = model->BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3drainPerimeter - pParam->BSIM3weff); + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; } if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) { - czbssw = 0.0; - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3sourcePerimeter; + czbssw = 0.0; + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3sourcePerimeter; } else { - czbssw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; + czbssw = model->BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; } MJ = model->BSIM3bulkJctBotGradingCoeff; MJSW = model->BSIM3bulkJctSideGradingCoeff; - MJSWG = model->BSIM3bulkJctGateSideGradingCoeff; + MJSWG = model->BSIM3bulkJctGateSideGradingCoeff; /* Source Bulk Junction */ - if (vbs == 0.0) - { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; + if (vbs == 0.0) + { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; here->BSIM3capbs = czbs + czbssw + czbsswg; - } - else if (vbs < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiB; - if (MJ == 0.5) + } + else if (vbs < 0.0) + { if (czbs > 0.0) + { arg = 1.0 - vbs / model->BSIM3PhiB; + if (MJ == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbs) = model->BSIM3PhiB * czbs - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; - here->BSIM3capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiBSW; - if (MJSW == 0.5) + *(ckt->CKTstate0 + here->BSIM3qbs) = model->BSIM3PhiB * czbs + * (1.0 - arg * sarg) / (1.0 - MJ); + here->BSIM3capbs = czbs * sarg; + } + else + { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; + here->BSIM3capbs = 0.0; + } + if (czbssw > 0.0) + { arg = 1.0 - vbs / model->BSIM3PhiBSW; + if (MJSW == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSW * log(arg)); *(ckt->CKTstate0 + here->BSIM3qbs) += model->BSIM3PhiBSW * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSW); + * (1.0 - arg * sarg) / (1.0 - MJSW); here->BSIM3capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiBSWG; - if (MJSWG == 0.5) + } + if (czbsswg > 0.0) + { arg = 1.0 - vbs / model->BSIM3PhiBSWG; + if (MJSWG == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSWG * log(arg)); *(ckt->CKTstate0 + here->BSIM3qbs) += model->BSIM3PhiBSWG * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); + * (1.0 - arg * sarg) / (1.0 - MJSWG); here->BSIM3capbs += czbsswg * sarg; - } + } } - else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs * (czbs * MJ / model->BSIM3PhiB + czbssw * MJSW - / model->BSIM3PhiBSW + czbsswg * MJSWG / model->BSIM3PhiBSWG); + else + { T0 = czbs + czbssw + czbsswg; + T1 = vbs * (czbs * MJ / model->BSIM3PhiB + czbssw * MJSW + / model->BSIM3PhiBSW + czbsswg * MJSWG / model->BSIM3PhiBSWG); *(ckt->CKTstate0 + here->BSIM3qbs) = vbs * (T0 + 0.5 * T1); here->BSIM3capbs = T0 + T1; } /* Drain Bulk Junction */ - if (vbd == 0.0) - { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; + if (vbd == 0.0) + { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; here->BSIM3capbd = czbd + czbdsw + czbdswg; - } - else if (vbd < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiB; - if (MJ == 0.5) + } + else if (vbd < 0.0) + { if (czbd > 0.0) + { arg = 1.0 - vbd / model->BSIM3PhiB; + if (MJ == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbd) = model->BSIM3PhiB * czbd - * (1.0 - arg * sarg) / (1.0 - MJ); + *(ckt->CKTstate0 + here->BSIM3qbd) = model->BSIM3PhiB * czbd + * (1.0 - arg * sarg) / (1.0 - MJ); here->BSIM3capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; + } + else + { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; here->BSIM3capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiBSW; - if (MJSW == 0.5) + } + if (czbdsw > 0.0) + { arg = 1.0 - vbd / model->BSIM3PhiBSW; + if (MJSW == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSW * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSW); + *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSW * czbdsw + * (1.0 - arg * sarg) / (1.0 - MJSW); here->BSIM3capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiBSWG; - if (MJSWG == 0.5) + } + if (czbdswg > 0.0) + { arg = 1.0 - vbd / model->BSIM3PhiBSWG; + if (MJSWG == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSWG * log(arg)); *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSWG * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); + * (1.0 - arg * sarg) / (1.0 - MJSWG); here->BSIM3capbd += czbdswg * sarg; - } + } } - else - { T0 = czbd + czbdsw + czbdswg; + else + { T0 = czbd + czbdsw + czbdswg; T1 = vbd * (czbd * MJ / model->BSIM3PhiB + czbdsw * MJSW / model->BSIM3PhiBSW + czbdswg * MJSWG / model->BSIM3PhiBSWG); *(ckt->CKTstate0 + here->BSIM3qbd) = vbd * (T0 + 0.5 * T1); - here->BSIM3capbd = T0 + T1; + here->BSIM3capbd = T0 + T1; } } @@ -2374,11 +2374,11 @@ finished: * check convergence */ if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; + { if (Check == 1) + { ckt->CKTnoncon++; #ifndef NEWCONV - } - else + } + else { if (here->BSIM3mode >= 0) { Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; } @@ -2395,7 +2395,7 @@ finished: tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol; if (fabs(cbhat - Ibtot) > tol) - { ckt->CKTnoncon++; + { ckt->CKTnoncon++; } } #endif /* NEWCONV */ @@ -2410,7 +2410,7 @@ finished: /* bulk and channel charge plus overlaps */ if (!ChargeComputationNeeded) - goto line850; + goto line850; #ifndef NOBYPASS line755: #endif @@ -2427,71 +2427,71 @@ line755: gtau_drift = fabs(pParam->BSIM3tconst * qcheq) * ScalingFactor; T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; gtau_diff = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm / T0 - * ScalingFactor; + * ScalingFactor; here->BSIM3gtau = gtau_drift + gtau_diff; if (here->BSIM3acnqsMod) here->BSIM3taunet = ScalingFactor / here->BSIM3gtau; } - if (model->BSIM3capMod == 0) /* code merge -JX */ - { - cgdo = pParam->BSIM3cgdo; - qgdo = pParam->BSIM3cgdo * vgd; - cgso = pParam->BSIM3cgso; - qgso = pParam->BSIM3cgso * vgs; - } - else if (model->BSIM3capMod == 1) - { if (vgd < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3ckappa); - cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV - * pParam->BSIM3cgdl / T1; - qgdo = pParam->BSIM3cgdo * vgd - pParam->BSIM3weffCV * 0.5 - * pParam->BSIM3cgdl * pParam->BSIM3ckappa * (T1 - 1.0); - } - else - { cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV - * pParam->BSIM3cgdl; - qgdo = (pParam->BSIM3weffCV * pParam->BSIM3cgdl - + pParam->BSIM3cgdo) * vgd; - } + if (model->BSIM3capMod == 0) /* code merge -JX */ + { + cgdo = pParam->BSIM3cgdo; + qgdo = pParam->BSIM3cgdo * vgd; + cgso = pParam->BSIM3cgso; + qgso = pParam->BSIM3cgso * vgs; + } + else if (model->BSIM3capMod == 1) + { if (vgd < 0.0) + { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3ckappa); + cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV + * pParam->BSIM3cgdl / T1; + qgdo = pParam->BSIM3cgdo * vgd - pParam->BSIM3weffCV * 0.5 + * pParam->BSIM3cgdl * pParam->BSIM3ckappa * (T1 - 1.0); + } + else + { cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV + * pParam->BSIM3cgdl; + qgdo = (pParam->BSIM3weffCV * pParam->BSIM3cgdl + + pParam->BSIM3cgdo) * vgd; + } - if (vgs < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3ckappa); - cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV - * pParam->BSIM3cgsl / T1; - qgso = pParam->BSIM3cgso * vgs - pParam->BSIM3weffCV * 0.5 - * pParam->BSIM3cgsl * pParam->BSIM3ckappa * (T1 - 1.0); - } - else - { cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV - * pParam->BSIM3cgsl; - qgso = (pParam->BSIM3weffCV * pParam->BSIM3cgsl - + pParam->BSIM3cgso) * vgs; - } - } - else - { T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); + if (vgs < 0.0) + { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3ckappa); + cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV + * pParam->BSIM3cgsl / T1; + qgso = pParam->BSIM3cgso * vgs - pParam->BSIM3weffCV * 0.5 + * pParam->BSIM3cgsl * pParam->BSIM3ckappa * (T1 - 1.0); + } + else + { cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV + * pParam->BSIM3cgsl; + qgso = (pParam->BSIM3weffCV * pParam->BSIM3cgsl + + pParam->BSIM3cgso) * vgs; + } + } + else + { T0 = vgd + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3weffCV * pParam->BSIM3cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); - cgdo = pParam->BSIM3cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3cgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); + T3 = pParam->BSIM3weffCV * pParam->BSIM3cgdl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); + cgdo = pParam->BSIM3cgdo + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgdo = (pParam->BSIM3cgdo + T3) * vgd - T3 * (T2 + + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3weffCV * pParam->BSIM3cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); - cgso = pParam->BSIM3cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3cgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); - } + T0 = vgs + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + T3 = pParam->BSIM3weffCV * pParam->BSIM3cgsl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); + cgso = pParam->BSIM3cgso + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgso = (pParam->BSIM3cgso + T3) * vgs - T3 * (T2 + + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); + } here->BSIM3cgdo = cgdo; here->BSIM3cgso = cgso; @@ -2528,10 +2528,10 @@ line755: qsrc = -(qgate + qbulk + qdrn); ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; + sxpart = 0.6; dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; } else { if (qcheq > 0.0) @@ -2542,7 +2542,7 @@ line755: ggtd = here->BSIM3gtd = T0 * here->BSIM3cqdb; ggts = here->BSIM3gts = T0 * here->BSIM3cqsb; ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; - gqdef = ScalingFactor * ag0; + gqdef = ScalingFactor * ag0; gcqgb = here->BSIM3cqgb * ag0; gcqdb = here->BSIM3cqdb * ag0; @@ -2565,44 +2565,44 @@ line755: gcbdb = -here->BSIM3capbd * ag0; gcbsb = -here->BSIM3capbs * ag0; - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV + CoxWL = model->BSIM3cox * pParam->BSIM3weffCV * pParam->BSIM3leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = qdrn / qcheq; - Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM3xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = qdrn / qcheq; + Cdd = here->BSIM3cddb; + Csd = -(here->BSIM3cgdb + here->BSIM3cddb + + here->BSIM3cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM3cdgb; + Csg = -(here->BSIM3cggb + here->BSIM3cdgb + + here->BSIM3cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + Cds = here->BSIM3cdsb; + Css = -(here->BSIM3cgsb + here->BSIM3cdsb + + here->BSIM3cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); qgd = qgdo; qgs = qgso; @@ -2644,10 +2644,10 @@ line755: qdrn = -(qgate + qbulk + qsrc); ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; + sxpart = 0.4; dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; } else { if (qcheq > 0.0) @@ -2658,7 +2658,7 @@ line755: ggts = here->BSIM3gtd = T0 * here->BSIM3cqdb; ggtd = here->BSIM3gts = T0 * here->BSIM3cqsb; ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; - gqdef = ScalingFactor * ag0; + gqdef = ScalingFactor * ag0; gcqgb = here->BSIM3cqgb * ag0; gcqdb = here->BSIM3cqsb * ag0; @@ -2681,44 +2681,44 @@ line755: gcbdb = -here->BSIM3capbd * ag0; gcbsb = -here->BSIM3capbs * ag0; - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV + CoxWL = model->BSIM3cox * pParam->BSIM3weffCV * pParam->BSIM3leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = qdrn / qcheq; - Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM3xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = qdrn / qcheq; + Css = here->BSIM3cddb; + Cds = -(here->BSIM3cgdb + here->BSIM3cddb + + here->BSIM3cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM3cdgb; + Cdg = -(here->BSIM3cggb + here->BSIM3cdgb + + here->BSIM3cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + Csd = here->BSIM3cdsb; + Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb + + here->BSIM3cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); qgd = qgdo; qgs = qgso; @@ -2730,7 +2730,7 @@ line755: } } - cqdef = cqcheq = 0.0; + cqdef = cqcheq = 0.0; if (ByPass) goto line860; *(ckt->CKTstate0 + here->BSIM3qg) = qgate; @@ -2797,21 +2797,21 @@ line850: gcggb = gcgdb = gcgsb = 0.0; gcbgb = gcbdb = gcbsb = 0.0; - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; + gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; ggtg = ggtd = ggtb = ggts = 0.0; sxpart = (1.0 - (dxpart = (here->BSIM3mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; if (here->BSIM3nqsMod) - here->BSIM3gtau = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm + here->BSIM3gtau = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm / pParam->BSIM3leffCV / pParam->BSIM3leffCV - * ScalingFactor; - else + * ScalingFactor; + else here->BSIM3gtau = 0.0; goto line900; - + line860: /* evaluate equivalent charge current */ @@ -2826,9 +2826,9 @@ line860: if (here->BSIM3nqsMod) { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; ceqqg += T0; - T1 = qdef * here->BSIM3gtau; + T1 = qdef * here->BSIM3gtau; ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); + * vbd - ddxpart_dVs * vbs); cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef; cqcheq = *(ckt->CKTstate0 + here->BSIM3cqcheq) - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; @@ -2856,16 +2856,16 @@ line860: line900: if (here->BSIM3mode >= 0) - { Gm = here->BSIM3gm; + { Gm = here->BSIM3gm; Gmbs = here->BSIM3gmbs; FwdSum = Gm + Gmbs; RevSum = 0.0; cdreq = model->BSIM3type * (cdrain - here->BSIM3gds * vds - - Gm * vgs - Gmbs * vbs); + - Gm * vgs - Gmbs * vbs); - ceqbd = -model->BSIM3type * (here->BSIM3csub - - here->BSIM3gbds * vds - here->BSIM3gbgs * vgs - - here->BSIM3gbbs * vbs); + ceqbd = -model->BSIM3type * (here->BSIM3csub + - here->BSIM3gbds * vds - here->BSIM3gbgs * vgs + - here->BSIM3gbbs * vbs); ceqbs = 0.0; gbbdp = -here->BSIM3gbds; @@ -2881,17 +2881,17 @@ line900: gbspb = 0.0; gbspsp = 0.0; } - else - { Gm = -here->BSIM3gm; + else + { Gm = -here->BSIM3gm; Gmbs = -here->BSIM3gmbs; FwdSum = 0.0; RevSum = -(Gm + Gmbs); cdreq = -model->BSIM3type * (cdrain + here->BSIM3gds * vds + Gm * vgd + Gmbs * vbd); - ceqbs = -model->BSIM3type * (here->BSIM3csub - + here->BSIM3gbds * vds - here->BSIM3gbgs * vgd - - here->BSIM3gbbs * vbd); + ceqbs = -model->BSIM3type * (here->BSIM3csub + + here->BSIM3gbds * vds - here->BSIM3gbgs * vgd + - here->BSIM3gbbs * vbd); ceqbd = 0.0; gbbsp = -here->BSIM3gbds; @@ -2908,26 +2908,26 @@ line900: gbspdp = -(gbspg + gbspsp + gbspb); } - if (model->BSIM3type > 0) - { ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); + if (model->BSIM3type > 0) + { ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd); - /* + /* ceqqg = ceqqg; ceqqb = ceqqb; ceqqd = ceqqd; cqdef = cqdef; cqcheq = cqcheq; - */ - } - else - { ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); + */ + } + else + { ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd); ceqqg = -ceqqg; ceqqb = -ceqqb; ceqqd = -ceqqd; cqdef = -cqdef; cqcheq = -cqcheq; - } + } m = here->BSIM3m; #ifdef USE_OMP @@ -2935,7 +2935,7 @@ line900: here->BSIM3rhsB = m * (ceqbs + ceqbd + ceqqb); here->BSIM3rhsD = m * (ceqbd - cdreq - ceqqd); here->BSIM3rhsS = m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd); + + ceqqb + ceqqd); if (here->BSIM3nqsMod) here->BSIM3rhsQ = m * (cqcheq - cqdef); #else @@ -2943,7 +2943,7 @@ line900: (*(ckt->CKTrhs + here->BSIM3bNode) -= m * (ceqbs + ceqbd + ceqqb)); (*(ckt->CKTrhs + here->BSIM3dNodePrime) += m * (ceqbd - cdreq - ceqqd)); (*(ckt->CKTrhs + here->BSIM3sNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd)); + + ceqqb + ceqqd)); if (here->BSIM3nqsMod) *(ckt->CKTrhs + here->BSIM3qNode) += m * (cqcheq - cqdef); #endif @@ -2951,7 +2951,7 @@ line900: * load y matrix */ - T1 = qdef * here->BSIM3gtau; + T1 = qdef * here->BSIM3gtau; #ifdef USE_OMP here->BSIM3DdPt = m * here->BSIM3drainConductance; here->BSIM3GgPt = m * (gcggb - ggtg); @@ -2960,12 +2960,12 @@ line900: - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs); here->BSIM3DPdpPt = m * (here->BSIM3drainConductance + here->BSIM3gds + here->BSIM3gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp); + + RevSum + gcddb + dxpart * ggtd + + T1 * ddxpart_dVd + gbdpdp); here->BSIM3SPspPt = m * (here->BSIM3sourceConductance + here->BSIM3gds + here->BSIM3gbs + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp); + + T1 * dsxpart_dVs + gbspsp); here->BSIM3DdpPt = m * here->BSIM3drainConductance; here->BSIM3GbPt = m * (gcggb + gcgdb + gcgsb + ggtb); here->BSIM3GdpPt = m * (gcgdb - ggtd); @@ -2975,19 +2975,19 @@ line900: here->BSIM3BdpPt = m * (gcbdb - here->BSIM3gbd + gbbdp); here->BSIM3BspPt = m * (gcbsb - here->BSIM3gbs + gbbsp); here->BSIM3DPdPt = m * here->BSIM3drainConductance; - here->BSIM3DPgPt = m * (Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg); + here->BSIM3DPgPt = m * (Gm + gcdgb + dxpart * ggtg + + T1 * ddxpart_dVg + gbdpg); here->BSIM3DPbPt = m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb); + - T1 * ddxpart_dVb - gbdpb); here->BSIM3DPspPt = m * (here->BSIM3gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp); - here->BSIM3SPgPt = m * (gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg); + - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp); + here->BSIM3SPgPt = m * (gcsgb - Gm + sxpart * ggtg + + T1 * dsxpart_dVg + gbspg); here->BSIM3SPsPt = m * here->BSIM3sourceConductance; here->BSIM3SPbPt = m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb); + - T1 * dsxpart_dVb - gbspb); here->BSIM3SPdpPt = m * (here->BSIM3gds + RevSum - gcsdb - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp); @@ -3011,12 +3011,12 @@ line900: - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs)); (*(here->BSIM3DPdpPtr) += m * (here->BSIM3drainConductance + here->BSIM3gds + here->BSIM3gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp)); + + RevSum + gcddb + dxpart * ggtd + + T1 * ddxpart_dVd + gbdpdp)); (*(here->BSIM3SPspPtr) += m * (here->BSIM3sourceConductance + here->BSIM3gds + here->BSIM3gbs + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp)); + + T1 * dsxpart_dVs + gbspsp)); (*(here->BSIM3DdpPtr) -= m * here->BSIM3drainConductance); (*(here->BSIM3GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); (*(here->BSIM3GdpPtr) += m * (gcgdb - ggtd)); @@ -3026,19 +3026,19 @@ line900: (*(here->BSIM3BdpPtr) += m * (gcbdb - here->BSIM3gbd + gbbdp)); (*(here->BSIM3BspPtr) += m * (gcbsb - here->BSIM3gbs + gbbsp)); (*(here->BSIM3DPdPtr) -= m * here->BSIM3drainConductance); - (*(here->BSIM3DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg)); + (*(here->BSIM3DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg + + T1 * ddxpart_dVg + gbdpg)); (*(here->BSIM3DPbPtr) -= m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb)); + - T1 * ddxpart_dVb - gbdpb)); (*(here->BSIM3DPspPtr) -= m * (here->BSIM3gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); - (*(here->BSIM3SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg)); + - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); + (*(here->BSIM3SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg + + T1 * dsxpart_dVg + gbspg)); (*(here->BSIM3SPsPtr) -= m * here->BSIM3sourceConductance); (*(here->BSIM3SPbPtr) -= m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb)); + - T1 * dsxpart_dVb - gbspb)); (*(here->BSIM3SPdpPtr) -= m * (here->BSIM3gds + RevSum - gcsdb - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); diff --git a/src/spicelib/devices/bsim3/b3par.c b/src/spicelib/devices/bsim3/b3par.c index 555376443..7ca78cd0e 100644 --- a/src/spicelib/devices/bsim3/b3par.c +++ b/src/spicelib/devices/bsim3/b3par.c @@ -31,7 +31,7 @@ IFvalue *select) if (!cp_getvar("scale", CP_REAL, &scale)) scale = 1; - switch(param) + switch(param) { case BSIM3_W: here->BSIM3w = value->rValue*scale; here->BSIM3wGiven = TRUE; @@ -40,10 +40,10 @@ IFvalue *select) here->BSIM3l = value->rValue*scale; here->BSIM3lGiven = TRUE; break; - case BSIM3_M: - here->BSIM3m = value->rValue; - here->BSIM3mGiven = TRUE; - break; + case BSIM3_M: + here->BSIM3m = value->rValue; + here->BSIM3mGiven = TRUE; + break; case BSIM3_AS: here->BSIM3sourceArea = value->rValue*scale*scale; here->BSIM3sourceAreaGiven = TRUE; diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 857e85395..44d5e5ce3 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -906,7 +906,7 @@ BSIM3instance **InstArray; here->BSIM3m = 1; /* process drain series resistance */ - if ((model->BSIM3sheetResistance > 0.0) && + if ((model->BSIM3sheetResistance > 0.0) && (here->BSIM3drainSquares > 0.0 )) { if(here->BSIM3dNodePrime == 0) { @@ -928,7 +928,7 @@ BSIM3instance **InstArray; } /* process source series resistance */ - if ((model->BSIM3sheetResistance > 0.0) && + if ((model->BSIM3sheetResistance > 0.0) && (here->BSIM3sourceSquares > 0.0 )) { if(here->BSIM3sNodePrime == 0) { diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 9ac4d396b..62783d74c 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -3,7 +3,7 @@ /********** * Copyright 2004 Regents of the University of California. All rights reserved. * File: b3temp.c of BSIM3v3.3.0 - * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi **********/ @@ -45,135 +45,135 @@ int Size_Not_Found; /* loop through all the BSIM3 device models */ for (; model != NULL; model = model->BSIM3nextModel) { Temp = ckt->CKTtemp; - if (model->BSIM3bulkJctPotential < 0.1) - { model->BSIM3bulkJctPotential = 0.1; - fprintf(stderr, "Given pb is less than 0.1. Pb is set to 0.1.\n"); - } + if (model->BSIM3bulkJctPotential < 0.1) + { model->BSIM3bulkJctPotential = 0.1; + fprintf(stderr, "Given pb is less than 0.1. Pb is set to 0.1.\n"); + } if (model->BSIM3sidewallJctPotential < 0.1) - { model->BSIM3sidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); - } + { model->BSIM3sidewallJctPotential = 0.1; + fprintf(stderr, "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); + } if (model->BSIM3GatesidewallJctPotential < 0.1) - { model->BSIM3GatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); - } + { model->BSIM3GatesidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); + } model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + pLastKnot = NULL; - Tnom = model->BSIM3tnom; - TRatio = Temp / Tnom; + Tnom = model->BSIM3tnom; + TRatio = Temp / Tnom; - model->BSIM3vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM3vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->BSIM3factor1 = sqrt(EPSSI / EPSOX * model->BSIM3tox); Vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) + ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); model->BSIM3vtm = KboQ * Temp; Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM3vtm + model->BSIM3jctTempExponent - * log(Temp / Tnom); - T1 = exp(T0 / model->BSIM3jctEmissionCoeff); - model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity - * T1; - model->BSIM3jctSidewallTempSatCurDensity - = model->BSIM3jctSidewallSatCurDensity * T1; - } - else - { model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity; - model->BSIM3jctSidewallTempSatCurDensity - = model->BSIM3jctSidewallSatCurDensity; - } + if (Temp != Tnom) + { T0 = Eg0 / Vtm0 - Eg / model->BSIM3vtm + model->BSIM3jctTempExponent + * log(Temp / Tnom); + T1 = exp(T0 / model->BSIM3jctEmissionCoeff); + model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity + * T1; + model->BSIM3jctSidewallTempSatCurDensity + = model->BSIM3jctSidewallSatCurDensity * T1; + } + else + { model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity; + model->BSIM3jctSidewallTempSatCurDensity + = model->BSIM3jctSidewallSatCurDensity; + } - if (model->BSIM3jctTempSatCurDensity < 0.0) - model->BSIM3jctTempSatCurDensity = 0.0; - if (model->BSIM3jctSidewallTempSatCurDensity < 0.0) - model->BSIM3jctSidewallTempSatCurDensity = 0.0; + if (model->BSIM3jctTempSatCurDensity < 0.0) + model->BSIM3jctTempSatCurDensity = 0.0; + if (model->BSIM3jctSidewallTempSatCurDensity < 0.0) + model->BSIM3jctSidewallTempSatCurDensity = 0.0; - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM3tnom; - T0 = model->BSIM3tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitAreaTempJctCap = model->BSIM3unitAreaJctCap * (1.0 + T0); - } - else if (model->BSIM3unitAreaJctCap > 0.0) - { model->BSIM3unitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); - } + /* Temperature dependence of D/B and S/B diode capacitance begins */ + delTemp = ckt->CKTtemp - model->BSIM3tnom; + T0 = model->BSIM3tcj * delTemp; + if (T0 >= -1.0) + { model->BSIM3unitAreaTempJctCap = model->BSIM3unitAreaJctCap * (1.0 + T0); + } + else if (model->BSIM3unitAreaJctCap > 0.0) + { model->BSIM3unitAreaTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); + } T0 = model->BSIM3tcjsw * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitLengthSidewallTempJctCap = model->BSIM3unitLengthSidewallJctCap * (1.0 + T0); - } - else if (model->BSIM3unitLengthSidewallJctCap > 0.0) - { model->BSIM3unitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); - } + if (T0 >= -1.0) + { model->BSIM3unitLengthSidewallTempJctCap = model->BSIM3unitLengthSidewallJctCap * (1.0 + T0); + } + else if (model->BSIM3unitLengthSidewallJctCap > 0.0) + { model->BSIM3unitLengthSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); + } T0 = model->BSIM3tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitLengthGateSidewallTempJctCap = model->BSIM3unitLengthGateSidewallJctCap * (1.0 + T0); - } - else if (model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { model->BSIM3unitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); - } + if (T0 >= -1.0) + { model->BSIM3unitLengthGateSidewallTempJctCap = model->BSIM3unitLengthGateSidewallJctCap * (1.0 + T0); + } + else if (model->BSIM3unitLengthGateSidewallJctCap > 0.0) + { model->BSIM3unitLengthGateSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); + } model->BSIM3PhiB = model->BSIM3bulkJctPotential - - model->BSIM3tpb * delTemp; + - model->BSIM3tpb * delTemp; if (model->BSIM3PhiB < 0.01) - { model->BSIM3PhiB = 0.01; - fprintf(stderr, "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); - } + { model->BSIM3PhiB = 0.01; + fprintf(stderr, "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); + } model->BSIM3PhiBSW = model->BSIM3sidewallJctPotential - model->BSIM3tpbsw * delTemp; if (model->BSIM3PhiBSW <= 0.01) - { model->BSIM3PhiBSW = 0.01; - fprintf(stderr, "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); - } - model->BSIM3PhiBSWG = model->BSIM3GatesidewallJctPotential + { model->BSIM3PhiBSW = 0.01; + fprintf(stderr, "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); + } + model->BSIM3PhiBSWG = model->BSIM3GatesidewallJctPotential - model->BSIM3tpbswg * delTemp; if (model->BSIM3PhiBSWG <= 0.01) - { model->BSIM3PhiBSWG = 0.01; - fprintf(stderr, "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); - } + { model->BSIM3PhiBSWG = 0.01; + fprintf(stderr, "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); + } /* End of junction capacitance */ /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ + /* MCJ: Length and Width not initialized */ for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { + here = here->BSIM3nextInstance) + { pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3l == pSizeDependParamKnot->Length) - && (here->BSIM3w == pSizeDependParamKnot->Width)) + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->BSIM3l == pSizeDependParamKnot->Length) + && (here->BSIM3w == pSizeDependParamKnot->Width)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /*bug-fix */ + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim3SizeDependParam, 1); + if (Size_Not_Found) + { pParam = TMALLOC(struct bsim3SizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; - Ldrn = here->BSIM3l; - Wdrn = here->BSIM3w; + Ldrn = here->BSIM3l; + Wdrn = here->BSIM3w; pParam->Length = Ldrn; pParam->Width = Wdrn; - + T0 = pow(Ldrn, model->BSIM3Lln); T1 = pow(Wdrn, model->BSIM3Lwn); tmp1 = model->BSIM3Ll / T0 + model->BSIM3Lw / T1 @@ -194,7 +194,7 @@ int Size_Not_Found; pParam->BSIM3leff = here->BSIM3l - 2.0 * pParam->BSIM3dl; if (pParam->BSIM3leff <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM3modName; namarray[1] = here->BSIM3name; SPfrontEnd->IFerror (ERR_FATAL, @@ -205,7 +205,7 @@ int Size_Not_Found; pParam->BSIM3weff = here->BSIM3w - 2.0 * pParam->BSIM3dw; if (pParam->BSIM3weff <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM3modName; namarray[1] = here->BSIM3name; SPfrontEnd->IFerror (ERR_FATAL, @@ -216,7 +216,7 @@ int Size_Not_Found; pParam->BSIM3leffCV = here->BSIM3l - 2.0 * pParam->BSIM3dlc; if (pParam->BSIM3leffCV <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM3modName; namarray[1] = here->BSIM3name; SPfrontEnd->IFerror (ERR_FATAL, @@ -227,7 +227,7 @@ int Size_Not_Found; pParam->BSIM3weffCV = here->BSIM3w - 2.0 * pParam->BSIM3dwc; if (pParam->BSIM3weffCV <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM3modName; namarray[1] = here->BSIM3name; SPfrontEnd->IFerror (ERR_FATAL, @@ -237,339 +237,339 @@ int Size_Not_Found; } - if (model->BSIM3binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3leff; - Inv_W = 1.0e-6 / pParam->BSIM3weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3leff - * pParam->BSIM3weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3leff; - Inv_W = 1.0 / pParam->BSIM3weff; - Inv_LW = 1.0 / (pParam->BSIM3leff - * pParam->BSIM3weff); - } - pParam->BSIM3cdsc = model->BSIM3cdsc - + model->BSIM3lcdsc * Inv_L - + model->BSIM3wcdsc * Inv_W - + model->BSIM3pcdsc * Inv_LW; - pParam->BSIM3cdscb = model->BSIM3cdscb - + model->BSIM3lcdscb * Inv_L - + model->BSIM3wcdscb * Inv_W - + model->BSIM3pcdscb * Inv_LW; - - pParam->BSIM3cdscd = model->BSIM3cdscd - + model->BSIM3lcdscd * Inv_L - + model->BSIM3wcdscd * Inv_W - + model->BSIM3pcdscd * Inv_LW; - - pParam->BSIM3cit = model->BSIM3cit - + model->BSIM3lcit * Inv_L - + model->BSIM3wcit * Inv_W - + model->BSIM3pcit * Inv_LW; - pParam->BSIM3nfactor = model->BSIM3nfactor - + model->BSIM3lnfactor * Inv_L - + model->BSIM3wnfactor * Inv_W - + model->BSIM3pnfactor * Inv_LW; - pParam->BSIM3xj = model->BSIM3xj - + model->BSIM3lxj * Inv_L - + model->BSIM3wxj * Inv_W - + model->BSIM3pxj * Inv_LW; - pParam->BSIM3vsat = model->BSIM3vsat - + model->BSIM3lvsat * Inv_L - + model->BSIM3wvsat * Inv_W - + model->BSIM3pvsat * Inv_LW; - pParam->BSIM3at = model->BSIM3at - + model->BSIM3lat * Inv_L - + model->BSIM3wat * Inv_W - + model->BSIM3pat * Inv_LW; - pParam->BSIM3a0 = model->BSIM3a0 - + model->BSIM3la0 * Inv_L - + model->BSIM3wa0 * Inv_W - + model->BSIM3pa0 * Inv_LW; - - pParam->BSIM3ags = model->BSIM3ags - + model->BSIM3lags * Inv_L - + model->BSIM3wags * Inv_W - + model->BSIM3pags * Inv_LW; - - pParam->BSIM3a1 = model->BSIM3a1 - + model->BSIM3la1 * Inv_L - + model->BSIM3wa1 * Inv_W - + model->BSIM3pa1 * Inv_LW; - pParam->BSIM3a2 = model->BSIM3a2 - + model->BSIM3la2 * Inv_L - + model->BSIM3wa2 * Inv_W - + model->BSIM3pa2 * Inv_LW; - pParam->BSIM3keta = model->BSIM3keta - + model->BSIM3lketa * Inv_L - + model->BSIM3wketa * Inv_W - + model->BSIM3pketa * Inv_LW; - pParam->BSIM3nsub = model->BSIM3nsub - + model->BSIM3lnsub * Inv_L - + model->BSIM3wnsub * Inv_W - + model->BSIM3pnsub * Inv_LW; - pParam->BSIM3npeak = model->BSIM3npeak - + model->BSIM3lnpeak * Inv_L - + model->BSIM3wnpeak * Inv_W - + model->BSIM3pnpeak * Inv_LW; - pParam->BSIM3ngate = model->BSIM3ngate - + model->BSIM3lngate * Inv_L - + model->BSIM3wngate * Inv_W - + model->BSIM3pngate * Inv_LW; - pParam->BSIM3gamma1 = model->BSIM3gamma1 - + model->BSIM3lgamma1 * Inv_L - + model->BSIM3wgamma1 * Inv_W - + model->BSIM3pgamma1 * Inv_LW; - pParam->BSIM3gamma2 = model->BSIM3gamma2 - + model->BSIM3lgamma2 * Inv_L - + model->BSIM3wgamma2 * Inv_W - + model->BSIM3pgamma2 * Inv_LW; - pParam->BSIM3vbx = model->BSIM3vbx - + model->BSIM3lvbx * Inv_L - + model->BSIM3wvbx * Inv_W - + model->BSIM3pvbx * Inv_LW; - pParam->BSIM3vbm = model->BSIM3vbm - + model->BSIM3lvbm * Inv_L - + model->BSIM3wvbm * Inv_W - + model->BSIM3pvbm * Inv_LW; - pParam->BSIM3xt = model->BSIM3xt - + model->BSIM3lxt * Inv_L - + model->BSIM3wxt * Inv_W - + model->BSIM3pxt * Inv_LW; + if (model->BSIM3binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM3leff; + Inv_W = 1.0e-6 / pParam->BSIM3weff; + Inv_LW = 1.0e-12 / (pParam->BSIM3leff + * pParam->BSIM3weff); + } + else + { Inv_L = 1.0 / pParam->BSIM3leff; + Inv_W = 1.0 / pParam->BSIM3weff; + Inv_LW = 1.0 / (pParam->BSIM3leff + * pParam->BSIM3weff); + } + pParam->BSIM3cdsc = model->BSIM3cdsc + + model->BSIM3lcdsc * Inv_L + + model->BSIM3wcdsc * Inv_W + + model->BSIM3pcdsc * Inv_LW; + pParam->BSIM3cdscb = model->BSIM3cdscb + + model->BSIM3lcdscb * Inv_L + + model->BSIM3wcdscb * Inv_W + + model->BSIM3pcdscb * Inv_LW; + + pParam->BSIM3cdscd = model->BSIM3cdscd + + model->BSIM3lcdscd * Inv_L + + model->BSIM3wcdscd * Inv_W + + model->BSIM3pcdscd * Inv_LW; + + pParam->BSIM3cit = model->BSIM3cit + + model->BSIM3lcit * Inv_L + + model->BSIM3wcit * Inv_W + + model->BSIM3pcit * Inv_LW; + pParam->BSIM3nfactor = model->BSIM3nfactor + + model->BSIM3lnfactor * Inv_L + + model->BSIM3wnfactor * Inv_W + + model->BSIM3pnfactor * Inv_LW; + pParam->BSIM3xj = model->BSIM3xj + + model->BSIM3lxj * Inv_L + + model->BSIM3wxj * Inv_W + + model->BSIM3pxj * Inv_LW; + pParam->BSIM3vsat = model->BSIM3vsat + + model->BSIM3lvsat * Inv_L + + model->BSIM3wvsat * Inv_W + + model->BSIM3pvsat * Inv_LW; + pParam->BSIM3at = model->BSIM3at + + model->BSIM3lat * Inv_L + + model->BSIM3wat * Inv_W + + model->BSIM3pat * Inv_LW; + pParam->BSIM3a0 = model->BSIM3a0 + + model->BSIM3la0 * Inv_L + + model->BSIM3wa0 * Inv_W + + model->BSIM3pa0 * Inv_LW; + + pParam->BSIM3ags = model->BSIM3ags + + model->BSIM3lags * Inv_L + + model->BSIM3wags * Inv_W + + model->BSIM3pags * Inv_LW; + + pParam->BSIM3a1 = model->BSIM3a1 + + model->BSIM3la1 * Inv_L + + model->BSIM3wa1 * Inv_W + + model->BSIM3pa1 * Inv_LW; + pParam->BSIM3a2 = model->BSIM3a2 + + model->BSIM3la2 * Inv_L + + model->BSIM3wa2 * Inv_W + + model->BSIM3pa2 * Inv_LW; + pParam->BSIM3keta = model->BSIM3keta + + model->BSIM3lketa * Inv_L + + model->BSIM3wketa * Inv_W + + model->BSIM3pketa * Inv_LW; + pParam->BSIM3nsub = model->BSIM3nsub + + model->BSIM3lnsub * Inv_L + + model->BSIM3wnsub * Inv_W + + model->BSIM3pnsub * Inv_LW; + pParam->BSIM3npeak = model->BSIM3npeak + + model->BSIM3lnpeak * Inv_L + + model->BSIM3wnpeak * Inv_W + + model->BSIM3pnpeak * Inv_LW; + pParam->BSIM3ngate = model->BSIM3ngate + + model->BSIM3lngate * Inv_L + + model->BSIM3wngate * Inv_W + + model->BSIM3pngate * Inv_LW; + pParam->BSIM3gamma1 = model->BSIM3gamma1 + + model->BSIM3lgamma1 * Inv_L + + model->BSIM3wgamma1 * Inv_W + + model->BSIM3pgamma1 * Inv_LW; + pParam->BSIM3gamma2 = model->BSIM3gamma2 + + model->BSIM3lgamma2 * Inv_L + + model->BSIM3wgamma2 * Inv_W + + model->BSIM3pgamma2 * Inv_LW; + pParam->BSIM3vbx = model->BSIM3vbx + + model->BSIM3lvbx * Inv_L + + model->BSIM3wvbx * Inv_W + + model->BSIM3pvbx * Inv_LW; + pParam->BSIM3vbm = model->BSIM3vbm + + model->BSIM3lvbm * Inv_L + + model->BSIM3wvbm * Inv_W + + model->BSIM3pvbm * Inv_LW; + pParam->BSIM3xt = model->BSIM3xt + + model->BSIM3lxt * Inv_L + + model->BSIM3wxt * Inv_W + + model->BSIM3pxt * Inv_LW; pParam->BSIM3vfb = model->BSIM3vfb + model->BSIM3lvfb * Inv_L + model->BSIM3wvfb * Inv_W + model->BSIM3pvfb * Inv_LW; - pParam->BSIM3k1 = model->BSIM3k1 - + model->BSIM3lk1 * Inv_L - + model->BSIM3wk1 * Inv_W - + model->BSIM3pk1 * Inv_LW; - pParam->BSIM3kt1 = model->BSIM3kt1 - + model->BSIM3lkt1 * Inv_L - + model->BSIM3wkt1 * Inv_W - + model->BSIM3pkt1 * Inv_LW; - pParam->BSIM3kt1l = model->BSIM3kt1l - + model->BSIM3lkt1l * Inv_L - + model->BSIM3wkt1l * Inv_W - + model->BSIM3pkt1l * Inv_LW; - pParam->BSIM3k2 = model->BSIM3k2 - + model->BSIM3lk2 * Inv_L - + model->BSIM3wk2 * Inv_W - + model->BSIM3pk2 * Inv_LW; - pParam->BSIM3kt2 = model->BSIM3kt2 - + model->BSIM3lkt2 * Inv_L - + model->BSIM3wkt2 * Inv_W - + model->BSIM3pkt2 * Inv_LW; - pParam->BSIM3k3 = model->BSIM3k3 - + model->BSIM3lk3 * Inv_L - + model->BSIM3wk3 * Inv_W - + model->BSIM3pk3 * Inv_LW; - pParam->BSIM3k3b = model->BSIM3k3b - + model->BSIM3lk3b * Inv_L - + model->BSIM3wk3b * Inv_W - + model->BSIM3pk3b * Inv_LW; - pParam->BSIM3w0 = model->BSIM3w0 - + model->BSIM3lw0 * Inv_L - + model->BSIM3ww0 * Inv_W - + model->BSIM3pw0 * Inv_LW; - pParam->BSIM3nlx = model->BSIM3nlx - + model->BSIM3lnlx * Inv_L - + model->BSIM3wnlx * Inv_W - + model->BSIM3pnlx * Inv_LW; - pParam->BSIM3dvt0 = model->BSIM3dvt0 - + model->BSIM3ldvt0 * Inv_L - + model->BSIM3wdvt0 * Inv_W - + model->BSIM3pdvt0 * Inv_LW; - pParam->BSIM3dvt1 = model->BSIM3dvt1 - + model->BSIM3ldvt1 * Inv_L - + model->BSIM3wdvt1 * Inv_W - + model->BSIM3pdvt1 * Inv_LW; - pParam->BSIM3dvt2 = model->BSIM3dvt2 - + model->BSIM3ldvt2 * Inv_L - + model->BSIM3wdvt2 * Inv_W - + model->BSIM3pdvt2 * Inv_LW; - pParam->BSIM3dvt0w = model->BSIM3dvt0w - + model->BSIM3ldvt0w * Inv_L - + model->BSIM3wdvt0w * Inv_W - + model->BSIM3pdvt0w * Inv_LW; - pParam->BSIM3dvt1w = model->BSIM3dvt1w - + model->BSIM3ldvt1w * Inv_L - + model->BSIM3wdvt1w * Inv_W - + model->BSIM3pdvt1w * Inv_LW; - pParam->BSIM3dvt2w = model->BSIM3dvt2w - + model->BSIM3ldvt2w * Inv_L - + model->BSIM3wdvt2w * Inv_W - + model->BSIM3pdvt2w * Inv_LW; - pParam->BSIM3drout = model->BSIM3drout - + model->BSIM3ldrout * Inv_L - + model->BSIM3wdrout * Inv_W - + model->BSIM3pdrout * Inv_LW; - pParam->BSIM3dsub = model->BSIM3dsub - + model->BSIM3ldsub * Inv_L - + model->BSIM3wdsub * Inv_W - + model->BSIM3pdsub * Inv_LW; - pParam->BSIM3vth0 = model->BSIM3vth0 - + model->BSIM3lvth0 * Inv_L - + model->BSIM3wvth0 * Inv_W - + model->BSIM3pvth0 * Inv_LW; - pParam->BSIM3ua = model->BSIM3ua - + model->BSIM3lua * Inv_L - + model->BSIM3wua * Inv_W - + model->BSIM3pua * Inv_LW; - pParam->BSIM3ua1 = model->BSIM3ua1 - + model->BSIM3lua1 * Inv_L - + model->BSIM3wua1 * Inv_W - + model->BSIM3pua1 * Inv_LW; - pParam->BSIM3ub = model->BSIM3ub - + model->BSIM3lub * Inv_L - + model->BSIM3wub * Inv_W - + model->BSIM3pub * Inv_LW; - pParam->BSIM3ub1 = model->BSIM3ub1 - + model->BSIM3lub1 * Inv_L - + model->BSIM3wub1 * Inv_W - + model->BSIM3pub1 * Inv_LW; - pParam->BSIM3uc = model->BSIM3uc - + model->BSIM3luc * Inv_L - + model->BSIM3wuc * Inv_W - + model->BSIM3puc * Inv_LW; - pParam->BSIM3uc1 = model->BSIM3uc1 - + model->BSIM3luc1 * Inv_L - + model->BSIM3wuc1 * Inv_W - + model->BSIM3puc1 * Inv_LW; - pParam->BSIM3u0 = model->BSIM3u0 - + model->BSIM3lu0 * Inv_L - + model->BSIM3wu0 * Inv_W - + model->BSIM3pu0 * Inv_LW; - pParam->BSIM3ute = model->BSIM3ute - + model->BSIM3lute * Inv_L - + model->BSIM3wute * Inv_W - + model->BSIM3pute * Inv_LW; - pParam->BSIM3voff = model->BSIM3voff - + model->BSIM3lvoff * Inv_L - + model->BSIM3wvoff * Inv_W - + model->BSIM3pvoff * Inv_LW; - pParam->BSIM3delta = model->BSIM3delta - + model->BSIM3ldelta * Inv_L - + model->BSIM3wdelta * Inv_W - + model->BSIM3pdelta * Inv_LW; - pParam->BSIM3rdsw = model->BSIM3rdsw - + model->BSIM3lrdsw * Inv_L - + model->BSIM3wrdsw * Inv_W - + model->BSIM3prdsw * Inv_LW; - pParam->BSIM3prwg = model->BSIM3prwg - + model->BSIM3lprwg * Inv_L - + model->BSIM3wprwg * Inv_W - + model->BSIM3pprwg * Inv_LW; - pParam->BSIM3prwb = model->BSIM3prwb - + model->BSIM3lprwb * Inv_L - + model->BSIM3wprwb * Inv_W - + model->BSIM3pprwb * Inv_LW; - pParam->BSIM3prt = model->BSIM3prt - + model->BSIM3lprt * Inv_L - + model->BSIM3wprt * Inv_W - + model->BSIM3pprt * Inv_LW; - pParam->BSIM3eta0 = model->BSIM3eta0 - + model->BSIM3leta0 * Inv_L - + model->BSIM3weta0 * Inv_W - + model->BSIM3peta0 * Inv_LW; - pParam->BSIM3etab = model->BSIM3etab - + model->BSIM3letab * Inv_L - + model->BSIM3wetab * Inv_W - + model->BSIM3petab * Inv_LW; - pParam->BSIM3pclm = model->BSIM3pclm - + model->BSIM3lpclm * Inv_L - + model->BSIM3wpclm * Inv_W - + model->BSIM3ppclm * Inv_LW; - pParam->BSIM3pdibl1 = model->BSIM3pdibl1 - + model->BSIM3lpdibl1 * Inv_L - + model->BSIM3wpdibl1 * Inv_W - + model->BSIM3ppdibl1 * Inv_LW; - pParam->BSIM3pdibl2 = model->BSIM3pdibl2 - + model->BSIM3lpdibl2 * Inv_L - + model->BSIM3wpdibl2 * Inv_W - + model->BSIM3ppdibl2 * Inv_LW; - pParam->BSIM3pdiblb = model->BSIM3pdiblb - + model->BSIM3lpdiblb * Inv_L - + model->BSIM3wpdiblb * Inv_W - + model->BSIM3ppdiblb * Inv_LW; - pParam->BSIM3pscbe1 = model->BSIM3pscbe1 - + model->BSIM3lpscbe1 * Inv_L - + model->BSIM3wpscbe1 * Inv_W - + model->BSIM3ppscbe1 * Inv_LW; - pParam->BSIM3pscbe2 = model->BSIM3pscbe2 - + model->BSIM3lpscbe2 * Inv_L - + model->BSIM3wpscbe2 * Inv_W - + model->BSIM3ppscbe2 * Inv_LW; - pParam->BSIM3pvag = model->BSIM3pvag - + model->BSIM3lpvag * Inv_L - + model->BSIM3wpvag * Inv_W - + model->BSIM3ppvag * Inv_LW; - pParam->BSIM3wr = model->BSIM3wr - + model->BSIM3lwr * Inv_L - + model->BSIM3wwr * Inv_W - + model->BSIM3pwr * Inv_LW; - pParam->BSIM3dwg = model->BSIM3dwg - + model->BSIM3ldwg * Inv_L - + model->BSIM3wdwg * Inv_W - + model->BSIM3pdwg * Inv_LW; - pParam->BSIM3dwb = model->BSIM3dwb - + model->BSIM3ldwb * Inv_L - + model->BSIM3wdwb * Inv_W - + model->BSIM3pdwb * Inv_LW; - pParam->BSIM3b0 = model->BSIM3b0 - + model->BSIM3lb0 * Inv_L - + model->BSIM3wb0 * Inv_W - + model->BSIM3pb0 * Inv_LW; - pParam->BSIM3b1 = model->BSIM3b1 - + model->BSIM3lb1 * Inv_L - + model->BSIM3wb1 * Inv_W - + model->BSIM3pb1 * Inv_LW; - pParam->BSIM3alpha0 = model->BSIM3alpha0 - + model->BSIM3lalpha0 * Inv_L - + model->BSIM3walpha0 * Inv_W - + model->BSIM3palpha0 * Inv_LW; + pParam->BSIM3k1 = model->BSIM3k1 + + model->BSIM3lk1 * Inv_L + + model->BSIM3wk1 * Inv_W + + model->BSIM3pk1 * Inv_LW; + pParam->BSIM3kt1 = model->BSIM3kt1 + + model->BSIM3lkt1 * Inv_L + + model->BSIM3wkt1 * Inv_W + + model->BSIM3pkt1 * Inv_LW; + pParam->BSIM3kt1l = model->BSIM3kt1l + + model->BSIM3lkt1l * Inv_L + + model->BSIM3wkt1l * Inv_W + + model->BSIM3pkt1l * Inv_LW; + pParam->BSIM3k2 = model->BSIM3k2 + + model->BSIM3lk2 * Inv_L + + model->BSIM3wk2 * Inv_W + + model->BSIM3pk2 * Inv_LW; + pParam->BSIM3kt2 = model->BSIM3kt2 + + model->BSIM3lkt2 * Inv_L + + model->BSIM3wkt2 * Inv_W + + model->BSIM3pkt2 * Inv_LW; + pParam->BSIM3k3 = model->BSIM3k3 + + model->BSIM3lk3 * Inv_L + + model->BSIM3wk3 * Inv_W + + model->BSIM3pk3 * Inv_LW; + pParam->BSIM3k3b = model->BSIM3k3b + + model->BSIM3lk3b * Inv_L + + model->BSIM3wk3b * Inv_W + + model->BSIM3pk3b * Inv_LW; + pParam->BSIM3w0 = model->BSIM3w0 + + model->BSIM3lw0 * Inv_L + + model->BSIM3ww0 * Inv_W + + model->BSIM3pw0 * Inv_LW; + pParam->BSIM3nlx = model->BSIM3nlx + + model->BSIM3lnlx * Inv_L + + model->BSIM3wnlx * Inv_W + + model->BSIM3pnlx * Inv_LW; + pParam->BSIM3dvt0 = model->BSIM3dvt0 + + model->BSIM3ldvt0 * Inv_L + + model->BSIM3wdvt0 * Inv_W + + model->BSIM3pdvt0 * Inv_LW; + pParam->BSIM3dvt1 = model->BSIM3dvt1 + + model->BSIM3ldvt1 * Inv_L + + model->BSIM3wdvt1 * Inv_W + + model->BSIM3pdvt1 * Inv_LW; + pParam->BSIM3dvt2 = model->BSIM3dvt2 + + model->BSIM3ldvt2 * Inv_L + + model->BSIM3wdvt2 * Inv_W + + model->BSIM3pdvt2 * Inv_LW; + pParam->BSIM3dvt0w = model->BSIM3dvt0w + + model->BSIM3ldvt0w * Inv_L + + model->BSIM3wdvt0w * Inv_W + + model->BSIM3pdvt0w * Inv_LW; + pParam->BSIM3dvt1w = model->BSIM3dvt1w + + model->BSIM3ldvt1w * Inv_L + + model->BSIM3wdvt1w * Inv_W + + model->BSIM3pdvt1w * Inv_LW; + pParam->BSIM3dvt2w = model->BSIM3dvt2w + + model->BSIM3ldvt2w * Inv_L + + model->BSIM3wdvt2w * Inv_W + + model->BSIM3pdvt2w * Inv_LW; + pParam->BSIM3drout = model->BSIM3drout + + model->BSIM3ldrout * Inv_L + + model->BSIM3wdrout * Inv_W + + model->BSIM3pdrout * Inv_LW; + pParam->BSIM3dsub = model->BSIM3dsub + + model->BSIM3ldsub * Inv_L + + model->BSIM3wdsub * Inv_W + + model->BSIM3pdsub * Inv_LW; + pParam->BSIM3vth0 = model->BSIM3vth0 + + model->BSIM3lvth0 * Inv_L + + model->BSIM3wvth0 * Inv_W + + model->BSIM3pvth0 * Inv_LW; + pParam->BSIM3ua = model->BSIM3ua + + model->BSIM3lua * Inv_L + + model->BSIM3wua * Inv_W + + model->BSIM3pua * Inv_LW; + pParam->BSIM3ua1 = model->BSIM3ua1 + + model->BSIM3lua1 * Inv_L + + model->BSIM3wua1 * Inv_W + + model->BSIM3pua1 * Inv_LW; + pParam->BSIM3ub = model->BSIM3ub + + model->BSIM3lub * Inv_L + + model->BSIM3wub * Inv_W + + model->BSIM3pub * Inv_LW; + pParam->BSIM3ub1 = model->BSIM3ub1 + + model->BSIM3lub1 * Inv_L + + model->BSIM3wub1 * Inv_W + + model->BSIM3pub1 * Inv_LW; + pParam->BSIM3uc = model->BSIM3uc + + model->BSIM3luc * Inv_L + + model->BSIM3wuc * Inv_W + + model->BSIM3puc * Inv_LW; + pParam->BSIM3uc1 = model->BSIM3uc1 + + model->BSIM3luc1 * Inv_L + + model->BSIM3wuc1 * Inv_W + + model->BSIM3puc1 * Inv_LW; + pParam->BSIM3u0 = model->BSIM3u0 + + model->BSIM3lu0 * Inv_L + + model->BSIM3wu0 * Inv_W + + model->BSIM3pu0 * Inv_LW; + pParam->BSIM3ute = model->BSIM3ute + + model->BSIM3lute * Inv_L + + model->BSIM3wute * Inv_W + + model->BSIM3pute * Inv_LW; + pParam->BSIM3voff = model->BSIM3voff + + model->BSIM3lvoff * Inv_L + + model->BSIM3wvoff * Inv_W + + model->BSIM3pvoff * Inv_LW; + pParam->BSIM3delta = model->BSIM3delta + + model->BSIM3ldelta * Inv_L + + model->BSIM3wdelta * Inv_W + + model->BSIM3pdelta * Inv_LW; + pParam->BSIM3rdsw = model->BSIM3rdsw + + model->BSIM3lrdsw * Inv_L + + model->BSIM3wrdsw * Inv_W + + model->BSIM3prdsw * Inv_LW; + pParam->BSIM3prwg = model->BSIM3prwg + + model->BSIM3lprwg * Inv_L + + model->BSIM3wprwg * Inv_W + + model->BSIM3pprwg * Inv_LW; + pParam->BSIM3prwb = model->BSIM3prwb + + model->BSIM3lprwb * Inv_L + + model->BSIM3wprwb * Inv_W + + model->BSIM3pprwb * Inv_LW; + pParam->BSIM3prt = model->BSIM3prt + + model->BSIM3lprt * Inv_L + + model->BSIM3wprt * Inv_W + + model->BSIM3pprt * Inv_LW; + pParam->BSIM3eta0 = model->BSIM3eta0 + + model->BSIM3leta0 * Inv_L + + model->BSIM3weta0 * Inv_W + + model->BSIM3peta0 * Inv_LW; + pParam->BSIM3etab = model->BSIM3etab + + model->BSIM3letab * Inv_L + + model->BSIM3wetab * Inv_W + + model->BSIM3petab * Inv_LW; + pParam->BSIM3pclm = model->BSIM3pclm + + model->BSIM3lpclm * Inv_L + + model->BSIM3wpclm * Inv_W + + model->BSIM3ppclm * Inv_LW; + pParam->BSIM3pdibl1 = model->BSIM3pdibl1 + + model->BSIM3lpdibl1 * Inv_L + + model->BSIM3wpdibl1 * Inv_W + + model->BSIM3ppdibl1 * Inv_LW; + pParam->BSIM3pdibl2 = model->BSIM3pdibl2 + + model->BSIM3lpdibl2 * Inv_L + + model->BSIM3wpdibl2 * Inv_W + + model->BSIM3ppdibl2 * Inv_LW; + pParam->BSIM3pdiblb = model->BSIM3pdiblb + + model->BSIM3lpdiblb * Inv_L + + model->BSIM3wpdiblb * Inv_W + + model->BSIM3ppdiblb * Inv_LW; + pParam->BSIM3pscbe1 = model->BSIM3pscbe1 + + model->BSIM3lpscbe1 * Inv_L + + model->BSIM3wpscbe1 * Inv_W + + model->BSIM3ppscbe1 * Inv_LW; + pParam->BSIM3pscbe2 = model->BSIM3pscbe2 + + model->BSIM3lpscbe2 * Inv_L + + model->BSIM3wpscbe2 * Inv_W + + model->BSIM3ppscbe2 * Inv_LW; + pParam->BSIM3pvag = model->BSIM3pvag + + model->BSIM3lpvag * Inv_L + + model->BSIM3wpvag * Inv_W + + model->BSIM3ppvag * Inv_LW; + pParam->BSIM3wr = model->BSIM3wr + + model->BSIM3lwr * Inv_L + + model->BSIM3wwr * Inv_W + + model->BSIM3pwr * Inv_LW; + pParam->BSIM3dwg = model->BSIM3dwg + + model->BSIM3ldwg * Inv_L + + model->BSIM3wdwg * Inv_W + + model->BSIM3pdwg * Inv_LW; + pParam->BSIM3dwb = model->BSIM3dwb + + model->BSIM3ldwb * Inv_L + + model->BSIM3wdwb * Inv_W + + model->BSIM3pdwb * Inv_LW; + pParam->BSIM3b0 = model->BSIM3b0 + + model->BSIM3lb0 * Inv_L + + model->BSIM3wb0 * Inv_W + + model->BSIM3pb0 * Inv_LW; + pParam->BSIM3b1 = model->BSIM3b1 + + model->BSIM3lb1 * Inv_L + + model->BSIM3wb1 * Inv_W + + model->BSIM3pb1 * Inv_LW; + pParam->BSIM3alpha0 = model->BSIM3alpha0 + + model->BSIM3lalpha0 * Inv_L + + model->BSIM3walpha0 * Inv_W + + model->BSIM3palpha0 * Inv_LW; pParam->BSIM3alpha1 = model->BSIM3alpha1 + model->BSIM3lalpha1 * Inv_L + model->BSIM3walpha1 * Inv_W + model->BSIM3palpha1 * Inv_LW; - pParam->BSIM3beta0 = model->BSIM3beta0 - + model->BSIM3lbeta0 * Inv_L - + model->BSIM3wbeta0 * Inv_W - + model->BSIM3pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3elm = model->BSIM3elm - + model->BSIM3lelm * Inv_L - + model->BSIM3welm * Inv_W - + model->BSIM3pelm * Inv_LW; - pParam->BSIM3cgsl = model->BSIM3cgsl - + model->BSIM3lcgsl * Inv_L - + model->BSIM3wcgsl * Inv_W - + model->BSIM3pcgsl * Inv_LW; - pParam->BSIM3cgdl = model->BSIM3cgdl - + model->BSIM3lcgdl * Inv_L - + model->BSIM3wcgdl * Inv_W - + model->BSIM3pcgdl * Inv_LW; - pParam->BSIM3ckappa = model->BSIM3ckappa - + model->BSIM3lckappa * Inv_L - + model->BSIM3wckappa * Inv_W - + model->BSIM3pckappa * Inv_LW; - pParam->BSIM3cf = model->BSIM3cf - + model->BSIM3lcf * Inv_L - + model->BSIM3wcf * Inv_W - + model->BSIM3pcf * Inv_LW; - pParam->BSIM3clc = model->BSIM3clc - + model->BSIM3lclc * Inv_L - + model->BSIM3wclc * Inv_W - + model->BSIM3pclc * Inv_LW; - pParam->BSIM3cle = model->BSIM3cle - + model->BSIM3lcle * Inv_L - + model->BSIM3wcle * Inv_W - + model->BSIM3pcle * Inv_LW; - pParam->BSIM3vfbcv = model->BSIM3vfbcv - + model->BSIM3lvfbcv * Inv_L - + model->BSIM3wvfbcv * Inv_W - + model->BSIM3pvfbcv * Inv_LW; + pParam->BSIM3beta0 = model->BSIM3beta0 + + model->BSIM3lbeta0 * Inv_L + + model->BSIM3wbeta0 * Inv_W + + model->BSIM3pbeta0 * Inv_LW; + /* CV model */ + pParam->BSIM3elm = model->BSIM3elm + + model->BSIM3lelm * Inv_L + + model->BSIM3welm * Inv_W + + model->BSIM3pelm * Inv_LW; + pParam->BSIM3cgsl = model->BSIM3cgsl + + model->BSIM3lcgsl * Inv_L + + model->BSIM3wcgsl * Inv_W + + model->BSIM3pcgsl * Inv_LW; + pParam->BSIM3cgdl = model->BSIM3cgdl + + model->BSIM3lcgdl * Inv_L + + model->BSIM3wcgdl * Inv_W + + model->BSIM3pcgdl * Inv_LW; + pParam->BSIM3ckappa = model->BSIM3ckappa + + model->BSIM3lckappa * Inv_L + + model->BSIM3wckappa * Inv_W + + model->BSIM3pckappa * Inv_LW; + pParam->BSIM3cf = model->BSIM3cf + + model->BSIM3lcf * Inv_L + + model->BSIM3wcf * Inv_W + + model->BSIM3pcf * Inv_LW; + pParam->BSIM3clc = model->BSIM3clc + + model->BSIM3lclc * Inv_L + + model->BSIM3wclc * Inv_W + + model->BSIM3pclc * Inv_LW; + pParam->BSIM3cle = model->BSIM3cle + + model->BSIM3lcle * Inv_L + + model->BSIM3wcle * Inv_W + + model->BSIM3pcle * Inv_LW; + pParam->BSIM3vfbcv = model->BSIM3vfbcv + + model->BSIM3lvfbcv * Inv_L + + model->BSIM3wvfbcv * Inv_W + + model->BSIM3pvfbcv * Inv_LW; pParam->BSIM3acde = model->BSIM3acde + model->BSIM3lacde * Inv_L + model->BSIM3wacde * Inv_W @@ -588,35 +588,35 @@ int Size_Not_Found; + model->BSIM3pvoffcv * Inv_LW; pParam->BSIM3abulkCVfactor = 1.0 + pow((pParam->BSIM3clc - / pParam->BSIM3leffCV), - pParam->BSIM3cle); + / pParam->BSIM3leffCV), + pParam->BSIM3cle); - T0 = (TRatio - 1.0); - pParam->BSIM3ua = pParam->BSIM3ua + pParam->BSIM3ua1 * T0; - pParam->BSIM3ub = pParam->BSIM3ub + pParam->BSIM3ub1 * T0; - pParam->BSIM3uc = pParam->BSIM3uc + pParam->BSIM3uc1 * T0; - if (pParam->BSIM3u0 > 1.0) + T0 = (TRatio - 1.0); + pParam->BSIM3ua = pParam->BSIM3ua + pParam->BSIM3ua1 * T0; + pParam->BSIM3ub = pParam->BSIM3ub + pParam->BSIM3ub1 * T0; + pParam->BSIM3uc = pParam->BSIM3uc + pParam->BSIM3uc1 * T0; + if (pParam->BSIM3u0 > 1.0) pParam->BSIM3u0 = pParam->BSIM3u0 / 1.0e4; pParam->BSIM3u0temp = pParam->BSIM3u0 - * pow(TRatio, pParam->BSIM3ute); - pParam->BSIM3vsattemp = pParam->BSIM3vsat - pParam->BSIM3at - * T0; - pParam->BSIM3rds0 = (pParam->BSIM3rdsw + pParam->BSIM3prt * T0) + * pow(TRatio, pParam->BSIM3ute); + pParam->BSIM3vsattemp = pParam->BSIM3vsat - pParam->BSIM3at + * T0; + pParam->BSIM3rds0 = (pParam->BSIM3rdsw + pParam->BSIM3prt * T0) / pow(pParam->BSIM3weff * 1E6, pParam->BSIM3wr); - if (BSIM3checkModel(model, here, ckt)) - { IFuid namarray[2]; + if (BSIM3checkModel(model, here, ckt)) + { IFuid namarray[2]; namarray[0] = model->BSIM3modName; namarray[1] = here->BSIM3name; SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.2 parameter checking for %s in model %s", namarray); - return(E_BADPARM); - } + return(E_BADPARM); + } pParam->BSIM3cgdo = (model->BSIM3cgdo + pParam->BSIM3cf) - * pParam->BSIM3weffCV; + * pParam->BSIM3weffCV; pParam->BSIM3cgso = (model->BSIM3cgso + pParam->BSIM3cf) - * pParam->BSIM3weffCV; + * pParam->BSIM3weffCV; pParam->BSIM3cgbo = model->BSIM3cgbo * pParam->BSIM3leffCV; T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; @@ -628,23 +628,23 @@ int Size_Not_Found; pParam->BSIM3npeak = 3.021E22 * T0 * T0; } - pParam->BSIM3phi = 2.0 * Vtm0 - * log(pParam->BSIM3npeak / ni); + pParam->BSIM3phi = 2.0 * Vtm0 + * log(pParam->BSIM3npeak / ni); - pParam->BSIM3sqrtPhi = sqrt(pParam->BSIM3phi); - pParam->BSIM3phis3 = pParam->BSIM3sqrtPhi * pParam->BSIM3phi; + pParam->BSIM3sqrtPhi = sqrt(pParam->BSIM3phi); + pParam->BSIM3phis3 = pParam->BSIM3sqrtPhi * pParam->BSIM3phi; pParam->BSIM3Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3npeak * 1.0e6)) - * pParam->BSIM3sqrtPhi; + * pParam->BSIM3npeak * 1.0e6)) + * pParam->BSIM3sqrtPhi; pParam->BSIM3sqrtXdep0 = sqrt(pParam->BSIM3Xdep0); pParam->BSIM3litl = sqrt(3.0 * pParam->BSIM3xj - * model->BSIM3tox); + * model->BSIM3tox); pParam->BSIM3vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3npeak / (ni * ni)); + * pParam->BSIM3npeak / (ni * ni)); pParam->BSIM3cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3npeak * 1.0e6 / 2.0 - / pParam->BSIM3phi); + * pParam->BSIM3npeak * 1.0e6 / 2.0 + / pParam->BSIM3phi); pParam->BSIM3ldeb = sqrt(EPSSI * Vtm0 / (Charge_q * pParam->BSIM3npeak * 1.0e6)) / 3.0; @@ -678,48 +678,48 @@ int Size_Not_Found; } } else - { if (!model->BSIM3vbxGiven) - pParam->BSIM3vbx = pParam->BSIM3phi - 7.7348e-4 + { if (!model->BSIM3vbxGiven) + pParam->BSIM3vbx = pParam->BSIM3phi - 7.7348e-4 * pParam->BSIM3npeak - * pParam->BSIM3xt * pParam->BSIM3xt; - if (pParam->BSIM3vbx > 0.0) - pParam->BSIM3vbx = -pParam->BSIM3vbx; - if (pParam->BSIM3vbm > 0.0) + * pParam->BSIM3xt * pParam->BSIM3xt; + if (pParam->BSIM3vbx > 0.0) + pParam->BSIM3vbx = -pParam->BSIM3vbx; + if (pParam->BSIM3vbm > 0.0) pParam->BSIM3vbm = -pParam->BSIM3vbm; - + if (!model->BSIM3gamma1Given) pParam->BSIM3gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3npeak) + * sqrt(pParam->BSIM3npeak) / model->BSIM3cox; if (!model->BSIM3gamma2Given) pParam->BSIM3gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3nsub) + * sqrt(pParam->BSIM3nsub) / model->BSIM3cox; T0 = pParam->BSIM3gamma1 - pParam->BSIM3gamma2; T1 = sqrt(pParam->BSIM3phi - pParam->BSIM3vbx) - - pParam->BSIM3sqrtPhi; + - pParam->BSIM3sqrtPhi; T2 = sqrt(pParam->BSIM3phi * (pParam->BSIM3phi - - pParam->BSIM3vbm)) - pParam->BSIM3phi; + - pParam->BSIM3vbm)) - pParam->BSIM3phi; pParam->BSIM3k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3vbm); pParam->BSIM3k1 = pParam->BSIM3gamma2 - 2.0 - * pParam->BSIM3k2 * sqrt(pParam->BSIM3phi - - pParam->BSIM3vbm); + * pParam->BSIM3k2 * sqrt(pParam->BSIM3phi + - pParam->BSIM3vbm); } - - if (pParam->BSIM3k2 < 0.0) - { T0 = 0.5 * pParam->BSIM3k1 / pParam->BSIM3k2; + + if (pParam->BSIM3k2 < 0.0) + { T0 = 0.5 * pParam->BSIM3k1 / pParam->BSIM3k2; pParam->BSIM3vbsc = 0.9 * (pParam->BSIM3phi - T0 * T0); - if (pParam->BSIM3vbsc > -3.0) - pParam->BSIM3vbsc = -3.0; - else if (pParam->BSIM3vbsc < -30.0) - pParam->BSIM3vbsc = -30.0; - } - else - { pParam->BSIM3vbsc = -30.0; - } - if (pParam->BSIM3vbsc > pParam->BSIM3vbm) - pParam->BSIM3vbsc = pParam->BSIM3vbm; + if (pParam->BSIM3vbsc > -3.0) + pParam->BSIM3vbsc = -3.0; + else if (pParam->BSIM3vbsc < -30.0) + pParam->BSIM3vbsc = -30.0; + } + else + { pParam->BSIM3vbsc = -30.0; + } + if (pParam->BSIM3vbsc > pParam->BSIM3vbm) + pParam->BSIM3vbsc = pParam->BSIM3vbm; if (!model->BSIM3vfbGiven) { if (model->BSIM3vth0Given) @@ -743,14 +743,14 @@ int Size_Not_Found; / model->BSIM3toxm; T1 = sqrt(EPSSI / EPSOX * model->BSIM3tox - * pParam->BSIM3Xdep0); + * pParam->BSIM3Xdep0); T0 = exp(-0.5 * pParam->BSIM3dsub * pParam->BSIM3leff / T1); pParam->BSIM3theta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * pParam->BSIM3drout * pParam->BSIM3leff / T1); T2 = (T0 + 2.0 * T0 * T0); pParam->BSIM3thetaRout = pParam->BSIM3pdibl1 * T2 - + pParam->BSIM3pdibl2; + + pParam->BSIM3pdibl2; tmp = sqrt(pParam->BSIM3Xdep0); tmp1 = pParam->BSIM3vbi - pParam->BSIM3phi; @@ -796,23 +796,23 @@ int Size_Not_Found; } /* process source/drain series resistance */ - here->BSIM3drainConductance = model->BSIM3sheetResistance - * here->BSIM3drainSquares; + here->BSIM3drainConductance = model->BSIM3sheetResistance + * here->BSIM3drainSquares; if (here->BSIM3drainConductance > 0.0) here->BSIM3drainConductance = 1.0 - / here->BSIM3drainConductance; - else + / here->BSIM3drainConductance; + else here->BSIM3drainConductance = 0.0; - - here->BSIM3sourceConductance = model->BSIM3sheetResistance - * here->BSIM3sourceSquares; - if (here->BSIM3sourceConductance > 0.0) + + here->BSIM3sourceConductance = model->BSIM3sheetResistance + * here->BSIM3sourceSquares; + if (here->BSIM3sourceConductance > 0.0) here->BSIM3sourceConductance = 1.0 - / here->BSIM3sourceConductance; - else + / here->BSIM3sourceConductance; + else here->BSIM3sourceConductance = 0.0; - here->BSIM3cgso = pParam->BSIM3cgso; - here->BSIM3cgdo = pParam->BSIM3cgdo; + here->BSIM3cgso = pParam->BSIM3cgso; + here->BSIM3cgdo = pParam->BSIM3cgdo; Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; if ((here->BSIM3sourceArea <= 0.0) && diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index 86efe6955..4ecbb31ca 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -14,7 +14,7 @@ File: bsim3def.h #include "ngspice/gendefs.h" #include "ngspice/cktdefs.h" #include "ngspice/complex.h" -#include "ngspice/noisedef.h" +#include "ngspice/noisedef.h" typedef struct sBSIM3instance { @@ -32,7 +32,7 @@ typedef struct sBSIM3instance /* MCJ */ double BSIM3ueff; - double BSIM3thetavth; + double BSIM3thetavth; double BSIM3von; double BSIM3vdsat; double BSIM3cgdo; @@ -44,7 +44,7 @@ typedef struct sBSIM3instance double BSIM3l; double BSIM3w; - double BSIM3m; + double BSIM3m; double BSIM3drainArea; double BSIM3sourceArea; double BSIM3drainSquares; @@ -115,7 +115,7 @@ typedef struct sBSIM3instance unsigned BSIM3lGiven :1; unsigned BSIM3wGiven :1; - unsigned BSIM3mGiven :1; + unsigned BSIM3mGiven :1; unsigned BSIM3drainAreaGiven :1; unsigned BSIM3sourceAreaGiven :1; unsigned BSIM3drainSquaresGiven :1; @@ -253,29 +253,29 @@ struct bsim3SizeDependParam double Width; double Length; - double BSIM3cdsc; - double BSIM3cdscb; - double BSIM3cdscd; - double BSIM3cit; - double BSIM3nfactor; + double BSIM3cdsc; + double BSIM3cdscb; + double BSIM3cdscd; + double BSIM3cit; + double BSIM3nfactor; double BSIM3xj; - double BSIM3vsat; - double BSIM3at; - double BSIM3a0; - double BSIM3ags; - double BSIM3a1; - double BSIM3a2; - double BSIM3keta; + double BSIM3vsat; + double BSIM3at; + double BSIM3a0; + double BSIM3ags; + double BSIM3a1; + double BSIM3a2; + double BSIM3keta; double BSIM3nsub; - double BSIM3npeak; - double BSIM3ngate; - double BSIM3gamma1; - double BSIM3gamma2; - double BSIM3vbx; - double BSIM3vbi; - double BSIM3vbm; - double BSIM3vbsc; - double BSIM3xt; + double BSIM3npeak; + double BSIM3ngate; + double BSIM3gamma1; + double BSIM3gamma2; + double BSIM3vbx; + double BSIM3vbi; + double BSIM3vbm; + double BSIM3vbsc; + double BSIM3xt; double BSIM3phi; double BSIM3litl; double BSIM3k1; @@ -287,14 +287,14 @@ struct bsim3SizeDependParam double BSIM3k3b; double BSIM3w0; double BSIM3nlx; - double BSIM3dvt0; - double BSIM3dvt1; - double BSIM3dvt2; - double BSIM3dvt0w; - double BSIM3dvt1w; - double BSIM3dvt2w; - double BSIM3drout; - double BSIM3dsub; + double BSIM3dvt0; + double BSIM3dvt1; + double BSIM3dvt2; + double BSIM3dvt0w; + double BSIM3dvt1w; + double BSIM3dvt2w; + double BSIM3drout; + double BSIM3dsub; double BSIM3vth0; double BSIM3ua; double BSIM3ua1; @@ -307,20 +307,20 @@ struct bsim3SizeDependParam double BSIM3voff; double BSIM3vfb; double BSIM3delta; - double BSIM3rdsw; - double BSIM3rds0; - double BSIM3prwg; - double BSIM3prwb; - double BSIM3prt; - double BSIM3eta0; - double BSIM3etab; - double BSIM3pclm; - double BSIM3pdibl1; - double BSIM3pdibl2; - double BSIM3pdiblb; - double BSIM3pscbe1; - double BSIM3pscbe2; - double BSIM3pvag; + double BSIM3rdsw; + double BSIM3rds0; + double BSIM3prwg; + double BSIM3prwb; + double BSIM3prt; + double BSIM3eta0; + double BSIM3etab; + double BSIM3pclm; + double BSIM3pdibl1; + double BSIM3pdibl2; + double BSIM3pdiblb; + double BSIM3pscbe1; + double BSIM3pscbe2; + double BSIM3pvag; double BSIM3wr; double BSIM3dwg; double BSIM3dwb; @@ -363,14 +363,14 @@ struct bsim3SizeDependParam double BSIM3cgbo; double BSIM3tconst; - double BSIM3u0temp; - double BSIM3vsattemp; - double BSIM3sqrtPhi; - double BSIM3phis3; - double BSIM3Xdep0; - double BSIM3sqrtXdep0; + double BSIM3u0temp; + double BSIM3vsattemp; + double BSIM3sqrtPhi; + double BSIM3phis3; + double BSIM3Xdep0; + double BSIM3sqrtXdep0; double BSIM3theta0vb0; - double BSIM3thetaRout; + double BSIM3thetaRout; double BSIM3cof1; double BSIM3cof2; @@ -386,12 +386,12 @@ struct bsim3SizeDependParam }; -typedef struct sBSIM3model +typedef struct sBSIM3model { int BSIM3modType; struct sBSIM3model *BSIM3nextModel; BSIM3instance *BSIM3instances; - IFuid BSIM3modName; + IFuid BSIM3modName; int BSIM3type; int BSIM3mobMod; @@ -400,30 +400,30 @@ typedef struct sBSIM3model int BSIM3acnqsMod; int BSIM3binUnit; int BSIM3paramChk; - char *BSIM3version; - double BSIM3tox; + char *BSIM3version; + double BSIM3tox; double BSIM3toxm; - double BSIM3cdsc; - double BSIM3cdscb; - double BSIM3cdscd; - double BSIM3cit; - double BSIM3nfactor; + double BSIM3cdsc; + double BSIM3cdscb; + double BSIM3cdscd; + double BSIM3cit; + double BSIM3nfactor; double BSIM3xj; - double BSIM3vsat; - double BSIM3at; - double BSIM3a0; - double BSIM3ags; - double BSIM3a1; - double BSIM3a2; - double BSIM3keta; + double BSIM3vsat; + double BSIM3at; + double BSIM3a0; + double BSIM3ags; + double BSIM3a1; + double BSIM3a2; + double BSIM3keta; double BSIM3nsub; - double BSIM3npeak; - double BSIM3ngate; - double BSIM3gamma1; - double BSIM3gamma2; - double BSIM3vbx; - double BSIM3vbm; - double BSIM3xt; + double BSIM3npeak; + double BSIM3ngate; + double BSIM3gamma1; + double BSIM3gamma2; + double BSIM3vbx; + double BSIM3vbm; + double BSIM3xt; double BSIM3k1; double BSIM3kt1; double BSIM3kt1l; @@ -433,14 +433,14 @@ typedef struct sBSIM3model double BSIM3k3b; double BSIM3w0; double BSIM3nlx; - double BSIM3dvt0; - double BSIM3dvt1; - double BSIM3dvt2; - double BSIM3dvt0w; - double BSIM3dvt1w; - double BSIM3dvt2w; - double BSIM3drout; - double BSIM3dsub; + double BSIM3dvt0; + double BSIM3dvt1; + double BSIM3dvt2; + double BSIM3dvt0w; + double BSIM3dvt1w; + double BSIM3dvt2w; + double BSIM3drout; + double BSIM3dsub; double BSIM3vth0; double BSIM3ua; double BSIM3ua1; @@ -452,19 +452,19 @@ typedef struct sBSIM3model double BSIM3ute; double BSIM3voff; double BSIM3delta; - double BSIM3rdsw; + double BSIM3rdsw; double BSIM3prwg; double BSIM3prwb; - double BSIM3prt; - double BSIM3eta0; - double BSIM3etab; - double BSIM3pclm; - double BSIM3pdibl1; - double BSIM3pdibl2; + double BSIM3prt; + double BSIM3eta0; + double BSIM3etab; + double BSIM3pclm; + double BSIM3pdibl1; + double BSIM3pdibl2; double BSIM3pdiblb; - double BSIM3pscbe1; - double BSIM3pscbe2; - double BSIM3pvag; + double BSIM3pscbe1; + double BSIM3pscbe2; + double BSIM3pvag; double BSIM3wr; double BSIM3dwg; double BSIM3dwb; @@ -499,27 +499,27 @@ typedef struct sBSIM3model double BSIM3tpbswg; /* Length Dependence */ - double BSIM3lcdsc; - double BSIM3lcdscb; - double BSIM3lcdscd; - double BSIM3lcit; - double BSIM3lnfactor; + double BSIM3lcdsc; + double BSIM3lcdscb; + double BSIM3lcdscd; + double BSIM3lcit; + double BSIM3lnfactor; double BSIM3lxj; - double BSIM3lvsat; - double BSIM3lat; - double BSIM3la0; - double BSIM3lags; - double BSIM3la1; - double BSIM3la2; - double BSIM3lketa; + double BSIM3lvsat; + double BSIM3lat; + double BSIM3la0; + double BSIM3lags; + double BSIM3la1; + double BSIM3la2; + double BSIM3lketa; double BSIM3lnsub; - double BSIM3lnpeak; - double BSIM3lngate; - double BSIM3lgamma1; - double BSIM3lgamma2; - double BSIM3lvbx; - double BSIM3lvbm; - double BSIM3lxt; + double BSIM3lnpeak; + double BSIM3lngate; + double BSIM3lgamma1; + double BSIM3lgamma2; + double BSIM3lvbx; + double BSIM3lvbm; + double BSIM3lxt; double BSIM3lk1; double BSIM3lkt1; double BSIM3lkt1l; @@ -529,14 +529,14 @@ typedef struct sBSIM3model double BSIM3lk3b; double BSIM3lw0; double BSIM3lnlx; - double BSIM3ldvt0; - double BSIM3ldvt1; - double BSIM3ldvt2; - double BSIM3ldvt0w; - double BSIM3ldvt1w; - double BSIM3ldvt2w; - double BSIM3ldrout; - double BSIM3ldsub; + double BSIM3ldvt0; + double BSIM3ldvt1; + double BSIM3ldvt2; + double BSIM3ldvt0w; + double BSIM3ldvt1w; + double BSIM3ldvt2w; + double BSIM3ldrout; + double BSIM3ldsub; double BSIM3lvth0; double BSIM3lua; double BSIM3lua1; @@ -548,19 +548,19 @@ typedef struct sBSIM3model double BSIM3lute; double BSIM3lvoff; double BSIM3ldelta; - double BSIM3lrdsw; + double BSIM3lrdsw; double BSIM3lprwg; double BSIM3lprwb; - double BSIM3lprt; - double BSIM3leta0; - double BSIM3letab; - double BSIM3lpclm; - double BSIM3lpdibl1; - double BSIM3lpdibl2; + double BSIM3lprt; + double BSIM3leta0; + double BSIM3letab; + double BSIM3lpclm; + double BSIM3lpdibl1; + double BSIM3lpdibl2; double BSIM3lpdiblb; - double BSIM3lpscbe1; - double BSIM3lpscbe2; - double BSIM3lpvag; + double BSIM3lpscbe1; + double BSIM3lpscbe2; + double BSIM3lpvag; double BSIM3lwr; double BSIM3ldwg; double BSIM3ldwb; @@ -586,27 +586,27 @@ typedef struct sBSIM3model double BSIM3lmoin; /* Width Dependence */ - double BSIM3wcdsc; - double BSIM3wcdscb; - double BSIM3wcdscd; - double BSIM3wcit; - double BSIM3wnfactor; + double BSIM3wcdsc; + double BSIM3wcdscb; + double BSIM3wcdscd; + double BSIM3wcit; + double BSIM3wnfactor; double BSIM3wxj; - double BSIM3wvsat; - double BSIM3wat; - double BSIM3wa0; - double BSIM3wags; - double BSIM3wa1; - double BSIM3wa2; - double BSIM3wketa; + double BSIM3wvsat; + double BSIM3wat; + double BSIM3wa0; + double BSIM3wags; + double BSIM3wa1; + double BSIM3wa2; + double BSIM3wketa; double BSIM3wnsub; - double BSIM3wnpeak; - double BSIM3wngate; - double BSIM3wgamma1; - double BSIM3wgamma2; - double BSIM3wvbx; - double BSIM3wvbm; - double BSIM3wxt; + double BSIM3wnpeak; + double BSIM3wngate; + double BSIM3wgamma1; + double BSIM3wgamma2; + double BSIM3wvbx; + double BSIM3wvbm; + double BSIM3wxt; double BSIM3wk1; double BSIM3wkt1; double BSIM3wkt1l; @@ -616,14 +616,14 @@ typedef struct sBSIM3model double BSIM3wk3b; double BSIM3ww0; double BSIM3wnlx; - double BSIM3wdvt0; - double BSIM3wdvt1; - double BSIM3wdvt2; - double BSIM3wdvt0w; - double BSIM3wdvt1w; - double BSIM3wdvt2w; - double BSIM3wdrout; - double BSIM3wdsub; + double BSIM3wdvt0; + double BSIM3wdvt1; + double BSIM3wdvt2; + double BSIM3wdvt0w; + double BSIM3wdvt1w; + double BSIM3wdvt2w; + double BSIM3wdrout; + double BSIM3wdsub; double BSIM3wvth0; double BSIM3wua; double BSIM3wua1; @@ -635,19 +635,19 @@ typedef struct sBSIM3model double BSIM3wute; double BSIM3wvoff; double BSIM3wdelta; - double BSIM3wrdsw; + double BSIM3wrdsw; double BSIM3wprwg; double BSIM3wprwb; - double BSIM3wprt; - double BSIM3weta0; - double BSIM3wetab; - double BSIM3wpclm; - double BSIM3wpdibl1; - double BSIM3wpdibl2; + double BSIM3wprt; + double BSIM3weta0; + double BSIM3wetab; + double BSIM3wpclm; + double BSIM3wpdibl1; + double BSIM3wpdibl2; double BSIM3wpdiblb; - double BSIM3wpscbe1; - double BSIM3wpscbe2; - double BSIM3wpvag; + double BSIM3wpscbe1; + double BSIM3wpscbe2; + double BSIM3wpvag; double BSIM3wwr; double BSIM3wdwg; double BSIM3wdwb; @@ -673,27 +673,27 @@ typedef struct sBSIM3model double BSIM3wmoin; /* Cross-term Dependence */ - double BSIM3pcdsc; - double BSIM3pcdscb; - double BSIM3pcdscd; - double BSIM3pcit; - double BSIM3pnfactor; + double BSIM3pcdsc; + double BSIM3pcdscb; + double BSIM3pcdscd; + double BSIM3pcit; + double BSIM3pnfactor; double BSIM3pxj; - double BSIM3pvsat; - double BSIM3pat; - double BSIM3pa0; - double BSIM3pags; - double BSIM3pa1; - double BSIM3pa2; - double BSIM3pketa; + double BSIM3pvsat; + double BSIM3pat; + double BSIM3pa0; + double BSIM3pags; + double BSIM3pa1; + double BSIM3pa2; + double BSIM3pketa; double BSIM3pnsub; - double BSIM3pnpeak; - double BSIM3pngate; - double BSIM3pgamma1; - double BSIM3pgamma2; - double BSIM3pvbx; - double BSIM3pvbm; - double BSIM3pxt; + double BSIM3pnpeak; + double BSIM3pngate; + double BSIM3pgamma1; + double BSIM3pgamma2; + double BSIM3pvbx; + double BSIM3pvbm; + double BSIM3pxt; double BSIM3pk1; double BSIM3pkt1; double BSIM3pkt1l; @@ -703,14 +703,14 @@ typedef struct sBSIM3model double BSIM3pk3b; double BSIM3pw0; double BSIM3pnlx; - double BSIM3pdvt0; - double BSIM3pdvt1; - double BSIM3pdvt2; - double BSIM3pdvt0w; - double BSIM3pdvt1w; - double BSIM3pdvt2w; - double BSIM3pdrout; - double BSIM3pdsub; + double BSIM3pdvt0; + double BSIM3pdvt1; + double BSIM3pdvt2; + double BSIM3pdvt0w; + double BSIM3pdvt1w; + double BSIM3pdvt2w; + double BSIM3pdrout; + double BSIM3pdsub; double BSIM3pvth0; double BSIM3pua; double BSIM3pua1; @@ -725,16 +725,16 @@ typedef struct sBSIM3model double BSIM3prdsw; double BSIM3pprwg; double BSIM3pprwb; - double BSIM3pprt; - double BSIM3peta0; - double BSIM3petab; - double BSIM3ppclm; - double BSIM3ppdibl1; - double BSIM3ppdibl2; + double BSIM3pprt; + double BSIM3peta0; + double BSIM3petab; + double BSIM3ppclm; + double BSIM3ppdibl1; + double BSIM3ppdibl2; double BSIM3ppdiblb; - double BSIM3ppscbe1; - double BSIM3ppscbe2; - double BSIM3ppvag; + double BSIM3ppscbe1; + double BSIM3ppscbe2; + double BSIM3ppvag; double BSIM3pwr; double BSIM3pdwg; double BSIM3pdwb; @@ -809,7 +809,7 @@ typedef struct sBSIM3model /* Pre-calculated constants */ /* MCJ: move to size-dependent param. */ - double BSIM3vtm; + double BSIM3vtm; double BSIM3cox; double BSIM3cof1; double BSIM3cof2; @@ -826,18 +826,18 @@ typedef struct sBSIM3model double BSIM3unitLengthSidewallTempJctCap; double BSIM3unitLengthGateSidewallTempJctCap; - double BSIM3oxideTrapDensityA; - double BSIM3oxideTrapDensityB; - double BSIM3oxideTrapDensityC; - double BSIM3em; - double BSIM3ef; - double BSIM3af; - double BSIM3kf; + double BSIM3oxideTrapDensityA; + double BSIM3oxideTrapDensityB; + double BSIM3oxideTrapDensityC; + double BSIM3em; + double BSIM3ef; + double BSIM3af; + double BSIM3kf; double BSIM3lintnoi; /* lint offset for noise calculation */ struct bsim3SizeDependParam *pSizeDependParamKnot; - + #ifdef USE_OMP int BSIM3InstCount; struct sBSIM3instance **BSIM3InstanceArray; @@ -866,7 +866,7 @@ typedef struct sBSIM3model unsigned BSIM3agsGiven :1; unsigned BSIM3a1Given :1; unsigned BSIM3a2Given :1; - unsigned BSIM3ketaGiven :1; + unsigned BSIM3ketaGiven :1; unsigned BSIM3nsubGiven :1; unsigned BSIM3npeakGiven :1; unsigned BSIM3ngateGiven :1; @@ -884,14 +884,14 @@ typedef struct sBSIM3model unsigned BSIM3k3bGiven :1; unsigned BSIM3w0Given :1; unsigned BSIM3nlxGiven :1; - unsigned BSIM3dvt0Given :1; - unsigned BSIM3dvt1Given :1; - unsigned BSIM3dvt2Given :1; - unsigned BSIM3dvt0wGiven :1; - unsigned BSIM3dvt1wGiven :1; - unsigned BSIM3dvt2wGiven :1; - unsigned BSIM3droutGiven :1; - unsigned BSIM3dsubGiven :1; + unsigned BSIM3dvt0Given :1; + unsigned BSIM3dvt1Given :1; + unsigned BSIM3dvt2Given :1; + unsigned BSIM3dvt0wGiven :1; + unsigned BSIM3dvt1wGiven :1; + unsigned BSIM3dvt2wGiven :1; + unsigned BSIM3droutGiven :1; + unsigned BSIM3dsubGiven :1; unsigned BSIM3vth0Given :1; unsigned BSIM3uaGiven :1; unsigned BSIM3ua1Given :1; @@ -902,20 +902,20 @@ typedef struct sBSIM3model unsigned BSIM3u0Given :1; unsigned BSIM3uteGiven :1; unsigned BSIM3voffGiven :1; - unsigned BSIM3rdswGiven :1; - unsigned BSIM3prwgGiven :1; - unsigned BSIM3prwbGiven :1; - unsigned BSIM3prtGiven :1; - unsigned BSIM3eta0Given :1; - unsigned BSIM3etabGiven :1; - unsigned BSIM3pclmGiven :1; - unsigned BSIM3pdibl1Given :1; - unsigned BSIM3pdibl2Given :1; - unsigned BSIM3pdiblbGiven :1; - unsigned BSIM3pscbe1Given :1; - unsigned BSIM3pscbe2Given :1; - unsigned BSIM3pvagGiven :1; - unsigned BSIM3deltaGiven :1; + unsigned BSIM3rdswGiven :1; + unsigned BSIM3prwgGiven :1; + unsigned BSIM3prwbGiven :1; + unsigned BSIM3prtGiven :1; + unsigned BSIM3eta0Given :1; + unsigned BSIM3etabGiven :1; + unsigned BSIM3pclmGiven :1; + unsigned BSIM3pdibl1Given :1; + unsigned BSIM3pdibl2Given :1; + unsigned BSIM3pdiblbGiven :1; + unsigned BSIM3pscbe1Given :1; + unsigned BSIM3pscbe2Given :1; + unsigned BSIM3pvagGiven :1; + unsigned BSIM3deltaGiven :1; unsigned BSIM3wrGiven :1; unsigned BSIM3dwgGiven :1; unsigned BSIM3dwbGiven :1; @@ -928,7 +928,7 @@ typedef struct sBSIM3model unsigned BSIM3vfbGiven :1; /* CV model */ - unsigned BSIM3elmGiven :1; + unsigned BSIM3elmGiven :1; unsigned BSIM3cgslGiven :1; unsigned BSIM3cgdlGiven :1; unsigned BSIM3ckappaGiven :1; @@ -963,7 +963,7 @@ typedef struct sBSIM3model unsigned BSIM3lagsGiven :1; unsigned BSIM3la1Given :1; unsigned BSIM3la2Given :1; - unsigned BSIM3lketaGiven :1; + unsigned BSIM3lketaGiven :1; unsigned BSIM3lnsubGiven :1; unsigned BSIM3lnpeakGiven :1; unsigned BSIM3lngateGiven :1; @@ -981,14 +981,14 @@ typedef struct sBSIM3model unsigned BSIM3lk3bGiven :1; unsigned BSIM3lw0Given :1; unsigned BSIM3lnlxGiven :1; - unsigned BSIM3ldvt0Given :1; - unsigned BSIM3ldvt1Given :1; - unsigned BSIM3ldvt2Given :1; - unsigned BSIM3ldvt0wGiven :1; - unsigned BSIM3ldvt1wGiven :1; - unsigned BSIM3ldvt2wGiven :1; - unsigned BSIM3ldroutGiven :1; - unsigned BSIM3ldsubGiven :1; + unsigned BSIM3ldvt0Given :1; + unsigned BSIM3ldvt1Given :1; + unsigned BSIM3ldvt2Given :1; + unsigned BSIM3ldvt0wGiven :1; + unsigned BSIM3ldvt1wGiven :1; + unsigned BSIM3ldvt2wGiven :1; + unsigned BSIM3ldroutGiven :1; + unsigned BSIM3ldsubGiven :1; unsigned BSIM3lvth0Given :1; unsigned BSIM3luaGiven :1; unsigned BSIM3lua1Given :1; @@ -999,20 +999,20 @@ typedef struct sBSIM3model unsigned BSIM3lu0Given :1; unsigned BSIM3luteGiven :1; unsigned BSIM3lvoffGiven :1; - unsigned BSIM3lrdswGiven :1; - unsigned BSIM3lprwgGiven :1; - unsigned BSIM3lprwbGiven :1; - unsigned BSIM3lprtGiven :1; - unsigned BSIM3leta0Given :1; - unsigned BSIM3letabGiven :1; - unsigned BSIM3lpclmGiven :1; - unsigned BSIM3lpdibl1Given :1; - unsigned BSIM3lpdibl2Given :1; - unsigned BSIM3lpdiblbGiven :1; - unsigned BSIM3lpscbe1Given :1; - unsigned BSIM3lpscbe2Given :1; - unsigned BSIM3lpvagGiven :1; - unsigned BSIM3ldeltaGiven :1; + unsigned BSIM3lrdswGiven :1; + unsigned BSIM3lprwgGiven :1; + unsigned BSIM3lprwbGiven :1; + unsigned BSIM3lprtGiven :1; + unsigned BSIM3leta0Given :1; + unsigned BSIM3letabGiven :1; + unsigned BSIM3lpclmGiven :1; + unsigned BSIM3lpdibl1Given :1; + unsigned BSIM3lpdibl2Given :1; + unsigned BSIM3lpdiblbGiven :1; + unsigned BSIM3lpscbe1Given :1; + unsigned BSIM3lpscbe2Given :1; + unsigned BSIM3lpvagGiven :1; + unsigned BSIM3ldeltaGiven :1; unsigned BSIM3lwrGiven :1; unsigned BSIM3ldwgGiven :1; unsigned BSIM3ldwbGiven :1; @@ -1024,7 +1024,7 @@ typedef struct sBSIM3model unsigned BSIM3lvfbGiven :1; /* CV model */ - unsigned BSIM3lelmGiven :1; + unsigned BSIM3lelmGiven :1; unsigned BSIM3lcgslGiven :1; unsigned BSIM3lcgdlGiven :1; unsigned BSIM3lckappaGiven :1; @@ -1050,7 +1050,7 @@ typedef struct sBSIM3model unsigned BSIM3wagsGiven :1; unsigned BSIM3wa1Given :1; unsigned BSIM3wa2Given :1; - unsigned BSIM3wketaGiven :1; + unsigned BSIM3wketaGiven :1; unsigned BSIM3wnsubGiven :1; unsigned BSIM3wnpeakGiven :1; unsigned BSIM3wngateGiven :1; @@ -1068,14 +1068,14 @@ typedef struct sBSIM3model unsigned BSIM3wk3bGiven :1; unsigned BSIM3ww0Given :1; unsigned BSIM3wnlxGiven :1; - unsigned BSIM3wdvt0Given :1; - unsigned BSIM3wdvt1Given :1; - unsigned BSIM3wdvt2Given :1; - unsigned BSIM3wdvt0wGiven :1; - unsigned BSIM3wdvt1wGiven :1; - unsigned BSIM3wdvt2wGiven :1; - unsigned BSIM3wdroutGiven :1; - unsigned BSIM3wdsubGiven :1; + unsigned BSIM3wdvt0Given :1; + unsigned BSIM3wdvt1Given :1; + unsigned BSIM3wdvt2Given :1; + unsigned BSIM3wdvt0wGiven :1; + unsigned BSIM3wdvt1wGiven :1; + unsigned BSIM3wdvt2wGiven :1; + unsigned BSIM3wdroutGiven :1; + unsigned BSIM3wdsubGiven :1; unsigned BSIM3wvth0Given :1; unsigned BSIM3wuaGiven :1; unsigned BSIM3wua1Given :1; @@ -1086,20 +1086,20 @@ typedef struct sBSIM3model unsigned BSIM3wu0Given :1; unsigned BSIM3wuteGiven :1; unsigned BSIM3wvoffGiven :1; - unsigned BSIM3wrdswGiven :1; - unsigned BSIM3wprwgGiven :1; - unsigned BSIM3wprwbGiven :1; - unsigned BSIM3wprtGiven :1; - unsigned BSIM3weta0Given :1; - unsigned BSIM3wetabGiven :1; - unsigned BSIM3wpclmGiven :1; - unsigned BSIM3wpdibl1Given :1; - unsigned BSIM3wpdibl2Given :1; - unsigned BSIM3wpdiblbGiven :1; - unsigned BSIM3wpscbe1Given :1; - unsigned BSIM3wpscbe2Given :1; - unsigned BSIM3wpvagGiven :1; - unsigned BSIM3wdeltaGiven :1; + unsigned BSIM3wrdswGiven :1; + unsigned BSIM3wprwgGiven :1; + unsigned BSIM3wprwbGiven :1; + unsigned BSIM3wprtGiven :1; + unsigned BSIM3weta0Given :1; + unsigned BSIM3wetabGiven :1; + unsigned BSIM3wpclmGiven :1; + unsigned BSIM3wpdibl1Given :1; + unsigned BSIM3wpdibl2Given :1; + unsigned BSIM3wpdiblbGiven :1; + unsigned BSIM3wpscbe1Given :1; + unsigned BSIM3wpscbe2Given :1; + unsigned BSIM3wpvagGiven :1; + unsigned BSIM3wdeltaGiven :1; unsigned BSIM3wwrGiven :1; unsigned BSIM3wdwgGiven :1; unsigned BSIM3wdwbGiven :1; @@ -1111,7 +1111,7 @@ typedef struct sBSIM3model unsigned BSIM3wvfbGiven :1; /* CV model */ - unsigned BSIM3welmGiven :1; + unsigned BSIM3welmGiven :1; unsigned BSIM3wcgslGiven :1; unsigned BSIM3wcgdlGiven :1; unsigned BSIM3wckappaGiven :1; @@ -1137,7 +1137,7 @@ typedef struct sBSIM3model unsigned BSIM3pagsGiven :1; unsigned BSIM3pa1Given :1; unsigned BSIM3pa2Given :1; - unsigned BSIM3pketaGiven :1; + unsigned BSIM3pketaGiven :1; unsigned BSIM3pnsubGiven :1; unsigned BSIM3pnpeakGiven :1; unsigned BSIM3pngateGiven :1; @@ -1155,14 +1155,14 @@ typedef struct sBSIM3model unsigned BSIM3pk3bGiven :1; unsigned BSIM3pw0Given :1; unsigned BSIM3pnlxGiven :1; - unsigned BSIM3pdvt0Given :1; - unsigned BSIM3pdvt1Given :1; - unsigned BSIM3pdvt2Given :1; - unsigned BSIM3pdvt0wGiven :1; - unsigned BSIM3pdvt1wGiven :1; - unsigned BSIM3pdvt2wGiven :1; - unsigned BSIM3pdroutGiven :1; - unsigned BSIM3pdsubGiven :1; + unsigned BSIM3pdvt0Given :1; + unsigned BSIM3pdvt1Given :1; + unsigned BSIM3pdvt2Given :1; + unsigned BSIM3pdvt0wGiven :1; + unsigned BSIM3pdvt1wGiven :1; + unsigned BSIM3pdvt2wGiven :1; + unsigned BSIM3pdroutGiven :1; + unsigned BSIM3pdsubGiven :1; unsigned BSIM3pvth0Given :1; unsigned BSIM3puaGiven :1; unsigned BSIM3pua1Given :1; @@ -1173,20 +1173,20 @@ typedef struct sBSIM3model unsigned BSIM3pu0Given :1; unsigned BSIM3puteGiven :1; unsigned BSIM3pvoffGiven :1; - unsigned BSIM3prdswGiven :1; - unsigned BSIM3pprwgGiven :1; - unsigned BSIM3pprwbGiven :1; - unsigned BSIM3pprtGiven :1; - unsigned BSIM3peta0Given :1; - unsigned BSIM3petabGiven :1; - unsigned BSIM3ppclmGiven :1; - unsigned BSIM3ppdibl1Given :1; - unsigned BSIM3ppdibl2Given :1; - unsigned BSIM3ppdiblbGiven :1; - unsigned BSIM3ppscbe1Given :1; - unsigned BSIM3ppscbe2Given :1; - unsigned BSIM3ppvagGiven :1; - unsigned BSIM3pdeltaGiven :1; + unsigned BSIM3prdswGiven :1; + unsigned BSIM3pprwgGiven :1; + unsigned BSIM3pprwbGiven :1; + unsigned BSIM3pprtGiven :1; + unsigned BSIM3peta0Given :1; + unsigned BSIM3petabGiven :1; + unsigned BSIM3ppclmGiven :1; + unsigned BSIM3ppdibl1Given :1; + unsigned BSIM3ppdibl2Given :1; + unsigned BSIM3ppdiblbGiven :1; + unsigned BSIM3ppscbe1Given :1; + unsigned BSIM3ppscbe2Given :1; + unsigned BSIM3ppvagGiven :1; + unsigned BSIM3pdeltaGiven :1; unsigned BSIM3pwrGiven :1; unsigned BSIM3pdwgGiven :1; unsigned BSIM3pdwbGiven :1; @@ -1198,7 +1198,7 @@ typedef struct sBSIM3model unsigned BSIM3pvfbGiven :1; /* CV model */ - unsigned BSIM3pelmGiven :1; + unsigned BSIM3pelmGiven :1; unsigned BSIM3pcgslGiven :1; unsigned BSIM3pcgdlGiven :1; unsigned BSIM3pckappaGiven :1; @@ -1231,15 +1231,15 @@ typedef struct sBSIM3model unsigned BSIM3bulkJctGateSideGradingCoeffGiven :1; unsigned BSIM3unitLengthGateSidewallJctCapGiven :1; unsigned BSIM3jctEmissionCoeffGiven :1; - unsigned BSIM3jctTempExponentGiven :1; + unsigned BSIM3jctTempExponentGiven :1; - unsigned BSIM3oxideTrapDensityAGiven :1; - unsigned BSIM3oxideTrapDensityBGiven :1; - unsigned BSIM3oxideTrapDensityCGiven :1; - unsigned BSIM3emGiven :1; - unsigned BSIM3efGiven :1; - unsigned BSIM3afGiven :1; - unsigned BSIM3kfGiven :1; + unsigned BSIM3oxideTrapDensityAGiven :1; + unsigned BSIM3oxideTrapDensityBGiven :1; + unsigned BSIM3oxideTrapDensityCGiven :1; + unsigned BSIM3emGiven :1; + unsigned BSIM3efGiven :1; + unsigned BSIM3afGiven :1; + unsigned BSIM3kfGiven :1; unsigned BSIM3lintnoiGiven :1; unsigned BSIM3LintGiven :1; @@ -1295,8 +1295,8 @@ typedef struct sBSIM3model /* model parameters */ #define BSIM3_MOD_CAPMOD 101 -#define BSIM3_MOD_MOBMOD 103 -#define BSIM3_MOD_NOIMOD 104 +#define BSIM3_MOD_MOBMOD 103 +#define BSIM3_MOD_NOIMOD 104 #define BSIM3_MOD_TOX 105 @@ -1310,14 +1310,14 @@ typedef struct sBSIM3model #define BSIM3_MOD_A0 113 #define BSIM3_MOD_A1 114 #define BSIM3_MOD_A2 115 -#define BSIM3_MOD_KETA 116 +#define BSIM3_MOD_KETA 116 #define BSIM3_MOD_NSUB 117 #define BSIM3_MOD_NPEAK 118 #define BSIM3_MOD_NGATE 120 #define BSIM3_MOD_GAMMA1 121 #define BSIM3_MOD_GAMMA2 122 #define BSIM3_MOD_VBX 123 -#define BSIM3_MOD_BINUNIT 124 +#define BSIM3_MOD_BINUNIT 124 #define BSIM3_MOD_VBM 125 @@ -1419,7 +1419,7 @@ typedef struct sBSIM3model #define BSIM3_MOD_LA0 258 #define BSIM3_MOD_LA1 259 #define BSIM3_MOD_LA2 260 -#define BSIM3_MOD_LKETA 261 +#define BSIM3_MOD_LKETA 261 #define BSIM3_MOD_LNSUB 262 #define BSIM3_MOD_LNPEAK 263 #define BSIM3_MOD_LNGATE 265 @@ -1487,7 +1487,7 @@ typedef struct sBSIM3model #define BSIM3_MOD_LCDSCD 327 #define BSIM3_MOD_LAGS 328 - + #define BSIM3_MOD_LFRINGE 331 #define BSIM3_MOD_LELM 332 @@ -1516,7 +1516,7 @@ typedef struct sBSIM3model #define BSIM3_MOD_WA0 388 #define BSIM3_MOD_WA1 389 #define BSIM3_MOD_WA2 390 -#define BSIM3_MOD_WKETA 391 +#define BSIM3_MOD_WKETA 391 #define BSIM3_MOD_WNSUB 392 #define BSIM3_MOD_WNPEAK 393 #define BSIM3_MOD_WNGATE 395 @@ -1613,7 +1613,7 @@ typedef struct sBSIM3model #define BSIM3_MOD_PA0 518 #define BSIM3_MOD_PA1 519 #define BSIM3_MOD_PA2 520 -#define BSIM3_MOD_PKETA 521 +#define BSIM3_MOD_PKETA 521 #define BSIM3_MOD_PNSUB 522 #define BSIM3_MOD_PNPEAK 523 #define BSIM3_MOD_PNGATE 525 @@ -1810,8 +1810,8 @@ typedef struct sBSIM3model #include "bsim3ext.h" extern void BSIM3evaluate(double,double,double,BSIM3instance*,BSIM3model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, + double*,double*,double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); extern int BSIM3debug(BSIM3model*, BSIM3instance*, CKTcircuit*, int); extern int BSIM3checkModel(BSIM3model*, BSIM3instance*, CKTcircuit*); From face333ee207c40d27b801606bcf759b257000bd Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 7 May 2013 11:14:57 +0200 Subject: [PATCH 049/257] This is the delvto/mulu0 instance extension to bsim3v3 --- src/spicelib/devices/bsim3/b3.c | 6 +++- src/spicelib/devices/bsim3/b3ask.c | 6 ++++ src/spicelib/devices/bsim3/b3ld.c | 42 +++++++++++++-------------- src/spicelib/devices/bsim3/b3par.c | 8 +++++ src/spicelib/devices/bsim3/b3set.c | 4 +++ src/spicelib/devices/bsim3/b3temp.c | 10 +++++++ src/spicelib/devices/bsim3/bsim3def.h | 13 ++++++++- 7 files changed, 66 insertions(+), 23 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index a97598eaa..35a39c44e 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -26,7 +26,9 @@ IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"), IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"), IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), IOP( "acnqsmod", BSIM3_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), -IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), +IOP( "delvto", BSIM3_DELVTO, IF_REAL, "Zero bias threshold voltage variation"), +IOP( "mulu0", BSIM3_MULU0, IF_REAL, "Low field mobility multiplier"), +IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), OP( "gm", BSIM3_GM, IF_REAL, "Gm"), OP( "gds", BSIM3_GDS, IF_REAL, "Gds"), @@ -499,3 +501,5 @@ int BSIM3mPTSize = NUMELEMS(BSIM3mPTable); int BSIM3iSize = sizeof(BSIM3instance); int BSIM3mSize = sizeof(BSIM3model); + + diff --git a/src/spicelib/devices/bsim3/b3ask.c b/src/spicelib/devices/bsim3/b3ask.c index 1a0138fae..be0631acc 100644 --- a/src/spicelib/devices/bsim3/b3ask.c +++ b/src/spicelib/devices/bsim3/b3ask.c @@ -65,6 +65,12 @@ BSIM3instance *here = (BSIM3instance*)inst; case BSIM3_ACNQSMOD: value->iValue = here->BSIM3acnqsMod; return(OK); + case BSIM3_DELVTO: + value->rValue = here->BSIM3delvto; + return(OK); + case BSIM3_MULU0: + value->rValue = here->BSIM3mulu0; + return(OK); case BSIM3_IC_VBS: value->rValue = here->BSIM3icVBS; return(OK); diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index 88a2ca769..2cf4bcd4e 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -212,7 +212,7 @@ for (; model != NULL; model = model->BSIM3nextModel) ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) { vbs = 0.0; - vgs = model->BSIM3type * pParam->BSIM3vth0 + 0.1; + vgs = model->BSIM3type * here->BSIM3vth0 + 0.1; vds = 0.1; } } @@ -579,7 +579,7 @@ for (; model != NULL; model = model->BSIM3nextModel) dDIBL_Sft_dVd = T3 * pParam->BSIM3theta0vb0; DIBL_Sft = dDIBL_Sft_dVd * Vds; - Vth = model->BSIM3type * pParam->BSIM3vth0 - pParam->BSIM3k1 + Vth = model->BSIM3type * here->BSIM3vth0 - pParam->BSIM3k1 * pParam->BSIM3sqrtPhi + pParam->BSIM3k1ox * sqrtPhis - pParam->BSIM3k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM3k3 + pParam->BSIM3k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; @@ -614,7 +614,7 @@ for (; model != NULL; model = model->BSIM3nextModel) } /* Poly Gate Si Depletion Effect */ - T0 = pParam->BSIM3vfb + pParam->BSIM3phi; + T0 = here->BSIM3vfb + pParam->BSIM3phi; if ((pParam->BSIM3ngate > 1.e18) && (pParam->BSIM3ngate < 1.e25) && (Vgs > T0)) /* added to avoid the problem caused by ngate */ @@ -816,7 +816,7 @@ for (; model != NULL; model = model->BSIM3nextModel) dDenomi_dVb *= T9; } - here->BSIM3ueff = ueff = pParam->BSIM3u0temp / Denomi; + here->BSIM3ueff = ueff = here->BSIM3u0temp / Denomi; T9 = -ueff / Denomi; dueff_dVg = T9 * dDenomi_dVg; dueff_dVd = T9 * dDenomi_dVd; @@ -1599,7 +1599,7 @@ for (; model != NULL; model = model->BSIM3nextModel) } /* End of VgsteffCV */ if (model->BSIM3capMod == 1) - { Vfb = pParam->BSIM3vfbzb; + { Vfb = here->BSIM3vfbzb; Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; if (Arg1 <= 0.0) @@ -1761,7 +1761,7 @@ for (; model != NULL; model = model->BSIM3nextModel) } else if (model->BSIM3capMod == 2) - { Vfb = pParam->BSIM3vfbzb; + { Vfb = here->BSIM3vfbzb; V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; if (Vfb <= 0.0) { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); @@ -1925,24 +1925,24 @@ for (; model != NULL; model = model->BSIM3nextModel) /* New Charge-Thickness capMod (CTM) begins */ else if (model->BSIM3capMod == 3) - { V3 = pParam->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (pParam->BSIM3vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + { V3 = here->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; + if (here->BSIM3vfbzb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM3vfbzb); T2 = -DELTA_3 / T0; } else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM3vfbzb); T2 = DELTA_3 / T0; } T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = pParam->BSIM3vfbzb - 0.5 * (V3 + T0); + Vfbeff = here->BSIM3vfbzb - 0.5 * (V3 + T0); dVfbeff_dVg = T1 * dVgs_eff_dVg; dVfbeff_dVb = -T1 * dVbseffCV_dVb; Cox = model->BSIM3cox; Tox = 1.0e8 * model->BSIM3tox; - T0 = (Vgs_eff - VbseffCV - pParam->BSIM3vfbzb) / Tox; + T0 = (Vgs_eff - VbseffCV - here->BSIM3vfbzb) / Tox; dT0_dVg = dVgs_eff_dVg / Tox; dT0_dVb = -dVbseffCV_dVb / Tox; @@ -1979,7 +1979,7 @@ for (; model != NULL; model = model->BSIM3nextModel) dCoxeff_dVg *= dTcen_dVg; CoxWLcen = CoxWL * Coxeff / Cox; - Qac0 = CoxWLcen * (Vfbeff - pParam->BSIM3vfbzb); + Qac0 = CoxWLcen * (Vfbeff - here->BSIM3vfbzb); QovCox = Qac0 / Coxeff; dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg; @@ -2032,7 +2032,7 @@ for (; model != NULL; model = model->BSIM3nextModel) VgDP = 0.5 * (T0 + T1); dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); - T3 = 4.0 * (Vth - pParam->BSIM3vfbzb - pParam->BSIM3phi); + T3 = 4.0 * (Vth - here->BSIM3vfbzb - pParam->BSIM3phi); Tox += Tox; if (T3 >= 0.0) { T0 = (Vgsteff + T3) / Tox; @@ -2424,9 +2424,9 @@ line755: here->BSIM3cqbb = -(here->BSIM3cqgb + here->BSIM3cqdb + here->BSIM3cqsb); - gtau_drift = fabs(pParam->BSIM3tconst * qcheq) * ScalingFactor; + gtau_drift = fabs(here->BSIM3tconst * qcheq) * ScalingFactor; T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; - gtau_diff = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm / T0 + gtau_diff = 16.0 * here->BSIM3u0temp * model->BSIM3vtm / T0 * ScalingFactor; here->BSIM3gtau = gtau_drift + gtau_diff; if (here->BSIM3acnqsMod) @@ -2535,9 +2535,9 @@ line755: } else { if (qcheq > 0.0) - T0 = pParam->BSIM3tconst * qdef * ScalingFactor; + T0 = here->BSIM3tconst * qdef * ScalingFactor; else - T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; + T0 = -here->BSIM3tconst * qdef * ScalingFactor; ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; ggtd = here->BSIM3gtd = T0 * here->BSIM3cqdb; ggts = here->BSIM3gts = T0 * here->BSIM3cqsb; @@ -2651,9 +2651,9 @@ line755: } else { if (qcheq > 0.0) - T0 = pParam->BSIM3tconst * qdef * ScalingFactor; + T0 = here->BSIM3tconst * qdef * ScalingFactor; else - T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; + T0 = -here->BSIM3tconst * qdef * ScalingFactor; ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; ggts = here->BSIM3gtd = T0 * here->BSIM3cqdb; ggtd = here->BSIM3gts = T0 * here->BSIM3cqsb; @@ -2804,7 +2804,7 @@ line850: dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; if (here->BSIM3nqsMod) - here->BSIM3gtau = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm + here->BSIM3gtau = 16.0 * here->BSIM3u0temp * model->BSIM3vtm / pParam->BSIM3leffCV / pParam->BSIM3leffCV * ScalingFactor; else diff --git a/src/spicelib/devices/bsim3/b3par.c b/src/spicelib/devices/bsim3/b3par.c index 7ca78cd0e..632c2c4b0 100644 --- a/src/spicelib/devices/bsim3/b3par.c +++ b/src/spicelib/devices/bsim3/b3par.c @@ -91,6 +91,14 @@ IFvalue *select) here->BSIM3acnqsMod = value->iValue; here->BSIM3acnqsModGiven = TRUE; break; + case BSIM3_DELVTO: + here->BSIM3delvto = value->rValue; + here->BSIM3delvtoGiven = TRUE; + break; + case BSIM3_MULU0: + here->BSIM3mulu0 = value->rValue; + here->BSIM3mulu0Given = TRUE; + break; case BSIM3_IC: switch(value->v.numValue){ case 3: diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 44d5e5ce3..e58320828 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -875,6 +875,10 @@ BSIM3instance **InstArray; here->BSIM3drainPerimeter = 0.0; if (!here->BSIM3drainSquaresGiven) here->BSIM3drainSquares = 1.0; + if (!here->BSIM3delvtoGiven) + here->BSIM3delvto = 0.0; + if (!here->BSIM3mulu0Given) + here->BSIM3mulu0 = 1.0; if (!here->BSIM3icVBSGiven) here->BSIM3icVBS = 0.0; if (!here->BSIM3icVDSGiven) diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 62783d74c..315a97940 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -795,6 +795,16 @@ int Size_Not_Found; /* End of vfbzb */ } + /* adding delvto */ + here->BSIM3vth0 = pParam->BSIM3vth0 + here->BSIM3delvto; + here->BSIM3vfb = pParam->BSIM3vfb + model->BSIM3type * here->BSIM3delvto; + here->BSIM3vfbzb = pParam->BSIM3vfbzb + model->BSIM3type * here->BSIM3delvto; + + /* low field mobility multiplier */ + here->BSIM3u0temp = pParam->BSIM3u0temp * here->BSIM3mulu0; + here->BSIM3tconst = here->BSIM3u0temp * pParam->BSIM3elm / (model->BSIM3cox + * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0); + /* process source/drain series resistance */ here->BSIM3drainConductance = model->BSIM3sheetResistance * here->BSIM3drainSquares; diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index 4ecbb31ca..fbe6e1c02 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -53,6 +53,13 @@ typedef struct sBSIM3instance double BSIM3sourcePerimeter; double BSIM3sourceConductance; double BSIM3drainConductance; + double BSIM3delvto; + double BSIM3mulu0; + double BSIM3vth0; + double BSIM3vfb; + double BSIM3vfbzb; + double BSIM3u0temp; + double BSIM3tconst; double BSIM3icVBS; double BSIM3icVDS; @@ -122,6 +129,8 @@ typedef struct sBSIM3instance unsigned BSIM3sourceSquaresGiven :1; unsigned BSIM3drainPerimeterGiven :1; unsigned BSIM3sourcePerimeterGiven :1; + unsigned BSIM3delvtoGiven :1; + unsigned BSIM3mulu0Given :1; unsigned BSIM3dNodePrimeSet :1; unsigned BSIM3sNodePrimeSet :1; unsigned BSIM3icVBSGiven :1; @@ -1278,7 +1287,6 @@ typedef struct sBSIM3model /* device parameters */ #define BSIM3_W 1 #define BSIM3_L 2 -#define BSIM3_M 16 #define BSIM3_AS 3 #define BSIM3_AD 4 #define BSIM3_PS 5 @@ -1292,6 +1300,9 @@ typedef struct sBSIM3model #define BSIM3_IC 13 #define BSIM3_NQSMOD 14 #define BSIM3_ACNQSMOD 15 +#define BSIM3_M 16 +#define BSIM3_DELVTO 17 +#define BSIM3_MULU0 18 /* model parameters */ #define BSIM3_MOD_CAPMOD 101 From bd0dd7e46588acbe3e675b3c7b5be158b992dd36 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 7 May 2013 22:35:20 +0200 Subject: [PATCH 050/257] Wrong version in a log message --- src/spicelib/devices/bsim3/b3temp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 315a97940..2f6582f01 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -609,7 +609,7 @@ int Size_Not_Found; { IFuid namarray[2]; namarray[0] = model->BSIM3modName; namarray[1] = here->BSIM3name; - SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.2 parameter checking for %s in model %s", namarray); + SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.3 parameter checking for %s in model %s", namarray); return(E_BADPARM); } From 7108aae784a8e5c79bab420fc7349baea09be9e5 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Tue, 7 May 2013 23:09:57 +0200 Subject: [PATCH 051/257] resload.c, restemp.c tc1, tc2 instance parameters override model parameters --- src/spicelib/devices/res/resload.c | 33 ++++++++---------------------- src/spicelib/devices/res/restemp.c | 18 +++++++++++++--- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index f9ee09a31..e0d52f1b2 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -17,31 +17,22 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) { RESmodel *model = (RESmodel *)inModel; double m; - double difference; - double factor; - /* loop through all the resistor models */ for( ; model != NULL; model = model->RESnextModel ) { - RESinstance *here; + RESinstance *here; /* loop through all the instances of the model */ for (here = model->RESinstances; here != NULL ; here = here->RESnextInstance) { - if(!here->REStc1Given) here->REStc1 = 0.0; - if(!here->REStc2Given) here->REStc2 = 0.0; - if(!here->RESmGiven) here->RESm = 1.0; + if(!here->RESmGiven) + here->RESm = 1.0; here->REScurrent = (*(ckt->CKTrhsOld+here->RESposNode) - *(ckt->CKTrhsOld+here->RESnegNode)) * here->RESconduct; - - difference = (here->REStemp + here->RESdtemp) - 300.15; - factor = 1.0 + (here->REStc1)*difference + - (here->REStc2)*difference*difference; - - m = (here->RESm)/factor; + m = (here->RESm); *(here->RESposPosptr) += m * here->RESconduct; *(here->RESnegNegptr) += m * here->RESconduct; *(here->RESposNegptr) -= m * here->RESconduct; @@ -59,29 +50,21 @@ RESacload(GENmodel *inModel, CKTcircuit *ckt) { RESmodel *model = (RESmodel *)inModel; double m; - double difference; - double factor; NG_IGNORE(ckt); /* loop through all the resistor models */ for( ; model != NULL; model = model->RESnextModel ) { - RESinstance *here; + RESinstance *here; /* loop through all the instances of the model */ for (here = model->RESinstances; here != NULL ; here = here->RESnextInstance) { - if(!here->REStc1Given) here->REStc1 = 0.0; - if(!here->REStc2Given) here->REStc2 = 0.0; - if(!here->RESmGiven) here->RESm = 1.0; + if(!here->RESmGiven) + here->RESm = 1.0; - difference = (here->REStemp + here->RESdtemp) - 300.15; - factor = 1.0 + (here->REStc1)*difference + - (here->REStc2)*difference*difference; - - m = (here->RESm)/factor; - + m = (here->RESm); if(here->RESacresGiven) { *(here->RESposPosptr) += m * here->RESacConduct; *(here->RESnegNegptr) += m * here->RESacConduct; diff --git a/src/spicelib/devices/res/restemp.c b/src/spicelib/devices/res/restemp.c index dc9f47dda..64b091c3b 100644 --- a/src/spicelib/devices/res/restemp.c +++ b/src/spicelib/devices/res/restemp.c @@ -23,6 +23,7 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) RESinstance *here; double factor; double difference; + double tc1, tc2; /* loop through all the resistor models */ @@ -74,11 +75,22 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) difference = (here->REStemp + here->RESdtemp) - model->REStnom; - factor = 1.0 + (model->REStempCoeff1)*difference + - (model->REStempCoeff2)*difference*difference; + /* instance parameters tc1 and tc2 will override + model parameters tc1 and tc2 */ + if (here->REStc1Given) + tc1 = here->REStc1; /* instance */ + else + tc1 = model->REStempCoeff1; /* model */ + + if (here->REStc2Given) + tc2 = here->REStc2; + else + tc2 = model->REStempCoeff2; + + factor = 1.0 + tc1*difference + + tc2*difference*difference; here -> RESconduct = (1.0/(here->RESresist * factor * here->RESscale)); - /* Paolo Nenzi: AC value */ if(here->RESacresGiven) From b4b345f345e83403742ca6da3c884a1feef65dd6 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 8 May 2013 08:43:02 +0200 Subject: [PATCH 052/257] Move instance m-Factor into ressetup --- src/spicelib/devices/res/resload.c | 3 --- src/spicelib/devices/res/ressetup.c | 20 ++++---------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index e0d52f1b2..5720661ba 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -26,9 +26,6 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) for (here = model->RESinstances; here != NULL ; here = here->RESnextInstance) { - if(!here->RESmGiven) - here->RESm = 1.0; - here->REScurrent = (*(ckt->CKTrhsOld+here->RESposNode) - *(ckt->CKTrhsOld+here->RESnegNode)) * here->RESconduct; diff --git a/src/spicelib/devices/res/ressetup.c b/src/spicelib/devices/res/ressetup.c index d9b1f148a..80c7c0e5b 100644 --- a/src/spicelib/devices/res/ressetup.c +++ b/src/spicelib/devices/res/ressetup.c @@ -28,22 +28,10 @@ RESsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit*ckt, int *state) /* loop through all the instances of the model */ for (here = model->RESinstances; here != NULL ; here=here->RESnextInstance) { - -/* - * Paolo Nenzi 2003 - * The following lines are needed if I will move the defaulting code - * from REStemp to RESsetup, as in other (more recent ?) spice devices - * - * ------------------------------------------LEGACY CODE - Francesco Lannutti - October 22, 2012 - * if (here->RESowner != ARCHme) - * goto matrixpointers; - * - * matrixpointers: - * ------------------------------------------ - * - * put here instance parameter defaulting. - */ - + + if(!here->RESmGiven) + here->RESm = 1.0; + /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ From dd32bb0e0a20482a32e26c5a1e5ece9363fc6b6b Mon Sep 17 00:00:00 2001 From: h_vogt Date: Wed, 8 May 2013 22:32:10 +0200 Subject: [PATCH 053/257] cap: add tc1, tc2 instance parameters --- src/spicelib/devices/cap/cap.c | 2 ++ src/spicelib/devices/cap/capacld.c | 5 +++-- src/spicelib/devices/cap/capdefs.h | 6 ++++++ src/spicelib/devices/cap/capload.c | 4 ++-- src/spicelib/devices/cap/capparam.c | 8 ++++++++ src/spicelib/devices/cap/captemp.c | 19 ++++++++++++++++--- 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/spicelib/devices/cap/cap.c b/src/spicelib/devices/cap/cap.c index 88841cae4..3b0984fe9 100644 --- a/src/spicelib/devices/cap/cap.c +++ b/src/spicelib/devices/cap/cap.c @@ -20,6 +20,8 @@ IFparm CAPpTable[] = { /* parameters */ IOPAU("w", CAP_WIDTH, IF_REAL, "Device width"), IOPAU("l", CAP_LENGTH, IF_REAL, "Device length"), IOPU( "m", CAP_M, IF_REAL, "Parallel multiplier"), + IOPU( "tc1", CAP_TC1, IF_REAL, "First order temp. coefficient"), + IOPU( "tc2", CAP_TC2, IF_REAL, "Second order temp. coefficient"), IOPU( "scale", CAP_SCALE, IF_REAL, "Scale factor"), IP( "sens_cap", CAP_CAP_SENS, IF_FLAG, "flag to request sens. WRT cap."), OP( "i", CAP_CURRENT, IF_REAL, "Device current"), diff --git a/src/spicelib/devices/cap/capacld.c b/src/spicelib/devices/cap/capacld.c index 4c1598f96..959c76382 100644 --- a/src/spicelib/devices/cap/capacld.c +++ b/src/spicelib/devices/cap/capacld.c @@ -19,13 +19,14 @@ CAPacLoad(GENmodel *inModel, CKTcircuit *ckt) CAPmodel *model = (CAPmodel*)inModel; double val; double m; + CAPinstance *here; for( ; model != NULL; model = model->CAPnextModel) { for( here = model->CAPinstances;here != NULL; here = here->CAPnextInstance) { - - m = here -> CAPm; + + m = here->CAPm; val = ckt->CKTomega * here->CAPcapac; diff --git a/src/spicelib/devices/cap/capdefs.h b/src/spicelib/devices/cap/capdefs.h index 321460c59..83bc50166 100644 --- a/src/spicelib/devices/cap/capdefs.h +++ b/src/spicelib/devices/cap/capdefs.h @@ -35,6 +35,8 @@ typedef struct sCAPinstance { double CAPlength; /* length of the capacitor */ double CAPscale; /* scale factor */ double CAPm; /* parallel multiplier */ + double CAPtc1; /* first temperature coefficient of capacitors */ + double CAPtc2; /* second temperature coefficient of capacitors */ double *CAPposPosptr; /* pointer to sparse matrix diagonal at * (positive,positive) */ @@ -52,6 +54,8 @@ typedef struct sCAPinstance { unsigned CAPdtempGiven : 1; /* flag to indicate delta temp given */ unsigned CAPscaleGiven : 1; /* flag to indicate scale factor given */ unsigned CAPmGiven : 1; /* flag to indicate parallel multiplier given */ + unsigned CAPtc1Given : 1; /* flag indicates tc1 was specified */ + unsigned CAPtc2Given : 1; /* flag indicates tc2 was specified */ int CAPsenParmNo; /* parameter # for sensitivity use; set equal to 0 if not a design parameter*/ @@ -113,6 +117,8 @@ typedef struct sCAPmodel { /* model structure for a capacitor */ #define CAP_DTEMP 9 #define CAP_SCALE 10 #define CAP_M 11 +#define CAP_TC1 12 +#define CAP_TC2 13 /* model parameters */ #define CAP_MOD_CJ 101 diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index e80b1179a..21cda6551 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -41,8 +41,8 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) for (here = model->CAPinstances; here != NULL ; here=here->CAPnextInstance) { - m = here->CAPm; - + m = here->CAPm; + if(cond1) { vcap = here->CAPinitCond; } else { diff --git a/src/spicelib/devices/cap/capparam.c b/src/spicelib/devices/cap/capparam.c index 1a11fd5c4..f37ced9c8 100644 --- a/src/spicelib/devices/cap/capparam.c +++ b/src/spicelib/devices/cap/capparam.c @@ -59,6 +59,14 @@ CAPparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) case CAP_CAP_SENS: here->CAPsenParmNo = value->iValue; break; + case CAP_TC1: + here->CAPtc1 = value->rValue; + here->CAPtc1Given = TRUE; + break; + case CAP_TC2: + here->CAPtc2 = value->rValue; + here->CAPtc2Given = TRUE; + break; default: return(E_BADPARM); } diff --git a/src/spicelib/devices/cap/captemp.c b/src/spicelib/devices/cap/captemp.c index 03f196461..a0ea8f085 100644 --- a/src/spicelib/devices/cap/captemp.c +++ b/src/spicelib/devices/cap/captemp.c @@ -26,6 +26,7 @@ CAPtemp(GENmodel *inModel, CKTcircuit *ckt) CAPinstance *here; double difference; double factor; + double tc1, tc2; /* loop through all the capacitor models */ for( ; model != NULL; model = model->CAPnextModel ) { @@ -66,10 +67,22 @@ CAPtemp(GENmodel *inModel, CKTcircuit *ckt) } difference = (here->CAPtemp + here->CAPdtemp) - model->CAPtnom; - - factor = 1.0 + (model->CAPtempCoeff1)*difference + - (model->CAPtempCoeff2)*difference*difference; + /* instance parameters tc1 and tc2 will override + model parameters tc1 and tc2 */ + if (here->CAPtc1Given) + tc1 = here->CAPtc1; /* instance */ + else + tc1 = model->CAPtempCoeff1; /* model */ + + if (here->CAPtc2Given) + tc2 = here->CAPtc2; + else + tc2 = model->CAPtempCoeff2; + + factor = 1.0 + tc1*difference + + tc2*difference*difference; + here->CAPcapac = here->CAPcapac * factor * here->CAPscale; } From ba7f6c4a7a753ba3953d5d8b41991847e60832dc Mon Sep 17 00:00:00 2001 From: h_vogt Date: Wed, 8 May 2013 22:36:26 +0200 Subject: [PATCH 054/257] cap: indentations, white spaces --- src/spicelib/devices/cap/cap.c | 82 ++++++++++----------- src/spicelib/devices/cap/capacld.c | 6 +- src/spicelib/devices/cap/capdefs.h | 30 ++++---- src/spicelib/devices/cap/capload.c | 30 ++++---- src/spicelib/devices/cap/capmask.c | 76 ++++++++++---------- src/spicelib/devices/cap/capmpar.c | 108 ++++++++++++++-------------- src/spicelib/devices/cap/capparam.c | 94 ++++++++++++------------ src/spicelib/devices/cap/captemp.c | 86 +++++++++++----------- 8 files changed, 256 insertions(+), 256 deletions(-) diff --git a/src/spicelib/devices/cap/cap.c b/src/spicelib/devices/cap/cap.c index 3b0984fe9..f4c73e2d1 100644 --- a/src/spicelib/devices/cap/cap.c +++ b/src/spicelib/devices/cap/cap.c @@ -9,50 +9,50 @@ Modified: September 2003 - Paolo Nenzi #include "capdefs.h" #include "ngspice/suffix.h" -IFparm CAPpTable[] = { /* parameters */ - IOPAP("capacitance", CAP_CAP, IF_REAL, "Device capacitance"), - IOPAP("cap", CAP_CAP, IF_REAL, "Device capacitance"), - IOPAP("c", CAP_CAP, IF_REAL, "Device capacitance"), - IOPAU("ic", CAP_IC, IF_REAL, "Initial capacitor voltage"), - IOPZU("temp", CAP_TEMP, IF_REAL, "Instance operating temperature"), - IOPZ( "dtemp", CAP_DTEMP, IF_REAL, - "Instance temperature difference from the rest of the circuit"), - IOPAU("w", CAP_WIDTH, IF_REAL, "Device width"), - IOPAU("l", CAP_LENGTH, IF_REAL, "Device length"), - IOPU( "m", CAP_M, IF_REAL, "Parallel multiplier"), - IOPU( "tc1", CAP_TC1, IF_REAL, "First order temp. coefficient"), - IOPU( "tc2", CAP_TC2, IF_REAL, "Second order temp. coefficient"), - IOPU( "scale", CAP_SCALE, IF_REAL, "Scale factor"), - IP( "sens_cap", CAP_CAP_SENS, IF_FLAG, "flag to request sens. WRT cap."), - OP( "i", CAP_CURRENT, IF_REAL, "Device current"), - OP( "p", CAP_POWER, IF_REAL, "Instantaneous device power"), - OPU( "sens_dc", CAP_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), - OPU( "sens_real", CAP_QUEST_SENS_REAL, IF_REAL, "real part of ac sensitivity"), - OPU( "sens_imag", CAP_QUEST_SENS_IMAG, IF_REAL, - "dc sens. & imag part of ac sens."), - OPU( "sens_mag", CAP_QUEST_SENS_MAG, IF_REAL, "sensitivity of ac magnitude"), - OPU( "sens_ph", CAP_QUEST_SENS_PH, IF_REAL, "sensitivity of ac phase"), - OPU( "sens_cplx", CAP_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") +IFparm CAPpTable[] = { /* parameters */ + IOPAP("capacitance", CAP_CAP, IF_REAL, "Device capacitance"), + IOPAP("cap", CAP_CAP, IF_REAL, "Device capacitance"), + IOPAP("c", CAP_CAP, IF_REAL, "Device capacitance"), + IOPAU("ic", CAP_IC, IF_REAL, "Initial capacitor voltage"), + IOPZU("temp", CAP_TEMP, IF_REAL, "Instance operating temperature"), + IOPZ( "dtemp", CAP_DTEMP, IF_REAL, + "Instance temperature difference from the rest of the circuit"), + IOPAU("w", CAP_WIDTH, IF_REAL, "Device width"), + IOPAU("l", CAP_LENGTH, IF_REAL, "Device length"), + IOPU( "m", CAP_M, IF_REAL, "Parallel multiplier"), + IOPU( "tc1", CAP_TC1, IF_REAL, "First order temp. coefficient"), + IOPU( "tc2", CAP_TC2, IF_REAL, "Second order temp. coefficient"), + IOPU( "scale", CAP_SCALE, IF_REAL, "Scale factor"), + IP( "sens_cap", CAP_CAP_SENS, IF_FLAG, "flag to request sens. WRT cap."), + OP( "i", CAP_CURRENT, IF_REAL, "Device current"), + OP( "p", CAP_POWER, IF_REAL, "Instantaneous device power"), + OPU( "sens_dc", CAP_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), + OPU( "sens_real", CAP_QUEST_SENS_REAL, IF_REAL, "real part of ac sensitivity"), + OPU( "sens_imag", CAP_QUEST_SENS_IMAG, IF_REAL, + "dc sens. & imag part of ac sens."), + OPU( "sens_mag", CAP_QUEST_SENS_MAG, IF_REAL, "sensitivity of ac magnitude"), + OPU( "sens_ph", CAP_QUEST_SENS_PH, IF_REAL, "sensitivity of ac phase"), + OPU( "sens_cplx", CAP_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") }; IFparm CAPmPTable[] = { /* names of model parameters */ - IOPA( "cap", CAP_MOD_CAP, IF_REAL, "Model capacitance"), - IOPA( "cj", CAP_MOD_CJ, IF_REAL, "Bottom Capacitance per area"), - IOPR( "cox", CAP_MOD_CJ, IF_REAL, "Bottom Capacitance per area"), - IOPA( "cjsw", CAP_MOD_CJSW, IF_REAL, "Sidewall capacitance per meter"), - IOPR( "capsw", CAP_MOD_CJSW, IF_REAL, "Sidewall capacitance per meter"), - IOPX( "defw", CAP_MOD_DEFWIDTH, IF_REAL, "Default width"), - IOPR( "w", CAP_MOD_DEFWIDTH, IF_REAL, "Default width"), - IOPX( "defl", CAP_MOD_DEFLENGTH,IF_REAL, "Default length"), - IOPR( "l", CAP_MOD_DEFLENGTH,IF_REAL, "Default length"), - IOPA( "narrow", CAP_MOD_NARROW, IF_REAL, "width correction factor"), - IOPA( "short", CAP_MOD_SHORT, IF_REAL, "length correction factor"), - IOPA( "tc1", CAP_MOD_TC1, IF_REAL, "First order temp. coefficient"), - IOPA( "tc2", CAP_MOD_TC2, IF_REAL, "Second order temp. coefficient"), - IOPXU("tnom", CAP_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), - IOPA( "di", CAP_MOD_DI, IF_REAL, "Relative dielectric constant"), - IOPA( "thick", CAP_MOD_THICK, IF_REAL, "Insulator thickness"), - IP( "c", CAP_MOD_C, IF_FLAG, "Capacitor model") + IOPA( "cap", CAP_MOD_CAP, IF_REAL, "Model capacitance"), + IOPA( "cj", CAP_MOD_CJ, IF_REAL, "Bottom Capacitance per area"), + IOPR( "cox", CAP_MOD_CJ, IF_REAL, "Bottom Capacitance per area"), + IOPA( "cjsw", CAP_MOD_CJSW, IF_REAL, "Sidewall capacitance per meter"), + IOPR( "capsw", CAP_MOD_CJSW, IF_REAL, "Sidewall capacitance per meter"), + IOPX( "defw", CAP_MOD_DEFWIDTH, IF_REAL, "Default width"), + IOPR( "w", CAP_MOD_DEFWIDTH, IF_REAL, "Default width"), + IOPX( "defl", CAP_MOD_DEFLENGTH,IF_REAL, "Default length"), + IOPR( "l", CAP_MOD_DEFLENGTH,IF_REAL, "Default length"), + IOPA( "narrow", CAP_MOD_NARROW, IF_REAL, "width correction factor"), + IOPA( "short", CAP_MOD_SHORT, IF_REAL, "length correction factor"), + IOPA( "tc1", CAP_MOD_TC1, IF_REAL, "First order temp. coefficient"), + IOPA( "tc2", CAP_MOD_TC2, IF_REAL, "Second order temp. coefficient"), + IOPXU("tnom", CAP_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), + IOPA( "di", CAP_MOD_DI, IF_REAL, "Relative dielectric constant"), + IOPA( "thick", CAP_MOD_THICK, IF_REAL, "Insulator thickness"), + IP( "c", CAP_MOD_C, IF_FLAG, "Capacitor model") }; char *CAPnames[] = { diff --git a/src/spicelib/devices/cap/capacld.c b/src/spicelib/devices/cap/capacld.c index 959c76382..63a70bd0b 100644 --- a/src/spicelib/devices/cap/capacld.c +++ b/src/spicelib/devices/cap/capacld.c @@ -23,13 +23,13 @@ CAPacLoad(GENmodel *inModel, CKTcircuit *ckt) CAPinstance *here; for( ; model != NULL; model = model->CAPnextModel) { - for( here = model->CAPinstances;here != NULL; + for( here = model->CAPinstances; here != NULL; here = here->CAPnextInstance) { m = here->CAPm; - + val = ckt->CKTomega * here->CAPcapac; - + *(here->CAPposPosptr +1) += m * val; *(here->CAPnegNegptr +1) += m * val; *(here->CAPposNegptr +1) -= m * val; diff --git a/src/spicelib/devices/cap/capdefs.h b/src/spicelib/devices/cap/capdefs.h index 83bc50166..c195f2910 100644 --- a/src/spicelib/devices/cap/capdefs.h +++ b/src/spicelib/devices/cap/capdefs.h @@ -13,20 +13,20 @@ Modified: September 2003 Paolo Nenzi #include "ngspice/gendefs.h" #include "ngspice/cktdefs.h" - /* structures used to describe capacitors */ +/* structures used to describe capacitors */ /* information to describe each instance */ typedef struct sCAPinstance { struct sCAPmodel *CAPmodPtr; /* backpointer to model */ - struct sCAPinstance *CAPnextInstance; /* pointer to next instance of + struct sCAPinstance *CAPnextInstance; /* pointer to next instance of * current model*/ IFuid CAPname; /* pointer to character string naming this instance */ int CAPstate; /* pointer to start of capacitor state vector */ int CAPposNode; /* number of positive node of capacitor */ int CAPnegNode; /* number of negative node of capacitor */ - + double CAPtemp; /* temperature at which this capacitor operates */ double CAPdtemp; /* delta-temperature of this instance */ double CAPcapac; /* capacitance */ @@ -38,13 +38,13 @@ typedef struct sCAPinstance { double CAPtc1; /* first temperature coefficient of capacitors */ double CAPtc2; /* second temperature coefficient of capacitors */ - double *CAPposPosptr; /* pointer to sparse matrix diagonal at + double *CAPposPosptr; /* pointer to sparse matrix diagonal at * (positive,positive) */ - double *CAPnegNegptr; /* pointer to sparse matrix diagonal at + double *CAPnegNegptr; /* pointer to sparse matrix diagonal at * (negative,negative) */ - double *CAPposNegptr; /* pointer to sparse matrix offdiagonal at + double *CAPposNegptr; /* pointer to sparse matrix offdiagonal at * (positive,negative) */ - double *CAPnegPosptr; /* pointer to sparse matrix offdiagonal at + double *CAPnegPosptr; /* pointer to sparse matrix offdiagonal at * (negative,positive) */ unsigned CAPcapGiven : 1; /* flag to indicate capacitance was specified */ unsigned CAPicGiven : 1; /* flag to indicate init. cond. was specified */ @@ -53,7 +53,7 @@ typedef struct sCAPinstance { unsigned CAPtempGiven : 1; /* flag to indicate operating temp given */ unsigned CAPdtempGiven : 1; /* flag to indicate delta temp given */ unsigned CAPscaleGiven : 1; /* flag to indicate scale factor given */ - unsigned CAPmGiven : 1; /* flag to indicate parallel multiplier given */ + unsigned CAPmGiven : 1; /* flag to indicate parallel multiplier given */ unsigned CAPtc1Given : 1; /* flag indicates tc1 was specified */ unsigned CAPtc2Given : 1; /* flag indicates tc2 was specified */ int CAPsenParmNo; /* parameter # for sensitivity use; @@ -64,20 +64,20 @@ typedef struct sCAPinstance { #define CAPqcap CAPstate /* charge on the capacitor */ #define CAPccap CAPstate+1 /* current through the capacitor */ #define CAPsensxp CAPstate+2 /* charge sensitivities and their derivatives. - +3 for the derivatives - pointer to the - beginning of the array */ - ++3 for the derivatives - pointer to the +beginning of the array */ + /* data per model */ typedef struct sCAPmodel { /* model structure for a capacitor */ int CAPmodType; /* type index of this device type */ - struct sCAPmodel *CAPnextModel; /* pointer to next possible model in + struct sCAPmodel *CAPnextModel; /* pointer to next possible model in * linked list */ CAPinstance * CAPinstances; /* pointer to list of instances that have this * model */ IFuid CAPmodName; /* pointer to character string naming this model */ - + double CAPtnom; /* temperature at which capacitance measured */ double CAPtempCoeff1; /* linear temperature coefficient */ double CAPtempCoeff2; /* quadratic temperature coefficient */ @@ -102,7 +102,7 @@ typedef struct sCAPmodel { /* model structure for a capacitor */ unsigned CAPtc2Given : 1; /* flag indicates tc2 was specified */ unsigned CAPdiGiven : 1; /* flag indicates epsilon-ins given */ unsigned CAPthickGiven : 1; /* flags indicates insulator thickness given */ - + } CAPmodel; /* device parameters */ @@ -115,7 +115,7 @@ typedef struct sCAPmodel { /* model structure for a capacitor */ #define CAP_POWER 7 #define CAP_TEMP 8 #define CAP_DTEMP 9 -#define CAP_SCALE 10 +#define CAP_SCALE 10 #define CAP_M 11 #define CAP_TC1 12 #define CAP_TC2 13 diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index 21cda6551..d6796d5b2 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -13,9 +13,9 @@ Modified: September 2003 Paolo Nenzi int CAPload(GENmodel *inModel, CKTcircuit *ckt) - /* actually load the current capacitance value into the - * sparse matrix previously provided - */ +/* actually load the current capacitance value into the + * sparse matrix previously provided + */ { CAPmodel *model = (CAPmodel*)inModel; CAPinstance *here; @@ -29,46 +29,46 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) /* check if capacitors are in the circuit or are open circuited */ if(ckt->CKTmode & (MODETRAN|MODEAC|MODETRANOP) ) { /* evaluate device independent analysis conditions */ - cond1= - ( ( (ckt->CKTmode & MODEDC) && + cond1= + ( ( (ckt->CKTmode & MODEDC) && (ckt->CKTmode & MODEINITJCT) ) - || ( ( ckt->CKTmode & MODEUIC) && - ( ckt->CKTmode & MODEINITTRAN) ) ) ; + || ( ( ckt->CKTmode & MODEUIC) && + ( ckt->CKTmode & MODEINITTRAN) ) ) ; /* loop through all the capacitor models */ for( ; model != NULL; model = model->CAPnextModel ) { /* loop through all the instances of the model */ for (here = model->CAPinstances; here != NULL ; here=here->CAPnextInstance) { - + m = here->CAPm; if(cond1) { vcap = here->CAPinitCond; } else { - vcap = *(ckt->CKTrhsOld+here->CAPposNode) - - *(ckt->CKTrhsOld+here->CAPnegNode) ; + vcap = *(ckt->CKTrhsOld+here->CAPposNode) - + *(ckt->CKTrhsOld+here->CAPnegNode) ; } if(ckt->CKTmode & (MODETRAN | MODEAC)) { #ifndef PREDICTOR if(ckt->CKTmode & MODEINITPRED) { - *(ckt->CKTstate0+here->CAPqcap) = + *(ckt->CKTstate0+here->CAPqcap) = *(ckt->CKTstate1+here->CAPqcap); } else { /* only const caps - no poly's */ #endif /* PREDICTOR */ *(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap; if((ckt->CKTmode & MODEINITTRAN)) { - *(ckt->CKTstate1+here->CAPqcap) = + *(ckt->CKTstate1+here->CAPqcap) = *(ckt->CKTstate0+here->CAPqcap); } #ifndef PREDICTOR } #endif /* PREDICTOR */ error = NIintegrate(ckt,&geq,&ceq,here->CAPcapac, - here->CAPqcap); + here->CAPqcap); if(error) return(error); if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1+here->CAPccap) = + *(ckt->CKTstate1+here->CAPccap) = *(ckt->CKTstate0+here->CAPccap); } *(here->CAPposPosptr) += m * geq; @@ -78,7 +78,7 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTrhs+here->CAPposNode) -= m * ceq; *(ckt->CKTrhs+here->CAPnegNode) += m * ceq; } else - *(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap; + *(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap; } } } diff --git a/src/spicelib/devices/cap/capmask.c b/src/spicelib/devices/cap/capmask.c index 498094e3c..efd216426 100644 --- a/src/spicelib/devices/cap/capmask.c +++ b/src/spicelib/devices/cap/capmask.c @@ -24,43 +24,43 @@ CAPmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) NG_IGNORE(ckt); switch(which) { - case CAP_MOD_TNOM: - value->rValue = here->CAPtnom-CONSTCtoK; - return(OK); - case CAP_MOD_TC1: - value->rValue = here->CAPtempCoeff1; - return(OK); - case CAP_MOD_TC2: - value->rValue = here->CAPtempCoeff2; - return(OK); - case CAP_MOD_CAP: - value->rValue = here->CAPmCap; - return(OK); - case CAP_MOD_CJ: - value->rValue = here->CAPcj; - return(OK); - case CAP_MOD_CJSW: - value->rValue = here->CAPcjsw; - return(OK); - case CAP_MOD_DEFWIDTH: - value->rValue = here->CAPdefWidth; - return(OK); - case CAP_MOD_DEFLENGTH: - value->rValue = here->CAPdefLength; - return(OK); - case CAP_MOD_NARROW: - value->rValue = here->CAPnarrow; - return(OK); - case CAP_MOD_SHORT: - value->rValue = here->CAPshort; - return(OK); - case CAP_MOD_DI: - value->rValue = here->CAPdi; - return(OK); - case CAP_MOD_THICK: - value->rValue = here->CAPthick; - return(OK); - default: - return(E_BADPARM); + case CAP_MOD_TNOM: + value->rValue = here->CAPtnom-CONSTCtoK; + return(OK); + case CAP_MOD_TC1: + value->rValue = here->CAPtempCoeff1; + return(OK); + case CAP_MOD_TC2: + value->rValue = here->CAPtempCoeff2; + return(OK); + case CAP_MOD_CAP: + value->rValue = here->CAPmCap; + return(OK); + case CAP_MOD_CJ: + value->rValue = here->CAPcj; + return(OK); + case CAP_MOD_CJSW: + value->rValue = here->CAPcjsw; + return(OK); + case CAP_MOD_DEFWIDTH: + value->rValue = here->CAPdefWidth; + return(OK); + case CAP_MOD_DEFLENGTH: + value->rValue = here->CAPdefLength; + return(OK); + case CAP_MOD_NARROW: + value->rValue = here->CAPnarrow; + return(OK); + case CAP_MOD_SHORT: + value->rValue = here->CAPshort; + return(OK); + case CAP_MOD_DI: + value->rValue = here->CAPdi; + return(OK); + case CAP_MOD_THICK: + value->rValue = here->CAPthick; + return(OK); + default: + return(E_BADPARM); } } diff --git a/src/spicelib/devices/cap/capmpar.c b/src/spicelib/devices/cap/capmpar.c index 64a37fd70..f81da7eee 100644 --- a/src/spicelib/devices/cap/capmpar.c +++ b/src/spicelib/devices/cap/capmpar.c @@ -18,60 +18,60 @@ CAPmParam(int param, IFvalue *value, GENmodel *inModel) { CAPmodel *mod = (CAPmodel*)inModel; switch(param) { - case CAP_MOD_TNOM: - mod->CAPtnom = value->rValue+CONSTCtoK; - mod->CAPtnomGiven = TRUE; - break; - case CAP_MOD_TC1: - mod->CAPtempCoeff1 = value->rValue; - mod->CAPtc1Given = TRUE; - break; - case CAP_MOD_TC2: - mod->CAPtempCoeff2 = value->rValue; - mod->CAPtc2Given = TRUE; - break; - case CAP_MOD_CAP: - mod->CAPmCap = value->rValue; - mod->CAPmCapGiven = TRUE; - break; - case CAP_MOD_CJ : - mod->CAPcj = value->rValue; - mod->CAPcjGiven = TRUE; - break; - case CAP_MOD_CJSW : - mod->CAPcjsw = value->rValue; - mod->CAPcjswGiven = TRUE; - break; - case CAP_MOD_DEFWIDTH: - mod->CAPdefWidth = value->rValue; - mod->CAPdefWidthGiven = TRUE; - break; - case CAP_MOD_DEFLENGTH: - mod->CAPdefLength = value->rValue; - mod->CAPdefLengthGiven = TRUE; - break; - case CAP_MOD_NARROW: - mod->CAPnarrow = value->rValue; - mod->CAPnarrowGiven = TRUE; - break; - case CAP_MOD_SHORT: - mod->CAPshort = value->rValue; - mod->CAPshortGiven = TRUE; - break; - case CAP_MOD_DI: - mod->CAPdi = value->rValue; - mod->CAPdiGiven = TRUE; - break; - case CAP_MOD_THICK: - mod->CAPthick = value->rValue; - mod->CAPthickGiven = TRUE; - break; - case CAP_MOD_C: - /* just being reassured by the user that we are a capacitor */ - /* no-op */ - break; - default: - return(E_BADPARM); + case CAP_MOD_TNOM: + mod->CAPtnom = value->rValue+CONSTCtoK; + mod->CAPtnomGiven = TRUE; + break; + case CAP_MOD_TC1: + mod->CAPtempCoeff1 = value->rValue; + mod->CAPtc1Given = TRUE; + break; + case CAP_MOD_TC2: + mod->CAPtempCoeff2 = value->rValue; + mod->CAPtc2Given = TRUE; + break; + case CAP_MOD_CAP: + mod->CAPmCap = value->rValue; + mod->CAPmCapGiven = TRUE; + break; + case CAP_MOD_CJ : + mod->CAPcj = value->rValue; + mod->CAPcjGiven = TRUE; + break; + case CAP_MOD_CJSW : + mod->CAPcjsw = value->rValue; + mod->CAPcjswGiven = TRUE; + break; + case CAP_MOD_DEFWIDTH: + mod->CAPdefWidth = value->rValue; + mod->CAPdefWidthGiven = TRUE; + break; + case CAP_MOD_DEFLENGTH: + mod->CAPdefLength = value->rValue; + mod->CAPdefLengthGiven = TRUE; + break; + case CAP_MOD_NARROW: + mod->CAPnarrow = value->rValue; + mod->CAPnarrowGiven = TRUE; + break; + case CAP_MOD_SHORT: + mod->CAPshort = value->rValue; + mod->CAPshortGiven = TRUE; + break; + case CAP_MOD_DI: + mod->CAPdi = value->rValue; + mod->CAPdiGiven = TRUE; + break; + case CAP_MOD_THICK: + mod->CAPthick = value->rValue; + mod->CAPthickGiven = TRUE; + break; + case CAP_MOD_C: + /* just being reassured by the user that we are a capacitor */ + /* no-op */ + break; + default: + return(E_BADPARM); } return(OK); } diff --git a/src/spicelib/devices/cap/capparam.c b/src/spicelib/devices/cap/capparam.c index f37ced9c8..7f7dacafd 100644 --- a/src/spicelib/devices/cap/capparam.c +++ b/src/spicelib/devices/cap/capparam.c @@ -22,53 +22,53 @@ CAPparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) NG_IGNORE(select); switch(param) { - case CAP_CAP: - here->CAPcapac = value->rValue; - if (!here->CAPmGiven) - here->CAPm = 1.0; - here->CAPcapGiven = TRUE; - break; - case CAP_IC: - here->CAPinitCond = value->rValue; - here->CAPicGiven = TRUE; - break; - case CAP_TEMP: - here->CAPtemp = value->rValue + CONSTCtoK; - here->CAPtempGiven = TRUE; - break; - case CAP_DTEMP: - here->CAPdtemp = value->rValue; - here->CAPdtempGiven = TRUE; - break; - case CAP_WIDTH: - here->CAPwidth = value->rValue; - here->CAPwidthGiven = TRUE; - break; - case CAP_LENGTH: - here->CAPlength = value->rValue; - here->CAPlengthGiven = TRUE; - break; - case CAP_M: - here->CAPm = value->rValue; - here->CAPmGiven = TRUE; - break; - case CAP_SCALE: - here->CAPscale = value->rValue; - here->CAPscaleGiven = TRUE; - break; - case CAP_CAP_SENS: - here->CAPsenParmNo = value->iValue; - break; - case CAP_TC1: - here->CAPtc1 = value->rValue; - here->CAPtc1Given = TRUE; - break; - case CAP_TC2: - here->CAPtc2 = value->rValue; - here->CAPtc2Given = TRUE; - break; - default: - return(E_BADPARM); + case CAP_CAP: + here->CAPcapac = value->rValue; + if (!here->CAPmGiven) + here->CAPm = 1.0; + here->CAPcapGiven = TRUE; + break; + case CAP_IC: + here->CAPinitCond = value->rValue; + here->CAPicGiven = TRUE; + break; + case CAP_TEMP: + here->CAPtemp = value->rValue + CONSTCtoK; + here->CAPtempGiven = TRUE; + break; + case CAP_DTEMP: + here->CAPdtemp = value->rValue; + here->CAPdtempGiven = TRUE; + break; + case CAP_WIDTH: + here->CAPwidth = value->rValue; + here->CAPwidthGiven = TRUE; + break; + case CAP_LENGTH: + here->CAPlength = value->rValue; + here->CAPlengthGiven = TRUE; + break; + case CAP_M: + here->CAPm = value->rValue; + here->CAPmGiven = TRUE; + break; + case CAP_SCALE: + here->CAPscale = value->rValue; + here->CAPscaleGiven = TRUE; + break; + case CAP_CAP_SENS: + here->CAPsenParmNo = value->iValue; + break; + case CAP_TC1: + here->CAPtc1 = value->rValue; + here->CAPtc1Given = TRUE; + break; + case CAP_TC2: + here->CAPtc2 = value->rValue; + here->CAPtc2Given = TRUE; + break; + default: + return(E_BADPARM); } return(OK); } diff --git a/src/spicelib/devices/cap/captemp.c b/src/spicelib/devices/cap/captemp.c index a0ea8f085..f6dcc371d 100644 --- a/src/spicelib/devices/cap/captemp.c +++ b/src/spicelib/devices/cap/captemp.c @@ -6,9 +6,9 @@ Modified: September 2003 Paolo Nenzi /* */ - /* load the capacitor structure with those pointers needed later - * for fast matrix loading - */ +/* load the capacitor structure with those pointers needed later + * for fast matrix loading + */ #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" @@ -36,56 +36,56 @@ CAPtemp(GENmodel *inModel, CKTcircuit *ckt) here=here->CAPnextInstance) { /* Default Value Processing for Capacitor Instance */ - if(!here->CAPtempGiven) { - here->CAPtemp = ckt->CKTtemp; - if(!here->CAPdtempGiven) here->CAPdtemp = 0.0; - } else { /* CAPtempGiven */ - here->CAPdtemp = 0.0; - if (here->CAPdtempGiven) - printf("%s: Instance temperature specified, dtemp ignored\n", - here->CAPname); - } + if(!here->CAPtempGiven) { + here->CAPtemp = ckt->CKTtemp; + if(!here->CAPdtempGiven) here->CAPdtemp = 0.0; + } else { /* CAPtempGiven */ + here->CAPdtemp = 0.0; + if (here->CAPdtempGiven) + printf("%s: Instance temperature specified, dtemp ignored\n", + here->CAPname); + } if (!here->CAPwidthGiven) { here->CAPwidth = model->CAPdefWidth; } - if (!here->CAPscaleGiven) here->CAPscale = 1.0; - if (!here->CAPmGiven) here->CAPm = 1.0; - - if (!here->CAPcapGiven) { /* No instance capacitance given */ - if (!model->CAPmCapGiven){ /* No model capacitange given */ - here->CAPcapac = - model->CAPcj * - (here->CAPwidth - model->CAPnarrow) * - (here->CAPlength - model->CAPshort) + + if (!here->CAPscaleGiven) here->CAPscale = 1.0; + if (!here->CAPmGiven) here->CAPm = 1.0; + + if (!here->CAPcapGiven) { /* No instance capacitance given */ + if (!model->CAPmCapGiven) { /* No model capacitange given */ + here->CAPcapac = + model->CAPcj * + (here->CAPwidth - model->CAPnarrow) * + (here->CAPlength - model->CAPshort) + model->CAPcjsw * 2 * ( (here->CAPlength - model->CAPshort) + (here->CAPwidth - model->CAPnarrow) ); - } else { - here->CAPcapac = model->CAPmCap; - } - } - - difference = (here->CAPtemp + here->CAPdtemp) - model->CAPtnom; - - /* instance parameters tc1 and tc2 will override - model parameters tc1 and tc2 */ - if (here->CAPtc1Given) - tc1 = here->CAPtc1; /* instance */ - else - tc1 = model->CAPtempCoeff1; /* model */ + } else { + here->CAPcapac = model->CAPmCap; + } + } - if (here->CAPtc2Given) - tc2 = here->CAPtc2; - else - tc2 = model->CAPtempCoeff2; + difference = (here->CAPtemp + here->CAPdtemp) - model->CAPtnom; - factor = 1.0 + tc1*difference + - tc2*difference*difference; + /* instance parameters tc1 and tc2 will override + model parameters tc1 and tc2 */ + if (here->CAPtc1Given) + tc1 = here->CAPtc1; /* instance */ + else + tc1 = model->CAPtempCoeff1; /* model */ - here->CAPcapac = here->CAPcapac * factor * here->CAPscale; - - } + if (here->CAPtc2Given) + tc2 = here->CAPtc2; + else + tc2 = model->CAPtempCoeff2; + + factor = 1.0 + tc1*difference + + tc2*difference*difference; + + here->CAPcapac = here->CAPcapac * factor * here->CAPscale; + + } } return(OK); } From 31a3df3f47f4e0dc183fefea78183cd8ee516a5b Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 9 May 2013 00:20:54 +0200 Subject: [PATCH 055/257] ind...c: inductor with tc1, tc2 instance parameter --- src/spicelib/devices/ind/ind.c | 2 ++ src/spicelib/devices/ind/inddefs.h | 6 ++++++ src/spicelib/devices/ind/indparam.c | 8 ++++++++ src/spicelib/devices/ind/indtemp.c | 18 +++++++++++++++--- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/spicelib/devices/ind/ind.c b/src/spicelib/devices/ind/ind.c index 9b83bf868..9c8f9742a 100644 --- a/src/spicelib/devices/ind/ind.c +++ b/src/spicelib/devices/ind/ind.c @@ -18,6 +18,8 @@ IFparm INDpTable[] = { /* parameters */ IOPZ( "dtemp", IND_DTEMP, IF_REAL, "Instance temperature difference with the rest of the circuit"), IOPU( "m", IND_M, IF_REAL, "Multiplication Factor"), + IOPU( "tc1", IND_TC1, IF_REAL, "First order temp. coefficient"), + IOPU( "tc2", IND_TC2, IF_REAL, "Second order temp. coefficient"), IOPU( "scale", IND_SCALE, IF_REAL, "Scale factor"), IOP( "nt", IND_NT, IF_REAL, "Number of turns"), OP( "flux", IND_FLUX, IF_REAL, "Flux through inductor"), diff --git a/src/spicelib/devices/ind/inddefs.h b/src/spicelib/devices/ind/inddefs.h index 86c65a497..20d52fc90 100644 --- a/src/spicelib/devices/ind/inddefs.h +++ b/src/spicelib/devices/ind/inddefs.h @@ -32,6 +32,8 @@ typedef struct sINDinstance { int INDbrEq; /* number of the branch equation added for current */ double INDinduct; /* inductance */ double INDm; /* Parallel multiplier */ + double INDtc1; /* first temperature coefficient of resistors */ + double INDtc2; /* second temperature coefficient of resistors */ double INDtemp; /* Instance operating temperature */ double INDdtemp; /* Delta temp. of instance */ double INDscale; /* Scale factor */ @@ -52,6 +54,8 @@ typedef struct sINDinstance { unsigned INDindGiven : 1; /* flag to indicate inductance was specified */ unsigned INDicGiven : 1; /* flag to indicate init. cond. was specified */ unsigned INDmGiven : 1; /* flag to indicate multiplier given */ + unsigned INDtc1Given : 1; /* indicates tc1 parameter specified */ + unsigned INDtc2Given : 1; /* indicates tc2 parameter specified */ unsigned INDtempGiven : 1; /* flag to indicate operating temp. given */ unsigned INDdtempGiven : 1; /* flag to indicate delta temp. given */ unsigned INDscaleGiven : 1; /* flag to indicate scale factor given */ @@ -155,6 +159,8 @@ typedef struct sMUTmodel { /* model structure for a mutual inductor */ #define IND_DTEMP 10 #define IND_SCALE 11 #define IND_NT 12 +#define IND_TC1 13 +#define IND_TC2 14 /* model parameters */ #define IND_MOD_IND 100 diff --git a/src/spicelib/devices/ind/indparam.c b/src/spicelib/devices/ind/indparam.c index 6b7a0fbac..91f35bad3 100644 --- a/src/spicelib/devices/ind/indparam.c +++ b/src/spicelib/devices/ind/indparam.c @@ -39,6 +39,14 @@ INDparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->INDm = value->rValue; here->INDmGiven = TRUE; break; + case IND_TC1: + here->INDtc1 = value->rValue; + here->INDtc1Given = TRUE; + break; + case IND_TC2: + here->INDtc2 = value->rValue; + here->INDtc2Given = TRUE; + break; case IND_SCALE: here->INDscale = value->rValue; here->INDscaleGiven = TRUE; diff --git a/src/spicelib/devices/ind/indtemp.c b/src/spicelib/devices/ind/indtemp.c index 5201d5df5..2e0ddf3db 100644 --- a/src/spicelib/devices/ind/indtemp.c +++ b/src/spicelib/devices/ind/indtemp.c @@ -21,6 +21,7 @@ INDtemp(GENmodel *inModel, CKTcircuit *ckt) INDinstance *here; double difference; double factor; + double tc1, tc2; /* loop through all the inductor models */ for( ; model != NULL; model = model->INDnextModel ) { @@ -52,9 +53,20 @@ INDtemp(GENmodel *inModel, CKTcircuit *ckt) here->INDinduct = model->INDmInd; } difference = (here->INDtemp + here->INDdtemp) - model->INDtnom; - - factor = 1.0 + (model->INDtempCoeff1)*difference + - (model->INDtempCoeff2)*difference*difference; + + /* instance parameters tc1 and tc2 will override + model parameters tc1 and tc2 */ + if (here->INDtc1Given) + tc1 = here->INDtc1; /* instance */ + else + tc1 = model->INDtempCoeff1; /* model */ + + if (here->INDtc2Given) + tc2 = here->INDtc2; + else + tc2 = model->INDtempCoeff2; + + factor = 1.0 + tc1*difference + tc2*difference*difference; here->INDinduct = here->INDinduct * factor * here->INDscale; here->INDinduct = here->INDinduct / here->INDm; From 4c589a1c71bff8ab2663af3731b489cba77bd1ba Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 9 May 2013 00:26:03 +0200 Subject: [PATCH 056/257] ind..c,h: indentations, white spaces --- src/spicelib/devices/ind/ind.c | 100 ++++++++++++++-------------- src/spicelib/devices/ind/inddefs.h | 64 +++++++++--------- src/spicelib/devices/ind/indload.c | 32 ++++----- src/spicelib/devices/ind/indmpar.c | 76 ++++++++++----------- src/spicelib/devices/ind/indparam.c | 86 ++++++++++++------------ src/spicelib/devices/ind/indtemp.c | 74 ++++++++++---------- 6 files changed, 216 insertions(+), 216 deletions(-) diff --git a/src/spicelib/devices/ind/ind.c b/src/spicelib/devices/ind/ind.c index 9c8f9742a..430b46b78 100644 --- a/src/spicelib/devices/ind/ind.c +++ b/src/spicelib/devices/ind/ind.c @@ -9,45 +9,45 @@ Author: 1985 Thomas L. Quarles #include "inddefs.h" #include "ngspice/suffix.h" -IFparm INDpTable[] = { /* parameters */ - IOPAP("inductance",IND_IND, IF_REAL, "Inductance of inductor"), - IOPAU("ic", IND_IC, IF_REAL, "Initial current through inductor"), - IP( "sens_ind", IND_IND_SENS, IF_FLAG, - "flag to request sensitivity WRT inductance"), - IOPZU("temp", IND_TEMP, IF_REAL, "Instance operating temperature"), - IOPZ( "dtemp", IND_DTEMP, IF_REAL, - "Instance temperature difference with the rest of the circuit"), - IOPU( "m", IND_M, IF_REAL, "Multiplication Factor"), - IOPU( "tc1", IND_TC1, IF_REAL, "First order temp. coefficient"), - IOPU( "tc2", IND_TC2, IF_REAL, "Second order temp. coefficient"), - IOPU( "scale", IND_SCALE, IF_REAL, "Scale factor"), - IOP( "nt", IND_NT, IF_REAL, "Number of turns"), - OP( "flux", IND_FLUX, IF_REAL, "Flux through inductor"), - OP( "v", IND_VOLT, IF_REAL, "Terminal voltage of inductor"), - OPR( "volt", IND_VOLT, IF_REAL, ""), - OP( "i", IND_CURRENT, IF_REAL, "Current through the inductor"), - OPR( "current", IND_CURRENT, IF_REAL, ""), - OP( "p", IND_POWER, IF_REAL, - "instantaneous power dissipated by the inductor"), - OPU( "sens_dc", IND_QUEST_SENS_DC, IF_REAL, "dc sensitivity sensitivity"), - OPU( "sens_real", IND_QUEST_SENS_REAL, IF_REAL, "real part of ac sensitivity"), - OPU( "sens_imag", IND_QUEST_SENS_IMAG, IF_REAL, - "dc sensitivity and imag part of ac sensitivty"), - OPU( "sens_mag", IND_QUEST_SENS_MAG, IF_REAL, "sensitivity of AC magnitude"), - OPU( "sens_ph", IND_QUEST_SENS_PH, IF_REAL, "sensitivity of AC phase"), - OPU( "sens_cplx", IND_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") +IFparm INDpTable[] = { /* parameters */ + IOPAP("inductance",IND_IND, IF_REAL, "Inductance of inductor"), + IOPAU("ic", IND_IC, IF_REAL, "Initial current through inductor"), + IP( "sens_ind", IND_IND_SENS, IF_FLAG, + "flag to request sensitivity WRT inductance"), + IOPZU("temp", IND_TEMP, IF_REAL, "Instance operating temperature"), + IOPZ( "dtemp", IND_DTEMP, IF_REAL, + "Instance temperature difference with the rest of the circuit"), + IOPU( "m", IND_M, IF_REAL, "Multiplication Factor"), + IOPU( "tc1", IND_TC1, IF_REAL, "First order temp. coefficient"), + IOPU( "tc2", IND_TC2, IF_REAL, "Second order temp. coefficient"), + IOPU( "scale", IND_SCALE, IF_REAL, "Scale factor"), + IOP( "nt", IND_NT, IF_REAL, "Number of turns"), + OP( "flux", IND_FLUX, IF_REAL, "Flux through inductor"), + OP( "v", IND_VOLT, IF_REAL, "Terminal voltage of inductor"), + OPR( "volt", IND_VOLT, IF_REAL, ""), + OP( "i", IND_CURRENT, IF_REAL, "Current through the inductor"), + OPR( "current", IND_CURRENT, IF_REAL, ""), + OP( "p", IND_POWER, IF_REAL, + "instantaneous power dissipated by the inductor"), + OPU( "sens_dc", IND_QUEST_SENS_DC, IF_REAL, "dc sensitivity sensitivity"), + OPU( "sens_real", IND_QUEST_SENS_REAL, IF_REAL, "real part of ac sensitivity"), + OPU( "sens_imag", IND_QUEST_SENS_IMAG, IF_REAL, + "dc sensitivity and imag part of ac sensitivty"), + OPU( "sens_mag", IND_QUEST_SENS_MAG, IF_REAL, "sensitivity of AC magnitude"), + OPU( "sens_ph", IND_QUEST_SENS_PH, IF_REAL, "sensitivity of AC phase"), + OPU( "sens_cplx", IND_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") }; IFparm INDmPTable[] = { /* model parameters */ - IOPA( "ind", IND_MOD_IND, IF_REAL,"Model inductance"), - IOPA( "tc1", IND_MOD_TC1, IF_REAL,"First order temp. coefficient"), - IOPA( "tc2", IND_MOD_TC2, IF_REAL,"Second order temp. coefficient"), - IOPXU( "tnom", IND_MOD_TNOM, IF_REAL,"Parameter measurement temperature"), - IOPA( "csect", IND_MOD_CSECT, IF_REAL,"Inductor cross section"), - IOPA( "length", IND_MOD_LENGTH, IF_REAL,"Inductor length"), - IOPA( "nt", IND_MOD_NT, IF_REAL,"Model number of turns"), - IOPA( "mu", IND_MOD_MU, IF_REAL,"Relative magnetic permeability"), - IP( "l", IND_MOD_L, IF_FLAG,"Inductor model") + IOPA( "ind", IND_MOD_IND, IF_REAL,"Model inductance"), + IOPA( "tc1", IND_MOD_TC1, IF_REAL,"First order temp. coefficient"), + IOPA( "tc2", IND_MOD_TC2, IF_REAL,"Second order temp. coefficient"), + IOPXU( "tnom", IND_MOD_TNOM, IF_REAL,"Parameter measurement temperature"), + IOPA( "csect", IND_MOD_CSECT, IF_REAL,"Inductor cross section"), + IOPA( "length", IND_MOD_LENGTH, IF_REAL,"Inductor length"), + IOPA( "nt", IND_MOD_NT, IF_REAL,"Model number of turns"), + IOPA( "mu", IND_MOD_MU, IF_REAL,"Relative magnetic permeability"), + IP( "l", IND_MOD_L, IF_FLAG,"Inductor model") }; @@ -65,20 +65,20 @@ int INDmSize = sizeof(INDmodel); #ifdef MUTUAL -IFparm MUTpTable[] = { /* parameters */ - IOPAP( "k", MUT_COEFF, IF_REAL , "Mutual inductance"), - IOPR( "coefficient", MUT_COEFF, IF_REAL , ""), - IOP( "inductor1", MUT_IND1, IF_INSTANCE, "First coupled inductor"), - IOP( "inductor2", MUT_IND2, IF_INSTANCE, "Second coupled inductor"), - IP( "sens_coeff", MUT_COEFF_SENS, IF_FLAG, - "flag to request sensitivity WRT coupling factor"), - OPU( "sens_dc", MUT_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), - OPU( "sens_real", MUT_QUEST_SENS_REAL, IF_REAL, "real part of ac sensitivity"), - OPU( "sens_imag", MUT_QUEST_SENS_IMAG, IF_REAL, - "dc sensitivity and imag part of ac sensitivty"), - OPU( "sens_mag", MUT_QUEST_SENS_MAG, IF_REAL, "sensitivity of AC magnitude"), - OPU( "sens_ph", MUT_QUEST_SENS_PH, IF_REAL, "sensitivity of AC phase"), - OPU( "sens_cplx", MUT_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") +IFparm MUTpTable[] = { /* parameters */ + IOPAP( "k", MUT_COEFF, IF_REAL , "Mutual inductance"), + IOPR( "coefficient", MUT_COEFF, IF_REAL , ""), + IOP( "inductor1", MUT_IND1, IF_INSTANCE, "First coupled inductor"), + IOP( "inductor2", MUT_IND2, IF_INSTANCE, "Second coupled inductor"), + IP( "sens_coeff", MUT_COEFF_SENS, IF_FLAG, + "flag to request sensitivity WRT coupling factor"), + OPU( "sens_dc", MUT_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), + OPU( "sens_real", MUT_QUEST_SENS_REAL, IF_REAL, "real part of ac sensitivity"), + OPU( "sens_imag", MUT_QUEST_SENS_IMAG, IF_REAL, + "dc sensitivity and imag part of ac sensitivty"), + OPU( "sens_mag", MUT_QUEST_SENS_MAG, IF_REAL, "sensitivity of AC magnitude"), + OPU( "sens_ph", MUT_QUEST_SENS_PH, IF_REAL, "sensitivity of AC phase"), + OPU( "sens_cplx", MUT_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") }; int MUTnSize = NUMELEMS(INDnames); diff --git a/src/spicelib/devices/ind/inddefs.h b/src/spicelib/devices/ind/inddefs.h index 20d52fc90..f024d1490 100644 --- a/src/spicelib/devices/ind/inddefs.h +++ b/src/spicelib/devices/ind/inddefs.h @@ -15,14 +15,14 @@ Author: 1985 Thomas L. Quarles #include "ngspice/gendefs.h" #include "ngspice/cktdefs.h" - /* structures used to descrive inductors */ +/* structures used to descrive inductors */ /* information needed for each instance */ typedef struct sINDinstance { struct sINDmodel *INDmodPtr; /* backpointer to model */ - struct sINDinstance *INDnextInstance; /* pointer to next instance of + struct sINDinstance *INDnextInstance; /* pointer to next instance of * current model*/ IFuid INDname; /* pointer to character string naming this instance */ int INDstate; /* pointer to beginning of state vector for inductor */ @@ -40,17 +40,17 @@ typedef struct sINDinstance { double INDnt; /* Number of turns */ double INDinitCond; /* initial inductor voltage if specified */ - double *INDposIbrptr; /* pointer to sparse matrix diagonal at + double *INDposIbrptr; /* pointer to sparse matrix diagonal at * (positive,branch eq) */ - double *INDnegIbrptr; /* pointer to sparse matrix diagonal at + double *INDnegIbrptr; /* pointer to sparse matrix diagonal at * (negative,branch eq) */ - double *INDibrNegptr; /* pointer to sparse matrix offdiagonal at + double *INDibrNegptr; /* pointer to sparse matrix offdiagonal at * (branch eq,negative) */ - double *INDibrPosptr; /* pointer to sparse matrix offdiagonal at + double *INDibrPosptr; /* pointer to sparse matrix offdiagonal at * (branch eq,positive) */ - double *INDibrIbrptr; /* pointer to sparse matrix offdiagonal at + double *INDibrIbrptr; /* pointer to sparse matrix offdiagonal at * (branch eq,branch eq) */ - + unsigned INDindGiven : 1; /* flag to indicate inductance was specified */ unsigned INDicGiven : 1; /* flag to indicate init. cond. was specified */ unsigned INDmGiven : 1; /* flag to indicate multiplier given */ @@ -68,20 +68,20 @@ typedef struct sINDinstance { #define INDflux INDstate /* flux in the inductor */ #define INDvolt INDstate+1 /* voltage - save an entry in table */ #define INDsensxp INDstate+2 /* charge sensitivities and their derivatives. - +3 for the derivatives - pointer to the - beginning of the array */ ++3 for the derivatives - pointer to the +beginning of the array */ /* per model data */ typedef struct sINDmodel { /* model structure for an inductor */ int INDmodType; /* type index of this device type */ - struct sINDmodel *INDnextModel; /* pointer to next possible model in + struct sINDmodel *INDnextModel; /* pointer to next possible model in * linked list */ INDinstance * INDinstances; /* pointer to list of instances that have this * model */ IFuid INDmodName; /* pointer to character string naming this model */ - + double INDmInd; /* Model inductance */ double INDtnom; /* temperature at which inductance measured */ double INDtempCoeff1; /* first temperature coefficient */ @@ -90,8 +90,8 @@ typedef struct sINDmodel { /* model structure for an inductor */ double INDlength; /* Mean length of magnetic path */ double INDmodNt; /* Model number of turns */ double INDmu; /* Relative magnetic permeability */ - - unsigned INDtnomGiven : 1; /* flag to indicate nominal temp was given */ + + unsigned INDtnomGiven : 1; /* flag to indicate nominal temp was given */ unsigned INDtc1Given : 1; /* flag to indicate tc1 was specified */ unsigned INDtc2Given : 1; /* flag to indicate tc2 was specified */ unsigned INDcsectGiven : 1; /* flag to indicate cross section given */ @@ -106,27 +106,27 @@ typedef struct sINDmodel { /* model structure for an inductor */ #ifdef MUTUAL - /* structures used to describe mutual inductors */ +/* structures used to describe mutual inductors */ /* information needed for each instance */ typedef struct sMUTinstance { - struct sMUTmodel *MUTmodPtr; /* backpointer to model */ - struct sMUTinstance *MUTnextInstance; /* pointer to next instance of +struct sMUTmodel *MUTmodPtr; /* backpointer to model */ +struct sMUTinstance *MUTnextInstance; /* pointer to next instance of * current model*/ - IFuid MUTname; /* pointer to character string naming this instance */ - double MUTcoupling; /* mutual inductance input by user */ - double MUTfactor; /* mutual inductance scaled for internal use */ - IFuid MUTindName1; /* name of coupled inductor 1 */ - IFuid MUTindName2; /* name of coupled inductor 2 */ - INDinstance *MUTind1; /* pointer to coupled inductor 1 */ - INDinstance *MUTind2; /* pointer to coupled inductor 2 */ - double *MUTbr1br2; /* pointers to off-diagonal intersections of */ - double *MUTbr2br1; /* current branch equations in matrix */ +IFuid MUTname; /* pointer to character string naming this instance */ +double MUTcoupling; /* mutual inductance input by user */ +double MUTfactor; /* mutual inductance scaled for internal use */ +IFuid MUTindName1; /* name of coupled inductor 1 */ +IFuid MUTindName2; /* name of coupled inductor 2 */ +INDinstance *MUTind1; /* pointer to coupled inductor 1 */ +INDinstance *MUTind2; /* pointer to coupled inductor 2 */ +double *MUTbr1br2; /* pointers to off-diagonal intersections of */ +double *MUTbr2br1; /* current branch equations in matrix */ - unsigned MUTindGiven : 1; /* flag to indicate inductance was specified */ - int MUTsenParmNo; /* parameter # for sensitivity use; +unsigned MUTindGiven : 1; /* flag to indicate inductance was specified */ +int MUTsenParmNo; /* parameter # for sensitivity use; set equal to 0 if not a design parameter*/ @@ -136,12 +136,12 @@ typedef struct sMUTinstance { /* per model data */ typedef struct sMUTmodel { /* model structure for a mutual inductor */ - int MUTmodType; /* type index of this device type */ - struct sMUTmodel *MUTnextModel; /* pointer to next possible model in +int MUTmodType; /* type index of this device type */ +struct sMUTmodel *MUTnextModel; /* pointer to next possible model in * linked list */ - MUTinstance * MUTinstances; /* pointer to list of instances that have this +MUTinstance * MUTinstances; /* pointer to list of instances that have this * model */ - IFuid MUTmodName; /* pointer to character string naming this model */ +IFuid MUTmodName; /* pointer to character string naming this model */ } MUTmodel; #endif /*MUTUAL*/ diff --git a/src/spicelib/devices/ind/indload.c b/src/spicelib/devices/ind/indload.c index 9ee8574a6..bdc445202 100644 --- a/src/spicelib/devices/ind/indload.c +++ b/src/spicelib/devices/ind/indload.c @@ -3,9 +3,9 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ - /* actually load the current inductance value into the - * sparse matrix previously provided - */ +/* actually load the current inductance value into the + * sparse matrix previously provided + */ #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" @@ -22,7 +22,7 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) double veq; double req; int error; - + #ifdef MUTUAL MUTinstance *muthere; MUTmodel *mutmodel; @@ -40,10 +40,10 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) if(!(ckt->CKTmode & (MODEDC|MODEINITPRED))) { if(ckt->CKTmode & MODEUIC && ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate0 + here->INDflux) = here->INDinduct * - here->INDinitCond; + here->INDinitCond; } else { *(ckt->CKTstate0 + here->INDflux) = here->INDinduct * - *(ckt->CKTrhsOld + here->INDbrEq); + *(ckt->CKTrhsOld + here->INDbrEq); } } #ifdef MUTUAL @@ -61,13 +61,13 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) if(!(ckt->CKTmode& (MODEDC|MODEINITPRED))) { *(ckt->CKTstate0 + muthere->MUTind1->INDflux) += muthere->MUTfactor * *(ckt->CKTrhsOld + - muthere->MUTind2->INDbrEq); - + muthere->MUTind2->INDbrEq); + *(ckt->CKTstate0 + muthere->MUTind2->INDflux) += muthere->MUTfactor * *(ckt->CKTrhsOld + - muthere->MUTind1->INDbrEq); + muthere->MUTind1->INDbrEq); } - + *(muthere->MUTbr1br2) -= muthere->MUTfactor*ckt->CKTag[0]; *(muthere->MUTbr2br1) -= muthere->MUTfactor*ckt->CKTag[0]; } @@ -94,7 +94,7 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) #endif /*PREDICTOR*/ if (ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->INDflux) = - *(ckt->CKTstate0 + here->INDflux); + *(ckt->CKTstate0 + here->INDflux); } #ifndef PREDICTOR } @@ -102,14 +102,14 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) error=NIintegrate(ckt,&req,&veq,here->INDinduct,here->INDflux); if(error) return(error); } - + *(ckt->CKTrhs+here->INDbrEq) += veq; - - if(ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1+here->INDvolt) = + + if(ckt->CKTmode & MODEINITTRAN) { + *(ckt->CKTstate1+here->INDvolt) = *(ckt->CKTstate0+here->INDvolt); } - + *(here->INDposIbrptr) += 1; *(here->INDnegIbrptr) -= 1; *(here->INDibrPosptr) += 1; diff --git a/src/spicelib/devices/ind/indmpar.c b/src/spicelib/devices/ind/indmpar.c index 12b5b0444..ee641d5af 100644 --- a/src/spicelib/devices/ind/indmpar.c +++ b/src/spicelib/devices/ind/indmpar.c @@ -17,44 +17,44 @@ INDmParam(int param, IFvalue *value, GENmodel *inModel) { INDmodel *mod = (INDmodel*)inModel; switch(param) { - case IND_MOD_IND: - mod->INDmInd = value->rValue; - mod->INDmIndGiven = TRUE; - break; - case IND_MOD_TNOM: - mod->INDtnom = value->rValue+CONSTCtoK; - mod->INDtnomGiven = TRUE; - break; - case IND_MOD_TC1: - mod->INDtempCoeff1 = value->rValue; - mod->INDtc1Given = TRUE; - break; - case IND_MOD_TC2: - mod->INDtempCoeff2 = value->rValue; - mod->INDtc2Given = TRUE; - break; - case IND_MOD_CSECT: - mod->INDcsect = value->rValue; - mod->INDcsectGiven = TRUE; - break; - case IND_MOD_LENGTH : - mod->INDlength = value->rValue; - mod->INDlengthGiven = TRUE; - break; - case IND_MOD_NT : - mod->INDmodNt = value->rValue; - mod->INDmodNtGiven = TRUE; - break; - case IND_MOD_MU: - mod->INDmu = value->rValue; - mod->INDmuGiven = TRUE; - break; - case IND_MOD_L: - /* just being reassured by the user that we are an inductor */ - /* no-op */ - break; - default: - return(E_BADPARM); + case IND_MOD_IND: + mod->INDmInd = value->rValue; + mod->INDmIndGiven = TRUE; + break; + case IND_MOD_TNOM: + mod->INDtnom = value->rValue+CONSTCtoK; + mod->INDtnomGiven = TRUE; + break; + case IND_MOD_TC1: + mod->INDtempCoeff1 = value->rValue; + mod->INDtc1Given = TRUE; + break; + case IND_MOD_TC2: + mod->INDtempCoeff2 = value->rValue; + mod->INDtc2Given = TRUE; + break; + case IND_MOD_CSECT: + mod->INDcsect = value->rValue; + mod->INDcsectGiven = TRUE; + break; + case IND_MOD_LENGTH : + mod->INDlength = value->rValue; + mod->INDlengthGiven = TRUE; + break; + case IND_MOD_NT : + mod->INDmodNt = value->rValue; + mod->INDmodNtGiven = TRUE; + break; + case IND_MOD_MU: + mod->INDmu = value->rValue; + mod->INDmuGiven = TRUE; + break; + case IND_MOD_L: + /* just being reassured by the user that we are an inductor */ + /* no-op */ + break; + default: + return(E_BADPARM); } return(OK); } diff --git a/src/spicelib/devices/ind/indparam.c b/src/spicelib/devices/ind/indparam.c index 91f35bad3..e39584c6f 100644 --- a/src/spicelib/devices/ind/indparam.c +++ b/src/spicelib/devices/ind/indparam.c @@ -21,49 +21,49 @@ INDparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) NG_IGNORE(select); switch(param) { - case IND_IND: - here->INDinduct = value->rValue; - if (!here->INDmGiven) - here->INDm =1.0; - here->INDindGiven = TRUE; - break; - case IND_TEMP: - here->INDtemp = value->rValue + CONSTCtoK; - here->INDtempGiven = TRUE; - break; - case IND_DTEMP: - here->INDdtemp = value->rValue; - here->INDdtempGiven = TRUE; - break; - case IND_M: - here->INDm = value->rValue; - here->INDmGiven = TRUE; - break; - case IND_TC1: - here->INDtc1 = value->rValue; - here->INDtc1Given = TRUE; - break; - case IND_TC2: - here->INDtc2 = value->rValue; - here->INDtc2Given = TRUE; - break; - case IND_SCALE: - here->INDscale = value->rValue; - here->INDscaleGiven = TRUE; - break; - case IND_NT: - here->INDnt = value->rValue; - here->INDntGiven = TRUE; - break; - case IND_IC: - here->INDinitCond = value->rValue; - here->INDicGiven = TRUE; - break; - case IND_IND_SENS: - here->INDsenParmNo = value->iValue; - break; - default: - return(E_BADPARM); + case IND_IND: + here->INDinduct = value->rValue; + if (!here->INDmGiven) + here->INDm =1.0; + here->INDindGiven = TRUE; + break; + case IND_TEMP: + here->INDtemp = value->rValue + CONSTCtoK; + here->INDtempGiven = TRUE; + break; + case IND_DTEMP: + here->INDdtemp = value->rValue; + here->INDdtempGiven = TRUE; + break; + case IND_M: + here->INDm = value->rValue; + here->INDmGiven = TRUE; + break; + case IND_TC1: + here->INDtc1 = value->rValue; + here->INDtc1Given = TRUE; + break; + case IND_TC2: + here->INDtc2 = value->rValue; + here->INDtc2Given = TRUE; + break; + case IND_SCALE: + here->INDscale = value->rValue; + here->INDscaleGiven = TRUE; + break; + case IND_NT: + here->INDnt = value->rValue; + here->INDntGiven = TRUE; + break; + case IND_IC: + here->INDinitCond = value->rValue; + here->INDicGiven = TRUE; + break; + case IND_IND_SENS: + here->INDsenParmNo = value->iValue; + break; + default: + return(E_BADPARM); } return(OK); } diff --git a/src/spicelib/devices/ind/indtemp.c b/src/spicelib/devices/ind/indtemp.c index 2e0ddf3db..94dac8865 100644 --- a/src/spicelib/devices/ind/indtemp.c +++ b/src/spicelib/devices/ind/indtemp.c @@ -31,47 +31,47 @@ INDtemp(GENmodel *inModel, CKTcircuit *ckt) here=here->INDnextInstance) { /* Default Value Processing for Inductor Instance */ - - if(!here->INDtempGiven) { - here->INDtemp = ckt->CKTtemp; - if(!here->INDdtempGiven) here->INDdtemp = 0.0; - } else { /* INDtempGiven */ - here->INDdtemp = 0.0; - if (here->INDdtempGiven) - printf("%s: Instance temperature specified, dtemp ignored\n", - here->INDname); - } - - if (!here->INDscaleGiven) here->INDscale = 1.0; - if (!here->INDmGiven) here->INDm = 1.0; - if (!here->INDntGiven) here->INDnt = 0.0; - - if (!here->INDindGiven) { /* No instance inductance given */ - if (here->INDntGiven) - here->INDinduct = model->INDspecInd * here->INDnt * here->INDnt; - else - here->INDinduct = model->INDmInd; + + if(!here->INDtempGiven) { + here->INDtemp = ckt->CKTtemp; + if(!here->INDdtempGiven) here->INDdtemp = 0.0; + } else { /* INDtempGiven */ + here->INDdtemp = 0.0; + if (here->INDdtempGiven) + printf("%s: Instance temperature specified, dtemp ignored\n", + here->INDname); } - difference = (here->INDtemp + here->INDdtemp) - model->INDtnom; - /* instance parameters tc1 and tc2 will override - model parameters tc1 and tc2 */ - if (here->INDtc1Given) - tc1 = here->INDtc1; /* instance */ - else - tc1 = model->INDtempCoeff1; /* model */ + if (!here->INDscaleGiven) here->INDscale = 1.0; + if (!here->INDmGiven) here->INDm = 1.0; + if (!here->INDntGiven) here->INDnt = 0.0; - if (here->INDtc2Given) - tc2 = here->INDtc2; - else - tc2 = model->INDtempCoeff2; + if (!here->INDindGiven) { /* No instance inductance given */ + if (here->INDntGiven) + here->INDinduct = model->INDspecInd * here->INDnt * here->INDnt; + else + here->INDinduct = model->INDmInd; + } + difference = (here->INDtemp + here->INDdtemp) - model->INDtnom; - factor = 1.0 + tc1*difference + tc2*difference*difference; - - here->INDinduct = here->INDinduct * factor * here->INDscale; - here->INDinduct = here->INDinduct / here->INDm; - - } + /* instance parameters tc1 and tc2 will override + model parameters tc1 and tc2 */ + if (here->INDtc1Given) + tc1 = here->INDtc1; /* instance */ + else + tc1 = model->INDtempCoeff1; /* model */ + + if (here->INDtc2Given) + tc2 = here->INDtc2; + else + tc2 = model->INDtempCoeff2; + + factor = 1.0 + tc1*difference + tc2*difference*difference; + + here->INDinduct = here->INDinduct * factor * here->INDscale; + here->INDinduct = here->INDinduct / here->INDm; + + } } return(OK); } From c9d4ab1d13fa590f6bb3263e7e9f0a4d2d9effb2 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 9 May 2013 09:16:40 +0200 Subject: [PATCH 057/257] res...c: indentations, white spaces --- src/spicelib/devices/res/res.c | 84 +++++++++++----------- src/spicelib/devices/res/resdefs.h | 20 +++--- src/spicelib/devices/res/resload.c | 26 +++---- src/spicelib/devices/res/resmpar.c | 96 ++++++++++++------------- src/spicelib/devices/res/resparam.c | 104 ++++++++++++++-------------- src/spicelib/devices/res/restemp.c | 54 +++++++-------- 6 files changed, 192 insertions(+), 192 deletions(-) diff --git a/src/spicelib/devices/res/res.c b/src/spicelib/devices/res/res.c index f1aa474a6..693489766 100644 --- a/src/spicelib/devices/res/res.c +++ b/src/spicelib/devices/res/res.c @@ -10,51 +10,51 @@ Modified: 2000 AlansFixes #include "ngspice/devdefs.h" #include "ngspice/ifsim.h" -IFparm RESpTable[] = { /* parameters */ - IOPP( "resistance", RES_RESIST, IF_REAL, "Resistance"), - IOPAA( "ac", RES_ACRESIST, IF_REAL, "AC resistance value"), - IOPZU( "temp", RES_TEMP, IF_REAL, "Instance operating temperature"), - IOPZ( "dtemp", RES_DTEMP, IF_REAL, - "Instance temperature difference with the rest of the circuit"), - IOPQU( "l", RES_LENGTH, IF_REAL, "Length"), - IOPZU( "w", RES_WIDTH, IF_REAL, "Width"), - IOPU( "m", RES_M, IF_REAL, "Multiplication factor"), - IOPU( "tc", RES_TC1, IF_REAL, "First order temp. coefficient"), - IOPU( "tc1", RES_TC1, IF_REAL, "First order temp. coefficient"), - IOPU( "tc2", RES_TC2, IF_REAL, "Second order temp. coefficient"), - IOPU( "scale", RES_SCALE, IF_REAL, "Scale factor"), - IOP( "noisy", RES_NOISY, IF_INTEGER, "Resistor generate noise"), - IP( "sens_resist", RES_RESIST_SENS, IF_FLAG, - "flag to request sensitivity WRT resistance"), - OP( "i", RES_CURRENT, IF_REAL, "Current"), - OP( "p", RES_POWER, IF_REAL, "Power"), - OPU( "sens_dc", RES_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), - OPU( "sens_real", RES_QUEST_SENS_REAL, IF_REAL, - "dc sensitivity and real part of ac sensitivity"), - OPU( "sens_imag", RES_QUEST_SENS_IMAG, IF_REAL, - "dc sensitivity and imag part of ac sensitivity"), - OPU( "sens_mag", RES_QUEST_SENS_MAG, IF_REAL, "ac sensitivity of magnitude"), - OPU( "sens_ph", RES_QUEST_SENS_PH, IF_REAL, "ac sensitivity of phase"), - OPU( "sens_cplx", RES_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") +IFparm RESpTable[] = { /* parameters */ + IOPP( "resistance", RES_RESIST, IF_REAL, "Resistance"), + IOPAA( "ac", RES_ACRESIST, IF_REAL, "AC resistance value"), + IOPZU( "temp", RES_TEMP, IF_REAL, "Instance operating temperature"), + IOPZ( "dtemp", RES_DTEMP, IF_REAL, + "Instance temperature difference with the rest of the circuit"), + IOPQU( "l", RES_LENGTH, IF_REAL, "Length"), + IOPZU( "w", RES_WIDTH, IF_REAL, "Width"), + IOPU( "m", RES_M, IF_REAL, "Multiplication factor"), + IOPU( "tc", RES_TC1, IF_REAL, "First order temp. coefficient"), + IOPU( "tc1", RES_TC1, IF_REAL, "First order temp. coefficient"), + IOPU( "tc2", RES_TC2, IF_REAL, "Second order temp. coefficient"), + IOPU( "scale", RES_SCALE, IF_REAL, "Scale factor"), + IOP( "noisy", RES_NOISY, IF_INTEGER, "Resistor generate noise"), + IP( "sens_resist", RES_RESIST_SENS, IF_FLAG, + "flag to request sensitivity WRT resistance"), + OP( "i", RES_CURRENT, IF_REAL, "Current"), + OP( "p", RES_POWER, IF_REAL, "Power"), + OPU( "sens_dc", RES_QUEST_SENS_DC, IF_REAL, "dc sensitivity "), + OPU( "sens_real", RES_QUEST_SENS_REAL, IF_REAL, + "dc sensitivity and real part of ac sensitivity"), + OPU( "sens_imag", RES_QUEST_SENS_IMAG, IF_REAL, + "dc sensitivity and imag part of ac sensitivity"), + OPU( "sens_mag", RES_QUEST_SENS_MAG, IF_REAL, "ac sensitivity of magnitude"), + OPU( "sens_ph", RES_QUEST_SENS_PH, IF_REAL, "ac sensitivity of phase"), + OPU( "sens_cplx", RES_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity") }; IFparm RESmPTable[] = { /* model parameters */ - IOPQ( "rsh", RES_MOD_RSH, IF_REAL,"Sheet resistance"), - IOPZ( "narrow", RES_MOD_NARROW, IF_REAL,"Narrowing of resistor"), - IOPR( "dw", RES_MOD_NARROW, IF_REAL,"Narrowing of resistor"), - IOPZ( "short", RES_MOD_SHORT, IF_REAL,"Shortening of resistor"), - IOPR( "dlr", RES_MOD_SHORT, IF_REAL,"Shortening of resistor"), - IOPQ( "tc1", RES_MOD_TC1, IF_REAL,"First order temp. coefficient"), - IOPR( "tc1r", RES_MOD_TC1, IF_REAL,"First order temp. coefficient"), - IOPQO( "tc2", RES_MOD_TC2, IF_REAL,"Second order temp. coefficient"), - IOPR( "tc2r", RES_MOD_TC2, IF_REAL,"Second order temp. coefficient"), - IOPX( "defw", RES_MOD_DEFWIDTH, IF_REAL,"Default device width"), - IOPR( "w", RES_MOD_DEFWIDTH, IF_REAL,"Default device width"), - IOPX( "l", RES_MOD_DEFLENGTH,IF_REAL,"Default device length"), - IOPQ( "kf", RES_MOD_KF, IF_REAL,"Flicker noise coefficient"), - IOPQ( "af", RES_MOD_AF, IF_REAL,"Flicker noise exponent"), - IOPXU( "tnom", RES_MOD_TNOM, IF_REAL,"Parameter measurement temperature"), - IP( "r", RES_MOD_R, IF_FLAG,"Device is a resistor model") + IOPQ( "rsh", RES_MOD_RSH, IF_REAL,"Sheet resistance"), + IOPZ( "narrow", RES_MOD_NARROW, IF_REAL,"Narrowing of resistor"), + IOPR( "dw", RES_MOD_NARROW, IF_REAL,"Narrowing of resistor"), + IOPZ( "short", RES_MOD_SHORT, IF_REAL,"Shortening of resistor"), + IOPR( "dlr", RES_MOD_SHORT, IF_REAL,"Shortening of resistor"), + IOPQ( "tc1", RES_MOD_TC1, IF_REAL,"First order temp. coefficient"), + IOPR( "tc1r", RES_MOD_TC1, IF_REAL,"First order temp. coefficient"), + IOPQO( "tc2", RES_MOD_TC2, IF_REAL,"Second order temp. coefficient"), + IOPR( "tc2r", RES_MOD_TC2, IF_REAL,"Second order temp. coefficient"), + IOPX( "defw", RES_MOD_DEFWIDTH, IF_REAL,"Default device width"), + IOPR( "w", RES_MOD_DEFWIDTH, IF_REAL,"Default device width"), + IOPX( "l", RES_MOD_DEFLENGTH,IF_REAL,"Default device length"), + IOPQ( "kf", RES_MOD_KF, IF_REAL,"Flicker noise coefficient"), + IOPQ( "af", RES_MOD_AF, IF_REAL,"Flicker noise exponent"), + IOPXU( "tnom", RES_MOD_TNOM, IF_REAL,"Parameter measurement temperature"), + IP( "r", RES_MOD_R, IF_FLAG,"Device is a resistor model") }; char *RESnames[] = { diff --git a/src/spicelib/devices/res/resdefs.h b/src/spicelib/devices/res/resdefs.h index eebda4793..3aaec4fb1 100644 --- a/src/spicelib/devices/res/resdefs.h +++ b/src/spicelib/devices/res/resdefs.h @@ -13,14 +13,14 @@ Modified: 2000 AlansFixes #include "ngspice/complex.h" #include "ngspice/noisedef.h" - /* definitions used to describe resistors */ +/* definitions used to describe resistors */ /* information used to describe a single instance */ typedef struct sRESinstance { struct sRESmodel *RESmodPtr; /* backpointer to model */ - struct sRESinstance *RESnextInstance; /* pointer to next instance of + struct sRESinstance *RESnextInstance; /* pointer to next instance of * current model*/ IFuid RESname; /* pointer to character string naming this instance */ @@ -33,7 +33,7 @@ typedef struct sRESinstance { double RESconduct; /* conductance at current analysis temperature */ double RESresist; /* resistance at temperature Tnom */ double REScurrent; /* The dc current in the resistor */ -/* serban */ + /* serban */ double RESacResist; /* AC resistance, useful for fancy .ac analyses */ double RESacConduct; /* AC conductance */ double RESwidth; /* width of the resistor */ @@ -43,13 +43,13 @@ typedef struct sRESinstance { double REStc1; /* first temperature coefficient of resistors */ double REStc2; /* second temperature coefficient of resistors */ int RESnoisy; /* Set if the resistor generates noise */ - double *RESposPosptr; /* pointer to sparse matrix diagonal at + double *RESposPosptr; /* pointer to sparse matrix diagonal at * (positive,positive) */ - double *RESnegNegptr; /* pointer to sparse matrix diagonal at + double *RESnegNegptr; /* pointer to sparse matrix diagonal at * (negative,negative) */ - double *RESposNegptr; /* pointer to sparse matrix offdiagonal at + double *RESposNegptr; /* pointer to sparse matrix offdiagonal at * (positive,negative) */ - double *RESnegPosptr; /* pointer to sparse matrix offdiagonal at + double *RESnegPosptr; /* pointer to sparse matrix offdiagonal at * (negative,positive) */ unsigned RESresGiven : 1; /* flag to indicate resistance was specified */ unsigned RESwidthGiven : 1; /* flag to indicate width given */ @@ -57,7 +57,7 @@ typedef struct sRESinstance { unsigned RESscaleGiven : 1; /* flag to indicate scale given */ unsigned REStempGiven : 1; /* indicates temperature specified */ unsigned RESdtempGiven : 1; /* indicates delta-temp specified */ -/* serban */ + /* serban */ unsigned RESacresGiven : 1; /* indicates AC value specified */ unsigned RESmGiven : 1; /* indicates M parameter specified */ unsigned REStc1Given : 1; /* indicates tc1 parameter specified */ @@ -66,7 +66,7 @@ typedef struct sRESinstance { int RESsenParmNo; /* parameter # for sensitivity use; * set equal to 0 if not a design parameter*/ -/* indices to array of RES noise sources */ + /* indices to array of RES noise sources */ #define RESTHNOIZ 0 /* Thermal noise source */ #define RESFLNOIZ 1 /* Flicker noise source */ @@ -88,7 +88,7 @@ typedef struct sRESinstance { typedef struct sRESmodel { /* model structure for a resistor */ int RESmodType; /* type index of this device type */ - struct sRESmodel *RESnextModel; /* pointer to next possible model in + struct sRESmodel *RESnextModel; /* pointer to next possible model in * linked list */ RESinstance * RESinstances; /* pointer to list of instances that have this * model */ diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index 5720661ba..65cf44fbe 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -17,23 +17,23 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) { RESmodel *model = (RESmodel *)inModel; double m; - + /* loop through all the resistor models */ for( ; model != NULL; model = model->RESnextModel ) { RESinstance *here; /* loop through all the instances of the model */ for (here = model->RESinstances; here != NULL ; - here = here->RESnextInstance) { - - here->REScurrent = (*(ckt->CKTrhsOld+here->RESposNode) - - *(ckt->CKTrhsOld+here->RESnegNode)) * here->RESconduct; + here = here->RESnextInstance) { - m = (here->RESm); - *(here->RESposPosptr) += m * here->RESconduct; - *(here->RESnegNegptr) += m * here->RESconduct; - *(here->RESposNegptr) -= m * here->RESconduct; - *(here->RESnegPosptr) -= m * here->RESconduct; + here->REScurrent = (*(ckt->CKTrhsOld+here->RESposNode) - + *(ckt->CKTrhsOld+here->RESnegNode)) * here->RESconduct; + + m = (here->RESm); + *(here->RESposPosptr) += m * here->RESconduct; + *(here->RESnegNegptr) += m * here->RESconduct; + *(here->RESposNegptr) -= m * here->RESconduct; + *(here->RESnegPosptr) -= m * here->RESconduct; } } return(OK); @@ -56,9 +56,9 @@ RESacload(GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = model->RESinstances; here != NULL ; - here = here->RESnextInstance) { - - if(!here->RESmGiven) + here = here->RESnextInstance) { + + if(!here->RESmGiven) here->RESm = 1.0; m = (here->RESm); diff --git a/src/spicelib/devices/res/resmpar.c b/src/spicelib/devices/res/resmpar.c index 172d01247..c5c5896e4 100644 --- a/src/spicelib/devices/res/resmpar.c +++ b/src/spicelib/devices/res/resmpar.c @@ -16,55 +16,55 @@ int RESmParam(int param, IFvalue *value, GENmodel *inModel) { RESmodel *model = (RESmodel *)inModel; - + switch(param) { - case RES_MOD_TNOM: - model->REStnom = value->rValue+CONSTCtoK; - model->REStnomGiven = TRUE; - break; - case RES_MOD_TC1: - model->REStempCoeff1 = value->rValue; - model->REStc1Given = TRUE; - break; - case RES_MOD_TC2: - model->REStempCoeff2 = value->rValue; - model->REStc2Given = TRUE; - break; - case RES_MOD_RSH: - model->RESsheetRes = value->rValue; - model->RESsheetResGiven = TRUE; - break; - case RES_MOD_DEFWIDTH: - model->RESdefWidth = value->rValue; - model->RESdefWidthGiven = TRUE; - break; - case RES_MOD_DEFLENGTH: - model->RESdefLength = value->rValue; - model->RESdefLengthGiven = TRUE; - break; - case RES_MOD_NARROW: - model->RESnarrow = value->rValue; - model->RESnarrowGiven = TRUE; - break; - case RES_MOD_SHORT: - model->RESshort = value->rValue; - model->RESshortGiven = TRUE; - break; - case RES_MOD_KF: - model->RESfNcoef = value->rValue; - model->RESfNcoefGiven = TRUE; - break; - case RES_MOD_AF: - model->RESfNexp = value->rValue; - model->RESfNexpGiven = TRUE; - break; - - case RES_MOD_R: - /* just being reassured by user that this is a resistor model */ - /* no-op */ - break; - default: - return(E_BADPARM); + case RES_MOD_TNOM: + model->REStnom = value->rValue+CONSTCtoK; + model->REStnomGiven = TRUE; + break; + case RES_MOD_TC1: + model->REStempCoeff1 = value->rValue; + model->REStc1Given = TRUE; + break; + case RES_MOD_TC2: + model->REStempCoeff2 = value->rValue; + model->REStc2Given = TRUE; + break; + case RES_MOD_RSH: + model->RESsheetRes = value->rValue; + model->RESsheetResGiven = TRUE; + break; + case RES_MOD_DEFWIDTH: + model->RESdefWidth = value->rValue; + model->RESdefWidthGiven = TRUE; + break; + case RES_MOD_DEFLENGTH: + model->RESdefLength = value->rValue; + model->RESdefLengthGiven = TRUE; + break; + case RES_MOD_NARROW: + model->RESnarrow = value->rValue; + model->RESnarrowGiven = TRUE; + break; + case RES_MOD_SHORT: + model->RESshort = value->rValue; + model->RESshortGiven = TRUE; + break; + case RES_MOD_KF: + model->RESfNcoef = value->rValue; + model->RESfNcoefGiven = TRUE; + break; + case RES_MOD_AF: + model->RESfNexp = value->rValue; + model->RESfNexpGiven = TRUE; + break; + + case RES_MOD_R: + /* just being reassured by user that this is a resistor model */ + /* no-op */ + break; + default: + return(E_BADPARM); } return(OK); } diff --git a/src/spicelib/devices/res/resparam.c b/src/spicelib/devices/res/resparam.c index 8156a8160..a11505f2e 100644 --- a/src/spicelib/devices/res/resparam.c +++ b/src/spicelib/devices/res/resparam.c @@ -19,59 +19,59 @@ RESparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) NG_IGNORE(select); switch(param) { - case RES_TEMP: - here->REStemp = value->rValue + CONSTCtoK; - here->REStempGiven = TRUE; - break; - case RES_DTEMP: - here->RESdtemp = value->rValue; - here->RESdtempGiven = TRUE; - break; - case RES_RESIST: - /* 0 valued resistor causes ngspice to hang -- can't solve for initial voltage */ - if ( AlmostEqualUlps( value->rValue, 0, 3 ) ) value->rValue = 0.001; /* 0.0001 should be sufficiently small */ - /* it's the value that smartspice uses */ + case RES_TEMP: + here->REStemp = value->rValue + CONSTCtoK; + here->REStempGiven = TRUE; + break; + case RES_DTEMP: + here->RESdtemp = value->rValue; + here->RESdtempGiven = TRUE; + break; + case RES_RESIST: + /* 0 valued resistor causes ngspice to hang -- can't solve for initial voltage */ + if ( AlmostEqualUlps( value->rValue, 0, 3 ) ) value->rValue = 0.001; /* 0.0001 should be sufficiently small */ + /* it's the value that smartspice uses */ - here->RESresist = value->rValue; - here->RESresGiven = TRUE; - break; - case RES_ACRESIST: - here->RESacResist = value->rValue; - here->RESacresGiven = TRUE; - break; - case RES_WIDTH: - here->RESwidth = value->rValue; - here->RESwidthGiven = TRUE; - break; - case RES_LENGTH: - here->RESlength = value->rValue; - here->RESlengthGiven = TRUE; - break; - case RES_SCALE: - here->RESscale = value->rValue; - here->RESscaleGiven = TRUE; - break; - case RES_RESIST_SENS: - here->RESsenParmNo = value->iValue; - break; - case RES_M: - here->RESm = value->rValue; - here->RESmGiven = TRUE; - break; - case RES_TC1: - here->REStc1 = value->rValue; - here->REStc1Given = TRUE; - break; - case RES_TC2: - here->REStc2 = value->rValue; - here->REStc2Given = TRUE; - break; - case RES_NOISY: - here->RESnoisy = value->iValue; - here->RESnoisyGiven = TRUE; - break; - default: - return(E_BADPARM); + here->RESresist = value->rValue; + here->RESresGiven = TRUE; + break; + case RES_ACRESIST: + here->RESacResist = value->rValue; + here->RESacresGiven = TRUE; + break; + case RES_WIDTH: + here->RESwidth = value->rValue; + here->RESwidthGiven = TRUE; + break; + case RES_LENGTH: + here->RESlength = value->rValue; + here->RESlengthGiven = TRUE; + break; + case RES_SCALE: + here->RESscale = value->rValue; + here->RESscaleGiven = TRUE; + break; + case RES_RESIST_SENS: + here->RESsenParmNo = value->iValue; + break; + case RES_M: + here->RESm = value->rValue; + here->RESmGiven = TRUE; + break; + case RES_TC1: + here->REStc1 = value->rValue; + here->REStc1Given = TRUE; + break; + case RES_TC2: + here->REStc2 = value->rValue; + here->REStc2Given = TRUE; + break; + case RES_NOISY: + here->RESnoisy = value->iValue; + here->RESnoisyGiven = TRUE; + break; + default: + return(E_BADPARM); } return(OK); } diff --git a/src/spicelib/devices/res/restemp.c b/src/spicelib/devices/res/restemp.c index 64b091c3b..bd19bd03b 100644 --- a/src/spicelib/devices/res/restemp.c +++ b/src/spicelib/devices/res/restemp.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified Apr 2000 - Paolo Nenzi +Modified Apr 2000 - Paolo Nenzi Modified: 2000 AlanSfixes **********/ @@ -12,12 +12,12 @@ Modified: 2000 AlanSfixes int REStemp(GENmodel *inModel, CKTcircuit *ckt) - /* perform the temperature update to the resistors - * calculate the conductance as a function of the - * given nominal and current temperatures - the - * resistance given in the struct is the nominal - * temperature resistance - */ +/* perform the temperature update to the resistors + * calculate the conductance as a function of the + * given nominal and current temperatures - the + * resistance given in the struct is the nominal + * temperature resistance + */ { RESmodel *model = (RESmodel *)inModel; RESinstance *here; @@ -46,16 +46,16 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) here=here->RESnextInstance) { /* Default Value Processing for Resistor Instance */ - - if(!here->REStempGiven) { - here->REStemp = ckt->CKTtemp; - if(!here->RESdtempGiven) here->RESdtemp = 0.0; - } else { /* REStempGiven */ - here->RESdtemp = 0.0; - if (here->RESdtempGiven) - printf("%s: Instance temperature specified, dtemp ignored\n", here->RESname); - } - + + if(!here->REStempGiven) { + here->REStemp = ckt->CKTtemp; + if(!here->RESdtempGiven) here->RESdtemp = 0.0; + } else { /* REStempGiven */ + here->RESdtemp = 0.0; + if (here->RESdtempGiven) + printf("%s: Instance temperature specified, dtemp ignored\n", here->RESname); + } + if(!here->RESwidthGiven) here->RESwidth = model->RESdefWidth; if(!here->RESlengthGiven) here->RESlength = model->RESdefLength; if(!here->RESscaleGiven) here->RESscale = 1.0; @@ -65,16 +65,16 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) if(model->RESsheetResGiven && (model->RESsheetRes != 0) && (here->RESlength != 0)) { here->RESresist = model->RESsheetRes * (here->RESlength - - model->RESshort) / (here->RESwidth - model->RESnarrow); + model->RESshort) / (here->RESwidth - model->RESnarrow); } else { SPfrontEnd->IFerror (ERR_WARNING, - "%s: resistance = 0 ohm, set to 1000 ohm",&(here->RESname)); + "%s: resistance = 0 ohm, set to 1000 ohm",&(here->RESname)); here->RESresist=1000; } } difference = (here->REStemp + here->RESdtemp) - model->REStnom; - + /* instance parameters tc1 and tc2 will override model parameters tc1 and tc2 */ if (here->REStc1Given) @@ -88,17 +88,17 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) tc2 = model->REStempCoeff2; factor = 1.0 + tc1*difference + - tc2*difference*difference; + tc2*difference*difference; here -> RESconduct = (1.0/(here->RESresist * factor * here->RESscale)); - + /* Paolo Nenzi: AC value */ - if(here->RESacresGiven) - here->RESacConduct = (1.0/(here->RESacResist * factor * here->RESscale)); + if(here->RESacresGiven) + here->RESacConduct = (1.0/(here->RESacResist * factor * here->RESscale)); else { - here -> RESacConduct = here -> RESconduct; - here -> RESacResist = here -> RESresist; - } + here -> RESacConduct = here -> RESconduct; + here -> RESacResist = here -> RESresist; + } } } return(OK); From e4cfe0ffffd6e293581a4426d0e02a241c5193a8 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 9 May 2013 10:23:51 +0200 Subject: [PATCH 058/257] resload.c: m already set in ressetup.c --- src/spicelib/devices/res/resload.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index 65cf44fbe..9b9506f87 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -58,9 +58,6 @@ RESacload(GENmodel *inModel, CKTcircuit *ckt) for (here = model->RESinstances; here != NULL ; here = here->RESnextInstance) { - if(!here->RESmGiven) - here->RESm = 1.0; - m = (here->RESm); if(here->RESacresGiven) { *(here->RESposPosptr) += m * here->RESacConduct; From cb6fe6389c8b9c8bb3fb00bab79768345345c93f Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 9 May 2013 10:28:38 +0200 Subject: [PATCH 059/257] indload.c, indacld.c: multiplier m added --- src/spicelib/devices/ind/indacld.c | 5 ++++- src/spicelib/devices/ind/indload.c | 12 +++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/ind/indacld.c b/src/spicelib/devices/ind/indacld.c index 5ab7f769f..6a910d4fd 100644 --- a/src/spicelib/devices/ind/indacld.c +++ b/src/spicelib/devices/ind/indacld.c @@ -17,13 +17,16 @@ INDacLoad(GENmodel *inModel, CKTcircuit *ckt) { INDmodel *model = (INDmodel*)inModel; double val; + double m; INDinstance *here; for( ; model != NULL; model = model->INDnextModel) { for( here = model->INDinstances;here != NULL; here = here->INDnextInstance) { - val = ckt->CKTomega * here->INDinduct; + m = (here->INDm); + + val = ckt->CKTomega * here->INDinduct / m; *(here->INDposIbrptr) += 1; *(here->INDnegIbrptr) -= 1; diff --git a/src/spicelib/devices/ind/indload.c b/src/spicelib/devices/ind/indload.c index bdc445202..711953f89 100644 --- a/src/spicelib/devices/ind/indload.c +++ b/src/spicelib/devices/ind/indload.c @@ -21,6 +21,7 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) INDinstance *here; double veq; double req; + double m; int error; #ifdef MUTUAL @@ -37,12 +38,14 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) for (here = model->INDinstances; here != NULL ; here=here->INDnextInstance) { + m = (here->INDm); + if(!(ckt->CKTmode & (MODEDC|MODEINITPRED))) { if(ckt->CKTmode & MODEUIC && ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate0 + here->INDflux) = here->INDinduct * + *(ckt->CKTstate0 + here->INDflux) = here->INDinduct / m * here->INDinitCond; } else { - *(ckt->CKTstate0 + here->INDflux) = here->INDinduct * + *(ckt->CKTstate0 + here->INDflux) = here->INDinduct / m * *(ckt->CKTrhsOld + here->INDbrEq); } } @@ -86,6 +89,7 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) req = 0.0; veq = 0.0; } else { + double newmind; #ifndef PREDICTOR if(ckt->CKTmode & MODEINITPRED) { *(ckt->CKTstate0 + here->INDflux) = @@ -99,7 +103,9 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) #ifndef PREDICTOR } #endif /*PREDICTOR*/ - error=NIintegrate(ckt,&req,&veq,here->INDinduct,here->INDflux); + m = (here->INDm); + newmind = here->INDinduct/m; + error=NIintegrate(ckt,&req,&veq,newmind,here->INDflux); if(error) return(error); } From 817ada1e1bc99c7caf53f1add27c60fc0ba45192 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 9 May 2013 11:43:37 +0200 Subject: [PATCH 060/257] subckt.c: enable correct model renaming for inductors --- src/frontend/subckt.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/subckt.c b/src/frontend/subckt.c index b819b1904..032c93e30 100644 --- a/src/frontend/subckt.c +++ b/src/frontend/subckt.c @@ -1815,6 +1815,7 @@ devmodtranslate(struct line *deck, char *subname, wordlist * const submod) case 'r': case 'c': + case 'l': name = gettok(&t); /* get refdes */ (void) sprintf(buffer, "%s ", name); tfree(name); From fb3aa5b526cebba744e9df018e5dab23673b1474 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 9 May 2013 11:45:15 +0200 Subject: [PATCH 061/257] measure.c: disable autostop, if no .meas commands found --- src/frontend/measure.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/frontend/measure.c b/src/frontend/measure.c index f74fb821c..546bf92d3 100644 --- a/src/frontend/measure.c +++ b/src/frontend/measure.c @@ -239,6 +239,14 @@ do_measure( return (measures_passed); } + /* don't allow autostop if no .meas commands are given in the input file */ + if ((cp_getvar("autostop", CP_BOOL, NULL)) && (ft_curckt->ci_meas == NULL)) { + fprintf(cp_err, "\nWarning: No .meas commands found!\n"); + fprintf(cp_err, " Option autostop is not available, ignored!\n\n"); + cp_remvar("autostop"); + return (FALSE); + } + /* Evaluating the linked list of .meas cards, assembled from the input deck by fcn inp_spsource() in inp.c:575. A typical .meas card will contain: From 38fe312f7dbb22340ed5b2f51537a7c8283166b5 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 9 May 2013 19:39:21 +0200 Subject: [PATCH 062/257] Someone gives version=3.30e+00 in bsim models --- src/spicelib/devices/bsim3/b3check.c | 4 ++-- src/spicelib/devices/bsim3v32/b3v32check.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3check.c b/src/spicelib/devices/bsim3/b3check.c index 1951cdf95..cbdaaa020 100644 --- a/src/spicelib/devices/bsim3/b3check.c +++ b/src/spicelib/devices/bsim3/b3check.c @@ -31,10 +31,10 @@ FILE *fplog; NG_IGNORE(ckt); - if ((fplog = fopen("b3v3check.log", "w")) != NULL) + if ((fplog = fopen("b3v33check.log", "w")) != NULL) { pParam = here->pParam; fprintf(fplog, "BSIM3v3.3.0 Parameter Checking.\n"); - if ((strcmp(model->BSIM3version, "3.3.0")) && (strcmp(model->BSIM3version, "3.30")) && (strcmp(model->BSIM3version, "3.3"))) + if ((strncmp(model->BSIM3version, "3.3.0", 5)) && (strncmp(model->BSIM3version, "3.30", 4)) && (strncmp(model->BSIM3version, "3.3", 3))) { fprintf(fplog, "Warning: This model is BSIM3v3.3.0; you specified a wrong version number.\n"); printf("Warning: This model is BSIM3v3.3.0; you specified a wrong version number.\n"); } diff --git a/src/spicelib/devices/bsim3v32/b3v32check.c b/src/spicelib/devices/bsim3v32/b3v32check.c index 7f85e07a5..2f1c7aec5 100644 --- a/src/spicelib/devices/bsim3v32/b3v32check.c +++ b/src/spicelib/devices/bsim3v32/b3v32check.c @@ -28,7 +28,7 @@ FILE *fplog; NG_IGNORE(ckt); - if ((fplog = fopen("b3v3check.log", "w")) != NULL) + if ((fplog = fopen("b3v32check.log", "w")) != NULL) { pParam = here->pParam; fprintf (fplog, From 42802f73a1e88160ce08de29d1ef7b3ea4a5d3cd Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 9 May 2013 21:50:55 +0200 Subject: [PATCH 063/257] Alternative geometry correction for semiconductor capacitors --- src/spicelib/devices/cap/cap.c | 1 + src/spicelib/devices/cap/capdefs.h | 17 +++++----- src/spicelib/devices/cap/capmask.c | 3 ++ src/spicelib/devices/cap/capmpar.c | 4 +++ src/spicelib/devices/cap/capsetup.c | 49 +++++++++++++++++------------ 5 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/spicelib/devices/cap/cap.c b/src/spicelib/devices/cap/cap.c index f4c73e2d1..370ae170d 100644 --- a/src/spicelib/devices/cap/cap.c +++ b/src/spicelib/devices/cap/cap.c @@ -47,6 +47,7 @@ IFparm CAPmPTable[] = { /* names of model parameters */ IOPR( "l", CAP_MOD_DEFLENGTH,IF_REAL, "Default length"), IOPA( "narrow", CAP_MOD_NARROW, IF_REAL, "width correction factor"), IOPA( "short", CAP_MOD_SHORT, IF_REAL, "length correction factor"), + IOPA( "del", CAP_MOD_DEL, IF_REAL, "length and width correction factor"), IOPA( "tc1", CAP_MOD_TC1, IF_REAL, "First order temp. coefficient"), IOPA( "tc2", CAP_MOD_TC2, IF_REAL, "Second order temp. coefficient"), IOPXU("tnom", CAP_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), diff --git a/src/spicelib/devices/cap/capdefs.h b/src/spicelib/devices/cap/capdefs.h index c195f2910..09ebf9fa9 100644 --- a/src/spicelib/devices/cap/capdefs.h +++ b/src/spicelib/devices/cap/capdefs.h @@ -88,6 +88,7 @@ typedef struct sCAPmodel { /* model structure for a capacitor */ double CAPdefLength; /* the default length of a capacitor */ double CAPnarrow; /* amount by which width are less than drawn */ double CAPshort; /* amount by which length are less than drawn */ + double CAPdel; /* amount by which length and width are less than drawn */ double CAPdi; /* Relative dielectric constant */ double CAPthick; /* Insulator thickness */ unsigned CAPmCapGiven : 1; /* flag indicates default capacitance given */ @@ -97,6 +98,7 @@ typedef struct sCAPmodel { /* model structure for a capacitor */ unsigned CAPdefLengthGiven : 1; /* flag indicates deafult lenght given */ unsigned CAPnarrowGiven : 1; /* flag indicates narrowing factor given */ unsigned CAPshortGiven : 1; /* flag indicates shortening factor given */ + unsigned CAPdelGiven : 1; /* flag indicates del factor given */ unsigned CAPtnomGiven : 1; /* flag indicates nominal temp. given */ unsigned CAPtc1Given : 1; /* flag indicates tc1 was specified */ unsigned CAPtc2Given : 1; /* flag indicates tc2 was specified */ @@ -127,13 +129,14 @@ typedef struct sCAPmodel { /* model structure for a capacitor */ #define CAP_MOD_C 104 #define CAP_MOD_NARROW 105 #define CAP_MOD_SHORT 106 -#define CAP_MOD_TC1 107 -#define CAP_MOD_TC2 108 -#define CAP_MOD_TNOM 109 -#define CAP_MOD_DI 110 -#define CAP_MOD_THICK 111 -#define CAP_MOD_CAP 112 -#define CAP_MOD_DEFLENGTH 113 +#define CAP_MOD_DEL 107 +#define CAP_MOD_TC1 108 +#define CAP_MOD_TC2 109 +#define CAP_MOD_TNOM 110 +#define CAP_MOD_DI 111 +#define CAP_MOD_THICK 112 +#define CAP_MOD_CAP 113 +#define CAP_MOD_DEFLENGTH 114 /* device questions */ #define CAP_QUEST_SENS_REAL 201 diff --git a/src/spicelib/devices/cap/capmask.c b/src/spicelib/devices/cap/capmask.c index efd216426..8f8c5ebe4 100644 --- a/src/spicelib/devices/cap/capmask.c +++ b/src/spicelib/devices/cap/capmask.c @@ -54,6 +54,9 @@ CAPmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case CAP_MOD_SHORT: value->rValue = here->CAPshort; return(OK); + case CAP_MOD_DEL: + value->rValue = here->CAPdel; + return(OK); case CAP_MOD_DI: value->rValue = here->CAPdi; return(OK); diff --git a/src/spicelib/devices/cap/capmpar.c b/src/spicelib/devices/cap/capmpar.c index f81da7eee..f7fefd1d9 100644 --- a/src/spicelib/devices/cap/capmpar.c +++ b/src/spicelib/devices/cap/capmpar.c @@ -58,6 +58,10 @@ CAPmParam(int param, IFvalue *value, GENmodel *inModel) mod->CAPshort = value->rValue; mod->CAPshortGiven = TRUE; break; + case CAP_MOD_DEL: + mod->CAPdel = value->rValue; + mod->CAPdelGiven = TRUE; + break; case CAP_MOD_DI: mod->CAPdi = value->rValue; mod->CAPdiGiven = TRUE; diff --git a/src/spicelib/devices/cap/capsetup.c b/src/spicelib/devices/cap/capsetup.c index dea2a6e3a..e37e4136d 100644 --- a/src/spicelib/devices/cap/capsetup.c +++ b/src/spicelib/devices/cap/capsetup.c @@ -16,8 +16,8 @@ Modified: September 2003 Paolo Nenzi /*ARGSUSED*/ int CAPsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) - /* load the capacitor structure with those pointers needed later - * for fast matrix loading + /* load the capacitor structure with those pointers needed later + * for fast matrix loading */ { @@ -28,7 +28,7 @@ CAPsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) for( ; model != NULL; model = model->CAPnextModel ) { /*Default Value Processing for Model Parameters */ - if (!model->CAPmCapGiven) { + if (!model->CAPmCapGiven) { model->CAPmCap = 0.0; } if (!model->CAPcjswGiven){ @@ -37,7 +37,7 @@ CAPsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if (!model->CAPdefWidthGiven) { model->CAPdefWidth = 10.e-6; } - if (!model->CAPdefLengthGiven) { + if (!model->CAPdefLengthGiven) { model->CAPdefLength = 0.0; } if (!model->CAPnarrowGiven) { @@ -46,35 +46,44 @@ CAPsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if (!model->CAPshortGiven) { model->CAPshort = 0.0; } + if (!model->CAPdelGiven) { + model->CAPdel = 0.0; + } if (!model->CAPtc1Given) { model->CAPtempCoeff1 = 0.0; } if (!model->CAPtc2Given) { model->CAPtempCoeff2 = 0.0; } - if (!model->CAPtnomGiven) { + if (!model->CAPtnomGiven) { model->CAPtnom = ckt->CKTnomTemp; } - if (!model->CAPdiGiven) { + if (!model->CAPdiGiven) { model->CAPdi = 0.0; } - if (!model->CAPthickGiven) { + if (!model->CAPthickGiven) { model->CAPthick = 0.0; } - - if (!model->CAPcjGiven) { - if((model->CAPthickGiven) - && (model->CAPthick > 0.0)) { - - if (model->CAPdiGiven) - model->CAPcj = (model->CAPdi * CONSTepsZero) / model->CAPthick; - else - model->CAPcj = CONSTepsSiO2 / model->CAPthick; - } else { - model->CAPcj = 0.0; - } + + if (!model->CAPcjGiven) { + if((model->CAPthickGiven) + && (model->CAPthick > 0.0)) { + if (model->CAPdiGiven) + model->CAPcj = (model->CAPdi * CONSTepsZero) / model->CAPthick; + else + model->CAPcj = CONSTepsSiO2 / model->CAPthick; + } else { + model->CAPcj = 0.0; + } } - + + if (model->CAPdelGiven) { + if (!model->CAPnarrowGiven) + model->CAPnarrow = 2 * model->CAPdel; + if (!model->CAPshortGiven) + model->CAPshort = 2 * model->CAPdel; + } + /* loop through all the instances of the model */ for (here = model->CAPinstances; here != NULL ; here=here->CAPnextInstance) { From c81f30ae8fd79779e0b584604be0a700cbbd51e9 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 11 May 2013 16:06:58 +0200 Subject: [PATCH 064/257] inpcom.c: no multiplier 'm' added to V, I lines in subckt --- src/frontend/inpcom.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 768cfcaf3..2375b07ce 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2642,8 +2642,9 @@ inp_fix_subckt_multiplier(struct line *subckt_card, for (card = subckt_card->li_next; card != NULL && !ciprefix(".ends", card->li_line); card = card->li_next) { - /* no 'm' for B line or comment line */ - if ((*(card->li_line) == '*') || (*(card->li_line) == 'b')) + /* no 'm' for B, I, V or comment line */ + if ((*(card->li_line) == '*') || (*(card->li_line) == 'b') || (*(card->li_line) == 'v') + || (*(card->li_line) == 'i')) continue; /* no 'm' for model cards */ if (ciprefix(".model", card->li_line)) From 0b773150cc1b31141a88e973a8794a3675b51624 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 11 May 2013 16:31:27 +0200 Subject: [PATCH 065/257] inpcom.c: some comments added --- src/frontend/inpcom.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 2375b07ce..c45f16f99 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2601,7 +2601,9 @@ inp_fix_inst_line(char *inst_line, return curr_line; } - +/* If multiplier parameter 'm' is found on a X line, flag is set + to TRUE. + Function is called from inp_fix_inst_calls_for_numparam()*/ static bool found_mult_param(int num_params, char *param_names[]) { @@ -2615,7 +2617,13 @@ found_mult_param(int num_params, char *param_names[]) return found_mult; } +/* If a subcircuit invocation (X-line) is found, which contains the + multiplier parameter 'm', m is added to all lines inside + the corresponding subcircuit except of some excluded in the code below + (FIXME: It may be necessary to exclude more of them, at least + for all devices that are not supporting the 'm' parameter). + Function is called from inp_fix_inst_calls_for_numparam()*/ static int inp_fix_subckt_multiplier(struct line *subckt_card, int num_subckt_params, char *subckt_param_names[], char *subckt_param_values[]) From 2c79b7b789569f887ccf44c50f71ef15fd22b6e4 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sat, 11 May 2013 22:07:47 +0200 Subject: [PATCH 066/257] Allow Multiplier for current source in subckts --- src/frontend/inpcom.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index c45f16f99..052c5a179 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2650,9 +2650,8 @@ inp_fix_subckt_multiplier(struct line *subckt_card, for (card = subckt_card->li_next; card != NULL && !ciprefix(".ends", card->li_line); card = card->li_next) { - /* no 'm' for B, I, V or comment line */ - if ((*(card->li_line) == '*') || (*(card->li_line) == 'b') || (*(card->li_line) == 'v') - || (*(card->li_line) == 'i')) + /* no 'm' for B, V or comment line */ + if ((*(card->li_line) == '*') || (*(card->li_line) == 'b') || (*(card->li_line) == 'v')) continue; /* no 'm' for model cards */ if (ciprefix(".model", card->li_line)) From 2ba6af1320e3ed80157c1a6a4a82da041b54db64 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sat, 11 May 2013 22:17:03 +0200 Subject: [PATCH 067/257] Allow Multiplier for current sources --- src/spicelib/devices/isrc/isrc.c | 1 + src/spicelib/devices/isrc/isrcacld.c | 11 ++++--- src/spicelib/devices/isrc/isrcask.c | 3 ++ src/spicelib/devices/isrc/isrcdefs.h | 45 +++++++++++++++------------- src/spicelib/devices/isrc/isrcload.c | 9 ++++-- src/spicelib/devices/isrc/isrcpar.c | 5 ++++ src/spicelib/devices/isrc/isrctemp.c | 2 ++ 7 files changed, 48 insertions(+), 28 deletions(-) diff --git a/src/spicelib/devices/isrc/isrc.c b/src/spicelib/devices/isrc/isrc.c index e872642ae..65dce66d8 100644 --- a/src/spicelib/devices/isrc/isrc.c +++ b/src/spicelib/devices/isrc/isrc.c @@ -11,6 +11,7 @@ Author: 1987 Thomas L. Quarles IFparm ISRCpTable[] = { /* parameters */ IOPP("dc", ISRC_DC, IF_REAL ,"DC value of source"), + IOP ( "m", ISRC_M, IF_REAL , "Parallel multiplier"), IOPPA("acmag", ISRC_AC_MAG, IF_REAL ,"AC Magnitude"), IOPAAU("acphase", ISRC_AC_PHASE, IF_REAL ,"AC Phase"), /* Modified to allow print @Iin[sin] A.Roldan */ diff --git a/src/spicelib/devices/isrc/isrcacld.c b/src/spicelib/devices/isrc/isrcacld.c index 5e2ba34be..ef6e2f730 100644 --- a/src/spicelib/devices/isrc/isrcacld.c +++ b/src/spicelib/devices/isrc/isrcacld.c @@ -15,6 +15,7 @@ ISRCacLoad(GENmodel *inModel, CKTcircuit *ckt) { ISRCmodel *model = (ISRCmodel *) inModel; ISRCinstance *here; + double m; for( ; model != NULL; model = model->ISRCnextModel ) { @@ -22,14 +23,16 @@ ISRCacLoad(GENmodel *inModel, CKTcircuit *ckt) for (here = model->ISRCinstances; here != NULL ; here=here->ISRCnextInstance) { + m = here->ISRCmValue; + *(ckt->CKTrhs + (here->ISRCposNode)) += - here->ISRCacReal; + m * here->ISRCacReal; *(ckt->CKTrhs + (here->ISRCnegNode)) -= - here->ISRCacReal; + m * here->ISRCacReal; *(ckt->CKTirhs + (here->ISRCposNode)) += - here->ISRCacImag; + m * here->ISRCacImag; *(ckt->CKTirhs + (here->ISRCnegNode)) -= - here->ISRCacImag; + m * here->ISRCacImag; } } diff --git a/src/spicelib/devices/isrc/isrcask.c b/src/spicelib/devices/isrc/isrcask.c index 3740ab331..1d7171352 100644 --- a/src/spicelib/devices/isrc/isrcask.c +++ b/src/spicelib/devices/isrc/isrcask.c @@ -34,6 +34,9 @@ ISRCask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue * case ISRC_DC: value->rValue = here->ISRCdcValue; return (OK); + case ISRC_M: + value->rValue = here->ISRCmValue; + return (OK); case ISRC_AC_MAG: value->rValue = here->ISRCacMag; return (OK); diff --git a/src/spicelib/devices/isrc/isrcdefs.h b/src/spicelib/devices/isrc/isrcdefs.h index 53939074e..a7851a68f 100644 --- a/src/spicelib/devices/isrc/isrcdefs.h +++ b/src/spicelib/devices/isrc/isrcdefs.h @@ -33,6 +33,7 @@ typedef struct sISRCinstance { double *ISRCcoeffs; /* pointer to array of coefficients */ double ISRCdcValue; /* DC and TRANSIENT value of source */ + double ISRCmValue; /* Parallel multiplier */ double ISRCacPhase; /* AC phase angle */ double ISRCacMag; /* AC magnitude */ @@ -56,6 +57,7 @@ typedef struct sISRCinstance { /* gtri - end - add member to hold current source value */ unsigned ISRCdcGiven :1 ; /* flag to indicate dc value given */ + unsigned ISRCmGiven :1 ; /* flag to indicate multiplier given */ unsigned ISRCacGiven :1 ; /* flag to indicate ac keyword given */ unsigned ISRCacMGiven :1 ; /* flag to indicate ac magnitude given */ unsigned ISRCacPGiven :1 ; /* flag to indicate ac phase given */ @@ -94,31 +96,32 @@ typedef struct sISRCmodel { /* device parameters */ #define ISRC_DC 1 -#define ISRC_AC_MAG 2 -#define ISRC_AC_PHASE 3 -#define ISRC_AC 4 -#define ISRC_PULSE 5 -#define ISRC_SINE 6 -#define ISRC_EXP 7 -#define ISRC_PWL 8 -#define ISRC_SFFM 9 -#define ISRC_NEG_NODE 10 -#define ISRC_POS_NODE 11 -#define ISRC_AC_REAL 12 -#define ISRC_AC_IMAG 13 -#define ISRC_FCN_TYPE 14 -#define ISRC_FCN_ORDER 15 -#define ISRC_FCN_COEFFS 16 -#define ISRC_POWER 17 -#define ISRC_D_F1 18 -#define ISRC_D_F2 19 -#define ISRC_VOLTS 20 +#define ISRC_M 2 +#define ISRC_AC_MAG 3 +#define ISRC_AC_PHASE 4 +#define ISRC_AC 5 +#define ISRC_PULSE 6 +#define ISRC_SINE 7 +#define ISRC_EXP 8 +#define ISRC_PWL 9 +#define ISRC_SFFM 10 +#define ISRC_NEG_NODE 11 +#define ISRC_POS_NODE 12 +#define ISRC_AC_REAL 13 +#define ISRC_AC_IMAG 14 +#define ISRC_FCN_TYPE 15 +#define ISRC_FCN_ORDER 16 +#define ISRC_FCN_COEFFS 17 +#define ISRC_POWER 18 +#define ISRC_D_F1 19 +#define ISRC_D_F2 20 +#define ISRC_VOLTS 21 -#define ISRC_AM 21 +#define ISRC_AM 22 /* gtri - begin - add define for current source value */ #ifdef XSPICE /* needed for outputting results */ -#define ISRC_CURRENT 22 +#define ISRC_CURRENT 23 #endif /* gtri - end - add define for current source value */ #define ISRC_TRNOISE 25 diff --git a/src/spicelib/devices/isrc/isrcload.c b/src/spicelib/devices/isrc/isrcload.c index 04017585c..fc34fca0d 100644 --- a/src/spicelib/devices/isrc/isrcload.c +++ b/src/spicelib/devices/isrc/isrcload.c @@ -28,6 +28,7 @@ ISRCload(GENmodel *inModel, CKTcircuit *ckt) ISRCinstance *here; double value; double time; + double m; /* loop through all the source models */ for( ; model != NULL; model = model->ISRCnextModel ) { @@ -36,6 +37,8 @@ ISRCload(GENmodel *inModel, CKTcircuit *ckt) for (here = model->ISRCinstances; here != NULL ; here=here->ISRCnextInstance) { + m = here->ISRCmValue; + if( (ckt->CKTmode & (MODEDCOP | MODEDCTRANCURVE)) && here->ISRCdcGiven ) { /* load using DC value */ @@ -380,14 +383,14 @@ loadDone: #endif /* gtri - end - wbk - modify for supply ramping option */ - *(ckt->CKTrhs + (here->ISRCposNode)) += value; - *(ckt->CKTrhs + (here->ISRCnegNode)) -= value; + *(ckt->CKTrhs + (here->ISRCposNode)) += m * value; + *(ckt->CKTrhs + (here->ISRCnegNode)) -= m * value; /* gtri - end - wbk - modify to process srcFact, etc. for all sources */ #ifdef XSPICE /* gtri - begin - wbk - record value so it can be output if requested */ - here->ISRCcurrent = value; + here->ISRCcurrent = m * value; /* gtri - end - wbk - record value so it can be output if requested */ #endif } // for loop instances diff --git a/src/spicelib/devices/isrc/isrcpar.c b/src/spicelib/devices/isrc/isrcpar.c index 2ce4c2580..1a62f6814 100644 --- a/src/spicelib/devices/isrc/isrcpar.c +++ b/src/spicelib/devices/isrc/isrcpar.c @@ -45,6 +45,11 @@ ISRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->ISRCdcGiven = TRUE; break; + case ISRC_M: + here->ISRCmValue = value->rValue; + here->ISRCmGiven = TRUE; + break; + case ISRC_AC_MAG: here->ISRCacMag = value->rValue; here->ISRCacMGiven = TRUE; diff --git a/src/spicelib/devices/isrc/isrctemp.c b/src/spicelib/devices/isrc/isrctemp.c index 0bae229ec..dbbf9de26 100644 --- a/src/spicelib/devices/isrc/isrctemp.c +++ b/src/spicelib/devices/isrc/isrctemp.c @@ -47,6 +47,8 @@ ISRCtemp(GENmodel *inModel, CKTcircuit *ckt) &(here->ISRCname)); } } + if(!here->ISRCmGiven) + here->ISRCmValue = 1; radians = here->ISRCacPhase * M_PI / 180.0; here->ISRCacReal = here->ISRCacMag * cos(radians); here->ISRCacImag = here->ISRCacMag * sin(radians); From cc5cdc1293f6379be563c4aaf497c88ce3b1f67d Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 15 May 2013 21:04:12 +0200 Subject: [PATCH 068/257] whitespaces --- src/spicelib/devices/bsim3v32/b3v32.c | 106 +- src/spicelib/devices/bsim3v32/b3v32acld.c | 388 +-- src/spicelib/devices/bsim3v32/b3v32ask.c | 114 +- src/spicelib/devices/bsim3v32/b3v32check.c | 738 ++--- src/spicelib/devices/bsim3v32/b3v32cvtest.c | 80 +- src/spicelib/devices/bsim3v32/b3v32del.c | 8 +- src/spicelib/devices/bsim3v32/b3v32dest.c | 2 +- src/spicelib/devices/bsim3v32/b3v32getic.c | 22 +- src/spicelib/devices/bsim3v32/b3v32ld.c | 3066 +++++++++--------- src/spicelib/devices/bsim3v32/b3v32mask.c | 456 +-- src/spicelib/devices/bsim3v32/b3v32mdel.c | 9 +- src/spicelib/devices/bsim3v32/b3v32mpar.c | 228 +- src/spicelib/devices/bsim3v32/b3v32noi.c | 542 ++-- src/spicelib/devices/bsim3v32/b3v32par.c | 2 +- src/spicelib/devices/bsim3v32/b3v32pzld.c | 210 +- src/spicelib/devices/bsim3v32/b3v32temp.c | 1716 +++++----- src/spicelib/devices/bsim3v32/b3v32trunc.c | 8 +- src/spicelib/devices/bsim3v32/bsim3v32def.h | 660 ++-- src/spicelib/devices/bsim3v32/bsim3v32ext.h | 2 +- src/spicelib/devices/bsim3v32/bsim3v32init.c | 4 +- 20 files changed, 4180 insertions(+), 4181 deletions(-) diff --git a/src/spicelib/devices/bsim3v32/b3v32.c b/src/spicelib/devices/bsim3v32/b3v32.c index 2ab53bf2e..58898654e 100644 --- a/src/spicelib/devices/bsim3v32/b3v32.c +++ b/src/spicelib/devices/bsim3v32/b3v32.c @@ -73,15 +73,15 @@ IOP( "tox", BSIM3v32_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), IOP( "toxm", BSIM3v32_MOD_TOXM, IF_REAL, "Gate oxide thickness used in extraction"), IOP( "cdsc", BSIM3v32_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM3v32_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM3v32_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), +IOP( "cdscb", BSIM3v32_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), +IOP( "cdscd", BSIM3v32_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), IOP( "cit", BSIM3v32_MOD_CIT, IF_REAL, "Interface state capacitance"), IOP( "nfactor", BSIM3v32_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), IOP( "xj", BSIM3v32_MOD_XJ, IF_REAL, "Junction depth in meters"), IOP( "vsat", BSIM3v32_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), IOP( "at", BSIM3v32_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM3v32_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM3v32_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), +IOP( "a0", BSIM3v32_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), +IOP( "ags", BSIM3v32_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), IOP( "a1", BSIM3v32_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), IOP( "a2", BSIM3v32_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), IOP( "keta", BSIM3v32_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), @@ -130,21 +130,21 @@ IOP( "xpart", BSIM3v32_MOD_XPART, IF_REAL, "Channel charge partitioning"), IOP( "elm", BSIM3v32_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), IOP( "delta", BSIM3v32_MOD_DELTA, IF_REAL, "Effective Vds parameter"), IOP( "rsh", BSIM3v32_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM3v32_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), +IOP( "rdsw", BSIM3v32_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "prwg", BSIM3v32_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM3v32_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), +IOP( "prwg", BSIM3v32_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), +IOP( "prwb", BSIM3v32_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), -IOP( "prt", BSIM3v32_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), +IOP( "prt", BSIM3v32_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), IOP( "eta0", BSIM3v32_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), IOP( "etab", BSIM3v32_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), IOP( "pclm", BSIM3v32_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM3v32_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM3v32_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM3v32_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "pscbe1", BSIM3v32_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM3v32_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM3v32_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), +IOP( "pdiblc1", BSIM3v32_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblc2", BSIM3v32_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblcb", BSIM3v32_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), +IOP( "pscbe1", BSIM3v32_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pscbe2", BSIM3v32_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pvag", BSIM3v32_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), IOP( "js", BSIM3v32_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), IOP( "jsw", BSIM3v32_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), IOP( "pb", BSIM3v32_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), @@ -234,8 +234,8 @@ IOP( "lnfactor", BSIM3v32_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor") IOP( "lxj", BSIM3v32_MOD_LXJ, IF_REAL, "Length dependence of xj"), IOP( "lvsat", BSIM3v32_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), IOP( "lat", BSIM3v32_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM3v32_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM3v32_MOD_LAGS, IF_REAL, "Length dependence of ags"), +IOP( "la0", BSIM3v32_MOD_LA0, IF_REAL, "Length dependence of a0"), +IOP( "lags", BSIM3v32_MOD_LAGS, IF_REAL, "Length dependence of ags"), IOP( "la1", BSIM3v32_MOD_LA1, IF_REAL, "Length dependence of a1"), IOP( "la2", BSIM3v32_MOD_LA2, IF_REAL, "Length dependence of a2"), IOP( "lketa", BSIM3v32_MOD_LKETA, IF_REAL, "Length dependence of keta"), @@ -277,21 +277,21 @@ IOP( "lute", BSIM3v32_MOD_LUTE, IF_REAL, "Length dependence of ute"), IOP( "lvoff", BSIM3v32_MOD_LVOFF, IF_REAL, "Length dependence of voff"), IOP( "lelm", BSIM3v32_MOD_LELM, IF_REAL, "Length dependence of elm"), IOP( "ldelta", BSIM3v32_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM3v32_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), +IOP( "lrdsw", BSIM3v32_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lprwg", BSIM3v32_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM3v32_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), +IOP( "lprwg", BSIM3v32_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), +IOP( "lprwb", BSIM3v32_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), -IOP( "lprt", BSIM3v32_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM3v32_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM3v32_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM3v32_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM3v32_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM3v32_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM3v32_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpscbe1", BSIM3v32_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM3v32_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM3v32_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), +IOP( "lprt", BSIM3v32_MOD_LPRT, IF_REAL, "Length dependence of prt "), +IOP( "leta0", BSIM3v32_MOD_LETA0, IF_REAL, "Length dependence of eta0"), +IOP( "letab", BSIM3v32_MOD_LETAB, IF_REAL, "Length dependence of etab"), +IOP( "lpclm", BSIM3v32_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), +IOP( "lpdiblc1", BSIM3v32_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), +IOP( "lpdiblc2", BSIM3v32_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), +IOP( "lpdiblcb", BSIM3v32_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), +IOP( "lpscbe1", BSIM3v32_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), +IOP( "lpscbe2", BSIM3v32_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), +IOP( "lpvag", BSIM3v32_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), IOP( "lwr", BSIM3v32_MOD_LWR, IF_REAL, "Length dependence of wr"), IOP( "ldwg", BSIM3v32_MOD_LDWG, IF_REAL, "Length dependence of dwg"), IOP( "ldwb", BSIM3v32_MOD_LDWB, IF_REAL, "Length dependence of dwb"), @@ -313,15 +313,15 @@ IOP( "lmoin", BSIM3v32_MOD_LMOIN, IF_REAL, "Length dependence of moin"), IOP( "lnoff", BSIM3v32_MOD_LNOFF, IF_REAL, "Length dependence of noff"), IOP( "lvoffcv", BSIM3v32_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), IOP( "wcdsc", BSIM3v32_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM3v32_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM3v32_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), +IOP( "wcdscb", BSIM3v32_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), +IOP( "wcdscd", BSIM3v32_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), IOP( "wcit", BSIM3v32_MOD_WCIT, IF_REAL, "Width dependence of cit"), IOP( "wnfactor", BSIM3v32_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), IOP( "wxj", BSIM3v32_MOD_WXJ, IF_REAL, "Width dependence of xj"), IOP( "wvsat", BSIM3v32_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), IOP( "wat", BSIM3v32_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM3v32_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM3v32_MOD_WAGS, IF_REAL, "Width dependence of ags"), +IOP( "wa0", BSIM3v32_MOD_WA0, IF_REAL, "Width dependence of a0"), +IOP( "wags", BSIM3v32_MOD_WAGS, IF_REAL, "Width dependence of ags"), IOP( "wa1", BSIM3v32_MOD_WA1, IF_REAL, "Width dependence of a1"), IOP( "wa2", BSIM3v32_MOD_WA2, IF_REAL, "Width dependence of a2"), IOP( "wketa", BSIM3v32_MOD_WKETA, IF_REAL, "Width dependence of keta"), @@ -369,15 +369,15 @@ IOP( "wprwg", BSIM3v32_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), IOP( "wprwb", BSIM3v32_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), IOP( "wprt", BSIM3v32_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM3v32_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM3v32_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM3v32_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM3v32_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM3v32_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM3v32_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpscbe1", BSIM3v32_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM3v32_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM3v32_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), +IOP( "weta0", BSIM3v32_MOD_WETA0, IF_REAL, "Width dependence of eta0"), +IOP( "wetab", BSIM3v32_MOD_WETAB, IF_REAL, "Width dependence of etab"), +IOP( "wpclm", BSIM3v32_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), +IOP( "wpdiblc1", BSIM3v32_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), +IOP( "wpdiblc2", BSIM3v32_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), +IOP( "wpdiblcb", BSIM3v32_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), +IOP( "wpscbe1", BSIM3v32_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), +IOP( "wpscbe2", BSIM3v32_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), +IOP( "wpvag", BSIM3v32_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), IOP( "wwr", BSIM3v32_MOD_WWR, IF_REAL, "Width dependence of wr"), IOP( "wdwg", BSIM3v32_MOD_WDWG, IF_REAL, "Width dependence of dwg"), IOP( "wdwb", BSIM3v32_MOD_WDWB, IF_REAL, "Width dependence of dwb"), @@ -400,14 +400,14 @@ IOP( "wnoff", BSIM3v32_MOD_WNOFF, IF_REAL, "Width dependence of noff"), IOP( "wvoffcv", BSIM3v32_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), IOP( "pcdsc", BSIM3v32_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM3v32_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), +IOP( "pcdscb", BSIM3v32_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), IOP( "pcdscd", BSIM3v32_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), IOP( "pcit", BSIM3v32_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), IOP( "pnfactor", BSIM3v32_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), IOP( "pxj", BSIM3v32_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), IOP( "pvsat", BSIM3v32_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), IOP( "pat", BSIM3v32_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM3v32_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), +IOP( "pa0", BSIM3v32_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), IOP( "pags", BSIM3v32_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), IOP( "pa1", BSIM3v32_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), IOP( "pa2", BSIM3v32_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), @@ -450,10 +450,10 @@ IOP( "pute", BSIM3v32_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), IOP( "pvoff", BSIM3v32_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), IOP( "pelm", BSIM3v32_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), IOP( "pdelta", BSIM3v32_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM3v32_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), +IOP( "prdsw", BSIM3v32_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "pprwg", BSIM3v32_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM3v32_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), +IOP( "pprwg", BSIM3v32_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), +IOP( "pprwb", BSIM3v32_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), IOP( "pprt", BSIM3v32_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), IOP( "peta0", BSIM3v32_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), @@ -464,7 +464,7 @@ IOP( "ppdiblc2", BSIM3v32_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc IOP( "ppdiblcb", BSIM3v32_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), IOP( "ppscbe1", BSIM3v32_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), IOP( "ppscbe2", BSIM3v32_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM3v32_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), +IOP( "ppvag", BSIM3v32_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), IOP( "pwr", BSIM3v32_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), IOP( "pdwg", BSIM3v32_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), IOP( "pdwb", BSIM3v32_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), @@ -506,11 +506,11 @@ char *BSIM3v32names[] = { "Charge" }; -int BSIM3v32nSize = NUMELEMS(BSIM3v32names); -int BSIM3v32pTSize = NUMELEMS(BSIM3v32pTable); -int BSIM3v32mPTSize = NUMELEMS(BSIM3v32mPTable); -int BSIM3v32iSize = sizeof(BSIM3v32instance); -int BSIM3v32mSize = sizeof(BSIM3v32model); +int BSIM3v32nSize = NUMELEMS(BSIM3v32names); +int BSIM3v32pTSize = NUMELEMS(BSIM3v32pTable); +int BSIM3v32mPTSize = NUMELEMS(BSIM3v32mPTable); +int BSIM3v32iSize = sizeof(BSIM3v32instance); +int BSIM3v32mSize = sizeof(BSIM3v32model); diff --git a/src/spicelib/devices/bsim3v32/b3v32acld.c b/src/spicelib/devices/bsim3v32/b3v32acld.c index 28992b5f3..e7870a4e5 100644 --- a/src/spicelib/devices/bsim3v32/b3v32acld.c +++ b/src/spicelib/devices/bsim3v32/b3v32acld.c @@ -36,12 +36,12 @@ double ScalingFactor = 1.0e-9; double m; omega = ckt->CKTomega; - for (; model != NULL; model = model->BSIM3v32nextModel) + for (; model != NULL; model = model->BSIM3v32nextModel) { for (here = model->BSIM3v32instances; here!= NULL; - here = here->BSIM3v32nextInstance) - { - if (here->BSIM3v32mode >= 0) - { Gm = here->BSIM3v32gm; + here = here->BSIM3v32nextInstance) + { + if (here->BSIM3v32mode >= 0) + { Gm = here->BSIM3v32gm; Gmbs = here->BSIM3v32gmbs; FwdSum = Gm + Gmbs; RevSum = 0.0; @@ -59,7 +59,7 @@ double m; gbspb = 0.0; gbspsp = 0.0; - if (here->BSIM3v32nqsMod == 0) + if (here->BSIM3v32nqsMod == 0) { cggb = here->BSIM3v32cggb; cgsb = here->BSIM3v32cgsb; cgdb = here->BSIM3v32cgdb; @@ -73,70 +73,70 @@ double m; cddb = here->BSIM3v32cddb; xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; + sxpart = 0.6; dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } else { cggb = cgdb = cgsb = 0.0; cbgb = cbdb = cbsb = 0.0; cdgb = cddb = cdsb = 0.0; - xgtg = here->BSIM3v32gtg; + xgtg = here->BSIM3v32gtg; xgtd = here->BSIM3v32gtd; xgts = here->BSIM3v32gts; - xgtb = here->BSIM3v32gtb; - + xgtb = here->BSIM3v32gtb; + xcqgb = here->BSIM3v32cqgb * omega; xcqdb = here->BSIM3v32cqdb * omega; xcqsb = here->BSIM3v32cqsb * omega; xcqbb = here->BSIM3v32cqbb * omega; - CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV + CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV * here->pParam->BSIM3v32leffCV; - qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM3v32qdrn / qcheq; - Cdd = here->BSIM3v32cddb; - Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3v32cdgb; - Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3v32xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM3v32xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = here->BSIM3v32qdrn / qcheq; + Cdd = here->BSIM3v32cddb; + Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb + + here->BSIM3v32cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM3v32cdgb; + Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb + + here->BSIM3v32cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - Cds = here->BSIM3v32cdsb; - Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + Cds = here->BSIM3v32cdsb; + Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb + + here->BSIM3v32cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); } - } + } else { Gm = -here->BSIM3v32gm; Gmbs = -here->BSIM3v32gmbs; @@ -156,7 +156,7 @@ double m; gbspb = here->BSIM3v32gbbs; gbspdp = -(gbspg + gbspsp + gbspb); - if (here->BSIM3v32nqsMod == 0) + if (here->BSIM3v32nqsMod == 0) { cggb = here->BSIM3v32cggb; cgsb = here->BSIM3v32cgdb; cgdb = here->BSIM3v32cgsb; @@ -170,19 +170,19 @@ double m; cddb = -(here->BSIM3v32cdsb + cgdb + cbdb); xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; + sxpart = 0.4; dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; } else { cggb = cgdb = cgsb = 0.0; cbgb = cbdb = cbsb = 0.0; cdgb = cddb = cdsb = 0.0; - xgtg = here->BSIM3v32gtg; + xgtg = here->BSIM3v32gtg; xgtd = here->BSIM3v32gts; xgts = here->BSIM3v32gtd; xgtb = here->BSIM3v32gtb; @@ -192,50 +192,50 @@ double m; xcqsb = here->BSIM3v32cqdb * omega; xcqbb = here->BSIM3v32cqbb * omega; - CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV + CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV * here->pParam->BSIM3v32leffCV; - qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM3v32qdrn / qcheq; - Css = here->BSIM3v32cddb; - Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3v32cdgb; - Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3v32xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM3v32xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = here->BSIM3v32qdrn / qcheq; + Css = here->BSIM3v32cddb; + Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb + + here->BSIM3v32cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM3v32cdgb; + Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb + + here->BSIM3v32cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - Csd = here->BSIM3v32cdsb; - Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + Csd = here->BSIM3v32cdsb; + Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb + + here->BSIM3v32cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); } } - T1 = *(ckt->CKTstate0 + here->BSIM3v32qdef) * here->BSIM3v32gtau; + T1 = *(ckt->CKTstate0 + here->BSIM3v32qdef) * here->BSIM3v32gtau; gdpr = here->BSIM3v32drainConductance; gspr = here->BSIM3v32sourceConductance; gds = here->BSIM3v32gds; @@ -244,9 +244,9 @@ double m; capbd = here->BSIM3v32capbd; capbs = here->BSIM3v32capbs; - GSoverlapCap = here->BSIM3v32cgso; - GDoverlapCap = here->BSIM3v32cgdo; - GBoverlapCap = here->pParam->BSIM3v32cgbo; + GSoverlapCap = here->BSIM3v32cgso; + GDoverlapCap = here->BSIM3v32cgdo; + GBoverlapCap = here->pParam->BSIM3v32cgbo; xcdgb = (cdgb - GDoverlapCap) * omega; xcddb = (cddb + capbd + GDoverlapCap) * omega; @@ -255,106 +255,106 @@ double m; xcsdb = -(cgdb + cbdb + cddb) * omega; xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) - * omega; + * omega; xcgdb = (cgdb - GDoverlapCap ) * omega; xcgsb = (cgsb - GSoverlapCap) * omega; xcbgb = (cbgb - GBoverlapCap) * omega; xcbdb = (cbdb - capbd ) * omega; xcbsb = (cbsb - capbs ) * omega; - m = here->BSIM3v32m; + m = here->BSIM3v32m; - *(here->BSIM3v32GgPtr + 1) += m * xcggb; - *(here->BSIM3v32BbPtr + 1) -= - m * (xcbgb + xcbdb + xcbsb); - *(here->BSIM3v32DPdpPtr + 1) += m * xcddb; - *(here->BSIM3v32SPspPtr + 1) += m * xcssb; - *(here->BSIM3v32GbPtr + 1) -= - m * (xcggb + xcgdb + xcgsb); - *(here->BSIM3v32GdpPtr + 1) += m * xcgdb; - *(here->BSIM3v32GspPtr + 1) += m * xcgsb; - *(here->BSIM3v32BgPtr + 1) += m * xcbgb; - *(here->BSIM3v32BdpPtr + 1) += m * xcbdb; - *(here->BSIM3v32BspPtr + 1) += m * xcbsb; - *(here->BSIM3v32DPgPtr + 1) += m * xcdgb; - *(here->BSIM3v32DPbPtr + 1) -= - m * (xcdgb + xcddb + xcdsb); - *(here->BSIM3v32DPspPtr + 1) += m * xcdsb; - *(here->BSIM3v32SPgPtr + 1) += m * xcsgb; - *(here->BSIM3v32SPbPtr + 1) -= - m * (xcsgb + xcsdb + xcssb); - *(here->BSIM3v32SPdpPtr + 1) += m * xcsdb; - - *(here->BSIM3v32DdPtr) += m * gdpr; - *(here->BSIM3v32SsPtr) += m * gspr; - *(here->BSIM3v32BbPtr) += - m * (gbd + gbs - here->BSIM3v32gbbs); - *(here->BSIM3v32DPdpPtr) += - m * (gdpr + gds + gbd + RevSum + - dxpart * xgtd + T1 * ddxpart_dVd + - gbdpdp); - *(here->BSIM3v32SPspPtr) += - m * (gspr + gds + gbs + FwdSum + - sxpart * xgts + T1 * dsxpart_dVs + - gbspsp); - - *(here->BSIM3v32DdpPtr) -= m * gdpr; - *(here->BSIM3v32SspPtr) -= m * gspr; - - *(here->BSIM3v32BgPtr) -= m * here->BSIM3v32gbgs; - *(here->BSIM3v32BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3v32BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3v32DPdPtr) -= m * gdpr; - *(here->BSIM3v32DPgPtr) += - m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg + - gbdpg); - *(here->BSIM3v32DPbPtr) -= - m * (gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb); - *(here->BSIM3v32DPspPtr) -= - m * (gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp); - - *(here->BSIM3v32SPgPtr) -= - m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - - gbspg); - *(here->BSIM3v32SPsPtr) -= m * gspr; - *(here->BSIM3v32SPbPtr) -= - m * (gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb); - *(here->BSIM3v32SPdpPtr) -= - m * (gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp); - - *(here->BSIM3v32GgPtr) -= m * xgtg; - *(here->BSIM3v32GbPtr) -= m * xgtb; - *(here->BSIM3v32GdpPtr) -= m * xgtd; - *(here->BSIM3v32GspPtr) -= m * xgts; - - if (here->BSIM3v32nqsMod) - { - *(here->BSIM3v32QqPtr + 1) += - m * omega * ScalingFactor; - *(here->BSIM3v32QgPtr + 1) -= m * xcqgb; - *(here->BSIM3v32QdpPtr + 1) -= m * xcqdb; - *(here->BSIM3v32QspPtr + 1) -= m * xcqsb; - *(here->BSIM3v32QbPtr + 1) -= m * xcqbb; - - *(here->BSIM3v32QqPtr) += m * here->BSIM3v32gtau; - - *(here->BSIM3v32DPqPtr) += - m * (dxpart * here->BSIM3v32gtau); - *(here->BSIM3v32SPqPtr) += - m * (sxpart * here->BSIM3v32gtau); - *(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau; - - *(here->BSIM3v32QgPtr) += m * xgtg; - *(here->BSIM3v32QdpPtr) += m * xgtd; - *(here->BSIM3v32QspPtr) += m * xgts; - *(here->BSIM3v32QbPtr) += m * xgtb; - } - } + *(here->BSIM3v32GgPtr + 1) += m * xcggb; + *(here->BSIM3v32BbPtr + 1) -= + m * (xcbgb + xcbdb + xcbsb); + *(here->BSIM3v32DPdpPtr + 1) += m * xcddb; + *(here->BSIM3v32SPspPtr + 1) += m * xcssb; + *(here->BSIM3v32GbPtr + 1) -= + m * (xcggb + xcgdb + xcgsb); + *(here->BSIM3v32GdpPtr + 1) += m * xcgdb; + *(here->BSIM3v32GspPtr + 1) += m * xcgsb; + *(here->BSIM3v32BgPtr + 1) += m * xcbgb; + *(here->BSIM3v32BdpPtr + 1) += m * xcbdb; + *(here->BSIM3v32BspPtr + 1) += m * xcbsb; + *(here->BSIM3v32DPgPtr + 1) += m * xcdgb; + *(here->BSIM3v32DPbPtr + 1) -= + m * (xcdgb + xcddb + xcdsb); + *(here->BSIM3v32DPspPtr + 1) += m * xcdsb; + *(here->BSIM3v32SPgPtr + 1) += m * xcsgb; + *(here->BSIM3v32SPbPtr + 1) -= + m * (xcsgb + xcsdb + xcssb); + *(here->BSIM3v32SPdpPtr + 1) += m * xcsdb; + + *(here->BSIM3v32DdPtr) += m * gdpr; + *(here->BSIM3v32SsPtr) += m * gspr; + *(here->BSIM3v32BbPtr) += + m * (gbd + gbs - here->BSIM3v32gbbs); + *(here->BSIM3v32DPdpPtr) += + m * (gdpr + gds + gbd + RevSum + + dxpart * xgtd + T1 * ddxpart_dVd + + gbdpdp); + *(here->BSIM3v32SPspPtr) += + m * (gspr + gds + gbs + FwdSum + + sxpart * xgts + T1 * dsxpart_dVs + + gbspsp); + + *(here->BSIM3v32DdpPtr) -= m * gdpr; + *(here->BSIM3v32SspPtr) -= m * gspr; + + *(here->BSIM3v32BgPtr) -= m * here->BSIM3v32gbgs; + *(here->BSIM3v32BdpPtr) -= m * (gbd - gbbdp); + *(here->BSIM3v32BspPtr) -= m * (gbs - gbbsp); + + *(here->BSIM3v32DPdPtr) -= m * gdpr; + *(here->BSIM3v32DPgPtr) += + m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg + + gbdpg); + *(here->BSIM3v32DPbPtr) -= + m * (gbd - Gmbs - dxpart * xgtb - + T1 * ddxpart_dVb - gbdpb); + *(here->BSIM3v32DPspPtr) -= + m * (gds + FwdSum - dxpart * xgts - + T1 * ddxpart_dVs - gbdpsp); + + *(here->BSIM3v32SPgPtr) -= + m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - + gbspg); + *(here->BSIM3v32SPsPtr) -= m * gspr; + *(here->BSIM3v32SPbPtr) -= + m * (gbs + Gmbs - sxpart * xgtb - + T1 * dsxpart_dVb - gbspb); + *(here->BSIM3v32SPdpPtr) -= + m * (gds + RevSum - sxpart * xgtd - + T1 * dsxpart_dVd - gbspdp); + + *(here->BSIM3v32GgPtr) -= m * xgtg; + *(here->BSIM3v32GbPtr) -= m * xgtb; + *(here->BSIM3v32GdpPtr) -= m * xgtd; + *(here->BSIM3v32GspPtr) -= m * xgts; + + if (here->BSIM3v32nqsMod) + { + *(here->BSIM3v32QqPtr + 1) += + m * omega * ScalingFactor; + *(here->BSIM3v32QgPtr + 1) -= m * xcqgb; + *(here->BSIM3v32QdpPtr + 1) -= m * xcqdb; + *(here->BSIM3v32QspPtr + 1) -= m * xcqsb; + *(here->BSIM3v32QbPtr + 1) -= m * xcqbb; + + *(here->BSIM3v32QqPtr) += m * here->BSIM3v32gtau; + + *(here->BSIM3v32DPqPtr) += + m * (dxpart * here->BSIM3v32gtau); + *(here->BSIM3v32SPqPtr) += + m * (sxpart * here->BSIM3v32gtau); + *(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau; + + *(here->BSIM3v32QgPtr) += m * xgtg; + *(here->BSIM3v32QdpPtr) += m * xgtd; + *(here->BSIM3v32QspPtr) += m * xgts; + *(here->BSIM3v32QbPtr) += m * xgtb; + } + } } return(OK); } diff --git a/src/spicelib/devices/bsim3v32/b3v32ask.c b/src/spicelib/devices/bsim3v32/b3v32ask.c index 27796a9a6..3eb7b1730 100644 --- a/src/spicelib/devices/bsim3v32/b3v32ask.c +++ b/src/spicelib/devices/bsim3v32/b3v32ask.c @@ -19,22 +19,22 @@ int BSIM3v32ask (CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) + IFvalue *select) { BSIM3v32instance *here = (BSIM3v32instance*)inst; NG_IGNORE(select); - switch(which) + switch(which) { case BSIM3v32_L: value->rValue = here->BSIM3v32l; return(OK); case BSIM3v32_W: value->rValue = here->BSIM3v32w; return(OK); - case BSIM3v32_M: - value->rValue = here->BSIM3v32m; - return (OK); + case BSIM3v32_M: + value->rValue = here->BSIM3v32m; + return (OK); case BSIM3v32_AS: value->rValue = here->BSIM3v32sourceArea; return(OK); @@ -94,11 +94,11 @@ BSIM3v32instance *here = (BSIM3v32instance*)inst; return(OK); case BSIM3v32_SOURCECONDUCT: value->rValue = here->BSIM3v32sourceConductance; - value->rValue *= here->BSIM3v32m; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_DRAINCONDUCT: value->rValue = here->BSIM3v32drainConductance; - value->rValue *= here->BSIM3v32m; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_VBD: value->rValue = *(ckt->CKTstate0 + here->BSIM3v32vbd); @@ -113,118 +113,118 @@ BSIM3v32instance *here = (BSIM3v32instance*)inst; value->rValue = *(ckt->CKTstate0 + here->BSIM3v32vds); return(OK); case BSIM3v32_CD: - value->rValue = here->BSIM3v32cd; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32cd; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CBS: - value->rValue = here->BSIM3v32cbs; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32cbs; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CBD: - value->rValue = here->BSIM3v32cbd; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32cbd; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_GM: - value->rValue = here->BSIM3v32gm; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32gm; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_GDS: - value->rValue = here->BSIM3v32gds; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32gds; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_GMBS: - value->rValue = here->BSIM3v32gmbs; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32gmbs; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_GBD: - value->rValue = here->BSIM3v32gbd; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32gbd; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_GBS: - value->rValue = here->BSIM3v32gbs; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32gbs; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qb); - value->rValue *= here->BSIM3v32m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qb); + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqb); - value->rValue *= here->BSIM3v32m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqb); + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qg); - value->rValue *= here->BSIM3v32m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qg); + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqg); - value->rValue *= here->BSIM3v32m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqg); + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qd); - value->rValue *= here->BSIM3v32m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qd); + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqd); - value->rValue *= here->BSIM3v32m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3v32cqd); + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CGG: - value->rValue = here->BSIM3v32cggb; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32cggb; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CGD: value->rValue = here->BSIM3v32cgdb; - value->rValue *= here->BSIM3v32m; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CGS: value->rValue = here->BSIM3v32cgsb; - value->rValue *= here->BSIM3v32m; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CDG: - value->rValue = here->BSIM3v32cdgb; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32cdgb; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CDD: - value->rValue = here->BSIM3v32cddb; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32cddb; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CDS: - value->rValue = here->BSIM3v32cdsb; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32cdsb; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CBG: value->rValue = here->BSIM3v32cbgb; - value->rValue *= here->BSIM3v32m; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CBDB: value->rValue = here->BSIM3v32cbdb; - value->rValue *= here->BSIM3v32m; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CBSB: value->rValue = here->BSIM3v32cbsb; - value->rValue *= here->BSIM3v32m; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CAPBD: - value->rValue = here->BSIM3v32capbd; - value->rValue *= here->BSIM3v32m; + value->rValue = here->BSIM3v32capbd; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_CAPBS: value->rValue = here->BSIM3v32capbs; - value->rValue *= here->BSIM3v32m; + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_VON: - value->rValue = here->BSIM3v32von; + value->rValue = here->BSIM3v32von; return(OK); case BSIM3v32_VDSAT: - value->rValue = here->BSIM3v32vdsat; + value->rValue = here->BSIM3v32vdsat; return(OK); case BSIM3v32_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qbs); - value->rValue *= here->BSIM3v32m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qbs); + value->rValue *= here->BSIM3v32m; return(OK); case BSIM3v32_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qbd); - value->rValue *= here->BSIM3v32m; + value->rValue = *(ckt->CKTstate0 + here->BSIM3v32qbd); + value->rValue *= here->BSIM3v32m; return(OK); default: return(E_BADPARM); diff --git a/src/spicelib/devices/bsim3v32/b3v32check.c b/src/spicelib/devices/bsim3v32/b3v32check.c index 2f1c7aec5..f297934dc 100644 --- a/src/spicelib/devices/bsim3v32/b3v32check.c +++ b/src/spicelib/devices/bsim3v32/b3v32check.c @@ -31,416 +31,416 @@ FILE *fplog; if ((fplog = fopen("b3v32check.log", "w")) != NULL) { pParam = here->pParam; - fprintf (fplog, - "BSIM3 Model (Supports: v3.2, v3.2.2, v3.2.3, v3.2.4)\n"); - fprintf (fplog, "Parameter Checking.\n"); - fprintf (fplog, "Model = %s\n", model->BSIM3v32modName); - fprintf (fplog, "W = %g, L = %g, M = %g\n", here->BSIM3v32w, - here->BSIM3v32l, here->BSIM3v32m); + fprintf (fplog, + "BSIM3 Model (Supports: v3.2, v3.2.2, v3.2.3, v3.2.4)\n"); + fprintf (fplog, "Parameter Checking.\n"); + fprintf (fplog, "Model = %s\n", model->BSIM3v32modName); + fprintf (fplog, "W = %g, L = %g, M = %g\n", here->BSIM3v32w, + here->BSIM3v32l, here->BSIM3v32m); - if ((strcmp(model->BSIM3v32version, "3.2.4")) && (strcmp(model->BSIM3v32version, "3.24")) - && (strcmp(model->BSIM3v32version, "3.2.3")) && (strcmp(model->BSIM3v32version, "3.23")) - && (strcmp(model->BSIM3v32version, "3.2.2")) && (strcmp(model->BSIM3v32version, "3.22")) - && (strcmp(model->BSIM3v32version, "3.2")) && (strcmp(model->BSIM3v32version, "3.20"))) - { - fprintf (fplog, - "Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n"); - fprintf (fplog, - "You specified a wrong version number. Working now with BSIM3v3.2.4.\n"); - printf ("Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n"); - printf ("You specified a wrong version number. Working now with BSIM3v3.2.4.\n"); - } + if ((strcmp(model->BSIM3v32version, "3.2.4")) && (strcmp(model->BSIM3v32version, "3.24")) + && (strcmp(model->BSIM3v32version, "3.2.3")) && (strcmp(model->BSIM3v32version, "3.23")) + && (strcmp(model->BSIM3v32version, "3.2.2")) && (strcmp(model->BSIM3v32version, "3.22")) + && (strcmp(model->BSIM3v32version, "3.2")) && (strcmp(model->BSIM3v32version, "3.20"))) + { + fprintf (fplog, + "Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n"); + fprintf (fplog, + "You specified a wrong version number. Working now with BSIM3v3.2.4.\n"); + printf ("Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n"); + printf ("You specified a wrong version number. Working now with BSIM3v3.2.4.\n"); + } - if (pParam->BSIM3v32nlx < -pParam->BSIM3v32leff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3v32nlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3v32nlx); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32nlx < -pParam->BSIM3v32leff) + { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3v32nlx); + printf("Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3v32nlx); + Fatal_Flag = 1; + } - if (model->BSIM3v32tox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->BSIM3v32tox); - printf("Fatal: Tox = %g is not positive.\n", model->BSIM3v32tox); - Fatal_Flag = 1; - } + if (model->BSIM3v32tox <= 0.0) + { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", + model->BSIM3v32tox); + printf("Fatal: Tox = %g is not positive.\n", model->BSIM3v32tox); + Fatal_Flag = 1; + } - if (model->BSIM3v32toxm <= 0.0) - { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", - model->BSIM3v32toxm); - printf("Fatal: Toxm = %g is not positive.\n", model->BSIM3v32toxm); - Fatal_Flag = 1; - } + if (model->BSIM3v32toxm <= 0.0) + { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", + model->BSIM3v32toxm); + printf("Fatal: Toxm = %g is not positive.\n", model->BSIM3v32toxm); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32npeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->BSIM3v32npeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3v32npeak); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32nsub <= 0.0) - { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3v32nsub); - printf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3v32nsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32ngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3v32ngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM3v32ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32ngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->BSIM3v32ngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM3v32ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32xj <= 0.0) - { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", - pParam->BSIM3v32xj); - printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3v32xj); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32npeak <= 0.0) + { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", + pParam->BSIM3v32npeak); + printf("Fatal: Nch = %g is not positive.\n", + pParam->BSIM3v32npeak); + Fatal_Flag = 1; + } + if (pParam->BSIM3v32nsub <= 0.0) + { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3v32nsub); + printf("Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3v32nsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3v32ngate < 0.0) + { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", + pParam->BSIM3v32ngate); + printf("Fatal: Ngate = %g Ngate is not positive.\n", + pParam->BSIM3v32ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3v32ngate > 1.e25) + { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", + pParam->BSIM3v32ngate); + printf("Fatal: Ngate = %g Ngate is too high\n", + pParam->BSIM3v32ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3v32xj <= 0.0) + { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", + pParam->BSIM3v32xj); + printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3v32xj); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32dvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3v32dvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3v32dvt1); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32dvt1 < 0.0) + { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->BSIM3v32dvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3v32dvt1); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32dvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3v32dvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3v32dvt1w); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32dvt1w < 0.0) + { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->BSIM3v32dvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3v32dvt1w); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32w0 == -pParam->BSIM3v32weff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32w0 == -pParam->BSIM3v32weff) + { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32dsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32b1 == -pParam->BSIM3v32weff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->BSIM3v32u0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3v32u0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->BSIM3v32u0temp); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32dsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3v32dsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3v32b1 == -pParam->BSIM3v32weff) + { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } + if (pParam->BSIM3v32u0temp <= 0.0) + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3v32u0temp); + printf("Fatal: u0 at current temperature = %g is not positive.\n", + pParam->BSIM3v32u0temp); + Fatal_Flag = 1; + } /* Check delta parameter */ - if (pParam->BSIM3v32delta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3v32delta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3v32delta); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32delta < 0.0) + { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", + pParam->BSIM3v32delta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3v32delta); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32vsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3v32vsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->BSIM3v32vsattemp); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32vsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3v32vsattemp); + printf("Fatal: Vsat at current temperature = %g is not positive.\n", + pParam->BSIM3v32vsattemp); + Fatal_Flag = 1; + } /* Check Rout parameters */ - if (pParam->BSIM3v32pclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32pclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v32pclm); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32drout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout); - printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32drout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout); + printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3v32drout); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32pscbe2 <= 0.0) - { fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n", - pParam->BSIM3v32pscbe2); - printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3v32pscbe2); - } + if (pParam->BSIM3v32pscbe2 <= 0.0) + { fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n", + pParam->BSIM3v32pscbe2); + printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3v32pscbe2); + } - /* acm model */ - if (model->BSIM3v32acmMod == 0) { - if (model->BSIM3v32unitLengthSidewallJctCap > 0.0 || - model->BSIM3v32unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->BSIM3v32drainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->BSIM3v32drainPerimeter); - } - if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->BSIM3v32sourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->BSIM3v32sourcePerimeter); - } - } - } + /* acm model */ + if (model->BSIM3v32acmMod == 0) { + if (model->BSIM3v32unitLengthSidewallJctCap > 0.0 || + model->BSIM3v32unitLengthGateSidewallJctCap > 0.0) + { + if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff) + { fprintf(fplog, "Warning: Pd = %g is less than W.\n", + here->BSIM3v32drainPerimeter); + printf("Warning: Pd = %g is less than W.\n", + here->BSIM3v32drainPerimeter); + } + if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff) + { fprintf(fplog, "Warning: Ps = %g is less than W.\n", + here->BSIM3v32sourcePerimeter); + printf("Warning: Ps = %g is less than W.\n", + here->BSIM3v32sourcePerimeter); + } + } + } - if (pParam->BSIM3v32noff < 0.1) - { fprintf(fplog, "Warning: Noff = %g is too small.\n", - pParam->BSIM3v32noff); - printf("Warning: Noff = %g is too small.\n", pParam->BSIM3v32noff); - } - if (pParam->BSIM3v32noff > 4.0) - { fprintf(fplog, "Warning: Noff = %g is too large.\n", - pParam->BSIM3v32noff); - printf("Warning: Noff = %g is too large.\n", pParam->BSIM3v32noff); - } + if (pParam->BSIM3v32noff < 0.1) + { fprintf(fplog, "Warning: Noff = %g is too small.\n", + pParam->BSIM3v32noff); + printf("Warning: Noff = %g is too small.\n", pParam->BSIM3v32noff); + } + if (pParam->BSIM3v32noff > 4.0) + { fprintf(fplog, "Warning: Noff = %g is too large.\n", + pParam->BSIM3v32noff); + printf("Warning: Noff = %g is too large.\n", pParam->BSIM3v32noff); + } - if (pParam->BSIM3v32voffcv < -0.5) - { fprintf(fplog, "Warning: Voffcv = %g is too small.\n", - pParam->BSIM3v32voffcv); - printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM3v32voffcv); - } - if (pParam->BSIM3v32voffcv > 0.5) - { fprintf(fplog, "Warning: Voffcv = %g is too large.\n", - pParam->BSIM3v32voffcv); - printf("Warning: Voffcv = %g is too large.\n", pParam->BSIM3v32voffcv); - } + if (pParam->BSIM3v32voffcv < -0.5) + { fprintf(fplog, "Warning: Voffcv = %g is too small.\n", + pParam->BSIM3v32voffcv); + printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM3v32voffcv); + } + if (pParam->BSIM3v32voffcv > 0.5) + { fprintf(fplog, "Warning: Voffcv = %g is too large.\n", + pParam->BSIM3v32voffcv); + printf("Warning: Voffcv = %g is too large.\n", pParam->BSIM3v32voffcv); + } - if (model->BSIM3v32ijth < 0.0) - { fprintf(fplog, "Fatal: Ijth = %g cannot be negative.\n", - model->BSIM3v32ijth); - printf("Fatal: Ijth = %g cannot be negative.\n", model->BSIM3v32ijth); - Fatal_Flag = 1; - } + if (model->BSIM3v32ijth < 0.0) + { fprintf(fplog, "Fatal: Ijth = %g cannot be negative.\n", + model->BSIM3v32ijth); + printf("Fatal: Ijth = %g cannot be negative.\n", model->BSIM3v32ijth); + Fatal_Flag = 1; + } /* Check capacitance parameters */ - if (pParam->BSIM3v32clc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc); - printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc); - Fatal_Flag = 1; - } + if (pParam->BSIM3v32clc < 0.0) + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc); + printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3v32clc); + Fatal_Flag = 1; + } - if (pParam->BSIM3v32moin < 5.0) - { fprintf(fplog, "Warning: Moin = %g is too small.\n", - pParam->BSIM3v32moin); - printf("Warning: Moin = %g is too small.\n", pParam->BSIM3v32moin); - } - if (pParam->BSIM3v32moin > 25.0) - { fprintf(fplog, "Warning: Moin = %g is too large.\n", - pParam->BSIM3v32moin); - printf("Warning: Moin = %g is too large.\n", pParam->BSIM3v32moin); - } + if (pParam->BSIM3v32moin < 5.0) + { fprintf(fplog, "Warning: Moin = %g is too small.\n", + pParam->BSIM3v32moin); + printf("Warning: Moin = %g is too small.\n", pParam->BSIM3v32moin); + } + if (pParam->BSIM3v32moin > 25.0) + { fprintf(fplog, "Warning: Moin = %g is too large.\n", + pParam->BSIM3v32moin); + printf("Warning: Moin = %g is too large.\n", pParam->BSIM3v32moin); + } - if(model->BSIM3v32capMod ==3) { - if (pParam->BSIM3v32acde < 0.4) - { fprintf(fplog, "Warning: Acde = %g is too small.\n", - pParam->BSIM3v32acde); - printf("Warning: Acde = %g is too small.\n", pParam->BSIM3v32acde); - } - if (pParam->BSIM3v32acde > 1.6) - { fprintf(fplog, "Warning: Acde = %g is too large.\n", - pParam->BSIM3v32acde); - printf("Warning: Acde = %g is too large.\n", pParam->BSIM3v32acde); - } - } + if(model->BSIM3v32capMod ==3) { + if (pParam->BSIM3v32acde < 0.4) + { fprintf(fplog, "Warning: Acde = %g is too small.\n", + pParam->BSIM3v32acde); + printf("Warning: Acde = %g is too small.\n", pParam->BSIM3v32acde); + } + if (pParam->BSIM3v32acde > 1.6) + { fprintf(fplog, "Warning: Acde = %g is too large.\n", + pParam->BSIM3v32acde); + printf("Warning: Acde = %g is too large.\n", pParam->BSIM3v32acde); + } + } - if (model->BSIM3v32paramChk ==1) - { -/* Check L and W parameters */ - if (pParam->BSIM3v32leff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->BSIM3v32leff); - printf("Warning: Leff = %g may be too small.\n", - pParam->BSIM3v32leff); - } + if (model->BSIM3v32paramChk ==1) + { + /* Check L and W parameters */ + if (pParam->BSIM3v32leff <= 5.0e-8) + { fprintf(fplog, "Warning: Leff = %g may be too small.\n", + pParam->BSIM3v32leff); + printf("Warning: Leff = %g may be too small.\n", + pParam->BSIM3v32leff); + } - if (pParam->BSIM3v32leffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3v32leffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3v32leffCV); - } + if (pParam->BSIM3v32leffCV <= 5.0e-8) + { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3v32leffCV); + printf("Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3v32leffCV); + } - if (pParam->BSIM3v32weff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->BSIM3v32weff); - printf("Warning: Weff = %g may be too small.\n", - pParam->BSIM3v32weff); - } + if (pParam->BSIM3v32weff <= 1.0e-7) + { fprintf(fplog, "Warning: Weff = %g may be too small.\n", + pParam->BSIM3v32weff); + printf("Warning: Weff = %g may be too small.\n", + pParam->BSIM3v32weff); + } - if (pParam->BSIM3v32weffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3v32weffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3v32weffCV); - } + if (pParam->BSIM3v32weffCV <= 1.0e-7) + { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3v32weffCV); + printf("Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3v32weffCV); + } -/* Check threshold voltage parameters */ - if (pParam->BSIM3v32nlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx); - printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx); - } - if (model->BSIM3v32tox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->BSIM3v32tox); - printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3v32tox); - } + /* Check threshold voltage parameters */ + if (pParam->BSIM3v32nlx < 0.0) + { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx); + printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3v32nlx); + } + if (model->BSIM3v32tox < 1.0e-9) + { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", + model->BSIM3v32tox); + printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3v32tox); + } - if (pParam->BSIM3v32npeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->BSIM3v32npeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->BSIM3v32npeak); - } - else if (pParam->BSIM3v32npeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->BSIM3v32npeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->BSIM3v32npeak); - } + if (pParam->BSIM3v32npeak <= 1.0e15) + { fprintf(fplog, "Warning: Nch = %g may be too small.\n", + pParam->BSIM3v32npeak); + printf("Warning: Nch = %g may be too small.\n", + pParam->BSIM3v32npeak); + } + else if (pParam->BSIM3v32npeak >= 1.0e21) + { fprintf(fplog, "Warning: Nch = %g may be too large.\n", + pParam->BSIM3v32npeak); + printf("Warning: Nch = %g may be too large.\n", + pParam->BSIM3v32npeak); + } - if (pParam->BSIM3v32nsub <= 1.0e14) - { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", - pParam->BSIM3v32nsub); - printf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM3v32nsub); - } - else if (pParam->BSIM3v32nsub >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->BSIM3v32nsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM3v32nsub); - } + if (pParam->BSIM3v32nsub <= 1.0e14) + { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", + pParam->BSIM3v32nsub); + printf("Warning: Nsub = %g may be too small.\n", + pParam->BSIM3v32nsub); + } + else if (pParam->BSIM3v32nsub >= 1.0e21) + { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", + pParam->BSIM3v32nsub); + printf("Warning: Nsub = %g may be too large.\n", + pParam->BSIM3v32nsub); + } - if ((pParam->BSIM3v32ngate > 0.0) && - (pParam->BSIM3v32ngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3v32ngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3v32ngate); - } + if ((pParam->BSIM3v32ngate > 0.0) && + (pParam->BSIM3v32ngate <= 1.e18)) + { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3v32ngate); + printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3v32ngate); + } - if (pParam->BSIM3v32dvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3v32dvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3v32dvt0); - } + if (pParam->BSIM3v32dvt0 < 0.0) + { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", + pParam->BSIM3v32dvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3v32dvt0); + } - if (fabs(1.0e-6 / (pParam->BSIM3v32w0 + pParam->BSIM3v32weff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); - } + if (fabs(1.0e-6 / (pParam->BSIM3v32w0 + pParam->BSIM3v32weff)) > 10.0) + { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); + printf("Warning: (W0 + Weff) may be too small.\n"); + } -/* Check subthreshold parameters */ - if (pParam->BSIM3v32nfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->BSIM3v32nfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3v32nfactor); - } - if (pParam->BSIM3v32cdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->BSIM3v32cdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3v32cdsc); - } - if (pParam->BSIM3v32cdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->BSIM3v32cdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3v32cdscd); - } -/* Check DIBL parameters */ - if (pParam->BSIM3v32eta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->BSIM3v32eta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3v32eta0); - } + /* Check subthreshold parameters */ + if (pParam->BSIM3v32nfactor < 0.0) + { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", + pParam->BSIM3v32nfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3v32nfactor); + } + if (pParam->BSIM3v32cdsc < 0.0) + { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", + pParam->BSIM3v32cdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3v32cdsc); + } + if (pParam->BSIM3v32cdscd < 0.0) + { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", + pParam->BSIM3v32cdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3v32cdscd); + } + /* Check DIBL parameters */ + if (pParam->BSIM3v32eta0 < 0.0) + { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", + pParam->BSIM3v32eta0); + printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3v32eta0); + } -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->BSIM3v32b1 + pParam->BSIM3v32weff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); - } + /* Check Abulk parameters */ + if (fabs(1.0e-6 / (pParam->BSIM3v32b1 + pParam->BSIM3v32weff)) > 10.0) + { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); + printf("Warning: (B1 + Weff) may be too small.\n"); + } -/* Check Saturation parameters */ - if (pParam->BSIM3v32a2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3v32a2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM3v32a2); - pParam->BSIM3v32a2 = 0.01; - } - else if (pParam->BSIM3v32a2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3v32a2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3v32a2); - pParam->BSIM3v32a2 = 1.0; - pParam->BSIM3v32a1 = 0.0; + /* Check Saturation parameters */ + if (pParam->BSIM3v32a2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3v32a2); + printf("Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->BSIM3v32a2); + pParam->BSIM3v32a2 = 0.01; + } + else if (pParam->BSIM3v32a2 > 1.0) + { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3v32a2); + printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3v32a2); + pParam->BSIM3v32a2 = 1.0; + pParam->BSIM3v32a1 = 0.0; - } + } - if (pParam->BSIM3v32rdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3v32rdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3v32rdsw); - pParam->BSIM3v32rdsw = 0.0; - pParam->BSIM3v32rds0 = 0.0; - } - else if ((pParam->BSIM3v32rds0 > 0.0) && (pParam->BSIM3v32rds0 < 0.001)) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3v32rds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3v32rds0); - pParam->BSIM3v32rds0 = 0.0; - } - if (pParam->BSIM3v32vsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp); - } + if (pParam->BSIM3v32rdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3v32rdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3v32rdsw); + pParam->BSIM3v32rdsw = 0.0; + pParam->BSIM3v32rds0 = 0.0; + } + else if ((pParam->BSIM3v32rds0 > 0.0) && (pParam->BSIM3v32rds0 < 0.001)) + { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->BSIM3v32rds0); + printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->BSIM3v32rds0); + pParam->BSIM3v32rds0 = 0.0; + } + if (pParam->BSIM3v32vsattemp < 1.0e3) + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v32vsattemp); + } - if (pParam->BSIM3v32pdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3v32pdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3v32pdibl1); - } - if (pParam->BSIM3v32pdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3v32pdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3v32pdibl2); - } -/* Check overlap capacitance parameters */ - if (model->BSIM3v32cgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo); - model->BSIM3v32cgdo = 0.0; - } - if (model->BSIM3v32cgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso); - model->BSIM3v32cgso = 0.0; - } - if (model->BSIM3v32cgbo < 0.0) - { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo); - printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo); - model->BSIM3v32cgbo = 0.0; - } + if (pParam->BSIM3v32pdibl1 < 0.0) + { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", + pParam->BSIM3v32pdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3v32pdibl1); + } + if (pParam->BSIM3v32pdibl2 < 0.0) + { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", + pParam->BSIM3v32pdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3v32pdibl2); + } + /* Check overlap capacitance parameters */ + if (model->BSIM3v32cgdo < 0.0) + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v32cgdo); + model->BSIM3v32cgdo = 0.0; + } + if (model->BSIM3v32cgso < 0.0) + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso); + printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v32cgso); + model->BSIM3v32cgso = 0.0; + } + if (model->BSIM3v32cgbo < 0.0) + { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo); + printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v32cgbo); + model->BSIM3v32cgbo = 0.0; + } - }/* loop for the parameter check for warning messages */ - fclose(fplog); + }/* loop for the parameter check for warning messages */ + fclose(fplog); } else { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); diff --git a/src/spicelib/devices/bsim3v32/b3v32cvtest.c b/src/spicelib/devices/bsim3v32/b3v32cvtest.c index 52c162c37..8d0f717fe 100644 --- a/src/spicelib/devices/bsim3v32/b3v32cvtest.c +++ b/src/spicelib/devices/bsim3v32/b3v32cvtest.c @@ -31,21 +31,21 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; for (; model != NULL; model = model->BSIM3v32nextModel) { /* loop through all the instances of the model */ for (here = model->BSIM3v32instances; here != NULL ; - here=here->BSIM3v32nextInstance) - { - vbs = model->BSIM3v32type - * (*(ckt->CKTrhsOld+here->BSIM3v32bNode) - - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); + here=here->BSIM3v32nextInstance) + { + vbs = model->BSIM3v32type + * (*(ckt->CKTrhsOld+here->BSIM3v32bNode) + - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); vgs = model->BSIM3v32type - * (*(ckt->CKTrhsOld+here->BSIM3v32gNode) - - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); + * (*(ckt->CKTrhsOld+here->BSIM3v32gNode) + - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); vds = model->BSIM3v32type - * (*(ckt->CKTrhsOld+here->BSIM3v32dNodePrime) - - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); + * (*(ckt->CKTrhsOld+here->BSIM3v32dNodePrime) + - *(ckt->CKTrhsOld+here->BSIM3v32sNodePrime)); vbd = vbs - vds; vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3v32vgs) - - *(ckt->CKTstate0 + here->BSIM3v32vds); + vgdo = *(ckt->CKTstate0 + here->BSIM3v32vgs) + - *(ckt->CKTstate0 + here->BSIM3v32vds); delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v32vbs); delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v32vbd); delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v32vgs); @@ -54,47 +54,47 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; cd = here->BSIM3v32cd - here->BSIM3v32cbd; if (here->BSIM3v32mode >= 0) - { cd += here->BSIM3v32csub; - cdhat = cd - here->BSIM3v32gbd * delvbd - + (here->BSIM3v32gmbs + here->BSIM3v32gbbs) * delvbs - + (here->BSIM3v32gm + here->BSIM3v32gbgs) * delvgs - + (here->BSIM3v32gds + here->BSIM3v32gbds) * delvds; + { cd += here->BSIM3v32csub; + cdhat = cd - here->BSIM3v32gbd * delvbd + + (here->BSIM3v32gmbs + here->BSIM3v32gbbs) * delvbs + + (here->BSIM3v32gm + here->BSIM3v32gbgs) * delvgs + + (here->BSIM3v32gds + here->BSIM3v32gbds) * delvds; } - else - { cdhat = cd + (here->BSIM3v32gmbs - here->BSIM3v32gbd) * delvbd - + here->BSIM3v32gm * delvgd - here->BSIM3v32gds * delvds; + else + { cdhat = cd + (here->BSIM3v32gmbs - here->BSIM3v32gbd) * delvbd + + here->BSIM3v32gm * delvgd - here->BSIM3v32gds * delvds; } /* * check convergence */ if ((here->BSIM3v32off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; + { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) + + ckt->CKTabstol; if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; + { ckt->CKTnoncon++; return(OK); - } + } cbs = here->BSIM3v32cbs; cbd = here->BSIM3v32cbd; if (here->BSIM3v32mode >= 0) - { cbhat = cbs + cbd - here->BSIM3v32csub - + here->BSIM3v32gbd * delvbd - + (here->BSIM3v32gbs - here->BSIM3v32gbbs) * delvbs - - here->BSIM3v32gbgs * delvgs - - here->BSIM3v32gbds * delvds; - } - else - { cbhat = cbs + cbd - here->BSIM3v32csub - + here->BSIM3v32gbs * delvbs - + (here->BSIM3v32gbd - here->BSIM3v32gbbs) * delvbd - - here->BSIM3v32gbgs * delvgd - + here->BSIM3v32gbds * delvds; - } - tol = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(cbs + cbd - here->BSIM3v32csub)) + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd - here->BSIM3v32csub)) > tol) - { ckt->CKTnoncon++; + { cbhat = cbs + cbd - here->BSIM3v32csub + + here->BSIM3v32gbd * delvbd + + (here->BSIM3v32gbs - here->BSIM3v32gbbs) * delvbs + - here->BSIM3v32gbgs * delvgs + - here->BSIM3v32gbds * delvds; + } + else + { cbhat = cbs + cbd - here->BSIM3v32csub + + here->BSIM3v32gbs * delvbs + + (here->BSIM3v32gbd - here->BSIM3v32gbbs) * delvbd + - here->BSIM3v32gbgs * delvgd + + here->BSIM3v32gbds * delvds; + } + tol = ckt->CKTreltol * MAX(fabs(cbhat), + fabs(cbs + cbd - here->BSIM3v32csub)) + ckt->CKTabstol; + if (fabs(cbhat - (cbs + cbd - here->BSIM3v32csub)) > tol) + { ckt->CKTnoncon++; return(OK); } } diff --git a/src/spicelib/devices/bsim3v32/b3v32del.c b/src/spicelib/devices/bsim3v32/b3v32del.c index f6b9d15b8..4b5227540 100644 --- a/src/spicelib/devices/bsim3v32/b3v32del.c +++ b/src/spicelib/devices/bsim3v32/b3v32del.c @@ -25,11 +25,11 @@ BSIM3v32model *model = (BSIM3v32model*)inModel; BSIM3v32instance **prev = NULL; BSIM3v32instance *here; - for (; model ; model = model->BSIM3v32nextModel) + for (; model ; model = model->BSIM3v32nextModel) { prev = &(model->BSIM3v32instances); - for (here = *prev; here ; here = *prev) - { if (here->BSIM3v32name == name || (fast && here==*fast)) - { *prev= here->BSIM3v32nextInstance; + for (here = *prev; here ; here = *prev) + { if (here->BSIM3v32name == name || (fast && here==*fast)) + { *prev= here->BSIM3v32nextInstance; FREE(here); return(OK); } diff --git a/src/spicelib/devices/bsim3v32/b3v32dest.c b/src/spicelib/devices/bsim3v32/b3v32dest.c index b3e05f67b..8858e547f 100644 --- a/src/spicelib/devices/bsim3v32/b3v32dest.c +++ b/src/spicelib/devices/bsim3v32/b3v32dest.c @@ -23,7 +23,7 @@ BSIM3v32destroy (GENmodel **inModel) BSIM3v32model *oldmod = NULL; for (; mod ; mod = mod->BSIM3v32nextModel) { - /** added to get rid of link list pSizeDependParamKnot **/ + /** added to get rid of link list pSizeDependParamKnot **/ struct bsim3v32SizeDependParam *pParam, *pParamOld=NULL; pParam = mod->pSizeDependParamKnot; diff --git a/src/spicelib/devices/bsim3v32/b3v32getic.c b/src/spicelib/devices/bsim3v32/b3v32getic.c index 4f7798bd8..5c7bab523 100644 --- a/src/spicelib/devices/bsim3v32/b3v32getic.c +++ b/src/spicelib/devices/bsim3v32/b3v32getic.c @@ -21,20 +21,20 @@ BSIM3v32getic (GENmodel *inModel, CKTcircuit *ckt) BSIM3v32model *model = (BSIM3v32model*)inModel; BSIM3v32instance *here; - for (; model ; model = model->BSIM3v32nextModel) + for (; model ; model = model->BSIM3v32nextModel) { for (here = model->BSIM3v32instances; here; here = here->BSIM3v32nextInstance) - { - if (!here->BSIM3v32icVBSGiven) - { here->BSIM3v32icVBS = *(ckt->CKTrhs + here->BSIM3v32bNode) - - *(ckt->CKTrhs + here->BSIM3v32sNode); + { + if (!here->BSIM3v32icVBSGiven) + { here->BSIM3v32icVBS = *(ckt->CKTrhs + here->BSIM3v32bNode) + - *(ckt->CKTrhs + here->BSIM3v32sNode); } - if (!here->BSIM3v32icVDSGiven) - { here->BSIM3v32icVDS = *(ckt->CKTrhs + here->BSIM3v32dNode) - - *(ckt->CKTrhs + here->BSIM3v32sNode); + if (!here->BSIM3v32icVDSGiven) + { here->BSIM3v32icVDS = *(ckt->CKTrhs + here->BSIM3v32dNode) + - *(ckt->CKTrhs + here->BSIM3v32sNode); } - if (!here->BSIM3v32icVGSGiven) - { here->BSIM3v32icVGS = *(ckt->CKTrhs + here->BSIM3v32gNode) - - *(ckt->CKTrhs + here->BSIM3v32sNode); + if (!here->BSIM3v32icVGSGiven) + { here->BSIM3v32icVGS = *(ckt->CKTrhs + here->BSIM3v32gNode) + - *(ckt->CKTrhs + here->BSIM3v32sNode); } } } diff --git a/src/spicelib/devices/bsim3v32/b3v32ld.c b/src/spicelib/devices/bsim3v32/b3v32ld.c index 650a0c499..69b212937 100644 --- a/src/spicelib/devices/bsim3v32/b3v32ld.c +++ b/src/spicelib/devices/bsim3v32/b3v32ld.c @@ -65,13 +65,13 @@ double DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; +double ueff, dueff_dVg, dueff_dVd, dueff_dVb; double Esat, Vdsat; double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; +double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; +double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; +double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_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; @@ -82,7 +82,7 @@ double T6; double T7; double T8; double T9; -double T10; +double T10; double T11, T12; double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; @@ -97,9 +97,9 @@ double tempv; #endif double a1, ScalingFactor; -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 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, dAbulk_dVg; double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; double gche, dgche_dVg, dgche_dVd, dgche_dVb; @@ -123,79 +123,79 @@ 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; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; +double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; +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 = 0.0, dQac0_dVb, dQsub0_dVg; double dQsub0_dVd, dQsub0_dVb; - + double m; struct bsim3v32SizeDependParam *pParam; int ByPass, Check, ChargeComputationNeeded, error; ScalingFactor = 1.0e-9; -ChargeComputationNeeded = +ChargeComputationNeeded = ((ckt->CKTmode & (MODEDCTRANCURVE | MODEAC | MODETRAN | MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; for (; model != NULL; model = model->BSIM3v32nextModel) -{ for (here = model->BSIM3v32instances; here != NULL; +{ for (here = model->BSIM3v32instances; here != NULL; here = here->BSIM3v32nextInstance) - { - Check = 1; + { + Check = 1; ByPass = 0; - pParam = here->pParam; + pParam = here->pParam; if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->BSIM3v32vbs); + { vbs = *(ckt->CKTstate0 + here->BSIM3v32vbs); vgs = *(ckt->CKTstate0 + here->BSIM3v32vgs); vds = *(ckt->CKTstate0 + here->BSIM3v32vds); qdef = *(ckt->CKTstate0 + here->BSIM3v32qdef); } - else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->BSIM3v32vbs); + else if ((ckt->CKTmode & MODEINITTRAN)) + { vbs = *(ckt->CKTstate1 + here->BSIM3v32vbs); vgs = *(ckt->CKTstate1 + here->BSIM3v32vgs); vds = *(ckt->CKTstate1 + here->BSIM3v32vds); qdef = *(ckt->CKTstate1 + here->BSIM3v32qdef); } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3v32off) - { vds = model->BSIM3v32type * here->BSIM3v32icVDS; + else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3v32off) + { vds = model->BSIM3v32type * here->BSIM3v32icVDS; vgs = model->BSIM3v32type * here->BSIM3v32icVGS; vbs = model->BSIM3v32type * here->BSIM3v32icVBS; qdef = 0.0; - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && + if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; + { vbs = 0.0; vgs = model->BSIM3v32type * here->BSIM3v32vth0 + 0.1; vds = 0.1; } } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM3v32off)) + else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && + (here->BSIM3v32off)) { qdef = vbs = vgs = vds = 0.0; - } + } else - { + { #ifndef PREDICTOR if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3v32vbs) = + { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + *(ckt->CKTstate0 + here->BSIM3v32vbs) = *(ckt->CKTstate1 + here->BSIM3v32vbs); vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32vbs)) - (xfact * (*(ckt->CKTstate2 + here->BSIM3v32vbs))); - *(ckt->CKTstate0 + here->BSIM3v32vgs) = + *(ckt->CKTstate0 + here->BSIM3v32vgs) = *(ckt->CKTstate1 + here->BSIM3v32vgs); vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32vgs)) - (xfact * (*(ckt->CKTstate2 + here->BSIM3v32vgs))); - *(ckt->CKTstate0 + here->BSIM3v32vds) = + *(ckt->CKTstate0 + here->BSIM3v32vds) = *(ckt->CKTstate1 + here->BSIM3v32vds); vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32vds)) - (xfact * (*(ckt->CKTstate2 + here->BSIM3v32vds))); - *(ckt->CKTstate0 + here->BSIM3v32vbd) = + *(ckt->CKTstate0 + here->BSIM3v32vbd) = *(ckt->CKTstate0 + here->BSIM3v32vbs) - *(ckt->CKTstate0 + here->BSIM3v32vds); *(ckt->CKTstate0 + here->BSIM3v32qdef) = @@ -203,14 +203,14 @@ for (; model != NULL; model = model->BSIM3v32nextModel) qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v32qdef)) -(xfact * (*(ckt->CKTstate2 + here->BSIM3v32qdef))); } - else - { + else + { #endif /* PREDICTOR */ vbs = model->BSIM3v32type * (*(ckt->CKTrhsOld + here->BSIM3v32bNode) - *(ckt->CKTrhsOld + here->BSIM3v32sNodePrime)); vgs = model->BSIM3v32type - * (*(ckt->CKTrhsOld + here->BSIM3v32gNode) + * (*(ckt->CKTrhsOld + here->BSIM3v32gNode) - *(ckt->CKTrhsOld + here->BSIM3v32sNodePrime)); vds = model->BSIM3v32type * (*(ckt->CKTrhsOld + here->BSIM3v32dNodePrime) @@ -274,7 +274,7 @@ for (; model != NULL; model = model->BSIM3v32nextModel) * MAX(fabs(cdhat),fabs(Idtot)) + ckt->CKTabstol)) { tempv = MAX(fabs(cbhat),fabs(Ibtot)) + ckt->CKTabstol; if ((fabs(cbhat - Ibtot)) < ckt->CKTreltol * tempv) - { /* bypass code */ + { /* bypass code */ vbs = *(ckt->CKTstate0 + here->BSIM3v32vbs); vbd = *(ckt->CKTstate0 + here->BSIM3v32vbd); vgs = *(ckt->CKTstate0 + here->BSIM3v32vgs); @@ -285,46 +285,46 @@ for (; model != NULL; model = model->BSIM3v32nextModel) vgb = vgs - vbs; cdrain = here->BSIM3v32cd; - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && + if ((ckt->CKTmode & (MODETRAN | MODEAC)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - { ByPass = 1; + { ByPass = 1; qgate = here->BSIM3v32qgate; qbulk = here->BSIM3v32qbulk; qdrn = here->BSIM3v32qdrn; - goto line755; + goto line755; + } + else + { goto line850; } - else - { goto line850; - } } } #endif /*NOBYPASS*/ von = here->BSIM3v32von; if (*(ckt->CKTstate0 + here->BSIM3v32vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3v32vgs), von); + { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3v32vgs), von); vds = vgs - vgd; vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3v32vds)); vgd = vgs - vds; } - else - { vgd = DEVfetlim(vgd, vgdo, von); + else + { vgd = DEVfetlim(vgd, vgdo, von); vds = vgs - vgd; vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3v32vds))); vgs = vgd + vds; } if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3v32vbs), + { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3v32vbs), CONSTvt0, model->BSIM3v32vcrit, &Check); vbd = vbs - vds; } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3v32vbd), - CONSTvt0, model->BSIM3v32vcrit, &Check); + else + { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3v32vbd), + CONSTvt0, model->BSIM3v32vcrit, &Check); vbs = vbd + vds; } } @@ -339,36 +339,36 @@ for (; model != NULL; model = model->BSIM3v32nextModel) /* acm model */ if (model->BSIM3v32acmMod == 0) { - if ((here->BSIM3v32sourceArea <= 0.0) - && (here->BSIM3v32sourcePerimeter <= 0.0)) - { - SourceSatCurrent = 1.0e-14; - } - else - { - SourceSatCurrent = here->BSIM3v32sourceArea - * model->BSIM3v32jctTempSatCurDensity - + here->BSIM3v32sourcePerimeter - * model->BSIM3v32jctSidewallTempSatCurDensity; - } - } + if ((here->BSIM3v32sourceArea <= 0.0) + && (here->BSIM3v32sourcePerimeter <= 0.0)) + { + SourceSatCurrent = 1.0e-14; + } + else + { + SourceSatCurrent = here->BSIM3v32sourceArea + * model->BSIM3v32jctTempSatCurDensity + + here->BSIM3v32sourcePerimeter + * model->BSIM3v32jctSidewallTempSatCurDensity; + } + } else { SourceSatCurrent = 0.0; if (!here->BSIM3v32sourceAreaGiven) - { + { here->BSIM3v32sourceArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; } SourceSatCurrent = here->BSIM3v32sourceArea * model->BSIM3v32jctTempSatCurDensity; if (!here->BSIM3v32sourcePerimeterGiven) - { + { here->BSIM3v32sourcePerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; } SourceSatCurrent = SourceSatCurrent + here->BSIM3v32sourcePerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; } - if (SourceSatCurrent <= 0.0) - { here->BSIM3v32gbs = ckt->CKTgmin; + if (SourceSatCurrent <= 0.0) + { here->BSIM3v32gbs = ckt->CKTgmin; here->BSIM3v32cbs = here->BSIM3v32gbs * vbs; } else @@ -376,7 +376,7 @@ for (; model != NULL; model = model->BSIM3v32nextModel) { evbs = exp(vbs / Nvtm); here->BSIM3v32gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; here->BSIM3v32cbs = SourceSatCurrent * (evbs - 1.0) - + ckt->CKTgmin * vbs; + + ckt->CKTgmin * vbs; } else { if (vbs < here->BSIM3v32vjsm) @@ -386,24 +386,24 @@ for (; model != NULL; model = model->BSIM3v32nextModel) + ckt->CKTgmin * vbs; } else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - T0 = here->BSIM3v32IsEvjsm / Nvtm; - here->BSIM3v32gbs = T0 + (ckt->CKTgmin); - here->BSIM3v32cbs = here->BSIM3v32IsEvjsm - SourceSatCurrent - + T0 * (vbs - here->BSIM3v32vjsm) + (ckt->CKTgmin) * vbs; - break; - case BSIM3v32V32: - default: - T0 = (SourceSatCurrent + model->BSIM3v32ijth) / Nvtm; - here->BSIM3v32gbs = T0 + (ckt->CKTgmin); - here->BSIM3v32cbs = model->BSIM3v32ijth + (ckt->CKTgmin) * vbs - + T0 * (vbs - here->BSIM3v32vjsm); - } + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + T0 = here->BSIM3v32IsEvjsm / Nvtm; + here->BSIM3v32gbs = T0 + (ckt->CKTgmin); + here->BSIM3v32cbs = here->BSIM3v32IsEvjsm - SourceSatCurrent + + T0 * (vbs - here->BSIM3v32vjsm) + (ckt->CKTgmin) * vbs; + break; + case BSIM3v32V32: + default: + T0 = (SourceSatCurrent + model->BSIM3v32ijth) / Nvtm; + here->BSIM3v32gbs = T0 + (ckt->CKTgmin); + here->BSIM3v32cbs = model->BSIM3v32ijth + (ckt->CKTgmin) * vbs + + T0 * (vbs - here->BSIM3v32vjsm); + } } } } @@ -425,19 +425,19 @@ for (; model != NULL; model = model->BSIM3v32nextModel) { DrainSatCurrent = 0.0; if (!here->BSIM3v32drainAreaGiven) - { + { here->BSIM3v32drainArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; } DrainSatCurrent = here->BSIM3v32drainArea * model->BSIM3v32jctTempSatCurDensity; if (!here->BSIM3v32drainPerimeterGiven) - { + { here->BSIM3v32drainPerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; } DrainSatCurrent = DrainSatCurrent + here->BSIM3v32drainPerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; } - if (DrainSatCurrent <= 0.0) - { here->BSIM3v32gbd = ckt->CKTgmin; + if (DrainSatCurrent <= 0.0) + { here->BSIM3v32gbd = ckt->CKTgmin; here->BSIM3v32cbd = here->BSIM3v32gbd * vbd; } else @@ -455,68 +455,68 @@ for (; model != NULL; model = model->BSIM3v32nextModel) + ckt->CKTgmin * vbd; } else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - T0 = here->BSIM3v32IsEvjdm / Nvtm; - here->BSIM3v32gbd = T0 + (ckt->CKTgmin); - here->BSIM3v32cbd = here->BSIM3v32IsEvjdm - DrainSatCurrent - + T0 * (vbd - here->BSIM3v32vjdm) + (ckt->CKTgmin) * vbd; - break; - case BSIM3v32V32: - default: - T0 = (DrainSatCurrent + model->BSIM3v32ijth) / Nvtm; - here->BSIM3v32gbd = T0 + (ckt->CKTgmin); - here->BSIM3v32cbd = model->BSIM3v32ijth + (ckt->CKTgmin) * vbd - + T0 * (vbd - here->BSIM3v32vjdm); - } + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + T0 = here->BSIM3v32IsEvjdm / Nvtm; + here->BSIM3v32gbd = T0 + (ckt->CKTgmin); + here->BSIM3v32cbd = here->BSIM3v32IsEvjdm - DrainSatCurrent + + T0 * (vbd - here->BSIM3v32vjdm) + (ckt->CKTgmin) * vbd; + break; + case BSIM3v32V32: + default: + T0 = (DrainSatCurrent + model->BSIM3v32ijth) / Nvtm; + here->BSIM3v32gbd = T0 + (ckt->CKTgmin); + here->BSIM3v32cbd = model->BSIM3v32ijth + (ckt->CKTgmin) * vbd + + T0 * (vbd - here->BSIM3v32vjdm); + } } } } /* End of diode DC model */ if (vds >= 0.0) - { /* normal mode */ + { /* normal mode */ here->BSIM3v32mode = 1; Vds = vds; Vgs = vgs; Vbs = vbs; } - else - { /* inverse mode */ + else + { /* inverse mode */ here->BSIM3v32mode = -1; Vds = -vds; Vgs = vgd; Vbs = vbd; } - T0 = Vbs - pParam->BSIM3v32vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3v32vbsc); - Vbseff = pParam->BSIM3v32vbsc + 0.5 * (T0 + T1); - dVbseff_dVb = 0.5 * (1.0 + T0 / T1); + T0 = Vbs - pParam->BSIM3v32vbsc - 0.001; + T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3v32vbsc); + Vbseff = pParam->BSIM3v32vbsc + 0.5 * (T0 + T1); + dVbseff_dVb = 0.5 * (1.0 + T0 / T1); if (Vbseff < Vbs) { Vbseff = Vbs; } if (Vbseff > 0.0) - { T0 = pParam->BSIM3v32phi / (pParam->BSIM3v32phi + Vbseff); + { T0 = pParam->BSIM3v32phi / (pParam->BSIM3v32phi + Vbseff); Phis = pParam->BSIM3v32phi * T0; dPhis_dVb = -T0 * T0; sqrtPhis = pParam->BSIM3v32phis3 / (pParam->BSIM3v32phi + 0.5 * Vbseff); dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3v32phis3; } - else - { Phis = pParam->BSIM3v32phi - Vbseff; + else + { Phis = pParam->BSIM3v32phi - Vbseff; dPhis_dVb = -1.0; sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; + dsqrtPhis_dVb = -0.5 / sqrtPhis; } Xdep = pParam->BSIM3v32Xdep0 * sqrtPhis / pParam->BSIM3v32sqrtPhi; dXdep_dVb = (pParam->BSIM3v32Xdep0 / pParam->BSIM3v32sqrtPhi) - * dsqrtPhis_dVb; + * dsqrtPhis_dVb; Leff = pParam->BSIM3v32leff; Vtm = model->BSIM3v32vtm; @@ -526,27 +526,27 @@ for (; model != NULL; model = model->BSIM3v32nextModel) T0 = pParam->BSIM3v32dvt2 * Vbseff; if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3v32dvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3v32dvt2 * T4 * T4; - } + { T1 = 1.0 + T0; + T2 = pParam->BSIM3v32dvt2; + } + else /* Added to avoid any discontinuity problems caused by dvt2 */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->BSIM3v32dvt2 * T4 * T4; + } lt1 = model->BSIM3v32factor1 * T3 * T1; dlt1_dVb = model->BSIM3v32factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); T0 = pParam->BSIM3v32dvt2w * Vbseff; if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->BSIM3v32dvt2w; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3v32dvt2w * T4 * T4; - } + { T1 = 1.0 + T0; + T2 = pParam->BSIM3v32dvt2w; + } + else /* Added to avoid any discontinuity problems caused by dvt2w */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->BSIM3v32dvt2w * T4 * T4; + } ltw = model->BSIM3v32factor1 * T3 * T1; dltw_dVb = model->BSIM3v32factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); @@ -590,18 +590,18 @@ for (; model != NULL; model = model->BSIM3v32nextModel) + (pParam->BSIM3v32kt1 + pParam->BSIM3v32kt1l / Leff + pParam->BSIM3v32kt2 * Vbseff) * TempRatio; tmp2 = model->BSIM3v32tox * pParam->BSIM3v32phi - / (pParam->BSIM3v32weff + pParam->BSIM3v32w0); + / (pParam->BSIM3v32weff + pParam->BSIM3v32w0); - T3 = pParam->BSIM3v32eta0 + pParam->BSIM3v32etab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9; - } - else - { T4 = 1.0; - } - dDIBL_Sft_dVd = T3 * pParam->BSIM3v32theta0vb0; + T3 = pParam->BSIM3v32eta0 + pParam->BSIM3v32etab * Vbseff; + if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ + { T9 = 1.0 / (3.0 - 2.0e4 * T3); + T3 = (2.0e-4 - T3) * T9; + T4 = T9 * T9; + } + else + { T4 = 1.0; + } + dDIBL_Sft_dVd = T3 * pParam->BSIM3v32theta0vb0; DIBL_Sft = dDIBL_Sft_dVd * Vds; Vth = model->BSIM3v32type * here->BSIM3v32vth0 - pParam->BSIM3v32k1 @@ -609,7 +609,7 @@ for (; model != NULL; model = model->BSIM3v32nextModel) - pParam->BSIM3v32k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM3v32k3 + pParam->BSIM3v32k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; - here->BSIM3v32von = Vth; + here->BSIM3v32von = Vth; dVth_dVb = pParam->BSIM3v32k1ox * dsqrtPhis_dVb - pParam->BSIM3v32k2ox - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3v32k3b * tmp2 @@ -621,28 +621,28 @@ for (; model != NULL; model = model->BSIM3v32nextModel) tmp2 = pParam->BSIM3v32nfactor * EPSSI / Xdep; tmp3 = pParam->BSIM3v32cdsc + pParam->BSIM3v32cdscb * Vbseff + pParam->BSIM3v32cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3v32cit) / model->BSIM3v32cox; - if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3v32cit) / model->BSIM3v32cox; + if (tmp4 >= -0.5) + { n = 1.0 + tmp4; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + pParam->BSIM3v32cdscb * Theta0) / model->BSIM3v32cox; dn_dVd = pParam->BSIM3v32cdscd * Theta0 / model->BSIM3v32cox; - } - else - /* avoid discontinuity problems caused by tmp4 */ - { T0 = 1.0 / (3.0 + 8.0 * tmp4); - n = (1.0 + 3.0 * tmp4) * T0; - T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + } + else + /* avoid discontinuity problems caused by tmp4 */ + { T0 = 1.0 / (3.0 + 8.0 * tmp4); + n = (1.0 + 3.0 * tmp4) * T0; + T0 *= T0; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb + pParam->BSIM3v32cdscb * Theta0) / model->BSIM3v32cox * T0; dn_dVd = pParam->BSIM3v32cdscd * Theta0 / model->BSIM3v32cox * T0; - } + } /* Poly Gate Si Depletion Effect */ - T0 = here->BSIM3v32vfb + pParam->BSIM3v32phi; - if ((pParam->BSIM3v32ngate > 1.e18) && (pParam->BSIM3v32ngate < 1.e25) + T0 = here->BSIM3v32vfb + pParam->BSIM3v32phi; + if ((pParam->BSIM3v32ngate > 1.e18) && (pParam->BSIM3v32ngate < 1.e25) && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ + /* added to avoid the problem caused by ngate */ { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3v32ngate / (model->BSIM3v32cox * model->BSIM3v32cox); T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); @@ -652,10 +652,10 @@ for (; model != NULL; model = model->BSIM3v32nextModel) T6 = sqrt(T7 * T7 + 0.224); T5 = 1.12 - 0.5 * (T7 + T6); Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); + dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); } - else - { Vgs_eff = Vgs; + else + { Vgs_eff = Vgs; dVgs_eff_dVg = 1.0; } Vgst = Vgs_eff - Vth; @@ -666,154 +666,154 @@ for (; model != NULL; model = model->BSIM3v32nextModel) VgstNVt = Vgst / T10; ExpArg = (2.0 * pParam->BSIM3v32voff - Vgst) / T10; - /* MCJ: Very small Vgst */ + /* MCJ: Very small Vgst */ if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst; + { Vgsteff = Vgst; dVgsteff_dVg = dVgs_eff_dVg; dVgsteff_dVd = -dVth_dVd; dVgsteff_dVb = -dVth_dVb; - } - else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->BSIM3v32voff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->BSIM3v32cdep0 / model->BSIM3v32cox * ExpVgst; + } + else if (ExpArg > EXP_THRESHOLD) + { T0 = (Vgst - pParam->BSIM3v32voff) / (n * Vtm); + ExpVgst = exp(T0); + Vgsteff = Vtm * pParam->BSIM3v32cdep0 / model->BSIM3v32cox * ExpVgst; dVgsteff_dVg = Vgsteff / (n * Vtm); dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg *= dVgs_eff_dVg; - } - else - { ExpVgst = exp(VgstNVt); + dVgsteff_dVg *= dVgs_eff_dVg; + } + else + { ExpVgst = exp(VgstNVt); T1 = T10 * log(1.0 + ExpVgst); dT1_dVg = ExpVgst / (1.0 + ExpVgst); dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; + + T1 / n * dn_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + + T1 / n * dn_dVd; - dT2_dVg = -model->BSIM3v32cox / (Vtm * pParam->BSIM3v32cdep0) - * exp(ExpArg); + dT2_dVg = -model->BSIM3v32cox / (Vtm * pParam->BSIM3v32cdep0) + * exp(ExpArg); T2 = 1.0 - T10 * dT2_dVg; dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; + + (T2 - 1.0) / n * dn_dVd; dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; + + (T2 - 1.0) / n * dn_dVb; Vgsteff = T1 / T2; - T3 = T2 * T2; + T3 = T2 * T2; dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - } - /* Added revision dependent code */ + } + /* Added revision dependent code */ if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32Vgsteff = Vgsteff; - } + here->BSIM3v32Vgsteff = Vgsteff; + } /* Calculate Effective Channel Geometry */ T9 = sqrtPhis - pParam->BSIM3v32sqrtPhi; - Weff = pParam->BSIM3v32weff - 2.0 * (pParam->BSIM3v32dwg * Vgsteff - + pParam->BSIM3v32dwb * T9); + Weff = pParam->BSIM3v32weff - 2.0 * (pParam->BSIM3v32dwg * Vgsteff + + pParam->BSIM3v32dwb * T9); dWeff_dVg = -2.0 * pParam->BSIM3v32dwg; dWeff_dVb = -2.0 * pParam->BSIM3v32dwb * dsqrtPhis_dVb; if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; + { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); + Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; + T0 *= T0 * 4.0e-16; dWeff_dVg *= T0; - dWeff_dVb *= T0; + dWeff_dVb *= T0; } T0 = pParam->BSIM3v32prwg * Vgsteff + pParam->BSIM3v32prwb * T9; - if (T0 >= -0.9) - { Rds = pParam->BSIM3v32rds0 * (1.0 + T0); - dRds_dVg = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwg; + if (T0 >= -0.9) + { Rds = pParam->BSIM3v32rds0 * (1.0 + T0); + dRds_dVg = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwg; dRds_dVb = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwb * dsqrtPhis_dVb; - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = pParam->BSIM3v32rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwg * T1; - dRds_dVb = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwb * dsqrtPhis_dVb - * T1; - } - /* Added revision dependent code */ - if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32rds = Rds; /* Noise Bugfix */ } - + else + /* to avoid the discontinuity problem due to prwg and prwb*/ + { T1 = 1.0 / (17.0 + 20.0 * T0); + Rds = pParam->BSIM3v32rds0 * (0.8 + T0) * T1; + T1 *= T1; + dRds_dVg = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwg * T1; + dRds_dVb = pParam->BSIM3v32rds0 * pParam->BSIM3v32prwb * dsqrtPhis_dVb + * T1; + } + /* Added revision dependent code */ + if (model->BSIM3v32intVersion > BSIM3v32V323) { + here->BSIM3v32rds = Rds; /* Noise Bugfix */ + } + /* Calculate Abulk */ T1 = 0.5 * pParam->BSIM3v32k1ox / sqrtPhis; dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; T9 = sqrt(pParam->BSIM3v32xj * Xdep); tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; + T5 = Leff / tmp1; tmp2 = pParam->BSIM3v32a0 * T5; - tmp3 = pParam->BSIM3v32weff + pParam->BSIM3v32b1; + tmp3 = pParam->BSIM3v32weff + pParam->BSIM3v32b1; tmp4 = pParam->BSIM3v32b0 / tmp3; T2 = tmp2 + tmp4; dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; T6 = T5 * T5; T7 = T5 * T6; - Abulk0 = 1.0 + T1 * T2; + Abulk0 = 1.0 + T1 * T2; dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; T8 = pParam->BSIM3v32ags * pParam->BSIM3v32a0 * T7; dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; + Abulk = Abulk0 + dAbulk_dVg * Vgsteff; dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); + + 3.0 * T1 * dT2_dVb); if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); - Abulk0 = (0.2 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } + { T9 = 1.0 / (3.0 - 20.0 * Abulk0); + Abulk0 = (0.2 - Abulk0) * T9; + dAbulk0_dVb *= T9 * T9; + } if (Abulk < 0.1) /* added to avoid the problems caused by Abulk */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk); - Abulk = (0.2 - Abulk) * T9; - /* Added revision dependent code */ + { T9 = 1.0 / (3.0 - 20.0 * Abulk); + Abulk = (0.2 - Abulk) * T9; + /* Added revision dependent code */ if (model->BSIM3v32intVersion > BSIM3v32V32) { - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } else { - dAbulk_dVb *= T9 * T9; - } - } - /* Added revision dependent code */ + T10 = T9 * T9; + dAbulk_dVb *= T10; + dAbulk_dVg *= T10; + } else { + dAbulk_dVb *= T9 * T9; + } + } + /* Added revision dependent code */ if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32Abulk = Abulk; + here->BSIM3v32Abulk = Abulk; } T2 = pParam->BSIM3v32keta * Vbseff; - if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); + if (T2 >= -0.9) + { T0 = 1.0 / (1.0 + T2); dT0_dVb = -pParam->BSIM3v32keta * T0 * T0; - } - else + } + else /* added to avoid the problems caused by Keta */ - { T1 = 1.0 / (0.8 + T2); - T0 = (17.0 + 20.0 * T2) * T1; + { T1 = 1.0 / (0.8 + T2); + T0 = (17.0 + 20.0 * T2) * T1; dT0_dVb = -pParam->BSIM3v32keta * T1 * T1; - } - dAbulk_dVg *= T0; - dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; - dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; - Abulk *= T0; - Abulk0 *= T0; + } + dAbulk_dVg *= T0; + dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; + dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; + Abulk *= T0; + Abulk0 *= T0; /* Mobility calculation */ if (model->BSIM3v32mobMod == 1) - { T0 = Vgsteff + Vth + Vth; + { T0 = Vgsteff + Vth + Vth; T2 = pParam->BSIM3v32ua + pParam->BSIM3v32uc * Vbseff; T3 = T0 / model->BSIM3v32tox; T5 = T3 * (T2 + pParam->BSIM3v32ub * T3); @@ -821,49 +821,49 @@ for (; model != NULL; model = model->BSIM3v32nextModel) dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3v32uc * T3; } - else if (model->BSIM3v32mobMod == 2) - { T5 = Vgsteff / model->BSIM3v32tox * (pParam->BSIM3v32ua - + pParam->BSIM3v32uc * Vbseff + pParam->BSIM3v32ub * Vgsteff + else if (model->BSIM3v32mobMod == 2) + { T5 = Vgsteff / model->BSIM3v32tox * (pParam->BSIM3v32ua + + pParam->BSIM3v32uc * Vbseff + pParam->BSIM3v32ub * Vgsteff / model->BSIM3v32tox); dDenomi_dVg = (pParam->BSIM3v32ua + pParam->BSIM3v32uc * Vbseff - + 2.0 * pParam->BSIM3v32ub * Vgsteff / model->BSIM3v32tox) - / model->BSIM3v32tox; + + 2.0 * pParam->BSIM3v32ub * Vgsteff / model->BSIM3v32tox) + / model->BSIM3v32tox; dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3v32uc / model->BSIM3v32tox; + dDenomi_dVb = Vgsteff * pParam->BSIM3v32uc / model->BSIM3v32tox; } - else - { T0 = Vgsteff + Vth + Vth; + else + { T0 = Vgsteff + Vth + Vth; T2 = 1.0 + pParam->BSIM3v32uc * Vbseff; T3 = T0 / model->BSIM3v32tox; T4 = T3 * (pParam->BSIM3v32ua + pParam->BSIM3v32ub * T3); - T5 = T4 * T2; + T5 = T4 * T2; dDenomi_dVg = (pParam->BSIM3v32ua + 2.0 * pParam->BSIM3v32ub * T3) * T2 - / model->BSIM3v32tox; + / model->BSIM3v32tox; dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3v32uc * T4; } - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; + if (T5 >= -0.8) + { Denomi = 1.0 + T5; + } + else /* Added to avoid the discontinuity problem caused by ua and ub*/ + { T9 = 1.0 / (7.0 + 10.0 * T5); + Denomi = (0.6 + T5) * T9; + T9 *= T9; dDenomi_dVg *= T9; dDenomi_dVd *= T9; dDenomi_dVb *= T9; - } + } here->BSIM3v32ueff = ueff = here->BSIM3v32u0temp / Denomi; - T9 = -ueff / Denomi; + T9 = -ueff / Denomi; dueff_dVg = T9 * dDenomi_dVg; dueff_dVd = T9 * dDenomi_dVd; dueff_dVb = T9 * dDenomi_dVb; /* Saturation Drain Voltage Vdsat */ WVCox = Weff * pParam->BSIM3v32vsattemp * model->BSIM3v32cox; - WVCoxRds = WVCox * Rds; + WVCoxRds = WVCox * Rds; Esat = 2.0 * pParam->BSIM3v32vsattemp / ueff; EsatL = Esat * Leff; @@ -871,31 +871,31 @@ for (; model != NULL; model = model->BSIM3v32nextModel) dEsatL_dVg = T0 * dueff_dVg; dEsatL_dVd = T0 * dueff_dVd; dEsatL_dVb = T0 * dueff_dVb; - - /* Sqrt() */ + + /* Sqrt() */ a1 = pParam->BSIM3v32a1; - if (a1 == 0.0) - { Lambda = pParam->BSIM3v32a2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) + if (a1 == 0.0) + { Lambda = pParam->BSIM3v32a2; + dLambda_dVg = 0.0; + } + else if (a1 > 0.0) /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->BSIM3v32a2; - T1 = T0 - pParam->BSIM3v32a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM3v32a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3v32a1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->BSIM3v32a2 + pParam->BSIM3v32a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3v32a2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3v32a1 * (1.0 + T1 / T2); - } + { T0 = 1.0 - pParam->BSIM3v32a2; + T1 = T0 - pParam->BSIM3v32a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * T0); + Lambda = pParam->BSIM3v32a2 + T0 - 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM3v32a1 * (1.0 + T1 / T2); + } + else + { T1 = pParam->BSIM3v32a2 + pParam->BSIM3v32a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3v32a2); + Lambda = 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM3v32a1 * (1.0 + T1 / T2); + } Vgst2Vtm = Vgsteff + 2.0 * Vtm; - /* Added revision dependent code */ + /* Added revision dependent code */ if (model->BSIM3v32intVersion > BSIM3v32V323) { here->BSIM3v32AbovVgst2Vtm = Abulk / Vgst2Vtm; } @@ -907,48 +907,48 @@ for (; model != NULL; model = model->BSIM3v32nextModel) else { tmp2 = dWeff_dVg / Weff; tmp3 = dWeff_dVb / Weff; - } + } if ((Rds == 0.0) && (Lambda == 1.0)) { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; + T1 = T0 * T0; + T2 = Vgst2Vtm * T0; T3 = EsatL * Vgst2Vtm; Vdsat = T3 * T0; - + dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; + dT0_dVd = -(Abulk * dEsatL_dVd) * T1; + dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; + dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; } else { tmp1 = dLambda_dVg / (Lambda * Lambda); T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; + T8 = Abulk * T9; + T7 = Vgst2Vtm * T9; T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); + T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - + + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); + dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; + + (1.0 / Lambda - 1.0) * dAbulk_dVb); + dT0_dVd = 0.0; T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - + dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); + + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 + + T7 * tmp2 + T6 * dAbulk_dVg); dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); + + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); dT1_dVd = Abulk * dEsatL_dVd; T2 = Vgst2Vtm * (EsatL + 2.0 * T6); dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); + + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); dT2_dVd = Vgst2Vtm * dEsatL_dVd; @@ -956,16 +956,16 @@ for (; model != NULL; model = model->BSIM3v32nextModel) Vdsat = (T1 - T3) / T0; dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; + / T3; dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; + / T3; dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; + / T3; dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; + - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; + - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; } here->BSIM3v32vdsat = Vdsat; @@ -977,52 +977,52 @@ for (; model != NULL; model = model->BSIM3v32nextModel) dT1_dVb = dVdsat_dVb; T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3v32delta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->BSIM3v32delta / T2; + T0 = T1 / T2; + T3 = 2.0 * pParam->BSIM3v32delta / T2; dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Added to eliminate non-zero Vdseff at Vds=0.0 */ - if (Vds == 0.0) - { - Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } + dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); + dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); + dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + /* Added to eliminate non-zero Vdseff at Vds=0.0 */ + if (Vds == 0.0) + { + Vdseff = 0.0; + dVdseff_dVg = 0.0; + dVdseff_dVb = 0.0; + } + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } /* Calculate VAsat */ tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; + T8 = T9 / Vgst2Vtm; T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - + T7 = 2.0 * WVCoxRds * tmp4; dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - + - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm + + Vdsat * dAbulk_dVg); + dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; + T9 = WVCoxRds * Abulk; + T1 = 2.0 / Lambda - 1.0 + T9; dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; @@ -1034,42 +1034,42 @@ for (; model != NULL; model = model->BSIM3v32nextModel) if (Vdseff > Vds) Vdseff = Vds; diffVds = Vds - Vdseff; - /* Added revision dependent code */ + /* Added revision dependent code */ if (model->BSIM3v32intVersion > BSIM3v32V323) { - here->BSIM3v32Vdseff = Vdseff; - } + here->BSIM3v32Vdseff = Vdseff; + } /* Calculate VACLM */ if ((pParam->BSIM3v32pclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->BSIM3v32pclm * Abulk * pParam->BSIM3v32litl); + { T0 = 1.0 / (pParam->BSIM3v32pclm * Abulk * pParam->BSIM3v32litl); dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); + dT0_dVg = -T0 / Abulk * dAbulk_dVg; + + T2 = Vgsteff / EsatL; + T1 = Leff * (Abulk + T2); dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); dT1_dVd = -T2 * dEsatL_dVd / Esat; - T9 = T0 * T1; + T9 = T0 * T1; VACLM = T9 * diffVds; dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg + T1 * diffVds * dT0_dVg; dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; + - T9 * dVdseff_dVb; dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); } - else - { VACLM = MAX_EXP; + else + { VACLM = MAX_EXP; dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; } /* Calculate VADIBL */ if (pParam->BSIM3v32thetaRout > 0.0) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; + { T8 = Abulk * Vdsat; + T0 = Vgst2Vtm * T8; dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; + + Vgst2Vtm * Vdsat * dAbulk_dVg; dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; @@ -1078,59 +1078,59 @@ for (; model != NULL; model = model->BSIM3v32nextModel) dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; dT1_dVd = Abulk * dVdsat_dVd; - T9 = T1 * T1; - T2 = pParam->BSIM3v32thetaRout; + T9 = T1 * T1; + T2 = pParam->BSIM3v32thetaRout; VADIBL = (Vgst2Vtm - T0 / T1) / T2; dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - T7 = pParam->BSIM3v32pdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); + T7 = pParam->BSIM3v32pdiblb * Vbseff; + if (T7 >= -0.9) + { T3 = 1.0 / (1.0 + T7); VADIBL *= T3; dVADIBL_dVg *= T3; dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3v32pdiblb) - * T3; + * T3; dVADIBL_dVd *= T3; - } - else + } + else /* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; + { T4 = 1.0 / (0.8 + T7); + T3 = (17.0 + 20.0 * T7) * T4; dVADIBL_dVg *= T3; dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM3v32pdiblb * T4 * T4; + - VADIBL * pParam->BSIM3v32pdiblb * T4 * T4; dVADIBL_dVd *= T3; VADIBL *= T3; - } + } } - else - { VADIBL = MAX_EXP; + else + { VADIBL = MAX_EXP; dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; } /* Calculate VA */ - - T8 = pParam->BSIM3v32pvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; + + T8 = pParam->BSIM3v32pvag / EsatL; + T9 = T8 * Vgsteff; + if (T9 > -0.9) + { T0 = 1.0 + T9; dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); dT0_dVb = -T9 * dEsatL_dVb / EsatL; dT0_dVd = -T9 * dEsatL_dVd / EsatL; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; + } + else /* Added to avoid the discontinuity problems caused by pvag */ + { T1 = 1.0 / (17.0 + 20.0 * T9); + T0 = (0.8 + T9) * T1; + T1 *= T1; dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; T9 *= T1 / EsatL; dT0_dVb = -T9 * dEsatL_dVb; dT0_dVd = -T9 * dEsatL_dVd; - } - + } + tmp1 = VACLM * VACLM; tmp2 = VADIBL * VADIBL; tmp3 = VACLM + VADIBL; @@ -1147,25 +1147,25 @@ for (; model != NULL; model = model->BSIM3v32nextModel) dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; /* Calculate VASCBE */ - if (pParam->BSIM3v32pscbe2 > 0.0) - { if (diffVds > pParam->BSIM3v32pscbe1 * pParam->BSIM3v32litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM3v32pscbe1 * pParam->BSIM3v32litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM3v32pscbe2; + if (pParam->BSIM3v32pscbe2 > 0.0) + { if (diffVds > pParam->BSIM3v32pscbe1 * pParam->BSIM3v32litl + / EXP_THRESHOLD) + { T0 = pParam->BSIM3v32pscbe1 * pParam->BSIM3v32litl / diffVds; + VASCBE = Leff * exp(T0) / pParam->BSIM3v32pscbe2; T1 = T0 * VASCBE / diffVds; dVASCBE_dVg = T1 * dVdseff_dVg; dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); dVASCBE_dVb = T1 * dVdseff_dVb; } - else - { VASCBE = MAX_EXP * Leff/pParam->BSIM3v32pscbe2; + else + { VASCBE = MAX_EXP * Leff/pParam->BSIM3v32pscbe2; dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; } - } - else - { VASCBE = MAX_EXP; + } + else + { VASCBE = MAX_EXP; dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } + } /* Calculate Ids */ CoxWovL = model->BSIM3v32cox * Weff / Leff; @@ -1175,48 +1175,48 @@ for (; model != NULL; model = model->BSIM3v32nextModel) dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; + dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) / Vgst2Vtm; fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; + dfgche1_dVg = Vgsteff * dT0_dVg + T0; + dfgche1_dVd = Vgsteff * dT0_dVd; + dfgche1_dVb = Vgsteff * dT0_dVb; T9 = Vdseff / EsatL; fgche2 = 1.0 + T9; dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - + gche = beta * fgche1 / fgche2; dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; + - gche * dfgche2_dVg) / fgche2; dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; + - gche * dfgche2_dVd) / fgche2; dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; + - gche * dfgche2_dVb) / fgche2; T0 = 1.0 + gche * Rds; T9 = Vdseff / T0; Idl = gche * T9; dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; + - Idl * gche / T0 * dRds_dVg ; - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; + dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; + dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb + - Idl * dRds_dVb * gche) / T0; T9 = diffVds / Va; T0 = 1.0 + T9; Idsa = Idl * T0; dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; + - T9 * dVa_dVd) / Va; dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; T9 = diffVds / VASCBE; @@ -1225,33 +1225,33 @@ for (; model != NULL; model = model->BSIM3v32nextModel) Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - - T9 * dVASCBE_dVd) / VASCBE; + - T9 * dVASCBE_dVd) / VASCBE; Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb - + T9 * dVASCBE_dVb) / VASCBE; + + T9 * dVASCBE_dVb) / VASCBE; Gds += Gm * dVgsteff_dVd; - Gmb += Gm * dVgsteff_dVb; - Gm *= dVgsteff_dVg; - Gmb *= dVbseff_dVb; + Gmb += Gm * dVgsteff_dVb; + Gm *= dVgsteff_dVg; + Gmb *= dVbseff_dVb; /* Substrate current begins */ tmp = pParam->BSIM3v32alpha0 + pParam->BSIM3v32alpha1 * Leff; if ((tmp <= 0.0) || (pParam->BSIM3v32beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; + { Isub = Gbd = Gbb = Gbg = 0.0; } - else - { T2 = tmp / Leff; - if (diffVds > pParam->BSIM3v32beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM3v32beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); - T3 = T1 / diffVds * (T0 - 1.0); + else + { T2 = tmp / Leff; + if (diffVds > pParam->BSIM3v32beta0 / EXP_THRESHOLD) + { T0 = -pParam->BSIM3v32beta0 / diffVds; + T1 = T2 * diffVds * exp(T0); + T3 = T1 / diffVds * (T0 - 1.0); dT1_dVg = T3 * dVdseff_dVg; dT1_dVd = T3 * (dVdseff_dVd - 1.0); dT1_dVb = T3 * dVdseff_dVb; } - else - { T3 = T2 * MIN_EXP; - T1 = T3 * diffVds; + else + { T3 = T2 * MIN_EXP; + T1 = T3 * diffVds; dT1_dVg = -T3 * dVdseff_dVg; dT1_dVd = T3 * (1.0 - dVdseff_dVd); dT1_dVb = -T3 * dVdseff_dVb; @@ -1262,59 +1262,59 @@ for (; model != NULL; model = model->BSIM3v32nextModel) Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; Gbd += Gbg * dVgsteff_dVd; - Gbb += Gbg * dVgsteff_dVb; - Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; /* bug fixing */ + Gbb += Gbg * dVgsteff_dVb; + Gbg *= dVgsteff_dVg; + Gbb *= dVbseff_dVb; /* bug fixing */ } - + cdrain = Ids; here->BSIM3v32gds = Gds; here->BSIM3v32gm = Gm; here->BSIM3v32gmbs = Gmb; - + here->BSIM3v32gbbs = Gbb; here->BSIM3v32gbgs = Gbg; here->BSIM3v32gbds = Gbd; here->BSIM3v32csub = Isub; - /* BSIM3v32 thermal noise Qinv calculated from all capMod + /* BSIM3v32 thermal noise Qinv calculated from all capMod * 0, 1, 2 & 3 stored in here->BSIM3v32qinv 1/1998 */ if ((model->BSIM3v32xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; + { qgate = qdrn = qsrc = qbulk = 0.0; here->BSIM3v32cggb = here->BSIM3v32cgsb = here->BSIM3v32cgdb = 0.0; here->BSIM3v32cdgb = here->BSIM3v32cdsb = here->BSIM3v32cddb = 0.0; here->BSIM3v32cbgb = here->BSIM3v32cbsb = here->BSIM3v32cbdb = 0.0; - here->BSIM3v32cqdb = here->BSIM3v32cqsb = here->BSIM3v32cqgb + here->BSIM3v32cqdb = here->BSIM3v32cqsb = here->BSIM3v32cqgb = here->BSIM3v32cqbb = 0.0; here->BSIM3v32gtau = 0.0; goto finished; } - else if (model->BSIM3v32capMod == 0) - { + else if (model->BSIM3v32capMod == 0) + { if (Vbseff < 0.0) - { Vbseff = Vbs; + { Vbseff = Vbs; dVbseff_dVb = 1.0; } - else - { Vbseff = pParam->BSIM3v32phi - Phis; + else + { Vbseff = pParam->BSIM3v32phi - Phis; dVbseff_dVb = -dPhis_dVb; } Vfb = pParam->BSIM3v32vfbcv; - Vth = Vfb + pParam->BSIM3v32phi + pParam->BSIM3v32k1ox * sqrtPhis; + Vth = Vfb + pParam->BSIM3v32phi + pParam->BSIM3v32k1ox * sqrtPhis; Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM3v32k1ox * dsqrtPhis_dVb; + dVth_dVb = pParam->BSIM3v32k1ox * dsqrtPhis_dVb; dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; + dVgst_dVg = dVgs_eff_dVg; CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV; Arg1 = Vgs_eff - Vbseff - Vfb; if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; + { qgate = CoxWL * Arg1; qbulk = -qgate; qdrn = 0.0; @@ -1331,18 +1331,18 @@ for (; model != NULL; model = model->BSIM3v32nextModel) here->BSIM3v32cbsb = -here->BSIM3v32cgsb; here->BSIM3v32qinv = 0.0; } - else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM3v32k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM3v32k1ox * (T2 - T1); + else if (Vgst <= 0.0) + { T1 = 0.5 * pParam->BSIM3v32k1ox; + T2 = sqrt(T1 * T1 + Arg1); + qgate = CoxWL * pParam->BSIM3v32k1ox * (T2 - T1); qbulk = -qgate; qdrn = 0.0; - T0 = CoxWL * T1 / T2; - here->BSIM3v32cggb = T0 * dVgs_eff_dVg; - here->BSIM3v32cgdb = 0.0; + T0 = CoxWL * T1 / T2; + here->BSIM3v32cggb = T0 * dVgs_eff_dVg; + here->BSIM3v32cgdb = 0.0; here->BSIM3v32cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); - + here->BSIM3v32cdgb = 0.0; here->BSIM3v32cddb = 0.0; here->BSIM3v32cdsb = 0.0; @@ -1352,63 +1352,63 @@ for (; model != NULL; model = model->BSIM3v32nextModel) here->BSIM3v32cbsb = -here->BSIM3v32cgsb; here->BSIM3v32qinv = 0.0; } - else - { One_Third_CoxWL = CoxWL / 3.0; + else + { One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; - Vdsat = Vgst / AbulkCV; - dVdsat_dVg = dVgs_eff_dVg / AbulkCV; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; + Vdsat = Vgst / AbulkCV; + dVdsat_dVg = dVgs_eff_dVg / AbulkCV; + dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; if (model->BSIM3v32xpart > 0.5) - { /* 0/100 Charge partition model */ - if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v32phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; + { /* 0/100 Charge partition model */ + if (Vdsat <= Vds) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3v32phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.0; - here->BSIM3v32cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); + here->BSIM3v32cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); here->BSIM3v32cgdb = 0.0; - + here->BSIM3v32cdgb = 0.0; here->BSIM3v32cddb = 0.0; here->BSIM3v32cdsb = 0.0; - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); + here->BSIM3v32cbgb = -(here->BSIM3v32cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); here->BSIM3v32cbdb = 0.0; here->BSIM3v32qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v32phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + T7 = 2.0 * Vds - T1 - 3.0 * T3; + T8 = T3 - T1 - 2.0 * Vds; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3v32phi - 0.5 * (Vds - T3)); + T10 = T4 * T8; + qdrn = T4 * T7; + qbulk = -(qgate + qdrn + T10); + T5 = T3 / T1; here->BSIM3v32cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; T11 = -CoxWL * T5 * dVdsat_dVb; here->BSIM3v32cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T11 @@ -1420,7 +1420,7 @@ for (; model != NULL; model = model->BSIM3v32nextModel) T8 = T9 * T8; T9 = 2.0 * T4 * (1.0 - 3.0 * T5); here->BSIM3v32cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; + * dVdsat_dVg) * dVgs_eff_dVg; T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; here->BSIM3v32cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); here->BSIM3v32cdsb = -(here->BSIM3v32cdgb + T12 @@ -1428,200 +1428,200 @@ for (; model != NULL; model = model->BSIM3v32nextModel) T9 = 2.0 * T4 * (1.0 + T5); T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); + T12 = T4 * (2.0 * T2 + T5 - 1.0); T0 = -(T10 + T11 + T12); here->BSIM3v32cbgb = -(here->BSIM3v32cggb - + here->BSIM3v32cdgb + T10); - here->BSIM3v32cbdb = -(here->BSIM3v32cgdb - + here->BSIM3v32cddb + T12); + + here->BSIM3v32cdgb + T10); + here->BSIM3v32cbdb = -(here->BSIM3v32cgdb + + here->BSIM3v32cddb + T12); here->BSIM3v32cbsb = -(here->BSIM3v32cgsb - + here->BSIM3v32cdsb + T0); + + here->BSIM3v32cdsb + T0); here->BSIM3v32qinv = -(qgate + qbulk); } } - else if (model->BSIM3v32xpart < 0.5) - { /* 40/60 Charge partition model */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v32phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; + else if (model->BSIM3v32xpart < 0.5) + { /* 40/60 Charge partition model */ + if (Vds >= Vdsat) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3v32phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.4 * T2; - here->BSIM3v32cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); - here->BSIM3v32cgdb = 0.0; - - T3 = 0.4 * Two_Third_CoxWL; + here->BSIM3v32cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); + here->BSIM3v32cgdb = 0.0; + + T3 = 0.4 * Two_Third_CoxWL; here->BSIM3v32cdgb = -T3 * dVgs_eff_dVg; here->BSIM3v32cddb = 0.0; - T4 = T3 * dVth_dVb; + T4 = T3 * dVth_dVb; here->BSIM3v32cdsb = -(T4 + here->BSIM3v32cdgb); - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); + here->BSIM3v32cbgb = -(here->BSIM3v32cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); here->BSIM3v32cbdb = 0.0; here->BSIM3v32qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v32phi - - 0.5 * (Vds - T3)); + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v32phi + - 0.5 * (Vds - T3)); - T5 = T3 / T1; + T5 = T3 / T1; here->BSIM3v32cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; tmp = -CoxWL * T5 * dVdsat_dVb; here->BSIM3v32cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3v32cgsb = -(here->BSIM3v32cggb - + here->BSIM3v32cgdb + tmp); + here->BSIM3v32cgsb = -(here->BSIM3v32cggb + + here->BSIM3v32cgdb + tmp); - T6 = 1.0 / Vdsat; + T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; - T8 = T2 / T1; - T7 = Vds - T1 - T8 * T6; - qdrn = T4 * T7; - T7 *= T9; - tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); + T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds + + 1.2 * Vds * Vds; + T8 = T2 / T1; + T7 = Vds - T1 - T8 * T6; + qdrn = T4 * T7; + T7 *= T9; + tmp = T8 / T1; + tmp1 = T4 * (2.0 - 4.0 * tmp * T6 + + T8 * (16.0 * Vdsat - 6.0 * Vds)); here->BSIM3v32cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; + * dVdsat_dVg) * dVgs_eff_dVg; T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; here->BSIM3v32cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM3v32cdsb = -(here->BSIM3v32cdgb - + T10 + here->BSIM3v32cddb); + * T1) + 2.0 * tmp) * T6 + T8 + * (6.0 * Vdsat - 2.4 * Vds)); + here->BSIM3v32cdsb = -(here->BSIM3v32cdgb + + T10 + here->BSIM3v32cddb); - T7 = 2.0 * (T1 + T3); - qbulk = -(qgate - T4 * T7); - T7 *= T9; - T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - here->BSIM3v32cdgb - - T0 * dVdsat_dVg) * dVgs_eff_dVg; - T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM3v32cddb; + T7 = 2.0 * (T1 + T3); + qbulk = -(qgate - T4 * T7); + T7 *= T9; + T0 = 4.0 * T4 * (1.0 - T5); + T12 = (-T7 * dAlphaz_dVg - here->BSIM3v32cdgb + - T0 * dVdsat_dVg) * dVgs_eff_dVg; + T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; + T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) + - here->BSIM3v32cddb; tmp = -(T10 + T11 + T12); - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - + here->BSIM3v32cdgb + T12); + here->BSIM3v32cbgb = -(here->BSIM3v32cggb + + here->BSIM3v32cdgb + T12); here->BSIM3v32cbdb = -(here->BSIM3v32cgdb - + here->BSIM3v32cddb + T10); /* bug fix */ + + here->BSIM3v32cddb + T10); /* bug fix */ here->BSIM3v32cbsb = -(here->BSIM3v32cgsb - + here->BSIM3v32cdsb + tmp); + + here->BSIM3v32cdsb + tmp); here->BSIM3v32qinv = -(qgate + qbulk); } } - else - { /* 50/50 partitioning */ - if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3v32phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; + else + { /* 50/50 partitioning */ + if (Vds >= Vdsat) + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * (Vgs_eff - Vfb + - pParam->BSIM3v32phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.5 * T2; + + here->BSIM3v32cggb = One_Third_CoxWL * (3.0 + - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); + here->BSIM3v32cgdb = 0.0; - here->BSIM3v32cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3v32cgsb = -(here->BSIM3v32cggb + T2); - here->BSIM3v32cgdb = 0.0; - here->BSIM3v32cdgb = -One_Third_CoxWL * dVgs_eff_dVg; here->BSIM3v32cddb = 0.0; - T4 = One_Third_CoxWL * dVth_dVb; + T4 = One_Third_CoxWL * dVth_dVb; here->BSIM3v32cdsb = -(T4 + here->BSIM3v32cdgb); - here->BSIM3v32cbgb = -(here->BSIM3v32cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); + here->BSIM3v32cbgb = -(here->BSIM3v32cggb + - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3v32cbsb = -(here->BSIM3v32cbgb + T3); here->BSIM3v32cbdb = 0.0; here->BSIM3v32qinv = -(qgate + qbulk); - } - else - { /* linear region */ - Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v32phi - - 0.5 * (Vds - T3)); + } + else + { /* linear region */ + Alphaz = Vgst / Vdsat; + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v32phi + - 0.5 * (Vds - T3)); - T5 = T3 / T1; + T5 = T3 / T1; here->BSIM3v32cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; + * dVgs_eff_dVg; tmp = -CoxWL * T5 * dVdsat_dVb; here->BSIM3v32cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3v32cgsb = -(here->BSIM3v32cggb - + here->BSIM3v32cgdb + tmp); + here->BSIM3v32cgsb = -(here->BSIM3v32cggb + + here->BSIM3v32cgdb + tmp); - T6 = 1.0 / Vdsat; + T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T1 + T3; - qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); - T7 *= T9; - T0 = T4 * (2.0 * T5 - 2.0); + T7 = T1 + T3; + qdrn = -T4 * T7; + qbulk = - (qgate + qdrn + qdrn); + T7 *= T9; + T0 = T4 * (2.0 * T5 - 2.0); here->BSIM3v32cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; - T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; + * dAlphaz_dVg) * dVgs_eff_dVg; + T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; here->BSIM3v32cddb = T4 * (1.0 - 2.0 * T2 - T5); here->BSIM3v32cdsb = -(here->BSIM3v32cdgb + T12 + here->BSIM3v32cddb); here->BSIM3v32cbgb = -(here->BSIM3v32cggb - + 2.0 * here->BSIM3v32cdgb); + + 2.0 * here->BSIM3v32cdgb); here->BSIM3v32cbdb = -(here->BSIM3v32cgdb - + 2.0 * here->BSIM3v32cddb); + + 2.0 * here->BSIM3v32cddb); here->BSIM3v32cbsb = -(here->BSIM3v32cgsb - + 2.0 * here->BSIM3v32cdsb); + + 2.0 * here->BSIM3v32cdsb); here->BSIM3v32qinv = -(qgate + qbulk); } - } - } - } - else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; + } + } + } + else + { if (Vbseff < 0.0) + { VbseffCV = Vbseff; dVbseffCV_dVb = 1.0; } - else - { VbseffCV = pParam->BSIM3v32phi - Phis; + else + { VbseffCV = pParam->BSIM3v32phi - Phis; dVbseffCV_dVb = -dPhis_dVb; } CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV - * pParam->BSIM3v32leffCV; + * pParam->BSIM3v32leffCV; /* Seperate VgsteffCV with noff and voffcv */ noff = n * pParam->BSIM3v32noff; @@ -1655,123 +1655,123 @@ for (; model != NULL; model = model->BSIM3v32nextModel) dVgsteff_dVg *= dVgs_eff_dVg; } /* End of VgsteffCV */ - if (model->BSIM3v32capMod == 1) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Vfb = here->BSIM3v32vfbzb; - break; - case BSIM3v32V32: - Vfb = here->BSIM3v32vfbzb; - dVfb_dVb = dVfb_dVd = 0.0; - break; - default: - Vfb = Vth - pParam->BSIM3v32phi - pParam->BSIM3v32k1ox * sqrtPhis; - dVfb_dVb = dVth_dVb - pParam->BSIM3v32k1ox * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - } + if (model->BSIM3v32capMod == 1) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + Vfb = here->BSIM3v32vfbzb; + break; + case BSIM3v32V32: + Vfb = here->BSIM3v32vfbzb; + dVfb_dVb = dVfb_dVd = 0.0; + break; + default: + Vfb = Vth - pParam->BSIM3v32phi - pParam->BSIM3v32k1ox * sqrtPhis; + dVfb_dVb = dVth_dVb - pParam->BSIM3v32k1ox * dsqrtPhis_dVb; + dVfb_dVd = dVth_dVd; + } Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; + { qgate = CoxWL * Arg1; Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Cgd = -CoxWL * dVgsteff_dVd; - Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); - break; - case BSIM3v32V32: - default: - Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd); - Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + Cgd = -CoxWL * dVgsteff_dVd; + Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); + break; + case BSIM3v32V32: + default: + Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd); + Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); + } } - else - { T0 = 0.5 * pParam->BSIM3v32k1ox; - T1 = sqrt(T0 * T0 + Arg1); + else + { T0 = 0.5 * pParam->BSIM3v32k1ox; + T1 = sqrt(T0 * T0 + Arg1); T2 = CoxWL * T0 / T1; - + qgate = CoxWL * pParam->BSIM3v32k1ox * (T1 - T0); Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Cgd = -T2 * dVgsteff_dVd; - Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); - break; - case BSIM3v32V32: - default: - Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); - Cgb = -T2 * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + Cgd = -T2 * dVgsteff_dVd; + Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); + break; + case BSIM3v32V32: + default: + Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); + Cgb = -T2 * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); + } } - qbulk = -qgate; - Cbg = -Cgg; - Cbd = -Cgd; - Cbb = -Cgb; + qbulk = -qgate; + Cbg = -Cgg; + Cbd = -Cgd; + Cbb = -Cgb; One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; + VdsatCV = Vgsteff / AbulkCV; if (VdsatCV < Vds) - { dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - T0 = Vgsteff - VdsatCV / 3.0; + { dVdsatCV_dVg = 1.0 / AbulkCV; + dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + T0 = Vgsteff - VdsatCV / 3.0; dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; dT0_dVb = -dVdsatCV_dVb / 3.0; qgate += CoxWL * T0; - Cgg1 = CoxWL * dT0_dVg; + Cgg1 = CoxWL * dT0_dVg; Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; Cgd1 = Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; + Cgg1 *= dVgsteff_dVg; + Cgg += Cgg1; + Cgb += Cgb1; + Cgd += Cgd1; - T0 = VdsatCV - Vgsteff; - dT0_dVg = dVdsatCV_dVg - 1.0; - dT0_dVb = dVdsatCV_dVb; + T0 = VdsatCV - Vgsteff; + dT0_dVg = dVdsatCV_dVg - 1.0; + dT0_dVb = dVdsatCV_dVb; qbulk += One_Third_CoxWL * T0; Cbg1 = One_Third_CoxWL * dT0_dVg; - Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; - Cbd1 = Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; + Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; + Cbd1 = Cbg1 * dVgsteff_dVd; + Cbg1 *= dVgsteff_dVg; + Cbg += Cbg1; + Cbb += Cbb1; Cbd += Cbd1; if (model->BSIM3v32xpart > 0.5) - T0 = -Two_Third_CoxWL; + T0 = -Two_Third_CoxWL; else if (model->BSIM3v32xpart < 0.5) - T0 = -0.4 * CoxWL; + T0 = -0.4 * CoxWL; else - T0 = -One_Third_CoxWL; + T0 = -One_Third_CoxWL; qsrc = T0 * Vgsteff; Csg = T0 * dVgsteff_dVg; Csb = T0 * dVgsteff_dVb; Csd = T0 * dVgsteff_dVd; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; } - else - { T0 = AbulkCV * Vds; + else + { T0 = AbulkCV * Vds; T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); - T2 = Vds / T1; - T3 = T0 * T2; + T2 = Vds / T1; + T3 = T0 * T2; dT3_dVg = -12.0 * T2 * T2 * AbulkCV; dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; @@ -1780,229 +1780,229 @@ for (; model != NULL; model = model->BSIM3v32nextModel) Cgg1 = CoxWL * (1.0 + dT3_dVg); Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; - Cgg1 *= dVgsteff_dVg; - Cgg += Cgg1; - Cgb += Cgb1; - Cgd += Cgd1; + Cgg1 *= dVgsteff_dVg; + Cgg += Cgg1; + Cgb += Cgb1; + Cgd += Cgd1; qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); - Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); - Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb - + (0.5 * Vds - T3) * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd - + Cbg1 * dVgsteff_dVd; - Cbg1 *= dVgsteff_dVg; - Cbg += Cbg1; - Cbb += Cbb1; - Cbd += Cbd1; + Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); + Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb + + (0.5 * Vds - T3) * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb; + Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd + + Cbg1 * dVgsteff_dVd; + Cbg1 *= dVgsteff_dVg; + Cbg += Cbg1; + Cbb += Cbb1; + Cbd += Cbd1; if (model->BSIM3v32xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; + { /* 0/100 Charge petition model */ + T1 = T1 + T1; qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 - * AbulkCV); + - T0 * T0 / T1); + Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 + * AbulkCV); Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb - - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) - * dAbulkCV_dVb) + Csg * dVgsteff_dVb; - Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 - / T1 / T1 * (4.0 * Vgsteff - T0)) - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; + - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) + * dAbulkCV_dVb) + Csg * dVgsteff_dVb; + Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 + / T1 / T1 * (4.0 * Vgsteff - T0)) + + Csg * dVgsteff_dVd; + Csg *= dVgsteff_dVg; } - else if (model->BSIM3v32xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb - + Csg * dVgsteff_dVb; - Csd = (qsrc / T1 + T2 * T4) * AbulkCV - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; + else if (model->BSIM3v32xpart < 0.5) + { /* 40/60 Charge petition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb + + Csg * dVgsteff_dVb; + Csd = (qsrc / T1 + T2 * T4) * AbulkCV + + Csg * dVgsteff_dVd; + Csg *= dVgsteff_dVg; } - else - { /* 50/50 Charge petition model */ + else + { /* 50/50 Charge petition model */ qsrc = -0.5 * (qgate + qbulk); Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); } - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; } qdrn = -(qgate + qbulk + qsrc); here->BSIM3v32cggb = Cgg; - here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v32cgdb = Cgd; + here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3v32cgdb = Cgd; here->BSIM3v32cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v32cddb = -(Cgd + Cbd + Csd); + here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3v32cddb = -(Cgd + Cbd + Csd); here->BSIM3v32cbgb = Cbg; - here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v32cbdb = Cbd; + here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3v32cbdb = Cbd; here->BSIM3v32qinv = -(qgate + qbulk); - } + } - else if (model->BSIM3v32capMod == 2) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Vfb = here->BSIM3v32vfbzb; - break; - case BSIM3v32V32: - Vfb = here->BSIM3v32vfbzb; - dVfb_dVb = dVfb_dVd = 0.0; - break; - default: /* old code prior to v3.2 */ - Vfb = Vth - pParam->BSIM3v32phi - pParam->BSIM3v32k1ox * sqrtPhis; - dVfb_dVb = dVth_dVb - pParam->BSIM3v32k1ox * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - } + else if (model->BSIM3v32capMod == 2) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + Vfb = here->BSIM3v32vfbzb; + break; + case BSIM3v32V32: + Vfb = here->BSIM3v32vfbzb; + dVfb_dVb = dVfb_dVd = 0.0; + break; + default: /* old code prior to v3.2 */ + Vfb = Vth - pParam->BSIM3v32phi - pParam->BSIM3v32k1ox * sqrtPhis; + dVfb_dVb = dVth_dVb - pParam->BSIM3v32k1ox * dsqrtPhis_dVb; + dVfb_dVd = dVth_dVd; + } V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); - T2 = DELTA_3 / T0; - } + if (Vfb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); + T2 = -DELTA_3 / T0; + } + else + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); + T2 = DELTA_3 / T0; + } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Do nothing */ - break; - case BSIM3v32V32: - default: - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - } - dVfbeff_dVg = T1 * dVgs_eff_dVg; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - break; - case BSIM3v32V32: - default: - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseffCV_dVb; - } - Qac0 = CoxWL * (Vfbeff - Vfb); - dQac0_dVg = CoxWL * dVfbeff_dVg; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Do nothing */ - break; - case BSIM3v32V32: - default: - dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); - } - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - dQac0_dVb = CoxWL * dVfbeff_dVb; - break; - case BSIM3v32V32: - default: - dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); - } + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfb - 0.5 * (V3 + T0); + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + /* Do nothing */ + break; + case BSIM3v32V32: + default: + dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; + } + dVfbeff_dVg = T1 * dVgs_eff_dVg; + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + dVfbeff_dVb = -T1 * dVbseffCV_dVb; + break; + case BSIM3v32V32: + default: + dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseffCV_dVb; + } + Qac0 = CoxWL * (Vfbeff - Vfb); + dQac0_dVg = CoxWL * dVfbeff_dVg; + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + /* Do nothing */ + break; + case BSIM3v32V32: + default: + dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); + } + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + dQac0_dVb = CoxWL * dVfbeff_dVb; + break; + case BSIM3v32V32: + default: + dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); + } T0 = 0.5 * pParam->BSIM3v32k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; + T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; if (pParam->BSIM3v32k1ox == 0.0) { T1 = 0.0; T2 = 0.0; } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3v32k1ox; + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->BSIM3v32k1ox; T2 = CoxWL; - } - else - { T1 = sqrt(T0 * T0 + T3); + } + else + { T1 = sqrt(T0 * T0 + T3); T2 = CoxWL * T0 / T1; - } + } - Qsub0 = CoxWL * pParam->BSIM3v32k1ox * (T1 - T0); + Qsub0 = CoxWL * pParam->BSIM3v32k1ox * (T1 - T0); dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - dQsub0_dVd = -T2 * dVgsteff_dVd; - break; - case BSIM3v32V32: - default: - dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); - } - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + dQsub0_dVd = -T2 * dVgsteff_dVd; + break; + case BSIM3v32V32: + default: + dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); + } + dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb); AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; + VdsatCV = Vgsteff / AbulkCV; - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { - VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } + V4 = VdsatCV - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + VdseffCV = VdsatCV - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + dVdseffCV_dVg = T3; + dVdseffCV_dVd = T1; + dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ + if (Vds == 0.0) + { + VdseffCV = 0.0; + dVdseffCV_dVg = 0.0; + dVdseffCV_dVb = 0.0; + } + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } - T0 = AbulkCV * VdseffCV; + T0 = AbulkCV * VdseffCV; T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; + T2 = VdseffCV / T1; + T3 = T0 * T2; T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); @@ -2013,129 +2013,129 @@ for (; model != NULL; model = model->BSIM3v32nextModel) Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; - Cgg1 *= dVgsteff_dVg; + + Cgg1 * dVgsteff_dVb; + Cgg1 *= dVgsteff_dVg; - T7 = 1.0 - AbulkCV; + T7 = 1.0 - AbulkCV; qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); + T4 = -T7 * (T4 - 1.0); + T5 = -T7 * T5; + T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbg1 *= dVgsteff_dVg; + + Cbg1 * dVgsteff_dVb; + Cbg1 *= dVgsteff_dVg; if (model->BSIM3v32xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; + { /* 0/100 Charge petition model */ + T1 = T1 + T1; qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); + - T0 * T0 / T1); + T7 = (4.0 * Vgsteff - T0) / (T1 * T1); + T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); + T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; + + Csg * dVgsteff_dVb; + Csg *= dVgsteff_dVg; } - else if (model->BSIM3v32xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); + else if (model->BSIM3v32xpart < 0.5) + { /* 40/60 Charge petition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + T5 = (qsrc / T1 + T2 * T7) * AbulkCV; + T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); Csg = (T4 + T5 * dVdseffCV_dVg); Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; - Csg *= dVgsteff_dVg; + + Csg * dVgsteff_dVb; + Csg *= dVgsteff_dVg; } - else - { /* 50/50 Charge petition model */ + else + { /* 50/50 Charge petition model */ qsrc = -0.5 * (qgate + qbulk); Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); } - qgate += Qac0 + Qsub0; - qbulk -= (Qac0 + Qsub0); + qgate += Qac0 + Qsub0; + qbulk -= (Qac0 + Qsub0); qdrn = -(qgate + qbulk + qsrc); - Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Cgd = dQsub0_dVd + Cgd1; - break; - case BSIM3v32V32: - default: - Cgd = dQac0_dVd + dQsub0_dVd + Cgd1; - } - Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; + Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + Cgd = dQsub0_dVd + Cgd1; + break; + case BSIM3v32V32: + default: + Cgd = dQac0_dVd + dQsub0_dVd + Cgd1; + } + Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - Cbd = Cbd1 - dQsub0_dVd; - break; - case BSIM3v32V32: - default: - Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; - } - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + Cbd = Cbd1 - dQsub0_dVd; + break; + case BSIM3v32V32: + default: + Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; + } + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; here->BSIM3v32cggb = Cgg; - here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v32cgdb = Cgd; + here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3v32cgdb = Cgd; here->BSIM3v32cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v32cddb = -(Cgd + Cbd + Csd); + here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3v32cddb = -(Cgd + Cbd + Csd); here->BSIM3v32cbgb = Cbg; - here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v32cbdb = Cbd; + here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3v32cbdb = Cbd; here->BSIM3v32qinv = qinoi; - } + } /* New Charge-Thickness capMod (CTM) begins */ - else if (model->BSIM3v32capMod == 3) - { V3 = here->BSIM3v32vfbzb - Vgs_eff + VbseffCV - DELTA_3; - if (here->BSIM3v32vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM3v32vfbzb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM3v32vfbzb); - T2 = DELTA_3 / T0; - } + else if (model->BSIM3v32capMod == 3) + { V3 = here->BSIM3v32vfbzb - Vgs_eff + VbseffCV - DELTA_3; + if (here->BSIM3v32vfbzb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * here->BSIM3v32vfbzb); + T2 = -DELTA_3 / T0; + } + else + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * here->BSIM3v32vfbzb); + T2 = DELTA_3 / T0; + } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = here->BSIM3v32vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = here->BSIM3v32vfbzb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1 * dVbseffCV_dVb; Cox = model->BSIM3v32cox; Tox = 1.0e8 * model->BSIM3v32tox; @@ -2180,8 +2180,8 @@ for (; model != NULL; model = model->BSIM3v32nextModel) QovCox = Qac0 / Coxeff; dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; + dQac0_dVb = CoxWLcen * dVfbeff_dVb + + QovCox * dCoxeff_dVb; T0 = 0.5 * pParam->BSIM3v32k1ox; T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; @@ -2206,138 +2206,138 @@ for (; model != NULL; model = model->BSIM3v32nextModel) dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) + QovCox * dCoxeff_dVb; - /* Gate-bias dependent delta Phis begins */ - if (pParam->BSIM3v32k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM3v32moin * Vtm; + /* Gate-bias dependent delta Phis begins */ + if (pParam->BSIM3v32k1ox <= 0.0) + { Denomi = 0.25 * pParam->BSIM3v32moin * Vtm; T0 = 0.5 * pParam->BSIM3v32sqrtPhi; - } - else - { Denomi = pParam->BSIM3v32moin * Vtm - * pParam->BSIM3v32k1ox * pParam->BSIM3v32k1ox; + } + else + { Denomi = pParam->BSIM3v32moin * Vtm + * pParam->BSIM3v32k1ox * pParam->BSIM3v32k1ox; T0 = pParam->BSIM3v32k1ox * pParam->BSIM3v32sqrtPhi; - } + } T1 = 2.0 * T0 + Vgsteff; - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; - dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; - /* End of delta Phis */ + DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); + dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); + dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; + dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; + /* End of delta Phis */ T3 = 4.0 * (Vth - here->BSIM3v32vfbzb - pParam->BSIM3v32phi); Tox += Tox; if (T3 >= 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - T0 = (Vgsteff + T3) / Tox; - dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; - dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; - break; - case BSIM3v32V32: - default: - T0 = (Vgsteff + T3) / Tox; - } + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + T0 = (Vgsteff + T3) / Tox; + dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; + dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; + break; + case BSIM3v32V32: + default: + T0 = (Vgsteff + T3) / Tox; + } } else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - T0 = (Vgsteff + 1.0e-20) / Tox; - dT0_dVd = dVgsteff_dVd / Tox; - dT0_dVb = dVgsteff_dVb / Tox; - break; - case BSIM3v32V32: - default: - T0 = (Vgsteff + 1.0e-20) / Tox; - } + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + T0 = (Vgsteff + 1.0e-20) / Tox; + dT0_dVd = dVgsteff_dVd / Tox; + dT0_dVb = dVgsteff_dVb / Tox; + break; + case BSIM3v32V32: + default: + T0 = (Vgsteff + 1.0e-20) / Tox; + } } tmp = exp(0.7 * log(T0)); T1 = 1.0 + tmp; T2 = 0.7 * tmp / (T0 * Tox); Tcen = 1.9e-9 / T1; dTcen_dVg = -1.9e-9 * T2 / T1 /T1; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - dTcen_dVd = Tox * dTcen_dVg; - dTcen_dVb = dTcen_dVd * dT0_dVb; - dTcen_dVd *= dT0_dVd; - break; - case BSIM3v32V32: - default: - dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); - dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); - } + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + dTcen_dVd = Tox * dTcen_dVg; + dTcen_dVb = dTcen_dVd * dT0_dVb; + dTcen_dVd *= dT0_dVd; + break; + case BSIM3v32V32: + default: + dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); + dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); + } dTcen_dVg *= dVgsteff_dVg; - Ccen = EPSSI / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / Cox; + Ccen = EPSSI / Tcen; + T0 = Cox / (Cox + Ccen); + Coxeff = T0 * Ccen; + T1 = -Ccen / Tcen; + dCoxeff_dVg = T0 * T0 * T1; + dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + CoxWLcen = CoxWL * Coxeff / Cox; - AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; - VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi_dVg); - dVdseffCV_dVg = T4; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { - VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } + AbulkCV = Abulk0 * pParam->BSIM3v32abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3v32abulkCVfactor * dAbulk0_dVb; + VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; + V4 = VdsatCV - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + VdseffCV = VdsatCV - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + T4 = T3 * ( 1.0 - dDeltaPhi_dVg); + dVdseffCV_dVg = T4; + dVdseffCV_dVd = T1; + dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ + if (Vds == 0.0) + { + VdseffCV = 0.0; + dVdseffCV_dVg = 0.0; + dVdseffCV_dVb = 0.0; + } + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } T0 = AbulkCV * VdseffCV; - T1 = Vgsteff - DeltaPhi; + T1 = Vgsteff - DeltaPhi; T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); T3 = T0 / T2; T4 = 1.0 - 12.0 * T3 * T3; T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; + T6 = T5 * VdseffCV / AbulkCV; qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + QovCox = qgate / Coxeff; + Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) + + T5 * dVdseffCV_dVg); + Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; T7 = 1.0 - AbulkCV; @@ -2347,95 +2347,95 @@ for (; model != NULL; model = model->BSIM3v32nextModel) T11 = -T7 * T5 / AbulkCV; T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); + QovCox = qbulk / Coxeff; + Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); + Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; if (model->BSIM3v32xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; + { /* 0/100 partition */ + qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 + - 0.5 * T0 * T0 / T2); + QovCox = qsrc / Coxeff; + T2 += T2; + T3 = T2 * T2; + T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV; - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd + + QovCox * dCoxeff_dVd; + Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; } - else if (model->BSIM3v32xpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 + else if (model->BSIM3v32xpart < 0.5) + { /* 40/60 partition */ + T2 = T2 / 12.0; + T3 = 0.5 * CoxWLcen / (T2 * T2); + T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; + qsrc = -T3 * T4; + QovCox = qsrc / Coxeff; + T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; + T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 + * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T6 = AbulkCV * (qsrc / T2 + T3 * T8); + T7 = T6 * VdseffCV / AbulkCV; - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; + Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd + + QovCox * dCoxeff_dVd; + Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb + + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; } - else - { /* 50/50 partition */ + else + { /* 50/50 partition */ qsrc = -0.5 * qgate; Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; + Csd = -0.5 * Cgd1; + Csb = -0.5 * Cgb1; } - qgate += Qac0 + Qsub0 - qbulk; - qbulk -= (Qac0 + Qsub0); + qgate += Qac0 + Qsub0 - qbulk; + qbulk -= (Qac0 + Qsub0); qdrn = -(qgate + qbulk + qsrc); - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; Cgg = Cgg1 - Cbg; Cgd = Cgd1 - Cbd; Cgb = Cgb1 - Cbb; - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; here->BSIM3v32cggb = Cgg; - here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3v32cgdb = Cgd; + here->BSIM3v32cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3v32cgdb = Cgd; here->BSIM3v32cdgb = -(Cgg + Cbg + Csg); - here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3v32cddb = -(Cgd + Cbd + Csd); + here->BSIM3v32cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb); + here->BSIM3v32cddb = -(Cgd + Cbd + Csd); here->BSIM3v32cbgb = Cbg; - here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3v32cbdb = Cbd; + here->BSIM3v32cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3v32cbdb = Cbd; here->BSIM3v32qinv = -qinoi; - } /* End of CTM */ + } /* End of CTM */ } -finished: - /* Returning Values to Calling Routine */ +finished: + /* Returning Values to Calling Routine */ /* * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE */ @@ -2446,197 +2446,197 @@ finished: here->BSIM3v32cd = cdrain; if (ChargeComputationNeeded) - { /* charge storage elements + { /* charge storage elements * bulk-drain and bulk-source depletion capacitances * czbd : zero bias drain junction capacitance * czbs : zero bias source junction capacitance * czbdsw: zero bias drain junction sidewall capacitance - along field oxide + along field oxide * czbssw: zero bias source junction sidewall capacitance - along field oxide - * czbdswg: zero bias drain junction sidewall capacitance - along gate side - * czbsswg: zero bias source junction sidewall capacitance - along gate side + along field oxide + * czbdswg: zero bias drain junction sidewall capacitance + along gate side + * czbsswg: zero bias source junction sidewall capacitance + along gate side */ - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbd = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32drainArea; /*bug fix */ - czbs = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32sourceArea; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbd = model->BSIM3v32unitAreaJctCap * here->BSIM3v32drainArea; - czbs = model->BSIM3v32unitAreaJctCap * here->BSIM3v32sourceArea; - } + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + czbd = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32drainArea; /*bug fix */ + czbs = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32sourceArea; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + czbd = model->BSIM3v32unitAreaJctCap * here->BSIM3v32drainArea; + czbs = model->BSIM3v32unitAreaJctCap * here->BSIM3v32sourceArea; + } if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * here->BSIM3v32drainPerimeter; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbdswg = model->BSIM3v32unitLengthGateSidewallJctCap - * here->BSIM3v32drainPerimeter; - } + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap + * here->BSIM3v32drainPerimeter; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + czbdswg = model->BSIM3v32unitLengthGateSidewallJctCap + * here->BSIM3v32drainPerimeter; + } czbdsw = 0.0; } else { - czbdsw = model->BSIM3v32unitLengthSidewallTempJctCap - * (here->BSIM3v32drainPerimeter - pParam->BSIM3v32weff); - czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * pParam->BSIM3v32weff; + czbdsw = model->BSIM3v32unitLengthSidewallTempJctCap + * (here->BSIM3v32drainPerimeter - pParam->BSIM3v32weff); + czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap + * pParam->BSIM3v32weff; } if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff) { - czbssw = 0.0; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * here->BSIM3v32sourcePerimeter; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap - * here->BSIM3v32sourcePerimeter; - } + czbssw = 0.0; + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap + * here->BSIM3v32sourcePerimeter; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap + * here->BSIM3v32sourcePerimeter; + } } else { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbssw = model->BSIM3v32unitLengthSidewallTempJctCap - * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); - czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * pParam->BSIM3v32weff; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbssw = model->BSIM3v32unitLengthSidewallJctCap - * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); - czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap - * pParam->BSIM3v32weff; - } + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + czbssw = model->BSIM3v32unitLengthSidewallTempJctCap + * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); + czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap + * pParam->BSIM3v32weff; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + czbssw = model->BSIM3v32unitLengthSidewallJctCap + * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); + czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap + * pParam->BSIM3v32weff; + } } MJ = model->BSIM3v32bulkJctBotGradingCoeff; MJSW = model->BSIM3v32bulkJctSideGradingCoeff; - MJSWG = model->BSIM3v32bulkJctGateSideGradingCoeff; + MJSWG = model->BSIM3v32bulkJctGateSideGradingCoeff; /* Source Bulk Junction */ - if (vbs == 0.0) - { *(ckt->CKTstate0 + here->BSIM3v32qbs) = 0.0; + if (vbs == 0.0) + { *(ckt->CKTstate0 + here->BSIM3v32qbs) = 0.0; here->BSIM3v32capbs = czbs + czbssw + czbsswg; - } - else if (vbs < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs / model->BSIM3v32PhiB; - if (MJ == 0.5) + } + else if (vbs < 0.0) + { if (czbs > 0.0) + { arg = 1.0 - vbs / model->BSIM3v32PhiB; + if (MJ == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbs) = model->BSIM3v32PhiB * czbs - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3v32capbs = czbs * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3v32qbs) = 0.0; - here->BSIM3v32capbs = 0.0; - } - if (czbssw > 0.0) - { arg = 1.0 - vbs / model->BSIM3v32PhiBSW; - if (MJSW == 0.5) + *(ckt->CKTstate0 + here->BSIM3v32qbs) = model->BSIM3v32PhiB * czbs + * (1.0 - arg * sarg) / (1.0 - MJ); + here->BSIM3v32capbs = czbs * sarg; + } + else + { *(ckt->CKTstate0 + here->BSIM3v32qbs) = 0.0; + here->BSIM3v32capbs = 0.0; + } + if (czbssw > 0.0) + { arg = 1.0 - vbs / model->BSIM3v32PhiBSW; + if (MJSW == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSW * log(arg)); *(ckt->CKTstate0 + here->BSIM3v32qbs) += model->BSIM3v32PhiBSW * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSW); + * (1.0 - arg * sarg) / (1.0 - MJSW); here->BSIM3v32capbs += czbssw * sarg; - } - if (czbsswg > 0.0) - { arg = 1.0 - vbs / model->BSIM3v32PhiBSWG; - if (MJSWG == 0.5) + } + if (czbsswg > 0.0) + { arg = 1.0 - vbs / model->BSIM3v32PhiBSWG; + if (MJSWG == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSWG * log(arg)); *(ckt->CKTstate0 + here->BSIM3v32qbs) += model->BSIM3v32PhiBSWG * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); + * (1.0 - arg * sarg) / (1.0 - MJSWG); here->BSIM3v32capbs += czbsswg * sarg; - } + } } - else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs * (czbs * MJ / model->BSIM3v32PhiB + czbssw * MJSW - / model->BSIM3v32PhiBSW + czbsswg * MJSWG / model->BSIM3v32PhiBSWG); + else + { T0 = czbs + czbssw + czbsswg; + T1 = vbs * (czbs * MJ / model->BSIM3v32PhiB + czbssw * MJSW + / model->BSIM3v32PhiBSW + czbsswg * MJSWG / model->BSIM3v32PhiBSWG); *(ckt->CKTstate0 + here->BSIM3v32qbs) = vbs * (T0 + 0.5 * T1); here->BSIM3v32capbs = T0 + T1; } /* Drain Bulk Junction */ - if (vbd == 0.0) - { *(ckt->CKTstate0 + here->BSIM3v32qbd) = 0.0; + if (vbd == 0.0) + { *(ckt->CKTstate0 + here->BSIM3v32qbd) = 0.0; here->BSIM3v32capbd = czbd + czbdsw + czbdswg; - } - else if (vbd < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd / model->BSIM3v32PhiB; - if (MJ == 0.5) + } + else if (vbd < 0.0) + { if (czbd > 0.0) + { arg = 1.0 - vbd / model->BSIM3v32PhiB; + if (MJ == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbd) = model->BSIM3v32PhiB * czbd - * (1.0 - arg * sarg) / (1.0 - MJ); + *(ckt->CKTstate0 + here->BSIM3v32qbd) = model->BSIM3v32PhiB * czbd + * (1.0 - arg * sarg) / (1.0 - MJ); here->BSIM3v32capbd = czbd * sarg; - } - else - { *(ckt->CKTstate0 + here->BSIM3v32qbd) = 0.0; + } + else + { *(ckt->CKTstate0 + here->BSIM3v32qbd) = 0.0; here->BSIM3v32capbd = 0.0; - } - if (czbdsw > 0.0) - { arg = 1.0 - vbd / model->BSIM3v32PhiBSW; - if (MJSW == 0.5) + } + if (czbdsw > 0.0) + { arg = 1.0 - vbd / model->BSIM3v32PhiBSW; + if (MJSW == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3v32qbd) += model->BSIM3v32PhiBSW * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSW); + *(ckt->CKTstate0 + here->BSIM3v32qbd) += model->BSIM3v32PhiBSW * czbdsw + * (1.0 - arg * sarg) / (1.0 - MJSW); here->BSIM3v32capbd += czbdsw * sarg; - } - if (czbdswg > 0.0) - { arg = 1.0 - vbd / model->BSIM3v32PhiBSWG; - if (MJSWG == 0.5) + } + if (czbdswg > 0.0) + { arg = 1.0 - vbd / model->BSIM3v32PhiBSWG; + if (MJSWG == 0.5) sarg = 1.0 / sqrt(arg); - else + else sarg = exp(-MJSWG * log(arg)); *(ckt->CKTstate0 + here->BSIM3v32qbd) += model->BSIM3v32PhiBSWG * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); + * (1.0 - arg * sarg) / (1.0 - MJSWG); here->BSIM3v32capbd += czbdswg * sarg; - } + } } - else - { T0 = czbd + czbdsw + czbdswg; + else + { T0 = czbd + czbdsw + czbdswg; T1 = vbd * (czbd * MJ / model->BSIM3v32PhiB + czbdsw * MJSW / model->BSIM3v32PhiBSW + czbdswg * MJSWG / model->BSIM3v32PhiBSWG); *(ckt->CKTstate0 + here->BSIM3v32qbd) = vbd * (T0 + 0.5 * T1); - here->BSIM3v32capbd = T0 + T1; + here->BSIM3v32capbd = T0 + T1; } } @@ -2644,11 +2644,11 @@ finished: * check convergence */ if ((here->BSIM3v32off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; + { if (Check == 1) + { ckt->CKTnoncon++; #ifndef NEWCONV - } - else + } + else { if (here->BSIM3v32mode >= 0) { Idtot = here->BSIM3v32cd + here->BSIM3v32csub - here->BSIM3v32cbd; } @@ -2665,7 +2665,7 @@ finished: tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol; if (fabs(cbhat - Ibtot) > tol) - { ckt->CKTnoncon++; + { ckt->CKTnoncon++; } } #endif /* NEWCONV */ @@ -2680,8 +2680,8 @@ finished: /* bulk and channel charge plus overlaps */ if (!ChargeComputationNeeded) - goto line850; - + goto line850; + #ifndef NOBYPASS line755: #endif @@ -2698,99 +2698,99 @@ line755: gtau_drift = fabs(here->BSIM3v32tconst * qcheq) * ScalingFactor; T0 = pParam->BSIM3v32leffCV * pParam->BSIM3v32leffCV; gtau_diff = 16.0 * here->BSIM3v32u0temp * model->BSIM3v32vtm / T0 - * ScalingFactor; + * ScalingFactor; here->BSIM3v32gtau = gtau_drift + gtau_diff; } - if (model->BSIM3v32capMod == 0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - /* code merge -JX */ - cgdo = pParam->BSIM3v32cgdo; - qgdo = pParam->BSIM3v32cgdo * vgd; - cgso = pParam->BSIM3v32cgso; - qgso = pParam->BSIM3v32cgso * vgs; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - if (vgd < 0.0) - { - cgdo = pParam->BSIM3v32cgdo; - qgdo = pParam->BSIM3v32cgdo * vgd; - } - else - { - cgdo = pParam->BSIM3v32cgdo; - qgdo = pParam->BSIM3v32cgdo * vgd; - } + if (model->BSIM3v32capMod == 0) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + /* code merge -JX */ + cgdo = pParam->BSIM3v32cgdo; + qgdo = pParam->BSIM3v32cgdo * vgd; + cgso = pParam->BSIM3v32cgso; + qgso = pParam->BSIM3v32cgso * vgs; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + if (vgd < 0.0) + { + cgdo = pParam->BSIM3v32cgdo; + qgdo = pParam->BSIM3v32cgdo * vgd; + } + else + { + cgdo = pParam->BSIM3v32cgdo; + qgdo = pParam->BSIM3v32cgdo * vgd; + } - if (vgs < 0.0) - { - cgso = pParam->BSIM3v32cgso; - qgso = pParam->BSIM3v32cgso * vgs; - } - else - { - cgso = pParam->BSIM3v32cgso; - qgso = pParam->BSIM3v32cgso * vgs; - } - } - } - else if (model->BSIM3v32capMod == 1) - { if (vgd < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3v32ckappa); - cgdo = pParam->BSIM3v32cgdo + pParam->BSIM3v32weffCV - * pParam->BSIM3v32cgdl / T1; - qgdo = pParam->BSIM3v32cgdo * vgd - pParam->BSIM3v32weffCV * 0.5 - * pParam->BSIM3v32cgdl * pParam->BSIM3v32ckappa * (T1 - 1.0); - } - else - { cgdo = pParam->BSIM3v32cgdo + pParam->BSIM3v32weffCV - * pParam->BSIM3v32cgdl; - qgdo = (pParam->BSIM3v32weffCV * pParam->BSIM3v32cgdl - + pParam->BSIM3v32cgdo) * vgd; - } + if (vgs < 0.0) + { + cgso = pParam->BSIM3v32cgso; + qgso = pParam->BSIM3v32cgso * vgs; + } + else + { + cgso = pParam->BSIM3v32cgso; + qgso = pParam->BSIM3v32cgso * vgs; + } + } + } + else if (model->BSIM3v32capMod == 1) + { if (vgd < 0.0) + { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3v32ckappa); + cgdo = pParam->BSIM3v32cgdo + pParam->BSIM3v32weffCV + * pParam->BSIM3v32cgdl / T1; + qgdo = pParam->BSIM3v32cgdo * vgd - pParam->BSIM3v32weffCV * 0.5 + * pParam->BSIM3v32cgdl * pParam->BSIM3v32ckappa * (T1 - 1.0); + } + else + { cgdo = pParam->BSIM3v32cgdo + pParam->BSIM3v32weffCV + * pParam->BSIM3v32cgdl; + qgdo = (pParam->BSIM3v32weffCV * pParam->BSIM3v32cgdl + + pParam->BSIM3v32cgdo) * vgd; + } - if (vgs < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3v32ckappa); - cgso = pParam->BSIM3v32cgso + pParam->BSIM3v32weffCV - * pParam->BSIM3v32cgsl / T1; - qgso = pParam->BSIM3v32cgso * vgs - pParam->BSIM3v32weffCV * 0.5 - * pParam->BSIM3v32cgsl * pParam->BSIM3v32ckappa * (T1 - 1.0); - } - else - { cgso = pParam->BSIM3v32cgso + pParam->BSIM3v32weffCV - * pParam->BSIM3v32cgsl; - qgso = (pParam->BSIM3v32weffCV * pParam->BSIM3v32cgsl - + pParam->BSIM3v32cgso) * vgs; - } - } - else - { T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); + if (vgs < 0.0) + { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3v32ckappa); + cgso = pParam->BSIM3v32cgso + pParam->BSIM3v32weffCV + * pParam->BSIM3v32cgsl / T1; + qgso = pParam->BSIM3v32cgso * vgs - pParam->BSIM3v32weffCV * 0.5 + * pParam->BSIM3v32cgsl * pParam->BSIM3v32ckappa * (T1 - 1.0); + } + else + { cgso = pParam->BSIM3v32cgso + pParam->BSIM3v32weffCV + * pParam->BSIM3v32cgsl; + qgso = (pParam->BSIM3v32weffCV * pParam->BSIM3v32cgsl + + pParam->BSIM3v32cgso) * vgs; + } + } + else + { T0 = vgd + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3v32weffCV * pParam->BSIM3v32cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v32ckappa); - cgdo = pParam->BSIM3v32cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3v32cgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->BSIM3v32ckappa * (T4 - 1.0)); + T3 = pParam->BSIM3v32weffCV * pParam->BSIM3v32cgdl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v32ckappa); + cgdo = pParam->BSIM3v32cgdo + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgdo = (pParam->BSIM3v32cgdo + T3) * vgd - T3 * (T2 + + 0.5 * pParam->BSIM3v32ckappa * (T4 - 1.0)); - T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3v32weffCV * pParam->BSIM3v32cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v32ckappa); - cgso = pParam->BSIM3v32cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3v32cgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->BSIM3v32ckappa * (T4 - 1.0)); - } + T0 = vgs + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + T3 = pParam->BSIM3v32weffCV * pParam->BSIM3v32cgsl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v32ckappa); + cgso = pParam->BSIM3v32cgso + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgso = (pParam->BSIM3v32cgso + T3) * vgs - T3 * (T2 + + 0.5 * pParam->BSIM3v32ckappa * (T4 - 1.0)); + } here->BSIM3v32cgdo = cgdo; here->BSIM3v32cgso = cgso; @@ -2827,10 +2827,10 @@ line755: qsrc = -(qgate + qbulk + qdrn); ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.6; + sxpart = 0.6; dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; } else { if (qcheq > 0.0) @@ -2841,7 +2841,7 @@ line755: ggtd = here->BSIM3v32gtd = T0 * here->BSIM3v32cqdb; ggts = here->BSIM3v32gts = T0 * here->BSIM3v32cqsb; ggtb = here->BSIM3v32gtb = T0 * here->BSIM3v32cqbb; - gqdef = ScalingFactor * ag0; + gqdef = ScalingFactor * ag0; gcqgb = here->BSIM3v32cqgb * ag0; gcqdb = here->BSIM3v32cqdb * ag0; @@ -2864,44 +2864,44 @@ line755: gcbdb = -here->BSIM3v32capbd * ag0; gcbsb = -here->BSIM3v32capbs * ag0; - CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV + CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = qdrn / qcheq; - Cdd = here->BSIM3v32cddb; - Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3v32cdgb; - Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3v32xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM3v32xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = qdrn / qcheq; + Cdd = here->BSIM3v32cddb; + Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb + + here->BSIM3v32cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM3v32cdgb; + Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb + + here->BSIM3v32cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - Cds = here->BSIM3v32cdsb; - Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + Cds = here->BSIM3v32cdsb; + Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb + + here->BSIM3v32cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); qgd = qgdo; qgs = qgso; @@ -2943,10 +2943,10 @@ line755: qdrn = -(qgate + qbulk + qsrc); ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = 0.4; + sxpart = 0.4; dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; } else { if (qcheq > 0.0) @@ -2957,7 +2957,7 @@ line755: ggts = here->BSIM3v32gtd = T0 * here->BSIM3v32cqdb; ggtd = here->BSIM3v32gts = T0 * here->BSIM3v32cqsb; ggtb = here->BSIM3v32gtb = T0 * here->BSIM3v32cqbb; - gqdef = ScalingFactor * ag0; + gqdef = ScalingFactor * ag0; gcqgb = here->BSIM3v32cqgb * ag0; gcqdb = here->BSIM3v32cqsb * ag0; @@ -2980,44 +2980,44 @@ line755: gcbdb = -here->BSIM3v32capbd * ag0; gcbsb = -here->BSIM3v32capbs * ag0; - CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV + CoxWL = model->BSIM3v32cox * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = qdrn / qcheq; - Css = here->BSIM3v32cddb; - Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3v32cdgb; - Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3v32xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM3v32xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = qdrn / qcheq; + Css = here->BSIM3v32cddb; + Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb + + here->BSIM3v32cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM3v32cdgb; + Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb + + here->BSIM3v32cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - Csd = here->BSIM3v32cdsb; - Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + Csd = here->BSIM3v32cdsb; + Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb + + here->BSIM3v32cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); qgd = qgdo; qgs = qgso; @@ -3029,7 +3029,7 @@ line755: } } - cqdef = cqcheq = 0.0; + cqdef = cqcheq = 0.0; if (ByPass) goto line860; *(ckt->CKTstate0 + here->BSIM3v32qg) = qgate; @@ -3096,21 +3096,21 @@ line850: gcggb = gcgdb = gcgsb = 0.0; gcbgb = gcbdb = gcbsb = 0.0; - gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; + gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; ggtg = ggtd = ggtb = ggts = 0.0; sxpart = (1.0 - (dxpart = (here->BSIM3v32mode > 0) ? 0.4 : 0.6)); - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; if (here->BSIM3v32nqsMod) - here->BSIM3v32gtau = 16.0 * here->BSIM3v32u0temp * model->BSIM3v32vtm + here->BSIM3v32gtau = 16.0 * here->BSIM3v32u0temp * model->BSIM3v32vtm / pParam->BSIM3v32leffCV / pParam->BSIM3v32leffCV - * ScalingFactor; - else + * ScalingFactor; + else here->BSIM3v32gtau = 0.0; goto line900; - + line860: /* evaluate equivalent charge current */ @@ -3125,9 +3125,9 @@ line860: if (here->BSIM3v32nqsMod) { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; ceqqg += T0; - T1 = qdef * here->BSIM3v32gtau; + T1 = qdef * here->BSIM3v32gtau; ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); + * vbd - ddxpart_dVs * vbs); cqdef = *(ckt->CKTstate0 + here->BSIM3v32cqcdump) - gqdef * qdef; cqcheq = *(ckt->CKTstate0 + here->BSIM3v32cqcheq) - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; @@ -3155,16 +3155,16 @@ line860: line900: if (here->BSIM3v32mode >= 0) - { Gm = here->BSIM3v32gm; + { Gm = here->BSIM3v32gm; Gmbs = here->BSIM3v32gmbs; FwdSum = Gm + Gmbs; RevSum = 0.0; cdreq = model->BSIM3v32type * (cdrain - here->BSIM3v32gds * vds - - Gm * vgs - Gmbs * vbs); + - Gm * vgs - Gmbs * vbs); - ceqbd = -model->BSIM3v32type * (here->BSIM3v32csub - - here->BSIM3v32gbds * vds - here->BSIM3v32gbgs * vgs - - here->BSIM3v32gbbs * vbs); + ceqbd = -model->BSIM3v32type * (here->BSIM3v32csub + - here->BSIM3v32gbds * vds - here->BSIM3v32gbgs * vgs + - here->BSIM3v32gbbs * vbs); ceqbs = 0.0; gbbdp = -here->BSIM3v32gbds; @@ -3180,17 +3180,17 @@ line900: gbspb = 0.0; gbspsp = 0.0; } - else - { Gm = -here->BSIM3v32gm; + else + { Gm = -here->BSIM3v32gm; Gmbs = -here->BSIM3v32gmbs; FwdSum = 0.0; RevSum = -(Gm + Gmbs); cdreq = -model->BSIM3v32type * (cdrain + here->BSIM3v32gds * vds + Gm * vgd + Gmbs * vbd); - ceqbs = -model->BSIM3v32type * (here->BSIM3v32csub - + here->BSIM3v32gbds * vds - here->BSIM3v32gbgs * vgd - - here->BSIM3v32gbbs * vbd); + ceqbs = -model->BSIM3v32type * (here->BSIM3v32csub + + here->BSIM3v32gbds * vds - here->BSIM3v32gbgs * vgd + - here->BSIM3v32gbbs * vbd); ceqbd = 0.0; gbbsp = -here->BSIM3v32gbds; @@ -3207,93 +3207,93 @@ line900: gbspdp = -(gbspg + gbspsp + gbspb); } - if (model->BSIM3v32type > 0) - { ceqbs += (here->BSIM3v32cbs - here->BSIM3v32gbs * vbs); + if (model->BSIM3v32type > 0) + { ceqbs += (here->BSIM3v32cbs - here->BSIM3v32gbs * vbs); ceqbd += (here->BSIM3v32cbd - here->BSIM3v32gbd * vbd); - /* + /* ceqqg = ceqqg; ceqqb = ceqqb; ceqqd = ceqqd; cqdef = cqdef; cqcheq = cqcheq; - */ - } - else - { ceqbs -= (here->BSIM3v32cbs - here->BSIM3v32gbs * vbs); + */ + } + else + { ceqbs -= (here->BSIM3v32cbs - here->BSIM3v32gbs * vbs); ceqbd -= (here->BSIM3v32cbd - here->BSIM3v32gbd * vbd); ceqqg = -ceqqg; ceqqb = -ceqqb; ceqqd = -ceqqd; cqdef = -cqdef; cqcheq = -cqcheq; - } + } - m = here->BSIM3v32m; + m = here->BSIM3v32m; - (*(ckt->CKTrhs + here->BSIM3v32gNode) -= m * ceqqg); - (*(ckt->CKTrhs + here->BSIM3v32bNode) -= m * (ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3v32dNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3v32sNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd)); - if (here->BSIM3v32nqsMod) - *(ckt->CKTrhs + here->BSIM3v32qNode) += m * (cqcheq - cqdef); + (*(ckt->CKTrhs + here->BSIM3v32gNode) -= m * ceqqg); + (*(ckt->CKTrhs + here->BSIM3v32bNode) -= m * (ceqbs + ceqbd + ceqqb)); + (*(ckt->CKTrhs + here->BSIM3v32dNodePrime) += m * (ceqbd - cdreq - ceqqd)); + (*(ckt->CKTrhs + here->BSIM3v32sNodePrime) += m * (cdreq + ceqbs + ceqqg + + ceqqb + ceqqd)); + if (here->BSIM3v32nqsMod) + *(ckt->CKTrhs + here->BSIM3v32qNode) += m * (cqcheq - cqdef); - /* - * load y matrix - */ + /* + * load y matrix + */ - T1 = qdef * here->BSIM3v32gtau; - (*(here->BSIM3v32DdPtr) += m * here->BSIM3v32drainConductance); - (*(here->BSIM3v32GgPtr) += m * (gcggb - ggtg)); - (*(here->BSIM3v32SsPtr) += m * here->BSIM3v32sourceConductance); - (*(here->BSIM3v32BbPtr) += m * (here->BSIM3v32gbd + here->BSIM3v32gbs - - gcbgb - gcbdb - gcbsb - here->BSIM3v32gbbs)); - (*(here->BSIM3v32DPdpPtr) += m * (here->BSIM3v32drainConductance - + here->BSIM3v32gds + here->BSIM3v32gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp)); - (*(here->BSIM3v32SPspPtr) += m * (here->BSIM3v32sourceConductance - + here->BSIM3v32gds + here->BSIM3v32gbs - + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp)); - (*(here->BSIM3v32DdpPtr) -= m * here->BSIM3v32drainConductance); - (*(here->BSIM3v32GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); - (*(here->BSIM3v32GdpPtr) += m * (gcgdb - ggtd)); - (*(here->BSIM3v32GspPtr) += m * (gcgsb - ggts)); - (*(here->BSIM3v32SspPtr) -= m * here->BSIM3v32sourceConductance); - (*(here->BSIM3v32BgPtr) += m * (gcbgb - here->BSIM3v32gbgs)); - (*(here->BSIM3v32BdpPtr) += m * (gcbdb - here->BSIM3v32gbd + gbbdp)); - (*(here->BSIM3v32BspPtr) += m * (gcbsb - here->BSIM3v32gbs + gbbsp)); - (*(here->BSIM3v32DPdPtr) -= m * here->BSIM3v32drainConductance); - (*(here->BSIM3v32DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg)); - (*(here->BSIM3v32DPbPtr) -= m * (here->BSIM3v32gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb)); - (*(here->BSIM3v32DPspPtr) -= m * (here->BSIM3v32gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); - (*(here->BSIM3v32SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg)); - (*(here->BSIM3v32SPsPtr) -= m * here->BSIM3v32sourceConductance); - (*(here->BSIM3v32SPbPtr) -= m * (here->BSIM3v32gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb)); - (*(here->BSIM3v32SPdpPtr) -= m * (here->BSIM3v32gds + RevSum - gcsdb - - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); + T1 = qdef * here->BSIM3v32gtau; + (*(here->BSIM3v32DdPtr) += m * here->BSIM3v32drainConductance); + (*(here->BSIM3v32GgPtr) += m * (gcggb - ggtg)); + (*(here->BSIM3v32SsPtr) += m * here->BSIM3v32sourceConductance); + (*(here->BSIM3v32BbPtr) += m * (here->BSIM3v32gbd + here->BSIM3v32gbs + - gcbgb - gcbdb - gcbsb - here->BSIM3v32gbbs)); + (*(here->BSIM3v32DPdpPtr) += m * (here->BSIM3v32drainConductance + + here->BSIM3v32gds + here->BSIM3v32gbd + + RevSum + gcddb + dxpart * ggtd + + T1 * ddxpart_dVd + gbdpdp)); + (*(here->BSIM3v32SPspPtr) += m * (here->BSIM3v32sourceConductance + + here->BSIM3v32gds + here->BSIM3v32gbs + + FwdSum + gcssb + sxpart * ggts + + T1 * dsxpart_dVs + gbspsp)); + (*(here->BSIM3v32DdpPtr) -= m * here->BSIM3v32drainConductance); + (*(here->BSIM3v32GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); + (*(here->BSIM3v32GdpPtr) += m * (gcgdb - ggtd)); + (*(here->BSIM3v32GspPtr) += m * (gcgsb - ggts)); + (*(here->BSIM3v32SspPtr) -= m * here->BSIM3v32sourceConductance); + (*(here->BSIM3v32BgPtr) += m * (gcbgb - here->BSIM3v32gbgs)); + (*(here->BSIM3v32BdpPtr) += m * (gcbdb - here->BSIM3v32gbd + gbbdp)); + (*(here->BSIM3v32BspPtr) += m * (gcbsb - here->BSIM3v32gbs + gbbsp)); + (*(here->BSIM3v32DPdPtr) -= m * here->BSIM3v32drainConductance); + (*(here->BSIM3v32DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg + + T1 * ddxpart_dVg + gbdpg)); + (*(here->BSIM3v32DPbPtr) -= m * (here->BSIM3v32gbd - Gmbs + gcdgb + gcddb + + gcdsb - dxpart * ggtb + - T1 * ddxpart_dVb - gbdpb)); + (*(here->BSIM3v32DPspPtr) -= m * (here->BSIM3v32gds + FwdSum - gcdsb + - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); + (*(here->BSIM3v32SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg + + T1 * dsxpart_dVg + gbspg)); + (*(here->BSIM3v32SPsPtr) -= m * here->BSIM3v32sourceConductance); + (*(here->BSIM3v32SPbPtr) -= m * (here->BSIM3v32gbs + Gmbs + gcsgb + gcsdb + + gcssb - sxpart * ggtb + - T1 * dsxpart_dVb - gbspb)); + (*(here->BSIM3v32SPdpPtr) -= m * (here->BSIM3v32gds + RevSum - gcsdb + - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); - if (here->BSIM3v32nqsMod) - { - *(here->BSIM3v32QqPtr) += m * (gqdef + here->BSIM3v32gtau); + if (here->BSIM3v32nqsMod) + { + *(here->BSIM3v32QqPtr) += m * (gqdef + here->BSIM3v32gtau); - *(here->BSIM3v32DPqPtr) += m * (dxpart * here->BSIM3v32gtau); - *(here->BSIM3v32SPqPtr) += m * (sxpart * here->BSIM3v32gtau); - *(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau; + *(here->BSIM3v32DPqPtr) += m * (dxpart * here->BSIM3v32gtau); + *(here->BSIM3v32SPqPtr) += m * (sxpart * here->BSIM3v32gtau); + *(here->BSIM3v32GqPtr) -= m * here->BSIM3v32gtau; - *(here->BSIM3v32QgPtr) += m * (ggtg - gcqgb); - *(here->BSIM3v32QdpPtr) += m * (ggtd - gcqdb); - *(here->BSIM3v32QspPtr) += m * (ggts - gcqsb); - *(here->BSIM3v32QbPtr) += m * (ggtb - gcqbb); - } + *(here->BSIM3v32QgPtr) += m * (ggtg - gcqgb); + *(here->BSIM3v32QdpPtr) += m * (ggtd - gcqdb); + *(here->BSIM3v32QspPtr) += m * (ggts - gcqsb); + *(here->BSIM3v32QbPtr) += m * (ggtb - gcqbb); + } line1000: ; diff --git a/src/spicelib/devices/bsim3v32/b3v32mask.c b/src/spicelib/devices/bsim3v32/b3v32mask.c index 70775ab49..d031ce718 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mask.c +++ b/src/spicelib/devices/bsim3v32/b3v32mask.c @@ -24,24 +24,24 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) NG_IGNORE(ckt); - switch(which) + switch(which) { case BSIM3v32_MOD_MOBMOD: - value->iValue = model->BSIM3v32mobMod; + value->iValue = model->BSIM3v32mobMod; return(OK); case BSIM3v32_MOD_PARAMCHK: - value->iValue = model->BSIM3v32paramChk; + value->iValue = model->BSIM3v32paramChk; return(OK); case BSIM3v32_MOD_BINUNIT: - value->iValue = model->BSIM3v32binUnit; + value->iValue = model->BSIM3v32binUnit; return(OK); case BSIM3v32_MOD_CAPMOD: - value->iValue = model->BSIM3v32capMod; + value->iValue = model->BSIM3v32capMod; return(OK); case BSIM3v32_MOD_NOIMOD: - value->iValue = model->BSIM3v32noiMod; + value->iValue = model->BSIM3v32noiMod; return(OK); case BSIM3v32_MOD_ACMMOD: - value->iValue = model->BSIM3v32acmMod; + value->iValue = model->BSIM3v32acmMod; return(OK); case BSIM3v32_MOD_VERSION : value->sValue = model->BSIM3v32version; @@ -94,7 +94,7 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) return(OK); case BSIM3v32_MOD_KETA: value->rValue = model->BSIM3v32keta; - return(OK); + return(OK); case BSIM3v32_MOD_NSUB: value->rValue = model->BSIM3v32nsub; return(OK); @@ -146,50 +146,50 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3v32_MOD_NLX: value->rValue = model->BSIM3v32nlx; return(OK); - case BSIM3v32_MOD_DVT0 : + case BSIM3v32_MOD_DVT0 : value->rValue = model->BSIM3v32dvt0; return(OK); - case BSIM3v32_MOD_DVT1 : + case BSIM3v32_MOD_DVT1 : value->rValue = model->BSIM3v32dvt1; return(OK); - case BSIM3v32_MOD_DVT2 : + case BSIM3v32_MOD_DVT2 : value->rValue = model->BSIM3v32dvt2; return(OK); - case BSIM3v32_MOD_DVT0W : + case BSIM3v32_MOD_DVT0W : value->rValue = model->BSIM3v32dvt0w; return(OK); - case BSIM3v32_MOD_DVT1W : + case BSIM3v32_MOD_DVT1W : value->rValue = model->BSIM3v32dvt1w; return(OK); - case BSIM3v32_MOD_DVT2W : + case BSIM3v32_MOD_DVT2W : value->rValue = model->BSIM3v32dvt2w; return(OK); - case BSIM3v32_MOD_DROUT : + case BSIM3v32_MOD_DROUT : value->rValue = model->BSIM3v32drout; return(OK); - case BSIM3v32_MOD_DSUB : + case BSIM3v32_MOD_DSUB : value->rValue = model->BSIM3v32dsub; return(OK); case BSIM3v32_MOD_VTH0: - value->rValue = model->BSIM3v32vth0; + value->rValue = model->BSIM3v32vth0; return(OK); case BSIM3v32_MOD_UA: - value->rValue = model->BSIM3v32ua; + value->rValue = model->BSIM3v32ua; return(OK); case BSIM3v32_MOD_UA1: - value->rValue = model->BSIM3v32ua1; + value->rValue = model->BSIM3v32ua1; return(OK); case BSIM3v32_MOD_UB: - value->rValue = model->BSIM3v32ub; + value->rValue = model->BSIM3v32ub; return(OK); case BSIM3v32_MOD_UB1: - value->rValue = model->BSIM3v32ub1; + value->rValue = model->BSIM3v32ub1; return(OK); case BSIM3v32_MOD_UC: - value->rValue = model->BSIM3v32uc; + value->rValue = model->BSIM3v32uc; return(OK); case BSIM3v32_MOD_UC1: - value->rValue = model->BSIM3v32uc1; + value->rValue = model->BSIM3v32uc1; return(OK); case BSIM3v32_MOD_U0: value->rValue = model->BSIM3v32u0; @@ -204,44 +204,44 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32delta; return(OK); case BSIM3v32_MOD_RDSW: - value->rValue = model->BSIM3v32rdsw; - return(OK); + value->rValue = model->BSIM3v32rdsw; + return(OK); case BSIM3v32_MOD_PRWG: - value->rValue = model->BSIM3v32prwg; - return(OK); + value->rValue = model->BSIM3v32prwg; + return(OK); case BSIM3v32_MOD_PRWB: - value->rValue = model->BSIM3v32prwb; - return(OK); + value->rValue = model->BSIM3v32prwb; + return(OK); case BSIM3v32_MOD_PRT: - value->rValue = model->BSIM3v32prt; - return(OK); + value->rValue = model->BSIM3v32prt; + return(OK); case BSIM3v32_MOD_ETA0: - value->rValue = model->BSIM3v32eta0; - return(OK); + value->rValue = model->BSIM3v32eta0; + return(OK); case BSIM3v32_MOD_ETAB: - value->rValue = model->BSIM3v32etab; - return(OK); + value->rValue = model->BSIM3v32etab; + return(OK); case BSIM3v32_MOD_PCLM: - value->rValue = model->BSIM3v32pclm; - return(OK); + value->rValue = model->BSIM3v32pclm; + return(OK); case BSIM3v32_MOD_PDIBL1: - value->rValue = model->BSIM3v32pdibl1; - return(OK); + value->rValue = model->BSIM3v32pdibl1; + return(OK); case BSIM3v32_MOD_PDIBL2: - value->rValue = model->BSIM3v32pdibl2; - return(OK); + value->rValue = model->BSIM3v32pdibl2; + return(OK); case BSIM3v32_MOD_PDIBLB: - value->rValue = model->BSIM3v32pdiblb; - return(OK); + value->rValue = model->BSIM3v32pdiblb; + return(OK); case BSIM3v32_MOD_PSCBE1: - value->rValue = model->BSIM3v32pscbe1; - return(OK); + value->rValue = model->BSIM3v32pscbe1; + return(OK); case BSIM3v32_MOD_PSCBE2: - value->rValue = model->BSIM3v32pscbe2; - return(OK); + value->rValue = model->BSIM3v32pscbe2; + return(OK); case BSIM3v32_MOD_PVAG: - value->rValue = model->BSIM3v32pvag; - return(OK); + value->rValue = model->BSIM3v32pvag; + return(OK); case BSIM3v32_MOD_WR: value->rValue = model->BSIM3v32wr; return(OK); @@ -301,7 +301,7 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32dlc; return(OK); case BSIM3v32_MOD_VFBCV: - value->rValue = model->BSIM3v32vfbcv; + value->rValue = model->BSIM3v32vfbcv; return(OK); case BSIM3v32_MOD_ACDE: value->rValue = model->BSIM3v32acde; @@ -334,30 +334,30 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32tpbswg; return(OK); - /* acm model */ - case BSIM3v32_MOD_HDIF: - value->rValue = model->BSIM3v32hdif; - return(OK); - case BSIM3v32_MOD_LDIF: - value->rValue = model->BSIM3v32ldif; - return(OK); - case BSIM3v32_MOD_LD: - value->rValue = model->BSIM3v32ld; - return(OK); - case BSIM3v32_MOD_RD: - value->rValue = model->BSIM3v32rd; - return(OK); - case BSIM3v32_MOD_RS: - value->rValue = model->BSIM3v32rs; - return(OK); - case BSIM3v32_MOD_RDC: - value->rValue = model->BSIM3v32rdc; - return(OK); - case BSIM3v32_MOD_RSC: - value->rValue = model->BSIM3v32rsc; - return(OK); + /* acm model */ + case BSIM3v32_MOD_HDIF: + value->rValue = model->BSIM3v32hdif; + return(OK); + case BSIM3v32_MOD_LDIF: + value->rValue = model->BSIM3v32ldif; + return(OK); + case BSIM3v32_MOD_LD: + value->rValue = model->BSIM3v32ld; + return(OK); + case BSIM3v32_MOD_RD: + value->rValue = model->BSIM3v32rd; + return(OK); + case BSIM3v32_MOD_RS: + value->rValue = model->BSIM3v32rs; + return(OK); + case BSIM3v32_MOD_RDC: + value->rValue = model->BSIM3v32rdc; + return(OK); + case BSIM3v32_MOD_RSC: + value->rValue = model->BSIM3v32rsc; + return(OK); - /* Length dependence */ + /* Length dependence */ case BSIM3v32_MOD_LCDSC : value->rValue = model->BSIM3v32lcdsc; return(OK); @@ -396,7 +396,7 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) return(OK); case BSIM3v32_MOD_LKETA: value->rValue = model->BSIM3v32lketa; - return(OK); + return(OK); case BSIM3v32_MOD_LNSUB: value->rValue = model->BSIM3v32lnsub; return(OK); @@ -448,50 +448,50 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3v32_MOD_LNLX: value->rValue = model->BSIM3v32lnlx; return(OK); - case BSIM3v32_MOD_LDVT0: + case BSIM3v32_MOD_LDVT0: value->rValue = model->BSIM3v32ldvt0; return(OK); - case BSIM3v32_MOD_LDVT1 : + case BSIM3v32_MOD_LDVT1 : value->rValue = model->BSIM3v32ldvt1; return(OK); - case BSIM3v32_MOD_LDVT2 : + case BSIM3v32_MOD_LDVT2 : value->rValue = model->BSIM3v32ldvt2; return(OK); - case BSIM3v32_MOD_LDVT0W : + case BSIM3v32_MOD_LDVT0W : value->rValue = model->BSIM3v32ldvt0w; return(OK); - case BSIM3v32_MOD_LDVT1W : + case BSIM3v32_MOD_LDVT1W : value->rValue = model->BSIM3v32ldvt1w; return(OK); - case BSIM3v32_MOD_LDVT2W : + case BSIM3v32_MOD_LDVT2W : value->rValue = model->BSIM3v32ldvt2w; return(OK); - case BSIM3v32_MOD_LDROUT : + case BSIM3v32_MOD_LDROUT : value->rValue = model->BSIM3v32ldrout; return(OK); - case BSIM3v32_MOD_LDSUB : + case BSIM3v32_MOD_LDSUB : value->rValue = model->BSIM3v32ldsub; return(OK); case BSIM3v32_MOD_LVTH0: - value->rValue = model->BSIM3v32lvth0; + value->rValue = model->BSIM3v32lvth0; return(OK); case BSIM3v32_MOD_LUA: - value->rValue = model->BSIM3v32lua; + value->rValue = model->BSIM3v32lua; return(OK); case BSIM3v32_MOD_LUA1: - value->rValue = model->BSIM3v32lua1; + value->rValue = model->BSIM3v32lua1; return(OK); case BSIM3v32_MOD_LUB: - value->rValue = model->BSIM3v32lub; + value->rValue = model->BSIM3v32lub; return(OK); case BSIM3v32_MOD_LUB1: - value->rValue = model->BSIM3v32lub1; + value->rValue = model->BSIM3v32lub1; return(OK); case BSIM3v32_MOD_LUC: - value->rValue = model->BSIM3v32luc; + value->rValue = model->BSIM3v32luc; return(OK); case BSIM3v32_MOD_LUC1: - value->rValue = model->BSIM3v32luc1; + value->rValue = model->BSIM3v32luc1; return(OK); case BSIM3v32_MOD_LU0: value->rValue = model->BSIM3v32lu0; @@ -506,44 +506,44 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32ldelta; return(OK); case BSIM3v32_MOD_LRDSW: - value->rValue = model->BSIM3v32lrdsw; - return(OK); + value->rValue = model->BSIM3v32lrdsw; + return(OK); case BSIM3v32_MOD_LPRWB: - value->rValue = model->BSIM3v32lprwb; - return(OK); + value->rValue = model->BSIM3v32lprwb; + return(OK); case BSIM3v32_MOD_LPRWG: - value->rValue = model->BSIM3v32lprwg; - return(OK); + value->rValue = model->BSIM3v32lprwg; + return(OK); case BSIM3v32_MOD_LPRT: - value->rValue = model->BSIM3v32lprt; - return(OK); + value->rValue = model->BSIM3v32lprt; + return(OK); case BSIM3v32_MOD_LETA0: - value->rValue = model->BSIM3v32leta0; - return(OK); + value->rValue = model->BSIM3v32leta0; + return(OK); case BSIM3v32_MOD_LETAB: - value->rValue = model->BSIM3v32letab; - return(OK); + value->rValue = model->BSIM3v32letab; + return(OK); case BSIM3v32_MOD_LPCLM: - value->rValue = model->BSIM3v32lpclm; - return(OK); + value->rValue = model->BSIM3v32lpclm; + return(OK); case BSIM3v32_MOD_LPDIBL1: - value->rValue = model->BSIM3v32lpdibl1; - return(OK); + value->rValue = model->BSIM3v32lpdibl1; + return(OK); case BSIM3v32_MOD_LPDIBL2: - value->rValue = model->BSIM3v32lpdibl2; - return(OK); + value->rValue = model->BSIM3v32lpdibl2; + return(OK); case BSIM3v32_MOD_LPDIBLB: - value->rValue = model->BSIM3v32lpdiblb; - return(OK); + value->rValue = model->BSIM3v32lpdiblb; + return(OK); case BSIM3v32_MOD_LPSCBE1: - value->rValue = model->BSIM3v32lpscbe1; - return(OK); + value->rValue = model->BSIM3v32lpscbe1; + return(OK); case BSIM3v32_MOD_LPSCBE2: - value->rValue = model->BSIM3v32lpscbe2; - return(OK); + value->rValue = model->BSIM3v32lpscbe2; + return(OK); case BSIM3v32_MOD_LPVAG: - value->rValue = model->BSIM3v32lpvag; - return(OK); + value->rValue = model->BSIM3v32lpvag; + return(OK); case BSIM3v32_MOD_LWR: value->rValue = model->BSIM3v32lwr; return(OK); @@ -609,7 +609,7 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32lvoffcv; return(OK); - /* Width dependence */ + /* Width dependence */ case BSIM3v32_MOD_WCDSC : value->rValue = model->BSIM3v32wcdsc; return(OK); @@ -648,7 +648,7 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) return(OK); case BSIM3v32_MOD_WKETA: value->rValue = model->BSIM3v32wketa; - return(OK); + return(OK); case BSIM3v32_MOD_WNSUB: value->rValue = model->BSIM3v32wnsub; return(OK); @@ -700,50 +700,50 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3v32_MOD_WNLX: value->rValue = model->BSIM3v32wnlx; return(OK); - case BSIM3v32_MOD_WDVT0: + case BSIM3v32_MOD_WDVT0: value->rValue = model->BSIM3v32wdvt0; return(OK); - case BSIM3v32_MOD_WDVT1 : + case BSIM3v32_MOD_WDVT1 : value->rValue = model->BSIM3v32wdvt1; return(OK); - case BSIM3v32_MOD_WDVT2 : + case BSIM3v32_MOD_WDVT2 : value->rValue = model->BSIM3v32wdvt2; return(OK); - case BSIM3v32_MOD_WDVT0W : + case BSIM3v32_MOD_WDVT0W : value->rValue = model->BSIM3v32wdvt0w; return(OK); - case BSIM3v32_MOD_WDVT1W : + case BSIM3v32_MOD_WDVT1W : value->rValue = model->BSIM3v32wdvt1w; return(OK); - case BSIM3v32_MOD_WDVT2W : + case BSIM3v32_MOD_WDVT2W : value->rValue = model->BSIM3v32wdvt2w; return(OK); - case BSIM3v32_MOD_WDROUT : + case BSIM3v32_MOD_WDROUT : value->rValue = model->BSIM3v32wdrout; return(OK); - case BSIM3v32_MOD_WDSUB : + case BSIM3v32_MOD_WDSUB : value->rValue = model->BSIM3v32wdsub; return(OK); case BSIM3v32_MOD_WVTH0: - value->rValue = model->BSIM3v32wvth0; + value->rValue = model->BSIM3v32wvth0; return(OK); case BSIM3v32_MOD_WUA: - value->rValue = model->BSIM3v32wua; + value->rValue = model->BSIM3v32wua; return(OK); case BSIM3v32_MOD_WUA1: - value->rValue = model->BSIM3v32wua1; + value->rValue = model->BSIM3v32wua1; return(OK); case BSIM3v32_MOD_WUB: - value->rValue = model->BSIM3v32wub; + value->rValue = model->BSIM3v32wub; return(OK); case BSIM3v32_MOD_WUB1: - value->rValue = model->BSIM3v32wub1; + value->rValue = model->BSIM3v32wub1; return(OK); case BSIM3v32_MOD_WUC: - value->rValue = model->BSIM3v32wuc; + value->rValue = model->BSIM3v32wuc; return(OK); case BSIM3v32_MOD_WUC1: - value->rValue = model->BSIM3v32wuc1; + value->rValue = model->BSIM3v32wuc1; return(OK); case BSIM3v32_MOD_WU0: value->rValue = model->BSIM3v32wu0; @@ -758,44 +758,44 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32wdelta; return(OK); case BSIM3v32_MOD_WRDSW: - value->rValue = model->BSIM3v32wrdsw; - return(OK); + value->rValue = model->BSIM3v32wrdsw; + return(OK); case BSIM3v32_MOD_WPRWB: - value->rValue = model->BSIM3v32wprwb; - return(OK); + value->rValue = model->BSIM3v32wprwb; + return(OK); case BSIM3v32_MOD_WPRWG: - value->rValue = model->BSIM3v32wprwg; - return(OK); + value->rValue = model->BSIM3v32wprwg; + return(OK); case BSIM3v32_MOD_WPRT: - value->rValue = model->BSIM3v32wprt; - return(OK); + value->rValue = model->BSIM3v32wprt; + return(OK); case BSIM3v32_MOD_WETA0: - value->rValue = model->BSIM3v32weta0; - return(OK); + value->rValue = model->BSIM3v32weta0; + return(OK); case BSIM3v32_MOD_WETAB: - value->rValue = model->BSIM3v32wetab; - return(OK); + value->rValue = model->BSIM3v32wetab; + return(OK); case BSIM3v32_MOD_WPCLM: - value->rValue = model->BSIM3v32wpclm; - return(OK); + value->rValue = model->BSIM3v32wpclm; + return(OK); case BSIM3v32_MOD_WPDIBL1: - value->rValue = model->BSIM3v32wpdibl1; - return(OK); + value->rValue = model->BSIM3v32wpdibl1; + return(OK); case BSIM3v32_MOD_WPDIBL2: - value->rValue = model->BSIM3v32wpdibl2; - return(OK); + value->rValue = model->BSIM3v32wpdibl2; + return(OK); case BSIM3v32_MOD_WPDIBLB: - value->rValue = model->BSIM3v32wpdiblb; - return(OK); + value->rValue = model->BSIM3v32wpdiblb; + return(OK); case BSIM3v32_MOD_WPSCBE1: - value->rValue = model->BSIM3v32wpscbe1; - return(OK); + value->rValue = model->BSIM3v32wpscbe1; + return(OK); case BSIM3v32_MOD_WPSCBE2: - value->rValue = model->BSIM3v32wpscbe2; - return(OK); + value->rValue = model->BSIM3v32wpscbe2; + return(OK); case BSIM3v32_MOD_WPVAG: - value->rValue = model->BSIM3v32wpvag; - return(OK); + value->rValue = model->BSIM3v32wpvag; + return(OK); case BSIM3v32_MOD_WWR: value->rValue = model->BSIM3v32wwr; return(OK); @@ -861,7 +861,7 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32wvoffcv; return(OK); - /* Cross-term dependence */ + /* Cross-term dependence */ case BSIM3v32_MOD_PCDSC : value->rValue = model->BSIM3v32pcdsc; return(OK); @@ -900,7 +900,7 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) return(OK); case BSIM3v32_MOD_PKETA: value->rValue = model->BSIM3v32pketa; - return(OK); + return(OK); case BSIM3v32_MOD_PNSUB: value->rValue = model->BSIM3v32pnsub; return(OK); @@ -952,50 +952,50 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3v32_MOD_PNLX: value->rValue = model->BSIM3v32pnlx; return(OK); - case BSIM3v32_MOD_PDVT0 : + case BSIM3v32_MOD_PDVT0 : value->rValue = model->BSIM3v32pdvt0; return(OK); - case BSIM3v32_MOD_PDVT1 : + case BSIM3v32_MOD_PDVT1 : value->rValue = model->BSIM3v32pdvt1; return(OK); - case BSIM3v32_MOD_PDVT2 : + case BSIM3v32_MOD_PDVT2 : value->rValue = model->BSIM3v32pdvt2; return(OK); - case BSIM3v32_MOD_PDVT0W : + case BSIM3v32_MOD_PDVT0W : value->rValue = model->BSIM3v32pdvt0w; return(OK); - case BSIM3v32_MOD_PDVT1W : + case BSIM3v32_MOD_PDVT1W : value->rValue = model->BSIM3v32pdvt1w; return(OK); - case BSIM3v32_MOD_PDVT2W : - value->rValue = model->BSIM3v32pdvt2w; + case BSIM3v32_MOD_PDVT2W : + value->rValue = model->BSIM3v32pdvt2w; return(OK); - case BSIM3v32_MOD_PDROUT : - value->rValue = model->BSIM3v32pdrout; + case BSIM3v32_MOD_PDROUT : + value->rValue = model->BSIM3v32pdrout; return(OK); - case BSIM3v32_MOD_PDSUB : - value->rValue = model->BSIM3v32pdsub; + case BSIM3v32_MOD_PDSUB : + value->rValue = model->BSIM3v32pdsub; return(OK); case BSIM3v32_MOD_PVTH0: - value->rValue = model->BSIM3v32pvth0; + value->rValue = model->BSIM3v32pvth0; return(OK); case BSIM3v32_MOD_PUA: - value->rValue = model->BSIM3v32pua; + value->rValue = model->BSIM3v32pua; return(OK); case BSIM3v32_MOD_PUA1: - value->rValue = model->BSIM3v32pua1; + value->rValue = model->BSIM3v32pua1; return(OK); case BSIM3v32_MOD_PUB: - value->rValue = model->BSIM3v32pub; + value->rValue = model->BSIM3v32pub; return(OK); case BSIM3v32_MOD_PUB1: - value->rValue = model->BSIM3v32pub1; + value->rValue = model->BSIM3v32pub1; return(OK); case BSIM3v32_MOD_PUC: - value->rValue = model->BSIM3v32puc; + value->rValue = model->BSIM3v32puc; return(OK); case BSIM3v32_MOD_PUC1: - value->rValue = model->BSIM3v32puc1; + value->rValue = model->BSIM3v32puc1; return(OK); case BSIM3v32_MOD_PU0: value->rValue = model->BSIM3v32pu0; @@ -1010,44 +1010,44 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32pdelta; return(OK); case BSIM3v32_MOD_PRDSW: - value->rValue = model->BSIM3v32prdsw; - return(OK); + value->rValue = model->BSIM3v32prdsw; + return(OK); case BSIM3v32_MOD_PPRWB: - value->rValue = model->BSIM3v32pprwb; - return(OK); + value->rValue = model->BSIM3v32pprwb; + return(OK); case BSIM3v32_MOD_PPRWG: - value->rValue = model->BSIM3v32pprwg; - return(OK); + value->rValue = model->BSIM3v32pprwg; + return(OK); case BSIM3v32_MOD_PPRT: - value->rValue = model->BSIM3v32pprt; - return(OK); + value->rValue = model->BSIM3v32pprt; + return(OK); case BSIM3v32_MOD_PETA0: - value->rValue = model->BSIM3v32peta0; - return(OK); + value->rValue = model->BSIM3v32peta0; + return(OK); case BSIM3v32_MOD_PETAB: - value->rValue = model->BSIM3v32petab; - return(OK); + value->rValue = model->BSIM3v32petab; + return(OK); case BSIM3v32_MOD_PPCLM: - value->rValue = model->BSIM3v32ppclm; - return(OK); + value->rValue = model->BSIM3v32ppclm; + return(OK); case BSIM3v32_MOD_PPDIBL1: - value->rValue = model->BSIM3v32ppdibl1; - return(OK); + value->rValue = model->BSIM3v32ppdibl1; + return(OK); case BSIM3v32_MOD_PPDIBL2: - value->rValue = model->BSIM3v32ppdibl2; - return(OK); + value->rValue = model->BSIM3v32ppdibl2; + return(OK); case BSIM3v32_MOD_PPDIBLB: - value->rValue = model->BSIM3v32ppdiblb; - return(OK); + value->rValue = model->BSIM3v32ppdiblb; + return(OK); case BSIM3v32_MOD_PPSCBE1: - value->rValue = model->BSIM3v32ppscbe1; - return(OK); + value->rValue = model->BSIM3v32ppscbe1; + return(OK); case BSIM3v32_MOD_PPSCBE2: - value->rValue = model->BSIM3v32ppscbe2; - return(OK); + value->rValue = model->BSIM3v32ppscbe2; + return(OK); case BSIM3v32_MOD_PPVAG: - value->rValue = model->BSIM3v32ppvag; - return(OK); + value->rValue = model->BSIM3v32ppvag; + return(OK); case BSIM3v32_MOD_PWR: value->rValue = model->BSIM3v32pwr; return(OK); @@ -1114,64 +1114,64 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) return(OK); case BSIM3v32_MOD_TNOM : - value->rValue = model->BSIM3v32tnom; + value->rValue = model->BSIM3v32tnom; return(OK); case BSIM3v32_MOD_CGSO: - value->rValue = model->BSIM3v32cgso; + value->rValue = model->BSIM3v32cgso; return(OK); case BSIM3v32_MOD_CGDO: - value->rValue = model->BSIM3v32cgdo; + value->rValue = model->BSIM3v32cgdo; return(OK); case BSIM3v32_MOD_CGBO: - value->rValue = model->BSIM3v32cgbo; + value->rValue = model->BSIM3v32cgbo; return(OK); case BSIM3v32_MOD_XPART: - value->rValue = model->BSIM3v32xpart; + value->rValue = model->BSIM3v32xpart; return(OK); case BSIM3v32_MOD_RSH: - value->rValue = model->BSIM3v32sheetResistance; + value->rValue = model->BSIM3v32sheetResistance; return(OK); case BSIM3v32_MOD_JS: - value->rValue = model->BSIM3v32jctSatCurDensity; + value->rValue = model->BSIM3v32jctSatCurDensity; return(OK); case BSIM3v32_MOD_JSW: - value->rValue = model->BSIM3v32jctSidewallSatCurDensity; + value->rValue = model->BSIM3v32jctSidewallSatCurDensity; return(OK); case BSIM3v32_MOD_PB: - value->rValue = model->BSIM3v32bulkJctPotential; + value->rValue = model->BSIM3v32bulkJctPotential; return(OK); case BSIM3v32_MOD_MJ: - value->rValue = model->BSIM3v32bulkJctBotGradingCoeff; + value->rValue = model->BSIM3v32bulkJctBotGradingCoeff; return(OK); case BSIM3v32_MOD_PBSW: - value->rValue = model->BSIM3v32sidewallJctPotential; + value->rValue = model->BSIM3v32sidewallJctPotential; return(OK); case BSIM3v32_MOD_MJSW: - value->rValue = model->BSIM3v32bulkJctSideGradingCoeff; + value->rValue = model->BSIM3v32bulkJctSideGradingCoeff; return(OK); case BSIM3v32_MOD_CJ: - value->rValue = model->BSIM3v32unitAreaJctCap; + value->rValue = model->BSIM3v32unitAreaJctCap; return(OK); case BSIM3v32_MOD_CJSW: - value->rValue = model->BSIM3v32unitLengthSidewallJctCap; + value->rValue = model->BSIM3v32unitLengthSidewallJctCap; return(OK); case BSIM3v32_MOD_PBSWG: - value->rValue = model->BSIM3v32GatesidewallJctPotential; + value->rValue = model->BSIM3v32GatesidewallJctPotential; return(OK); case BSIM3v32_MOD_MJSWG: - value->rValue = model->BSIM3v32bulkJctGateSideGradingCoeff; + value->rValue = model->BSIM3v32bulkJctGateSideGradingCoeff; return(OK); case BSIM3v32_MOD_CJSWG: - value->rValue = model->BSIM3v32unitLengthGateSidewallJctCap; + value->rValue = model->BSIM3v32unitLengthGateSidewallJctCap; return(OK); case BSIM3v32_MOD_NJ: - value->rValue = model->BSIM3v32jctEmissionCoeff; + value->rValue = model->BSIM3v32jctEmissionCoeff; return(OK); case BSIM3v32_MOD_XTI: - value->rValue = model->BSIM3v32jctTempExponent; + value->rValue = model->BSIM3v32jctTempExponent; return(OK); case BSIM3v32_MOD_LINT: - value->rValue = model->BSIM3v32Lint; + value->rValue = model->BSIM3v32Lint; return(OK); case BSIM3v32_MOD_LL: value->rValue = model->BSIM3v32Ll; @@ -1238,11 +1238,11 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) return(OK); case BSIM3v32_MOD_XL: - value->rValue = model->BSIM3v32xl; - return(OK); + value->rValue = model->BSIM3v32xl; + return(OK); case BSIM3v32_MOD_XW: - value->rValue = model->BSIM3v32xw; - return(OK); + value->rValue = model->BSIM3v32xw; + return(OK); case BSIM3v32_MOD_NOIA: value->rValue = model->BSIM3v32oxideTrapDensityA; diff --git a/src/spicelib/devices/bsim3v32/b3v32mdel.c b/src/spicelib/devices/bsim3v32/b3v32mdel.c index 27f437819..2558d7bfe 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mdel.c +++ b/src/spicelib/devices/bsim3v32/b3v32mdel.c @@ -3,7 +3,7 @@ /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3mdel.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Paolo Nenzi 2002 @@ -24,10 +24,10 @@ BSIM3v32instance *prev = NULL; BSIM3v32model **oldmod; oldmod = model; - for (; *model ; model = &((*model)->BSIM3v32nextModel)) - { if ((*model)->BSIM3v32modName == modname || + for (; *model ; model = &((*model)->BSIM3v32nextModel)) + { if ((*model)->BSIM3v32modName == modname || (modfast && *model == modfast)) - goto delgot; + goto delgot; oldmod = model; } return(E_NOMOD); @@ -44,4 +44,3 @@ delgot: } - diff --git a/src/spicelib/devices/bsim3v32/b3v32mpar.c b/src/spicelib/devices/bsim3v32/b3v32mpar.c index d35d51ba4..6ca123156 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mpar.c +++ b/src/spicelib/devices/bsim3v32/b3v32mpar.c @@ -3,7 +3,7 @@ /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3mpar.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 @@ -92,12 +92,12 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32a0 = value->rValue; mod->BSIM3v32a0Given = TRUE; break; - + case BSIM3v32_MOD_AGS: mod->BSIM3v32ags= value->rValue; mod->BSIM3v32agsGiven = TRUE; break; - + case BSIM3v32_MOD_A1: mod->BSIM3v32a1 = value->rValue; mod->BSIM3v32a1Given = TRUE; @@ -113,7 +113,7 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_KETA: mod->BSIM3v32keta = value->rValue; mod->BSIM3v32ketaGiven = TRUE; - break; + break; case BSIM3v32_MOD_NSUB: mod->BSIM3v32nsub = value->rValue; mod->BSIM3v32nsubGiven = TRUE; @@ -121,14 +121,14 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_NPEAK: mod->BSIM3v32npeak = value->rValue; mod->BSIM3v32npeakGiven = TRUE; - if (mod->BSIM3v32npeak > 1.0e20) - mod->BSIM3v32npeak *= 1.0e-6; + if (mod->BSIM3v32npeak > 1.0e20) + mod->BSIM3v32npeak *= 1.0e-6; break; case BSIM3v32_MOD_NGATE: mod->BSIM3v32ngate = value->rValue; mod->BSIM3v32ngateGiven = TRUE; - if (mod->BSIM3v32ngate > 1.0e23) - mod->BSIM3v32ngate *= 1.0e-6; + if (mod->BSIM3v32ngate > 1.0e23) + mod->BSIM3v32ngate *= 1.0e-6; break; case BSIM3v32_MOD_GAMMA1: mod->BSIM3v32gamma1 = value->rValue; @@ -186,35 +186,35 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32w0 = value->rValue; mod->BSIM3v32w0Given = TRUE; break; - case BSIM3v32_MOD_DVT0: + case BSIM3v32_MOD_DVT0: mod->BSIM3v32dvt0 = value->rValue; mod->BSIM3v32dvt0Given = TRUE; break; - case BSIM3v32_MOD_DVT1: + case BSIM3v32_MOD_DVT1: mod->BSIM3v32dvt1 = value->rValue; mod->BSIM3v32dvt1Given = TRUE; break; - case BSIM3v32_MOD_DVT2: + case BSIM3v32_MOD_DVT2: mod->BSIM3v32dvt2 = value->rValue; mod->BSIM3v32dvt2Given = TRUE; break; - case BSIM3v32_MOD_DVT0W: + case BSIM3v32_MOD_DVT0W: mod->BSIM3v32dvt0w = value->rValue; mod->BSIM3v32dvt0wGiven = TRUE; break; - case BSIM3v32_MOD_DVT1W: + case BSIM3v32_MOD_DVT1W: mod->BSIM3v32dvt1w = value->rValue; mod->BSIM3v32dvt1wGiven = TRUE; break; - case BSIM3v32_MOD_DVT2W: + case BSIM3v32_MOD_DVT2W: mod->BSIM3v32dvt2w = value->rValue; mod->BSIM3v32dvt2wGiven = TRUE; break; - case BSIM3v32_MOD_DROUT: + case BSIM3v32_MOD_DROUT: mod->BSIM3v32drout = value->rValue; mod->BSIM3v32droutGiven = TRUE; break; - case BSIM3v32_MOD_DSUB: + case BSIM3v32_MOD_DSUB: mod->BSIM3v32dsub = value->rValue; mod->BSIM3v32dsubGiven = TRUE; break; @@ -265,55 +265,55 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_RDSW: mod->BSIM3v32rdsw = value->rValue; mod->BSIM3v32rdswGiven = TRUE; - break; + break; case BSIM3v32_MOD_PRWG: mod->BSIM3v32prwg = value->rValue; mod->BSIM3v32prwgGiven = TRUE; - break; + break; case BSIM3v32_MOD_PRWB: mod->BSIM3v32prwb = value->rValue; mod->BSIM3v32prwbGiven = TRUE; - break; + break; case BSIM3v32_MOD_PRT: mod->BSIM3v32prt = value->rValue; mod->BSIM3v32prtGiven = TRUE; - break; + break; case BSIM3v32_MOD_ETA0: mod->BSIM3v32eta0 = value->rValue; mod->BSIM3v32eta0Given = TRUE; - break; + break; case BSIM3v32_MOD_ETAB: mod->BSIM3v32etab = value->rValue; mod->BSIM3v32etabGiven = TRUE; - break; + break; case BSIM3v32_MOD_PCLM: mod->BSIM3v32pclm = value->rValue; mod->BSIM3v32pclmGiven = TRUE; - break; + break; case BSIM3v32_MOD_PDIBL1: mod->BSIM3v32pdibl1 = value->rValue; mod->BSIM3v32pdibl1Given = TRUE; - break; + break; case BSIM3v32_MOD_PDIBL2: mod->BSIM3v32pdibl2 = value->rValue; mod->BSIM3v32pdibl2Given = TRUE; - break; + break; case BSIM3v32_MOD_PDIBLB: mod->BSIM3v32pdiblb = value->rValue; mod->BSIM3v32pdiblbGiven = TRUE; - break; + break; case BSIM3v32_MOD_PSCBE1: mod->BSIM3v32pscbe1 = value->rValue; mod->BSIM3v32pscbe1Given = TRUE; - break; + break; case BSIM3v32_MOD_PSCBE2: mod->BSIM3v32pscbe2 = value->rValue; mod->BSIM3v32pscbe2Given = TRUE; - break; + break; case BSIM3v32_MOD_PVAG: mod->BSIM3v32pvag = value->rValue; mod->BSIM3v32pvagGiven = TRUE; - break; + break; case BSIM3v32_MOD_WR : mod->BSIM3v32wr = value->rValue; mod->BSIM3v32wrGiven = TRUE; @@ -466,7 +466,7 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32rscGiven = TRUE; break; - /* Length dependence */ + /* Length dependence */ case BSIM3v32_MOD_LCDSC : mod->BSIM3v32lcdsc = value->rValue; mod->BSIM3v32lcdscGiven = TRUE; @@ -497,8 +497,8 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32lvsat = value->rValue; mod->BSIM3v32lvsatGiven = TRUE; break; - - + + case BSIM3v32_MOD_LA0: mod->BSIM3v32la0 = value->rValue; mod->BSIM3v32la0Given = TRUE; @@ -522,7 +522,7 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_LKETA: mod->BSIM3v32lketa = value->rValue; mod->BSIM3v32lketaGiven = TRUE; - break; + break; case BSIM3v32_MOD_LNSUB: mod->BSIM3v32lnsub = value->rValue; mod->BSIM3v32lnsubGiven = TRUE; @@ -530,14 +530,14 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_LNPEAK: mod->BSIM3v32lnpeak = value->rValue; mod->BSIM3v32lnpeakGiven = TRUE; - if (mod->BSIM3v32lnpeak > 1.0e20) - mod->BSIM3v32lnpeak *= 1.0e-6; + if (mod->BSIM3v32lnpeak > 1.0e20) + mod->BSIM3v32lnpeak *= 1.0e-6; break; case BSIM3v32_MOD_LNGATE: mod->BSIM3v32lngate = value->rValue; mod->BSIM3v32lngateGiven = TRUE; - if (mod->BSIM3v32lngate > 1.0e23) - mod->BSIM3v32lngate *= 1.0e-6; + if (mod->BSIM3v32lngate > 1.0e23) + mod->BSIM3v32lngate *= 1.0e-6; break; case BSIM3v32_MOD_LGAMMA1: mod->BSIM3v32lgamma1 = value->rValue; @@ -595,35 +595,35 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32lw0 = value->rValue; mod->BSIM3v32lw0Given = TRUE; break; - case BSIM3v32_MOD_LDVT0: + case BSIM3v32_MOD_LDVT0: mod->BSIM3v32ldvt0 = value->rValue; mod->BSIM3v32ldvt0Given = TRUE; break; - case BSIM3v32_MOD_LDVT1: + case BSIM3v32_MOD_LDVT1: mod->BSIM3v32ldvt1 = value->rValue; mod->BSIM3v32ldvt1Given = TRUE; break; - case BSIM3v32_MOD_LDVT2: + case BSIM3v32_MOD_LDVT2: mod->BSIM3v32ldvt2 = value->rValue; mod->BSIM3v32ldvt2Given = TRUE; break; - case BSIM3v32_MOD_LDVT0W: + case BSIM3v32_MOD_LDVT0W: mod->BSIM3v32ldvt0w = value->rValue; mod->BSIM3v32ldvt0wGiven = TRUE; break; - case BSIM3v32_MOD_LDVT1W: + case BSIM3v32_MOD_LDVT1W: mod->BSIM3v32ldvt1w = value->rValue; mod->BSIM3v32ldvt1wGiven = TRUE; break; - case BSIM3v32_MOD_LDVT2W: + case BSIM3v32_MOD_LDVT2W: mod->BSIM3v32ldvt2w = value->rValue; mod->BSIM3v32ldvt2wGiven = TRUE; break; - case BSIM3v32_MOD_LDROUT: + case BSIM3v32_MOD_LDROUT: mod->BSIM3v32ldrout = value->rValue; mod->BSIM3v32ldroutGiven = TRUE; break; - case BSIM3v32_MOD_LDSUB: + case BSIM3v32_MOD_LDSUB: mod->BSIM3v32ldsub = value->rValue; mod->BSIM3v32ldsubGiven = TRUE; break; @@ -674,55 +674,55 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_LRDSW: mod->BSIM3v32lrdsw = value->rValue; mod->BSIM3v32lrdswGiven = TRUE; - break; + break; case BSIM3v32_MOD_LPRWB: mod->BSIM3v32lprwb = value->rValue; mod->BSIM3v32lprwbGiven = TRUE; - break; + break; case BSIM3v32_MOD_LPRWG: mod->BSIM3v32lprwg = value->rValue; mod->BSIM3v32lprwgGiven = TRUE; - break; + break; case BSIM3v32_MOD_LPRT: mod->BSIM3v32lprt = value->rValue; mod->BSIM3v32lprtGiven = TRUE; - break; + break; case BSIM3v32_MOD_LETA0: mod->BSIM3v32leta0 = value->rValue; mod->BSIM3v32leta0Given = TRUE; - break; + break; case BSIM3v32_MOD_LETAB: mod->BSIM3v32letab = value->rValue; mod->BSIM3v32letabGiven = TRUE; - break; + break; case BSIM3v32_MOD_LPCLM: mod->BSIM3v32lpclm = value->rValue; mod->BSIM3v32lpclmGiven = TRUE; - break; + break; case BSIM3v32_MOD_LPDIBL1: mod->BSIM3v32lpdibl1 = value->rValue; mod->BSIM3v32lpdibl1Given = TRUE; - break; + break; case BSIM3v32_MOD_LPDIBL2: mod->BSIM3v32lpdibl2 = value->rValue; mod->BSIM3v32lpdibl2Given = TRUE; - break; + break; case BSIM3v32_MOD_LPDIBLB: mod->BSIM3v32lpdiblb = value->rValue; mod->BSIM3v32lpdiblbGiven = TRUE; - break; + break; case BSIM3v32_MOD_LPSCBE1: mod->BSIM3v32lpscbe1 = value->rValue; mod->BSIM3v32lpscbe1Given = TRUE; - break; + break; case BSIM3v32_MOD_LPSCBE2: mod->BSIM3v32lpscbe2 = value->rValue; mod->BSIM3v32lpscbe2Given = TRUE; - break; + break; case BSIM3v32_MOD_LPVAG: mod->BSIM3v32lpvag = value->rValue; mod->BSIM3v32lpvagGiven = TRUE; - break; + break; case BSIM3v32_MOD_LWR : mod->BSIM3v32lwr = value->rValue; mod->BSIM3v32lwrGiven = TRUE; @@ -809,13 +809,13 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32lvoffcvGiven = TRUE; break; - /* Width dependence */ + /* Width dependence */ case BSIM3v32_MOD_WCDSC : mod->BSIM3v32wcdsc = value->rValue; mod->BSIM3v32wcdscGiven = TRUE; break; - - + + case BSIM3v32_MOD_WCDSCB : mod->BSIM3v32wcdscb = value->rValue; mod->BSIM3v32wcdscbGiven = TRUE; @@ -865,7 +865,7 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_WKETA: mod->BSIM3v32wketa = value->rValue; mod->BSIM3v32wketaGiven = TRUE; - break; + break; case BSIM3v32_MOD_WNSUB: mod->BSIM3v32wnsub = value->rValue; mod->BSIM3v32wnsubGiven = TRUE; @@ -873,14 +873,14 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_WNPEAK: mod->BSIM3v32wnpeak = value->rValue; mod->BSIM3v32wnpeakGiven = TRUE; - if (mod->BSIM3v32wnpeak > 1.0e20) - mod->BSIM3v32wnpeak *= 1.0e-6; + if (mod->BSIM3v32wnpeak > 1.0e20) + mod->BSIM3v32wnpeak *= 1.0e-6; break; case BSIM3v32_MOD_WNGATE: mod->BSIM3v32wngate = value->rValue; mod->BSIM3v32wngateGiven = TRUE; - if (mod->BSIM3v32wngate > 1.0e23) - mod->BSIM3v32wngate *= 1.0e-6; + if (mod->BSIM3v32wngate > 1.0e23) + mod->BSIM3v32wngate *= 1.0e-6; break; case BSIM3v32_MOD_WGAMMA1: mod->BSIM3v32wgamma1 = value->rValue; @@ -938,35 +938,35 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32ww0 = value->rValue; mod->BSIM3v32ww0Given = TRUE; break; - case BSIM3v32_MOD_WDVT0: + case BSIM3v32_MOD_WDVT0: mod->BSIM3v32wdvt0 = value->rValue; mod->BSIM3v32wdvt0Given = TRUE; break; - case BSIM3v32_MOD_WDVT1: + case BSIM3v32_MOD_WDVT1: mod->BSIM3v32wdvt1 = value->rValue; mod->BSIM3v32wdvt1Given = TRUE; break; - case BSIM3v32_MOD_WDVT2: + case BSIM3v32_MOD_WDVT2: mod->BSIM3v32wdvt2 = value->rValue; mod->BSIM3v32wdvt2Given = TRUE; break; - case BSIM3v32_MOD_WDVT0W: + case BSIM3v32_MOD_WDVT0W: mod->BSIM3v32wdvt0w = value->rValue; mod->BSIM3v32wdvt0wGiven = TRUE; break; - case BSIM3v32_MOD_WDVT1W: + case BSIM3v32_MOD_WDVT1W: mod->BSIM3v32wdvt1w = value->rValue; mod->BSIM3v32wdvt1wGiven = TRUE; break; - case BSIM3v32_MOD_WDVT2W: + case BSIM3v32_MOD_WDVT2W: mod->BSIM3v32wdvt2w = value->rValue; mod->BSIM3v32wdvt2wGiven = TRUE; break; - case BSIM3v32_MOD_WDROUT: + case BSIM3v32_MOD_WDROUT: mod->BSIM3v32wdrout = value->rValue; mod->BSIM3v32wdroutGiven = TRUE; break; - case BSIM3v32_MOD_WDSUB: + case BSIM3v32_MOD_WDSUB: mod->BSIM3v32wdsub = value->rValue; mod->BSIM3v32wdsubGiven = TRUE; break; @@ -1017,55 +1017,55 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_WRDSW: mod->BSIM3v32wrdsw = value->rValue; mod->BSIM3v32wrdswGiven = TRUE; - break; + break; case BSIM3v32_MOD_WPRWB: mod->BSIM3v32wprwb = value->rValue; mod->BSIM3v32wprwbGiven = TRUE; - break; + break; case BSIM3v32_MOD_WPRWG: mod->BSIM3v32wprwg = value->rValue; mod->BSIM3v32wprwgGiven = TRUE; - break; + break; case BSIM3v32_MOD_WPRT: mod->BSIM3v32wprt = value->rValue; mod->BSIM3v32wprtGiven = TRUE; - break; + break; case BSIM3v32_MOD_WETA0: mod->BSIM3v32weta0 = value->rValue; mod->BSIM3v32weta0Given = TRUE; - break; + break; case BSIM3v32_MOD_WETAB: mod->BSIM3v32wetab = value->rValue; mod->BSIM3v32wetabGiven = TRUE; - break; + break; case BSIM3v32_MOD_WPCLM: mod->BSIM3v32wpclm = value->rValue; mod->BSIM3v32wpclmGiven = TRUE; - break; + break; case BSIM3v32_MOD_WPDIBL1: mod->BSIM3v32wpdibl1 = value->rValue; mod->BSIM3v32wpdibl1Given = TRUE; - break; + break; case BSIM3v32_MOD_WPDIBL2: mod->BSIM3v32wpdibl2 = value->rValue; mod->BSIM3v32wpdibl2Given = TRUE; - break; + break; case BSIM3v32_MOD_WPDIBLB: mod->BSIM3v32wpdiblb = value->rValue; mod->BSIM3v32wpdiblbGiven = TRUE; - break; + break; case BSIM3v32_MOD_WPSCBE1: mod->BSIM3v32wpscbe1 = value->rValue; mod->BSIM3v32wpscbe1Given = TRUE; - break; + break; case BSIM3v32_MOD_WPSCBE2: mod->BSIM3v32wpscbe2 = value->rValue; mod->BSIM3v32wpscbe2Given = TRUE; - break; + break; case BSIM3v32_MOD_WPVAG: mod->BSIM3v32wpvag = value->rValue; mod->BSIM3v32wpvagGiven = TRUE; - break; + break; case BSIM3v32_MOD_WWR : mod->BSIM3v32wwr = value->rValue; mod->BSIM3v32wwrGiven = TRUE; @@ -1152,7 +1152,7 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32wvoffcvGiven = TRUE; break; - /* Cross-term dependence */ + /* Cross-term dependence */ case BSIM3v32_MOD_PCDSC : mod->BSIM3v32pcdsc = value->rValue; mod->BSIM3v32pcdscGiven = TRUE; @@ -1208,7 +1208,7 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_PKETA: mod->BSIM3v32pketa = value->rValue; mod->BSIM3v32pketaGiven = TRUE; - break; + break; case BSIM3v32_MOD_PNSUB: mod->BSIM3v32pnsub = value->rValue; mod->BSIM3v32pnsubGiven = TRUE; @@ -1216,14 +1216,14 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_PNPEAK: mod->BSIM3v32pnpeak = value->rValue; mod->BSIM3v32pnpeakGiven = TRUE; - if (mod->BSIM3v32pnpeak > 1.0e20) - mod->BSIM3v32pnpeak *= 1.0e-6; + if (mod->BSIM3v32pnpeak > 1.0e20) + mod->BSIM3v32pnpeak *= 1.0e-6; break; case BSIM3v32_MOD_PNGATE: mod->BSIM3v32pngate = value->rValue; mod->BSIM3v32pngateGiven = TRUE; - if (mod->BSIM3v32pngate > 1.0e23) - mod->BSIM3v32pngate *= 1.0e-6; + if (mod->BSIM3v32pngate > 1.0e23) + mod->BSIM3v32pngate *= 1.0e-6; break; case BSIM3v32_MOD_PGAMMA1: mod->BSIM3v32pgamma1 = value->rValue; @@ -1281,35 +1281,35 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32pw0 = value->rValue; mod->BSIM3v32pw0Given = TRUE; break; - case BSIM3v32_MOD_PDVT0: + case BSIM3v32_MOD_PDVT0: mod->BSIM3v32pdvt0 = value->rValue; mod->BSIM3v32pdvt0Given = TRUE; break; - case BSIM3v32_MOD_PDVT1: + case BSIM3v32_MOD_PDVT1: mod->BSIM3v32pdvt1 = value->rValue; mod->BSIM3v32pdvt1Given = TRUE; break; - case BSIM3v32_MOD_PDVT2: + case BSIM3v32_MOD_PDVT2: mod->BSIM3v32pdvt2 = value->rValue; mod->BSIM3v32pdvt2Given = TRUE; break; - case BSIM3v32_MOD_PDVT0W: + case BSIM3v32_MOD_PDVT0W: mod->BSIM3v32pdvt0w = value->rValue; mod->BSIM3v32pdvt0wGiven = TRUE; break; - case BSIM3v32_MOD_PDVT1W: + case BSIM3v32_MOD_PDVT1W: mod->BSIM3v32pdvt1w = value->rValue; mod->BSIM3v32pdvt1wGiven = TRUE; break; - case BSIM3v32_MOD_PDVT2W: + case BSIM3v32_MOD_PDVT2W: mod->BSIM3v32pdvt2w = value->rValue; mod->BSIM3v32pdvt2wGiven = TRUE; break; - case BSIM3v32_MOD_PDROUT: + case BSIM3v32_MOD_PDROUT: mod->BSIM3v32pdrout = value->rValue; mod->BSIM3v32pdroutGiven = TRUE; break; - case BSIM3v32_MOD_PDSUB: + case BSIM3v32_MOD_PDSUB: mod->BSIM3v32pdsub = value->rValue; mod->BSIM3v32pdsubGiven = TRUE; break; @@ -1360,55 +1360,55 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) case BSIM3v32_MOD_PRDSW: mod->BSIM3v32prdsw = value->rValue; mod->BSIM3v32prdswGiven = TRUE; - break; + break; case BSIM3v32_MOD_PPRWB: mod->BSIM3v32pprwb = value->rValue; mod->BSIM3v32pprwbGiven = TRUE; - break; + break; case BSIM3v32_MOD_PPRWG: mod->BSIM3v32pprwg = value->rValue; mod->BSIM3v32pprwgGiven = TRUE; - break; + break; case BSIM3v32_MOD_PPRT: mod->BSIM3v32pprt = value->rValue; mod->BSIM3v32pprtGiven = TRUE; - break; + break; case BSIM3v32_MOD_PETA0: mod->BSIM3v32peta0 = value->rValue; mod->BSIM3v32peta0Given = TRUE; - break; + break; case BSIM3v32_MOD_PETAB: mod->BSIM3v32petab = value->rValue; mod->BSIM3v32petabGiven = TRUE; - break; + break; case BSIM3v32_MOD_PPCLM: mod->BSIM3v32ppclm = value->rValue; mod->BSIM3v32ppclmGiven = TRUE; - break; + break; case BSIM3v32_MOD_PPDIBL1: mod->BSIM3v32ppdibl1 = value->rValue; mod->BSIM3v32ppdibl1Given = TRUE; - break; + break; case BSIM3v32_MOD_PPDIBL2: mod->BSIM3v32ppdibl2 = value->rValue; mod->BSIM3v32ppdibl2Given = TRUE; - break; + break; case BSIM3v32_MOD_PPDIBLB: mod->BSIM3v32ppdiblb = value->rValue; mod->BSIM3v32ppdiblbGiven = TRUE; - break; + break; case BSIM3v32_MOD_PPSCBE1: mod->BSIM3v32ppscbe1 = value->rValue; mod->BSIM3v32ppscbe1Given = TRUE; - break; + break; case BSIM3v32_MOD_PPSCBE2: mod->BSIM3v32ppscbe2 = value->rValue; mod->BSIM3v32ppscbe2Given = TRUE; - break; + break; case BSIM3v32_MOD_PPVAG: mod->BSIM3v32ppvag = value->rValue; mod->BSIM3v32ppvagGiven = TRUE; - break; + break; case BSIM3v32_MOD_PWR : mod->BSIM3v32pwr = value->rValue; mod->BSIM3v32pwrGiven = TRUE; diff --git a/src/spicelib/devices/bsim3v32/b3v32noi.c b/src/spicelib/devices/bsim3v32/b3v32noi.c index 5f56aedf6..7351a535e 100644 --- a/src/spicelib/devices/bsim3v32/b3v32noi.c +++ b/src/spicelib/devices/bsim3v32/b3v32noi.c @@ -45,7 +45,7 @@ */ -/* +/* * The StrongInversionNoiseEval function has been modified in * the release 3.2.4 of BSIM3v32 model. To accomodate both the old * and the new code, I have renamed according to the following: @@ -63,7 +63,7 @@ static double StrongInversionNoiseEvalNew(double Vds, BSIM3v32model *model, - BSIM3v32instance *here, double freq, double temp) + BSIM3v32instance *here, double freq, double temp) { struct bsim3v32SizeDependParam *pParam; double cd, esat, DelClm, EffFreq, N0, Nl; @@ -72,10 +72,10 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; pParam = here->pParam; cd = fabs(here->BSIM3v32cd); esat = 2.0 * pParam->BSIM3v32vsattemp / here->BSIM3v32ueff; - if(model->BSIM3v32em<=0.0) DelClm = 0.0; - else { - T0 = ((((Vds - here->BSIM3v32Vdseff) / pParam->BSIM3v32litl) - + model->BSIM3v32em) / esat); + if(model->BSIM3v32em<=0.0) DelClm = 0.0; + else { + T0 = ((((Vds - here->BSIM3v32Vdseff) / pParam->BSIM3v32litl) + + model->BSIM3v32em) / esat); DelClm = pParam->BSIM3v32litl * log (MAX(T0, N_MINLOG)); } EffFreq = pow(freq, model->BSIM3v32ef); @@ -84,7 +84,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; * pParam->BSIM3v32leff * pParam->BSIM3v32leff; N0 = model->BSIM3v32cox * here->BSIM3v32Vgsteff / CHARGE; Nl = model->BSIM3v32cox * here->BSIM3v32Vgsteff - * (1.0 - here->BSIM3v32AbovVgst2Vtm * here->BSIM3v32Vdseff) / CHARGE; + * (1.0 - here->BSIM3v32AbovVgst2Vtm * here->BSIM3v32Vdseff) / CHARGE; T3 = model->BSIM3v32oxideTrapDensityA * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); @@ -109,7 +109,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; static double StrongInversionNoiseEvalOld(double vgs, double vds, BSIM3v32model *model, - BSIM3v32instance *here, double freq, double temp) + BSIM3v32instance *here, double freq, double temp) { struct bsim3v32SizeDependParam *pParam; double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; @@ -124,7 +124,7 @@ StrongInversionNoiseEvalOld(double vgs, double vds, BSIM3v32model *model, { esat = 2.0 * pParam->BSIM3v32vsattemp / here->BSIM3v32ueff; T0 = ((((vds - here->BSIM3v32vdsat) / pParam->BSIM3v32litl) + - model->BSIM3v32em) / esat); + model->BSIM3v32em) / esat); DelClm = pParam->BSIM3v32litl * log (MAX (T0, N_MINLOG)); } else @@ -132,13 +132,13 @@ StrongInversionNoiseEvalOld(double vgs, double vds, BSIM3v32model *model, } else { - if (model->BSIM3v32em <= 0.0) /* flicker noise modified -JX */ + if (model->BSIM3v32em <= 0.0) /* flicker noise modified -JX */ DelClm = 0.0; else if (vds > here->BSIM3v32vdsat) { esat = 2.0 * pParam->BSIM3v32vsattemp / here->BSIM3v32ueff; T0 = ((((vds - here->BSIM3v32vdsat) / pParam->BSIM3v32litl) + - model->BSIM3v32em) / esat); + model->BSIM3v32em) / esat); DelClm = pParam->BSIM3v32litl * log (MAX (T0, N_MINLOG)); } else @@ -176,7 +176,7 @@ StrongInversionNoiseEvalOld(double vgs, double vds, BSIM3v32model *model, int BSIM3v32noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, - Ndata *data, double *OnDens) + Ndata *data, double *OnDens) { NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; @@ -200,292 +200,292 @@ int i; /* define the names of the noise sources */ static char *BSIM3v32nNames[BSIM3v32NSRCS] = { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in BSIM3v32defs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ + ".rd", /* noise due to rd */ + /* consistent with the index definitions */ + ".rs", /* noise due to rs */ + /* in BSIM3v32defs.h */ + ".id", /* noise due to id */ + ".1overf", /* flicker (1/f) noise */ + "" /* total transistor noise */ }; for (; model != NULL; model = model->BSIM3v32nextModel) { for (here = model->BSIM3v32instances; here != NULL; - here = here->BSIM3v32nextInstance) - { pParam = here->pParam; - switch (operation) - { case N_OPEN: - /* see if we have to to produce a summary report */ - /* if so, name all the noise generators */ + here = here->BSIM3v32nextInstance) + { pParam = here->pParam; + switch (operation) + { case N_OPEN: + /* see if we have to to produce a summary report */ + /* if so, name all the noise generators */ - if (job->NStpsSm != 0) - { switch (mode) - { case N_DENS: - for (i = 0; i < BSIM3v32NSRCS; i++) - { (void) sprintf(name, "onoise.%s%s", - here->BSIM3v32name, - BSIM3v32nNames[i]); + if (job->NStpsSm != 0) + { switch (mode) + { case N_DENS: + for (i = 0; i < BSIM3v32NSRCS; i++) + { (void) sprintf(name, "onoise.%s%s", + here->BSIM3v32name, + BSIM3v32nNames[i]); data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); if (!data->namelist) - return(E_NOMEM); - SPfrontEnd->IFnewUid (ckt, - &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, - NULL); - /* we've added one more plot */ - } - break; - case INT_NOIZ: - for (i = 0; i < BSIM3v32NSRCS; i++) - { (void) sprintf(name, "onoise_total.%s%s", - here->BSIM3v32name, - BSIM3v32nNames[i]); + return(E_NOMEM); + SPfrontEnd->IFnewUid (ckt, + &(data->namelist[data->numPlots++]), + NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ + } + break; + case INT_NOIZ: + for (i = 0; i < BSIM3v32NSRCS; i++) + { (void) sprintf(name, "onoise_total.%s%s", + here->BSIM3v32name, + BSIM3v32nNames[i]); data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); if (!data->namelist) - return(E_NOMEM); - SPfrontEnd->IFnewUid (ckt, - &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, - NULL); - /* we've added one more plot */ + return(E_NOMEM); + SPfrontEnd->IFnewUid (ckt, + &(data->namelist[data->numPlots++]), + NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ - (void) sprintf(name, "inoise_total.%s%s", - here->BSIM3v32name, - BSIM3v32nNames[i]); + (void) sprintf(name, "inoise_total.%s%s", + here->BSIM3v32name, + BSIM3v32nNames[i]); data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); if (!data->namelist) - return(E_NOMEM); - SPfrontEnd->IFnewUid (ckt, - &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, - NULL); - /* we've added one more plot */ - } - break; - } - } - break; - case N_CALC: - m = here->BSIM3v32m; - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[BSIM3v32RDNOIZ], - &lnNdens[BSIM3v32RDNOIZ], ckt, THERMNOISE, - here->BSIM3v32dNodePrime, here->BSIM3v32dNode, - here->BSIM3v32drainConductance * m); + return(E_NOMEM); + SPfrontEnd->IFnewUid (ckt, + &(data->namelist[data->numPlots++]), + NULL, name, UID_OTHER, + NULL); + /* we've added one more plot */ + } + break; + } + } + break; + case N_CALC: + m = here->BSIM3v32m; + switch (mode) + { case N_DENS: + NevalSrc(&noizDens[BSIM3v32RDNOIZ], + &lnNdens[BSIM3v32RDNOIZ], ckt, THERMNOISE, + here->BSIM3v32dNodePrime, here->BSIM3v32dNode, + here->BSIM3v32drainConductance * m); - NevalSrc(&noizDens[BSIM3v32RSNOIZ], - &lnNdens[BSIM3v32RSNOIZ], ckt, THERMNOISE, - here->BSIM3v32sNodePrime, here->BSIM3v32sNode, - here->BSIM3v32sourceConductance * m); + NevalSrc(&noizDens[BSIM3v32RSNOIZ], + &lnNdens[BSIM3v32RSNOIZ], ckt, THERMNOISE, + here->BSIM3v32sNodePrime, here->BSIM3v32sNode, + here->BSIM3v32sourceConductance * m); switch( model->BSIM3v32noiMod ) - { case 1: - case 3: - NevalSrc(&noizDens[BSIM3v32IDNOIZ], - &lnNdens[BSIM3v32IDNOIZ], ckt, - THERMNOISE, here->BSIM3v32dNodePrime, - here->BSIM3v32sNodePrime, + { case 1: + case 3: + NevalSrc(&noizDens[BSIM3v32IDNOIZ], + &lnNdens[BSIM3v32IDNOIZ], ckt, + THERMNOISE, here->BSIM3v32dNodePrime, + here->BSIM3v32sNodePrime, (2.0 / 3.0 * fabs(here->BSIM3v32gm - + here->BSIM3v32gds - + here->BSIM3v32gmbs)) * m); - break; - case 2: - case 4: - /* Added revision dependent code */ - if (model->BSIM3v32intVersion == BSIM3v32V324) - { - NevalSrc(&noizDens[BSIM3v32IDNOIZ], - &lnNdens[BSIM3v32IDNOIZ], ckt, - THERMNOISE, here->BSIM3v32dNodePrime, + + here->BSIM3v32gds + + here->BSIM3v32gmbs)) * m); + break; + case 2: + case 4: + /* Added revision dependent code */ + if (model->BSIM3v32intVersion == BSIM3v32V324) + { + NevalSrc(&noizDens[BSIM3v32IDNOIZ], + &lnNdens[BSIM3v32IDNOIZ], ckt, + THERMNOISE, here->BSIM3v32dNodePrime, here->BSIM3v32sNodePrime, - (m * here->BSIM3v32ueff - * fabs(here->BSIM3v32qinv) - / (pParam->BSIM3v32leff * pParam->BSIM3v32leff - + here->BSIM3v32ueff * fabs(here->BSIM3v32qinv) - * here->BSIM3v32rds))); /* bugfix */ - } - else - { /* for all versions lower then 3.2.4 */ - NevalSrc(&noizDens[BSIM3v32IDNOIZ], - &lnNdens[BSIM3v32IDNOIZ], ckt, - THERMNOISE, here->BSIM3v32dNodePrime, + (m * here->BSIM3v32ueff + * fabs(here->BSIM3v32qinv) + / (pParam->BSIM3v32leff * pParam->BSIM3v32leff + + here->BSIM3v32ueff * fabs(here->BSIM3v32qinv) + * here->BSIM3v32rds))); /* bugfix */ + } + else + { /* for all versions lower then 3.2.4 */ + NevalSrc(&noizDens[BSIM3v32IDNOIZ], + &lnNdens[BSIM3v32IDNOIZ], ckt, + THERMNOISE, here->BSIM3v32dNodePrime, here->BSIM3v32sNodePrime, - (m * here->BSIM3v32ueff - * fabs(here->BSIM3v32qinv - / (pParam->BSIM3v32leff - * pParam->BSIM3v32leff)))); - } - break; - } - NevalSrc(&noizDens[BSIM3v32FLNOIZ], NULL, - ckt, N_GAIN, here->BSIM3v32dNodePrime, - here->BSIM3v32sNodePrime, (double) 0.0); + (m * here->BSIM3v32ueff + * fabs(here->BSIM3v32qinv + / (pParam->BSIM3v32leff + * pParam->BSIM3v32leff)))); + } + break; + } + NevalSrc(&noizDens[BSIM3v32FLNOIZ], NULL, + ckt, N_GAIN, here->BSIM3v32dNodePrime, + here->BSIM3v32sNodePrime, (double) 0.0); switch( model->BSIM3v32noiMod ) - { case 1: - case 4: - noizDens[BSIM3v32FLNOIZ] *= m * model->BSIM3v32kf - * exp(model->BSIM3v32af - * log(MAX(fabs(here->BSIM3v32cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM3v32ef) - * pParam->BSIM3v32leff - * pParam->BSIM3v32leff - * model->BSIM3v32cox); - break; - case 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->BSIM3v32vgs); - vds = *(ckt->CKTstates[0] + here->BSIM3v32vds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - /* Added revision dependent code */ - if (model->BSIM3v32intVersion == BSIM3v32V324) - { - Ssi = StrongInversionNoiseEvalNew(vds, model, - here, data->freq, ckt->CKTtemp); - T10 = model->BSIM3v32oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3v32weff - * pParam->BSIM3v32leff - * pow(data->freq, model->BSIM3v32ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3v32cd - * here->BSIM3v32cd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM3v32FLNOIZ] *= m * (Ssi * Swi) / T1; - else + { case 1: + case 4: + noizDens[BSIM3v32FLNOIZ] *= m * model->BSIM3v32kf + * exp(model->BSIM3v32af + * log(MAX(fabs(here->BSIM3v32cd), + N_MINLOG))) + / (pow(data->freq, model->BSIM3v32ef) + * pParam->BSIM3v32leff + * pParam->BSIM3v32leff + * model->BSIM3v32cox); + break; + case 2: + case 3: + vgs = *(ckt->CKTstates[0] + here->BSIM3v32vgs); + vds = *(ckt->CKTstates[0] + here->BSIM3v32vds); + if (vds < 0.0) + { vds = -vds; + vgs = vgs + vds; + } + /* Added revision dependent code */ + if (model->BSIM3v32intVersion == BSIM3v32V324) + { + Ssi = StrongInversionNoiseEvalNew(vds, model, + here, data->freq, ckt->CKTtemp); + T10 = model->BSIM3v32oxideTrapDensityA + * 8.62e-5 * ckt->CKTtemp; + T11 = pParam->BSIM3v32weff + * pParam->BSIM3v32leff + * pow(data->freq, model->BSIM3v32ef) + * 4.0e36; + Swi = T10 / T11 * here->BSIM3v32cd + * here->BSIM3v32cd; + T1 = Swi + Ssi; + if (T1 > 0.0) + noizDens[BSIM3v32FLNOIZ] *= m * (Ssi * Swi) / T1; + else noizDens[BSIM3v32FLNOIZ] *= 0.0; - } - else - { /* for all versions lower then 3.2.4 */ - if (vgs >= here->BSIM3v32von + 0.1) - { - Ssi = StrongInversionNoiseEvalOld(vgs, vds, model, - here, data->freq, ckt->CKTtemp); - noizDens[BSIM3v32FLNOIZ] *= m * Ssi; - } - else - { - pParam = here->pParam; - T10 = model->BSIM3v32oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3v32weff - * pParam-> BSIM3v32leff - * pow (data->freq, model->BSIM3v32ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3v32cd * here->BSIM3v32cd; + } + else + { /* for all versions lower then 3.2.4 */ + if (vgs >= here->BSIM3v32von + 0.1) + { + Ssi = StrongInversionNoiseEvalOld(vgs, vds, model, + here, data->freq, ckt->CKTtemp); + noizDens[BSIM3v32FLNOIZ] *= m * Ssi; + } + else + { + pParam = here->pParam; + T10 = model->BSIM3v32oxideTrapDensityA + * 8.62e-5 * ckt->CKTtemp; + T11 = pParam->BSIM3v32weff + * pParam-> BSIM3v32leff + * pow (data->freq, model->BSIM3v32ef) + * 4.0e36; + Swi = T10 / T11 * here->BSIM3v32cd * here->BSIM3v32cd; - Slimit = StrongInversionNoiseEvalOld( - here->BSIM3v32von + 0.1, vds, model, - here, data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[BSIM3v32FLNOIZ] *= m * (Slimit * Swi) / T1; - else - noizDens[BSIM3v32FLNOIZ] *= 0.0; - } - } - break; - } - - lnNdens[BSIM3v32FLNOIZ] = - log(MAX(noizDens[BSIM3v32FLNOIZ], N_MINLOG)); - - noizDens[BSIM3v32TOTNOIZ] = noizDens[BSIM3v32RDNOIZ] - + noizDens[BSIM3v32RSNOIZ] - + noizDens[BSIM3v32IDNOIZ] - + noizDens[BSIM3v32FLNOIZ]; - lnNdens[BSIM3v32TOTNOIZ] = - log(MAX(noizDens[BSIM3v32TOTNOIZ], N_MINLOG)); + Slimit = StrongInversionNoiseEvalOld( + here->BSIM3v32von + 0.1, vds, model, + here, data->freq, ckt->CKTtemp); + T1 = Swi + Slimit; + if (T1 > 0.0) + noizDens[BSIM3v32FLNOIZ] *= m * (Slimit * Swi) / T1; + else + noizDens[BSIM3v32FLNOIZ] *= 0.0; + } + } + break; + } - *OnDens += noizDens[BSIM3v32TOTNOIZ]; + lnNdens[BSIM3v32FLNOIZ] = + log(MAX(noizDens[BSIM3v32FLNOIZ], N_MINLOG)); - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ + noizDens[BSIM3v32TOTNOIZ] = noizDens[BSIM3v32RDNOIZ] + + noizDens[BSIM3v32RSNOIZ] + + noizDens[BSIM3v32IDNOIZ] + + noizDens[BSIM3v32FLNOIZ]; + lnNdens[BSIM3v32TOTNOIZ] = + log(MAX(noizDens[BSIM3v32TOTNOIZ], N_MINLOG)); - for (i = 0; i < BSIM3v32NSRCS; i++) - { here->BSIM3v32nVar[LNLSTDENS][i] = - lnNdens[i]; - } + *OnDens += noizDens[BSIM3v32TOTNOIZ]; - /* clear out our integration variables - if it's the first pass - */ - if (data->freq == - job->NstartFreq) - { for (i = 0; i < BSIM3v32NSRCS; i++) - { here->BSIM3v32nVar[OUTNOIZ][i] = 0.0; - here->BSIM3v32nVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM3v32NSRCS; i++) - { if (i != BSIM3v32TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM3v32nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM3v32nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM3v32nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) - { here->BSIM3v32nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM3v32nVar[OUTNOIZ][BSIM3v32TOTNOIZ] - += tempOnoise; - here->BSIM3v32nVar[INNOIZ][i] - += tempInoise; - here->BSIM3v32nVar[INNOIZ][BSIM3v32TOTNOIZ] - += tempInoise; + if (data->delFreq == 0.0) + { /* if we haven't done any previous + integration, we need to initialize our + "history" variables. + */ + + for (i = 0; i < BSIM3v32NSRCS; i++) + { here->BSIM3v32nVar[LNLSTDENS][i] = + lnNdens[i]; + } + + /* clear out our integration variables + if it's the first pass + */ + if (data->freq == + job->NstartFreq) + { for (i = 0; i < BSIM3v32NSRCS; i++) + { here->BSIM3v32nVar[OUTNOIZ][i] = 0.0; + here->BSIM3v32nVar[INNOIZ][i] = 0.0; + } + } + } + else + { /* data->delFreq != 0.0, + we have to integrate. + */ + for (i = 0; i < BSIM3v32NSRCS; i++) + { if (i != BSIM3v32TOTNOIZ) + { tempOnoise = Nintegrate(noizDens[i], + lnNdens[i], + here->BSIM3v32nVar[LNLSTDENS][i], + data); + tempInoise = Nintegrate(noizDens[i] + * data->GainSqInv, lnNdens[i] + + data->lnGainInv, + here->BSIM3v32nVar[LNLSTDENS][i] + + data->lnGainInv, data); + here->BSIM3v32nVar[LNLSTDENS][i] = + lnNdens[i]; + data->outNoiz += tempOnoise; + data->inNoise += tempInoise; + if (job->NStpsSm != 0) + { here->BSIM3v32nVar[OUTNOIZ][i] + += tempOnoise; + here->BSIM3v32nVar[OUTNOIZ][BSIM3v32TOTNOIZ] + += tempOnoise; + here->BSIM3v32nVar[INNOIZ][i] + += tempInoise; + here->BSIM3v32nVar[INNOIZ][BSIM3v32TOTNOIZ] + += tempInoise; } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM3v32NSRCS; i++) - { /* print a summary report */ - data->outpVector[data->outNumber++] - = noizDens[i]; - } - } - break; - case INT_NOIZ: - /* already calculated, just output */ - if (job->NStpsSm != 0) - { for (i = 0; i < BSIM3v32NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM3v32nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM3v32nVar[INNOIZ][i]; - } - } - break; - } - break; - case N_CLOSE: - /* do nothing, the main calling routine will close */ - return (OK); - break; /* the plots */ - } /* switch (operation) */ - } /* for here */ + } + } + } + if (data->prtSummary) + { for (i = 0; i < BSIM3v32NSRCS; i++) + { /* print a summary report */ + data->outpVector[data->outNumber++] + = noizDens[i]; + } + } + break; + case INT_NOIZ: + /* already calculated, just output */ + if (job->NStpsSm != 0) + { for (i = 0; i < BSIM3v32NSRCS; i++) + { data->outpVector[data->outNumber++] + = here->BSIM3v32nVar[OUTNOIZ][i]; + data->outpVector[data->outNumber++] + = here->BSIM3v32nVar[INNOIZ][i]; + } + } + break; + } + break; + case N_CLOSE: + /* do nothing, the main calling routine will close */ + return (OK); + break; /* the plots */ + } /* switch (operation) */ + } /* for here */ } /* for model */ return(OK); diff --git a/src/spicelib/devices/bsim3v32/b3v32par.c b/src/spicelib/devices/bsim3v32/b3v32par.c index 3f3a489b7..5ff8a05a8 100644 --- a/src/spicelib/devices/bsim3v32/b3v32par.c +++ b/src/spicelib/devices/bsim3v32/b3v32par.c @@ -28,7 +28,7 @@ BSIM3v32param (int param, IFvalue *value, GENinstance *inst, IFvalue *select) if (!cp_getvar("scale", CP_REAL, &scale)) scale = 1; - switch(param) + switch(param) { case BSIM3v32_W: here->BSIM3v32w = value->rValue*scale; here->BSIM3v32wGiven = TRUE; diff --git a/src/spicelib/devices/bsim3v32/b3v32pzld.c b/src/spicelib/devices/bsim3v32/b3v32pzld.c index f775c1ea4..ddadb53af 100644 --- a/src/spicelib/devices/bsim3v32/b3v32pzld.c +++ b/src/spicelib/devices/bsim3v32/b3v32pzld.c @@ -3,7 +3,7 @@ /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3pzld.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Paolo Nenzi 2002 @@ -36,11 +36,11 @@ double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; double ScalingFactor = 1.0e-9; double m; - for (; model != NULL; model = model->BSIM3v32nextModel) + for (; model != NULL; model = model->BSIM3v32nextModel) { for (here = model->BSIM3v32instances; here!= NULL; - here = here->BSIM3v32nextInstance) - { - if (here->BSIM3v32mode >= 0) + here = here->BSIM3v32nextInstance) + { + if (here->BSIM3v32mode >= 0) { Gm = here->BSIM3v32gm; Gmbs = here->BSIM3v32gmbs; FwdSum = Gm + Gmbs; @@ -73,19 +73,19 @@ double m; cddb = here->BSIM3v32cddb; xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; + sxpart = 0.6; dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; } else { cggb = cgdb = cgsb = 0.0; cbgb = cbdb = cbsb = 0.0; cdgb = cddb = cdsb = 0.0; - xgtg = here->BSIM3v32gtg; + xgtg = here->BSIM3v32gtg; xgtd = here->BSIM3v32gtd; xgts = here->BSIM3v32gts; xgtb = here->BSIM3v32gtb; @@ -95,46 +95,46 @@ double m; xcqsb = here->BSIM3v32cqsb; xcqbb = here->BSIM3v32cqbb; - CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV + CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV * here->pParam->BSIM3v32leffCV; - qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM3v32qdrn / qcheq; - Cdd = here->BSIM3v32cddb; - Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3v32cdgb; - Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; + qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3v32xpart < 0.5) + { dxpart = 0.4; + } + else if (model->BSIM3v32xpart > 0.5) + { dxpart = 0.0; + } + else + { dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + } + else + { dxpart = here->BSIM3v32qdrn / qcheq; + Cdd = here->BSIM3v32cddb; + Csd = -(here->BSIM3v32cgdb + here->BSIM3v32cddb + + here->BSIM3v32cbdb); + ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; + Cdg = here->BSIM3v32cdgb; + Csg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb + + here->BSIM3v32cbgb); + ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - Cds = here->BSIM3v32cdsb; - Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; + Cds = here->BSIM3v32cdsb; + Css = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb + + here->BSIM3v32cbsb); + ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); } } else @@ -156,7 +156,7 @@ double m; gbspb = here->BSIM3v32gbbs; gbspdp = -(gbspg + gbspsp + gbspb); - if (here->BSIM3v32nqsMod == 0) + if (here->BSIM3v32nqsMod == 0) { cggb = here->BSIM3v32cggb; cgsb = here->BSIM3v32cgdb; cgdb = here->BSIM3v32cgsb; @@ -170,19 +170,19 @@ double m; cddb = -(here->BSIM3v32cdsb + cgdb + cbdb); xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; + sxpart = 0.4; dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; + ddxpart_dVd = ddxpart_dVg = ddxpart_dVb + = ddxpart_dVs = 0.0; + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; } else { cggb = cgdb = cgsb = 0.0; cbgb = cbdb = cbsb = 0.0; cdgb = cddb = cdsb = 0.0; - xgtg = here->BSIM3v32gtg; + xgtg = here->BSIM3v32gtg; xgtd = here->BSIM3v32gts; xgts = here->BSIM3v32gtd; xgtb = here->BSIM3v32gtb; @@ -192,51 +192,51 @@ double m; xcqsb = here->BSIM3v32cqdb; xcqbb = here->BSIM3v32cqbb; - CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV + CoxWL = model->BSIM3v32cox * here->pParam->BSIM3v32weffCV * here->pParam->BSIM3v32leffCV; - qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3v32xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3v32xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM3v32qdrn / qcheq; - Css = here->BSIM3v32cddb; - Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb - + here->BSIM3v32cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3v32cdgb; - Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb - + here->BSIM3v32cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; + qcheq = -(here->BSIM3v32qgate + here->BSIM3v32qbulk); + if (fabs(qcheq) <= 1.0e-5 * CoxWL) + { if (model->BSIM3v32xpart < 0.5) + { sxpart = 0.4; + } + else if (model->BSIM3v32xpart > 0.5) + { sxpart = 0.0; + } + else + { sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = dsxpart_dVb + = dsxpart_dVs = 0.0; + } + else + { sxpart = here->BSIM3v32qdrn / qcheq; + Css = here->BSIM3v32cddb; + Cds = -(here->BSIM3v32cgdb + here->BSIM3v32cddb + + here->BSIM3v32cbdb); + dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; + Csg = here->BSIM3v32cdgb; + Cdg = -(here->BSIM3v32cggb + here->BSIM3v32cdgb + + here->BSIM3v32cbgb); + dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - Csd = here->BSIM3v32cdsb; - Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb - + here->BSIM3v32cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; + Csd = here->BSIM3v32cdsb; + Cdd = -(here->BSIM3v32cgsb + here->BSIM3v32cdsb + + here->BSIM3v32cbsb); + dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); } } - T1 = *(ckt->CKTstate0 + here->BSIM3v32qdef) * here->BSIM3v32gtau; + T1 = *(ckt->CKTstate0 + here->BSIM3v32qdef) * here->BSIM3v32gtau; gdpr = here->BSIM3v32drainConductance; gspr = here->BSIM3v32sourceConductance; gds = here->BSIM3v32gds; @@ -245,9 +245,9 @@ double m; capbd = here->BSIM3v32capbd; capbs = here->BSIM3v32capbs; - GSoverlapCap = here->BSIM3v32cgso; - GDoverlapCap = here->BSIM3v32cgdo; - GBoverlapCap = here->pParam->BSIM3v32cgbo; + GSoverlapCap = here->BSIM3v32cgso; + GDoverlapCap = here->BSIM3v32cgdo; + GBoverlapCap = here->pParam->BSIM3v32cgbo; xcdgb = (cdgb - GDoverlapCap); xcddb = (cddb + capbd + GDoverlapCap); @@ -256,7 +256,7 @@ double m; xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); xcsdb = -(cgdb + cbdb + cddb); xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)); - xcsbb = -(xcsgb + xcsdb + xcssb); + xcsbb = -(xcsgb + xcsdb + xcssb); xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); xcgdb = (cgdb - GDoverlapCap); xcgsb = (cgsb - GSoverlapCap); @@ -266,7 +266,7 @@ double m; xcbsb = (cbsb - capbs); xcbbb = -(xcbgb + xcbdb + xcbsb); - m = here->BSIM3v32m; + m = here->BSIM3v32m; *(here->BSIM3v32GgPtr ) += m * (xcggb * s->real); *(here->BSIM3v32GgPtr +1) += m * (xcggb * s->imag); @@ -318,23 +318,23 @@ double m; *(here->BSIM3v32BdpPtr) -= m * (gbd - gbbdp); *(here->BSIM3v32BspPtr) -= m * (gbs - gbbsp); - *(here->BSIM3v32DPgPtr) += Gm + dxpart * xgtg - + T1 * ddxpart_dVg + gbdpg; + *(here->BSIM3v32DPgPtr) += Gm + dxpart * xgtg + + T1 * ddxpart_dVg + gbdpg; *(here->BSIM3v32DPdpPtr) += gdpr + gds + gbd + RevSum + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp; *(here->BSIM3v32DPspPtr) -= gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp; + - T1 * ddxpart_dVs - gbdpsp; *(here->BSIM3v32DPbPtr) -= gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb; + - T1 * ddxpart_dVb - gbdpb; *(here->BSIM3v32SPgPtr) -= Gm - sxpart * xgtg - - T1 * dsxpart_dVg - gbspg; + - T1 * dsxpart_dVg - gbspg; *(here->BSIM3v32SPspPtr) += gspr + gds + gbs + FwdSum + sxpart * xgts + T1 * dsxpart_dVs + gbspsp; *(here->BSIM3v32SPbPtr) -= gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb; + - T1 * dsxpart_dVb - gbspb; *(here->BSIM3v32SPdpPtr) -= gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp; + - T1 * dsxpart_dVd - gbspdp; *(here->BSIM3v32GgPtr) -= xgtg; *(here->BSIM3v32GbPtr) -= xgtb; diff --git a/src/spicelib/devices/bsim3v32/b3v32temp.c b/src/spicelib/devices/bsim3v32/b3v32temp.c index 612b2789d..d8fb780e1 100644 --- a/src/spicelib/devices/bsim3v32/b3v32temp.c +++ b/src/spicelib/devices/bsim3v32/b3v32temp.c @@ -43,24 +43,24 @@ int Size_Not_Found; for (; model != NULL; model = model->BSIM3v32nextModel) { Temp = ckt->CKTtemp; if (model->BSIM3v32bulkJctPotential < 0.1) - { model->BSIM3v32bulkJctPotential = 0.1; - fprintf(stderr, "Given pb is less than 0.1. Pb is set to 0.1.\n"); - } + { model->BSIM3v32bulkJctPotential = 0.1; + fprintf(stderr, "Given pb is less than 0.1. Pb is set to 0.1.\n"); + } if (model->BSIM3v32sidewallJctPotential < 0.1) - { model->BSIM3v32sidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); - } + { model->BSIM3v32sidewallJctPotential = 0.1; + fprintf(stderr, "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); + } if (model->BSIM3v32GatesidewallJctPotential < 0.1) - { model->BSIM3v32GatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); - } + { model->BSIM3v32GatesidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); + } model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + pLastKnot = NULL; - Tnom = model->BSIM3v32tnom; - TRatio = Temp / Tnom; + Tnom = model->BSIM3v32tnom; + TRatio = Temp / Tnom; - model->BSIM3v32vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM3v32vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->BSIM3v32factor1 = sqrt(EPSSI / EPSOX * model->BSIM3v32tox); Vtm0 = KboQ * Tnom; @@ -70,167 +70,167 @@ int Size_Not_Found; model->BSIM3v32vtm = KboQ * Temp; Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM3v32vtm + model->BSIM3v32jctTempExponent - * log(Temp / Tnom); - T1 = exp(T0 / model->BSIM3v32jctEmissionCoeff); - model->BSIM3v32jctTempSatCurDensity = model->BSIM3v32jctSatCurDensity - * T1; - model->BSIM3v32jctSidewallTempSatCurDensity - = model->BSIM3v32jctSidewallSatCurDensity * T1; - } - else - { model->BSIM3v32jctTempSatCurDensity = model->BSIM3v32jctSatCurDensity; - model->BSIM3v32jctSidewallTempSatCurDensity - = model->BSIM3v32jctSidewallSatCurDensity; - } + if (Temp != Tnom) + { T0 = Eg0 / Vtm0 - Eg / model->BSIM3v32vtm + model->BSIM3v32jctTempExponent + * log(Temp / Tnom); + T1 = exp(T0 / model->BSIM3v32jctEmissionCoeff); + model->BSIM3v32jctTempSatCurDensity = model->BSIM3v32jctSatCurDensity + * T1; + model->BSIM3v32jctSidewallTempSatCurDensity + = model->BSIM3v32jctSidewallSatCurDensity * T1; + } + else + { model->BSIM3v32jctTempSatCurDensity = model->BSIM3v32jctSatCurDensity; + model->BSIM3v32jctSidewallTempSatCurDensity + = model->BSIM3v32jctSidewallSatCurDensity; + } - if (model->BSIM3v32jctTempSatCurDensity < 0.0) - model->BSIM3v32jctTempSatCurDensity = 0.0; - if (model->BSIM3v32jctSidewallTempSatCurDensity < 0.0) - model->BSIM3v32jctSidewallTempSatCurDensity = 0.0; + if (model->BSIM3v32jctTempSatCurDensity < 0.0) + model->BSIM3v32jctTempSatCurDensity = 0.0; + if (model->BSIM3v32jctSidewallTempSatCurDensity < 0.0) + model->BSIM3v32jctSidewallTempSatCurDensity = 0.0; - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM3v32tnom; - T0 = model->BSIM3v32tcj * delTemp; - if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitAreaTempJctCap = - model->BSIM3v32unitAreaJctCap * (1.0 + T0); - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitAreaJctCap *= 1.0 + T0; - } - } - else if (model->BSIM3v32unitAreaJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitAreaTempJctCap = 0.0; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitAreaJctCap = 0.0; - } - fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); - } + /* Temperature dependence of D/B and S/B diode capacitance begins */ + delTemp = ckt->CKTtemp - model->BSIM3v32tnom; + T0 = model->BSIM3v32tcj * delTemp; + if (T0 >= -1.0) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + model->BSIM3v32unitAreaTempJctCap = + model->BSIM3v32unitAreaJctCap * (1.0 + T0); + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + model->BSIM3v32unitAreaJctCap *= 1.0 + T0; + } + } + else if (model->BSIM3v32unitAreaJctCap > 0.0) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + model->BSIM3v32unitAreaTempJctCap = 0.0; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + model->BSIM3v32unitAreaJctCap = 0.0; + } + fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); + } T0 = model->BSIM3v32tcjsw * delTemp; - if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitLengthSidewallTempJctCap = - model->BSIM3v32unitLengthSidewallJctCap * (1.0 + T0); - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitLengthSidewallJctCap *= 1.0 + T0; - } - } - else if (model->BSIM3v32unitLengthSidewallJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitLengthSidewallTempJctCap = 0.0; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitLengthSidewallJctCap = 0.0; - } - fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); - } + if (T0 >= -1.0) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + model->BSIM3v32unitLengthSidewallTempJctCap = + model->BSIM3v32unitLengthSidewallJctCap * (1.0 + T0); + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + model->BSIM3v32unitLengthSidewallJctCap *= 1.0 + T0; + } + } + else if (model->BSIM3v32unitLengthSidewallJctCap > 0.0) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + model->BSIM3v32unitLengthSidewallTempJctCap = 0.0; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + model->BSIM3v32unitLengthSidewallJctCap = 0.0; + } + fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); + } T0 = model->BSIM3v32tcjswg * delTemp; - if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitLengthGateSidewallTempJctCap = - model->BSIM3v32unitLengthGateSidewallJctCap * (1.0 + T0); - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitLengthGateSidewallJctCap *= 1.0 + T0; - } - } - else if (model->BSIM3v32unitLengthGateSidewallJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - model->BSIM3v32unitLengthGateSidewallTempJctCap = 0.0; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - model->BSIM3v32unitLengthGateSidewallJctCap = 0.0; - } - fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); - } + if (T0 >= -1.0) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + model->BSIM3v32unitLengthGateSidewallTempJctCap = + model->BSIM3v32unitLengthGateSidewallJctCap * (1.0 + T0); + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + model->BSIM3v32unitLengthGateSidewallJctCap *= 1.0 + T0; + } + } + else if (model->BSIM3v32unitLengthGateSidewallJctCap > 0.0) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + model->BSIM3v32unitLengthGateSidewallTempJctCap = 0.0; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + model->BSIM3v32unitLengthGateSidewallJctCap = 0.0; + } + fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); + } model->BSIM3v32PhiB = model->BSIM3v32bulkJctPotential - - model->BSIM3v32tpb * delTemp; + - model->BSIM3v32tpb * delTemp; if (model->BSIM3v32PhiB < 0.01) - { model->BSIM3v32PhiB = 0.01; - fprintf(stderr, "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); - } + { model->BSIM3v32PhiB = 0.01; + fprintf(stderr, "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); + } model->BSIM3v32PhiBSW = model->BSIM3v32sidewallJctPotential - model->BSIM3v32tpbsw * delTemp; if (model->BSIM3v32PhiBSW <= 0.01) - { model->BSIM3v32PhiBSW = 0.01; - fprintf(stderr, "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); - } - model->BSIM3v32PhiBSWG = model->BSIM3v32GatesidewallJctPotential + { model->BSIM3v32PhiBSW = 0.01; + fprintf(stderr, "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); + } + model->BSIM3v32PhiBSWG = model->BSIM3v32GatesidewallJctPotential - model->BSIM3v32tpbswg * delTemp; if (model->BSIM3v32PhiBSWG <= 0.01) - { model->BSIM3v32PhiBSWG = 0.01; - fprintf(stderr, "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); - } + { model->BSIM3v32PhiBSWG = 0.01; + fprintf(stderr, "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); + } /* End of junction capacitance */ - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = model->BSIM3v32instances; here != NULL; + /* loop through all the instances of the model */ + /* MCJ: Length and Width not initialized */ + for (here = model->BSIM3v32instances; here != NULL; here = here->BSIM3v32nextInstance) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3v32l == pSizeDependParamKnot->Length) - && (here->BSIM3v32w == pSizeDependParamKnot->Width)) + { + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->BSIM3v32l == pSizeDependParamKnot->Length) + && (here->BSIM3v32w == pSizeDependParamKnot->Width)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - if (model->BSIM3v32intVersion > BSIM3v32V322) + here->pParam = pSizeDependParamKnot; + if (model->BSIM3v32intVersion > BSIM3v32V322) { - pParam = here->pParam; /*bug-fix */ - } - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + pParam = here->pParam; /*bug-fix */ + } + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim3v32SizeDependParam, 1); + if (Size_Not_Found) + { pParam = TMALLOC(struct bsim3v32SizeDependParam, 1); if (pLastKnot == NULL) model->pSizeDependParamKnot = pParam; else @@ -263,7 +263,7 @@ int Size_Not_Found; pParam->BSIM3v32leff = here->BSIM3v32l + model->BSIM3v32xl - 2.0 * pParam->BSIM3v32dl; if (pParam->BSIM3v32leff <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM3v32modName; namarray[1] = here->BSIM3v32name; SPfrontEnd->IFerror (ERR_FATAL, @@ -274,7 +274,7 @@ int Size_Not_Found; pParam->BSIM3v32weff = here->BSIM3v32w + model->BSIM3v32xw - 2.0 * pParam->BSIM3v32dw; if (pParam->BSIM3v32weff <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM3v32modName; namarray[1] = here->BSIM3v32name; SPfrontEnd->IFerror (ERR_FATAL, @@ -285,7 +285,7 @@ int Size_Not_Found; pParam->BSIM3v32leffCV = here->BSIM3v32l + model->BSIM3v32xl - 2.0 * pParam->BSIM3v32dlc; if (pParam->BSIM3v32leffCV <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM3v32modName; namarray[1] = here->BSIM3v32name; SPfrontEnd->IFerror (ERR_FATAL, @@ -296,7 +296,7 @@ int Size_Not_Found; pParam->BSIM3v32weffCV = here->BSIM3v32w + model->BSIM3v32xw - 2.0 * pParam->BSIM3v32dwc; if (pParam->BSIM3v32weffCV <= 0.0) - { IFuid namarray[2]; + { IFuid namarray[2]; namarray[0] = model->BSIM3v32modName; namarray[1] = here->BSIM3v32name; SPfrontEnd->IFerror (ERR_FATAL, @@ -306,744 +306,744 @@ int Size_Not_Found; } - if (model->BSIM3v32binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3v32leff; - Inv_W = 1.0e-6 / pParam->BSIM3v32weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3v32leff - * pParam->BSIM3v32weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3v32leff; - Inv_W = 1.0 / pParam->BSIM3v32weff; - Inv_LW = 1.0 / (pParam->BSIM3v32leff - * pParam->BSIM3v32weff); - } - pParam->BSIM3v32cdsc = model->BSIM3v32cdsc - + model->BSIM3v32lcdsc * Inv_L - + model->BSIM3v32wcdsc * Inv_W - + model->BSIM3v32pcdsc * Inv_LW; - pParam->BSIM3v32cdscb = model->BSIM3v32cdscb - + model->BSIM3v32lcdscb * Inv_L - + model->BSIM3v32wcdscb * Inv_W - + model->BSIM3v32pcdscb * Inv_LW; + if (model->BSIM3v32binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM3v32leff; + Inv_W = 1.0e-6 / pParam->BSIM3v32weff; + Inv_LW = 1.0e-12 / (pParam->BSIM3v32leff + * pParam->BSIM3v32weff); + } + else + { Inv_L = 1.0 / pParam->BSIM3v32leff; + Inv_W = 1.0 / pParam->BSIM3v32weff; + Inv_LW = 1.0 / (pParam->BSIM3v32leff + * pParam->BSIM3v32weff); + } + pParam->BSIM3v32cdsc = model->BSIM3v32cdsc + + model->BSIM3v32lcdsc * Inv_L + + model->BSIM3v32wcdsc * Inv_W + + model->BSIM3v32pcdsc * Inv_LW; + pParam->BSIM3v32cdscb = model->BSIM3v32cdscb + + model->BSIM3v32lcdscb * Inv_L + + model->BSIM3v32wcdscb * Inv_W + + model->BSIM3v32pcdscb * Inv_LW; - pParam->BSIM3v32cdscd = model->BSIM3v32cdscd - + model->BSIM3v32lcdscd * Inv_L - + model->BSIM3v32wcdscd * Inv_W - + model->BSIM3v32pcdscd * Inv_LW; + pParam->BSIM3v32cdscd = model->BSIM3v32cdscd + + model->BSIM3v32lcdscd * Inv_L + + model->BSIM3v32wcdscd * Inv_W + + model->BSIM3v32pcdscd * Inv_LW; - pParam->BSIM3v32cit = model->BSIM3v32cit - + model->BSIM3v32lcit * Inv_L - + model->BSIM3v32wcit * Inv_W - + model->BSIM3v32pcit * Inv_LW; - pParam->BSIM3v32nfactor = model->BSIM3v32nfactor - + model->BSIM3v32lnfactor * Inv_L - + model->BSIM3v32wnfactor * Inv_W - + model->BSIM3v32pnfactor * Inv_LW; - pParam->BSIM3v32xj = model->BSIM3v32xj - + model->BSIM3v32lxj * Inv_L - + model->BSIM3v32wxj * Inv_W - + model->BSIM3v32pxj * Inv_LW; - pParam->BSIM3v32vsat = model->BSIM3v32vsat - + model->BSIM3v32lvsat * Inv_L - + model->BSIM3v32wvsat * Inv_W - + model->BSIM3v32pvsat * Inv_LW; - pParam->BSIM3v32at = model->BSIM3v32at - + model->BSIM3v32lat * Inv_L - + model->BSIM3v32wat * Inv_W - + model->BSIM3v32pat * Inv_LW; - pParam->BSIM3v32a0 = model->BSIM3v32a0 - + model->BSIM3v32la0 * Inv_L - + model->BSIM3v32wa0 * Inv_W - + model->BSIM3v32pa0 * Inv_LW; + pParam->BSIM3v32cit = model->BSIM3v32cit + + model->BSIM3v32lcit * Inv_L + + model->BSIM3v32wcit * Inv_W + + model->BSIM3v32pcit * Inv_LW; + pParam->BSIM3v32nfactor = model->BSIM3v32nfactor + + model->BSIM3v32lnfactor * Inv_L + + model->BSIM3v32wnfactor * Inv_W + + model->BSIM3v32pnfactor * Inv_LW; + pParam->BSIM3v32xj = model->BSIM3v32xj + + model->BSIM3v32lxj * Inv_L + + model->BSIM3v32wxj * Inv_W + + model->BSIM3v32pxj * Inv_LW; + pParam->BSIM3v32vsat = model->BSIM3v32vsat + + model->BSIM3v32lvsat * Inv_L + + model->BSIM3v32wvsat * Inv_W + + model->BSIM3v32pvsat * Inv_LW; + pParam->BSIM3v32at = model->BSIM3v32at + + model->BSIM3v32lat * Inv_L + + model->BSIM3v32wat * Inv_W + + model->BSIM3v32pat * Inv_LW; + pParam->BSIM3v32a0 = model->BSIM3v32a0 + + model->BSIM3v32la0 * Inv_L + + model->BSIM3v32wa0 * Inv_W + + model->BSIM3v32pa0 * Inv_LW; - pParam->BSIM3v32ags = model->BSIM3v32ags - + model->BSIM3v32lags * Inv_L - + model->BSIM3v32wags * Inv_W - + model->BSIM3v32pags * Inv_LW; + pParam->BSIM3v32ags = model->BSIM3v32ags + + model->BSIM3v32lags * Inv_L + + model->BSIM3v32wags * Inv_W + + model->BSIM3v32pags * Inv_LW; - pParam->BSIM3v32a1 = model->BSIM3v32a1 - + model->BSIM3v32la1 * Inv_L - + model->BSIM3v32wa1 * Inv_W - + model->BSIM3v32pa1 * Inv_LW; - pParam->BSIM3v32a2 = model->BSIM3v32a2 - + model->BSIM3v32la2 * Inv_L - + model->BSIM3v32wa2 * Inv_W - + model->BSIM3v32pa2 * Inv_LW; - pParam->BSIM3v32keta = model->BSIM3v32keta - + model->BSIM3v32lketa * Inv_L - + model->BSIM3v32wketa * Inv_W - + model->BSIM3v32pketa * Inv_LW; - pParam->BSIM3v32nsub = model->BSIM3v32nsub - + model->BSIM3v32lnsub * Inv_L - + model->BSIM3v32wnsub * Inv_W - + model->BSIM3v32pnsub * Inv_LW; - pParam->BSIM3v32npeak = model->BSIM3v32npeak - + model->BSIM3v32lnpeak * Inv_L - + model->BSIM3v32wnpeak * Inv_W - + model->BSIM3v32pnpeak * Inv_LW; - pParam->BSIM3v32ngate = model->BSIM3v32ngate - + model->BSIM3v32lngate * Inv_L - + model->BSIM3v32wngate * Inv_W - + model->BSIM3v32pngate * Inv_LW; - pParam->BSIM3v32gamma1 = model->BSIM3v32gamma1 - + model->BSIM3v32lgamma1 * Inv_L - + model->BSIM3v32wgamma1 * Inv_W - + model->BSIM3v32pgamma1 * Inv_LW; - pParam->BSIM3v32gamma2 = model->BSIM3v32gamma2 - + model->BSIM3v32lgamma2 * Inv_L - + model->BSIM3v32wgamma2 * Inv_W - + model->BSIM3v32pgamma2 * Inv_LW; - pParam->BSIM3v32vbx = model->BSIM3v32vbx - + model->BSIM3v32lvbx * Inv_L - + model->BSIM3v32wvbx * Inv_W - + model->BSIM3v32pvbx * Inv_LW; - pParam->BSIM3v32vbm = model->BSIM3v32vbm - + model->BSIM3v32lvbm * Inv_L - + model->BSIM3v32wvbm * Inv_W - + model->BSIM3v32pvbm * Inv_LW; - pParam->BSIM3v32xt = model->BSIM3v32xt - + model->BSIM3v32lxt * Inv_L - + model->BSIM3v32wxt * Inv_W - + model->BSIM3v32pxt * Inv_LW; - pParam->BSIM3v32vfb = model->BSIM3v32vfb - + model->BSIM3v32lvfb * Inv_L - + model->BSIM3v32wvfb * Inv_W - + model->BSIM3v32pvfb * Inv_LW; - pParam->BSIM3v32k1 = model->BSIM3v32k1 - + model->BSIM3v32lk1 * Inv_L - + model->BSIM3v32wk1 * Inv_W - + model->BSIM3v32pk1 * Inv_LW; - pParam->BSIM3v32kt1 = model->BSIM3v32kt1 - + model->BSIM3v32lkt1 * Inv_L - + model->BSIM3v32wkt1 * Inv_W - + model->BSIM3v32pkt1 * Inv_LW; - pParam->BSIM3v32kt1l = model->BSIM3v32kt1l - + model->BSIM3v32lkt1l * Inv_L - + model->BSIM3v32wkt1l * Inv_W - + model->BSIM3v32pkt1l * Inv_LW; - pParam->BSIM3v32k2 = model->BSIM3v32k2 - + model->BSIM3v32lk2 * Inv_L - + model->BSIM3v32wk2 * Inv_W - + model->BSIM3v32pk2 * Inv_LW; - pParam->BSIM3v32kt2 = model->BSIM3v32kt2 - + model->BSIM3v32lkt2 * Inv_L - + model->BSIM3v32wkt2 * Inv_W - + model->BSIM3v32pkt2 * Inv_LW; - pParam->BSIM3v32k3 = model->BSIM3v32k3 - + model->BSIM3v32lk3 * Inv_L - + model->BSIM3v32wk3 * Inv_W - + model->BSIM3v32pk3 * Inv_LW; - pParam->BSIM3v32k3b = model->BSIM3v32k3b - + model->BSIM3v32lk3b * Inv_L - + model->BSIM3v32wk3b * Inv_W - + model->BSIM3v32pk3b * Inv_LW; - pParam->BSIM3v32w0 = model->BSIM3v32w0 - + model->BSIM3v32lw0 * Inv_L - + model->BSIM3v32ww0 * Inv_W - + model->BSIM3v32pw0 * Inv_LW; - pParam->BSIM3v32nlx = model->BSIM3v32nlx - + model->BSIM3v32lnlx * Inv_L - + model->BSIM3v32wnlx * Inv_W - + model->BSIM3v32pnlx * Inv_LW; - pParam->BSIM3v32dvt0 = model->BSIM3v32dvt0 - + model->BSIM3v32ldvt0 * Inv_L - + model->BSIM3v32wdvt0 * Inv_W - + model->BSIM3v32pdvt0 * Inv_LW; - pParam->BSIM3v32dvt1 = model->BSIM3v32dvt1 - + model->BSIM3v32ldvt1 * Inv_L - + model->BSIM3v32wdvt1 * Inv_W - + model->BSIM3v32pdvt1 * Inv_LW; - pParam->BSIM3v32dvt2 = model->BSIM3v32dvt2 - + model->BSIM3v32ldvt2 * Inv_L - + model->BSIM3v32wdvt2 * Inv_W - + model->BSIM3v32pdvt2 * Inv_LW; - pParam->BSIM3v32dvt0w = model->BSIM3v32dvt0w - + model->BSIM3v32ldvt0w * Inv_L - + model->BSIM3v32wdvt0w * Inv_W - + model->BSIM3v32pdvt0w * Inv_LW; - pParam->BSIM3v32dvt1w = model->BSIM3v32dvt1w - + model->BSIM3v32ldvt1w * Inv_L - + model->BSIM3v32wdvt1w * Inv_W - + model->BSIM3v32pdvt1w * Inv_LW; - pParam->BSIM3v32dvt2w = model->BSIM3v32dvt2w - + model->BSIM3v32ldvt2w * Inv_L - + model->BSIM3v32wdvt2w * Inv_W - + model->BSIM3v32pdvt2w * Inv_LW; - pParam->BSIM3v32drout = model->BSIM3v32drout - + model->BSIM3v32ldrout * Inv_L - + model->BSIM3v32wdrout * Inv_W - + model->BSIM3v32pdrout * Inv_LW; - pParam->BSIM3v32dsub = model->BSIM3v32dsub - + model->BSIM3v32ldsub * Inv_L - + model->BSIM3v32wdsub * Inv_W - + model->BSIM3v32pdsub * Inv_LW; - pParam->BSIM3v32vth0 = model->BSIM3v32vth0 - + model->BSIM3v32lvth0 * Inv_L - + model->BSIM3v32wvth0 * Inv_W - + model->BSIM3v32pvth0 * Inv_LW; - pParam->BSIM3v32ua = model->BSIM3v32ua - + model->BSIM3v32lua * Inv_L - + model->BSIM3v32wua * Inv_W - + model->BSIM3v32pua * Inv_LW; - pParam->BSIM3v32ua1 = model->BSIM3v32ua1 - + model->BSIM3v32lua1 * Inv_L - + model->BSIM3v32wua1 * Inv_W - + model->BSIM3v32pua1 * Inv_LW; - pParam->BSIM3v32ub = model->BSIM3v32ub - + model->BSIM3v32lub * Inv_L - + model->BSIM3v32wub * Inv_W - + model->BSIM3v32pub * Inv_LW; - pParam->BSIM3v32ub1 = model->BSIM3v32ub1 - + model->BSIM3v32lub1 * Inv_L - + model->BSIM3v32wub1 * Inv_W - + model->BSIM3v32pub1 * Inv_LW; - pParam->BSIM3v32uc = model->BSIM3v32uc - + model->BSIM3v32luc * Inv_L - + model->BSIM3v32wuc * Inv_W - + model->BSIM3v32puc * Inv_LW; - pParam->BSIM3v32uc1 = model->BSIM3v32uc1 - + model->BSIM3v32luc1 * Inv_L - + model->BSIM3v32wuc1 * Inv_W - + model->BSIM3v32puc1 * Inv_LW; - pParam->BSIM3v32u0 = model->BSIM3v32u0 - + model->BSIM3v32lu0 * Inv_L - + model->BSIM3v32wu0 * Inv_W - + model->BSIM3v32pu0 * Inv_LW; - pParam->BSIM3v32ute = model->BSIM3v32ute - + model->BSIM3v32lute * Inv_L - + model->BSIM3v32wute * Inv_W - + model->BSIM3v32pute * Inv_LW; - pParam->BSIM3v32voff = model->BSIM3v32voff - + model->BSIM3v32lvoff * Inv_L - + model->BSIM3v32wvoff * Inv_W - + model->BSIM3v32pvoff * Inv_LW; - pParam->BSIM3v32delta = model->BSIM3v32delta - + model->BSIM3v32ldelta * Inv_L - + model->BSIM3v32wdelta * Inv_W - + model->BSIM3v32pdelta * Inv_LW; - pParam->BSIM3v32rdsw = model->BSIM3v32rdsw - + model->BSIM3v32lrdsw * Inv_L - + model->BSIM3v32wrdsw * Inv_W - + model->BSIM3v32prdsw * Inv_LW; - pParam->BSIM3v32prwg = model->BSIM3v32prwg - + model->BSIM3v32lprwg * Inv_L - + model->BSIM3v32wprwg * Inv_W - + model->BSIM3v32pprwg * Inv_LW; - pParam->BSIM3v32prwb = model->BSIM3v32prwb - + model->BSIM3v32lprwb * Inv_L - + model->BSIM3v32wprwb * Inv_W - + model->BSIM3v32pprwb * Inv_LW; - pParam->BSIM3v32prt = model->BSIM3v32prt - + model->BSIM3v32lprt * Inv_L - + model->BSIM3v32wprt * Inv_W - + model->BSIM3v32pprt * Inv_LW; - pParam->BSIM3v32eta0 = model->BSIM3v32eta0 - + model->BSIM3v32leta0 * Inv_L - + model->BSIM3v32weta0 * Inv_W - + model->BSIM3v32peta0 * Inv_LW; - pParam->BSIM3v32etab = model->BSIM3v32etab - + model->BSIM3v32letab * Inv_L - + model->BSIM3v32wetab * Inv_W - + model->BSIM3v32petab * Inv_LW; - pParam->BSIM3v32pclm = model->BSIM3v32pclm - + model->BSIM3v32lpclm * Inv_L - + model->BSIM3v32wpclm * Inv_W - + model->BSIM3v32ppclm * Inv_LW; - pParam->BSIM3v32pdibl1 = model->BSIM3v32pdibl1 - + model->BSIM3v32lpdibl1 * Inv_L - + model->BSIM3v32wpdibl1 * Inv_W - + model->BSIM3v32ppdibl1 * Inv_LW; - pParam->BSIM3v32pdibl2 = model->BSIM3v32pdibl2 - + model->BSIM3v32lpdibl2 * Inv_L - + model->BSIM3v32wpdibl2 * Inv_W - + model->BSIM3v32ppdibl2 * Inv_LW; - pParam->BSIM3v32pdiblb = model->BSIM3v32pdiblb - + model->BSIM3v32lpdiblb * Inv_L - + model->BSIM3v32wpdiblb * Inv_W - + model->BSIM3v32ppdiblb * Inv_LW; - pParam->BSIM3v32pscbe1 = model->BSIM3v32pscbe1 - + model->BSIM3v32lpscbe1 * Inv_L - + model->BSIM3v32wpscbe1 * Inv_W - + model->BSIM3v32ppscbe1 * Inv_LW; - pParam->BSIM3v32pscbe2 = model->BSIM3v32pscbe2 - + model->BSIM3v32lpscbe2 * Inv_L - + model->BSIM3v32wpscbe2 * Inv_W - + model->BSIM3v32ppscbe2 * Inv_LW; - pParam->BSIM3v32pvag = model->BSIM3v32pvag - + model->BSIM3v32lpvag * Inv_L - + model->BSIM3v32wpvag * Inv_W - + model->BSIM3v32ppvag * Inv_LW; - pParam->BSIM3v32wr = model->BSIM3v32wr - + model->BSIM3v32lwr * Inv_L - + model->BSIM3v32wwr * Inv_W - + model->BSIM3v32pwr * Inv_LW; - pParam->BSIM3v32dwg = model->BSIM3v32dwg - + model->BSIM3v32ldwg * Inv_L - + model->BSIM3v32wdwg * Inv_W - + model->BSIM3v32pdwg * Inv_LW; - pParam->BSIM3v32dwb = model->BSIM3v32dwb - + model->BSIM3v32ldwb * Inv_L - + model->BSIM3v32wdwb * Inv_W - + model->BSIM3v32pdwb * Inv_LW; - pParam->BSIM3v32b0 = model->BSIM3v32b0 - + model->BSIM3v32lb0 * Inv_L - + model->BSIM3v32wb0 * Inv_W - + model->BSIM3v32pb0 * Inv_LW; - pParam->BSIM3v32b1 = model->BSIM3v32b1 - + model->BSIM3v32lb1 * Inv_L - + model->BSIM3v32wb1 * Inv_W - + model->BSIM3v32pb1 * Inv_LW; - pParam->BSIM3v32alpha0 = model->BSIM3v32alpha0 - + model->BSIM3v32lalpha0 * Inv_L - + model->BSIM3v32walpha0 * Inv_W - + model->BSIM3v32palpha0 * Inv_LW; - pParam->BSIM3v32alpha1 = model->BSIM3v32alpha1 - + model->BSIM3v32lalpha1 * Inv_L - + model->BSIM3v32walpha1 * Inv_W - + model->BSIM3v32palpha1 * Inv_LW; - pParam->BSIM3v32beta0 = model->BSIM3v32beta0 - + model->BSIM3v32lbeta0 * Inv_L - + model->BSIM3v32wbeta0 * Inv_W - + model->BSIM3v32pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3v32elm = model->BSIM3v32elm - + model->BSIM3v32lelm * Inv_L - + model->BSIM3v32welm * Inv_W - + model->BSIM3v32pelm * Inv_LW; - pParam->BSIM3v32cgsl = model->BSIM3v32cgsl - + model->BSIM3v32lcgsl * Inv_L - + model->BSIM3v32wcgsl * Inv_W - + model->BSIM3v32pcgsl * Inv_LW; - pParam->BSIM3v32cgdl = model->BSIM3v32cgdl - + model->BSIM3v32lcgdl * Inv_L - + model->BSIM3v32wcgdl * Inv_W - + model->BSIM3v32pcgdl * Inv_LW; - pParam->BSIM3v32ckappa = model->BSIM3v32ckappa - + model->BSIM3v32lckappa * Inv_L - + model->BSIM3v32wckappa * Inv_W - + model->BSIM3v32pckappa * Inv_LW; - pParam->BSIM3v32cf = model->BSIM3v32cf - + model->BSIM3v32lcf * Inv_L - + model->BSIM3v32wcf * Inv_W - + model->BSIM3v32pcf * Inv_LW; - pParam->BSIM3v32clc = model->BSIM3v32clc - + model->BSIM3v32lclc * Inv_L - + model->BSIM3v32wclc * Inv_W - + model->BSIM3v32pclc * Inv_LW; - pParam->BSIM3v32cle = model->BSIM3v32cle - + model->BSIM3v32lcle * Inv_L - + model->BSIM3v32wcle * Inv_W - + model->BSIM3v32pcle * Inv_LW; - pParam->BSIM3v32vfbcv = model->BSIM3v32vfbcv - + model->BSIM3v32lvfbcv * Inv_L - + model->BSIM3v32wvfbcv * Inv_W - + model->BSIM3v32pvfbcv * Inv_LW; - pParam->BSIM3v32acde = model->BSIM3v32acde - + model->BSIM3v32lacde * Inv_L - + model->BSIM3v32wacde * Inv_W - + model->BSIM3v32pacde * Inv_LW; - pParam->BSIM3v32moin = model->BSIM3v32moin - + model->BSIM3v32lmoin * Inv_L - + model->BSIM3v32wmoin * Inv_W - + model->BSIM3v32pmoin * Inv_LW; - pParam->BSIM3v32noff = model->BSIM3v32noff - + model->BSIM3v32lnoff * Inv_L - + model->BSIM3v32wnoff * Inv_W - + model->BSIM3v32pnoff * Inv_LW; - pParam->BSIM3v32voffcv = model->BSIM3v32voffcv - + model->BSIM3v32lvoffcv * Inv_L - + model->BSIM3v32wvoffcv * Inv_W - + model->BSIM3v32pvoffcv * Inv_LW; + pParam->BSIM3v32a1 = model->BSIM3v32a1 + + model->BSIM3v32la1 * Inv_L + + model->BSIM3v32wa1 * Inv_W + + model->BSIM3v32pa1 * Inv_LW; + pParam->BSIM3v32a2 = model->BSIM3v32a2 + + model->BSIM3v32la2 * Inv_L + + model->BSIM3v32wa2 * Inv_W + + model->BSIM3v32pa2 * Inv_LW; + pParam->BSIM3v32keta = model->BSIM3v32keta + + model->BSIM3v32lketa * Inv_L + + model->BSIM3v32wketa * Inv_W + + model->BSIM3v32pketa * Inv_LW; + pParam->BSIM3v32nsub = model->BSIM3v32nsub + + model->BSIM3v32lnsub * Inv_L + + model->BSIM3v32wnsub * Inv_W + + model->BSIM3v32pnsub * Inv_LW; + pParam->BSIM3v32npeak = model->BSIM3v32npeak + + model->BSIM3v32lnpeak * Inv_L + + model->BSIM3v32wnpeak * Inv_W + + model->BSIM3v32pnpeak * Inv_LW; + pParam->BSIM3v32ngate = model->BSIM3v32ngate + + model->BSIM3v32lngate * Inv_L + + model->BSIM3v32wngate * Inv_W + + model->BSIM3v32pngate * Inv_LW; + pParam->BSIM3v32gamma1 = model->BSIM3v32gamma1 + + model->BSIM3v32lgamma1 * Inv_L + + model->BSIM3v32wgamma1 * Inv_W + + model->BSIM3v32pgamma1 * Inv_LW; + pParam->BSIM3v32gamma2 = model->BSIM3v32gamma2 + + model->BSIM3v32lgamma2 * Inv_L + + model->BSIM3v32wgamma2 * Inv_W + + model->BSIM3v32pgamma2 * Inv_LW; + pParam->BSIM3v32vbx = model->BSIM3v32vbx + + model->BSIM3v32lvbx * Inv_L + + model->BSIM3v32wvbx * Inv_W + + model->BSIM3v32pvbx * Inv_LW; + pParam->BSIM3v32vbm = model->BSIM3v32vbm + + model->BSIM3v32lvbm * Inv_L + + model->BSIM3v32wvbm * Inv_W + + model->BSIM3v32pvbm * Inv_LW; + pParam->BSIM3v32xt = model->BSIM3v32xt + + model->BSIM3v32lxt * Inv_L + + model->BSIM3v32wxt * Inv_W + + model->BSIM3v32pxt * Inv_LW; + pParam->BSIM3v32vfb = model->BSIM3v32vfb + + model->BSIM3v32lvfb * Inv_L + + model->BSIM3v32wvfb * Inv_W + + model->BSIM3v32pvfb * Inv_LW; + pParam->BSIM3v32k1 = model->BSIM3v32k1 + + model->BSIM3v32lk1 * Inv_L + + model->BSIM3v32wk1 * Inv_W + + model->BSIM3v32pk1 * Inv_LW; + pParam->BSIM3v32kt1 = model->BSIM3v32kt1 + + model->BSIM3v32lkt1 * Inv_L + + model->BSIM3v32wkt1 * Inv_W + + model->BSIM3v32pkt1 * Inv_LW; + pParam->BSIM3v32kt1l = model->BSIM3v32kt1l + + model->BSIM3v32lkt1l * Inv_L + + model->BSIM3v32wkt1l * Inv_W + + model->BSIM3v32pkt1l * Inv_LW; + pParam->BSIM3v32k2 = model->BSIM3v32k2 + + model->BSIM3v32lk2 * Inv_L + + model->BSIM3v32wk2 * Inv_W + + model->BSIM3v32pk2 * Inv_LW; + pParam->BSIM3v32kt2 = model->BSIM3v32kt2 + + model->BSIM3v32lkt2 * Inv_L + + model->BSIM3v32wkt2 * Inv_W + + model->BSIM3v32pkt2 * Inv_LW; + pParam->BSIM3v32k3 = model->BSIM3v32k3 + + model->BSIM3v32lk3 * Inv_L + + model->BSIM3v32wk3 * Inv_W + + model->BSIM3v32pk3 * Inv_LW; + pParam->BSIM3v32k3b = model->BSIM3v32k3b + + model->BSIM3v32lk3b * Inv_L + + model->BSIM3v32wk3b * Inv_W + + model->BSIM3v32pk3b * Inv_LW; + pParam->BSIM3v32w0 = model->BSIM3v32w0 + + model->BSIM3v32lw0 * Inv_L + + model->BSIM3v32ww0 * Inv_W + + model->BSIM3v32pw0 * Inv_LW; + pParam->BSIM3v32nlx = model->BSIM3v32nlx + + model->BSIM3v32lnlx * Inv_L + + model->BSIM3v32wnlx * Inv_W + + model->BSIM3v32pnlx * Inv_LW; + pParam->BSIM3v32dvt0 = model->BSIM3v32dvt0 + + model->BSIM3v32ldvt0 * Inv_L + + model->BSIM3v32wdvt0 * Inv_W + + model->BSIM3v32pdvt0 * Inv_LW; + pParam->BSIM3v32dvt1 = model->BSIM3v32dvt1 + + model->BSIM3v32ldvt1 * Inv_L + + model->BSIM3v32wdvt1 * Inv_W + + model->BSIM3v32pdvt1 * Inv_LW; + pParam->BSIM3v32dvt2 = model->BSIM3v32dvt2 + + model->BSIM3v32ldvt2 * Inv_L + + model->BSIM3v32wdvt2 * Inv_W + + model->BSIM3v32pdvt2 * Inv_LW; + pParam->BSIM3v32dvt0w = model->BSIM3v32dvt0w + + model->BSIM3v32ldvt0w * Inv_L + + model->BSIM3v32wdvt0w * Inv_W + + model->BSIM3v32pdvt0w * Inv_LW; + pParam->BSIM3v32dvt1w = model->BSIM3v32dvt1w + + model->BSIM3v32ldvt1w * Inv_L + + model->BSIM3v32wdvt1w * Inv_W + + model->BSIM3v32pdvt1w * Inv_LW; + pParam->BSIM3v32dvt2w = model->BSIM3v32dvt2w + + model->BSIM3v32ldvt2w * Inv_L + + model->BSIM3v32wdvt2w * Inv_W + + model->BSIM3v32pdvt2w * Inv_LW; + pParam->BSIM3v32drout = model->BSIM3v32drout + + model->BSIM3v32ldrout * Inv_L + + model->BSIM3v32wdrout * Inv_W + + model->BSIM3v32pdrout * Inv_LW; + pParam->BSIM3v32dsub = model->BSIM3v32dsub + + model->BSIM3v32ldsub * Inv_L + + model->BSIM3v32wdsub * Inv_W + + model->BSIM3v32pdsub * Inv_LW; + pParam->BSIM3v32vth0 = model->BSIM3v32vth0 + + model->BSIM3v32lvth0 * Inv_L + + model->BSIM3v32wvth0 * Inv_W + + model->BSIM3v32pvth0 * Inv_LW; + pParam->BSIM3v32ua = model->BSIM3v32ua + + model->BSIM3v32lua * Inv_L + + model->BSIM3v32wua * Inv_W + + model->BSIM3v32pua * Inv_LW; + pParam->BSIM3v32ua1 = model->BSIM3v32ua1 + + model->BSIM3v32lua1 * Inv_L + + model->BSIM3v32wua1 * Inv_W + + model->BSIM3v32pua1 * Inv_LW; + pParam->BSIM3v32ub = model->BSIM3v32ub + + model->BSIM3v32lub * Inv_L + + model->BSIM3v32wub * Inv_W + + model->BSIM3v32pub * Inv_LW; + pParam->BSIM3v32ub1 = model->BSIM3v32ub1 + + model->BSIM3v32lub1 * Inv_L + + model->BSIM3v32wub1 * Inv_W + + model->BSIM3v32pub1 * Inv_LW; + pParam->BSIM3v32uc = model->BSIM3v32uc + + model->BSIM3v32luc * Inv_L + + model->BSIM3v32wuc * Inv_W + + model->BSIM3v32puc * Inv_LW; + pParam->BSIM3v32uc1 = model->BSIM3v32uc1 + + model->BSIM3v32luc1 * Inv_L + + model->BSIM3v32wuc1 * Inv_W + + model->BSIM3v32puc1 * Inv_LW; + pParam->BSIM3v32u0 = model->BSIM3v32u0 + + model->BSIM3v32lu0 * Inv_L + + model->BSIM3v32wu0 * Inv_W + + model->BSIM3v32pu0 * Inv_LW; + pParam->BSIM3v32ute = model->BSIM3v32ute + + model->BSIM3v32lute * Inv_L + + model->BSIM3v32wute * Inv_W + + model->BSIM3v32pute * Inv_LW; + pParam->BSIM3v32voff = model->BSIM3v32voff + + model->BSIM3v32lvoff * Inv_L + + model->BSIM3v32wvoff * Inv_W + + model->BSIM3v32pvoff * Inv_LW; + pParam->BSIM3v32delta = model->BSIM3v32delta + + model->BSIM3v32ldelta * Inv_L + + model->BSIM3v32wdelta * Inv_W + + model->BSIM3v32pdelta * Inv_LW; + pParam->BSIM3v32rdsw = model->BSIM3v32rdsw + + model->BSIM3v32lrdsw * Inv_L + + model->BSIM3v32wrdsw * Inv_W + + model->BSIM3v32prdsw * Inv_LW; + pParam->BSIM3v32prwg = model->BSIM3v32prwg + + model->BSIM3v32lprwg * Inv_L + + model->BSIM3v32wprwg * Inv_W + + model->BSIM3v32pprwg * Inv_LW; + pParam->BSIM3v32prwb = model->BSIM3v32prwb + + model->BSIM3v32lprwb * Inv_L + + model->BSIM3v32wprwb * Inv_W + + model->BSIM3v32pprwb * Inv_LW; + pParam->BSIM3v32prt = model->BSIM3v32prt + + model->BSIM3v32lprt * Inv_L + + model->BSIM3v32wprt * Inv_W + + model->BSIM3v32pprt * Inv_LW; + pParam->BSIM3v32eta0 = model->BSIM3v32eta0 + + model->BSIM3v32leta0 * Inv_L + + model->BSIM3v32weta0 * Inv_W + + model->BSIM3v32peta0 * Inv_LW; + pParam->BSIM3v32etab = model->BSIM3v32etab + + model->BSIM3v32letab * Inv_L + + model->BSIM3v32wetab * Inv_W + + model->BSIM3v32petab * Inv_LW; + pParam->BSIM3v32pclm = model->BSIM3v32pclm + + model->BSIM3v32lpclm * Inv_L + + model->BSIM3v32wpclm * Inv_W + + model->BSIM3v32ppclm * Inv_LW; + pParam->BSIM3v32pdibl1 = model->BSIM3v32pdibl1 + + model->BSIM3v32lpdibl1 * Inv_L + + model->BSIM3v32wpdibl1 * Inv_W + + model->BSIM3v32ppdibl1 * Inv_LW; + pParam->BSIM3v32pdibl2 = model->BSIM3v32pdibl2 + + model->BSIM3v32lpdibl2 * Inv_L + + model->BSIM3v32wpdibl2 * Inv_W + + model->BSIM3v32ppdibl2 * Inv_LW; + pParam->BSIM3v32pdiblb = model->BSIM3v32pdiblb + + model->BSIM3v32lpdiblb * Inv_L + + model->BSIM3v32wpdiblb * Inv_W + + model->BSIM3v32ppdiblb * Inv_LW; + pParam->BSIM3v32pscbe1 = model->BSIM3v32pscbe1 + + model->BSIM3v32lpscbe1 * Inv_L + + model->BSIM3v32wpscbe1 * Inv_W + + model->BSIM3v32ppscbe1 * Inv_LW; + pParam->BSIM3v32pscbe2 = model->BSIM3v32pscbe2 + + model->BSIM3v32lpscbe2 * Inv_L + + model->BSIM3v32wpscbe2 * Inv_W + + model->BSIM3v32ppscbe2 * Inv_LW; + pParam->BSIM3v32pvag = model->BSIM3v32pvag + + model->BSIM3v32lpvag * Inv_L + + model->BSIM3v32wpvag * Inv_W + + model->BSIM3v32ppvag * Inv_LW; + pParam->BSIM3v32wr = model->BSIM3v32wr + + model->BSIM3v32lwr * Inv_L + + model->BSIM3v32wwr * Inv_W + + model->BSIM3v32pwr * Inv_LW; + pParam->BSIM3v32dwg = model->BSIM3v32dwg + + model->BSIM3v32ldwg * Inv_L + + model->BSIM3v32wdwg * Inv_W + + model->BSIM3v32pdwg * Inv_LW; + pParam->BSIM3v32dwb = model->BSIM3v32dwb + + model->BSIM3v32ldwb * Inv_L + + model->BSIM3v32wdwb * Inv_W + + model->BSIM3v32pdwb * Inv_LW; + pParam->BSIM3v32b0 = model->BSIM3v32b0 + + model->BSIM3v32lb0 * Inv_L + + model->BSIM3v32wb0 * Inv_W + + model->BSIM3v32pb0 * Inv_LW; + pParam->BSIM3v32b1 = model->BSIM3v32b1 + + model->BSIM3v32lb1 * Inv_L + + model->BSIM3v32wb1 * Inv_W + + model->BSIM3v32pb1 * Inv_LW; + pParam->BSIM3v32alpha0 = model->BSIM3v32alpha0 + + model->BSIM3v32lalpha0 * Inv_L + + model->BSIM3v32walpha0 * Inv_W + + model->BSIM3v32palpha0 * Inv_LW; + pParam->BSIM3v32alpha1 = model->BSIM3v32alpha1 + + model->BSIM3v32lalpha1 * Inv_L + + model->BSIM3v32walpha1 * Inv_W + + model->BSIM3v32palpha1 * Inv_LW; + pParam->BSIM3v32beta0 = model->BSIM3v32beta0 + + model->BSIM3v32lbeta0 * Inv_L + + model->BSIM3v32wbeta0 * Inv_W + + model->BSIM3v32pbeta0 * Inv_LW; + /* CV model */ + pParam->BSIM3v32elm = model->BSIM3v32elm + + model->BSIM3v32lelm * Inv_L + + model->BSIM3v32welm * Inv_W + + model->BSIM3v32pelm * Inv_LW; + pParam->BSIM3v32cgsl = model->BSIM3v32cgsl + + model->BSIM3v32lcgsl * Inv_L + + model->BSIM3v32wcgsl * Inv_W + + model->BSIM3v32pcgsl * Inv_LW; + pParam->BSIM3v32cgdl = model->BSIM3v32cgdl + + model->BSIM3v32lcgdl * Inv_L + + model->BSIM3v32wcgdl * Inv_W + + model->BSIM3v32pcgdl * Inv_LW; + pParam->BSIM3v32ckappa = model->BSIM3v32ckappa + + model->BSIM3v32lckappa * Inv_L + + model->BSIM3v32wckappa * Inv_W + + model->BSIM3v32pckappa * Inv_LW; + pParam->BSIM3v32cf = model->BSIM3v32cf + + model->BSIM3v32lcf * Inv_L + + model->BSIM3v32wcf * Inv_W + + model->BSIM3v32pcf * Inv_LW; + pParam->BSIM3v32clc = model->BSIM3v32clc + + model->BSIM3v32lclc * Inv_L + + model->BSIM3v32wclc * Inv_W + + model->BSIM3v32pclc * Inv_LW; + pParam->BSIM3v32cle = model->BSIM3v32cle + + model->BSIM3v32lcle * Inv_L + + model->BSIM3v32wcle * Inv_W + + model->BSIM3v32pcle * Inv_LW; + pParam->BSIM3v32vfbcv = model->BSIM3v32vfbcv + + model->BSIM3v32lvfbcv * Inv_L + + model->BSIM3v32wvfbcv * Inv_W + + model->BSIM3v32pvfbcv * Inv_LW; + pParam->BSIM3v32acde = model->BSIM3v32acde + + model->BSIM3v32lacde * Inv_L + + model->BSIM3v32wacde * Inv_W + + model->BSIM3v32pacde * Inv_LW; + pParam->BSIM3v32moin = model->BSIM3v32moin + + model->BSIM3v32lmoin * Inv_L + + model->BSIM3v32wmoin * Inv_W + + model->BSIM3v32pmoin * Inv_LW; + pParam->BSIM3v32noff = model->BSIM3v32noff + + model->BSIM3v32lnoff * Inv_L + + model->BSIM3v32wnoff * Inv_W + + model->BSIM3v32pnoff * Inv_LW; + pParam->BSIM3v32voffcv = model->BSIM3v32voffcv + + model->BSIM3v32lvoffcv * Inv_L + + model->BSIM3v32wvoffcv * Inv_W + + model->BSIM3v32pvoffcv * Inv_LW; - pParam->BSIM3v32abulkCVfactor = 1.0 + pow((pParam->BSIM3v32clc - / pParam->BSIM3v32leffCV), - pParam->BSIM3v32cle); + pParam->BSIM3v32abulkCVfactor = 1.0 + pow((pParam->BSIM3v32clc + / pParam->BSIM3v32leffCV), + pParam->BSIM3v32cle); - T0 = (TRatio - 1.0); - pParam->BSIM3v32ua = pParam->BSIM3v32ua + pParam->BSIM3v32ua1 * T0; - pParam->BSIM3v32ub = pParam->BSIM3v32ub + pParam->BSIM3v32ub1 * T0; - pParam->BSIM3v32uc = pParam->BSIM3v32uc + pParam->BSIM3v32uc1 * T0; - if (pParam->BSIM3v32u0 > 1.0) - pParam->BSIM3v32u0 = pParam->BSIM3v32u0 / 1.0e4; + T0 = (TRatio - 1.0); + pParam->BSIM3v32ua = pParam->BSIM3v32ua + pParam->BSIM3v32ua1 * T0; + pParam->BSIM3v32ub = pParam->BSIM3v32ub + pParam->BSIM3v32ub1 * T0; + pParam->BSIM3v32uc = pParam->BSIM3v32uc + pParam->BSIM3v32uc1 * T0; + if (pParam->BSIM3v32u0 > 1.0) + pParam->BSIM3v32u0 = pParam->BSIM3v32u0 / 1.0e4; - pParam->BSIM3v32u0temp = pParam->BSIM3v32u0 - * pow(TRatio, pParam->BSIM3v32ute); - pParam->BSIM3v32vsattemp = pParam->BSIM3v32vsat - pParam->BSIM3v32at - * T0; - pParam->BSIM3v32rds0 = (pParam->BSIM3v32rdsw + pParam->BSIM3v32prt * T0) - / pow(pParam->BSIM3v32weff * 1E6, pParam->BSIM3v32wr); + pParam->BSIM3v32u0temp = pParam->BSIM3v32u0 + * pow(TRatio, pParam->BSIM3v32ute); + pParam->BSIM3v32vsattemp = pParam->BSIM3v32vsat - pParam->BSIM3v32at + * T0; + pParam->BSIM3v32rds0 = (pParam->BSIM3v32rdsw + pParam->BSIM3v32prt * T0) + / pow(pParam->BSIM3v32weff * 1E6, pParam->BSIM3v32wr); - if (BSIM3v32checkModel(model, here, ckt)) - { IFuid namarray[2]; - namarray[0] = model->BSIM3v32modName; - namarray[1] = here->BSIM3v32name; - SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during BSIM3v32V3.2 parameter checking for %s in model %s", namarray); - return(E_BADPARM); - } + if (BSIM3v32checkModel(model, here, ckt)) + { IFuid namarray[2]; + namarray[0] = model->BSIM3v32modName; + namarray[1] = here->BSIM3v32name; + SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during BSIM3v32V3.2 parameter checking for %s in model %s", namarray); + return(E_BADPARM); + } - pParam->BSIM3v32cgdo = (model->BSIM3v32cgdo + pParam->BSIM3v32cf) - * pParam->BSIM3v32weffCV; - pParam->BSIM3v32cgso = (model->BSIM3v32cgso + pParam->BSIM3v32cf) - * pParam->BSIM3v32weffCV; - pParam->BSIM3v32cgbo = model->BSIM3v32cgbo * pParam->BSIM3v32leffCV; + pParam->BSIM3v32cgdo = (model->BSIM3v32cgdo + pParam->BSIM3v32cf) + * pParam->BSIM3v32weffCV; + pParam->BSIM3v32cgso = (model->BSIM3v32cgso + pParam->BSIM3v32cf) + * pParam->BSIM3v32weffCV; + pParam->BSIM3v32cgbo = model->BSIM3v32cgbo * pParam->BSIM3v32leffCV; - T0 = pParam->BSIM3v32leffCV * pParam->BSIM3v32leffCV; - pParam->BSIM3v32tconst = pParam->BSIM3v32u0temp * pParam->BSIM3v32elm / (model->BSIM3v32cox - * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV * T0); + T0 = pParam->BSIM3v32leffCV * pParam->BSIM3v32leffCV; + pParam->BSIM3v32tconst = pParam->BSIM3v32u0temp * pParam->BSIM3v32elm / (model->BSIM3v32cox + * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV * T0); - if (!model->BSIM3v32npeakGiven && model->BSIM3v32gamma1Given) - { T0 = pParam->BSIM3v32gamma1 * model->BSIM3v32cox; - pParam->BSIM3v32npeak = 3.021E22 * T0 * T0; - } + if (!model->BSIM3v32npeakGiven && model->BSIM3v32gamma1Given) + { T0 = pParam->BSIM3v32gamma1 * model->BSIM3v32cox; + pParam->BSIM3v32npeak = 3.021E22 * T0 * T0; + } - pParam->BSIM3v32phi = 2.0 * Vtm0 - * log(pParam->BSIM3v32npeak / ni); + pParam->BSIM3v32phi = 2.0 * Vtm0 + * log(pParam->BSIM3v32npeak / ni); - pParam->BSIM3v32sqrtPhi = sqrt(pParam->BSIM3v32phi); - pParam->BSIM3v32phis3 = pParam->BSIM3v32sqrtPhi * pParam->BSIM3v32phi; + pParam->BSIM3v32sqrtPhi = sqrt(pParam->BSIM3v32phi); + pParam->BSIM3v32phis3 = pParam->BSIM3v32sqrtPhi * pParam->BSIM3v32phi; - pParam->BSIM3v32Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3v32npeak * 1.0e6)) - * pParam->BSIM3v32sqrtPhi; - pParam->BSIM3v32sqrtXdep0 = sqrt(pParam->BSIM3v32Xdep0); - pParam->BSIM3v32litl = sqrt(3.0 * pParam->BSIM3v32xj - * model->BSIM3v32tox); - pParam->BSIM3v32vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3v32npeak / (ni * ni)); - pParam->BSIM3v32cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3v32npeak * 1.0e6 / 2.0 - / pParam->BSIM3v32phi); + pParam->BSIM3v32Xdep0 = sqrt(2.0 * EPSSI / (Charge_q + * pParam->BSIM3v32npeak * 1.0e6)) + * pParam->BSIM3v32sqrtPhi; + pParam->BSIM3v32sqrtXdep0 = sqrt(pParam->BSIM3v32Xdep0); + pParam->BSIM3v32litl = sqrt(3.0 * pParam->BSIM3v32xj + * model->BSIM3v32tox); + pParam->BSIM3v32vbi = Vtm0 * log(1.0e20 + * pParam->BSIM3v32npeak / (ni * ni)); + pParam->BSIM3v32cdep0 = sqrt(Charge_q * EPSSI + * pParam->BSIM3v32npeak * 1.0e6 / 2.0 + / pParam->BSIM3v32phi); - pParam->BSIM3v32ldeb = sqrt(EPSSI * Vtm0 / (Charge_q - * pParam->BSIM3v32npeak * 1.0e6)) / 3.0; - pParam->BSIM3v32acde *= pow((pParam->BSIM3v32npeak / 2.0e16), -0.25); + pParam->BSIM3v32ldeb = sqrt(EPSSI * Vtm0 / (Charge_q + * pParam->BSIM3v32npeak * 1.0e6)) / 3.0; + pParam->BSIM3v32acde *= pow((pParam->BSIM3v32npeak / 2.0e16), -0.25); - if (model->BSIM3v32k1Given || model->BSIM3v32k2Given) - { if (!model->BSIM3v32k1Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM3v32k1 = 0.53; - } - if (!model->BSIM3v32k2Given) - { - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ - fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM3v32k2 = -0.0186; - } - if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ - if (model->BSIM3v32nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v32xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v32vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v32gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM3v32gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - } - else - { if (!model->BSIM3v32vbxGiven) - pParam->BSIM3v32vbx = pParam->BSIM3v32phi - 7.7348e-4 - * pParam->BSIM3v32npeak - * pParam->BSIM3v32xt * pParam->BSIM3v32xt; - if (pParam->BSIM3v32vbx > 0.0) - pParam->BSIM3v32vbx = -pParam->BSIM3v32vbx; - if (pParam->BSIM3v32vbm > 0.0) - pParam->BSIM3v32vbm = -pParam->BSIM3v32vbm; + if (model->BSIM3v32k1Given || model->BSIM3v32k2Given) + { if (!model->BSIM3v32k1Given) + { + if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ + fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + pParam->BSIM3v32k1 = 0.53; + } + if (!model->BSIM3v32k2Given) + { + if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) /* don't print in sensitivity */ + fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + pParam->BSIM3v32k2 = -0.0186; + } + if ((!ckt->CKTcurJob) || (ckt->CKTcurJob->JOBtype < 9)) { /* don't print in sensitivity */ + if (model->BSIM3v32nsubGiven) + fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); + if (model->BSIM3v32xtGiven) + fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); + if (model->BSIM3v32vbxGiven) + fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); + if (model->BSIM3v32gamma1Given) + fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); + if (model->BSIM3v32gamma2Given) + fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); + } + } + else + { if (!model->BSIM3v32vbxGiven) + pParam->BSIM3v32vbx = pParam->BSIM3v32phi - 7.7348e-4 + * pParam->BSIM3v32npeak + * pParam->BSIM3v32xt * pParam->BSIM3v32xt; + if (pParam->BSIM3v32vbx > 0.0) + pParam->BSIM3v32vbx = -pParam->BSIM3v32vbx; + if (pParam->BSIM3v32vbm > 0.0) + pParam->BSIM3v32vbm = -pParam->BSIM3v32vbm; - if (!model->BSIM3v32gamma1Given) - pParam->BSIM3v32gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3v32npeak) - / model->BSIM3v32cox; - if (!model->BSIM3v32gamma2Given) - pParam->BSIM3v32gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3v32nsub) - / model->BSIM3v32cox; + if (!model->BSIM3v32gamma1Given) + pParam->BSIM3v32gamma1 = 5.753e-12 + * sqrt(pParam->BSIM3v32npeak) + / model->BSIM3v32cox; + if (!model->BSIM3v32gamma2Given) + pParam->BSIM3v32gamma2 = 5.753e-12 + * sqrt(pParam->BSIM3v32nsub) + / model->BSIM3v32cox; - T0 = pParam->BSIM3v32gamma1 - pParam->BSIM3v32gamma2; - T1 = sqrt(pParam->BSIM3v32phi - pParam->BSIM3v32vbx) - - pParam->BSIM3v32sqrtPhi; - T2 = sqrt(pParam->BSIM3v32phi * (pParam->BSIM3v32phi - - pParam->BSIM3v32vbm)) - pParam->BSIM3v32phi; - pParam->BSIM3v32k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3v32vbm); - pParam->BSIM3v32k1 = pParam->BSIM3v32gamma2 - 2.0 - * pParam->BSIM3v32k2 * sqrt(pParam->BSIM3v32phi - - pParam->BSIM3v32vbm); - } + T0 = pParam->BSIM3v32gamma1 - pParam->BSIM3v32gamma2; + T1 = sqrt(pParam->BSIM3v32phi - pParam->BSIM3v32vbx) + - pParam->BSIM3v32sqrtPhi; + T2 = sqrt(pParam->BSIM3v32phi * (pParam->BSIM3v32phi + - pParam->BSIM3v32vbm)) - pParam->BSIM3v32phi; + pParam->BSIM3v32k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3v32vbm); + pParam->BSIM3v32k1 = pParam->BSIM3v32gamma2 - 2.0 + * pParam->BSIM3v32k2 * sqrt(pParam->BSIM3v32phi + - pParam->BSIM3v32vbm); + } - if (pParam->BSIM3v32k2 < 0.0) - { T0 = 0.5 * pParam->BSIM3v32k1 / pParam->BSIM3v32k2; - pParam->BSIM3v32vbsc = 0.9 * (pParam->BSIM3v32phi - T0 * T0); - if (pParam->BSIM3v32vbsc > -3.0) - pParam->BSIM3v32vbsc = -3.0; - else if (pParam->BSIM3v32vbsc < -30.0) - pParam->BSIM3v32vbsc = -30.0; - } - else - { pParam->BSIM3v32vbsc = -30.0; - } - if (pParam->BSIM3v32vbsc > pParam->BSIM3v32vbm) - pParam->BSIM3v32vbsc = pParam->BSIM3v32vbm; + if (pParam->BSIM3v32k2 < 0.0) + { T0 = 0.5 * pParam->BSIM3v32k1 / pParam->BSIM3v32k2; + pParam->BSIM3v32vbsc = 0.9 * (pParam->BSIM3v32phi - T0 * T0); + if (pParam->BSIM3v32vbsc > -3.0) + pParam->BSIM3v32vbsc = -3.0; + else if (pParam->BSIM3v32vbsc < -30.0) + pParam->BSIM3v32vbsc = -30.0; + } + else + { pParam->BSIM3v32vbsc = -30.0; + } + if (pParam->BSIM3v32vbsc > pParam->BSIM3v32vbm) + pParam->BSIM3v32vbsc = pParam->BSIM3v32vbm; - if (!model->BSIM3v32vfbGiven) - { if (model->BSIM3v32vth0Given) - { pParam->BSIM3v32vfb = model->BSIM3v32type * pParam->BSIM3v32vth0 - - pParam->BSIM3v32phi - pParam->BSIM3v32k1 - * pParam->BSIM3v32sqrtPhi; - } - else - { pParam->BSIM3v32vfb = -1.0; - } - } - if (!model->BSIM3v32vth0Given) - { pParam->BSIM3v32vth0 = model->BSIM3v32type * (pParam->BSIM3v32vfb - + pParam->BSIM3v32phi + pParam->BSIM3v32k1 - * pParam->BSIM3v32sqrtPhi); - } + if (!model->BSIM3v32vfbGiven) + { if (model->BSIM3v32vth0Given) + { pParam->BSIM3v32vfb = model->BSIM3v32type * pParam->BSIM3v32vth0 + - pParam->BSIM3v32phi - pParam->BSIM3v32k1 + * pParam->BSIM3v32sqrtPhi; + } + else + { pParam->BSIM3v32vfb = -1.0; + } + } + if (!model->BSIM3v32vth0Given) + { pParam->BSIM3v32vth0 = model->BSIM3v32type * (pParam->BSIM3v32vfb + + pParam->BSIM3v32phi + pParam->BSIM3v32k1 + * pParam->BSIM3v32sqrtPhi); + } - pParam->BSIM3v32k1ox = pParam->BSIM3v32k1 * model->BSIM3v32tox - / model->BSIM3v32toxm; - pParam->BSIM3v32k2ox = pParam->BSIM3v32k2 * model->BSIM3v32tox - / model->BSIM3v32toxm; + pParam->BSIM3v32k1ox = pParam->BSIM3v32k1 * model->BSIM3v32tox + / model->BSIM3v32toxm; + pParam->BSIM3v32k2ox = pParam->BSIM3v32k2 * model->BSIM3v32tox + / model->BSIM3v32toxm; - T1 = sqrt(EPSSI / EPSOX * model->BSIM3v32tox - * pParam->BSIM3v32Xdep0); - T0 = exp(-0.5 * pParam->BSIM3v32dsub * pParam->BSIM3v32leff / T1); - pParam->BSIM3v32theta0vb0 = (T0 + 2.0 * T0 * T0); + T1 = sqrt(EPSSI / EPSOX * model->BSIM3v32tox + * pParam->BSIM3v32Xdep0); + T0 = exp(-0.5 * pParam->BSIM3v32dsub * pParam->BSIM3v32leff / T1); + pParam->BSIM3v32theta0vb0 = (T0 + 2.0 * T0 * T0); - T0 = exp(-0.5 * pParam->BSIM3v32drout * pParam->BSIM3v32leff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->BSIM3v32thetaRout = pParam->BSIM3v32pdibl1 * T2 - + pParam->BSIM3v32pdibl2; + T0 = exp(-0.5 * pParam->BSIM3v32drout * pParam->BSIM3v32leff / T1); + T2 = (T0 + 2.0 * T0 * T0); + pParam->BSIM3v32thetaRout = pParam->BSIM3v32pdibl1 * T2 + + pParam->BSIM3v32pdibl2; - tmp = sqrt(pParam->BSIM3v32Xdep0); - tmp1 = pParam->BSIM3v32vbi - pParam->BSIM3v32phi; - tmp2 = model->BSIM3v32factor1 * tmp; + tmp = sqrt(pParam->BSIM3v32Xdep0); + tmp1 = pParam->BSIM3v32vbi - pParam->BSIM3v32phi; + tmp2 = model->BSIM3v32factor1 * tmp; - T0 = -0.5 * pParam->BSIM3v32dvt1w * pParam->BSIM3v32weff - * pParam->BSIM3v32leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->BSIM3v32dvt0w * T2; - T2 = T0 * tmp1; + T0 = -0.5 * pParam->BSIM3v32dvt1w * pParam->BSIM3v32weff + * pParam->BSIM3v32leff / tmp2; + if (T0 > -EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXP; + T2 = T1 * (1.0 + 2.0 * T1); + } + T0 = pParam->BSIM3v32dvt0w * T2; + T2 = T0 * tmp1; - T0 = -0.5 * pParam->BSIM3v32dvt1 * pParam->BSIM3v32leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXP; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->BSIM3v32dvt0 * T3 * tmp1; + T0 = -0.5 * pParam->BSIM3v32dvt1 * pParam->BSIM3v32leff / tmp2; + if (T0 > -EXP_THRESHOLD) + { T1 = exp(T0); + T3 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXP; + T3 = T1 * (1.0 + 2.0 * T1); + } + T3 = pParam->BSIM3v32dvt0 * T3 * tmp1; - T4 = model->BSIM3v32tox * pParam->BSIM3v32phi - / (pParam->BSIM3v32weff + pParam->BSIM3v32w0); + T4 = model->BSIM3v32tox * pParam->BSIM3v32phi + / (pParam->BSIM3v32weff + pParam->BSIM3v32w0); - T0 = sqrt(1.0 + pParam->BSIM3v32nlx / pParam->BSIM3v32leff); - T5 = pParam->BSIM3v32k1ox * (T0 - 1.0) * pParam->BSIM3v32sqrtPhi - + (pParam->BSIM3v32kt1 + pParam->BSIM3v32kt1l / pParam->BSIM3v32leff) - * (TRatio - 1.0); + T0 = sqrt(1.0 + pParam->BSIM3v32nlx / pParam->BSIM3v32leff); + T5 = pParam->BSIM3v32k1ox * (T0 - 1.0) * pParam->BSIM3v32sqrtPhi + + (pParam->BSIM3v32kt1 + pParam->BSIM3v32kt1l / pParam->BSIM3v32leff) + * (TRatio - 1.0); - tmp3 = model->BSIM3v32type * pParam->BSIM3v32vth0 - - T2 - T3 + pParam->BSIM3v32k3 * T4 + T5; - pParam->BSIM3v32vfbzb = tmp3 - pParam->BSIM3v32phi - pParam->BSIM3v32k1 - * pParam->BSIM3v32sqrtPhi; - /* End of vfbzb */ - } + tmp3 = model->BSIM3v32type * pParam->BSIM3v32vth0 + - T2 - T3 + pParam->BSIM3v32k3 * T4 + T5; + pParam->BSIM3v32vfbzb = tmp3 - pParam->BSIM3v32phi - pParam->BSIM3v32k1 + * pParam->BSIM3v32sqrtPhi; + /* End of vfbzb */ + } - /* adding delvto */ - here->BSIM3v32vth0 = pParam->BSIM3v32vth0 + here->BSIM3v32delvto; - here->BSIM3v32vfb = pParam->BSIM3v32vfb + model->BSIM3v32type * here->BSIM3v32delvto; - here->BSIM3v32vfbzb = pParam->BSIM3v32vfbzb + model->BSIM3v32type * here->BSIM3v32delvto; + /* adding delvto */ + here->BSIM3v32vth0 = pParam->BSIM3v32vth0 + here->BSIM3v32delvto; + here->BSIM3v32vfb = pParam->BSIM3v32vfb + model->BSIM3v32type * here->BSIM3v32delvto; + here->BSIM3v32vfbzb = pParam->BSIM3v32vfbzb + model->BSIM3v32type * here->BSIM3v32delvto; - /* low field mobility multiplier */ - here->BSIM3v32u0temp = pParam->BSIM3v32u0temp * here->BSIM3v32mulu0; + /* low field mobility multiplier */ + here->BSIM3v32u0temp = pParam->BSIM3v32u0temp * here->BSIM3v32mulu0; - here->BSIM3v32tconst = here->BSIM3v32u0temp * pParam->BSIM3v32elm / (model->BSIM3v32cox - * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV * T0); + here->BSIM3v32tconst = here->BSIM3v32u0temp * pParam->BSIM3v32elm / (model->BSIM3v32cox + * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV * T0); - /* process source/drain series resistance */ - /* acm model */ - if (model->BSIM3v32acmMod == 0) - { - here->BSIM3v32drainConductance = model->BSIM3v32sheetResistance - * here->BSIM3v32drainSquares; - here->BSIM3v32sourceConductance = model->BSIM3v32sheetResistance - * here->BSIM3v32sourceSquares; - } - else - { - if (here->BSIM3v32drainSquaresGiven) - { - here->BSIM3v32drainConductance = (model->BSIM3v32ld + model->BSIM3v32ldif)/(here->BSIM3v32w + model->BSIM3v32xw)*model->BSIM3v32rd - + model->BSIM3v32sheetResistance * here->BSIM3v32drainSquares + model->BSIM3v32rdc; - } - else - { - here->BSIM3v32drainConductance = ((model->BSIM3v32ld + model->BSIM3v32ldif)*model->BSIM3v32rd - + model->BSIM3v32hdif*model->BSIM3v32sheetResistance)/(here->BSIM3v32w + model->BSIM3v32xw) + model->BSIM3v32rdc; - } - if (here->BSIM3v32sourceSquaresGiven) - { - here->BSIM3v32sourceConductance = (model->BSIM3v32ld + model->BSIM3v32ldif)/(here->BSIM3v32w + model->BSIM3v32xw)*model->BSIM3v32rs - + model->BSIM3v32sheetResistance * here->BSIM3v32sourceSquares + model->BSIM3v32rsc; - } - else - { - here->BSIM3v32sourceConductance = ((model->BSIM3v32ld + model->BSIM3v32ldif)*model->BSIM3v32rs - + model->BSIM3v32hdif*model->BSIM3v32sheetResistance)/(here->BSIM3v32w + model->BSIM3v32xw) + model->BSIM3v32rsc; - } - } - if (here->BSIM3v32drainConductance > 0.0) - here->BSIM3v32drainConductance = 1.0 - / here->BSIM3v32drainConductance; - else - here->BSIM3v32drainConductance = 0.0; + /* process source/drain series resistance */ + /* acm model */ + if (model->BSIM3v32acmMod == 0) + { + here->BSIM3v32drainConductance = model->BSIM3v32sheetResistance + * here->BSIM3v32drainSquares; + here->BSIM3v32sourceConductance = model->BSIM3v32sheetResistance + * here->BSIM3v32sourceSquares; + } + else + { + if (here->BSIM3v32drainSquaresGiven) + { + here->BSIM3v32drainConductance = (model->BSIM3v32ld + model->BSIM3v32ldif)/(here->BSIM3v32w + model->BSIM3v32xw)*model->BSIM3v32rd + + model->BSIM3v32sheetResistance * here->BSIM3v32drainSquares + model->BSIM3v32rdc; + } + else + { + here->BSIM3v32drainConductance = ((model->BSIM3v32ld + model->BSIM3v32ldif)*model->BSIM3v32rd + + model->BSIM3v32hdif*model->BSIM3v32sheetResistance)/(here->BSIM3v32w + model->BSIM3v32xw) + model->BSIM3v32rdc; + } + if (here->BSIM3v32sourceSquaresGiven) + { + here->BSIM3v32sourceConductance = (model->BSIM3v32ld + model->BSIM3v32ldif)/(here->BSIM3v32w + model->BSIM3v32xw)*model->BSIM3v32rs + + model->BSIM3v32sheetResistance * here->BSIM3v32sourceSquares + model->BSIM3v32rsc; + } + else + { + here->BSIM3v32sourceConductance = ((model->BSIM3v32ld + model->BSIM3v32ldif)*model->BSIM3v32rs + + model->BSIM3v32hdif*model->BSIM3v32sheetResistance)/(here->BSIM3v32w + model->BSIM3v32xw) + model->BSIM3v32rsc; + } + } + if (here->BSIM3v32drainConductance > 0.0) + here->BSIM3v32drainConductance = 1.0 + / here->BSIM3v32drainConductance; + else + here->BSIM3v32drainConductance = 0.0; - if (here->BSIM3v32sourceConductance > 0.0) - here->BSIM3v32sourceConductance = 1.0 - / here->BSIM3v32sourceConductance; - else - here->BSIM3v32sourceConductance = 0.0; + if (here->BSIM3v32sourceConductance > 0.0) + here->BSIM3v32sourceConductance = 1.0 + / here->BSIM3v32sourceConductance; + else + here->BSIM3v32sourceConductance = 0.0; - here->BSIM3v32cgso = pParam->BSIM3v32cgso; - here->BSIM3v32cgdo = pParam->BSIM3v32cgdo; + here->BSIM3v32cgso = pParam->BSIM3v32cgso; + here->BSIM3v32cgdo = pParam->BSIM3v32cgdo; - Nvtm = model->BSIM3v32vtm * model->BSIM3v32jctEmissionCoeff; - if (model->BSIM3v32acmMod == 0) - { - if ((here->BSIM3v32sourceArea <= 0.0) && - (here->BSIM3v32sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM3v32sourceArea - * model->BSIM3v32jctTempSatCurDensity - + here->BSIM3v32sourcePerimeter - * model->BSIM3v32jctSidewallTempSatCurDensity; - } - if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth - / SourceSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjsm = - SourceSatCurrent * exp(here->BSIM3v32vjsm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } + Nvtm = model->BSIM3v32vtm * model->BSIM3v32jctEmissionCoeff; + if (model->BSIM3v32acmMod == 0) + { + if ((here->BSIM3v32sourceArea <= 0.0) && + (here->BSIM3v32sourcePerimeter <= 0.0)) + { SourceSatCurrent = 1.0e-14; + } + else + { SourceSatCurrent = here->BSIM3v32sourceArea + * model->BSIM3v32jctTempSatCurDensity + + here->BSIM3v32sourcePerimeter + * model->BSIM3v32jctSidewallTempSatCurDensity; + } + if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) + { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth + / SourceSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + here->BSIM3v32IsEvjsm = + SourceSatCurrent * exp(here->BSIM3v32vjsm / Nvtm); + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } + } - if ((here->BSIM3v32drainArea <= 0.0) && - (here->BSIM3v32drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3v32drainArea - * model->BSIM3v32jctTempSatCurDensity - + here->BSIM3v32drainPerimeter - * model->BSIM3v32jctSidewallTempSatCurDensity; - } - if ((DrainSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjdm = Nvtm * log(model->BSIM3v32ijth - / DrainSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjdm = - DrainSatCurrent * exp(here->BSIM3v32vjdm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } - } - else - { - SourceSatCurrent = 0.0; - if (!here->BSIM3v32sourceAreaGiven) - { - here->BSIM3v32sourceArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; - } - SourceSatCurrent = here->BSIM3v32sourceArea * model->BSIM3v32jctTempSatCurDensity; - if (!here->BSIM3v32sourcePerimeterGiven) - { - here->BSIM3v32sourcePerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; - } - SourceSatCurrent = SourceSatCurrent + here->BSIM3v32sourcePerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; - if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; - if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth - / SourceSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjsm = - SourceSatCurrent * exp(here->BSIM3v32vjsm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } + if ((here->BSIM3v32drainArea <= 0.0) && + (here->BSIM3v32drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3v32drainArea + * model->BSIM3v32jctTempSatCurDensity + + here->BSIM3v32drainPerimeter + * model->BSIM3v32jctSidewallTempSatCurDensity; + } + if ((DrainSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) + { here->BSIM3v32vjdm = Nvtm * log(model->BSIM3v32ijth + / DrainSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + here->BSIM3v32IsEvjdm = + DrainSatCurrent * exp(here->BSIM3v32vjdm / Nvtm); + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } + } + } + else + { + SourceSatCurrent = 0.0; + if (!here->BSIM3v32sourceAreaGiven) + { + here->BSIM3v32sourceArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; + } + SourceSatCurrent = here->BSIM3v32sourceArea * model->BSIM3v32jctTempSatCurDensity; + if (!here->BSIM3v32sourcePerimeterGiven) + { + here->BSIM3v32sourcePerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; + } + SourceSatCurrent = SourceSatCurrent + here->BSIM3v32sourcePerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; + if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; + if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) + { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth + / SourceSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + here->BSIM3v32IsEvjsm = + SourceSatCurrent * exp(here->BSIM3v32vjsm / Nvtm); + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } + } - DrainSatCurrent = 0.0; - if (!here->BSIM3v32drainAreaGiven) - { - here->BSIM3v32drainArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; - } - DrainSatCurrent = here->BSIM3v32drainArea * model->BSIM3v32jctTempSatCurDensity; - if (!here->BSIM3v32drainPerimeterGiven) - { - here->BSIM3v32drainPerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; - } - DrainSatCurrent = DrainSatCurrent + here->BSIM3v32drainPerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; - if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; - if ((DrainSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjdm = Nvtm * log(model->BSIM3v32ijth - / DrainSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjdm = - DrainSatCurrent * exp(here->BSIM3v32vjdm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } - } - } + DrainSatCurrent = 0.0; + if (!here->BSIM3v32drainAreaGiven) + { + here->BSIM3v32drainArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; + } + DrainSatCurrent = here->BSIM3v32drainArea * model->BSIM3v32jctTempSatCurDensity; + if (!here->BSIM3v32drainPerimeterGiven) + { + here->BSIM3v32drainPerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; + } + DrainSatCurrent = DrainSatCurrent + here->BSIM3v32drainPerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; + if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; + if ((DrainSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) + { here->BSIM3v32vjdm = Nvtm * log(model->BSIM3v32ijth + / DrainSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + here->BSIM3v32IsEvjdm = + DrainSatCurrent * exp(here->BSIM3v32vjdm / Nvtm); + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } + } + } + } } return(OK); } diff --git a/src/spicelib/devices/bsim3v32/b3v32trunc.c b/src/spicelib/devices/bsim3v32/b3v32trunc.c index f37510761..976377af6 100644 --- a/src/spicelib/devices/bsim3v32/b3v32trunc.c +++ b/src/spicelib/devices/bsim3v32/b3v32trunc.c @@ -3,7 +3,7 @@ /********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3trunc.c of BSIM3v3.2.4 - * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Poalo Nenzi 2002 @@ -28,8 +28,8 @@ BSIM3v32instance *here; for (; model != NULL; model = model->BSIM3v32nextModel) { for (here = model->BSIM3v32instances; here != NULL; - here = here->BSIM3v32nextInstance) - { + here = here->BSIM3v32nextInstance) + { #ifdef STEPDEBUG debugtemp = *timeStep; #endif /* STEPDEBUG */ @@ -38,7 +38,7 @@ BSIM3v32instance *here; CKTterr(here->BSIM3v32qd,ckt,timeStep); #ifdef STEPDEBUG if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", + { printf("device %s reduces step from %g to %g\n", here->BSIM3v32name,debugtemp,*timeStep); } #endif /* STEPDEBUG */ diff --git a/src/spicelib/devices/bsim3v32/bsim3v32def.h b/src/spicelib/devices/bsim3v32/bsim3v32def.h index 5c7e47919..188f2bfe4 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32def.h +++ b/src/spicelib/devices/bsim3v32/bsim3v32def.h @@ -14,7 +14,7 @@ File: bsim3v32def.h #include "ngspice/gendefs.h" #include "ngspice/cktdefs.h" #include "ngspice/complex.h" -#include "ngspice/noisedef.h" +#include "ngspice/noisedef.h" typedef struct sBSIM3v32instance { @@ -32,7 +32,7 @@ typedef struct sBSIM3v32instance /* MCJ */ double BSIM3v32ueff; - double BSIM3v32thetavth; + double BSIM3v32thetavth; double BSIM3v32von; double BSIM3v32vdsat; double BSIM3v32cgdo; @@ -44,7 +44,7 @@ typedef struct sBSIM3v32instance double BSIM3v32l; double BSIM3v32w; - double BSIM3v32m; + double BSIM3v32m; double BSIM3v32drainArea; double BSIM3v32sourceArea; double BSIM3v32drainSquares; @@ -120,7 +120,7 @@ typedef struct sBSIM3v32instance unsigned BSIM3v32lGiven :1; unsigned BSIM3v32wGiven :1; - unsigned BSIM3v32mGiven :1; + unsigned BSIM3v32mGiven :1; unsigned BSIM3v32drainAreaGiven :1; unsigned BSIM3v32sourceAreaGiven :1; unsigned BSIM3v32drainSquaresGiven :1; @@ -217,29 +217,29 @@ struct bsim3v32SizeDependParam double Width; double Length; - double BSIM3v32cdsc; - double BSIM3v32cdscb; - double BSIM3v32cdscd; - double BSIM3v32cit; - double BSIM3v32nfactor; + double BSIM3v32cdsc; + double BSIM3v32cdscb; + double BSIM3v32cdscd; + double BSIM3v32cit; + double BSIM3v32nfactor; double BSIM3v32xj; - double BSIM3v32vsat; - double BSIM3v32at; - double BSIM3v32a0; - double BSIM3v32ags; - double BSIM3v32a1; - double BSIM3v32a2; - double BSIM3v32keta; + double BSIM3v32vsat; + double BSIM3v32at; + double BSIM3v32a0; + double BSIM3v32ags; + double BSIM3v32a1; + double BSIM3v32a2; + double BSIM3v32keta; double BSIM3v32nsub; - double BSIM3v32npeak; - double BSIM3v32ngate; - double BSIM3v32gamma1; - double BSIM3v32gamma2; - double BSIM3v32vbx; - double BSIM3v32vbi; - double BSIM3v32vbm; - double BSIM3v32vbsc; - double BSIM3v32xt; + double BSIM3v32npeak; + double BSIM3v32ngate; + double BSIM3v32gamma1; + double BSIM3v32gamma2; + double BSIM3v32vbx; + double BSIM3v32vbi; + double BSIM3v32vbm; + double BSIM3v32vbsc; + double BSIM3v32xt; double BSIM3v32phi; double BSIM3v32litl; double BSIM3v32k1; @@ -251,14 +251,14 @@ struct bsim3v32SizeDependParam double BSIM3v32k3b; double BSIM3v32w0; double BSIM3v32nlx; - double BSIM3v32dvt0; - double BSIM3v32dvt1; - double BSIM3v32dvt2; - double BSIM3v32dvt0w; - double BSIM3v32dvt1w; - double BSIM3v32dvt2w; - double BSIM3v32drout; - double BSIM3v32dsub; + double BSIM3v32dvt0; + double BSIM3v32dvt1; + double BSIM3v32dvt2; + double BSIM3v32dvt0w; + double BSIM3v32dvt1w; + double BSIM3v32dvt2w; + double BSIM3v32drout; + double BSIM3v32dsub; double BSIM3v32vth0; double BSIM3v32ua; double BSIM3v32ua1; @@ -271,20 +271,20 @@ struct bsim3v32SizeDependParam double BSIM3v32voff; double BSIM3v32vfb; double BSIM3v32delta; - double BSIM3v32rdsw; - double BSIM3v32rds0; - double BSIM3v32prwg; - double BSIM3v32prwb; - double BSIM3v32prt; - double BSIM3v32eta0; - double BSIM3v32etab; - double BSIM3v32pclm; - double BSIM3v32pdibl1; - double BSIM3v32pdibl2; - double BSIM3v32pdiblb; - double BSIM3v32pscbe1; - double BSIM3v32pscbe2; - double BSIM3v32pvag; + double BSIM3v32rdsw; + double BSIM3v32rds0; + double BSIM3v32prwg; + double BSIM3v32prwb; + double BSIM3v32prt; + double BSIM3v32eta0; + double BSIM3v32etab; + double BSIM3v32pclm; + double BSIM3v32pdibl1; + double BSIM3v32pdibl2; + double BSIM3v32pdiblb; + double BSIM3v32pscbe1; + double BSIM3v32pscbe2; + double BSIM3v32pvag; double BSIM3v32wr; double BSIM3v32dwg; double BSIM3v32dwb; @@ -327,14 +327,14 @@ struct bsim3v32SizeDependParam double BSIM3v32cgbo; double BSIM3v32tconst; - double BSIM3v32u0temp; - double BSIM3v32vsattemp; - double BSIM3v32sqrtPhi; - double BSIM3v32phis3; - double BSIM3v32Xdep0; - double BSIM3v32sqrtXdep0; + double BSIM3v32u0temp; + double BSIM3v32vsattemp; + double BSIM3v32sqrtPhi; + double BSIM3v32phis3; + double BSIM3v32Xdep0; + double BSIM3v32sqrtXdep0; double BSIM3v32theta0vb0; - double BSIM3v32thetaRout; + double BSIM3v32thetaRout; double BSIM3v32cof1; double BSIM3v32cof2; @@ -350,12 +350,12 @@ struct bsim3v32SizeDependParam }; -typedef struct sBSIM3v32model +typedef struct sBSIM3v32model { int BSIM3v32modType; struct sBSIM3v32model *BSIM3v32nextModel; BSIM3v32instance *BSIM3v32instances; - IFuid BSIM3v32modName; + IFuid BSIM3v32modName; int BSIM3v32type; int BSIM3v32mobMod; @@ -364,39 +364,39 @@ typedef struct sBSIM3v32model int BSIM3v32noiMod; int BSIM3v32binUnit; int BSIM3v32paramChk; - char *BSIM3v32version; + char *BSIM3v32version; /* The following field is an integer coding * of BSIM3v32version. - */ - int BSIM3v32intVersion; + */ + int BSIM3v32intVersion; #define BSIM3v32V324 324 /* BSIM3v32 V3.2.4 */ #define BSIM3v32V323 323 /* BSIM3v32 V3.2.3 */ #define BSIM3v32V322 322 /* BSIM3v32 V3.2.2 */ #define BSIM3v32V32 32 /* BSIM3v32 V3.2 */ #define BSIM3v32V3OLD 0 /* Old model */ - double BSIM3v32tox; + double BSIM3v32tox; double BSIM3v32toxm; - double BSIM3v32cdsc; - double BSIM3v32cdscb; - double BSIM3v32cdscd; - double BSIM3v32cit; - double BSIM3v32nfactor; + double BSIM3v32cdsc; + double BSIM3v32cdscb; + double BSIM3v32cdscd; + double BSIM3v32cit; + double BSIM3v32nfactor; double BSIM3v32xj; - double BSIM3v32vsat; - double BSIM3v32at; - double BSIM3v32a0; - double BSIM3v32ags; - double BSIM3v32a1; - double BSIM3v32a2; - double BSIM3v32keta; + double BSIM3v32vsat; + double BSIM3v32at; + double BSIM3v32a0; + double BSIM3v32ags; + double BSIM3v32a1; + double BSIM3v32a2; + double BSIM3v32keta; double BSIM3v32nsub; - double BSIM3v32npeak; - double BSIM3v32ngate; - double BSIM3v32gamma1; - double BSIM3v32gamma2; - double BSIM3v32vbx; - double BSIM3v32vbm; - double BSIM3v32xt; + double BSIM3v32npeak; + double BSIM3v32ngate; + double BSIM3v32gamma1; + double BSIM3v32gamma2; + double BSIM3v32vbx; + double BSIM3v32vbm; + double BSIM3v32xt; double BSIM3v32k1; double BSIM3v32kt1; double BSIM3v32kt1l; @@ -406,14 +406,14 @@ typedef struct sBSIM3v32model double BSIM3v32k3b; double BSIM3v32w0; double BSIM3v32nlx; - double BSIM3v32dvt0; - double BSIM3v32dvt1; - double BSIM3v32dvt2; - double BSIM3v32dvt0w; - double BSIM3v32dvt1w; - double BSIM3v32dvt2w; - double BSIM3v32drout; - double BSIM3v32dsub; + double BSIM3v32dvt0; + double BSIM3v32dvt1; + double BSIM3v32dvt2; + double BSIM3v32dvt0w; + double BSIM3v32dvt1w; + double BSIM3v32dvt2w; + double BSIM3v32drout; + double BSIM3v32dsub; double BSIM3v32vth0; double BSIM3v32ua; double BSIM3v32ua1; @@ -425,19 +425,19 @@ typedef struct sBSIM3v32model double BSIM3v32ute; double BSIM3v32voff; double BSIM3v32delta; - double BSIM3v32rdsw; + double BSIM3v32rdsw; double BSIM3v32prwg; double BSIM3v32prwb; - double BSIM3v32prt; - double BSIM3v32eta0; - double BSIM3v32etab; - double BSIM3v32pclm; - double BSIM3v32pdibl1; - double BSIM3v32pdibl2; + double BSIM3v32prt; + double BSIM3v32eta0; + double BSIM3v32etab; + double BSIM3v32pclm; + double BSIM3v32pdibl1; + double BSIM3v32pdibl2; double BSIM3v32pdiblb; - double BSIM3v32pscbe1; - double BSIM3v32pscbe2; - double BSIM3v32pvag; + double BSIM3v32pscbe1; + double BSIM3v32pscbe2; + double BSIM3v32pvag; double BSIM3v32wr; double BSIM3v32dwg; double BSIM3v32dwb; @@ -481,27 +481,27 @@ typedef struct sBSIM3v32model double BSIM3v32rsc; /* Length Dependence */ - double BSIM3v32lcdsc; - double BSIM3v32lcdscb; - double BSIM3v32lcdscd; - double BSIM3v32lcit; - double BSIM3v32lnfactor; + double BSIM3v32lcdsc; + double BSIM3v32lcdscb; + double BSIM3v32lcdscd; + double BSIM3v32lcit; + double BSIM3v32lnfactor; double BSIM3v32lxj; - double BSIM3v32lvsat; - double BSIM3v32lat; - double BSIM3v32la0; - double BSIM3v32lags; - double BSIM3v32la1; - double BSIM3v32la2; - double BSIM3v32lketa; + double BSIM3v32lvsat; + double BSIM3v32lat; + double BSIM3v32la0; + double BSIM3v32lags; + double BSIM3v32la1; + double BSIM3v32la2; + double BSIM3v32lketa; double BSIM3v32lnsub; - double BSIM3v32lnpeak; - double BSIM3v32lngate; - double BSIM3v32lgamma1; - double BSIM3v32lgamma2; - double BSIM3v32lvbx; - double BSIM3v32lvbm; - double BSIM3v32lxt; + double BSIM3v32lnpeak; + double BSIM3v32lngate; + double BSIM3v32lgamma1; + double BSIM3v32lgamma2; + double BSIM3v32lvbx; + double BSIM3v32lvbm; + double BSIM3v32lxt; double BSIM3v32lk1; double BSIM3v32lkt1; double BSIM3v32lkt1l; @@ -511,14 +511,14 @@ typedef struct sBSIM3v32model double BSIM3v32lk3b; double BSIM3v32lw0; double BSIM3v32lnlx; - double BSIM3v32ldvt0; - double BSIM3v32ldvt1; - double BSIM3v32ldvt2; - double BSIM3v32ldvt0w; - double BSIM3v32ldvt1w; - double BSIM3v32ldvt2w; - double BSIM3v32ldrout; - double BSIM3v32ldsub; + double BSIM3v32ldvt0; + double BSIM3v32ldvt1; + double BSIM3v32ldvt2; + double BSIM3v32ldvt0w; + double BSIM3v32ldvt1w; + double BSIM3v32ldvt2w; + double BSIM3v32ldrout; + double BSIM3v32ldsub; double BSIM3v32lvth0; double BSIM3v32lua; double BSIM3v32lua1; @@ -530,19 +530,19 @@ typedef struct sBSIM3v32model double BSIM3v32lute; double BSIM3v32lvoff; double BSIM3v32ldelta; - double BSIM3v32lrdsw; + double BSIM3v32lrdsw; double BSIM3v32lprwg; double BSIM3v32lprwb; - double BSIM3v32lprt; - double BSIM3v32leta0; - double BSIM3v32letab; - double BSIM3v32lpclm; - double BSIM3v32lpdibl1; - double BSIM3v32lpdibl2; + double BSIM3v32lprt; + double BSIM3v32leta0; + double BSIM3v32letab; + double BSIM3v32lpclm; + double BSIM3v32lpdibl1; + double BSIM3v32lpdibl2; double BSIM3v32lpdiblb; - double BSIM3v32lpscbe1; - double BSIM3v32lpscbe2; - double BSIM3v32lpvag; + double BSIM3v32lpscbe1; + double BSIM3v32lpscbe2; + double BSIM3v32lpvag; double BSIM3v32lwr; double BSIM3v32ldwg; double BSIM3v32ldwb; @@ -568,27 +568,27 @@ typedef struct sBSIM3v32model double BSIM3v32lmoin; /* Width Dependence */ - double BSIM3v32wcdsc; - double BSIM3v32wcdscb; - double BSIM3v32wcdscd; - double BSIM3v32wcit; - double BSIM3v32wnfactor; + double BSIM3v32wcdsc; + double BSIM3v32wcdscb; + double BSIM3v32wcdscd; + double BSIM3v32wcit; + double BSIM3v32wnfactor; double BSIM3v32wxj; - double BSIM3v32wvsat; - double BSIM3v32wat; - double BSIM3v32wa0; - double BSIM3v32wags; - double BSIM3v32wa1; - double BSIM3v32wa2; - double BSIM3v32wketa; + double BSIM3v32wvsat; + double BSIM3v32wat; + double BSIM3v32wa0; + double BSIM3v32wags; + double BSIM3v32wa1; + double BSIM3v32wa2; + double BSIM3v32wketa; double BSIM3v32wnsub; - double BSIM3v32wnpeak; - double BSIM3v32wngate; - double BSIM3v32wgamma1; - double BSIM3v32wgamma2; - double BSIM3v32wvbx; - double BSIM3v32wvbm; - double BSIM3v32wxt; + double BSIM3v32wnpeak; + double BSIM3v32wngate; + double BSIM3v32wgamma1; + double BSIM3v32wgamma2; + double BSIM3v32wvbx; + double BSIM3v32wvbm; + double BSIM3v32wxt; double BSIM3v32wk1; double BSIM3v32wkt1; double BSIM3v32wkt1l; @@ -598,14 +598,14 @@ typedef struct sBSIM3v32model double BSIM3v32wk3b; double BSIM3v32ww0; double BSIM3v32wnlx; - double BSIM3v32wdvt0; - double BSIM3v32wdvt1; - double BSIM3v32wdvt2; - double BSIM3v32wdvt0w; - double BSIM3v32wdvt1w; - double BSIM3v32wdvt2w; - double BSIM3v32wdrout; - double BSIM3v32wdsub; + double BSIM3v32wdvt0; + double BSIM3v32wdvt1; + double BSIM3v32wdvt2; + double BSIM3v32wdvt0w; + double BSIM3v32wdvt1w; + double BSIM3v32wdvt2w; + double BSIM3v32wdrout; + double BSIM3v32wdsub; double BSIM3v32wvth0; double BSIM3v32wua; double BSIM3v32wua1; @@ -617,19 +617,19 @@ typedef struct sBSIM3v32model double BSIM3v32wute; double BSIM3v32wvoff; double BSIM3v32wdelta; - double BSIM3v32wrdsw; + double BSIM3v32wrdsw; double BSIM3v32wprwg; double BSIM3v32wprwb; - double BSIM3v32wprt; - double BSIM3v32weta0; - double BSIM3v32wetab; - double BSIM3v32wpclm; - double BSIM3v32wpdibl1; - double BSIM3v32wpdibl2; + double BSIM3v32wprt; + double BSIM3v32weta0; + double BSIM3v32wetab; + double BSIM3v32wpclm; + double BSIM3v32wpdibl1; + double BSIM3v32wpdibl2; double BSIM3v32wpdiblb; - double BSIM3v32wpscbe1; - double BSIM3v32wpscbe2; - double BSIM3v32wpvag; + double BSIM3v32wpscbe1; + double BSIM3v32wpscbe2; + double BSIM3v32wpvag; double BSIM3v32wwr; double BSIM3v32wdwg; double BSIM3v32wdwb; @@ -655,27 +655,27 @@ typedef struct sBSIM3v32model double BSIM3v32wmoin; /* Cross-term Dependence */ - double BSIM3v32pcdsc; - double BSIM3v32pcdscb; - double BSIM3v32pcdscd; - double BSIM3v32pcit; - double BSIM3v32pnfactor; + double BSIM3v32pcdsc; + double BSIM3v32pcdscb; + double BSIM3v32pcdscd; + double BSIM3v32pcit; + double BSIM3v32pnfactor; double BSIM3v32pxj; - double BSIM3v32pvsat; - double BSIM3v32pat; - double BSIM3v32pa0; - double BSIM3v32pags; - double BSIM3v32pa1; - double BSIM3v32pa2; - double BSIM3v32pketa; + double BSIM3v32pvsat; + double BSIM3v32pat; + double BSIM3v32pa0; + double BSIM3v32pags; + double BSIM3v32pa1; + double BSIM3v32pa2; + double BSIM3v32pketa; double BSIM3v32pnsub; - double BSIM3v32pnpeak; - double BSIM3v32pngate; - double BSIM3v32pgamma1; - double BSIM3v32pgamma2; - double BSIM3v32pvbx; - double BSIM3v32pvbm; - double BSIM3v32pxt; + double BSIM3v32pnpeak; + double BSIM3v32pngate; + double BSIM3v32pgamma1; + double BSIM3v32pgamma2; + double BSIM3v32pvbx; + double BSIM3v32pvbm; + double BSIM3v32pxt; double BSIM3v32pk1; double BSIM3v32pkt1; double BSIM3v32pkt1l; @@ -685,14 +685,14 @@ typedef struct sBSIM3v32model double BSIM3v32pk3b; double BSIM3v32pw0; double BSIM3v32pnlx; - double BSIM3v32pdvt0; - double BSIM3v32pdvt1; - double BSIM3v32pdvt2; - double BSIM3v32pdvt0w; - double BSIM3v32pdvt1w; - double BSIM3v32pdvt2w; - double BSIM3v32pdrout; - double BSIM3v32pdsub; + double BSIM3v32pdvt0; + double BSIM3v32pdvt1; + double BSIM3v32pdvt2; + double BSIM3v32pdvt0w; + double BSIM3v32pdvt1w; + double BSIM3v32pdvt2w; + double BSIM3v32pdrout; + double BSIM3v32pdsub; double BSIM3v32pvth0; double BSIM3v32pua; double BSIM3v32pua1; @@ -707,16 +707,16 @@ typedef struct sBSIM3v32model double BSIM3v32prdsw; double BSIM3v32pprwg; double BSIM3v32pprwb; - double BSIM3v32pprt; - double BSIM3v32peta0; - double BSIM3v32petab; - double BSIM3v32ppclm; - double BSIM3v32ppdibl1; - double BSIM3v32ppdibl2; + double BSIM3v32pprt; + double BSIM3v32peta0; + double BSIM3v32petab; + double BSIM3v32ppclm; + double BSIM3v32ppdibl1; + double BSIM3v32ppdibl2; double BSIM3v32ppdiblb; - double BSIM3v32ppscbe1; - double BSIM3v32ppscbe2; - double BSIM3v32ppvag; + double BSIM3v32ppscbe1; + double BSIM3v32ppscbe2; + double BSIM3v32ppvag; double BSIM3v32pwr; double BSIM3v32pdwg; double BSIM3v32pdwb; @@ -794,7 +794,7 @@ typedef struct sBSIM3v32model /* Pre-calculated constants */ /* MCJ: move to size-dependent param. */ - double BSIM3v32vtm; + double BSIM3v32vtm; double BSIM3v32cox; double BSIM3v32cof1; double BSIM3v32cof2; @@ -811,13 +811,13 @@ typedef struct sBSIM3v32model double BSIM3v32unitLengthSidewallTempJctCap; double BSIM3v32unitLengthGateSidewallTempJctCap; - double BSIM3v32oxideTrapDensityA; - double BSIM3v32oxideTrapDensityB; - double BSIM3v32oxideTrapDensityC; - double BSIM3v32em; - double BSIM3v32ef; - double BSIM3v32af; - double BSIM3v32kf; + double BSIM3v32oxideTrapDensityA; + double BSIM3v32oxideTrapDensityB; + double BSIM3v32oxideTrapDensityC; + double BSIM3v32em; + double BSIM3v32ef; + double BSIM3v32af; + double BSIM3v32kf; struct bsim3v32SizeDependParam *pSizeDependParamKnot; @@ -844,7 +844,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32agsGiven :1; unsigned BSIM3v32a1Given :1; unsigned BSIM3v32a2Given :1; - unsigned BSIM3v32ketaGiven :1; + unsigned BSIM3v32ketaGiven :1; unsigned BSIM3v32nsubGiven :1; unsigned BSIM3v32npeakGiven :1; unsigned BSIM3v32ngateGiven :1; @@ -862,14 +862,14 @@ typedef struct sBSIM3v32model unsigned BSIM3v32k3bGiven :1; unsigned BSIM3v32w0Given :1; unsigned BSIM3v32nlxGiven :1; - unsigned BSIM3v32dvt0Given :1; - unsigned BSIM3v32dvt1Given :1; - unsigned BSIM3v32dvt2Given :1; - unsigned BSIM3v32dvt0wGiven :1; - unsigned BSIM3v32dvt1wGiven :1; - unsigned BSIM3v32dvt2wGiven :1; - unsigned BSIM3v32droutGiven :1; - unsigned BSIM3v32dsubGiven :1; + unsigned BSIM3v32dvt0Given :1; + unsigned BSIM3v32dvt1Given :1; + unsigned BSIM3v32dvt2Given :1; + unsigned BSIM3v32dvt0wGiven :1; + unsigned BSIM3v32dvt1wGiven :1; + unsigned BSIM3v32dvt2wGiven :1; + unsigned BSIM3v32droutGiven :1; + unsigned BSIM3v32dsubGiven :1; unsigned BSIM3v32vth0Given :1; unsigned BSIM3v32uaGiven :1; unsigned BSIM3v32ua1Given :1; @@ -880,20 +880,20 @@ typedef struct sBSIM3v32model unsigned BSIM3v32u0Given :1; unsigned BSIM3v32uteGiven :1; unsigned BSIM3v32voffGiven :1; - unsigned BSIM3v32rdswGiven :1; - unsigned BSIM3v32prwgGiven :1; - unsigned BSIM3v32prwbGiven :1; - unsigned BSIM3v32prtGiven :1; - unsigned BSIM3v32eta0Given :1; - unsigned BSIM3v32etabGiven :1; - unsigned BSIM3v32pclmGiven :1; - unsigned BSIM3v32pdibl1Given :1; - unsigned BSIM3v32pdibl2Given :1; - unsigned BSIM3v32pdiblbGiven :1; - unsigned BSIM3v32pscbe1Given :1; - unsigned BSIM3v32pscbe2Given :1; - unsigned BSIM3v32pvagGiven :1; - unsigned BSIM3v32deltaGiven :1; + unsigned BSIM3v32rdswGiven :1; + unsigned BSIM3v32prwgGiven :1; + unsigned BSIM3v32prwbGiven :1; + unsigned BSIM3v32prtGiven :1; + unsigned BSIM3v32eta0Given :1; + unsigned BSIM3v32etabGiven :1; + unsigned BSIM3v32pclmGiven :1; + unsigned BSIM3v32pdibl1Given :1; + unsigned BSIM3v32pdibl2Given :1; + unsigned BSIM3v32pdiblbGiven :1; + unsigned BSIM3v32pscbe1Given :1; + unsigned BSIM3v32pscbe2Given :1; + unsigned BSIM3v32pvagGiven :1; + unsigned BSIM3v32deltaGiven :1; unsigned BSIM3v32wrGiven :1; unsigned BSIM3v32dwgGiven :1; unsigned BSIM3v32dwbGiven :1; @@ -906,7 +906,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32vfbGiven :1; /* CV model */ - unsigned BSIM3v32elmGiven :1; + unsigned BSIM3v32elmGiven :1; unsigned BSIM3v32cgslGiven :1; unsigned BSIM3v32cgdlGiven :1; unsigned BSIM3v32ckappaGiven :1; @@ -928,7 +928,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32tpbswgGiven :1; /* acm model */ - unsigned BSIM3v32hdifGiven :1; + unsigned BSIM3v32hdifGiven :1; unsigned BSIM3v32ldifGiven :1; unsigned BSIM3v32ldGiven :1; unsigned BSIM3v32rdGiven :1; @@ -949,7 +949,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32lagsGiven :1; unsigned BSIM3v32la1Given :1; unsigned BSIM3v32la2Given :1; - unsigned BSIM3v32lketaGiven :1; + unsigned BSIM3v32lketaGiven :1; unsigned BSIM3v32lnsubGiven :1; unsigned BSIM3v32lnpeakGiven :1; unsigned BSIM3v32lngateGiven :1; @@ -967,14 +967,14 @@ typedef struct sBSIM3v32model unsigned BSIM3v32lk3bGiven :1; unsigned BSIM3v32lw0Given :1; unsigned BSIM3v32lnlxGiven :1; - unsigned BSIM3v32ldvt0Given :1; - unsigned BSIM3v32ldvt1Given :1; - unsigned BSIM3v32ldvt2Given :1; - unsigned BSIM3v32ldvt0wGiven :1; - unsigned BSIM3v32ldvt1wGiven :1; - unsigned BSIM3v32ldvt2wGiven :1; - unsigned BSIM3v32ldroutGiven :1; - unsigned BSIM3v32ldsubGiven :1; + unsigned BSIM3v32ldvt0Given :1; + unsigned BSIM3v32ldvt1Given :1; + unsigned BSIM3v32ldvt2Given :1; + unsigned BSIM3v32ldvt0wGiven :1; + unsigned BSIM3v32ldvt1wGiven :1; + unsigned BSIM3v32ldvt2wGiven :1; + unsigned BSIM3v32ldroutGiven :1; + unsigned BSIM3v32ldsubGiven :1; unsigned BSIM3v32lvth0Given :1; unsigned BSIM3v32luaGiven :1; unsigned BSIM3v32lua1Given :1; @@ -985,20 +985,20 @@ typedef struct sBSIM3v32model unsigned BSIM3v32lu0Given :1; unsigned BSIM3v32luteGiven :1; unsigned BSIM3v32lvoffGiven :1; - unsigned BSIM3v32lrdswGiven :1; - unsigned BSIM3v32lprwgGiven :1; - unsigned BSIM3v32lprwbGiven :1; - unsigned BSIM3v32lprtGiven :1; - unsigned BSIM3v32leta0Given :1; - unsigned BSIM3v32letabGiven :1; - unsigned BSIM3v32lpclmGiven :1; - unsigned BSIM3v32lpdibl1Given :1; - unsigned BSIM3v32lpdibl2Given :1; - unsigned BSIM3v32lpdiblbGiven :1; - unsigned BSIM3v32lpscbe1Given :1; - unsigned BSIM3v32lpscbe2Given :1; - unsigned BSIM3v32lpvagGiven :1; - unsigned BSIM3v32ldeltaGiven :1; + unsigned BSIM3v32lrdswGiven :1; + unsigned BSIM3v32lprwgGiven :1; + unsigned BSIM3v32lprwbGiven :1; + unsigned BSIM3v32lprtGiven :1; + unsigned BSIM3v32leta0Given :1; + unsigned BSIM3v32letabGiven :1; + unsigned BSIM3v32lpclmGiven :1; + unsigned BSIM3v32lpdibl1Given :1; + unsigned BSIM3v32lpdibl2Given :1; + unsigned BSIM3v32lpdiblbGiven :1; + unsigned BSIM3v32lpscbe1Given :1; + unsigned BSIM3v32lpscbe2Given :1; + unsigned BSIM3v32lpvagGiven :1; + unsigned BSIM3v32ldeltaGiven :1; unsigned BSIM3v32lwrGiven :1; unsigned BSIM3v32ldwgGiven :1; unsigned BSIM3v32ldwbGiven :1; @@ -1010,7 +1010,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32lvfbGiven :1; /* CV model */ - unsigned BSIM3v32lelmGiven :1; + unsigned BSIM3v32lelmGiven :1; unsigned BSIM3v32lcgslGiven :1; unsigned BSIM3v32lcgdlGiven :1; unsigned BSIM3v32lckappaGiven :1; @@ -1036,7 +1036,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32wagsGiven :1; unsigned BSIM3v32wa1Given :1; unsigned BSIM3v32wa2Given :1; - unsigned BSIM3v32wketaGiven :1; + unsigned BSIM3v32wketaGiven :1; unsigned BSIM3v32wnsubGiven :1; unsigned BSIM3v32wnpeakGiven :1; unsigned BSIM3v32wngateGiven :1; @@ -1054,14 +1054,14 @@ typedef struct sBSIM3v32model unsigned BSIM3v32wk3bGiven :1; unsigned BSIM3v32ww0Given :1; unsigned BSIM3v32wnlxGiven :1; - unsigned BSIM3v32wdvt0Given :1; - unsigned BSIM3v32wdvt1Given :1; - unsigned BSIM3v32wdvt2Given :1; - unsigned BSIM3v32wdvt0wGiven :1; - unsigned BSIM3v32wdvt1wGiven :1; - unsigned BSIM3v32wdvt2wGiven :1; - unsigned BSIM3v32wdroutGiven :1; - unsigned BSIM3v32wdsubGiven :1; + unsigned BSIM3v32wdvt0Given :1; + unsigned BSIM3v32wdvt1Given :1; + unsigned BSIM3v32wdvt2Given :1; + unsigned BSIM3v32wdvt0wGiven :1; + unsigned BSIM3v32wdvt1wGiven :1; + unsigned BSIM3v32wdvt2wGiven :1; + unsigned BSIM3v32wdroutGiven :1; + unsigned BSIM3v32wdsubGiven :1; unsigned BSIM3v32wvth0Given :1; unsigned BSIM3v32wuaGiven :1; unsigned BSIM3v32wua1Given :1; @@ -1072,20 +1072,20 @@ typedef struct sBSIM3v32model unsigned BSIM3v32wu0Given :1; unsigned BSIM3v32wuteGiven :1; unsigned BSIM3v32wvoffGiven :1; - unsigned BSIM3v32wrdswGiven :1; - unsigned BSIM3v32wprwgGiven :1; - unsigned BSIM3v32wprwbGiven :1; - unsigned BSIM3v32wprtGiven :1; - unsigned BSIM3v32weta0Given :1; - unsigned BSIM3v32wetabGiven :1; - unsigned BSIM3v32wpclmGiven :1; - unsigned BSIM3v32wpdibl1Given :1; - unsigned BSIM3v32wpdibl2Given :1; - unsigned BSIM3v32wpdiblbGiven :1; - unsigned BSIM3v32wpscbe1Given :1; - unsigned BSIM3v32wpscbe2Given :1; - unsigned BSIM3v32wpvagGiven :1; - unsigned BSIM3v32wdeltaGiven :1; + unsigned BSIM3v32wrdswGiven :1; + unsigned BSIM3v32wprwgGiven :1; + unsigned BSIM3v32wprwbGiven :1; + unsigned BSIM3v32wprtGiven :1; + unsigned BSIM3v32weta0Given :1; + unsigned BSIM3v32wetabGiven :1; + unsigned BSIM3v32wpclmGiven :1; + unsigned BSIM3v32wpdibl1Given :1; + unsigned BSIM3v32wpdibl2Given :1; + unsigned BSIM3v32wpdiblbGiven :1; + unsigned BSIM3v32wpscbe1Given :1; + unsigned BSIM3v32wpscbe2Given :1; + unsigned BSIM3v32wpvagGiven :1; + unsigned BSIM3v32wdeltaGiven :1; unsigned BSIM3v32wwrGiven :1; unsigned BSIM3v32wdwgGiven :1; unsigned BSIM3v32wdwbGiven :1; @@ -1097,7 +1097,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32wvfbGiven :1; /* CV model */ - unsigned BSIM3v32welmGiven :1; + unsigned BSIM3v32welmGiven :1; unsigned BSIM3v32wcgslGiven :1; unsigned BSIM3v32wcgdlGiven :1; unsigned BSIM3v32wckappaGiven :1; @@ -1123,7 +1123,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32pagsGiven :1; unsigned BSIM3v32pa1Given :1; unsigned BSIM3v32pa2Given :1; - unsigned BSIM3v32pketaGiven :1; + unsigned BSIM3v32pketaGiven :1; unsigned BSIM3v32pnsubGiven :1; unsigned BSIM3v32pnpeakGiven :1; unsigned BSIM3v32pngateGiven :1; @@ -1141,14 +1141,14 @@ typedef struct sBSIM3v32model unsigned BSIM3v32pk3bGiven :1; unsigned BSIM3v32pw0Given :1; unsigned BSIM3v32pnlxGiven :1; - unsigned BSIM3v32pdvt0Given :1; - unsigned BSIM3v32pdvt1Given :1; - unsigned BSIM3v32pdvt2Given :1; - unsigned BSIM3v32pdvt0wGiven :1; - unsigned BSIM3v32pdvt1wGiven :1; - unsigned BSIM3v32pdvt2wGiven :1; - unsigned BSIM3v32pdroutGiven :1; - unsigned BSIM3v32pdsubGiven :1; + unsigned BSIM3v32pdvt0Given :1; + unsigned BSIM3v32pdvt1Given :1; + unsigned BSIM3v32pdvt2Given :1; + unsigned BSIM3v32pdvt0wGiven :1; + unsigned BSIM3v32pdvt1wGiven :1; + unsigned BSIM3v32pdvt2wGiven :1; + unsigned BSIM3v32pdroutGiven :1; + unsigned BSIM3v32pdsubGiven :1; unsigned BSIM3v32pvth0Given :1; unsigned BSIM3v32puaGiven :1; unsigned BSIM3v32pua1Given :1; @@ -1159,20 +1159,20 @@ typedef struct sBSIM3v32model unsigned BSIM3v32pu0Given :1; unsigned BSIM3v32puteGiven :1; unsigned BSIM3v32pvoffGiven :1; - unsigned BSIM3v32prdswGiven :1; - unsigned BSIM3v32pprwgGiven :1; - unsigned BSIM3v32pprwbGiven :1; - unsigned BSIM3v32pprtGiven :1; - unsigned BSIM3v32peta0Given :1; - unsigned BSIM3v32petabGiven :1; - unsigned BSIM3v32ppclmGiven :1; - unsigned BSIM3v32ppdibl1Given :1; - unsigned BSIM3v32ppdibl2Given :1; - unsigned BSIM3v32ppdiblbGiven :1; - unsigned BSIM3v32ppscbe1Given :1; - unsigned BSIM3v32ppscbe2Given :1; - unsigned BSIM3v32ppvagGiven :1; - unsigned BSIM3v32pdeltaGiven :1; + unsigned BSIM3v32prdswGiven :1; + unsigned BSIM3v32pprwgGiven :1; + unsigned BSIM3v32pprwbGiven :1; + unsigned BSIM3v32pprtGiven :1; + unsigned BSIM3v32peta0Given :1; + unsigned BSIM3v32petabGiven :1; + unsigned BSIM3v32ppclmGiven :1; + unsigned BSIM3v32ppdibl1Given :1; + unsigned BSIM3v32ppdibl2Given :1; + unsigned BSIM3v32ppdiblbGiven :1; + unsigned BSIM3v32ppscbe1Given :1; + unsigned BSIM3v32ppscbe2Given :1; + unsigned BSIM3v32ppvagGiven :1; + unsigned BSIM3v32pdeltaGiven :1; unsigned BSIM3v32pwrGiven :1; unsigned BSIM3v32pdwgGiven :1; unsigned BSIM3v32pdwbGiven :1; @@ -1184,7 +1184,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32pvfbGiven :1; /* CV model */ - unsigned BSIM3v32pelmGiven :1; + unsigned BSIM3v32pelmGiven :1; unsigned BSIM3v32pcgslGiven :1; unsigned BSIM3v32pcgdlGiven :1; unsigned BSIM3v32pckappaGiven :1; @@ -1217,15 +1217,15 @@ typedef struct sBSIM3v32model unsigned BSIM3v32bulkJctGateSideGradingCoeffGiven :1; unsigned BSIM3v32unitLengthGateSidewallJctCapGiven :1; unsigned BSIM3v32jctEmissionCoeffGiven :1; - unsigned BSIM3v32jctTempExponentGiven :1; + unsigned BSIM3v32jctTempExponentGiven :1; - unsigned BSIM3v32oxideTrapDensityAGiven :1; - unsigned BSIM3v32oxideTrapDensityBGiven :1; - unsigned BSIM3v32oxideTrapDensityCGiven :1; - unsigned BSIM3v32emGiven :1; - unsigned BSIM3v32efGiven :1; - unsigned BSIM3v32afGiven :1; - unsigned BSIM3v32kfGiven :1; + unsigned BSIM3v32oxideTrapDensityAGiven :1; + unsigned BSIM3v32oxideTrapDensityBGiven :1; + unsigned BSIM3v32oxideTrapDensityCGiven :1; + unsigned BSIM3v32emGiven :1; + unsigned BSIM3v32efGiven :1; + unsigned BSIM3v32afGiven :1; + unsigned BSIM3v32kfGiven :1; unsigned BSIM3v32LintGiven :1; unsigned BSIM3v32LlGiven :1; @@ -1286,8 +1286,8 @@ typedef struct sBSIM3v32model /* model parameters */ #define BSIM3v32_MOD_CAPMOD 101 #define BSIM3v32_MOD_ACMMOD 102 -#define BSIM3v32_MOD_MOBMOD 103 -#define BSIM3v32_MOD_NOIMOD 104 +#define BSIM3v32_MOD_MOBMOD 103 +#define BSIM3v32_MOD_NOIMOD 104 #define BSIM3v32_MOD_TOX 105 @@ -1301,14 +1301,14 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_A0 113 #define BSIM3v32_MOD_A1 114 #define BSIM3v32_MOD_A2 115 -#define BSIM3v32_MOD_KETA 116 +#define BSIM3v32_MOD_KETA 116 #define BSIM3v32_MOD_NSUB 117 #define BSIM3v32_MOD_NPEAK 118 #define BSIM3v32_MOD_NGATE 120 #define BSIM3v32_MOD_GAMMA1 121 #define BSIM3v32_MOD_GAMMA2 122 #define BSIM3v32_MOD_VBX 123 -#define BSIM3v32_MOD_BINUNIT 124 +#define BSIM3v32_MOD_BINUNIT 124 #define BSIM3v32_MOD_VBM 125 @@ -1408,7 +1408,7 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_LA0 258 #define BSIM3v32_MOD_LA1 259 #define BSIM3v32_MOD_LA2 260 -#define BSIM3v32_MOD_LKETA 261 +#define BSIM3v32_MOD_LKETA 261 #define BSIM3v32_MOD_LNSUB 262 #define BSIM3v32_MOD_LNPEAK 263 #define BSIM3v32_MOD_LNGATE 265 @@ -1476,7 +1476,7 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_LCDSCD 327 #define BSIM3v32_MOD_LAGS 328 - + #define BSIM3v32_MOD_LFRINGE 331 #define BSIM3v32_MOD_LELM 332 @@ -1505,7 +1505,7 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_WA0 388 #define BSIM3v32_MOD_WA1 389 #define BSIM3v32_MOD_WA2 390 -#define BSIM3v32_MOD_WKETA 391 +#define BSIM3v32_MOD_WKETA 391 #define BSIM3v32_MOD_WNSUB 392 #define BSIM3v32_MOD_WNPEAK 393 #define BSIM3v32_MOD_WNGATE 395 @@ -1602,7 +1602,7 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_PA0 518 #define BSIM3v32_MOD_PA1 519 #define BSIM3v32_MOD_PA2 520 -#define BSIM3v32_MOD_PKETA 521 +#define BSIM3v32_MOD_PKETA 521 #define BSIM3v32_MOD_PNSUB 522 #define BSIM3v32_MOD_PNPEAK 523 #define BSIM3v32_MOD_PNGATE 525 @@ -1811,8 +1811,8 @@ typedef struct sBSIM3v32model #include "bsim3v32ext.h" extern void BSIM3v32evaluate(double,double,double,BSIM3v32instance*,BSIM3v32model*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, + double*,double*,double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); extern int BSIM3v32debug(BSIM3v32model*, BSIM3v32instance*, CKTcircuit*, int); extern int BSIM3v32checkModel(BSIM3v32model*, BSIM3v32instance*, CKTcircuit*); diff --git a/src/spicelib/devices/bsim3v32/bsim3v32ext.h b/src/spicelib/devices/bsim3v32/bsim3v32ext.h index b61b05109..b64496f6d 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32ext.h +++ b/src/spicelib/devices/bsim3v32/bsim3v32ext.h @@ -20,7 +20,7 @@ extern void BSIM3v32mosCap(CKTcircuit*, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double*, double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, double*); extern int BSIM3v32param(int,IFvalue*,GENinstance*,IFvalue*); extern int BSIM3v32pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); diff --git a/src/spicelib/devices/bsim3v32/bsim3v32init.c b/src/spicelib/devices/bsim3v32/bsim3v32init.c index 954088002..544a189d6 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32init.c +++ b/src/spicelib/devices/bsim3v32/bsim3v32init.c @@ -52,7 +52,7 @@ SPICEdev BSIM3v32info = { /* DEVaccept */ NULL, /* DEVdestroy */ BSIM3v32destroy, /* DEVmodDelete */ BSIM3v32mDelete, - /* DEVdelete */ BSIM3v32delete, + /* DEVdelete */ BSIM3v32delete, /* DEVsetic */ BSIM3v32getic, /* DEVask */ BSIM3v32ask, /* DEVmodAsk */ BSIM3v32mAsk, @@ -69,7 +69,7 @@ SPICEdev BSIM3v32info = { #ifdef CIDER /* DEVdump */ NULL, /* DEVacct */ NULL, -#endif +#endif /* DEVinstSize */ &BSIM3v32iSize, /* DEVmodSize */ &BSIM3v32mSize From 81c8a23d28ab604c42ff3d17a86e2031e3e2f921 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Wed, 15 May 2013 21:09:09 +0200 Subject: [PATCH 069/257] inpcom.c: disable m for e, h --- src/frontend/inpcom.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 052c5a179..5147dd615 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2650,8 +2650,9 @@ inp_fix_subckt_multiplier(struct line *subckt_card, for (card = subckt_card->li_next; card != NULL && !ciprefix(".ends", card->li_line); card = card->li_next) { - /* no 'm' for B, V or comment line */ - if ((*(card->li_line) == '*') || (*(card->li_line) == 'b') || (*(card->li_line) == 'v')) + /* no 'm' for B, V, E, H or comment line */ + if ((*(card->li_line) == '*') || (*(card->li_line) == 'b') || (*(card->li_line) == 'v') || + (*(card->li_line) == 'e') || (*(card->li_line) == 'h')) continue; /* no 'm' for model cards */ if (ciprefix(".model", card->li_line)) From da38175e21b41fc5d159ace6a21957eecff4bfdd Mon Sep 17 00:00:00 2001 From: h_vogt Date: Wed, 15 May 2013 21:10:39 +0200 Subject: [PATCH 070/257] defines.f, winmain.c, .h: enable --with-wingui for CYGWIN --- src/include/ngspice/defines.h | 2 +- src/winmain.c | 5 +++-- src/winmain.h | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/include/ngspice/defines.h b/src/include/ngspice/defines.h index 98663e245..99c28c302 100644 --- a/src/include/ngspice/defines.h +++ b/src/include/ngspice/defines.h @@ -74,7 +74,7 @@ /* Alternate initialisation file name */ #define ALT_INITSTR "spice.rc" -#if defined(__MINGW32__) || defined(_MSC_VER) +#if defined(__MINGW32__) || defined(_MSC_VER) || defined (HAS_WINGUI) #define DIR_PATHSEP "\\" #define DIR_TERM '\\' #define DIR_PATHSEP_LINUX "/" diff --git a/src/winmain.c b/src/winmain.c index cf36fdbf8..5fe1d01b9 100644 --- a/src/winmain.c +++ b/src/winmain.c @@ -1384,8 +1384,9 @@ int system( const char * command) } // system Windows95 #endif */ +#ifdef __CYGWIN__ /* Strip leading spaces, return a copy of s */ -/*static char* rlead(char *s) +static char* rlead(char *s) { int i,j=0; static char temp[512]; @@ -1406,7 +1407,7 @@ int system( const char * command) temp[j] = '\0'; return copy(temp); } -*/ +#endif void winmessage(char* new_msg) { diff --git a/src/winmain.h b/src/winmain.h index fc4944b7a..657a3c41d 100644 --- a/src/winmain.h +++ b/src/winmain.h @@ -5,7 +5,9 @@ /* Forward definition of main() */ int xmain( int argc, char * argv[]); /* forward of Update function */ -//static char* rlead(char*); +#ifdef __CYGWIN__ +static char* rlead(char*); +#endif void winmessage(char*); static void HistoryInit(void); From ecbaffa43d0f7c66dad56ce92ec45338b9bf7bfb Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 15 May 2013 21:33:07 +0200 Subject: [PATCH 071/257] correct rdc and rsc definition --- src/spicelib/devices/bsim3v32/b3v32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/bsim3v32/b3v32.c b/src/spicelib/devices/bsim3v32/b3v32.c index 58898654e..5881eaa1c 100644 --- a/src/spicelib/devices/bsim3v32/b3v32.c +++ b/src/spicelib/devices/bsim3v32/b3v32.c @@ -218,8 +218,8 @@ IOP( "ldif", BSIM3v32_MOD_LDIF, IF_REAL, "ACM Parameter: Length of LDD Gate-Sour IOP( "ld", BSIM3v32_MOD_LD, IF_REAL, "ACM Parameter: Length of LDD under Gate"), IOP( "rd", BSIM3v32_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain side"), IOP( "rs", BSIM3v32_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"), -IOP( "rdc", BSIM3v32_MOD_RS, IF_REAL, "ACM Parameter: Resistance contact drain side"), -IOP( "rsc", BSIM3v32_MOD_RS, IF_REAL, "ACM Parameter: Resistance contact source side"), +IOP( "rdc", BSIM3v32_MOD_RDC, IF_REAL, "ACM Parameter: Resistance contact drain side"), +IOP( "rsc", BSIM3v32_MOD_RSC, IF_REAL, "ACM Parameter: Resistance contact source side"), IOP( "alpha0", BSIM3v32_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), IOP( "alpha1", BSIM3v32_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), From 55b59d76ba8076db1cb6d12520b42204744de1ff Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 16 May 2013 22:22:51 +0200 Subject: [PATCH 072/257] Area Calculation Method (ACM) applied to bsim3v3.2.4 model --- src/include/ngspice/devdefs.h | 17 +- src/spicelib/devices/bsim3v32/b3v32.c | 3 + src/spicelib/devices/bsim3v32/b3v32ask.c | 3 + src/spicelib/devices/bsim3v32/b3v32check.c | 8 +- src/spicelib/devices/bsim3v32/b3v32ld.c | 249 +++++++------ src/spicelib/devices/bsim3v32/b3v32mask.c | 8 +- src/spicelib/devices/bsim3v32/b3v32mpar.c | 8 + src/spicelib/devices/bsim3v32/b3v32par.c | 4 + src/spicelib/devices/bsim3v32/b3v32set.c | 18 +- src/spicelib/devices/bsim3v32/b3v32temp.c | 205 +++++------ src/spicelib/devices/bsim3v32/bsim3v32def.h | 32 +- src/spicelib/devices/devsup.c | 373 ++++++++++++++++++++ 12 files changed, 671 insertions(+), 257 deletions(-) diff --git a/src/include/ngspice/devdefs.h b/src/include/ngspice/devdefs.h index c91598f54..f86390dbb 100644 --- a/src/include/ngspice/devdefs.h +++ b/src/include/ngspice/devdefs.h @@ -28,10 +28,21 @@ double limitJunctionVoltage( double, double, int * ); double limitVbe( double, double, int * ); double limitVce( double, double, int * ); double limitVgb( double, double, int * ); - - - +/* Area Calculation Method (ACM) for MOS models (devsup.c) */ +int +ACM_SourceDrainResistances(int, double, double, double, double, double, + double, double, int, double, double, double, + int, double, double, double, double *, double *); +int +ACM_saturationCurrents(int, int, int, double, double, double, double, double, + double, int, double, int, double, int, double, int, + double, double *, double *); +int +ACM_junctionCapacitances(int, int, int, double, double, double, double, int, + double, int, double, int, double, int, double, + double, double, double, double *, double *, + double *, double *, double *, double *); typedef struct SPICEdev { IFdevice DEVpublic; diff --git a/src/spicelib/devices/bsim3v32/b3v32.c b/src/spicelib/devices/bsim3v32/b3v32.c index 5881eaa1c..d6f766822 100644 --- a/src/spicelib/devices/bsim3v32/b3v32.c +++ b/src/spicelib/devices/bsim3v32/b3v32.c @@ -26,6 +26,7 @@ IOP( "nrd", BSIM3v32_NRD, IF_REAL , "Number of squares in drain"), IOP( "nrs", BSIM3v32_NRS, IF_REAL , "Number of squares in source"), IOP( "off", BSIM3v32_OFF, IF_FLAG , "Device is initially off"), IOP( "nqsmod", BSIM3v32_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), +IOP( "geo", BSIM3v32_GEO, IF_INTEGER, "ACM model drain/source connection"), IOP( "delvto", BSIM3v32_DELVTO, IF_REAL , "Zero bias threshold voltage variation"), IOP( "mulu0", BSIM3v32_MULU0, IF_REAL , "Low field mobility multiplier"), IP( "ic", BSIM3v32_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), @@ -66,6 +67,7 @@ IOP( "capmod", BSIM3v32_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), IOP( "mobmod", BSIM3v32_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), IOP( "noimod", BSIM3v32_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), IOP( "acm", BSIM3v32_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), +IOP( "calcacm", BSIM3v32_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"), IOP( "paramchk", BSIM3v32_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), IOP( "binunit", BSIM3v32_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), IOP( "version", BSIM3v32_MOD_VERSION, IF_STRING, " parameter for model version"), @@ -220,6 +222,7 @@ IOP( "rd", BSIM3v32_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain sid IOP( "rs", BSIM3v32_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"), IOP( "rdc", BSIM3v32_MOD_RDC, IF_REAL, "ACM Parameter: Resistance contact drain side"), IOP( "rsc", BSIM3v32_MOD_RSC, IF_REAL, "ACM Parameter: Resistance contact source side"), +IOP( "wmlt", BSIM3v32_MOD_WMLT, IF_REAL, "ACM Parameter: Width shrink factor"), IOP( "alpha0", BSIM3v32_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), IOP( "alpha1", BSIM3v32_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), diff --git a/src/spicelib/devices/bsim3v32/b3v32ask.c b/src/spicelib/devices/bsim3v32/b3v32ask.c index 3eb7b1730..7d405a936 100644 --- a/src/spicelib/devices/bsim3v32/b3v32ask.c +++ b/src/spicelib/devices/bsim3v32/b3v32ask.c @@ -59,6 +59,9 @@ BSIM3v32instance *here = (BSIM3v32instance*)inst; case BSIM3v32_NQSMOD: value->iValue = here->BSIM3v32nqsMod; return(OK); + case BSIM3v32_GEO: + value->iValue = here->BSIM3v32geo; + return(OK); case BSIM3v32_DELVTO: value->rValue = here->BSIM3v32delvto; return(OK); diff --git a/src/spicelib/devices/bsim3v32/b3v32check.c b/src/spicelib/devices/bsim3v32/b3v32check.c index f297934dc..86f4fabd0 100644 --- a/src/spicelib/devices/bsim3v32/b3v32check.c +++ b/src/spicelib/devices/bsim3v32/b3v32check.c @@ -178,7 +178,7 @@ FILE *fplog; printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3v32pscbe2); } - /* acm model */ + /* ACM model */ if (model->BSIM3v32acmMod == 0) { if (model->BSIM3v32unitLengthSidewallJctCap > 0.0 || model->BSIM3v32unitLengthGateSidewallJctCap > 0.0) @@ -197,6 +197,12 @@ FILE *fplog; } } } + if ((model->BSIM3v32calcacm > 0) && (model->BSIM3v32acmMod != 12)) + { fprintf(fplog, "Warning: CALCACM = %d is wrong. Set back to 0.\n", + model->BSIM3v32calcacm); + printf("Warning: CALCACM = %d is wrong. Set back to 0.\n", model->BSIM3v32calcacm); + model->BSIM3v32calcacm = 0; + } if (pParam->BSIM3v32noff < 0.1) { fprintf(fplog, "Warning: Noff = %g is too small.\n", diff --git a/src/spicelib/devices/bsim3v32/b3v32ld.c b/src/spicelib/devices/bsim3v32/b3v32ld.c index 69b212937..ab1f62fee 100644 --- a/src/spicelib/devices/bsim3v32/b3v32ld.c +++ b/src/spicelib/devices/bsim3v32/b3v32ld.c @@ -351,21 +351,40 @@ for (; model != NULL; model = model->BSIM3v32nextModel) + here->BSIM3v32sourcePerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; } + if ((here->BSIM3v32drainArea <= 0.0) && (here->BSIM3v32drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3v32drainArea + * model->BSIM3v32jctTempSatCurDensity + + here->BSIM3v32drainPerimeter + * model->BSIM3v32jctSidewallTempSatCurDensity; + } } else { - SourceSatCurrent = 0.0; - if (!here->BSIM3v32sourceAreaGiven) - { - here->BSIM3v32sourceArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; - } - SourceSatCurrent = here->BSIM3v32sourceArea * model->BSIM3v32jctTempSatCurDensity; - if (!here->BSIM3v32sourcePerimeterGiven) - { - here->BSIM3v32sourcePerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; - } - SourceSatCurrent = SourceSatCurrent + here->BSIM3v32sourcePerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; - if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; + if ( + ACM_saturationCurrents( + model->BSIM3v32acmMod, + model->BSIM3v32calcacm, + here->BSIM3v32geo, + model->BSIM3v32hdif, + model->BSIM3v32wmlt, + here->BSIM3v32w, + model->BSIM3v32xw, + model->BSIM3v32jctTempSatCurDensity, + model->BSIM3v32jctSidewallTempSatCurDensity, + here->BSIM3v32drainAreaGiven, + here->BSIM3v32drainArea, + here->BSIM3v32drainPerimeterGiven, + here->BSIM3v32drainPerimeter, + here->BSIM3v32sourceAreaGiven, + here->BSIM3v32sourceArea, + here->BSIM3v32sourcePerimeterGiven, + here->BSIM3v32sourcePerimeter, + &DrainSatCurrent, + &SourceSatCurrent + ) == 0) printf("load IDsat: %g ISsat: %g\n",DrainSatCurrent,SourceSatCurrent); } if (SourceSatCurrent <= 0.0) { here->BSIM3v32gbs = ckt->CKTgmin; @@ -408,34 +427,6 @@ for (; model != NULL; model = model->BSIM3v32nextModel) } } - /* acm model */ - if (model->BSIM3v32acmMod == 0) - { - if ((here->BSIM3v32drainArea <= 0.0) && (here->BSIM3v32drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3v32drainArea - * model->BSIM3v32jctTempSatCurDensity - + here->BSIM3v32drainPerimeter - * model->BSIM3v32jctSidewallTempSatCurDensity; - } - } - else - { - DrainSatCurrent = 0.0; - if (!here->BSIM3v32drainAreaGiven) - { - here->BSIM3v32drainArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; - } - DrainSatCurrent = here->BSIM3v32drainArea * model->BSIM3v32jctTempSatCurDensity; - if (!here->BSIM3v32drainPerimeterGiven) - { - here->BSIM3v32drainPerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; - } - DrainSatCurrent = DrainSatCurrent + here->BSIM3v32drainPerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; - if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; - } if (DrainSatCurrent <= 0.0) { here->BSIM3v32gbd = ckt->CKTgmin; here->BSIM3v32cbd = here->BSIM3v32gbd * vbd; @@ -2460,80 +2451,112 @@ finished: along gate side */ - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbd = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32drainArea; /*bug fix */ - czbs = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32sourceArea; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbd = model->BSIM3v32unitAreaJctCap * here->BSIM3v32drainArea; - czbs = model->BSIM3v32unitAreaJctCap * here->BSIM3v32sourceArea; - } + if (model->BSIM3v32acmMod == 0) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + czbd = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32drainArea; /*bug fix */ + czbs = model->BSIM3v32unitAreaTempJctCap * here->BSIM3v32sourceArea; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + czbd = model->BSIM3v32unitAreaJctCap * here->BSIM3v32drainArea; + czbs = model->BSIM3v32unitAreaJctCap * here->BSIM3v32sourceArea; + } + + if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff) + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap + * here->BSIM3v32drainPerimeter; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + czbdswg = model->BSIM3v32unitLengthGateSidewallJctCap + * here->BSIM3v32drainPerimeter; + } + czbdsw = 0.0; + } + else + { + czbdsw = model->BSIM3v32unitLengthSidewallTempJctCap + * (here->BSIM3v32drainPerimeter - pParam->BSIM3v32weff); + czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap + * pParam->BSIM3v32weff; + } + if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff) + { + czbssw = 0.0; + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap + * here->BSIM3v32sourcePerimeter; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap + * here->BSIM3v32sourcePerimeter; + } + } + else + { + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + czbssw = model->BSIM3v32unitLengthSidewallTempJctCap + * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); + czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap + * pParam->BSIM3v32weff; + break; + case BSIM3v32V322: + case BSIM3v32V32: + default: + czbssw = model->BSIM3v32unitLengthSidewallJctCap + * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); + czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap + * pParam->BSIM3v32weff; + } + } - if (here->BSIM3v32drainPerimeter < pParam->BSIM3v32weff) - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * here->BSIM3v32drainPerimeter; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbdswg = model->BSIM3v32unitLengthGateSidewallJctCap - * here->BSIM3v32drainPerimeter; - } - czbdsw = 0.0; - } - else - { - czbdsw = model->BSIM3v32unitLengthSidewallTempJctCap - * (here->BSIM3v32drainPerimeter - pParam->BSIM3v32weff); - czbdswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * pParam->BSIM3v32weff; - } - if (here->BSIM3v32sourcePerimeter < pParam->BSIM3v32weff) - { - czbssw = 0.0; - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * here->BSIM3v32sourcePerimeter; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap - * here->BSIM3v32sourcePerimeter; - } - } - else - { - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - czbssw = model->BSIM3v32unitLengthSidewallTempJctCap - * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); - czbsswg = model->BSIM3v32unitLengthGateSidewallTempJctCap - * pParam->BSIM3v32weff; - break; - case BSIM3v32V322: - case BSIM3v32V32: - default: - czbssw = model->BSIM3v32unitLengthSidewallJctCap - * (here->BSIM3v32sourcePerimeter - pParam->BSIM3v32weff); - czbsswg = model->BSIM3v32unitLengthGateSidewallJctCap - * pParam->BSIM3v32weff; - } + } else { + if( + ACM_junctionCapacitances( + model->BSIM3v32acmMod, + model->BSIM3v32calcacm, + here->BSIM3v32geo, + model->BSIM3v32hdif, + model->BSIM3v32wmlt, + here->BSIM3v32w, + model->BSIM3v32xw, + here->BSIM3v32drainAreaGiven, + here->BSIM3v32drainArea, + here->BSIM3v32drainPerimeterGiven, + here->BSIM3v32drainPerimeter, + here->BSIM3v32sourceAreaGiven, + here->BSIM3v32sourceArea, + here->BSIM3v32sourcePerimeterGiven, + here->BSIM3v32sourcePerimeter, + model->BSIM3v32unitAreaTempJctCap, + model->BSIM3v32unitLengthSidewallTempJctCap, + model->BSIM3v32unitLengthGateSidewallJctCap, + &czbd, + &czbdsw, + &czbdswg, + &czbs, + &czbssw, + &czbsswg + ) == 0) printf("load Cda: %g Cdsw: %g Cdswg: %g Csa: %g Cssw: %g Csswg %g\n",czbd,czbdsw,czbdswg,czbs,czbssw,czbsswg); } MJ = model->BSIM3v32bulkJctBotGradingCoeff; diff --git a/src/spicelib/devices/bsim3v32/b3v32mask.c b/src/spicelib/devices/bsim3v32/b3v32mask.c index d031ce718..bf66890a0 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mask.c +++ b/src/spicelib/devices/bsim3v32/b3v32mask.c @@ -43,6 +43,9 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3v32_MOD_ACMMOD: value->iValue = model->BSIM3v32acmMod; return(OK); + case BSIM3v32_MOD_CALCACM: + value->iValue = model->BSIM3v32calcacm; + return(OK); case BSIM3v32_MOD_VERSION : value->sValue = model->BSIM3v32version; return(OK); @@ -334,7 +337,7 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3v32tpbswg; return(OK); - /* acm model */ + /* ACM model */ case BSIM3v32_MOD_HDIF: value->rValue = model->BSIM3v32hdif; return(OK); @@ -356,6 +359,9 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3v32_MOD_RSC: value->rValue = model->BSIM3v32rsc; return(OK); + case BSIM3v32_MOD_WMLT: + value->rValue = model->BSIM3v32wmlt; + return(OK); /* Length dependence */ case BSIM3v32_MOD_LCDSC : diff --git a/src/spicelib/devices/bsim3v32/b3v32mpar.c b/src/spicelib/devices/bsim3v32/b3v32mpar.c index 6ca123156..46cd00364 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mpar.c +++ b/src/spicelib/devices/bsim3v32/b3v32mpar.c @@ -41,6 +41,10 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32acmMod = value->iValue; mod->BSIM3v32acmModGiven = TRUE; break; + case BSIM3v32_MOD_CALCACM: + mod->BSIM3v32calcacm = value->iValue; + mod->BSIM3v32calcacmGiven = TRUE; + break; case BSIM3v32_MOD_NOIMOD : mod->BSIM3v32noiMod = value->iValue; mod->BSIM3v32noiModGiven = TRUE; @@ -465,6 +469,10 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32rsc = value->rValue; mod->BSIM3v32rscGiven = TRUE; break; + case BSIM3v32_MOD_WMLT: + mod->BSIM3v32wmlt = value->rValue; + mod->BSIM3v32wmltGiven = TRUE; + break; /* Length dependence */ case BSIM3v32_MOD_LCDSC : diff --git a/src/spicelib/devices/bsim3v32/b3v32par.c b/src/spicelib/devices/bsim3v32/b3v32par.c index 5ff8a05a8..425eb4489 100644 --- a/src/spicelib/devices/bsim3v32/b3v32par.c +++ b/src/spicelib/devices/bsim3v32/b3v32par.c @@ -84,6 +84,10 @@ BSIM3v32param (int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->BSIM3v32nqsMod = value->iValue; here->BSIM3v32nqsModGiven = TRUE; break; + case BSIM3v32_GEO: + here->BSIM3v32geo = value->iValue; + here->BSIM3v32geoGiven = TRUE; + break; case BSIM3v32_DELVTO: here->BSIM3v32delvto = value->rValue; here->BSIM3v32delvtoGiven = TRUE; diff --git a/src/spicelib/devices/bsim3v32/b3v32set.c b/src/spicelib/devices/bsim3v32/b3v32set.c index df50109ca..52e8acd0a 100644 --- a/src/spicelib/devices/bsim3v32/b3v32set.c +++ b/src/spicelib/devices/bsim3v32/b3v32set.c @@ -54,6 +54,8 @@ IFuid tmpName; model->BSIM3v32capMod = 3; if (!model->BSIM3v32acmModGiven) model->BSIM3v32acmMod = 0; + if (!model->BSIM3v32calcacmGiven) + model->BSIM3v32calcacm = 0; if (!model->BSIM3v32noiModGiven) model->BSIM3v32noiMod = 1; @@ -259,7 +261,7 @@ IFuid tmpName; if (!model->BSIM3v32tpbswgGiven) model->BSIM3v32tpbswg = 0.0; - /* acm model */ + /* ACM model */ if (!model->BSIM3v32hdifGiven) model->BSIM3v32hdif = 0.0; if (!model->BSIM3v32ldifGiven) @@ -274,6 +276,8 @@ IFuid tmpName; model->BSIM3v32rdc = 0.0; if (!model->BSIM3v32rscGiven) model->BSIM3v32rsc = 0.0; + if (!model->BSIM3v32wmltGiven) + model->BSIM3v32wmlt = 1.0; /* Length dependence */ if (!model->BSIM3v32lcdscGiven) @@ -939,6 +943,8 @@ IFuid tmpName; here->BSIM3v32w = 5.0e-6; if (!here->BSIM3v32nqsModGiven) here->BSIM3v32nqsMod = 0; + if (!here->BSIM3v32geoGiven) + here->BSIM3v32geo = 0; if (!here->BSIM3v32mGiven) here->BSIM3v32m = 1; @@ -995,14 +1001,14 @@ IFuid tmpName; { here->BSIM3v32sNodePrime = here->BSIM3v32sNode; } - /* internal charge node */ + /* internal charge node */ if (here->BSIM3v32nqsMod) { if(here->BSIM3v32qNode == 0) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3v32name,"charge"); - if(error) return(error); - here->BSIM3v32qNode = tmp->number; - } + { error = CKTmkVolt(ckt,&tmp,here->BSIM3v32name,"charge"); + if(error) return(error); + here->BSIM3v32qNode = tmp->number; + } } else { here->BSIM3v32qNode = 0; diff --git a/src/spicelib/devices/bsim3v32/b3v32temp.c b/src/spicelib/devices/bsim3v32/b3v32temp.c index d8fb780e1..96b5493fe 100644 --- a/src/spicelib/devices/bsim3v32/b3v32temp.c +++ b/src/spicelib/devices/bsim3v32/b3v32temp.c @@ -15,6 +15,7 @@ #include "bsim3v32def.h" #include "ngspice/const.h" #include "ngspice/sperror.h" +#include "ngspice/devdefs.h" #include "ngspice/suffix.h" #define Kb 1.3806226e-23 @@ -876,36 +877,37 @@ int Size_Not_Found; * pParam->BSIM3v32weffCV * pParam->BSIM3v32leffCV * T0); /* process source/drain series resistance */ - /* acm model */ + /* ACM model */ if (model->BSIM3v32acmMod == 0) { - here->BSIM3v32drainConductance = model->BSIM3v32sheetResistance - * here->BSIM3v32drainSquares; - here->BSIM3v32sourceConductance = model->BSIM3v32sheetResistance - * here->BSIM3v32sourceSquares; + here->BSIM3v32drainConductance = model->BSIM3v32sheetResistance + * here->BSIM3v32drainSquares; + here->BSIM3v32sourceConductance = model->BSIM3v32sheetResistance + * here->BSIM3v32sourceSquares; } - else + else /* ACM > 0 */ { - if (here->BSIM3v32drainSquaresGiven) - { - here->BSIM3v32drainConductance = (model->BSIM3v32ld + model->BSIM3v32ldif)/(here->BSIM3v32w + model->BSIM3v32xw)*model->BSIM3v32rd - + model->BSIM3v32sheetResistance * here->BSIM3v32drainSquares + model->BSIM3v32rdc; - } - else - { - here->BSIM3v32drainConductance = ((model->BSIM3v32ld + model->BSIM3v32ldif)*model->BSIM3v32rd - + model->BSIM3v32hdif*model->BSIM3v32sheetResistance)/(here->BSIM3v32w + model->BSIM3v32xw) + model->BSIM3v32rdc; - } - if (here->BSIM3v32sourceSquaresGiven) - { - here->BSIM3v32sourceConductance = (model->BSIM3v32ld + model->BSIM3v32ldif)/(here->BSIM3v32w + model->BSIM3v32xw)*model->BSIM3v32rs - + model->BSIM3v32sheetResistance * here->BSIM3v32sourceSquares + model->BSIM3v32rsc; - } - else - { - here->BSIM3v32sourceConductance = ((model->BSIM3v32ld + model->BSIM3v32ldif)*model->BSIM3v32rs - + model->BSIM3v32hdif*model->BSIM3v32sheetResistance)/(here->BSIM3v32w + model->BSIM3v32xw) + model->BSIM3v32rsc; - } + if ( + ACM_SourceDrainResistances( + model->BSIM3v32acmMod, + model->BSIM3v32ld, + model->BSIM3v32ldif, + model->BSIM3v32hdif, + model->BSIM3v32wmlt, + here->BSIM3v32w, + model->BSIM3v32xw, + model->BSIM3v32sheetResistance, + here->BSIM3v32drainSquaresGiven, + model->BSIM3v32rd, + model->BSIM3v32rdc, + here->BSIM3v32drainSquares, + here->BSIM3v32sourceSquaresGiven, + model->BSIM3v32rs, + model->BSIM3v32rsc, + here->BSIM3v32sourceSquares, + &(here->BSIM3v32drainConductance), + &(here->BSIM3v32sourceConductance) + ) == 0 ) printf("temp RD: %g RS: %g\n",here->BSIM3v32drainConductance,here->BSIM3v32sourceConductance); } if (here->BSIM3v32drainConductance > 0.0) here->BSIM3v32drainConductance = 1.0 @@ -935,23 +937,6 @@ int Size_Not_Found; + here->BSIM3v32sourcePerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; } - if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth - / SourceSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjsm = - SourceSatCurrent * exp(here->BSIM3v32vjsm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } if ((here->BSIM3v32drainArea <= 0.0) && (here->BSIM3v32drainPerimeter <= 0.0)) @@ -963,85 +948,67 @@ int Size_Not_Found; + here->BSIM3v32drainPerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; } - if ((DrainSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjdm = Nvtm * log(model->BSIM3v32ijth - / DrainSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjdm = - DrainSatCurrent * exp(here->BSIM3v32vjdm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } } - else + else /* ACM > 0 */ { - SourceSatCurrent = 0.0; - if (!here->BSIM3v32sourceAreaGiven) - { - here->BSIM3v32sourceArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; - } - SourceSatCurrent = here->BSIM3v32sourceArea * model->BSIM3v32jctTempSatCurDensity; - if (!here->BSIM3v32sourcePerimeterGiven) - { - here->BSIM3v32sourcePerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; - } - SourceSatCurrent = SourceSatCurrent + here->BSIM3v32sourcePerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; - if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; - if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth - / SourceSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjsm = - SourceSatCurrent * exp(here->BSIM3v32vjsm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } + if ( + ACM_saturationCurrents( + model->BSIM3v32acmMod, + model->BSIM3v32calcacm, + here->BSIM3v32geo, + model->BSIM3v32hdif, + model->BSIM3v32wmlt, + here->BSIM3v32w, + model->BSIM3v32xw, + model->BSIM3v32jctTempSatCurDensity, + model->BSIM3v32jctSidewallTempSatCurDensity, + here->BSIM3v32drainAreaGiven, + here->BSIM3v32drainArea, + here->BSIM3v32drainPerimeterGiven, + here->BSIM3v32drainPerimeter, + here->BSIM3v32sourceAreaGiven, + here->BSIM3v32sourceArea, + here->BSIM3v32sourcePerimeterGiven, + here->BSIM3v32sourcePerimeter, + &DrainSatCurrent, + &SourceSatCurrent + ) == 0) printf("temp IDsat: %g ISsat: %g\n",DrainSatCurrent,SourceSatCurrent); - DrainSatCurrent = 0.0; - if (!here->BSIM3v32drainAreaGiven) - { - here->BSIM3v32drainArea = 2.0 * model->BSIM3v32hdif * pParam->BSIM3v32weff; - } - DrainSatCurrent = here->BSIM3v32drainArea * model->BSIM3v32jctTempSatCurDensity; - if (!here->BSIM3v32drainPerimeterGiven) - { - here->BSIM3v32drainPerimeter = 4.0 * model->BSIM3v32hdif + 2.0 * pParam->BSIM3v32weff; - } - DrainSatCurrent = DrainSatCurrent + here->BSIM3v32drainPerimeter * model->BSIM3v32jctSidewallTempSatCurDensity; - if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; - if ((DrainSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) - { here->BSIM3v32vjdm = Nvtm * log(model->BSIM3v32ijth - / DrainSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3v32intVersion) { - case BSIM3v32V324: - case BSIM3v32V323: - case BSIM3v32V322: - here->BSIM3v32IsEvjdm = - DrainSatCurrent * exp(here->BSIM3v32vjdm / Nvtm); - break; - case BSIM3v32V32: - default: - /* Do nothing */ - break; - } - } + } + if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) + { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth + / SourceSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + here->BSIM3v32IsEvjsm = + SourceSatCurrent * exp(here->BSIM3v32vjsm / Nvtm); + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } + } + + if ((DrainSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) + { here->BSIM3v32vjdm = Nvtm * log(model->BSIM3v32ijth + / DrainSatCurrent + 1.0); + /* Added revision dependent code */ + switch (model->BSIM3v32intVersion) { + case BSIM3v32V324: + case BSIM3v32V323: + case BSIM3v32V322: + here->BSIM3v32IsEvjdm = + DrainSatCurrent * exp(here->BSIM3v32vjdm / Nvtm); + break; + case BSIM3v32V32: + default: + /* Do nothing */ + break; + } } } } diff --git a/src/spicelib/devices/bsim3v32/bsim3v32def.h b/src/spicelib/devices/bsim3v32/bsim3v32def.h index 188f2bfe4..8428f4413 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32def.h +++ b/src/spicelib/devices/bsim3v32/bsim3v32def.h @@ -67,6 +67,7 @@ typedef struct sBSIM3v32instance int BSIM3v32off; int BSIM3v32mode; int BSIM3v32nqsMod; + int BSIM3v32geo; /* OP point */ double BSIM3v32qinv; @@ -135,6 +136,7 @@ typedef struct sBSIM3v32instance unsigned BSIM3v32icVDSGiven :1; unsigned BSIM3v32icVGSGiven :1; unsigned BSIM3v32nqsModGiven :1; + unsigned BSIM3v32geoGiven :1; double *BSIM3v32DdPtr; double *BSIM3v32GgPtr; @@ -361,6 +363,7 @@ typedef struct sBSIM3v32model int BSIM3v32mobMod; int BSIM3v32capMod; int BSIM3v32acmMod; + int BSIM3v32calcacm; int BSIM3v32noiMod; int BSIM3v32binUnit; int BSIM3v32paramChk; @@ -471,7 +474,9 @@ typedef struct sBSIM3v32model double BSIM3v32tpbsw; double BSIM3v32tpbswg; - /* acm model */ + /* ACM model */ + double BSIM3v32xl; + double BSIM3v32xw; double BSIM3v32hdif; double BSIM3v32ldif; double BSIM3v32ld; @@ -479,6 +484,7 @@ typedef struct sBSIM3v32model double BSIM3v32rs; double BSIM3v32rdc; double BSIM3v32rsc; + double BSIM3v32wmlt; /* Length Dependence */ double BSIM3v32lcdsc; @@ -788,10 +794,6 @@ typedef struct sBSIM3v32model double BSIM3v32Wmin; double BSIM3v32Wmax; - /* acm model */ - double BSIM3v32xl; - double BSIM3v32xw; - /* Pre-calculated constants */ /* MCJ: move to size-dependent param. */ double BSIM3v32vtm; @@ -826,6 +828,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32binUnitGiven :1; unsigned BSIM3v32capModGiven :1; unsigned BSIM3v32acmModGiven :1; + unsigned BSIM3v32calcacmGiven :1; unsigned BSIM3v32paramChkGiven :1; unsigned BSIM3v32noiModGiven :1; unsigned BSIM3v32typeGiven :1; @@ -927,7 +930,9 @@ typedef struct sBSIM3v32model unsigned BSIM3v32tpbswGiven :1; unsigned BSIM3v32tpbswgGiven :1; - /* acm model */ + /* ACM model */ + unsigned BSIM3v32xlGiven :1; + unsigned BSIM3v32xwGiven :1; unsigned BSIM3v32hdifGiven :1; unsigned BSIM3v32ldifGiven :1; unsigned BSIM3v32ldGiven :1; @@ -935,6 +940,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32rsGiven :1; unsigned BSIM3v32rdcGiven :1; unsigned BSIM3v32rscGiven :1; + unsigned BSIM3v32wmltGiven :1; /* Length dependence */ unsigned BSIM3v32lcdscGiven :1; @@ -1251,10 +1257,6 @@ typedef struct sBSIM3v32model unsigned BSIM3v32WminGiven :1; unsigned BSIM3v32WmaxGiven :1; - /* acm model */ - unsigned BSIM3v32xlGiven :1; - unsigned BSIM3v32xwGiven :1; - } BSIM3v32model; @@ -1282,10 +1284,12 @@ typedef struct sBSIM3v32model #define BSIM3v32_M 15 #define BSIM3v32_DELVTO 16 #define BSIM3v32_MULU0 17 +#define BSIM3v32_GEO 18 /* model parameters */ -#define BSIM3v32_MOD_CAPMOD 101 -#define BSIM3v32_MOD_ACMMOD 102 +#define BSIM3v32_MOD_CAPMOD 100 +#define BSIM3v32_MOD_ACMMOD 101 +#define BSIM3v32_MOD_CALCACM 102 #define BSIM3v32_MOD_MOBMOD 103 #define BSIM3v32_MOD_NOIMOD 104 @@ -1750,10 +1754,9 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_WWC 701 #define BSIM3v32_MOD_WWLC 702 -/* acm parameters */ +/* ACM parameters */ #define BSIM3v32_MOD_XL 703 #define BSIM3v32_MOD_XW 704 - #define BSIM3v32_MOD_HDIF 711 #define BSIM3v32_MOD_LDIF 712 #define BSIM3v32_MOD_LD 713 @@ -1761,6 +1764,7 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_RS 715 #define BSIM3v32_MOD_RDC 716 #define BSIM3v32_MOD_RSC 717 +#define BSIM3v32_MOD_WMLT 718 /* device questions */ #define BSIM3v32_DNODE 751 diff --git a/src/spicelib/devices/devsup.c b/src/spicelib/devices/devsup.c index edd1abeda..8d6d4c517 100644 --- a/src/spicelib/devices/devsup.c +++ b/src/spicelib/devices/devsup.c @@ -147,6 +147,379 @@ DEVfetlim(double vnew, double vold, double vto) return(vnew); } +int +ACM_SourceDrainResistances( +int ACM, +double LD, +double LDIF, +double HDIF, +double WMLT, +double w, +double XW, +double RSH, +int drainSquaresGiven, +double RD, +double RDC, +double drainSquares, +int sourceSquaresGiven, +double RS, +double RSC, +double sourceSquares, +double *drainConductance, +double *sourceConductance +) +{ + switch (ACM) + { + case 1: + case 11: + *drainConductance = (LD + LDIF)/(w * WMLT + XW)*RD + RSH*drainSquares + RDC; + *sourceConductance = (LD + LDIF)/(w * WMLT + XW)*RS + RSH*sourceSquares + RSC; + + break; + + case 2: + case 12: + case 3: + case 13: + if (drainSquaresGiven) + *drainConductance = (LD + LDIF)/(w * WMLT + XW)*RD + RSH*drainSquares + RDC; + else + *drainConductance = ((LD + LDIF)*RD + (HDIF * WMLT)*RSH)/(w * WMLT + XW) + RDC; + if (sourceSquaresGiven) + *sourceConductance = (LD + LDIF)/(w * WMLT + XW)*RS + RSH*sourceSquares + RSC; + else + *sourceConductance = ((LD + LDIF)*RS + (HDIF * WMLT)*RSH)/(w * WMLT + XW) + RSC; + + break; + + default: + break; + } +return 0; +} + +/* Area Calculation Method (ACM) for MOS models */ +int +ACM_saturationCurrents( +int ACM, +int CALCACM, +int GEO, +double HDIF, +double WMLT, +double w, +double XW, +double jctTempSatCurDensity, +double jctSidewallTempSatCurDensity, +int drainAreaGiven, +double drainArea, +int drainPerimeterGiven, +double drainPerimeter, +int sourceAreaGiven, +double sourceArea, +int sourcePerimeterGiven, +double sourcePerimeter, +double *DrainSatCurrent, +double *SourceSatCurrent +) +{ + switch (ACM) + { + case 1: + case 11: + drainArea = (w * WMLT + XW) * WMLT; + drainPerimeter = (w * WMLT + XW); + *DrainSatCurrent = drainArea * jctTempSatCurDensity + drainPerimeter * jctSidewallTempSatCurDensity; + if (*DrainSatCurrent <= 0.0) *DrainSatCurrent = 1.0e-14; + + sourceArea = (w * WMLT + XW) * WMLT; + sourcePerimeter = (w * WMLT + XW); + *SourceSatCurrent = sourceArea * jctTempSatCurDensity + sourcePerimeter * jctSidewallTempSatCurDensity; + if (*SourceSatCurrent <= 0.0) *SourceSatCurrent = 1.0e-14; + + break; + + case 2: + case 12: + if ((ACM == 2) || ((ACM == 12) && (CALCACM == 1))) { + if (!drainAreaGiven) + drainArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + drainArea = drainArea * WMLT * WMLT; + if (!drainPerimeterGiven) + drainPerimeter = 4.0 * (HDIF * WMLT) + 2.0 * (w * WMLT + XW); + else + drainPerimeter = drainPerimeter * WMLT; + } + *DrainSatCurrent = drainArea * jctTempSatCurDensity + drainPerimeter * jctSidewallTempSatCurDensity; + if (*DrainSatCurrent <= 0.0) *DrainSatCurrent = 1.0e-14; + + if ((ACM == 2) || ((ACM == 12) && (CALCACM == 1))) { + if (!sourceAreaGiven) + sourceArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + sourceArea = sourceArea * WMLT * WMLT; + if (!sourcePerimeterGiven) + sourcePerimeter = 4.0 * (HDIF * WMLT) + 2.0 * (w * WMLT + XW); + else + sourcePerimeter = sourcePerimeter * WMLT; + } + *SourceSatCurrent = sourceArea * jctTempSatCurDensity + sourcePerimeter * jctSidewallTempSatCurDensity; + if (*SourceSatCurrent <= 0.0) *SourceSatCurrent = 1.0e-14; + + break; + + case 3: + case 13: + if (!drainAreaGiven) + if ((GEO == 0) || (GEO == 2)) + drainArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + drainArea = (HDIF * WMLT) * (w * WMLT + XW); + else + drainArea = drainArea * WMLT * WMLT; + if (!drainPerimeterGiven) + if ((GEO == 0) || (GEO == 2)) + drainPerimeter = 4.0 * (HDIF * WMLT) + (w * WMLT + XW); + else + drainPerimeter = 2.0 * (HDIF * WMLT); + else + drainPerimeter = drainPerimeter * WMLT; + *DrainSatCurrent = drainArea * jctTempSatCurDensity + drainPerimeter * jctSidewallTempSatCurDensity; + if (*DrainSatCurrent <= 0.0) *DrainSatCurrent = 1.0e-14; + + if (!sourceAreaGiven) + if ((GEO == 0) || (GEO == 1)) + sourceArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + sourceArea = (HDIF * WMLT) * (w * WMLT + XW); + else + sourceArea = sourceArea * WMLT * WMLT; + if (!sourcePerimeterGiven) + if ((GEO == 0) || (GEO == 1)) + sourcePerimeter = 4.0 * (HDIF * WMLT) + (w * WMLT + XW); + else + sourcePerimeter = 2.0 * (HDIF * WMLT); + else + sourcePerimeter = sourcePerimeter * WMLT; + *SourceSatCurrent = sourceArea * jctTempSatCurDensity + sourcePerimeter * jctSidewallTempSatCurDensity; + if (*SourceSatCurrent <= 0.0) *SourceSatCurrent = 1.0e-14; + + break; + + default: + break; + } +return 0; +} + +int +ACM_junctionCapacitances( +int ACM, +int CALCACM, +int GEO, +double HDIF, +double WMLT, +double w, +double XW, +int drainAreaGiven, +double drainArea, +int drainPerimeterGiven, +double drainPerimeter, +int sourceAreaGiven, +double sourceArea, +int sourcePerimeterGiven, +double sourcePerimeter, +double CJ, +double CJSW, +double CJGATE, +double *areaDrainBulkCapacitance, +double *periDrainBulkCapacitance, +double *gateDrainBulkCapacitance, +double *areaSourceBulkCapacitance, +double *periSourceBulkCapacitance, +double *gateSourceBulkCapacitance +) +{ + switch (ACM) + { + case 1: + drainArea = (w * WMLT + XW) * WMLT; + drainPerimeter = (w * WMLT + XW); + *areaDrainBulkCapacitance = drainArea * CJ; + *periDrainBulkCapacitance = drainPerimeter * CJSW; + *gateDrainBulkCapacitance = 0.0; + + sourceArea = (w * WMLT + XW) * WMLT; + sourcePerimeter = (w * WMLT + XW); + *areaSourceBulkCapacitance = sourceArea * CJ; + *periSourceBulkCapacitance = sourcePerimeter * CJSW; + *gateSourceBulkCapacitance = 0.0; + + break; + + case 2: + if (!drainAreaGiven) + drainArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + drainArea = drainArea * WMLT * WMLT; + if (!drainPerimeterGiven) + drainPerimeter = 4.0 * (HDIF * WMLT) + 2.0 * (w * WMLT + XW); + else + drainPerimeter = drainPerimeter * WMLT; + *areaDrainBulkCapacitance = drainArea * CJ; + if (drainPerimeter > (w * WMLT + XW)) { + *periDrainBulkCapacitance = (drainPerimeter - (w * WMLT + XW)) * CJSW; + *gateDrainBulkCapacitance = (w * WMLT + XW) * CJGATE; + } else { + *periDrainBulkCapacitance = drainPerimeter * CJGATE; + *gateDrainBulkCapacitance = 0.0; + } + + if (!sourceAreaGiven) + sourceArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + sourceArea = sourceArea * WMLT * WMLT; + if (!sourcePerimeterGiven) + sourcePerimeter = 4.0 * (HDIF * WMLT) + 2.0 * (w * WMLT + XW); + else + sourcePerimeter = sourcePerimeter * WMLT; + *areaSourceBulkCapacitance = sourceArea * CJ; + if (sourcePerimeter > (w * WMLT + XW)) { + *periSourceBulkCapacitance = (sourcePerimeter - (w * WMLT + XW)) * CJSW; + *gateSourceBulkCapacitance = (w * WMLT + XW) * CJGATE; + } else { + *periSourceBulkCapacitance = sourcePerimeter * CJGATE; + *gateSourceBulkCapacitance = 0.0; + } + + break; + + case 3: + if (!drainAreaGiven) + if ((GEO == 0) || (GEO == 2)) + drainArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + drainArea = (HDIF * WMLT) * (w * WMLT + XW); + else + drainArea = drainArea * WMLT * WMLT; + if (!drainPerimeterGiven) + if ((GEO == 0) || (GEO == 2)) + drainPerimeter = 4.0 * (HDIF * WMLT) + (w * WMLT + XW); + else + drainPerimeter = 2.0 * (HDIF * WMLT); + else + drainPerimeter = drainPerimeter * WMLT; + *areaDrainBulkCapacitance = drainArea * CJ; + *periDrainBulkCapacitance = drainPerimeter * CJSW ; + *gateDrainBulkCapacitance = (w * WMLT + XW) * CJGATE; + + if (!sourceAreaGiven) + if ((GEO == 0) || (GEO == 1)) + sourceArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + sourceArea = (HDIF * WMLT) * (w * WMLT + XW); + else + sourceArea = sourceArea * WMLT * WMLT; + if (!sourcePerimeterGiven) + if ((GEO == 0) || (GEO == 1)) + sourcePerimeter = 4.0 * (HDIF * WMLT) + (w * WMLT + XW); + else + sourcePerimeter = 2.0 * (HDIF * WMLT); + else + sourcePerimeter = sourcePerimeter * WMLT; + *areaSourceBulkCapacitance = sourceArea * CJ; + *periSourceBulkCapacitance = sourcePerimeter * CJSW; + *gateSourceBulkCapacitance = (w * WMLT + XW) * CJGATE; + + break; + + case 11: + drainArea = (w * WMLT + XW) * WMLT; + drainPerimeter = (w * WMLT + XW); + *areaDrainBulkCapacitance = drainArea * CJ; + *periDrainBulkCapacitance = drainPerimeter * CJSW; + *gateDrainBulkCapacitance = 0.0; + + sourceArea = (w * WMLT + XW) * WMLT; + sourcePerimeter = (w * WMLT + XW); + *areaSourceBulkCapacitance = sourceArea * CJ; + *periSourceBulkCapacitance = sourcePerimeter * CJSW; + *gateSourceBulkCapacitance = 0.0; + + break; + + case 12: + if (CALCACM == 1) { + if (!drainAreaGiven) + drainArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + drainArea = drainArea * WMLT * WMLT; + if (!drainPerimeterGiven) + drainPerimeter = 4.0 * (HDIF * WMLT) + 2.0 * (w * WMLT + XW); + else + drainPerimeter = drainPerimeter * WMLT; + } + *areaDrainBulkCapacitance = drainArea * CJ; + if (drainPerimeter > (w * WMLT + XW)) { + *periDrainBulkCapacitance = (drainPerimeter - (w * WMLT + XW)) * CJSW; + *gateDrainBulkCapacitance = (w * WMLT + XW) * CJGATE; + } else { + *periDrainBulkCapacitance = 0.0; + *gateDrainBulkCapacitance = drainPerimeter * CJGATE; + } + + if (CALCACM == 1) { + if (!sourceAreaGiven) + sourceArea = 2.0 * (HDIF * WMLT) * (w * WMLT + XW); + else + sourceArea = sourceArea * WMLT * WMLT; + if (!sourcePerimeterGiven) + sourcePerimeter = 4.0 * (HDIF * WMLT) + 2.0 * (w * WMLT + XW); + else + sourcePerimeter = sourcePerimeter * WMLT; + } + *areaSourceBulkCapacitance = sourceArea * CJ; + if (sourcePerimeter > (w * WMLT + XW)) { + *periSourceBulkCapacitance = (sourcePerimeter - (w * WMLT + XW)) * CJSW; + *gateSourceBulkCapacitance = (w * WMLT + XW) * CJGATE; + } else { + *periSourceBulkCapacitance = 0.0; + *gateSourceBulkCapacitance = sourcePerimeter * CJGATE; + } + + break; + + case 13: + drainArea = drainArea * WMLT * WMLT; + drainPerimeter = drainPerimeter * WMLT; + *areaDrainBulkCapacitance = drainArea * CJ; + if (drainPerimeter > (w * WMLT + XW)) { + *periDrainBulkCapacitance = (drainPerimeter - (w * WMLT + XW)) * CJSW; + *gateDrainBulkCapacitance = (w * WMLT + XW) * CJGATE; + } else { + *periDrainBulkCapacitance = 0.0; + *gateDrainBulkCapacitance = drainPerimeter * CJGATE; + } + + sourceArea = sourceArea * WMLT * WMLT; + sourcePerimeter = sourcePerimeter * WMLT; + *areaSourceBulkCapacitance = sourceArea * CJ; + if (sourcePerimeter > (w * WMLT + XW)) { + *periSourceBulkCapacitance = (sourcePerimeter - (w * WMLT + XW)) * CJSW; + *gateSourceBulkCapacitance = (w * WMLT + XW) * CJGATE; + } else { + *periSourceBulkCapacitance = 0.0; + *gateSourceBulkCapacitance = sourcePerimeter * CJGATE; + } + + break; + + default: + break; + } +return 0; +} /* Compute the MOS overlap capacitances as functions of the device * terminal voltages From 230fb2e2936961489622d6049f94366006f1d0f4 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 17 May 2013 07:13:30 +0200 Subject: [PATCH 073/257] rm debug printout --- src/spicelib/devices/bsim3v32/b3v32ld.c | 14 ++++++++------ src/spicelib/devices/bsim3v32/b3v32temp.c | 17 +++++++++-------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/spicelib/devices/bsim3v32/b3v32ld.c b/src/spicelib/devices/bsim3v32/b3v32ld.c index ab1f62fee..22c2646d6 100644 --- a/src/spicelib/devices/bsim3v32/b3v32ld.c +++ b/src/spicelib/devices/bsim3v32/b3v32ld.c @@ -363,8 +363,7 @@ for (; model != NULL; model = model->BSIM3v32nextModel) } else { - if ( - ACM_saturationCurrents( + error = ACM_saturationCurrents( model->BSIM3v32acmMod, model->BSIM3v32calcacm, here->BSIM3v32geo, @@ -384,7 +383,9 @@ for (; model != NULL; model = model->BSIM3v32nextModel) here->BSIM3v32sourcePerimeter, &DrainSatCurrent, &SourceSatCurrent - ) == 0) printf("load IDsat: %g ISsat: %g\n",DrainSatCurrent,SourceSatCurrent); + ); + if (error) + return(error); } if (SourceSatCurrent <= 0.0) { here->BSIM3v32gbs = ckt->CKTgmin; @@ -2530,8 +2531,7 @@ finished: } } else { - if( - ACM_junctionCapacitances( + error = ACM_junctionCapacitances( model->BSIM3v32acmMod, model->BSIM3v32calcacm, here->BSIM3v32geo, @@ -2556,7 +2556,9 @@ finished: &czbs, &czbssw, &czbsswg - ) == 0) printf("load Cda: %g Cdsw: %g Cdswg: %g Csa: %g Cssw: %g Csswg %g\n",czbd,czbdsw,czbdswg,czbs,czbssw,czbsswg); + ); + if (error) + return(error); } MJ = model->BSIM3v32bulkJctBotGradingCoeff; diff --git a/src/spicelib/devices/bsim3v32/b3v32temp.c b/src/spicelib/devices/bsim3v32/b3v32temp.c index 96b5493fe..42ea5f275 100644 --- a/src/spicelib/devices/bsim3v32/b3v32temp.c +++ b/src/spicelib/devices/bsim3v32/b3v32temp.c @@ -38,7 +38,7 @@ struct bsim3v32SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; double Nvtm, SourceSatCurrent, DrainSatCurrent; -int Size_Not_Found; +int Size_Not_Found, error; /* loop through all the BSIM3v32 device models */ for (; model != NULL; model = model->BSIM3v32nextModel) @@ -887,8 +887,7 @@ int Size_Not_Found; } else /* ACM > 0 */ { - if ( - ACM_SourceDrainResistances( + error = ACM_SourceDrainResistances( model->BSIM3v32acmMod, model->BSIM3v32ld, model->BSIM3v32ldif, @@ -907,7 +906,9 @@ int Size_Not_Found; here->BSIM3v32sourceSquares, &(here->BSIM3v32drainConductance), &(here->BSIM3v32sourceConductance) - ) == 0 ) printf("temp RD: %g RS: %g\n",here->BSIM3v32drainConductance,here->BSIM3v32sourceConductance); + ); + if (error) + return(error); } if (here->BSIM3v32drainConductance > 0.0) here->BSIM3v32drainConductance = 1.0 @@ -951,8 +952,7 @@ int Size_Not_Found; } else /* ACM > 0 */ { - if ( - ACM_saturationCurrents( + error = ACM_saturationCurrents( model->BSIM3v32acmMod, model->BSIM3v32calcacm, here->BSIM3v32geo, @@ -972,8 +972,9 @@ int Size_Not_Found; here->BSIM3v32sourcePerimeter, &DrainSatCurrent, &SourceSatCurrent - ) == 0) printf("temp IDsat: %g ISsat: %g\n",DrainSatCurrent,SourceSatCurrent); - + ); + if (error) + return(error); } if ((SourceSatCurrent > 0.0) && (model->BSIM3v32ijth > 0.0)) { here->BSIM3v32vjsm = Nvtm * log(model->BSIM3v32ijth From 76747015dceeb110b9b70ba723601622bd5095a4 Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 17 May 2013 23:39:42 +0200 Subject: [PATCH 074/257] inpcom.c, array bounds check --- src/frontend/inpcom.c | 61 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 5147dd615..a8abd8ede 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -35,20 +35,26 @@ Author: 1985 Wayne A. Christopher /*#define TRACE*/ /* globals -- wanted to avoid complicating inp_readall interface */ -static char *library_name[1000]; -static char *section_name[1000][1000]; -static struct line *section_ref[1000][1000]; -static struct line *library_deck[1000]; +#define N_LIBRARY 1000 +#define N_SECTIONS 1000 +#define N_FUNCS 1000 +#define N_PARAMS 1000 +#define N_SUBCKT_W_PARAMS 1000 + +static char *library_name[N_LIBRARY]; +static char *section_name[N_LIBRARY][N_SECTIONS]; +static struct line *section_ref[N_LIBRARY][N_SECTIONS]; +static struct line *library_deck[N_LIBRARY]; static int num_libraries; -static int num_sections[1000]; +static int num_sections[N_LIBRARY]; static char *global; -static char *subckt_w_params[1000]; +static char *subckt_w_params[N_SUBCKT_W_PARAMS]; static int num_subckt_w_params; -static char *func_names[1000]; -static char *func_params[1000][1000]; -static char *func_macro[5000]; +static char *func_names[N_FUNCS]; +static char *func_params[N_FUNCS][N_PARAMS]; +static char *func_macro[N_FUNCS]; static int num_functions; -static int num_parameters[1000]; +static int num_parameters[N_FUNCS]; static COMPATMODE_T inp_compat_mode; /* Collect information for dynamic allocation of numparam arrays */ @@ -128,6 +134,10 @@ find_section(int lib_idx, char *section_name_) { static void remember_section_ref(int lib_idx, char *section_name_, struct line *deck) { int section_idx = num_sections[lib_idx]++; + if (section_idx >= N_SECTIONS) { + fprintf(stderr, "N_SECTIONS overflow\n"); + exit(1); + } section_ref[lib_idx][section_idx] = deck; section_name[lib_idx][section_idx] = strdup(section_name_); } @@ -168,6 +178,11 @@ read_a_lib(char *y, int call_depth, char *dir_name) dir_name_flag = TRUE; } + if (num_libraries >= N_LIBRARY) { + fprintf(stderr, "N_LIBRARY overflow\n"); + exit(1); + } + library_name[num_libraries++] = strdup(y); if (dir_name_flag == FALSE) { @@ -2107,6 +2122,11 @@ inp_fix_subckt(char *s) for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2) && !isquote(*ptr2); ptr2++) ; + if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { + fprintf(stderr, "N_SUBCKT_W_PARMS overflow\n"); + exit(1); + } + subckt_w_params[num_subckt_w_params++] = copy_substring(ptr1, ptr2); /* go to beginning of first parameter word */ @@ -2638,6 +2658,10 @@ inp_fix_subckt_multiplier(struct line *subckt_card, if (!strstr(subckt_card->li_line, "params:")) { new_str = TMALLOC(char, strlen(subckt_card->li_line) + 13); sprintf(new_str, "%s params: m=1", subckt_card->li_line); + if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { + fprintf(stderr, "N_SUBCKT_W_PARMS overflow\n"); + exit(1); + } subckt_w_params[num_subckt_w_params++] = get_subckt_model_name(subckt_card->li_line); } else { new_str = TMALLOC(char, strlen(subckt_card->li_line) + 5); @@ -2843,6 +2867,12 @@ inp_get_func_from_line(char *line) if (strcmp(func_names[i], line) == 0) break; + + if (num_functions >= N_FUNCS) { + fprintf(stderr, "N_FUNCS overflow\n"); + exit(1); + } + func_names[num_functions++] = strdup(line); *end = keep; @@ -2856,8 +2886,13 @@ inp_get_func_from_line(char *line) ptr = end; while (!isspace(*end) && *end != ',' && *end != ')') end++; - if (end > ptr) + if (end > ptr) { + if (num_params >= N_PARAMS) { + fprintf(stderr, "N_PARAMS overflow\n"); + exit(1); + } func_params[num_functions-1][num_params++] = copy_substring(ptr, end); + } } num_parameters[num_functions-1] = num_params; @@ -3858,6 +3893,10 @@ inp_add_params_to_subckt(struct line *subckt_card) subckt_name = skip_non_ws(subckt_card->li_line); subckt_name = skip_ws(subckt_name); end_ptr = skip_non_ws(subckt_name); + if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { + fprintf(stderr, "N_SUBCKT_W_PARMS overflow\n"); + exit(1); + } subckt_w_params[num_subckt_w_params++] = copy_substring(subckt_name, end_ptr); } else { new_line = TMALLOC(char, strlen(subckt_line) + strlen(param_ptr) + 2); From e1c8dc543934f099b3147010c51e2f3d5987d5e1 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 18 May 2013 08:11:09 +0200 Subject: [PATCH 075/257] inpcom.c: larger array size, debug otuput modified --- src/frontend/inpcom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index a8abd8ede..b91caefbc 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -39,7 +39,7 @@ Author: 1985 Wayne A. Christopher #define N_SECTIONS 1000 #define N_FUNCS 1000 #define N_PARAMS 1000 -#define N_SUBCKT_W_PARAMS 1000 +#define N_SUBCKT_W_PARAMS 4000 static char *library_name[N_LIBRARY]; static char *section_name[N_LIBRARY][N_SECTIONS]; @@ -896,7 +896,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile no_braces = braces_per_line; } - if (ft_ngdebug) { + if ((ft_ngdebug) && (call_depth == 0)) { /*debug: print into file*/ FILE *fd = fopen("debug-out.txt", "w"); struct line *t; From 8f18afbc9cb550b87621f9f2397ea12a4c4f5393 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 18 May 2013 08:23:05 +0200 Subject: [PATCH 076/257] inpcom.c: debug output streamlined --- src/frontend/inpcom.c | 73 +++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index b91caefbc..d29d6b0c7 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -373,7 +373,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile unsigned int no_braces = 0; /* number of '{' */ int cirlinecount = 0; /* length of circarray */ - size_t max_line_length; /* max. line length in input deck */ + size_t max_line_length = 0; /* max. line length in input deck */ struct line *tmp_ptr1 = NULL; @@ -871,43 +871,42 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile } inp_add_series_resistor(working); + + /* get max. line length and number of lines in input deck, + and renumber the lines, + count the number of '{' per line as an upper estimate of the number + of parameter substitutions in a line*/ + dynmaxline = 0; + max_line_length = 0; + for (tmp_ptr1 = cc; tmp_ptr1 != NULL; tmp_ptr1 = tmp_ptr1->li_next) { + char *s; + unsigned int braces_per_line = 0; + /* count number of lines */ + dynmaxline++; + /* renumber the lines of the processed input deck */ + tmp_ptr1->li_linenum = dynmaxline; + if (max_line_length < strlen(tmp_ptr1->li_line)) + max_line_length = strlen(tmp_ptr1->li_line); + /* count '{' */ + for (s = tmp_ptr1->li_line; *s; s++) + if (*s == '{') + braces_per_line++; + if (no_braces < braces_per_line) + no_braces = braces_per_line; + } + + if (ft_ngdebug) { + /*debug: print into file*/ + FILE *fd = fopen("debug-out.txt", "w"); + struct line *t; + for (t = cc; t; t = t->li_next) + fprintf(fd, "%d %d %s\n", t->li_linenum_orig, t->li_linenum, t->li_line); + fclose(fd); + + fprintf(stdout, "max line length %d, max subst. per line %d, number of lines %d\n", + (int) max_line_length, no_braces, dynmaxline); + } } - - /* get max. line length and number of lines in input deck, - and renumber the lines, - count the number of '{' per line as an upper estimate of the number - of parameter substitutions in a line*/ - dynmaxline = 0; - max_line_length = 0; - for (tmp_ptr1 = cc; tmp_ptr1 != NULL; tmp_ptr1 = tmp_ptr1->li_next) { - char *s; - unsigned int braces_per_line = 0; - /* count number of lines */ - dynmaxline++; - /* renumber the lines of the processed input deck */ - tmp_ptr1->li_linenum = dynmaxline; - if (max_line_length < strlen(tmp_ptr1->li_line)) - max_line_length = strlen(tmp_ptr1->li_line); - /* count '{' */ - for (s = tmp_ptr1->li_line; *s; s++) - if (*s == '{') - braces_per_line++; - if (no_braces < braces_per_line) - no_braces = braces_per_line; - } - - if ((ft_ngdebug) && (call_depth == 0)) { - /*debug: print into file*/ - FILE *fd = fopen("debug-out.txt", "w"); - struct line *t; - for (t = cc; t; t = t->li_next) - fprintf(fd, "%d %d %s\n", t->li_linenum_orig, t->li_linenum, t->li_line); - fclose(fd); - - fprintf(stdout, "max line length %d, max subst. per line %d, number of lines %d\n", - (int) max_line_length, no_braces, dynmaxline); - } - return cc; } From 54be463685c2080d5a06607fd279ff527a7bb5f9 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 09:38:47 +0200 Subject: [PATCH 077/257] inpcom.c, array bounds check, use controlled_exit() --- src/frontend/inpcom.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d29d6b0c7..40c41979c 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -135,8 +135,8 @@ static void remember_section_ref(int lib_idx, char *section_name_, struct line *deck) { int section_idx = num_sections[lib_idx]++; if (section_idx >= N_SECTIONS) { - fprintf(stderr, "N_SECTIONS overflow\n"); - exit(1); + fprintf(stderr, "ERROR, N_SECTIONS overflow\n"); + controlled_exit(EXIT_FAILURE); } section_ref[lib_idx][section_idx] = deck; section_name[lib_idx][section_idx] = strdup(section_name_); @@ -179,8 +179,8 @@ read_a_lib(char *y, int call_depth, char *dir_name) } if (num_libraries >= N_LIBRARY) { - fprintf(stderr, "N_LIBRARY overflow\n"); - exit(1); + fprintf(stderr, "ERROR, N_LIBRARY overflow\n"); + controlled_exit(EXIT_FAILURE); } library_name[num_libraries++] = strdup(y); @@ -2122,8 +2122,8 @@ inp_fix_subckt(char *s) ; if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { - fprintf(stderr, "N_SUBCKT_W_PARMS overflow\n"); - exit(1); + fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n"); + controlled_exit(EXIT_FAILURE); } subckt_w_params[num_subckt_w_params++] = copy_substring(ptr1, ptr2); @@ -2658,8 +2658,8 @@ inp_fix_subckt_multiplier(struct line *subckt_card, new_str = TMALLOC(char, strlen(subckt_card->li_line) + 13); sprintf(new_str, "%s params: m=1", subckt_card->li_line); if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { - fprintf(stderr, "N_SUBCKT_W_PARMS overflow\n"); - exit(1); + fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n"); + controlled_exit(EXIT_FAILURE); } subckt_w_params[num_subckt_w_params++] = get_subckt_model_name(subckt_card->li_line); } else { @@ -2866,10 +2866,9 @@ inp_get_func_from_line(char *line) if (strcmp(func_names[i], line) == 0) break; - if (num_functions >= N_FUNCS) { - fprintf(stderr, "N_FUNCS overflow\n"); - exit(1); + fprintf(stderr, "ERROR, N_FUNCS overflow\n"); + controlled_exit(EXIT_FAILURE); } func_names[num_functions++] = strdup(line); @@ -2887,8 +2886,8 @@ inp_get_func_from_line(char *line) end++; if (end > ptr) { if (num_params >= N_PARAMS) { - fprintf(stderr, "N_PARAMS overflow\n"); - exit(1); + fprintf(stderr, "ERROR, N_PARAMS overflow\n"); + controlled_exit(EXIT_FAILURE); } func_params[num_functions-1][num_params++] = copy_substring(ptr, end); } @@ -3893,8 +3892,8 @@ inp_add_params_to_subckt(struct line *subckt_card) subckt_name = skip_ws(subckt_name); end_ptr = skip_non_ws(subckt_name); if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { - fprintf(stderr, "N_SUBCKT_W_PARMS overflow\n"); - exit(1); + fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n"); + controlled_exit(EXIT_FAILURE); } subckt_w_params[num_subckt_w_params++] = copy_substring(subckt_name, end_ptr); } else { From afeb7e4b597d10518e013f569b387c4c11ea6f5f Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 09:47:06 +0200 Subject: [PATCH 078/257] inpcom.c, rewrite .lib processing --- src/frontend/inpcom.c | 306 +++++++++++++----------------------------- 1 file changed, 90 insertions(+), 216 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 40c41979c..c8b554bc4 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -20,6 +20,7 @@ Author: 1985 Wayne A. Christopher #include "inpcom.h" #include "variable.h" +#include "subckt.h" #include "../misc/util.h" /* ngdirname() */ #include "ngspice/stringutil.h" #include "ngspice/wordlist.h" @@ -42,11 +43,8 @@ Author: 1985 Wayne A. Christopher #define N_SUBCKT_W_PARAMS 4000 static char *library_name[N_LIBRARY]; -static char *section_name[N_LIBRARY][N_SECTIONS]; -static struct line *section_ref[N_LIBRARY][N_SECTIONS]; static struct line *library_deck[N_LIBRARY]; static int num_libraries; -static int num_sections[N_LIBRARY]; static char *global; static char *subckt_w_params[N_SUBCKT_W_PARAMS]; static int num_subckt_w_params; @@ -72,8 +70,7 @@ static void inp_stripcomments_deck(struct line *deck); static void inp_stripcomments_line(char *s); static void inp_fix_for_numparam(struct line *deck); static void inp_remove_excess_ws(struct line *deck); -static void collect_section_references(struct line *deck, char *section_name_); -static void inp_init_lib_data(void); +static void expand_section_references(struct line *deck, int call_depth, char *dir_name); static void inp_grab_func(struct line *deck); static void inp_fix_inst_calls_for_numparam(struct line *deck); static void inp_expand_macros_in_func(void); @@ -121,25 +118,41 @@ find_lib(char *name) } -static int -find_section(int lib_idx, char *section_name_) { - int j; - for (j = 0; j < num_sections[lib_idx]; j++) - if (strcmp(section_name[lib_idx][j], section_name_) == 0) - return j; - return -1; -} +static struct line * +find_section_definition(struct line *deck, char *name) +{ + struct line *c; + for (c = deck; c; c = c->li_next) { + char *line = c->li_line; + if (ciprefix(".lib", line)) { + char *s, *t, *y; + s = skip_non_ws(line); + while (isspace(*s) || isquote(*s)) + s++; + for (t = s; *t && !isspace(*t) && !isquote(*t); t++) + ; + y = t; + while (isspace(*y) || isquote(*y)) + y++; -static void -remember_section_ref(int lib_idx, char *section_name_, struct line *deck) { - int section_idx = num_sections[lib_idx]++; - if (section_idx >= N_SECTIONS) { - fprintf(stderr, "ERROR, N_SECTIONS overflow\n"); - controlled_exit(EXIT_FAILURE); + if (!*y) { + /* library section definition: `.lib ' .. `.endl' */ + + char keep_char = *t; + *t = '\0'; + + if (strcasecmp(name, s) == 0) { + *t = keep_char; + return c; + } + + *t = keep_char; + } + } } - section_ref[lib_idx][section_idx] = deck; - section_name[lib_idx][section_idx] = strdup(section_name_); + + return NULL; } @@ -203,116 +216,6 @@ read_a_lib(char *y, int call_depth, char *dir_name) } -static int -expand_section_references(int line_number) -{ - struct line *tmp_ptr = NULL, *next; - int lib_idx; - - for (lib_idx = 0; lib_idx < num_libraries; lib_idx++) { - bool found_section = FALSE; - struct line *working = library_deck[lib_idx]; - while (working) { - char *buffer = working->li_line; - - if (found_section && ciprefix(".endl", buffer)) { - - struct line *next = working->li_next; - - /* Make the .endl a comment */ - *buffer = '*'; - found_section = FALSE; - - /* append the line following the library section reference */ - working->li_next = tmp_ptr; - - /* and continue with the line following */ - /* the .endl of this section definition */ - working = next; - continue; - } - - if (ciprefix(".lib", buffer)) { - - /* here we expect a libray section definition */ - /* library section definition: `.lib ' .. `.endl' */ - - char keep_char; - int section_idx; - char *s, *t; - - if (found_section) { - fprintf(stderr, "ERROR: .lib is missing .endl!\n"); - controlled_exit(EXIT_FAILURE); - } - - s = skip_non_ws(buffer); /* skip over .lib */ - while (isspace(*s) || isquote(*s)) - s++; /* advance past space chars */ - for (t = s; *t && !isspace(*t) && !isquote(*t); t++) - ; /* skip to end of word */ - keep_char = *t; - *t = '\0'; - - /* check if we remember this section having been referenced somewhere */ - section_idx = find_section(lib_idx, s); - - *t = keep_char; - - found_section = (section_idx >= 0); - - if (found_section) { - - struct line *c; - int line_number_lib; - - /* make the .lib of this library section definition a comment */ - *buffer = '*'; - - /* tmp_ptr is the line following the library section reference */ - tmp_ptr = section_ref[lib_idx][section_idx]->li_next; - - /* insert the section definition here, */ - /* just behind the remembered section reference */ - section_ref[lib_idx][section_idx]->li_next = working; - - /* renumber lines */ - line_number_lib = 1; - for (c = working; !ciprefix(".endl", c->li_line); c = c->li_next) { - c->li_linenum = line_number++; - c->li_linenum_orig = line_number_lib++; - } - c->li_linenum = line_number++; // renumber endl line - c->li_linenum_orig = line_number_lib++; - } - } - - next = working->li_next; - - /* drop this line in the current library file, if - * it is outside a library section definition - * or - * it is part of an unused library section definition - */ - - if (!found_section) { - tfree(working->li_line); - tfree(working); - } - - working = next; - } - - if (found_section) { - fprintf(stderr, "ERROR: .lib is missing .endl!\n"); - controlled_exit(EXIT_FAILURE); - } - } - - return line_number; -} - - /*------------------------------------------------------------------------- Read the entire input file and return a pointer to the first line of the linked list of 'card' records in data. The pointer is stored in @@ -478,50 +381,13 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* now handle .lib statements */ if (ciprefix(".lib", buffer)) { - - char *y = NULL; /* filename */ - char *z = NULL; /* libname */ - char *s, *t; - - inp_stripcomments_line(buffer); - s = skip_non_ws(buffer); /* skip over .lib */ - - s = strdup(s); - - t = get_quoted_token(s, &y); - - if (!y) { - fprintf(cp_err, "Error: .lib filename missing\n"); - tfree(buffer); /* was allocated by readline() */ - controlled_exit(EXIT_FAILURE); - } - - t = get_quoted_token(t, &z); - - if (z && (inp_compat_mode == COMPATMODE_ALL || - inp_compat_mode == COMPATMODE_HS || - inp_compat_mode == COMPATMODE_NATIVE)) - { - /* here we have a */ - /* library section reference: `.lib ' */ - - if(!read_a_lib(y, call_depth, dir_name)) { - tfree(s); - tfree(buffer); - controlled_exit(EXIT_FAILURE); - } - - tfree(s); - - /* Make the .lib a comment */ - *buffer = '*'; - } else if (inp_compat_mode == COMPATMODE_PS) { + if (inp_compat_mode == COMPATMODE_PS) { /* compatibility mode, * this is neither a libray section definition nor a reference * interpret as old style * .lib (no lib name given) */ - fprintf(cp_err, "Warning: library name missing in line\n %s", buffer); + char *s = skip_non_ws(buffer); /* skip over .lib */ fprintf(cp_err, " File included as: .inc %s\n", s); memcpy(buffer, ".inc", 4); } @@ -635,6 +501,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile char *s; if ( !ciprefix("write", buffer) && + !ciprefix(".lib", buffer) && !ciprefix("codemodel", buffer) && !ciprefix("use", buffer) && !ciprefix("load", buffer) @@ -712,16 +579,13 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile cc->li_next = global_card; global_card->li_next = prev; - inp_init_lib_data(); - collect_section_references(cc, NULL); - } - - /* - add libraries - */ - - if (call_depth == 0) { - line_number = expand_section_references(line_number); + if (inp_compat_mode == COMPATMODE_ALL || + inp_compat_mode == COMPATMODE_HS || + inp_compat_mode == COMPATMODE_NATIVE) + { + /* process all library section references */ + expand_section_references(cc, call_depth, dir_name); + } } /* @@ -2338,7 +2202,7 @@ inp_fix_for_numparam(struct line *deck) char *str_ptr; while (c != NULL) { - if (ciprefix("*lib", c->li_line) || ciprefix("*inc", c->li_line)) { + if (ciprefix(".lib", c->li_line) || ciprefix("*lib", c->li_line) || ciprefix("*inc", c->li_line)) { c = c->li_next; continue; } @@ -2398,7 +2262,7 @@ inp_remove_excess_ws(struct line *deck) /* - * recursively collect library section references, + * recursively expand library section references, * either * every library section reference (when the given section_name_ === NULL) * or @@ -2406,20 +2270,15 @@ inp_remove_excess_ws(struct line *deck) */ static void -collect_section_references(struct line *deck, char *section_name_) +expand_section_references(struct line *deck, int call_depth, char *dir_name) { - bool read_line = (section_name_ == NULL); - struct line *c; for (c = deck; c; c = c->li_next) { char *line = c->li_line; - if (ciprefix(".endl", line) && section_name_ != NULL) - read_line = FALSE; - - if (ciprefix("*lib", line) || ciprefix(".lib", line)) { + if (ciprefix(".lib", line)) { char *s, *t, *y; @@ -2432,19 +2291,10 @@ collect_section_references(struct line *deck, char *section_name_) while (isspace(*y) || isquote(*y)) y++; - if (!*y) { - /* library section definition: `.lib ' .. `.endl' */ - - char keep_char = *t; - *t = '\0'; - - if (section_name_ != NULL && strcmp(section_name_, s) == 0) - read_line = TRUE; - *t = keep_char; - } - else if (read_line == TRUE) { + if (*y) { /* library section reference: `.lib ' */ + struct line *section_def; char keep_char1, keep_char2; char *z, *copys = NULL; int lib_idx; @@ -2461,14 +2311,48 @@ collect_section_references(struct line *deck, char *section_name_) if (copys) s = copys; } + lib_idx = find_lib(s); - if (lib_idx >= 0) - if (find_section(lib_idx, y) < 0) { - /* remember this section having been referenced */ - remember_section_ref(lib_idx, y, c); - /* recursively check for nested section references */ - collect_section_references(library_deck[lib_idx], y); + + if (lib_idx < 0) { + + if(!read_a_lib(s, call_depth, dir_name)) + controlled_exit(EXIT_FAILURE); + + lib_idx = find_lib(s); + } + + if (lib_idx < 0) { + fprintf(stderr, "ERROR, library file %s not found\n", s); + controlled_exit(EXIT_FAILURE); + } + + section_def = find_section_definition(library_deck[lib_idx], y); + + if (!section_def) { + fprintf(stderr, "ERROR, library file %s, section definition %s not found\n", s, y); + controlled_exit(EXIT_FAILURE); + } + + /* insert the library section definition into `c' */ + { + struct line *t = inp_deckcopy(section_def); + struct line *rest = c->li_next; + c->li_next = t; + t->li_line[0] = '*'; + t->li_line[1] = '<'; + for (; t; t=t->li_next) + if(ciprefix(".endl", t->li_line)) + break; + if (!t) { + fprintf(stderr, "ERROR, .endl not found\n"); + controlled_exit(EXIT_FAILURE); } + t->li_line[0] = '*'; + t->li_line[1] = '>'; + t->li_next = rest; + } + *line = '*'; /* comment out .lib line */ *t = keep_char1; *z = keep_char2; @@ -2480,16 +2364,6 @@ collect_section_references(struct line *deck, char *section_name_) } -static void -inp_init_lib_data(void) -{ - int i; - - for (i = 0; i < num_libraries; i++) - num_sections[i] = 0; -} - - static char* inp_get_subckt_name(char *s) { From 3612ba951c5457c8917d7f965bc237b2d3131a8d Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 18 May 2013 14:57:17 +0200 Subject: [PATCH 079/257] indentation --- src/spicelib/analysis/traninit.c | 27 ++++++---------- src/spicelib/devices/bsim4v4/b4v4getic.c | 39 ++++++++++++------------ 2 files changed, 28 insertions(+), 38 deletions(-) diff --git a/src/spicelib/analysis/traninit.c b/src/spicelib/analysis/traninit.c index cfca9426a..b25aa6cf4 100644 --- a/src/spicelib/analysis/traninit.c +++ b/src/spicelib/analysis/traninit.c @@ -21,25 +21,16 @@ int TRANinit(CKTcircuit *ckt, JOB *anal) ckt->CKTstep = job->TRANstep; ckt->CKTinitTime = job->TRANinitTime; ckt->CKTmaxStep = job->TRANmaxStep; - - - - /* The following code has been taken from macspice 3f4 (A. Wilson) - in the file traninit.new.c - Seems interesting */ - if(ckt->CKTmaxStep == 0) - { - if (ckt->CKTstep < ( ckt->CKTfinalTime - ckt->CKTinitTime )/50.0) - { - ckt->CKTmaxStep = ckt->CKTstep; - } - else - { - ckt->CKTmaxStep = ( ckt->CKTfinalTime - ckt->CKTinitTime )/50.0; - } -} - - + /* The following code has been taken from macspice 3f4 (A. Wilson) + in the file traninit.new.c - Seems interesting */ + if(ckt->CKTmaxStep == 0) { + if (ckt->CKTstep < ( ckt->CKTfinalTime - ckt->CKTinitTime )/50.0) + ckt->CKTmaxStep = ckt->CKTstep; + else + ckt->CKTmaxStep = ( ckt->CKTfinalTime - ckt->CKTinitTime )/50.0; + } + ckt->CKTdelmin = 1e-11*ckt->CKTmaxStep; /* XXX */ ckt->CKTmode = job->TRANmode; diff --git a/src/spicelib/devices/bsim4v4/b4v4getic.c b/src/spicelib/devices/bsim4v4/b4v4getic.c index 0b6088dd8..808368e8a 100644 --- a/src/spicelib/devices/bsim4v4/b4v4getic.c +++ b/src/spicelib/devices/bsim4v4/b4v4getic.c @@ -17,28 +17,27 @@ int BSIM4v4getic( -GENmodel *inModel, -CKTcircuit *ckt) + GENmodel *inModel, + CKTcircuit *ckt) { -BSIM4v4model *model = (BSIM4v4model*)inModel; -BSIM4v4instance *here; + BSIM4v4model *model = (BSIM4v4model*)inModel; + BSIM4v4instance *here; - for (; model ; model = model->BSIM4v4nextModel) - { for (here = model->BSIM4v4instances; here; here = here->BSIM4v4nextInstance) - { - if (!here->BSIM4v4icVDSGiven) - { here->BSIM4v4icVDS = *(ckt->CKTrhs + here->BSIM4v4dNode) - - *(ckt->CKTrhs + here->BSIM4v4sNode); - } - if (!here->BSIM4v4icVGSGiven) - { here->BSIM4v4icVGS = *(ckt->CKTrhs + here->BSIM4v4gNodeExt) - - *(ckt->CKTrhs + here->BSIM4v4sNode); - } - if(!here->BSIM4v4icVBSGiven) - { here->BSIM4v4icVBS = *(ckt->CKTrhs + here->BSIM4v4bNode) - - *(ckt->CKTrhs + here->BSIM4v4sNode); - } - } + for (; model ; model = model->BSIM4v4nextModel) { + for (here = model->BSIM4v4instances; here; here = here->BSIM4v4nextInstance) { + if (!here->BSIM4v4icVDSGiven) { + here->BSIM4v4icVDS = *(ckt->CKTrhs + here->BSIM4v4dNode) + - *(ckt->CKTrhs + here->BSIM4v4sNode); + } + if (!here->BSIM4v4icVGSGiven) { + here->BSIM4v4icVGS = *(ckt->CKTrhs + here->BSIM4v4gNodeExt) + - *(ckt->CKTrhs + here->BSIM4v4sNode); + } + if(!here->BSIM4v4icVBSGiven) { + here->BSIM4v4icVBS = *(ckt->CKTrhs + here->BSIM4v4bNode) + - *(ckt->CKTrhs + here->BSIM4v4sNode); + } + } } return(OK); } From 82ec45c51923e4b41775385a43f0b26509a492a5 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 22:43:00 +0200 Subject: [PATCH 080/257] inpcom.c, rename N_FUNCS and N_LIBRARY --- src/frontend/inpcom.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index c8b554bc4..7c84f669c 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -36,23 +36,23 @@ Author: 1985 Wayne A. Christopher /*#define TRACE*/ /* globals -- wanted to avoid complicating inp_readall interface */ -#define N_LIBRARY 1000 +#define N_LIBRARIES 1000 #define N_SECTIONS 1000 -#define N_FUNCS 1000 +#define N_FUNCTIONS 1000 #define N_PARAMS 1000 #define N_SUBCKT_W_PARAMS 4000 -static char *library_name[N_LIBRARY]; -static struct line *library_deck[N_LIBRARY]; +static char *library_name[N_LIBRARIES]; +static struct line *library_deck[N_LIBRARIES]; static int num_libraries; static char *global; static char *subckt_w_params[N_SUBCKT_W_PARAMS]; static int num_subckt_w_params; -static char *func_names[N_FUNCS]; -static char *func_params[N_FUNCS][N_PARAMS]; -static char *func_macro[N_FUNCS]; +static char *func_names[N_FUNCTIONS]; +static char *func_params[N_FUNCTIONS][N_PARAMS]; +static char *func_macro[N_FUNCTIONS]; static int num_functions; -static int num_parameters[N_FUNCS]; +static int num_parameters[N_FUNCTIONS]; static COMPATMODE_T inp_compat_mode; /* Collect information for dynamic allocation of numparam arrays */ @@ -191,8 +191,8 @@ read_a_lib(char *y, int call_depth, char *dir_name) dir_name_flag = TRUE; } - if (num_libraries >= N_LIBRARY) { - fprintf(stderr, "ERROR, N_LIBRARY overflow\n"); + if (num_libraries >= N_LIBRARIES) { + fprintf(stderr, "ERROR, N_LIBRARIES overflow\n"); controlled_exit(EXIT_FAILURE); } @@ -2740,8 +2740,8 @@ inp_get_func_from_line(char *line) if (strcmp(func_names[i], line) == 0) break; - if (num_functions >= N_FUNCS) { - fprintf(stderr, "ERROR, N_FUNCS overflow\n"); + if (num_functions >= N_FUNCTIONS) { + fprintf(stderr, "ERROR, N_FUNCTIONS overflow\n"); controlled_exit(EXIT_FAILURE); } From 811edbcafb881cd4e218cee59ad25fd126f03b50 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 22:44:49 +0200 Subject: [PATCH 081/257] inpcom.c, collect globals into a struct --- src/frontend/inpcom.c | 75 +++++++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 7c84f669c..3c9423d02 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -42,17 +42,28 @@ Author: 1985 Wayne A. Christopher #define N_PARAMS 1000 #define N_SUBCKT_W_PARAMS 4000 -static char *library_name[N_LIBRARIES]; -static struct line *library_deck[N_LIBRARIES]; +static struct library { + char *name; + struct line *deck; +} libraries[N_LIBRARIES]; + static int num_libraries; -static char *global; + static char *subckt_w_params[N_SUBCKT_W_PARAMS]; static int num_subckt_w_params; -static char *func_names[N_FUNCTIONS]; -static char *func_params[N_FUNCTIONS][N_PARAMS]; -static char *func_macro[N_FUNCTIONS]; + +static struct function { + char *name; + char *macro; + char *params[N_PARAMS]; + int num_parameters; +} functions[N_FUNCTIONS]; + static int num_functions; -static int num_parameters[N_FUNCTIONS]; + + +static char *global; + static COMPATMODE_T inp_compat_mode; /* Collect information for dynamic allocation of numparam arrays */ @@ -112,7 +123,7 @@ find_lib(char *name) { int i; for (i = 0; i < num_libraries; i++) - if (cieq(library_name[i], name)) + if (cieq(libraries[i].name, name)) return i; return -1; } @@ -196,14 +207,14 @@ read_a_lib(char *y, int call_depth, char *dir_name) controlled_exit(EXIT_FAILURE); } - library_name[num_libraries++] = strdup(y); + libraries[num_libraries++].name = strdup(y); if (dir_name_flag == FALSE) { char *y_dir_name = ngdirname(y); - library_deck[num_libraries-1] = inp_readall(newfp, call_depth+1, y_dir_name, FALSE, FALSE); + libraries[num_libraries-1].deck = inp_readall(newfp, call_depth+1, y_dir_name, FALSE, FALSE); tfree(y_dir_name); } else { - library_deck[num_libraries-1] = inp_readall(newfp, call_depth+1, dir_name, FALSE, FALSE); + libraries[num_libraries-1].deck = inp_readall(newfp, call_depth+1, dir_name, FALSE, FALSE); } fclose(newfp); @@ -231,7 +242,7 @@ read_a_lib(char *y, int call_depth, char *dir_name) store contents in string new_title process .lib lines read file and library name, open file using fcn inp_pathopen() - read file contents and put into struct library_deck[], one entry per .lib line + read file contents and put into struct libraries[].deck, one entry per .lib line process .inc lines read file and library name, open file using fcn inp_pathopen() read file contents and add lines to cc @@ -2327,7 +2338,7 @@ expand_section_references(struct line *deck, int call_depth, char *dir_name) controlled_exit(EXIT_FAILURE); } - section_def = find_section_definition(library_deck[lib_idx], y); + section_def = find_section_definition(libraries[lib_idx].deck, y); if (!section_def) { fprintf(stderr, "ERROR, library file %s, section definition %s not found\n", s, y); @@ -2737,7 +2748,7 @@ inp_get_func_from_line(char *line) /* see if already encountered this function */ for (i = 0; i < num_functions; i++) - if (strcmp(func_names[i], line) == 0) + if (strcmp(functions[i].name, line) == 0) break; if (num_functions >= N_FUNCTIONS) { @@ -2745,7 +2756,7 @@ inp_get_func_from_line(char *line) controlled_exit(EXIT_FAILURE); } - func_names[num_functions++] = strdup(line); + functions[num_functions++].name = strdup(line); *end = keep; num_params = 0; @@ -2763,10 +2774,10 @@ inp_get_func_from_line(char *line) fprintf(stderr, "ERROR, N_PARAMS overflow\n"); controlled_exit(EXIT_FAILURE); } - func_params[num_functions-1][num_params++] = copy_substring(ptr, end); + functions[num_functions-1].params[num_params++] = copy_substring(ptr, end); } } - num_parameters[num_functions-1] = num_params; + functions[num_functions-1].num_parameters = num_params; /* get function macro */ str_len = 0; @@ -2780,7 +2791,7 @@ inp_get_func_from_line(char *line) } temp_buf[str_len++] = '\0'; - func_macro[num_functions-1] = strdup(temp_buf); + functions[num_functions-1].macro = strdup(temp_buf); } @@ -2834,24 +2845,24 @@ inp_do_macro_param_replace(int fcn_number, char *params[]) char keep, before, after; int i; - if (num_parameters[fcn_number] == 0) - return strdup(func_macro[fcn_number]); + if (functions[fcn_number].num_parameters == 0) + return strdup(functions[fcn_number].macro); - for (i = 0; i < num_parameters[fcn_number]; i++) { + for (i = 0; i < functions[fcn_number].num_parameters; i++) { if (curr_str == NULL) { - search_ptr = curr_ptr = func_macro[fcn_number]; + search_ptr = curr_ptr = functions[fcn_number].macro; } else { search_ptr = curr_ptr = curr_str; curr_str = NULL; } - while ((param_ptr = strstr(search_ptr, func_params[fcn_number][i])) != NULL) { + while ((param_ptr = strstr(search_ptr, functions[fcn_number].params[i])) != NULL) { /* make sure actually have the parameter name */ if (param_ptr == search_ptr) /* no valid 'before' */ before = '\0'; else before = *(param_ptr-1); - after = param_ptr [ strlen(func_params[fcn_number][i]) ]; + after = param_ptr [ strlen(functions[fcn_number].params[i]) ]; if (!(is_arith_char(before) || isspace(before) || before == ',' || before == '=' || (param_ptr-1) < curr_ptr) || !(is_arith_char(after) || isspace(after) || @@ -2877,7 +2888,7 @@ inp_do_macro_param_replace(int fcn_number, char *params[]) } *param_ptr = keep; - search_ptr = curr_ptr = param_ptr + strlen(func_params[fcn_number][i]); + search_ptr = curr_ptr = param_ptr + strlen(functions[fcn_number].params[i]); } if (param_ptr == NULL) { if (curr_str == NULL) { @@ -2921,7 +2932,7 @@ inp_expand_macro_in_str(char *str) *open_paren_ptr = '\0'; for (i = 0; i < num_functions; i++) - if (strcmp(func_names[i], fcn_name) == 0) + if (strcmp(functions[i].name, fcn_name) == 0) break; *open_paren_ptr = '('; @@ -2979,7 +2990,7 @@ inp_expand_macro_in_str(char *str) inp_expand_macro_in_str(copy_substring(beg_parameter, curr_ptr)); } - if (num_parameters[i] != num_params) { + if (functions[i].num_parameters != num_params) { fprintf(stderr, "ERROR: parameter mismatch for function call in str: %s\n", orig_str); controlled_exit(EXIT_FAILURE); } @@ -3023,7 +3034,7 @@ inp_expand_macros_in_func(void) int i; for (i = 0; i < num_functions; i++) - func_macro[i] = inp_expand_macro_in_str(func_macro[i]); + functions[i].macro = inp_expand_macro_in_str(functions[i].macro); } @@ -3047,10 +3058,10 @@ inp_expand_macros_in_deck(struct line *deck) if (ciprefix(".ends", c->li_line)) { if (prev_num_functions != num_functions) { for (i = prev_num_functions; i < num_functions; i++) { - tfree(func_names[i]); - tfree(func_macro[i]); - for (j = 0; j < num_parameters[i]; j++) - tfree(func_params[i][j]); + tfree(functions[i].name); + tfree(functions[i].macro); + for (j = 0; j < functions[i].num_parameters; j++) + tfree(functions[i].params[j]); num_functions = prev_num_functions; } } From 0132e3cc0cae8f67e5b0f29a1119b6bfbb83c30a Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 22:46:08 +0200 Subject: [PATCH 082/257] inpcom.c, think in terms of struct library instead of an integer --- src/frontend/inpcom.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 3c9423d02..63da025fa 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -118,14 +118,14 @@ static void inp_poly_err(struct line *deck); #endif -static int +static struct library * find_lib(char *name) { int i; for (i = 0; i < num_libraries; i++) if (cieq(libraries[i].name, name)) - return i; - return -1; + return & libraries[i]; + return NULL; } @@ -178,7 +178,7 @@ read_a_lib(char *y, int call_depth, char *dir_name) y = copyy; /* reuse y, but remember, buffer still points to allocated memory */ } - if (find_lib(y) < 0) { + if (!find_lib(y)) { bool dir_name_flag = FALSE; FILE *newfp = inp_pathopen(y, "r"); @@ -2308,7 +2308,7 @@ expand_section_references(struct line *deck, int call_depth, char *dir_name) struct line *section_def; char keep_char1, keep_char2; char *z, *copys = NULL; - int lib_idx; + struct library *lib; for (z = y; *z && !isspace(*z) && !isquote(*z); z++) ; @@ -2323,22 +2323,22 @@ expand_section_references(struct line *deck, int call_depth, char *dir_name) s = copys; } - lib_idx = find_lib(s); + lib = find_lib(s); - if (lib_idx < 0) { + if (!lib) { if(!read_a_lib(s, call_depth, dir_name)) controlled_exit(EXIT_FAILURE); - lib_idx = find_lib(s); + lib = find_lib(s); } - if (lib_idx < 0) { + if (!lib) { fprintf(stderr, "ERROR, library file %s not found\n", s); controlled_exit(EXIT_FAILURE); } - section_def = find_section_definition(libraries[lib_idx].deck, y); + section_def = find_section_definition(lib->deck, y); if (!section_def) { fprintf(stderr, "ERROR, library file %s, section definition %s not found\n", s, y); From 774c7f9781804cbdbc572fb30704af7b5c86e926 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 23:23:38 +0200 Subject: [PATCH 083/257] inpcom.c, emphasize a potential bug --- src/frontend/inpcom.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 63da025fa..d82df61d1 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2747,6 +2747,7 @@ inp_get_func_from_line(char *line) *end = '\0'; /* see if already encountered this function */ + /* FIXME, this code is unused, which is probably a bug */ for (i = 0; i < num_functions; i++) if (strcmp(functions[i].name, line) == 0) break; From 5892a65b239d515760a0b94da922638a094e856f Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 23:12:36 +0200 Subject: [PATCH 084/257] inpcom.c, think in terms of struct functions instead of an integer --- src/frontend/inpcom.c | 70 ++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d82df61d1..d1272d385 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2727,6 +2727,29 @@ inp_fix_inst_calls_for_numparam(struct line *deck) } +static struct function * +new_function(void) +{ + if (num_functions >= N_FUNCTIONS) { + fprintf(stderr, "ERROR, N_FUNCTIONS overflow\n"); + controlled_exit(EXIT_FAILURE); + } + + return & functions[num_functions++]; +} + + +static struct function * +find_function(char *name) +{ + int i; + for (i = 0; i < num_functions; i++) + if (strcmp(functions[i].name, name) == 0) + return & functions[i]; + return NULL; +} + + static void inp_get_func_from_line(char *line) { @@ -2735,7 +2758,7 @@ inp_get_func_from_line(char *line) char temp_buf[5000]; int num_params = 0; int str_len = 0; - int i = 0; + struct function *function; /* get function name */ line = skip_non_ws(line); @@ -2748,16 +2771,11 @@ inp_get_func_from_line(char *line) /* see if already encountered this function */ /* FIXME, this code is unused, which is probably a bug */ - for (i = 0; i < num_functions; i++) - if (strcmp(functions[i].name, line) == 0) - break; + function = find_function(line); - if (num_functions >= N_FUNCTIONS) { - fprintf(stderr, "ERROR, N_FUNCTIONS overflow\n"); - controlled_exit(EXIT_FAILURE); - } + function = new_function(); - functions[num_functions++].name = strdup(line); + function->name = strdup(line); *end = keep; num_params = 0; @@ -2775,10 +2793,10 @@ inp_get_func_from_line(char *line) fprintf(stderr, "ERROR, N_PARAMS overflow\n"); controlled_exit(EXIT_FAILURE); } - functions[num_functions-1].params[num_params++] = copy_substring(ptr, end); + function->params[num_params++] = copy_substring(ptr, end); } } - functions[num_functions-1].num_parameters = num_params; + function->num_parameters = num_params; /* get function macro */ str_len = 0; @@ -2792,7 +2810,7 @@ inp_get_func_from_line(char *line) } temp_buf[str_len++] = '\0'; - functions[num_functions-1].macro = strdup(temp_buf); + function->macro = strdup(temp_buf); } @@ -2840,30 +2858,30 @@ inp_grab_subckt_func(struct line *subckt) static char* -inp_do_macro_param_replace(int fcn_number, char *params[]) +inp_do_macro_param_replace(struct function *fcn, char *params[]) { char *param_ptr, *curr_ptr, *new_str, *curr_str = NULL, *search_ptr; char keep, before, after; int i; - if (functions[fcn_number].num_parameters == 0) - return strdup(functions[fcn_number].macro); + if (fcn->num_parameters == 0) + return strdup(fcn->macro); - for (i = 0; i < functions[fcn_number].num_parameters; i++) { + for (i = 0; i < fcn->num_parameters; i++) { if (curr_str == NULL) { - search_ptr = curr_ptr = functions[fcn_number].macro; + search_ptr = curr_ptr = fcn->macro; } else { search_ptr = curr_ptr = curr_str; curr_str = NULL; } - while ((param_ptr = strstr(search_ptr, functions[fcn_number].params[i])) != NULL) { + while ((param_ptr = strstr(search_ptr, fcn->params[i])) != NULL) { /* make sure actually have the parameter name */ if (param_ptr == search_ptr) /* no valid 'before' */ before = '\0'; else before = *(param_ptr-1); - after = param_ptr [ strlen(functions[fcn_number].params[i]) ]; + after = param_ptr [ strlen(fcn->params[i]) ]; if (!(is_arith_char(before) || isspace(before) || before == ',' || before == '=' || (param_ptr-1) < curr_ptr) || !(is_arith_char(after) || isspace(after) || @@ -2889,7 +2907,7 @@ inp_do_macro_param_replace(int fcn_number, char *params[]) } *param_ptr = keep; - search_ptr = curr_ptr = param_ptr + strlen(functions[fcn_number].params[i]); + search_ptr = curr_ptr = param_ptr + strlen(fcn->params[i]); } if (param_ptr == NULL) { if (curr_str == NULL) { @@ -2909,7 +2927,7 @@ inp_do_macro_param_replace(int fcn_number, char *params[]) static char* inp_expand_macro_in_str(char *str) { - int i; + struct function *function; char *c; char *open_paren_ptr, *close_paren_ptr, *fcn_name, *params[1000]; char *curr_ptr, *macro_str, *curr_str = NULL; @@ -2932,13 +2950,11 @@ inp_expand_macro_in_str(char *str) *open_paren_ptr = '\0'; - for (i = 0; i < num_functions; i++) - if (strcmp(functions[i].name, fcn_name) == 0) - break; + function = find_function(fcn_name); *open_paren_ptr = '('; - if (i >= num_functions) + if (!function) continue; /* find the closing paren */ @@ -2991,12 +3007,12 @@ inp_expand_macro_in_str(char *str) inp_expand_macro_in_str(copy_substring(beg_parameter, curr_ptr)); } - if (functions[i].num_parameters != num_params) { + if (function->num_parameters != num_params) { fprintf(stderr, "ERROR: parameter mismatch for function call in str: %s\n", orig_str); controlled_exit(EXIT_FAILURE); } - macro_str = inp_do_macro_param_replace(i, params); + macro_str = inp_do_macro_param_replace(function, params); keep = *fcn_name; *fcn_name = '\0'; { From 7e84a75ff7a363015f9a5e1d2ba22e5140624d62 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 23:01:12 +0200 Subject: [PATCH 085/257] inpcom.c, abstraction, free_function() --- src/frontend/inpcom.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d1272d385..aebd054ac 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2750,6 +2750,19 @@ find_function(char *name) } +static void +free_function(struct function *fcn) +{ + int i; + + tfree(fcn->name); + tfree(fcn->macro); + + for (i = 0; i < fcn->num_parameters; i++) + tfree(fcn->params[i]); +} + + static void inp_get_func_from_line(char *line) { @@ -3059,7 +3072,7 @@ static void inp_expand_macros_in_deck(struct line *deck) { struct line *c = deck; - int prev_num_functions = 0, i, j; + int prev_num_functions = 0, i; while (c != NULL) { if (*c->li_line == '*') { @@ -3074,13 +3087,9 @@ inp_expand_macros_in_deck(struct line *deck) } if (ciprefix(".ends", c->li_line)) { if (prev_num_functions != num_functions) { - for (i = prev_num_functions; i < num_functions; i++) { - tfree(functions[i].name); - tfree(functions[i].macro); - for (j = 0; j < functions[i].num_parameters; j++) - tfree(functions[i].params[j]); - num_functions = prev_num_functions; - } + for (i = prev_num_functions; i < num_functions; i++) + free_function(& functions[i]); + num_functions = prev_num_functions; } } From 2b76a081902c558067dc62f1ff56bd411fc1ef85 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 18 May 2013 23:15:40 +0200 Subject: [PATCH 086/257] inpcom.c, cleanup usage of free_function() --- src/frontend/inpcom.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index aebd054ac..e2cdff762 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -3072,7 +3072,7 @@ static void inp_expand_macros_in_deck(struct line *deck) { struct line *c = deck; - int prev_num_functions = 0, i; + int prev_num_functions = 0; while (c != NULL) { if (*c->li_line == '*') { @@ -3086,11 +3086,10 @@ inp_expand_macros_in_deck(struct line *deck) inp_expand_macros_in_func(); } if (ciprefix(".ends", c->li_line)) { - if (prev_num_functions != num_functions) { - for (i = prev_num_functions; i < num_functions; i++) - free_function(& functions[i]); - num_functions = prev_num_functions; - } + int i; + for (i = prev_num_functions; i < num_functions; i++) + free_function(& functions[i]); + num_functions = prev_num_functions; } if (*c->li_line != '*') From 9fd882327e3bfc0fc9afe56c5d362222475cada1 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 19 May 2013 23:08:50 +0200 Subject: [PATCH 087/257] inpcom.c, abstraction, new_lib() --- src/frontend/inpcom.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index e2cdff762..d0133d5fa 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -118,6 +118,18 @@ static void inp_poly_err(struct line *deck); #endif +static struct library * +new_lib(void) +{ + if (num_libraries >= N_LIBRARIES) { + fprintf(stderr, "ERROR, N_LIBRARIES overflow\n"); + controlled_exit(EXIT_FAILURE); + } + + return & libraries[num_libraries++]; +} + + static struct library * find_lib(char *name) { @@ -180,6 +192,8 @@ read_a_lib(char *y, int call_depth, char *dir_name) if (!find_lib(y)) { + struct library *lib; + bool dir_name_flag = FALSE; FILE *newfp = inp_pathopen(y, "r"); @@ -202,19 +216,16 @@ read_a_lib(char *y, int call_depth, char *dir_name) dir_name_flag = TRUE; } - if (num_libraries >= N_LIBRARIES) { - fprintf(stderr, "ERROR, N_LIBRARIES overflow\n"); - controlled_exit(EXIT_FAILURE); - } + lib = new_lib(); - libraries[num_libraries++].name = strdup(y); + lib->name = strdup(y); if (dir_name_flag == FALSE) { char *y_dir_name = ngdirname(y); - libraries[num_libraries-1].deck = inp_readall(newfp, call_depth+1, y_dir_name, FALSE, FALSE); + lib->deck = inp_readall(newfp, call_depth+1, y_dir_name, FALSE, FALSE); tfree(y_dir_name); } else { - libraries[num_libraries-1].deck = inp_readall(newfp, call_depth+1, dir_name, FALSE, FALSE); + lib->deck = inp_readall(newfp, call_depth+1, dir_name, FALSE, FALSE); } fclose(newfp); From 3b5bb3f4a6e2814f64fe16ce104e64ddb0cb3dd4 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 19 May 2013 23:09:15 +0200 Subject: [PATCH 088/257] inpcom.c, abstraction, new_subckt_w_params() --- src/frontend/inpcom.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d0133d5fa..4a18c52eb 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1991,6 +1991,18 @@ inp_change_quotes(char *s) } +static void +new_subckt_w_params(char *str) +{ + if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { + fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n"); + controlled_exit(EXIT_FAILURE); + } + + subckt_w_params[num_subckt_w_params++] = str; +} + + static char* inp_fix_subckt(char *s) { @@ -2007,12 +2019,7 @@ inp_fix_subckt(char *s) for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2) && !isquote(*ptr2); ptr2++) ; - if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { - fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n"); - controlled_exit(EXIT_FAILURE); - } - - subckt_w_params[num_subckt_w_params++] = copy_substring(ptr1, ptr2); + new_subckt_w_params(copy_substring(ptr1, ptr2)); /* go to beginning of first parameter word */ /* s will contain only subckt definition */ @@ -2553,11 +2560,7 @@ inp_fix_subckt_multiplier(struct line *subckt_card, if (!strstr(subckt_card->li_line, "params:")) { new_str = TMALLOC(char, strlen(subckt_card->li_line) + 13); sprintf(new_str, "%s params: m=1", subckt_card->li_line); - if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { - fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n"); - controlled_exit(EXIT_FAILURE); - } - subckt_w_params[num_subckt_w_params++] = get_subckt_model_name(subckt_card->li_line); + new_subckt_w_params(get_subckt_model_name(subckt_card->li_line)); } else { new_str = TMALLOC(char, strlen(subckt_card->li_line) + 5); sprintf(new_str, "%s m=1", subckt_card->li_line); @@ -3812,11 +3815,7 @@ inp_add_params_to_subckt(struct line *subckt_card) subckt_name = skip_non_ws(subckt_card->li_line); subckt_name = skip_ws(subckt_name); end_ptr = skip_non_ws(subckt_name); - if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { - fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n"); - controlled_exit(EXIT_FAILURE); - } - subckt_w_params[num_subckt_w_params++] = copy_substring(subckt_name, end_ptr); + new_subckt_w_params(copy_substring(subckt_name, end_ptr)); } else { new_line = TMALLOC(char, strlen(subckt_line) + strlen(param_ptr) + 2); sprintf(new_line, "%s %s", subckt_line, param_ptr); From 87ae3be5df0e6eb250b0d2f7b9079f4fa825df05 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 19 May 2013 23:11:42 +0200 Subject: [PATCH 089/257] inpcom.c, cleanup, emphasize a search in subckt_w_params[] --- src/frontend/inpcom.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 4a18c52eb..0b214012b 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2670,8 +2670,11 @@ inp_fix_inst_calls_for_numparam(struct line *deck) } if (ciprefix("x", inst_line)) { subckt_name = inp_get_subckt_name(inst_line); - for (i = 0; i < num_subckt_w_params; i++) { - if (strcmp(subckt_w_params[i], subckt_name) == 0) { + for (i = 0; i < num_subckt_w_params; i++) + if (strcmp(subckt_w_params[i], subckt_name) == 0) + break; + + if (i < num_subckt_w_params) { sprintf(name_w_space, "%s ", subckt_name); /* find .subckt line */ @@ -2731,8 +2734,6 @@ inp_fix_inst_calls_for_numparam(struct line *deck) break; d = d->li_next; } - break; - } } tfree(subckt_name); } From 4e9102daaa3df4cf5bb96c2bcfba63d2ab6fed52 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 19 May 2013 23:12:21 +0200 Subject: [PATCH 090/257] inpcom.c, abstraction, find_subckt_w_params() --- src/frontend/inpcom.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 0b214012b..a05edc524 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2003,6 +2003,19 @@ new_subckt_w_params(char *str) } +static char ** +find_subckt_w_params(char *subckt_name) +{ + int i; + + for (i = 0; i < num_subckt_w_params; i++) + if (strcmp(subckt_w_params[i], subckt_name) == 0) + return & subckt_w_params[i]; + + return NULL; +} + + static char* inp_fix_subckt(char *s) { @@ -2670,11 +2683,8 @@ inp_fix_inst_calls_for_numparam(struct line *deck) } if (ciprefix("x", inst_line)) { subckt_name = inp_get_subckt_name(inst_line); - for (i = 0; i < num_subckt_w_params; i++) - if (strcmp(subckt_w_params[i], subckt_name) == 0) - break; - if (i < num_subckt_w_params) { + if (find_subckt_w_params(subckt_name)) { sprintf(name_w_space, "%s ", subckt_name); /* find .subckt line */ From b6eab8029ba7e0545379f9513291ed4c329cc2aa Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 19 May 2013 21:48:49 +0200 Subject: [PATCH 091/257] inpcom.c, cleanup --- src/frontend/inpcom.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index a05edc524..5ce31667a 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -958,7 +958,7 @@ create_new_card(char *card_str, int *line_number) { newcard->li_error = NULL; newcard->li_actual = NULL; - *line_number = *line_number + 1; + *line_number += 1; return newcard; } @@ -1383,7 +1383,7 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, have_subckt = TRUE; if (!have_subckt) { new_names[tmp_cnt++] = used_subckt_names[*num_used_subckt_names] = inst_subckt_name; - *num_used_subckt_names = *num_used_subckt_names + 1; + *num_used_subckt_names += 1; } else { tfree(inst_subckt_name); } @@ -1395,7 +1395,7 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, found_model = TRUE; if (!found_model) { used_model_names[*num_used_model_names] = model_name; - *num_used_model_names = *num_used_model_names + 1; + *num_used_model_names += 1; } else { tfree(model_name); } @@ -1420,7 +1420,7 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, if (strcmp(used_model_names[i], model_name) == 0) found_model = TRUE; if (!found_model) { used_model_names[*num_used_model_names] = model_name; - *num_used_model_names = *num_used_model_names + 1; + *num_used_model_names += 1; } else { tfree(model_name); } @@ -2568,7 +2568,7 @@ inp_fix_subckt_multiplier(struct line *subckt_card, subckt_param_names[num_subckt_params] = strdup("m"); subckt_param_values[num_subckt_params] = strdup("1"); - num_subckt_params = num_subckt_params + 1; + num_subckt_params ++; if (!strstr(subckt_card->li_line, "params:")) { new_str = TMALLOC(char, strlen(subckt_card->li_line) + 13); @@ -3739,7 +3739,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car char after = *(str_ptr+strlen(param_names[i])); if (!(is_arith_char(before) || isspace(before) || (str_ptr-1) < curr_line) || !(is_arith_char(after) || isspace(after) || after == '\0')) { - str_ptr = str_ptr + 1; + str_ptr ++; continue; } beg = str_ptr - 1; From 6c2f07bd5991a3f7f71b16a194c9e9b1a4216094 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 20 May 2013 18:41:02 +0200 Subject: [PATCH 092/257] configure.ac, cleanup `WARNING: PSS analysis enabled' --- configure.ac | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 59e7bf33c..e1163084f 100644 --- a/configure.ac +++ b/configure.ac @@ -857,6 +857,7 @@ if test "x$enable_pzdebug" = xyes; then fi if test "x$enable_pss" = xyes; then AC_DEFINE([WITH_PSS], [], [Define if you want PSS analysis]) + AC_MSG_RESULT([WARNING: PSS analysis enabled]) fi if test "x$enable_blktmsdebug" = xyes; then AC_DEFINE([D_DBG_BLOCKTIMES], [], [Define if we want debug distortion analysis (BLOCKTIMES)]) @@ -1070,10 +1071,6 @@ if test "x$enable_openmp" = xyes; then AC_MSG_RESULT([OpenMP feature enabled]) fi -if test "x$enable_pss" = "xyes"; then - AC_MSG_RESULT([WARNING: PSS analysis enabled]) -fi - # Output Files # ------------ From 439f1a59e6c999fa54fa1bf190ae8be583b44bee Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 20 May 2013 18:55:13 +0200 Subject: [PATCH 093/257] unify, use #include "vccsext.h" the same way as in all other models --- src/spicelib/devices/vccs/vccsask.c | 1 - src/spicelib/devices/vccs/vccsdefs.h | 2 ++ src/spicelib/devices/vccs/vccsdel.c | 1 - src/spicelib/devices/vccs/vccsdest.c | 1 - src/spicelib/devices/vccs/vccsload.c | 1 - src/spicelib/devices/vccs/vccsmdel.c | 1 - src/spicelib/devices/vccs/vccspar.c | 1 - src/spicelib/devices/vccs/vccspzld.c | 1 - src/spicelib/devices/vccs/vccssacl.c | 1 - src/spicelib/devices/vccs/vccsset.c | 1 - src/spicelib/devices/vccs/vccssld.c | 1 - src/spicelib/devices/vccs/vccssprt.c | 1 - src/spicelib/devices/vccs/vccssset.c | 1 - 13 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/spicelib/devices/vccs/vccsask.c b/src/spicelib/devices/vccs/vccsask.c index 4749074d8..2a5b369a4 100644 --- a/src/spicelib/devices/vccs/vccsask.c +++ b/src/spicelib/devices/vccs/vccsask.c @@ -15,7 +15,6 @@ Author: 1987 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" /* ARGSUSED */ int diff --git a/src/spicelib/devices/vccs/vccsdefs.h b/src/spicelib/devices/vccs/vccsdefs.h index 9faed4161..238c2e545 100644 --- a/src/spicelib/devices/vccs/vccsdefs.h +++ b/src/spicelib/devices/vccs/vccsdefs.h @@ -86,4 +86,6 @@ typedef struct sVCCSmodel { /* model structure for a source */ /* model questions */ +#include "vccsext.h" + #endif /*VCCS*/ diff --git a/src/spicelib/devices/vccs/vccsdel.c b/src/spicelib/devices/vccs/vccsdel.c index aaba2e38e..819ca4e19 100644 --- a/src/spicelib/devices/vccs/vccsdel.c +++ b/src/spicelib/devices/vccs/vccsdel.c @@ -9,7 +9,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" int diff --git a/src/spicelib/devices/vccs/vccsdest.c b/src/spicelib/devices/vccs/vccsdest.c index ce63e869a..0afae6d74 100644 --- a/src/spicelib/devices/vccs/vccsdest.c +++ b/src/spicelib/devices/vccs/vccsdest.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles #include "ngspice/ngspice.h" #include "vccsdefs.h" #include "ngspice/suffix.h" -#include "vccsext.h" void diff --git a/src/spicelib/devices/vccs/vccsload.c b/src/spicelib/devices/vccs/vccsload.c index 15e85f4cc..a647d4f1a 100644 --- a/src/spicelib/devices/vccs/vccsload.c +++ b/src/spicelib/devices/vccs/vccsload.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" /*ARGSUSED*/ diff --git a/src/spicelib/devices/vccs/vccsmdel.c b/src/spicelib/devices/vccs/vccsmdel.c index 48a5aab71..613dadf97 100644 --- a/src/spicelib/devices/vccs/vccsmdel.c +++ b/src/spicelib/devices/vccs/vccsmdel.c @@ -9,7 +9,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" int diff --git a/src/spicelib/devices/vccs/vccspar.c b/src/spicelib/devices/vccs/vccspar.c index 81c7a9c9b..7f7b51a76 100644 --- a/src/spicelib/devices/vccs/vccspar.c +++ b/src/spicelib/devices/vccs/vccspar.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" /* ARGSUSED */ diff --git a/src/spicelib/devices/vccs/vccspzld.c b/src/spicelib/devices/vccs/vccspzld.c index e27d3cbb4..02a9c63ff 100644 --- a/src/spicelib/devices/vccs/vccspzld.c +++ b/src/spicelib/devices/vccs/vccspzld.c @@ -11,7 +11,6 @@ Author: 1985 Thomas L. Quarles #include "ngspice/sperror.h" #include "vccsdefs.h" #include "ngspice/suffix.h" -#include "vccsext.h" /*ARGSUSED*/ diff --git a/src/spicelib/devices/vccs/vccssacl.c b/src/spicelib/devices/vccs/vccssacl.c index f6c7eb1c0..3889fbb82 100644 --- a/src/spicelib/devices/vccs/vccssacl.c +++ b/src/spicelib/devices/vccs/vccssacl.c @@ -15,7 +15,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" int diff --git a/src/spicelib/devices/vccs/vccsset.c b/src/spicelib/devices/vccs/vccsset.c index 7c179397a..16e951218 100644 --- a/src/spicelib/devices/vccs/vccsset.c +++ b/src/spicelib/devices/vccs/vccsset.c @@ -15,7 +15,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" /*ARGSUSED*/ diff --git a/src/spicelib/devices/vccs/vccssld.c b/src/spicelib/devices/vccs/vccssld.c index 65b86c3ea..c177628ed 100644 --- a/src/spicelib/devices/vccs/vccssld.c +++ b/src/spicelib/devices/vccs/vccssld.c @@ -15,7 +15,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" int diff --git a/src/spicelib/devices/vccs/vccssprt.c b/src/spicelib/devices/vccs/vccssprt.c index 939bac3b8..eeab21cfa 100644 --- a/src/spicelib/devices/vccs/vccssprt.c +++ b/src/spicelib/devices/vccs/vccssprt.c @@ -15,7 +15,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" void diff --git a/src/spicelib/devices/vccs/vccssset.c b/src/spicelib/devices/vccs/vccssset.c index cd9ed9e68..84c261bc0 100644 --- a/src/spicelib/devices/vccs/vccssset.c +++ b/src/spicelib/devices/vccs/vccssset.c @@ -15,7 +15,6 @@ Author: 1985 Thomas L. Quarles #include "vccsdefs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#include "vccsext.h" int From 985282e33e8658b5ef06b52a9e7245dde2141053 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 20 May 2013 19:08:58 +0200 Subject: [PATCH 094/257] README.adms Warning about outdated information --- README.adms | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.adms b/README.adms index c7218009d..ef23bd6e0 100644 --- a/README.adms +++ b/README.adms @@ -22,6 +22,20 @@ * 02110-1301 USA * *************************************************************************** +WARNING! + +The text in this document has been prepared in 2006 and is outdated. It is +provided here only for reference and may provide some (historical) +information. + +Please refer to the ngspice adms web page at +http://ngspice.sourceforge.net/admshowto.html +for actual information on how to integrate Verilog A device models into +ngspice. + +Holger Vogt, May 2013 + + INTRODUCTION From a205868427f0c9f50bb898ffbd969aec0a64ea63 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 20 May 2013 19:13:27 +0200 Subject: [PATCH 095/257] dctran.c breakpoint added for uic, bug no. 3606715 --- src/spicelib/analysis/dctran.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index 9716e9fa3..f90493f76 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -507,7 +507,7 @@ resume: if (ckt->CKTtime == 0.) SetAnalyse( "tran init", 0); else - SetAnalyse( "tran", (int)((ckt->CKTtime * 1000.) / ckt->CKTfinalTime) + 0.5); + SetAnalyse( "tran", (int)((ckt->CKTtime * 1000.) / ckt->CKTfinalTime + 0.5)); #endif ckt->CKTdelta = MIN(ckt->CKTdelta,ckt->CKTmaxStep); @@ -545,6 +545,10 @@ resume: ckt->CKTbreaks[1] - ckt->CKTbreaks[0])); if(firsttime) { + /* set a breakpoint to reduce ringing of current in devices */ + if (ckt->CKTmode&MODEUIC) + CKTsetBreak(ckt,ckt->CKTstep); + ckt->CKTdelta /= 10; #ifdef STEPDEBUG (void)printf("delta cut for initial timepoint\n"); From 6b94915c2855c6b5081db5598a2ecb56add8ba38 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Mon, 20 May 2013 19:15:22 +0200 Subject: [PATCH 096/257] hsm2set, hsmhvset.c: error message --- src/spicelib/devices/hisim2/hsm2set.c | 2 +- src/spicelib/devices/hisimhv1/hsmhvset.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/hisim2/hsm2set.c b/src/spicelib/devices/hisim2/hsm2set.c index 6e6b214c0..305b18105 100644 --- a/src/spicelib/devices/hisim2/hsm2set.c +++ b/src/spicelib/devices/hisim2/hsm2set.c @@ -87,7 +87,7 @@ int HSM2setup( } else { if (model->HSM2_version != 270) { model->HSM2_version = 270; /* default 270 */ - printf(" 270 is only available for VERSION. \n"); + printf(" 270 is the only available VERSION. \n"); printf(" 270 is selected for VERSION. (default) \n"); } else { printf(" %d is selected for VERSION \n", (int)model->HSM2_version); diff --git a/src/spicelib/devices/hisimhv1/hsmhvset.c b/src/spicelib/devices/hisimhv1/hsmhvset.c index f8d6cf8fe..dad794b3e 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvset.c +++ b/src/spicelib/devices/hisimhv1/hsmhvset.c @@ -79,7 +79,7 @@ int HSMHVsetup( } else { if (strcmp(model->HSMHV_version,"1.23") != 0 ) { model->HSMHV_version = "1.23" ; - printf(" 1.23 is only available for VERSION. \n"); + printf(" 1.23 is the only available VERSION. \n"); printf(" 1.23 is selected for VERSION. (default) \n"); } else { printf(" %s is selected for VERSION \n", model->HSMHV_version); From 083938292f6794cda1b97f64a7f954d385a3a032 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 21 May 2013 14:22:59 +0200 Subject: [PATCH 097/257] whitespaces --- src/spicelib/devices/bsim3/b3check.c | 532 +++++++++++++-------------- src/spicelib/devices/bsim3/b3mpar.c | 38 +- 2 files changed, 285 insertions(+), 285 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3check.c b/src/spicelib/devices/bsim3/b3check.c index cbdaaa020..d2551b22f 100644 --- a/src/spicelib/devices/bsim3/b3check.c +++ b/src/spicelib/devices/bsim3/b3check.c @@ -41,19 +41,19 @@ FILE *fplog; fprintf(fplog, "Model = %s\n", model->BSIM3modName); if (pParam->BSIM3nlx < -pParam->BSIM3leff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3nlx); + printf("Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3nlx); + Fatal_Flag = 1; } - if (model->BSIM3tox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->BSIM3tox); - printf("Fatal: Tox = %g is not positive.\n", model->BSIM3tox); - Fatal_Flag = 1; - } + if (model->BSIM3tox <= 0.0) + { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", + model->BSIM3tox); + printf("Fatal: Tox = %g is not positive.\n", model->BSIM3tox); + Fatal_Flag = 1; + } if (model->BSIM3toxm <= 0.0) { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", @@ -70,104 +70,104 @@ FILE *fplog; Fatal_Flag = 1; } - if (pParam->BSIM3npeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak); - Fatal_Flag = 1; - } - if (pParam->BSIM3nsub <= 0.0) - { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub); - printf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3ngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM3ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->BSIM3ngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM3ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3xj <= 0.0) - { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", - pParam->BSIM3xj); - printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3xj); - Fatal_Flag = 1; - } + if (pParam->BSIM3npeak <= 0.0) + { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", + pParam->BSIM3npeak); + printf("Fatal: Nch = %g is not positive.\n", + pParam->BSIM3npeak); + Fatal_Flag = 1; + } + if (pParam->BSIM3nsub <= 0.0) + { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3nsub); + printf("Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3nsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3ngate < 0.0) + { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", + pParam->BSIM3ngate); + printf("Fatal: Ngate = %g Ngate is not positive.\n", + pParam->BSIM3ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3ngate > 1.e25) + { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", + pParam->BSIM3ngate); + printf("Fatal: Ngate = %g Ngate is too high\n", + pParam->BSIM3ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3xj <= 0.0) + { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", + pParam->BSIM3xj); + printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3xj); + Fatal_Flag = 1; + } - if (pParam->BSIM3dvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3dvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3dvt1); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3dvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3dvt1w); - Fatal_Flag = 1; - } - - if (pParam->BSIM3w0 == -pParam->BSIM3weff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; + if (pParam->BSIM3dvt1 < 0.0) + { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->BSIM3dvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3dvt1); + Fatal_Flag = 1; + } + + if (pParam->BSIM3dvt1w < 0.0) + { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->BSIM3dvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3dvt1w); + Fatal_Flag = 1; + } + + if (pParam->BSIM3w0 == -pParam->BSIM3weff) + { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; } - if (pParam->BSIM3dsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3b1 == -pParam->BSIM3weff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; + if (pParam->BSIM3dsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3b1 == -pParam->BSIM3weff) + { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; } if (pParam->BSIM3u0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->BSIM3u0temp); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp); + printf("Fatal: u0 at current temperature = %g is not positive.\n", + pParam->BSIM3u0temp); + Fatal_Flag = 1; } /* Check delta parameter */ if (pParam->BSIM3delta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3delta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3delta); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", + pParam->BSIM3delta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3delta); + Fatal_Flag = 1; } - if (pParam->BSIM3vsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->BSIM3vsattemp); - Fatal_Flag = 1; - } + if (pParam->BSIM3vsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp); + printf("Fatal: Vsat at current temperature = %g is not positive.\n", + pParam->BSIM3vsattemp); + Fatal_Flag = 1; + } /* Check Rout parameters */ - if (pParam->BSIM3pclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); - Fatal_Flag = 1; - } + if (pParam->BSIM3pclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); + Fatal_Flag = 1; + } - if (pParam->BSIM3drout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); - printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); - Fatal_Flag = 1; - } + if (pParam->BSIM3drout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); + printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); + Fatal_Flag = 1; + } if (pParam->BSIM3pscbe2 <= 0.0) { fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n", @@ -178,18 +178,18 @@ FILE *fplog; if (model->BSIM3unitLengthSidewallJctCap > 0.0 || model->BSIM3unitLengthGateSidewallJctCap > 0.0) { - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - } + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + printf("Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + printf("Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + } } if (pParam->BSIM3noff < 0.1) @@ -223,9 +223,9 @@ FILE *fplog; /* Check capacitance parameters */ if (pParam->BSIM3clc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); - printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); + printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); + Fatal_Flag = 1; } if (pParam->BSIM3moin < 5.0) @@ -239,160 +239,160 @@ FILE *fplog; printf("Warning: Moin = %g is too large.\n", pParam->BSIM3moin); } - if(model->BSIM3capMod ==3) { - if (pParam->BSIM3acde < 0.4) - { fprintf(fplog, "Warning: Acde = %g is too small.\n", - pParam->BSIM3acde); - printf("Warning: Acde = %g is too small.\n", pParam->BSIM3acde); - } - if (pParam->BSIM3acde > 1.6) - { fprintf(fplog, "Warning: Acde = %g is too large.\n", - pParam->BSIM3acde); - printf("Warning: Acde = %g is too large.\n", pParam->BSIM3acde); - } - } + if(model->BSIM3capMod ==3) { + if (pParam->BSIM3acde < 0.4) + { fprintf(fplog, "Warning: Acde = %g is too small.\n", + pParam->BSIM3acde); + printf("Warning: Acde = %g is too small.\n", pParam->BSIM3acde); + } + if (pParam->BSIM3acde > 1.6) + { fprintf(fplog, "Warning: Acde = %g is too large.\n", + pParam->BSIM3acde); + printf("Warning: Acde = %g is too large.\n", pParam->BSIM3acde); + } + } if (model->BSIM3paramChk ==1) { /* Check L and W parameters */ - if (pParam->BSIM3leff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->BSIM3leff); - printf("Warning: Leff = %g may be too small.\n", - pParam->BSIM3leff); - } - - if (pParam->BSIM3leffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3leffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3leffCV); - } - + if (pParam->BSIM3leff <= 5.0e-8) + { fprintf(fplog, "Warning: Leff = %g may be too small.\n", + pParam->BSIM3leff); + printf("Warning: Leff = %g may be too small.\n", + pParam->BSIM3leff); + } + + if (pParam->BSIM3leffCV <= 5.0e-8) + { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3leffCV); + printf("Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3leffCV); + } + if (pParam->BSIM3weff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->BSIM3weff); - printf("Warning: Weff = %g may be too small.\n", - pParam->BSIM3weff); - } - - if (pParam->BSIM3weffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3weffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3weffCV); - } - + { fprintf(fplog, "Warning: Weff = %g may be too small.\n", + pParam->BSIM3weff); + printf("Warning: Weff = %g may be too small.\n", + pParam->BSIM3weff); + } + + if (pParam->BSIM3weffCV <= 1.0e-7) + { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3weffCV); + printf("Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3weffCV); + } + /* Check threshold voltage parameters */ - if (pParam->BSIM3nlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); - printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); + if (pParam->BSIM3nlx < 0.0) + { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); + printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); } - if (model->BSIM3tox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->BSIM3tox); - printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox); + if (model->BSIM3tox < 1.0e-9) + { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", + model->BSIM3tox); + printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox); } if (pParam->BSIM3npeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->BSIM3npeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->BSIM3npeak); - } - else if (pParam->BSIM3npeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->BSIM3npeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->BSIM3npeak); - } + { fprintf(fplog, "Warning: Nch = %g may be too small.\n", + pParam->BSIM3npeak); + printf("Warning: Nch = %g may be too small.\n", + pParam->BSIM3npeak); + } + else if (pParam->BSIM3npeak >= 1.0e21) + { fprintf(fplog, "Warning: Nch = %g may be too large.\n", + pParam->BSIM3npeak); + printf("Warning: Nch = %g may be too large.\n", + pParam->BSIM3npeak); + } - if (pParam->BSIM3nsub <= 1.0e14) - { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", - pParam->BSIM3nsub); - printf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM3nsub); - } - else if (pParam->BSIM3nsub >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->BSIM3nsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM3nsub); - } + if (pParam->BSIM3nsub <= 1.0e14) + { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", + pParam->BSIM3nsub); + printf("Warning: Nsub = %g may be too small.\n", + pParam->BSIM3nsub); + } + else if (pParam->BSIM3nsub >= 1.0e21) + { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", + pParam->BSIM3nsub); + printf("Warning: Nsub = %g may be too large.\n", + pParam->BSIM3nsub); + } - if ((pParam->BSIM3ngate > 0.0) && - (pParam->BSIM3ngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3ngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3ngate); - } + if ((pParam->BSIM3ngate > 0.0) && + (pParam->BSIM3ngate <= 1.e18)) + { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3ngate); + printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3ngate); + } if (pParam->BSIM3dvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3dvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3dvt0); - } - - if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); + { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", + pParam->BSIM3dvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3dvt0); + } + + if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 10.0) + { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); + printf("Warning: (W0 + Weff) may be too small.\n"); } /* Check subthreshold parameters */ - if (pParam->BSIM3nfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->BSIM3nfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor); - } - if (pParam->BSIM3cdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->BSIM3cdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3cdsc); - } - if (pParam->BSIM3cdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->BSIM3cdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3cdscd); - } + if (pParam->BSIM3nfactor < 0.0) + { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", + pParam->BSIM3nfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor); + } + if (pParam->BSIM3cdsc < 0.0) + { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", + pParam->BSIM3cdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3cdsc); + } + if (pParam->BSIM3cdscd < 0.0) + { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", + pParam->BSIM3cdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3cdscd); + } /* Check DIBL parameters */ - if (pParam->BSIM3eta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->BSIM3eta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3eta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); + if (pParam->BSIM3eta0 < 0.0) + { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", + pParam->BSIM3eta0); + printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3eta0); + } + +/* Check Abulk parameters */ + if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 10.0) + { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); + printf("Warning: (B1 + Weff) may be too small.\n"); } /* Check Saturation parameters */ - if (pParam->BSIM3a2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM3a2); - pParam->BSIM3a2 = 0.01; - } - else if (pParam->BSIM3a2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3a2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3a2); - pParam->BSIM3a2 = 1.0; - pParam->BSIM3a1 = 0.0; - } + if (pParam->BSIM3a2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2); + printf("Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->BSIM3a2); + pParam->BSIM3a2 = 0.01; + } + else if (pParam->BSIM3a2 > 1.0) + { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3a2); + printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3a2); + pParam->BSIM3a2 = 1.0; + pParam->BSIM3a1 = 0.0; + } - if (pParam->BSIM3rdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3rdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3rdsw); - pParam->BSIM3rdsw = 0.0; - pParam->BSIM3rds0 = 0.0; - } + if (pParam->BSIM3rdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3rdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3rdsw); + pParam->BSIM3rdsw = 0.0; + pParam->BSIM3rds0 = 0.0; + } if (pParam->BSIM3rds0 < 0.0) { fprintf(fplog, "Warning: Rds at current temperature = %g is negative. Set to zero.\n", pParam->BSIM3rds0); @@ -401,40 +401,40 @@ FILE *fplog; pParam->BSIM3rds0 = 0.0; } - if (pParam->BSIM3vsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); - } + if (pParam->BSIM3vsattemp < 1.0e3) + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); + } - if (pParam->BSIM3pdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3pdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3pdibl1); - } - if (pParam->BSIM3pdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3pdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3pdibl2); - } + if (pParam->BSIM3pdibl1 < 0.0) + { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", + pParam->BSIM3pdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3pdibl1); + } + if (pParam->BSIM3pdibl2 < 0.0) + { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", + pParam->BSIM3pdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3pdibl2); + } /* Check overlap capacitance parameters */ if (model->BSIM3cgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); - model->BSIM3cgdo = 0.0; + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); + model->BSIM3cgdo = 0.0; } if (model->BSIM3cgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); - model->BSIM3cgso = 0.0; + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); + printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); + model->BSIM3cgso = 0.0; } if (model->BSIM3cgbo < 0.0) - { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); - printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); - model->BSIM3cgbo = 0.0; + { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); + printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); + model->BSIM3cgbo = 0.0; } }/* loop for the parameter check for warning messages */ - fclose(fplog); + fclose(fplog); } else { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index 1d81c7de3..0218c3eb5 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -123,14 +123,14 @@ GENmodel *inMod) case BSIM3_MOD_NPEAK: mod->BSIM3npeak = value->rValue; mod->BSIM3npeakGiven = TRUE; - if (mod->BSIM3npeak > 1.0e20) - mod->BSIM3npeak *= 1.0e-6; + if (mod->BSIM3npeak > 1.0e20) + mod->BSIM3npeak *= 1.0e-6; break; case BSIM3_MOD_NGATE: mod->BSIM3ngate = value->rValue; mod->BSIM3ngateGiven = TRUE; - if (mod->BSIM3ngate > 1.0e23) - mod->BSIM3ngate *= 1.0e-6; + if (mod->BSIM3ngate > 1.0e23) + mod->BSIM3ngate *= 1.0e-6; break; case BSIM3_MOD_GAMMA1: mod->BSIM3gamma1 = value->rValue; @@ -438,7 +438,7 @@ GENmodel *inMod) mod->BSIM3tpbswgGiven = TRUE; break; - /* Length dependence */ + /* Length dependence */ case BSIM3_MOD_LCDSC : mod->BSIM3lcdsc = value->rValue; mod->BSIM3lcdscGiven = TRUE; @@ -502,14 +502,14 @@ GENmodel *inMod) case BSIM3_MOD_LNPEAK: mod->BSIM3lnpeak = value->rValue; mod->BSIM3lnpeakGiven = TRUE; - if (mod->BSIM3lnpeak > 1.0e20) - mod->BSIM3lnpeak *= 1.0e-6; + if (mod->BSIM3lnpeak > 1.0e20) + mod->BSIM3lnpeak *= 1.0e-6; break; case BSIM3_MOD_LNGATE: mod->BSIM3lngate = value->rValue; mod->BSIM3lngateGiven = TRUE; - if (mod->BSIM3lngate > 1.0e23) - mod->BSIM3lngate *= 1.0e-6; + if (mod->BSIM3lngate > 1.0e23) + mod->BSIM3lngate *= 1.0e-6; break; case BSIM3_MOD_LGAMMA1: mod->BSIM3lgamma1 = value->rValue; @@ -781,7 +781,7 @@ GENmodel *inMod) mod->BSIM3lvoffcvGiven = TRUE; break; - /* Width dependence */ + /* Width dependence */ case BSIM3_MOD_WCDSC : mod->BSIM3wcdsc = value->rValue; mod->BSIM3wcdscGiven = TRUE; @@ -845,14 +845,14 @@ GENmodel *inMod) case BSIM3_MOD_WNPEAK: mod->BSIM3wnpeak = value->rValue; mod->BSIM3wnpeakGiven = TRUE; - if (mod->BSIM3wnpeak > 1.0e20) - mod->BSIM3wnpeak *= 1.0e-6; + if (mod->BSIM3wnpeak > 1.0e20) + mod->BSIM3wnpeak *= 1.0e-6; break; case BSIM3_MOD_WNGATE: mod->BSIM3wngate = value->rValue; mod->BSIM3wngateGiven = TRUE; - if (mod->BSIM3wngate > 1.0e23) - mod->BSIM3wngate *= 1.0e-6; + if (mod->BSIM3wngate > 1.0e23) + mod->BSIM3wngate *= 1.0e-6; break; case BSIM3_MOD_WGAMMA1: mod->BSIM3wgamma1 = value->rValue; @@ -1124,7 +1124,7 @@ GENmodel *inMod) mod->BSIM3wvoffcvGiven = TRUE; break; - /* Cross-term dependence */ + /* Cross-term dependence */ case BSIM3_MOD_PCDSC : mod->BSIM3pcdsc = value->rValue; mod->BSIM3pcdscGiven = TRUE; @@ -1188,14 +1188,14 @@ GENmodel *inMod) case BSIM3_MOD_PNPEAK: mod->BSIM3pnpeak = value->rValue; mod->BSIM3pnpeakGiven = TRUE; - if (mod->BSIM3pnpeak > 1.0e20) - mod->BSIM3pnpeak *= 1.0e-6; + if (mod->BSIM3pnpeak > 1.0e20) + mod->BSIM3pnpeak *= 1.0e-6; break; case BSIM3_MOD_PNGATE: mod->BSIM3pngate = value->rValue; mod->BSIM3pngateGiven = TRUE; - if (mod->BSIM3pngate > 1.0e23) - mod->BSIM3pngate *= 1.0e-6; + if (mod->BSIM3pngate > 1.0e23) + mod->BSIM3pngate *= 1.0e-6; break; case BSIM3_MOD_PGAMMA1: mod->BSIM3pgamma1 = value->rValue; From e725cd25d048ddf68d5ef734073e9287ed711717 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 21 May 2013 16:33:57 +0200 Subject: [PATCH 098/257] Area Calculation Method (ACM) applied to bsim3v3.3 model --- src/spicelib/devices/bsim3/b3.c | 12 +++ src/spicelib/devices/bsim3/b3ask.c | 3 + src/spicelib/devices/bsim3/b3check.c | 37 ++++--- src/spicelib/devices/bsim3/b3ld.c | 145 ++++++++++++++++++-------- src/spicelib/devices/bsim3/b3mask.c | 32 ++++++ src/spicelib/devices/bsim3/b3mpar.c | 42 ++++++++ src/spicelib/devices/bsim3/b3par.c | 4 + src/spicelib/devices/bsim3/b3set.c | 55 ++++++++-- src/spicelib/devices/bsim3/b3temp.c | 40 ++++++- src/spicelib/devices/bsim3/bsim3def.h | 46 +++++++- 10 files changed, 348 insertions(+), 68 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index 35a39c44e..babeb7658 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -26,6 +26,7 @@ IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"), IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"), IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), IOP( "acnqsmod", BSIM3_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), +IOP( "geo", BSIM3_GEO, IF_INTEGER, "ACM model drain/source connection"), IOP( "delvto", BSIM3_DELVTO, IF_REAL, "Zero bias threshold voltage variation"), IOP( "mulu0", BSIM3_MULU0, IF_REAL, "Low field mobility multiplier"), IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), @@ -66,6 +67,8 @@ IOP( "capmod", BSIM3_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), IOP( "mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), IOP( "noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), IOP( "acnqsmod", BSIM3_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), +IOP( "acm", BSIM3_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), +IOP( "calcacm", BSIM3_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"), IOP( "paramchk", BSIM3_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), IOP( "binunit", BSIM3_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), IOP( "version", BSIM3_MOD_VERSION, IF_STRING, " parameter for model version"), @@ -210,6 +213,15 @@ IOP( "cle", BSIM3_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), IOP( "dwc", BSIM3_MOD_DWC, IF_REAL, "Delta W for C-V model"), IOP( "dlc", BSIM3_MOD_DLC, IF_REAL, "Delta L for C-V model"), +IOP( "hdif", BSIM3_MOD_HDIF, IF_REAL, "ACM Parameter: Distance Gate - contact"), +IOP( "ldif", BSIM3_MOD_LDIF, IF_REAL, "ACM Parameter: Length of LDD Gate-Source/Drain"), +IOP( "ld", BSIM3_MOD_LD, IF_REAL, "ACM Parameter: Length of LDD under Gate"), +IOP( "rd", BSIM3_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain side"), +IOP( "rs", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"), +IOP( "rdc", BSIM3_MOD_RDC, IF_REAL, "ACM Parameter: Resistance contact drain side"), +IOP( "rsc", BSIM3_MOD_RSC, IF_REAL, "ACM Parameter: Resistance contact source side"), +IOP( "wmlt", BSIM3_MOD_WMLT, IF_REAL, "ACM Parameter: Width shrink factor"), + IOP( "alpha0", BSIM3_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), IOP( "alpha1", BSIM3_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), IOP( "beta0", BSIM3_MOD_BETA0, IF_REAL, "substrate current model parameter"), diff --git a/src/spicelib/devices/bsim3/b3ask.c b/src/spicelib/devices/bsim3/b3ask.c index be0631acc..21c1775b6 100644 --- a/src/spicelib/devices/bsim3/b3ask.c +++ b/src/spicelib/devices/bsim3/b3ask.c @@ -65,6 +65,9 @@ BSIM3instance *here = (BSIM3instance*)inst; case BSIM3_ACNQSMOD: value->iValue = here->BSIM3acnqsMod; return(OK); + case BSIM3_GEO: + value->iValue = here->BSIM3geo; + return(OK); case BSIM3_DELVTO: value->rValue = here->BSIM3delvto; return(OK); diff --git a/src/spicelib/devices/bsim3/b3check.c b/src/spicelib/devices/bsim3/b3check.c index d2551b22f..2ec2aad54 100644 --- a/src/spicelib/devices/bsim3/b3check.c +++ b/src/spicelib/devices/bsim3/b3check.c @@ -175,22 +175,31 @@ FILE *fplog; printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3pscbe2); } - if (model->BSIM3unitLengthSidewallJctCap > 0.0 || - model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); + /* ACM model */ + if (model->BSIM3acmMod == 0) { + if (model->BSIM3unitLengthSidewallJctCap > 0.0 || + model->BSIM3unitLengthGateSidewallJctCap > 0.0) + { + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + printf("Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + printf("Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + } + } } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); + if ((model->BSIM3calcacm > 0) && (model->BSIM3acmMod != 12)) + { fprintf(fplog, "Warning: CALCACM = %d is wrong. Set back to 0.\n", + model->BSIM3calcacm); + printf("Warning: CALCACM = %d is wrong. Set back to 0.\n", model->BSIM3calcacm); + model->BSIM3calcacm = 0; } - } if (pParam->BSIM3noff < 0.1) { fprintf(fplog, "Warning: Noff = %g is too small.\n", diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index 2cf4bcd4e..8d352d607 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -378,15 +378,55 @@ for (; model != NULL; model = model->BSIM3nextModel) /* Source/drain junction diode DC model begins */ Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; + /* acm model */ + if (model->BSIM3acmMod == 0) + { + if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) + { SourceSatCurrent = 1.0e-14; + } + else + { SourceSatCurrent = here->BSIM3sourceArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3sourcePerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } } else - { SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; + { + error = ACM_saturationCurrents( + model->BSIM3acmMod, + model->BSIM3calcacm, + here->BSIM3geo, + model->BSIM3hdif, + model->BSIM3wmlt, + here->BSIM3w, + model->BSIM3xw, + model->BSIM3jctTempSatCurDensity, + model->BSIM3jctSidewallTempSatCurDensity, + here->BSIM3drainAreaGiven, + here->BSIM3drainArea, + here->BSIM3drainPerimeterGiven, + here->BSIM3drainPerimeter, + here->BSIM3sourceAreaGiven, + here->BSIM3sourceArea, + here->BSIM3sourcePerimeterGiven, + here->BSIM3sourcePerimeter, + &DrainSatCurrent, + &SourceSatCurrent + ); + if (error) + return(error); } + if (SourceSatCurrent <= 0.0) { here->BSIM3gbs = ckt->CKTgmin; here->BSIM3cbs = here->BSIM3gbs * vbs; @@ -415,15 +455,6 @@ for (; model != NULL; model = model->BSIM3nextModel) } } - if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } if (DrainSatCurrent <= 0.0) { here->BSIM3gbd = ckt->CKTgmin; here->BSIM3cbd = here->BSIM3gbd * vbd; @@ -2237,33 +2268,65 @@ finished: along gate side */ - czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ - czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + if (model->BSIM3acmMod == 0) { - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3drainPerimeter; - czbdsw = 0.0; - } - else - { - czbdsw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3drainPerimeter - pParam->BSIM3weff); - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { - czbssw = 0.0; - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3sourcePerimeter; - } - else - { - czbssw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; + czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ + czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3drainPerimeter; + czbdsw = 0.0; + } + else + { + czbdsw = model->BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3drainPerimeter - pParam->BSIM3weff); + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { + czbssw = 0.0; + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3sourcePerimeter; + } + else + { + czbssw = model->BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; + } + } else { + error = ACM_junctionCapacitances( + model->BSIM3acmMod, + model->BSIM3calcacm, + here->BSIM3geo, + model->BSIM3hdif, + model->BSIM3wmlt, + here->BSIM3w, + model->BSIM3xw, + here->BSIM3drainAreaGiven, + here->BSIM3drainArea, + here->BSIM3drainPerimeterGiven, + here->BSIM3drainPerimeter, + here->BSIM3sourceAreaGiven, + here->BSIM3sourceArea, + here->BSIM3sourcePerimeterGiven, + here->BSIM3sourcePerimeter, + model->BSIM3unitAreaTempJctCap, + model->BSIM3unitLengthSidewallTempJctCap, + model->BSIM3unitLengthGateSidewallJctCap, + &czbd, + &czbdsw, + &czbdswg, + &czbs, + &czbssw, + &czbsswg + ); + if (error) + return(error); } MJ = model->BSIM3bulkJctBotGradingCoeff; diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c index c90e15aec..533732499 100644 --- a/src/spicelib/devices/bsim3/b3mask.c +++ b/src/spicelib/devices/bsim3/b3mask.c @@ -46,6 +46,12 @@ IFvalue *value) case BSIM3_MOD_ACNQSMOD: value->iValue = model->BSIM3acnqsMod; return(OK); + case BSIM3_MOD_ACMMOD: + value->iValue = model->BSIM3acmMod; + return(OK); + case BSIM3_MOD_CALCACM: + value->iValue = model->BSIM3calcacm; + return(OK); case BSIM3_MOD_VERSION : value->sValue = model->BSIM3version; return(OK); @@ -337,6 +343,32 @@ IFvalue *value) value->rValue = model->BSIM3tpbswg; return(OK); + /* ACM model */ + case BSIM3_MOD_HDIF: + value->rValue = model->BSIM3hdif; + return(OK); + case BSIM3_MOD_LDIF: + value->rValue = model->BSIM3ldif; + return(OK); + case BSIM3_MOD_LD: + value->rValue = model->BSIM3ld; + return(OK); + case BSIM3_MOD_RD: + value->rValue = model->BSIM3rd; + return(OK); + case BSIM3_MOD_RS: + value->rValue = model->BSIM3rs; + return(OK); + case BSIM3_MOD_RDC: + value->rValue = model->BSIM3rdc; + return(OK); + case BSIM3_MOD_RSC: + value->rValue = model->BSIM3rsc; + return(OK); + case BSIM3_MOD_WMLT: + value->rValue = model->BSIM3wmlt; + return(OK); + /* Length dependence */ case BSIM3_MOD_LCDSC : value->rValue = model->BSIM3lcdsc; diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index 0218c3eb5..103537884 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -39,6 +39,14 @@ GENmodel *inMod) mod->BSIM3capMod = value->iValue; mod->BSIM3capModGiven = TRUE; break; + case BSIM3_MOD_ACMMOD: + mod->BSIM3acmMod = value->iValue; + mod->BSIM3acmModGiven = TRUE; + break; + case BSIM3_MOD_CALCACM: + mod->BSIM3calcacm = value->iValue; + mod->BSIM3calcacmGiven = TRUE; + break; case BSIM3_MOD_NOIMOD : mod->BSIM3noiMod = value->iValue; mod->BSIM3noiModGiven = TRUE; @@ -438,6 +446,40 @@ GENmodel *inMod) mod->BSIM3tpbswgGiven = TRUE; break; + /* acm model */ + case BSIM3_MOD_HDIF: + mod->BSIM3hdif = value->rValue; + mod->BSIM3hdifGiven = TRUE; + break; + case BSIM3_MOD_LDIF: + mod->BSIM3ldif = value->rValue; + mod->BSIM3ldifGiven = TRUE; + break; + case BSIM3_MOD_LD: + mod->BSIM3ld = value->rValue; + mod->BSIM3ldGiven = TRUE; + break; + case BSIM3_MOD_RD: + mod->BSIM3rd = value->rValue; + mod->BSIM3rdGiven = TRUE; + break; + case BSIM3_MOD_RS: + mod->BSIM3rs = value->rValue; + mod->BSIM3rsGiven = TRUE; + break; + case BSIM3_MOD_RDC: + mod->BSIM3rdc = value->rValue; + mod->BSIM3rdcGiven = TRUE; + break; + case BSIM3_MOD_RSC: + mod->BSIM3rsc = value->rValue; + mod->BSIM3rscGiven = TRUE; + break; + case BSIM3_MOD_WMLT: + mod->BSIM3wmlt = value->rValue; + mod->BSIM3wmltGiven = TRUE; + break; + /* Length dependence */ case BSIM3_MOD_LCDSC : mod->BSIM3lcdsc = value->rValue; diff --git a/src/spicelib/devices/bsim3/b3par.c b/src/spicelib/devices/bsim3/b3par.c index 632c2c4b0..c9c7ddfc1 100644 --- a/src/spicelib/devices/bsim3/b3par.c +++ b/src/spicelib/devices/bsim3/b3par.c @@ -91,6 +91,10 @@ IFvalue *select) here->BSIM3acnqsMod = value->iValue; here->BSIM3acnqsModGiven = TRUE; break; + case BSIM3_GEO: + here->BSIM3geo = value->iValue; + here->BSIM3geoGiven = TRUE; + break; case BSIM3_DELVTO: here->BSIM3delvto = value->rValue; here->BSIM3delvtoGiven = TRUE; diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index e58320828..f85b3f3e2 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -61,6 +61,10 @@ BSIM3instance **InstArray; model->BSIM3paramChk = 0; if (!model->BSIM3capModGiven) model->BSIM3capMod = 3; + if (!model->BSIM3acmModGiven) + model->BSIM3acmMod = 0; + if (!model->BSIM3calcacmGiven) + model->BSIM3calcacm = 0; if (!model->BSIM3noiModGiven) model->BSIM3noiMod = 1; if (!model->BSIM3acnqsModGiven) @@ -247,6 +251,24 @@ BSIM3instance **InstArray; if (!model->BSIM3tpbswgGiven) model->BSIM3tpbswg = 0.0; + /* ACM model */ + if (!model->BSIM3hdifGiven) + model->BSIM3hdif = 0.0; + if (!model->BSIM3ldifGiven) + model->BSIM3ldif = 0.0; + if (!model->BSIM3ldGiven) + model->BSIM3ld = 0.0; + if (!model->BSIM3rdGiven) + model->BSIM3rd = 0.0; + if (!model->BSIM3rsGiven) + model->BSIM3rs = 0.0; + if (!model->BSIM3rdcGiven) + model->BSIM3rdc = 0.0; + if (!model->BSIM3rscGiven) + model->BSIM3rsc = 0.0; + if (!model->BSIM3wmltGiven) + model->BSIM3wmlt = 1.0; + /* Length dependence */ if (!model->BSIM3lcdscGiven) model->BSIM3lcdsc = 0.0; @@ -874,7 +896,12 @@ BSIM3instance **InstArray; if (!here->BSIM3drainPerimeterGiven) here->BSIM3drainPerimeter = 0.0; if (!here->BSIM3drainSquaresGiven) - here->BSIM3drainSquares = 1.0; + { + if (model->BSIM3acmMod == 0) + here->BSIM3drainSquares = 1.0; + else + here->BSIM3drainSquares = 0.0; + } if (!here->BSIM3delvtoGiven) here->BSIM3delvto = 0.0; if (!here->BSIM3mulu0Given) @@ -892,7 +919,12 @@ BSIM3instance **InstArray; if (!here->BSIM3sourcePerimeterGiven) here->BSIM3sourcePerimeter = 0.0; if (!here->BSIM3sourceSquaresGiven) - here->BSIM3sourceSquares = 1.0; + { + if (model->BSIM3acmMod == 0) + here->BSIM3sourceSquares = 1.0; + else + here->BSIM3sourceSquares = 0.0; + } if (!here->BSIM3wGiven) here->BSIM3w = 5.0e-6; if (!here->BSIM3nqsModGiven) @@ -904,14 +936,19 @@ BSIM3instance **InstArray; printf("Warning: acnqsMod has been set to its global value %d.\n", model->BSIM3acnqsMod); } - + if (!here->BSIM3geoGiven) + here->BSIM3geo = 0; if (!here->BSIM3mGiven) here->BSIM3m = 1; /* process drain series resistance */ - if ((model->BSIM3sheetResistance > 0.0) && - (here->BSIM3drainSquares > 0.0 )) + if ( ((model->BSIM3sheetResistance > 0.0) && (here->BSIM3drainSquares > 0.0)) + ||((model->BSIM3sheetResistance > 0.0) && (model->BSIM3hdif > 0.0)) + ||((model->BSIM3rd > 0.0) && (model->BSIM3ldif > 0.0)) + ||((model->BSIM3rd > 0.0) && (model->BSIM3ld > 0.0)) + ||((model->BSIM3rdc > 0.0)) + ) { if(here->BSIM3dNodePrime == 0) { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"drain"); @@ -932,8 +969,12 @@ BSIM3instance **InstArray; } /* process source series resistance */ - if ((model->BSIM3sheetResistance > 0.0) && - (here->BSIM3sourceSquares > 0.0 )) + if ( ((model->BSIM3sheetResistance > 0.0) && (here->BSIM3sourceSquares > 0.0)) + ||((model->BSIM3sheetResistance > 0.0) && (model->BSIM3hdif > 0.0)) + ||((model->BSIM3rs > 0.0) && (model->BSIM3ldif > 0.0)) + ||((model->BSIM3rs > 0.0) && (model->BSIM3ld > 0.0)) + ||((model->BSIM3rsc > 0.0)) + ) { if(here->BSIM3sNodePrime == 0) { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source"); diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 2f6582f01..c3b7c3594 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -16,6 +16,7 @@ #include "bsim3def.h" #include "ngspice/const.h" #include "ngspice/sperror.h" +#include "ngspice/devdefs.h" #include "ngspice/suffix.h" #define Kb 1.3806226e-23 @@ -40,7 +41,7 @@ struct bsim3SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; double Nvtm, SourceSatCurrent, DrainSatCurrent; -int Size_Not_Found; +int Size_Not_Found, error; /* loop through all the BSIM3 device models */ for (; model != NULL; model = model->BSIM3nextModel) @@ -806,16 +807,45 @@ int Size_Not_Found; * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0); /* process source/drain series resistance */ - here->BSIM3drainConductance = model->BSIM3sheetResistance - * here->BSIM3drainSquares; + /* ACM model */ + if (model->BSIM3acmMod == 0) + { + here->BSIM3drainConductance = model->BSIM3sheetResistance + * here->BSIM3drainSquares; + here->BSIM3sourceConductance = model->BSIM3sheetResistance + * here->BSIM3sourceSquares; + } + else /* ACM > 0 */ + { + error = ACM_SourceDrainResistances( + model->BSIM3acmMod, + model->BSIM3ld, + model->BSIM3ldif, + model->BSIM3hdif, + model->BSIM3wmlt, + here->BSIM3w, + model->BSIM3xw, + model->BSIM3sheetResistance, + here->BSIM3drainSquaresGiven, + model->BSIM3rd, + model->BSIM3rdc, + here->BSIM3drainSquares, + here->BSIM3sourceSquaresGiven, + model->BSIM3rs, + model->BSIM3rsc, + here->BSIM3sourceSquares, + &(here->BSIM3drainConductance), + &(here->BSIM3sourceConductance) + ); + if (error) + return(error); + } if (here->BSIM3drainConductance > 0.0) here->BSIM3drainConductance = 1.0 / here->BSIM3drainConductance; else here->BSIM3drainConductance = 0.0; - here->BSIM3sourceConductance = model->BSIM3sheetResistance - * here->BSIM3sourceSquares; if (here->BSIM3sourceConductance > 0.0) here->BSIM3sourceConductance = 1.0 / here->BSIM3sourceConductance; diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index fbe6e1c02..e480358b7 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -68,6 +68,7 @@ typedef struct sBSIM3instance int BSIM3mode; int BSIM3nqsMod; int BSIM3acnqsMod; + int BSIM3geo; /* OP point */ double BSIM3qinv; @@ -138,6 +139,7 @@ typedef struct sBSIM3instance unsigned BSIM3icVGSGiven :1; unsigned BSIM3nqsModGiven :1; unsigned BSIM3acnqsModGiven :1; + unsigned BSIM3geoGiven :1; double *BSIM3DdPtr; double *BSIM3GgPtr; @@ -405,6 +407,8 @@ typedef struct sBSIM3model int BSIM3mobMod; int BSIM3capMod; + int BSIM3acmMod; + int BSIM3calcacm; int BSIM3noiMod; int BSIM3acnqsMod; int BSIM3binUnit; @@ -507,6 +511,18 @@ typedef struct sBSIM3model double BSIM3tpbsw; double BSIM3tpbswg; + /* ACM model */ + double BSIM3xl; + double BSIM3xw; + double BSIM3hdif; + double BSIM3ldif; + double BSIM3ld; + double BSIM3rd; + double BSIM3rs; + double BSIM3rdc; + double BSIM3rsc; + double BSIM3wmlt; + /* Length Dependence */ double BSIM3lcdsc; double BSIM3lcdscb; @@ -856,6 +872,8 @@ typedef struct sBSIM3model unsigned BSIM3mobModGiven :1; unsigned BSIM3binUnitGiven :1; unsigned BSIM3capModGiven :1; + unsigned BSIM3acmModGiven :1; + unsigned BSIM3calcacmGiven :1; unsigned BSIM3paramChkGiven :1; unsigned BSIM3noiModGiven :1; unsigned BSIM3acnqsModGiven :1; @@ -958,6 +976,17 @@ typedef struct sBSIM3model unsigned BSIM3tpbswGiven :1; unsigned BSIM3tpbswgGiven :1; + /* ACM model */ + unsigned BSIM3xlGiven :1; + unsigned BSIM3xwGiven :1; + unsigned BSIM3hdifGiven :1; + unsigned BSIM3ldifGiven :1; + unsigned BSIM3ldGiven :1; + unsigned BSIM3rdGiven :1; + unsigned BSIM3rsGiven :1; + unsigned BSIM3rdcGiven :1; + unsigned BSIM3rscGiven :1; + unsigned BSIM3wmltGiven :1; /* Length dependence */ unsigned BSIM3lcdscGiven :1; @@ -1303,9 +1332,12 @@ typedef struct sBSIM3model #define BSIM3_M 16 #define BSIM3_DELVTO 17 #define BSIM3_MULU0 18 +#define BSIM3_GEO 19 /* model parameters */ -#define BSIM3_MOD_CAPMOD 101 +#define BSIM3_MOD_CAPMOD 100 +#define BSIM3_MOD_ACMMOD 101 +#define BSIM3_MOD_CALCACM 102 #define BSIM3_MOD_MOBMOD 103 #define BSIM3_MOD_NOIMOD 104 @@ -1772,6 +1804,18 @@ typedef struct sBSIM3model #define BSIM3_MOD_WWC 701 #define BSIM3_MOD_WWLC 702 +/* ACM parameters */ +#define BSIM3_MOD_XL 703 +#define BSIM3_MOD_XW 704 +#define BSIM3_MOD_HDIF 711 +#define BSIM3_MOD_LDIF 712 +#define BSIM3_MOD_LD 713 +#define BSIM3_MOD_RD 714 +#define BSIM3_MOD_RS 715 +#define BSIM3_MOD_RDC 716 +#define BSIM3_MOD_RSC 717 +#define BSIM3_MOD_WMLT 718 + /* device questions */ #define BSIM3_DNODE 751 #define BSIM3_GNODE 752 From a23997a68f19602ba8813a8a48a17c0362e492ac Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 21 May 2013 22:02:08 +0200 Subject: [PATCH 099/257] complete the ACM parameter set with xl and xw --- src/spicelib/devices/bsim3/b3.c | 4 ++++ src/spicelib/devices/bsim3/b3mask.c | 8 ++++++++ src/spicelib/devices/bsim3/b3mpar.c | 9 +++++++++ src/spicelib/devices/bsim3/b3set.c | 6 ++++++ src/spicelib/devices/bsim3/b3temp.c | 8 ++++---- 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index babeb7658..985e7b32d 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -185,6 +185,10 @@ IOP( "lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"), IOP( "lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), IOP( "lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"), IOP( "lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"), + +IOP( "xl", BSIM3_MOD_XL, IF_REAL, "Length correction parameter"), +IOP( "xw", BSIM3_MOD_XW, IF_REAL, "Width correction parameter"), + IOP( "wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"), IOP( "wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"), IOP( "dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"), diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c index 533732499..fa138ab89 100644 --- a/src/spicelib/devices/bsim3/b3mask.c +++ b/src/spicelib/devices/bsim3/b3mask.c @@ -1251,6 +1251,14 @@ IFvalue *value) case BSIM3_MOD_WMAX: value->rValue = model->BSIM3Wmax; return(OK); + + case BSIM3_MOD_XL: + value->rValue = model->BSIM3xl; + return(OK); + case BSIM3_MOD_XW: + value->rValue = model->BSIM3xw; + return(OK); + case BSIM3_MOD_NOIA: value->rValue = model->BSIM3oxideTrapDensityA; return(OK); diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index 103537884..038e25e76 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -1678,6 +1678,15 @@ GENmodel *inMod) mod->BSIM3WmaxGiven = TRUE; break; + case BSIM3_MOD_XL: + mod->BSIM3xl = value->rValue; + mod->BSIM3xlGiven = TRUE; + break; + case BSIM3_MOD_XW: + mod->BSIM3xw = value->rValue; + mod->BSIM3xwGiven = TRUE; + break; + case BSIM3_MOD_NOIA : mod->BSIM3oxideTrapDensityA = value->rValue; mod->BSIM3oxideTrapDensityAGiven = TRUE; diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index f85b3f3e2..064ed2922 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -802,6 +802,12 @@ BSIM3instance **InstArray; model->BSIM3dwc = model->BSIM3Wint; if (!model->BSIM3dlcGiven) model->BSIM3dlc = model->BSIM3Lint; + + if (!model->BSIM3xlGiven) + model->BSIM3xl = 0.0; + if (!model->BSIM3xwGiven) + model->BSIM3xw = 0.0; + if (!model->BSIM3cfGiven) model->BSIM3cf = 2.0 * EPSOX / PI * log(1.0 + 0.4e-6 / model->BSIM3tox); diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index c3b7c3594..b8632e1a6 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -193,7 +193,7 @@ int Size_Not_Found, error; + model->BSIM3Wwlc / (T2 * T3); pParam->BSIM3dwc = model->BSIM3dwc + tmp2; - pParam->BSIM3leff = here->BSIM3l - 2.0 * pParam->BSIM3dl; + pParam->BSIM3leff = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dl; if (pParam->BSIM3leff <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -204,7 +204,7 @@ int Size_Not_Found, error; return(E_BADPARM); } - pParam->BSIM3weff = here->BSIM3w - 2.0 * pParam->BSIM3dw; + pParam->BSIM3weff = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dw; if (pParam->BSIM3weff <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -215,7 +215,7 @@ int Size_Not_Found, error; return(E_BADPARM); } - pParam->BSIM3leffCV = here->BSIM3l - 2.0 * pParam->BSIM3dlc; + pParam->BSIM3leffCV = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dlc; if (pParam->BSIM3leffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -226,7 +226,7 @@ int Size_Not_Found, error; return(E_BADPARM); } - pParam->BSIM3weffCV = here->BSIM3w - 2.0 * pParam->BSIM3dwc; + pParam->BSIM3weffCV = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dwc; if (pParam->BSIM3weffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; From d6de8121092d0391323b06f81342e78063ed2ef8 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 22 May 2013 06:59:35 +0200 Subject: [PATCH 100/257] hisimhv correct the qme2 rangecheck --- src/spicelib/devices/hisimhv1/hsmhvset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/hisimhv1/hsmhvset.c b/src/spicelib/devices/hisimhv1/hsmhvset.c index dad794b3e..12b000329 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvset.c +++ b/src/spicelib/devices/hisimhv1/hsmhvset.c @@ -1313,7 +1313,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ RANGECHECK(model->HSMHV_sub2l, 0.0, 1.0, "SUB2L") ; RANGECHECK(model->HSMHV_voverp, 0.0, 2.0, "VOVERP") ; RANGECHECK(model->HSMHV_qme1, 0.0, 300.0e-9, "QME1") ; - RANGECHECK(model->HSMHV_qme2, 0.0, 0.0, "QME2") ; + RANGECHECK(model->HSMHV_qme2, 0.0, 2.0, "QME2") ; RANGECHECK(model->HSMHV_qme3, 0.0,800.0e-12, "QME3") ; RANGECHECK(model->HSMHV_glpart1, 0.0, 1.0, "GLPART1") ; RANGECHECK(model->HSMHV_tnom, 22.0, 32.0, "TNOM") ; From 06471505ed7e596703a5b2d2788d38ed7071d4d5 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 23 May 2013 20:57:53 +0200 Subject: [PATCH 101/257] inpcom.c, cleanup some while(stfuct line * ...) loops --- src/frontend/inpcom.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 5ce31667a..96b9bfe35 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2856,16 +2856,15 @@ inp_get_func_from_line(char *line) // only grab global functions; skip subckt functions // static void -inp_grab_func(struct line *deck) +inp_grab_func(struct line *c) { - struct line *c = deck; bool is_subckt = FALSE; - while (c != NULL) { - if (*c->li_line == '*') { - c = c->li_next; + for (; c; c = c->li_next) { + + if (*c->li_line == '*') continue; - } + if (ciprefix(".subckt", c->li_line)) is_subckt = TRUE; if (ciprefix(".ends", c->li_line)) @@ -2875,22 +2874,20 @@ inp_grab_func(struct line *deck) inp_get_func_from_line(c->li_line); *c->li_line = '*'; } - c = c->li_next; } } static void -inp_grab_subckt_func(struct line *subckt) +inp_grab_subckt_func(struct line *c) { - struct line *c = subckt; - - while (!ciprefix(".ends", c->li_line)) { + for (; c; c = c->li_next) { + if (ciprefix(".ends", c->li_line)) + break; if (ciprefix(".func", c->li_line)) { inp_get_func_from_line(c->li_line); *c->li_line = '*'; } - c = c->li_next; } } @@ -3094,22 +3091,22 @@ inp_expand_macros_in_func(void) static void -inp_expand_macros_in_deck(struct line *deck) +inp_expand_macros_in_deck(struct line *c) { - struct line *c = deck; int prev_num_functions = 0; - while (c != NULL) { - if (*c->li_line == '*') { - c = c->li_next; + for (; c; c = c->li_next) { + + if (*c->li_line == '*') continue; - } + if (ciprefix(".subckt", c->li_line)) { prev_num_functions = num_functions; inp_grab_subckt_func(c); if (prev_num_functions != num_functions) inp_expand_macros_in_func(); } + if (ciprefix(".ends", c->li_line)) { int i; for (i = prev_num_functions; i < num_functions; i++) @@ -3119,7 +3116,6 @@ inp_expand_macros_in_deck(struct line *deck) if (*c->li_line != '*') c->li_line = inp_expand_macro_in_str(c->li_line); - c = c->li_next; } } From 9636d53ec439ea277de2648f30bbba551e70d1a9 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 23 May 2013 21:01:13 +0200 Subject: [PATCH 102/257] bug fix, .func expansion for nested .subckt --- src/frontend/inpcom.c | 70 +++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 96b9bfe35..52ac94147 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -84,8 +84,8 @@ static void inp_remove_excess_ws(struct line *deck); static void expand_section_references(struct line *deck, int call_depth, char *dir_name); static void inp_grab_func(struct line *deck); static void inp_fix_inst_calls_for_numparam(struct line *deck); -static void inp_expand_macros_in_func(void); -static void inp_expand_macros_in_deck(struct line *deck); +static void inp_expand_macros_in_func(int from); +static struct line *inp_expand_macros_in_deck(struct line *deck); static void inp_fix_param_values(struct line *deck); static void inp_reorder_params(struct line *deck, struct line *list_head, struct line *end); static int inp_split_multi_param_lines(struct line *deck, int line_number); @@ -727,7 +727,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile inp_fix_ternary_operator(working); //tprint(working); inp_grab_func(working); - inp_expand_macros_in_func(); + inp_expand_macros_in_func(0); inp_expand_macros_in_deck(working); inp_fix_param_values(working); @@ -2768,9 +2768,11 @@ static struct function * find_function(char *name) { int i; - for (i = 0; i < num_functions; i++) + + for (i = num_functions; --i >= 0; i++) if (strcmp(functions[i].name, name) == 0) return & functions[i]; + return NULL; } @@ -2858,7 +2860,7 @@ inp_get_func_from_line(char *line) static void inp_grab_func(struct line *c) { - bool is_subckt = FALSE; + int nesting = 0; for (; c; c = c->li_next) { @@ -2866,24 +2868,16 @@ inp_grab_func(struct line *c) continue; if (ciprefix(".subckt", c->li_line)) - is_subckt = TRUE; + nesting++; if (ciprefix(".ends", c->li_line)) - is_subckt = FALSE; + nesting--; - if (!is_subckt && ciprefix(".func", c->li_line)) { - inp_get_func_from_line(c->li_line); - *c->li_line = '*'; - } - } -} - - -static void -inp_grab_subckt_func(struct line *c) -{ - for (; c; c = c->li_next) { - if (ciprefix(".ends", c->li_line)) + if (nesting < 0) break; + + if (nesting > 0) + continue; + if (ciprefix(".func", c->li_line)) { inp_get_func_from_line(c->li_line); *c->li_line = '*'; @@ -3081,19 +3075,19 @@ inp_expand_macro_in_str(char *str) static void -inp_expand_macros_in_func(void) +inp_expand_macros_in_func(int from) { int i; - for (i = 0; i < num_functions; i++) + for (i = from; i < num_functions; i++) functions[i].macro = inp_expand_macro_in_str(functions[i].macro); } -static void +static struct line * inp_expand_macros_in_deck(struct line *c) { - int prev_num_functions = 0; + int prev_num_functions = num_functions; for (; c; c = c->li_next) { @@ -3101,22 +3095,32 @@ inp_expand_macros_in_deck(struct line *c) continue; if (ciprefix(".subckt", c->li_line)) { - prev_num_functions = num_functions; - inp_grab_subckt_func(c); - if (prev_num_functions != num_functions) - inp_expand_macros_in_func(); - } - - if (ciprefix(".ends", c->li_line)) { int i; + + prev_num_functions = num_functions; + + inp_grab_func(c->li_next); + + if (prev_num_functions != num_functions) + inp_expand_macros_in_func(prev_num_functions); + + c = inp_expand_macros_in_deck(c->li_next); + + for (i = prev_num_functions; i < num_functions; i++) free_function(& functions[i]); num_functions = prev_num_functions; + + continue; } - if (*c->li_line != '*') - c->li_line = inp_expand_macro_in_str(c->li_line); + if (ciprefix(".ends", c->li_line)) + return c; + + c->li_line = inp_expand_macro_in_str(c->li_line); } + + return c; } From 27ae680b99e87eb197338b00670e4ec912fd7e92 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 23 May 2013 23:13:10 +0200 Subject: [PATCH 103/257] add nqsmod as model parameter for bsim3 --- src/spicelib/devices/bsim3/b3.c | 1 + src/spicelib/devices/bsim3/b3mask.c | 3 ++ src/spicelib/devices/bsim3/b3mpar.c | 6 +++- src/spicelib/devices/bsim3/b3set.c | 13 +++++++- src/spicelib/devices/bsim3/bsim3def.h | 5 +++- src/spicelib/devices/bsim3v32/b3v32.c | 1 + src/spicelib/devices/bsim3v32/b3v32mask.c | 3 ++ src/spicelib/devices/bsim3v32/b3v32mpar.c | 4 +++ src/spicelib/devices/bsim3v32/b3v32set.c | 13 +++++++- src/spicelib/devices/bsim3v32/bsim3v32def.h | 33 +++++++++++---------- 10 files changed, 63 insertions(+), 19 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index 985e7b32d..ac2dbd20f 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -66,6 +66,7 @@ IFparm BSIM3mPTable[] = { /* model parameters */ IOP( "capmod", BSIM3_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), IOP( "mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), IOP( "noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), +IOP( "nqsmod", BSIM3_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), IOP( "acnqsmod", BSIM3_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), IOP( "acm", BSIM3_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), IOP( "calcacm", BSIM3_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"), diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c index fa138ab89..3ca862033 100644 --- a/src/spicelib/devices/bsim3/b3mask.c +++ b/src/spicelib/devices/bsim3/b3mask.c @@ -43,6 +43,9 @@ IFvalue *value) case BSIM3_MOD_NOIMOD: value->iValue = model->BSIM3noiMod; return(OK); + case BSIM3_MOD_NQSMOD: + value->iValue = model->BSIM3nqsMod; + return(OK); case BSIM3_MOD_ACNQSMOD: value->iValue = model->BSIM3acnqsMod; return(OK); diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index 038e25e76..3cd3dc4a9 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -51,11 +51,15 @@ GENmodel *inMod) mod->BSIM3noiMod = value->iValue; mod->BSIM3noiModGiven = TRUE; break; + case BSIM3_MOD_NQSMOD : + mod->BSIM3nqsMod = value->iValue; + mod->BSIM3nqsModGiven = TRUE; + break; case BSIM3_MOD_ACNQSMOD : mod->BSIM3acnqsMod = value->iValue; mod->BSIM3acnqsModGiven = TRUE; break; - case BSIM3_MOD_VERSION : + case BSIM3_MOD_VERSION : mod->BSIM3version = value->sValue; mod->BSIM3versionGiven = TRUE; break; diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 064ed2922..7a59dc334 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -67,6 +67,12 @@ BSIM3instance **InstArray; model->BSIM3calcacm = 0; if (!model->BSIM3noiModGiven) model->BSIM3noiMod = 1; + if (!model->BSIM3nqsModGiven) + model->BSIM3nqsMod = 0; + else if ((model->BSIM3nqsMod != 0) && (model->BSIM3nqsMod != 1)) + { model->BSIM3nqsMod = 0; + printf("Warning: nqsMod has been set to its default value: 0.\n"); + } if (!model->BSIM3acnqsModGiven) model->BSIM3acnqsMod = 0; else if ((model->BSIM3acnqsMod != 0) && (model->BSIM3acnqsMod != 1)) @@ -934,7 +940,12 @@ BSIM3instance **InstArray; if (!here->BSIM3wGiven) here->BSIM3w = 5.0e-6; if (!here->BSIM3nqsModGiven) - here->BSIM3nqsMod = 0; + here->BSIM3nqsMod = model->BSIM3nqsMod; + else if ((here->BSIM3nqsMod != 0) && (here->BSIM3nqsMod != 1)) + { here->BSIM3nqsMod = model->BSIM3nqsMod; + printf("Warning: nqsMod has been set to its global value %d.\n", + model->BSIM3nqsMod); + } if (!here->BSIM3acnqsModGiven) here->BSIM3acnqsMod = model->BSIM3acnqsMod; else if ((here->BSIM3acnqsMod != 0) && (here->BSIM3acnqsMod != 1)) diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index e480358b7..0a944d553 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -410,6 +410,7 @@ typedef struct sBSIM3model int BSIM3acmMod; int BSIM3calcacm; int BSIM3noiMod; + int BSIM3nqsMod; int BSIM3acnqsMod; int BSIM3binUnit; int BSIM3paramChk; @@ -876,6 +877,7 @@ typedef struct sBSIM3model unsigned BSIM3calcacmGiven :1; unsigned BSIM3paramChkGiven :1; unsigned BSIM3noiModGiven :1; + unsigned BSIM3nqsModGiven :1; unsigned BSIM3acnqsModGiven :1; unsigned BSIM3typeGiven :1; unsigned BSIM3toxGiven :1; @@ -1449,7 +1451,8 @@ typedef struct sBSIM3model #define BSIM3_MOD_TPBSWG 207 #define BSIM3_MOD_VOFFCV 208 #define BSIM3_MOD_LINTNOI 209 -#define BSIM3_MOD_ACNQSMOD 210 +#define BSIM3_MOD_NQSMOD 210 +#define BSIM3_MOD_ACNQSMOD 211 /* Length dependence */ #define BSIM3_MOD_LCDSC 251 diff --git a/src/spicelib/devices/bsim3v32/b3v32.c b/src/spicelib/devices/bsim3v32/b3v32.c index d6f766822..b2d17ba94 100644 --- a/src/spicelib/devices/bsim3v32/b3v32.c +++ b/src/spicelib/devices/bsim3v32/b3v32.c @@ -66,6 +66,7 @@ IFparm BSIM3v32mPTable[] = { /* model parameters */ IOP( "capmod", BSIM3v32_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), IOP( "mobmod", BSIM3v32_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), IOP( "noimod", BSIM3v32_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), +IOP( "nqsmod", BSIM3v32_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), IOP( "acm", BSIM3v32_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), IOP( "calcacm", BSIM3v32_MOD_CALCACM, IF_INTEGER, "Area calculation method ACM=12"), IOP( "paramchk", BSIM3v32_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), diff --git a/src/spicelib/devices/bsim3v32/b3v32mask.c b/src/spicelib/devices/bsim3v32/b3v32mask.c index bf66890a0..f90beb13b 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mask.c +++ b/src/spicelib/devices/bsim3v32/b3v32mask.c @@ -40,6 +40,9 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3v32_MOD_NOIMOD: value->iValue = model->BSIM3v32noiMod; return(OK); + case BSIM3v32_MOD_NQSMOD: + value->iValue = model->BSIM3v32nqsMod; + return(OK); case BSIM3v32_MOD_ACMMOD: value->iValue = model->BSIM3v32acmMod; return(OK); diff --git a/src/spicelib/devices/bsim3v32/b3v32mpar.c b/src/spicelib/devices/bsim3v32/b3v32mpar.c index 46cd00364..353f6320d 100644 --- a/src/spicelib/devices/bsim3v32/b3v32mpar.c +++ b/src/spicelib/devices/bsim3v32/b3v32mpar.c @@ -49,6 +49,10 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3v32noiMod = value->iValue; mod->BSIM3v32noiModGiven = TRUE; break; + case BSIM3v32_MOD_NQSMOD : + mod->BSIM3v32nqsMod = value->iValue; + mod->BSIM3v32nqsModGiven = TRUE; + break; case BSIM3v32_MOD_VERSION : mod->BSIM3v32version = value->sValue; mod->BSIM3v32versionGiven = TRUE; diff --git a/src/spicelib/devices/bsim3v32/b3v32set.c b/src/spicelib/devices/bsim3v32/b3v32set.c index 52e8acd0a..185681c77 100644 --- a/src/spicelib/devices/bsim3v32/b3v32set.c +++ b/src/spicelib/devices/bsim3v32/b3v32set.c @@ -58,6 +58,12 @@ IFuid tmpName; model->BSIM3v32calcacm = 0; if (!model->BSIM3v32noiModGiven) model->BSIM3v32noiMod = 1; + if (!model->BSIM3v32nqsModGiven) + model->BSIM3v32nqsMod = 0; + else if ((model->BSIM3v32nqsMod != 0) && (model->BSIM3v32nqsMod != 1)) + { model->BSIM3v32nqsMod = 0; + printf("Warning: nqsMod has been set to its default value: 0.\n"); + } /* If the user does not provide the model revision, * we always choose the most recent. @@ -942,7 +948,12 @@ IFuid tmpName; if (!here->BSIM3v32wGiven) here->BSIM3v32w = 5.0e-6; if (!here->BSIM3v32nqsModGiven) - here->BSIM3v32nqsMod = 0; + here->BSIM3v32nqsMod = model->BSIM3v32nqsMod; + else if ((here->BSIM3v32nqsMod != 0) && (here->BSIM3v32nqsMod != 1)) + { here->BSIM3v32nqsMod = model->BSIM3v32nqsMod; + printf("Warning: nqsMod has been set to its global value %d.\n", + model->BSIM3v32nqsMod); + } if (!here->BSIM3v32geoGiven) here->BSIM3v32geo = 0; diff --git a/src/spicelib/devices/bsim3v32/bsim3v32def.h b/src/spicelib/devices/bsim3v32/bsim3v32def.h index 8428f4413..a98f2b59f 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32def.h +++ b/src/spicelib/devices/bsim3v32/bsim3v32def.h @@ -365,6 +365,7 @@ typedef struct sBSIM3v32model int BSIM3v32acmMod; int BSIM3v32calcacm; int BSIM3v32noiMod; + int BSIM3v32nqsMod; int BSIM3v32binUnit; int BSIM3v32paramChk; char *BSIM3v32version; @@ -831,6 +832,7 @@ typedef struct sBSIM3v32model unsigned BSIM3v32calcacmGiven :1; unsigned BSIM3v32paramChkGiven :1; unsigned BSIM3v32noiModGiven :1; + unsigned BSIM3v32nqsModGiven :1; unsigned BSIM3v32typeGiven :1; unsigned BSIM3v32toxGiven :1; unsigned BSIM3v32versionGiven :1; @@ -1292,22 +1294,23 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_CALCACM 102 #define BSIM3v32_MOD_MOBMOD 103 #define BSIM3v32_MOD_NOIMOD 104 +#define BSIM3v32_MOD_NQSMOD 105 -#define BSIM3v32_MOD_TOX 105 +#define BSIM3v32_MOD_TOX 106 -#define BSIM3v32_MOD_CDSC 106 -#define BSIM3v32_MOD_CDSCB 107 -#define BSIM3v32_MOD_CIT 108 -#define BSIM3v32_MOD_NFACTOR 109 -#define BSIM3v32_MOD_XJ 110 -#define BSIM3v32_MOD_VSAT 111 -#define BSIM3v32_MOD_AT 112 -#define BSIM3v32_MOD_A0 113 -#define BSIM3v32_MOD_A1 114 -#define BSIM3v32_MOD_A2 115 -#define BSIM3v32_MOD_KETA 116 -#define BSIM3v32_MOD_NSUB 117 -#define BSIM3v32_MOD_NPEAK 118 +#define BSIM3v32_MOD_CDSC 107 +#define BSIM3v32_MOD_CDSCB 108 +#define BSIM3v32_MOD_CIT 109 +#define BSIM3v32_MOD_NFACTOR 110 +#define BSIM3v32_MOD_XJ 111 +#define BSIM3v32_MOD_VSAT 112 +#define BSIM3v32_MOD_AT 113 +#define BSIM3v32_MOD_A0 114 +#define BSIM3v32_MOD_A1 115 +#define BSIM3v32_MOD_A2 116 +#define BSIM3v32_MOD_KETA 117 +#define BSIM3v32_MOD_NSUB 118 +#define BSIM3v32_MOD_NPEAK 119 #define BSIM3v32_MOD_NGATE 120 #define BSIM3v32_MOD_GAMMA1 121 #define BSIM3v32_MOD_GAMMA2 122 @@ -1316,7 +1319,7 @@ typedef struct sBSIM3v32model #define BSIM3v32_MOD_VBM 125 -#define BSIM3v32_MOD_XT 126 +#define BSIM3v32_MOD_XT 128 #define BSIM3v32_MOD_K1 129 #define BSIM3v32_MOD_KT1 130 #define BSIM3v32_MOD_KT1L 131 From 57a7ce3723d05c2f0fcf9e2cfaaaa348e0c354d9 Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 24 May 2013 22:01:55 +0200 Subject: [PATCH 104/257] inpcom.c, cleanup inp_expand_macros_in_deck() recursion --- src/frontend/inpcom.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 52ac94147..0ef3223fc 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -726,8 +726,10 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile inp_fix_macro_param_func_paren_io(working); inp_fix_ternary_operator(working); //tprint(working); - inp_grab_func(working); - inp_expand_macros_in_func(0); + if (num_functions != 0) { + fprintf(stderr, "ERROR, internal error, unexpected num_functions = %d\n", num_functions); + controlled_exit(EXIT_FAILURE); + } inp_expand_macros_in_deck(working); inp_fix_param_values(working); @@ -3089,6 +3091,10 @@ inp_expand_macros_in_deck(struct line *c) { int prev_num_functions = num_functions; + inp_grab_func(c); + + inp_expand_macros_in_func(prev_num_functions); + for (; c; c = c->li_next) { if (*c->li_line == '*') @@ -3097,16 +3103,10 @@ inp_expand_macros_in_deck(struct line *c) if (ciprefix(".subckt", c->li_line)) { int i; - prev_num_functions = num_functions; - - inp_grab_func(c->li_next); - - if (prev_num_functions != num_functions) - inp_expand_macros_in_func(prev_num_functions); + int prev_num_functions = num_functions; c = inp_expand_macros_in_deck(c->li_next); - for (i = prev_num_functions; i < num_functions; i++) free_function(& functions[i]); num_functions = prev_num_functions; From b5f56ddc4fed7f7b220e8a8e679b5aacb1d266f5 Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 24 May 2013 22:17:35 +0200 Subject: [PATCH 105/257] inpcom.c, use a `rib cage' to store the .subckt lexical scoping of `.func' --- src/frontend/inpcom.c | 123 +++++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 50 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 0ef3223fc..d6a03eee1 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -52,14 +52,19 @@ static int num_libraries; static char *subckt_w_params[N_SUBCKT_W_PARAMS]; static int num_subckt_w_params; -static struct function { - char *name; - char *macro; - char *params[N_PARAMS]; - int num_parameters; -} functions[N_FUNCTIONS]; +struct function_env +{ + struct function_env *up; -static int num_functions; + int num_functions; + + struct function { + char *name; + char *macro; + char *params[N_PARAMS]; + int num_parameters; + } *functions; +}; static char *global; @@ -82,10 +87,10 @@ static void inp_stripcomments_line(char *s); static void inp_fix_for_numparam(struct line *deck); static void inp_remove_excess_ws(struct line *deck); static void expand_section_references(struct line *deck, int call_depth, char *dir_name); -static void inp_grab_func(struct line *deck); +static void inp_grab_func(struct function_env *, struct line *deck); static void inp_fix_inst_calls_for_numparam(struct line *deck); -static void inp_expand_macros_in_func(int from); -static struct line *inp_expand_macros_in_deck(struct line *deck); +static void inp_expand_macros_in_func(struct function_env *); +static struct line *inp_expand_macros_in_deck(struct function_env *, struct line *deck); static void inp_fix_param_values(struct line *deck); static void inp_reorder_params(struct line *deck, struct line *list_head, struct line *end); static int inp_split_multi_param_lines(struct line *deck, int line_number); @@ -307,7 +312,6 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile if (call_depth == 0) { num_subckt_w_params = 0; num_libraries = 0; - num_functions = 0; global = NULL; found_end = FALSE; inp_compat_mode = ngspice_compat_mode(); @@ -726,11 +730,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile inp_fix_macro_param_func_paren_io(working); inp_fix_ternary_operator(working); //tprint(working); - if (num_functions != 0) { - fprintf(stderr, "ERROR, internal error, unexpected num_functions = %d\n", num_functions); - controlled_exit(EXIT_FAILURE); - } - inp_expand_macros_in_deck(working); + inp_expand_macros_in_deck(NULL, working); inp_fix_param_values(working); /* get end card as last card in list; end card pntr does not appear to always @@ -2755,25 +2755,26 @@ inp_fix_inst_calls_for_numparam(struct line *deck) static struct function * -new_function(void) +new_function(struct function_env *env) { - if (num_functions >= N_FUNCTIONS) { + if (env->num_functions >= N_FUNCTIONS) { fprintf(stderr, "ERROR, N_FUNCTIONS overflow\n"); controlled_exit(EXIT_FAILURE); } - return & functions[num_functions++]; + return & env->functions[env->num_functions++]; } static struct function * -find_function(char *name) +find_function(struct function_env *env, char *name) { int i; - for (i = num_functions; --i >= 0; i++) - if (strcmp(functions[i].name, name) == 0) - return & functions[i]; + for (; env; env = env->up) + for (i = env->num_functions; --i >= 0; i++) + if (strcmp(env->functions[i].name, name) == 0) + return & env->functions[i]; return NULL; } @@ -2793,7 +2794,7 @@ free_function(struct function *fcn) static void -inp_get_func_from_line(char *line) +inp_get_func_from_line(struct function_env *env, char *line) { char *ptr, *end; char keep; @@ -2813,9 +2814,9 @@ inp_get_func_from_line(char *line) /* see if already encountered this function */ /* FIXME, this code is unused, which is probably a bug */ - function = find_function(line); + function = find_function(env, line); - function = new_function(); + function = new_function(env); function->name = strdup(line); *end = keep; @@ -2860,7 +2861,7 @@ inp_get_func_from_line(char *line) // only grab global functions; skip subckt functions // static void -inp_grab_func(struct line *c) +inp_grab_func(struct function_env *env, struct line *c) { int nesting = 0; @@ -2881,7 +2882,7 @@ inp_grab_func(struct line *c) continue; if (ciprefix(".func", c->li_line)) { - inp_get_func_from_line(c->li_line); + inp_get_func_from_line(env, c->li_line); *c->li_line = '*'; } } @@ -2956,7 +2957,7 @@ inp_do_macro_param_replace(struct function *fcn, char *params[]) static char* -inp_expand_macro_in_str(char *str) +inp_expand_macro_in_str(struct function_env *env, char *str) { struct function *function; char *c; @@ -2981,7 +2982,7 @@ inp_expand_macro_in_str(char *str) *open_paren_ptr = '\0'; - function = find_function(fcn_name); + function = find_function(env, fcn_name); *open_paren_ptr = '('; @@ -3035,7 +3036,7 @@ inp_expand_macro_in_str(char *str) break; } params[num_params++] = - inp_expand_macro_in_str(copy_substring(beg_parameter, curr_ptr)); + inp_expand_macro_in_str(env, copy_substring(beg_parameter, curr_ptr)); } if (function->num_parameters != num_params) { @@ -3077,23 +3078,53 @@ inp_expand_macro_in_str(char *str) static void -inp_expand_macros_in_func(int from) +inp_expand_macros_in_func(struct function_env *env) { int i; - for (i = from; i < num_functions; i++) - functions[i].macro = inp_expand_macro_in_str(functions[i].macro); + for (i = 0; i < env->num_functions; i++) + env->functions[i].macro = inp_expand_macro_in_str(env, env->functions[i].macro); +} + + +static struct function_env * +new_function_env(struct function_env *up) +{ + struct function_env *env = TMALLOC(struct function_env, 1); + + env -> up = up; + env -> num_functions = 0; + env -> functions = TMALLOC(struct function, N_FUNCTIONS); + + return env; +} + + +static struct function_env * +delete_function_env(struct function_env *env) +{ + int i; + + struct function_env *up = env -> up; + + for (i = 0; i < env -> num_functions; i++) + free_function(& env -> functions[i]); + + tfree(env -> functions); + tfree(env); + + return up; } static struct line * -inp_expand_macros_in_deck(struct line *c) +inp_expand_macros_in_deck(struct function_env *env, struct line *c) { - int prev_num_functions = num_functions; + env = new_function_env(env); - inp_grab_func(c); + inp_grab_func(env, c); - inp_expand_macros_in_func(prev_num_functions); + inp_expand_macros_in_func(env); for (; c; c = c->li_next) { @@ -3101,25 +3132,17 @@ inp_expand_macros_in_deck(struct line *c) continue; if (ciprefix(".subckt", c->li_line)) { - int i; - - int prev_num_functions = num_functions; - - c = inp_expand_macros_in_deck(c->li_next); - - for (i = prev_num_functions; i < num_functions; i++) - free_function(& functions[i]); - num_functions = prev_num_functions; - + c = inp_expand_macros_in_deck(env, c->li_next); continue; } if (ciprefix(".ends", c->li_line)) - return c; + break; - c->li_line = inp_expand_macro_in_str(c->li_line); + c->li_line = inp_expand_macro_in_str(env, c->li_line); } + env = delete_function_env(env); return c; } From 1abcf9d4fa15a806b74857e8431974e168683ceb Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 24 May 2013 22:31:22 +0200 Subject: [PATCH 106/257] inpcom.c, use a list to store the `.func' lookup table --- src/frontend/inpcom.c | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d6a03eee1..41b9c1a3a 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -38,7 +38,6 @@ Author: 1985 Wayne A. Christopher /* globals -- wanted to avoid complicating inp_readall interface */ #define N_LIBRARIES 1000 #define N_SECTIONS 1000 -#define N_FUNCTIONS 1000 #define N_PARAMS 1000 #define N_SUBCKT_W_PARAMS 4000 @@ -56,9 +55,8 @@ struct function_env { struct function_env *up; - int num_functions; - struct function { + struct function *next; char *name; char *macro; char *params[N_PARAMS]; @@ -2757,24 +2755,24 @@ inp_fix_inst_calls_for_numparam(struct line *deck) static struct function * new_function(struct function_env *env) { - if (env->num_functions >= N_FUNCTIONS) { - fprintf(stderr, "ERROR, N_FUNCTIONS overflow\n"); - controlled_exit(EXIT_FAILURE); - } + struct function *f = TMALLOC(struct function, 1); - return & env->functions[env->num_functions++]; + f -> next = env->functions; + env -> functions = f; + + return f; } static struct function * find_function(struct function_env *env, char *name) { - int i; + struct function *f; for (; env; env = env->up) - for (i = env->num_functions; --i >= 0; i++) - if (strcmp(env->functions[i].name, name) == 0) - return & env->functions[i]; + for (f = env->functions; f; f = f->next) + if (strcmp(f->name, name) == 0) + return f; return NULL; } @@ -3080,10 +3078,10 @@ inp_expand_macro_in_str(struct function_env *env, char *str) static void inp_expand_macros_in_func(struct function_env *env) { - int i; + struct function *f; - for (i = 0; i < env->num_functions; i++) - env->functions[i].macro = inp_expand_macro_in_str(env, env->functions[i].macro); + for (f = env->functions; f ; f = f->next) + f->macro = inp_expand_macro_in_str(env, f->macro); } @@ -3093,8 +3091,7 @@ new_function_env(struct function_env *up) struct function_env *env = TMALLOC(struct function_env, 1); env -> up = up; - env -> num_functions = 0; - env -> functions = TMALLOC(struct function, N_FUNCTIONS); + env -> functions = NULL; return env; } @@ -3103,12 +3100,14 @@ new_function_env(struct function_env *up) static struct function_env * delete_function_env(struct function_env *env) { - int i; - struct function_env *up = env -> up; + struct function *f; - for (i = 0; i < env -> num_functions; i++) - free_function(& env -> functions[i]); + for (f = env -> functions; f; ) { + struct function *here = f; + f = f -> next; + free_function(here); + } tfree(env -> functions); tfree(env); From d78da5b221d5c6f5929a75a93259a4063cb4e48d Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 25 May 2013 18:19:57 +0200 Subject: [PATCH 107/257] inpcom.c, drop artifiact, now this isn't any more a bug --- src/frontend/inpcom.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 41b9c1a3a..184bf5d77 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2810,10 +2810,6 @@ inp_get_func_from_line(struct function_env *env, char *line) keep = *end; *end = '\0'; - /* see if already encountered this function */ - /* FIXME, this code is unused, which is probably a bug */ - function = find_function(env, line); - function = new_function(env); function->name = strdup(line); From a6f787aa0009f801e3f0e8dd9929bbc3c7941058 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 25 May 2013 18:52:56 +0200 Subject: [PATCH 108/257] inpcom.c, cleanup inp_get_func_from_line() --- src/frontend/inpcom.c | 76 +++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 184bf5d77..601ee3cd1 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2753,10 +2753,13 @@ inp_fix_inst_calls_for_numparam(struct line *deck) static struct function * -new_function(struct function_env *env) +new_function(struct function_env *env, char *name) { struct function *f = TMALLOC(struct function, 1); + f -> name = name; + f -> num_parameters = 0; + f -> next = env->functions; env -> functions = f; @@ -2791,56 +2794,58 @@ free_function(struct function *fcn) } +static void +new_function_parameter(struct function *fcn, char *parameter) +{ + if (fcn->num_parameters >= N_PARAMS) { + fprintf(stderr, "ERROR, N_PARAMS overflow\n"); + controlled_exit(EXIT_FAILURE); + } + + fcn->params[fcn->num_parameters++] = parameter; +} + + static void inp_get_func_from_line(struct function_env *env, char *line) { - char *ptr, *end; - char keep; + char *end; char temp_buf[5000]; - int num_params = 0; int str_len = 0; struct function *function; - /* get function name */ + /* skip `.func' */ line = skip_non_ws(line); line = skip_ws(line); + + /* get function name */ end = line; - while (!isspace(*end) && *end != '(') + while (*end && !isspace(*end) && *end != '(') end++; - keep = *end; - *end = '\0'; - function = new_function(env); + function = new_function(env, copy_substring(line, end)); - function->name = strdup(line); - *end = keep; - - num_params = 0; + while (*end && *end != '(') + end++; /* get function parameters */ - while (*end != '(') - end++; - while (*end != ')') { - end = skip_ws(end + 1); - ptr = end; - while (!isspace(*end) && *end != ',' && *end != ')') + while (*end && *end != ')') { + char *beg = skip_ws(end + 1); + end = beg; + while (*end && !isspace(*end) && *end != ',' && *end != ')') end++; - if (end > ptr) { - if (num_params >= N_PARAMS) { - fprintf(stderr, "ERROR, N_PARAMS overflow\n"); - controlled_exit(EXIT_FAILURE); - } - function->params[num_params++] = copy_substring(ptr, end); - } + if (end > beg) + new_function_parameter(function, copy_substring(beg, end)); } - function->num_parameters = num_params; - /* get function macro */ + + /* skip to the beinning of the function body */ + while (*end && *end++ != '{') + ; + + /* get function body */ str_len = 0; - while (*end != '{') - end++; - end++; - while (*end && *end != '}') { + while (*end && *end != '}') { if (!isspace(*end)) temp_buf[str_len++] = *end; end++; @@ -2851,9 +2856,10 @@ inp_get_func_from_line(struct function_env *env, char *line) } -// -// only grab global functions; skip subckt functions -// +/* +* grab functions at the current .subckt nesting level +*/ + static void inp_grab_func(struct function_env *env, struct line *c) { From b08ae02958ea9b7f0eaf9b8d4730e8ee0af77f8c Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 25 May 2013 23:18:14 +0200 Subject: [PATCH 109/257] inpcom.c, unify skip_back() usage #1/2 --- src/frontend/inpcom.c | 54 +++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 601ee3cd1..cc082c60e 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1019,11 +1019,10 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) while (*str_ptr2 != '{') str_ptr2--; xy_str1 = str_ptr2; - str_ptr2 = skip_back_ws(str_ptr2 - 1) + 1; + str_ptr2 = skip_back_ws(xy_str1 - 1) + 1; } else { - str_ptr2 = skip_back_non_ws(str_ptr2); - xy_str1 = str_ptr2 + 1; - str_ptr2 = skip_back_ws(str_ptr2) + 1; + xy_str1 = skip_back_non_ws(str_ptr2) + 1; + str_ptr2 = skip_back_ws(xy_str1 - 1) + 1; } keep = *str_ptr2; *str_ptr2 = '\0'; @@ -1270,8 +1269,8 @@ get_instance_subckt(char *line) // see if instance has parameters if (equal_ptr) { - end_ptr = skip_back_ws(equal_ptr - 1); - end_ptr = skip_back_non_ws(end_ptr) + 1; + end_ptr = skip_back_ws(equal_ptr - 1) + 1; + end_ptr = skip_back_non_ws(end_ptr - 1) + 1; } else { end_ptr = line + strlen(line); } @@ -1689,10 +1688,10 @@ inp_fix_ternary_operator_str(char *line, bool all) all = TRUE; // get conditional question = strchr(str_ptr, '?'); - str_ptr2 = skip_back_ws(question - 1); - if (*str_ptr2 == ')') { + str_ptr2 = skip_back_ws(question - 1) + 1; + if (str_ptr2[-1] == ')') { count = 1; - str_ptr = str_ptr2; + str_ptr = str_ptr2 - 1; while ((count != 0) && (str_ptr != line)) { str_ptr--; if (*str_ptr == '(') @@ -1701,7 +1700,6 @@ inp_fix_ternary_operator_str(char *line, bool all) count++; } } - str_ptr2++; keep = *str_ptr2; *str_ptr2 = '\0'; conditional = strdup(str_ptr); @@ -1737,14 +1735,13 @@ inp_fix_ternary_operator_str(char *line, bool all) fprintf(stderr, "ERROR: problem parsing ternary string (finding ':') %s!\n", line); controlled_exit(EXIT_FAILURE); } - str_ptr2 = skip_back_ws(colon - 1); + str_ptr2 = skip_back_ws(colon - 1) + 1; } else if ((colon = strchr(str_ptr, ':')) != NULL) { - str_ptr2 = skip_back_ws(colon - 1); + str_ptr2 = skip_back_ws(colon - 1) + 1; } else { fprintf(stderr, "ERROR: problem parsing ternary string (missing ':') %s!\n", line); controlled_exit(EXIT_FAILURE); } - str_ptr2++; keep = *str_ptr2; *str_ptr2 = '\0'; if_str = inp_fix_ternary_operator_str(strdup(str_ptr), all); @@ -2037,10 +2034,9 @@ inp_fix_subckt(char *s) /* go to beginning of first parameter word */ /* s will contain only subckt definition */ /* beg will point to start of param list */ - beg = skip_back_ws(equal - 1); - beg = skip_back_non_ws(beg); - *beg = '\0'; - beg++; + beg = skip_back_ws(equal - 1) + 1; + beg = skip_back_non_ws(beg - 1) + 1; + beg[-1] = '\0'; head = alloc(struct line); /* create list of parameters that need to get sorted */ @@ -2049,8 +2045,8 @@ inp_fix_subckt(char *s) /* alternative patch to cope with spaces: get expression between braces {...} */ ptr2 = skip_ws(ptr1 + 1); - ptr1 = skip_back_ws(ptr1 - 1); - ptr1 = skip_back_non_ws(ptr1) + 1; + ptr1 = skip_back_ws(ptr1 - 1) + 1; + ptr1 = skip_back_non_ws(ptr1 - 1) + 1; /* ptr1 points to beginning of parameter */ /* if parameter is an expression and starts with '{', find closing '}' @@ -2412,8 +2408,8 @@ inp_get_subckt_name(char *s) char *subckt_name, *end_ptr = strchr(s, '='); if (end_ptr) { - end_ptr = skip_back_ws(end_ptr - 1); - end_ptr = skip_back_non_ws(end_ptr) + 1; + end_ptr = skip_back_ws(end_ptr - 1) + 1; + end_ptr = skip_back_non_ws(end_ptr - 1) + 1; } else { end_ptr = s + strlen(s); } @@ -2451,9 +2447,8 @@ inp_get_params(char *line, char *param_names[], char *param_values[]) is_expression = FALSE; /* get parameter name */ - name = skip_back_ws(equal_ptr - 1); - end = name + 1; - name = skip_back_non_ws(name) + 1; + end = skip_back_ws(equal_ptr - 1) + 1; + name = skip_back_non_ws(end - 1) + 1; param_names[num_params++] = copy_substring(name, end); @@ -2503,9 +2498,9 @@ inp_fix_inst_line(char *inst_line, end = strchr(inst_line, '='); if (end) { - end = skip_back_ws(end - 1); - end = skip_back_non_ws(end); - *end = '\0'; + end = skip_back_ws(end - 1) + 1; + end = skip_back_non_ws(end - 1) + 1; + end[-1] = '\0'; } for (i = 0; i < num_subckt_params; i++) @@ -4050,8 +4045,8 @@ inp_split_multi_param_lines(struct line *deck, int line_num) continue; } - beg_param = skip_back_ws(equal_ptr - 1); - beg_param = skip_back_non_ws(beg_param); + beg_param = skip_back_ws(equal_ptr - 1) + 1; + beg_param = skip_back_non_ws(beg_param - 1) + 1; end_param = skip_ws(equal_ptr + 1); while (*end_param != '\0' && (!isspace(*end_param) || get_expression || get_paren_expression)) { if (*end_param == '{') @@ -4064,7 +4059,6 @@ inp_split_multi_param_lines(struct line *deck, int line_num) get_paren_expression = FALSE; end_param++; } - beg_param++; keep = *end_param; *end_param = '\0'; new_line = TMALLOC(char, strlen(".param ") + strlen(beg_param) + 1); From 4466748ffbdd573c5438696a9e97f989d939e11e Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 25 May 2013 23:18:00 +0200 Subject: [PATCH 110/257] inpcom.c, unify skip_back() usage #2/2 --- src/frontend/inpcom.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index cc082c60e..a3237119a 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1013,15 +1013,16 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) fprintf(stderr, "ERROR: mal formed line: %s\n", line); controlled_exit(EXIT_FAILURE); } - str_ptr2 = skip_back_ws(str_ptr2 - 1); + str_ptr2 = skip_back_ws(str_ptr2 - 1) + 1; str_ptr1 = skip_ws(str_ptr1 + 1); - if (*str_ptr2 == '}') { + if (str_ptr2[-1] == '}') { + str_ptr2--; while (*str_ptr2 != '{') str_ptr2--; xy_str1 = str_ptr2; str_ptr2 = skip_back_ws(xy_str1 - 1) + 1; } else { - xy_str1 = skip_back_non_ws(str_ptr2) + 1; + xy_str1 = skip_back_non_ws(str_ptr2 - 1) + 1; str_ptr2 = skip_back_ws(xy_str1 - 1) + 1; } keep = *str_ptr2; From 2aaa3acae3df4963bb90793b1aa0360ef2ca7a33 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 25 May 2013 23:38:57 +0200 Subject: [PATCH 111/257] inpcom.c, change semantics of skip_back_non_ws() and skip_back_ws() --- src/frontend/inpcom.c | 62 +++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index a3237119a..7cbf1f254 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -109,9 +109,9 @@ static char *get_quoted_token(char *string, char **token); static void replace_token(char *string, char *token, int where, int total); static void inp_add_series_resistor(struct line *deck); -static char *skip_back_non_ws(char *d) { while (*d && !isspace(*d)) d--; return d; } +static char *skip_back_non_ws(char *d) { --d; while (*d && !isspace(*d)) d--; return d + 1; } +static char *skip_back_ws(char *d) { --d; while (isspace(*d)) d--; return d + 1; } static char *skip_non_ws(char *d) { while (*d && !isspace(*d)) d++; return d; } -static char *skip_back_ws(char *d) { while (isspace(*d)) d--; return d; } static char *skip_ws(char *d) { while (isspace(*d)) d++; return d; } static void tprint(struct line *deck); @@ -997,7 +997,7 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) model_name = copy_substring(line, str_ptr1); str_ptr1 = skip_ws(str_ptr1); - str_ptr2 = skip_back_ws(bool_ptr - 1) + 1; + str_ptr2 = skip_back_ws(bool_ptr); keep = *str_ptr2; *str_ptr2 = '\0'; node_str = strdup(str_ptr1); @@ -1013,17 +1013,17 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) fprintf(stderr, "ERROR: mal formed line: %s\n", line); controlled_exit(EXIT_FAILURE); } - str_ptr2 = skip_back_ws(str_ptr2 - 1) + 1; + str_ptr2 = skip_back_ws(str_ptr2); str_ptr1 = skip_ws(str_ptr1 + 1); if (str_ptr2[-1] == '}') { str_ptr2--; while (*str_ptr2 != '{') str_ptr2--; xy_str1 = str_ptr2; - str_ptr2 = skip_back_ws(xy_str1 - 1) + 1; + str_ptr2 = skip_back_ws(xy_str1); } else { - xy_str1 = skip_back_non_ws(str_ptr2 - 1) + 1; - str_ptr2 = skip_back_ws(xy_str1 - 1) + 1; + xy_str1 = skip_back_non_ws(str_ptr2); + str_ptr2 = skip_back_ws(xy_str1); } keep = *str_ptr2; *str_ptr2 = '\0'; @@ -1270,15 +1270,15 @@ get_instance_subckt(char *line) // see if instance has parameters if (equal_ptr) { - end_ptr = skip_back_ws(equal_ptr - 1) + 1; - end_ptr = skip_back_non_ws(end_ptr - 1) + 1; + end_ptr = skip_back_ws(equal_ptr); + end_ptr = skip_back_non_ws(end_ptr); } else { end_ptr = line + strlen(line); } - end_ptr = skip_back_ws(end_ptr - 1) + 1; + end_ptr = skip_back_ws(end_ptr); - inst_name_ptr = skip_back_non_ws(end_ptr - 1) + 1; + inst_name_ptr = skip_back_non_ws(end_ptr); return copy_substring(inst_name_ptr, end_ptr); } @@ -1340,8 +1340,8 @@ get_adevice_model_name(char *line) { char *ptr_end, *ptr_beg; - ptr_end = skip_back_ws(line + strlen(line) - 1) + 1; - ptr_beg = skip_back_non_ws(ptr_end - 1) + 1; + ptr_end = skip_back_ws(line + strlen(line)); + ptr_beg = skip_back_non_ws(ptr_end); return copy_substring(ptr_beg, ptr_end); } @@ -1689,7 +1689,7 @@ inp_fix_ternary_operator_str(char *line, bool all) all = TRUE; // get conditional question = strchr(str_ptr, '?'); - str_ptr2 = skip_back_ws(question - 1) + 1; + str_ptr2 = skip_back_ws(question); if (str_ptr2[-1] == ')') { count = 1; str_ptr = str_ptr2 - 1; @@ -1736,9 +1736,9 @@ inp_fix_ternary_operator_str(char *line, bool all) fprintf(stderr, "ERROR: problem parsing ternary string (finding ':') %s!\n", line); controlled_exit(EXIT_FAILURE); } - str_ptr2 = skip_back_ws(colon - 1) + 1; + str_ptr2 = skip_back_ws(colon); } else if ((colon = strchr(str_ptr, ':')) != NULL) { - str_ptr2 = skip_back_ws(colon - 1) + 1; + str_ptr2 = skip_back_ws(colon); } else { fprintf(stderr, "ERROR: problem parsing ternary string (missing ':') %s!\n", line); controlled_exit(EXIT_FAILURE); @@ -2035,8 +2035,8 @@ inp_fix_subckt(char *s) /* go to beginning of first parameter word */ /* s will contain only subckt definition */ /* beg will point to start of param list */ - beg = skip_back_ws(equal - 1) + 1; - beg = skip_back_non_ws(beg - 1) + 1; + beg = skip_back_ws(equal); + beg = skip_back_non_ws(beg); beg[-1] = '\0'; head = alloc(struct line); @@ -2046,8 +2046,8 @@ inp_fix_subckt(char *s) /* alternative patch to cope with spaces: get expression between braces {...} */ ptr2 = skip_ws(ptr1 + 1); - ptr1 = skip_back_ws(ptr1 - 1) + 1; - ptr1 = skip_back_non_ws(ptr1 - 1) + 1; + ptr1 = skip_back_ws(ptr1); + ptr1 = skip_back_non_ws(ptr1); /* ptr1 points to beginning of parameter */ /* if parameter is an expression and starts with '{', find closing '}' @@ -2409,14 +2409,14 @@ inp_get_subckt_name(char *s) char *subckt_name, *end_ptr = strchr(s, '='); if (end_ptr) { - end_ptr = skip_back_ws(end_ptr - 1) + 1; - end_ptr = skip_back_non_ws(end_ptr - 1) + 1; + end_ptr = skip_back_ws(end_ptr); + end_ptr = skip_back_non_ws(end_ptr); } else { end_ptr = s + strlen(s); } - end_ptr = skip_back_ws(end_ptr - 1) + 1; - subckt_name = skip_back_non_ws(end_ptr - 1) + 1; + end_ptr = skip_back_ws(end_ptr); + subckt_name = skip_back_non_ws(end_ptr); return copy_substring(subckt_name, end_ptr); } @@ -2448,8 +2448,8 @@ inp_get_params(char *line, char *param_names[], char *param_values[]) is_expression = FALSE; /* get parameter name */ - end = skip_back_ws(equal_ptr - 1) + 1; - name = skip_back_non_ws(end - 1) + 1; + end = skip_back_ws(equal_ptr); + name = skip_back_non_ws(end); param_names[num_params++] = copy_substring(name, end); @@ -2499,8 +2499,8 @@ inp_fix_inst_line(char *inst_line, end = strchr(inst_line, '='); if (end) { - end = skip_back_ws(end - 1) + 1; - end = skip_back_non_ws(end - 1) + 1; + end = skip_back_ws(end); + end = skip_back_non_ws(end); end[-1] = '\0'; } @@ -3416,7 +3416,7 @@ get_param_name(char *line) char keep; if ((equal_ptr = strchr(line, '=')) != NULL) { - equal_ptr = skip_back_ws(equal_ptr - 1) + 1; + equal_ptr = skip_back_ws(equal_ptr); beg = equal_ptr - 1; while (!isspace(*beg) && beg != line) @@ -4046,8 +4046,8 @@ inp_split_multi_param_lines(struct line *deck, int line_num) continue; } - beg_param = skip_back_ws(equal_ptr - 1) + 1; - beg_param = skip_back_non_ws(beg_param - 1) + 1; + beg_param = skip_back_ws(equal_ptr); + beg_param = skip_back_non_ws(beg_param); end_param = skip_ws(equal_ptr + 1); while (*end_param != '\0' && (!isspace(*end_param) || get_expression || get_paren_expression)) { if (*end_param == '{') From a85a5d6c3eedc7d9f53976aca5e843c0627b7cfc Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 00:07:43 +0200 Subject: [PATCH 112/257] inpcom.c, simple cleanups --- src/frontend/inpcom.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 7cbf1f254..ecfd7e83d 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1020,11 +1020,10 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) while (*str_ptr2 != '{') str_ptr2--; xy_str1 = str_ptr2; - str_ptr2 = skip_back_ws(xy_str1); } else { xy_str1 = skip_back_non_ws(str_ptr2); - str_ptr2 = skip_back_ws(xy_str1); } + str_ptr2 = skip_back_ws(xy_str1); keep = *str_ptr2; *str_ptr2 = '\0'; ctrl_node_str = strdup(str_ptr1); @@ -1942,7 +1941,7 @@ inp_stripcomments_line(char *s) return; } - if (d>s) { + if (d > s) { d--; /* d now points to character just before comment */ @@ -2077,7 +2076,7 @@ inp_fix_subckt(char *s) beg = ptr2; } else { *ptr2 = '\0'; - beg = ptr2+1; + beg = ptr2 + 1; } newcard = alloc(struct line); @@ -2436,12 +2435,12 @@ inp_get_params(char *line, char *param_names[], char *param_values[]) // check for equality '==' if (equal_ptr[1] == '=') { - line = equal_ptr+2; + line = equal_ptr + 2; continue; } // check for '!=', '<=', '>=' if (*(equal_ptr-1) == '!' || *(equal_ptr-1) == '<' || *(equal_ptr-1) == '>') { - line = equal_ptr+1; + line = equal_ptr + 1; continue; } @@ -4015,12 +4014,12 @@ inp_split_multi_param_lines(struct line *deck, int line_num) while ((equal_ptr = strchr(curr_line, '=')) != NULL) { // check for equality '==' if (equal_ptr[1] == '=') { - curr_line = equal_ptr+2; + curr_line = equal_ptr + 2; continue; } // check for '!=', '<=', '>=' if (*(equal_ptr-1) == '!' || *(equal_ptr-1) == '<' || *(equal_ptr-1) == '>') { - curr_line = equal_ptr+1; + curr_line = equal_ptr + 1; continue; } counter++; @@ -4037,12 +4036,12 @@ inp_split_multi_param_lines(struct line *deck, int line_num) while (curr_line < card->li_line+strlen(card->li_line) && (equal_ptr = strchr(curr_line, '=')) != NULL) { // check for equality '==' if (equal_ptr[1] == '=') { - curr_line = equal_ptr+2; + curr_line = equal_ptr + 2; continue; } // check for '!=', '<=', '>=' if (*(equal_ptr-1) == '!' || *(equal_ptr-1) == '<' || *(equal_ptr-1) == '>') { - curr_line = equal_ptr+1; + curr_line = equal_ptr + 1; continue; } From 073ba1c628a465e5b280276bbb293b4bc7951d66 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 00:19:07 +0200 Subject: [PATCH 113/257] inpcom.c, cleanup --- src/frontend/inpcom.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index ecfd7e83d..86673a2c1 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1013,15 +1013,14 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) fprintf(stderr, "ERROR: mal formed line: %s\n", line); controlled_exit(EXIT_FAILURE); } - str_ptr2 = skip_back_ws(str_ptr2); str_ptr1 = skip_ws(str_ptr1 + 1); - if (str_ptr2[-1] == '}') { - str_ptr2--; - while (*str_ptr2 != '{') - str_ptr2--; - xy_str1 = str_ptr2; + xy_str1 = skip_back_ws(str_ptr2); + if (xy_str1[-1] == '}') { + xy_str1--; + while (*xy_str1 != '{') + xy_str1--; } else { - xy_str1 = skip_back_non_ws(str_ptr2); + xy_str1 = skip_back_non_ws(xy_str1); } str_ptr2 = skip_back_ws(xy_str1); keep = *str_ptr2; From c6df44e48d56c95ddf75265691f8495b6629f44b Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 00:27:17 +0200 Subject: [PATCH 114/257] inpcom.c, bug fix (incorrect check for mal formed line) --- src/frontend/inpcom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 86673a2c1..8037b523d 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1009,7 +1009,7 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) fcn_name = copy_substring(bool_ptr, str_ptr1); str_ptr1 = strchr(str_ptr1, ')'); comma_ptr = str_ptr2 = strchr(line, ','); - if ((str_ptr1 == NULL)|| (str_ptr1 == NULL)) { + if (!str_ptr1 || !comma_ptr) { fprintf(stderr, "ERROR: mal formed line: %s\n", line); controlled_exit(EXIT_FAILURE); } From bffc2cb4284f3f4fffb06f74ae350fc9351837d0 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 00:30:32 +0200 Subject: [PATCH 115/257] inpcom.c, cleanup --- src/frontend/inpcom.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 8037b523d..e6964674e 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1003,22 +1003,21 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) node_str = strdup(str_ptr1); *str_ptr2 = keep; - str_ptr1 = bool_ptr + 1; - while (*str_ptr1 != '(') - str_ptr1++; + str_ptr1 = bool_ptr; + while (*++str_ptr1 != '(') + ; fcn_name = copy_substring(bool_ptr, str_ptr1); str_ptr1 = strchr(str_ptr1, ')'); - comma_ptr = str_ptr2 = strchr(line, ','); + comma_ptr = strchr(line, ','); if (!str_ptr1 || !comma_ptr) { fprintf(stderr, "ERROR: mal formed line: %s\n", line); controlled_exit(EXIT_FAILURE); } str_ptr1 = skip_ws(str_ptr1 + 1); - xy_str1 = skip_back_ws(str_ptr2); + xy_str1 = skip_back_ws(comma_ptr); if (xy_str1[-1] == '}') { - xy_str1--; - while (*xy_str1 != '{') - xy_str1--; + while (*--xy_str1 != '{') + ; } else { xy_str1 = skip_back_non_ws(xy_str1); } @@ -1030,9 +1029,8 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) str_ptr1 = skip_ws(comma_ptr + 1); if (*str_ptr1 == '{') { - while (*str_ptr1 != '}') - str_ptr1++; - str_ptr1++; + while (*str_ptr1++ != '}') + ; } else { str_ptr1 = skip_non_ws(str_ptr1); } From 03aca8385c9a302b9ffee3225dc98fc4058ca598 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 00:40:31 +0200 Subject: [PATCH 116/257] inpcom.c, inp_chk_for_multi_in_vcvs() shrink scope of variables --- src/frontend/inpcom.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index e6964674e..7b7c72324 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -967,14 +967,11 @@ create_new_card(char *card_str, int *line_number) { static void inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) { - struct line *c, *a_card, *model_card, *next_card; - char *line, *bool_ptr, *str_ptr1, *str_ptr2, keep, *comma_ptr, *xy_values1[5], *xy_values2[5]; - char *node_str, *ctrl_node_str, *xy_str1, *model_name, *fcn_name; - char big_buf[1000]; - int xy_count1 = 0, xy_count2 = 0, skip_control = 0; + int skip_control = 0; + struct line *c; for (c = deck; c != NULL; c = c->li_next) { - line = c->li_line; + char *line = c->li_line; /* there is no e source inside .control ... .endc */ if (ciprefix(".control", line)) { @@ -988,11 +985,20 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) } if (*line == 'e') { + + char *bool_ptr; + if ((bool_ptr = strstr(line, "nand(")) != NULL || (bool_ptr = strstr(line, "and(")) != NULL || (bool_ptr = strstr(line, "nor(")) != NULL || (bool_ptr = strstr(line, "or(")) != NULL) { + struct line *a_card, *model_card, *next_card; + char *str_ptr1, *str_ptr2, keep, *comma_ptr, *xy_values1[5], *xy_values2[5]; + char *node_str, *ctrl_node_str, *xy_str1, *model_name, *fcn_name; + char big_buf[1000]; + int xy_count1, xy_count2; + str_ptr1 = skip_non_ws(line); model_name = copy_substring(line, str_ptr1); From 559ef1d771631eda15272b51daddd03017dfbcef Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 26 May 2013 15:31:49 +0200 Subject: [PATCH 117/257] xpressn.c: reduce number of (forbidden) keywords to what is actually used --- src/frontend/numparam/numparam.h | 2 +- src/frontend/numparam/xpressn.c | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/frontend/numparam/numparam.h b/src/frontend/numparam/numparam.h index 85d9c99a2..71c1df6c2 100644 --- a/src/frontend/numparam/numparam.h +++ b/src/frontend/numparam/numparam.h @@ -16,7 +16,7 @@ typedef enum {Nodekey = '#'} _nNodekey; /* Introduces node symbol */ typedef enum {Intro = '&'} _nIntro; /* Introduces preprocessor tokens */ typedef enum {Comment = '*'} _nComment; /* Spice Comment lines */ typedef enum {Psp = '{'} _nPsp; /* Ps expression */ -typedef enum {Defd = 15} _nDefd; /* serial numb. of 'defined' keyword. +typedef enum {Defd = 6} _nDefd; /* serial numb. of 'defined' keyword. The others are not used (yet) */ typedef char *auxtable; /* dummy */ diff --git a/src/frontend/numparam/xpressn.c b/src/frontend/numparam/xpressn.c index 20855b8e8..77c51b81a 100644 --- a/src/frontend/numparam/xpressn.c +++ b/src/frontend/numparam/xpressn.c @@ -88,8 +88,7 @@ initkeys(void) { spice_dstring_init(&keyS); scopy_up(&keyS, - "and or not div mod if else end while macro funct defined" - " include for to downto is var"); + "and or not div mod defined"); scopy_up(&fmathS, "sqr sqrt sin cos exp ln arctan abs pow pwr max min int log sinh cosh" " tanh ternary_fcn v agauss sgn gauss unif aunif limit ceil floor"); @@ -935,7 +934,7 @@ opfunctkey(tdico *dico, /*if kw operator keyword, c=token*/ switch (kw) { - /* & | ~ DIV MOD Defined */ + /* & | ~ DIV MOD Defined */ case 1: c = '&'; state = 2; From 1905d232124207f7321f45ec0f8b0382dde7b361 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 19:13:22 +0200 Subject: [PATCH 118/257] inpcom.c, cleanup deck loops #1/4 --- src/frontend/inpcom.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 7b7c72324..4d141e3a0 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -733,7 +733,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* get end card as last card in list; end card pntr does not appear to always be correct at this point */ - for (newcard = working; newcard != NULL; newcard = newcard->li_next) + for (newcard = working; newcard; newcard = newcard->li_next) end = newcard; inp_reorder_params(working, cc, end); @@ -764,7 +764,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile of parameter substitutions in a line*/ dynmaxline = 0; max_line_length = 0; - for (tmp_ptr1 = cc; tmp_ptr1 != NULL; tmp_ptr1 = tmp_ptr1->li_next) { + for (tmp_ptr1 = cc; tmp_ptr1; tmp_ptr1 = tmp_ptr1->li_next) { char *s; unsigned int braces_per_line = 0; /* count number of lines */ @@ -927,7 +927,7 @@ inp_fix_gnd_name(struct line *deck) struct line *c = deck; char *gnd; - while (c != NULL) { + while (c) { gnd = c->li_line; // if there is a comment or no gnd, go to next line if ((*gnd == '*') || (strstr(gnd, "gnd") == NULL)) { @@ -970,7 +970,7 @@ inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) int skip_control = 0; struct line *c; - for (c = deck; c != NULL; c = c->li_next) { + for (c = deck; c; c = c->li_next) { char *line = c->li_line; /* there is no e source inside .control ... .endc */ @@ -1090,7 +1090,7 @@ inp_add_control_section(struct line *deck, int *line_number) bool found_end = FALSE; char *op_line = NULL, rawfile[1000], *line; - for (c = deck; c != NULL; c = c->li_next) { + for (c = deck; c; c = c->li_next) { if (*c->li_line == '*') continue; if (ciprefix(".op ", c->li_line)) { @@ -1198,7 +1198,7 @@ inp_fix_macro_param_func_paren_io(struct line *begin_card) char *str_ptr, *new_str; bool is_func = FALSE; - for (card = begin_card; card != NULL; card = card->li_next) { + for (card = begin_card; card; card = card->li_next) { if (*card->li_line == '*') continue; @@ -1359,7 +1359,7 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, bool found_subckt = FALSE, have_subckt = FALSE, found_model = FALSE; int i, num_terminals = 0, tmp_cnt = 0; - for (card = start_card; card != NULL; card = card->li_next) { + for (card = start_card; card; card = card->li_next) { line = card->li_line; if (*line == '*') @@ -1487,7 +1487,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) used_subckt_names = TMALLOC(char*, no_of_lines); used_model_names = TMALLOC(char*, no_of_lines); - for (card = start_card; card != NULL; card = card->li_next) { + for (card = start_card; card; card = card->li_next) { if (ciprefix(".model", card->li_line)) has_models = TRUE; if (ciprefix(".cmodel", card->li_line)) @@ -1496,7 +1496,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) *card->li_line = '*'; } - for (card = start_card; card != NULL; card = card->li_next) { + for (card = start_card; card; card = card->li_next) { line = card->li_line; if (*line == '*') @@ -1587,7 +1587,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) used_model_names, &num_used_model_names, has_models); /* comment out any unused subckts, currently only at top level */ - for (card = start_card; card != NULL; card = card->li_next) { + for (card = start_card; card; card = card->li_next) { line = card->li_line; if (*line == '*') @@ -1827,7 +1827,7 @@ inp_fix_ternary_operator(struct line *start_card) char *line; bool found_control = FALSE; - for (card = start_card; card != NULL; card = card->li_next) { + for (card = start_card; card; card = card->li_next) { line = card->li_line; /* exclude replacement of ternary function between .control and .endc */ @@ -1888,7 +1888,7 @@ static void inp_stripcomments_deck(struct line *deck) { struct line *c = deck; - while (c != NULL) { + while (c) { inp_stripcomments_line(c->li_line); c = c->li_next; } @@ -2242,7 +2242,7 @@ inp_fix_for_numparam(struct line *deck) struct line *c = deck; char *str_ptr; - while (c != NULL) { + while (c) { if (ciprefix(".lib", c->li_line) || ciprefix("*lib", c->li_line) || ciprefix("*inc", c->li_line)) { c = c->li_next; continue; @@ -2281,7 +2281,7 @@ inp_remove_excess_ws(struct line *deck) { struct line *c = deck; bool found_control = FALSE; - while (c != NULL) { + while (c) { if (*c->li_line == '*') { c = c->li_next; continue; @@ -2581,7 +2581,7 @@ inp_fix_subckt_multiplier(struct line *subckt_card, subckt_card->li_line = new_str; for (card = subckt_card->li_next; - card != NULL && !ciprefix(".ends", card->li_line); + card && !ciprefix(".ends", card->li_line); card = card->li_next) { /* no 'm' for B, V, E, H or comment line */ if ((*(card->li_line) == '*') || (*(card->li_line) == 'b') || (*(card->li_line) == 'v') || @@ -2623,7 +2623,7 @@ inp_fix_inst_calls_for_numparam(struct line *deck) // first iterate through instances and find occurences where 'm' multiplier needs to be // added to the subcircuit -- subsequent instances will then need this parameter as well - for (c = deck; c != NULL; c = c->li_next) { + for (c = deck; c; c = c->li_next) { inst_line = c->li_line; if (*inst_line == '*') @@ -2637,7 +2637,7 @@ inp_fix_inst_calls_for_numparam(struct line *deck) flag = FALSE; // iterate through the deck to find the subckt (last one defined wins) d = deck; - while (d != NULL) { + while (d) { subckt_line = d->li_line; if (ciprefix(".subckt", subckt_line)) { subckt_line = skip_non_ws(subckt_line); @@ -3169,7 +3169,7 @@ inp_fix_param_values(struct line *deck) wordlist *nwl; int parens; - while (c != NULL) { + while (c) { line = c->li_line; if (*line == '*' || (ciprefix(".param", line) && strchr(line, '{'))) { @@ -3623,7 +3623,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car /* determine the number of lines with .param */ ptr = start_card; - while (ptr != NULL) { + while (ptr) { if (strchr(ptr->li_line, '=')) num_params++; ptr = ptr->li_next; @@ -3649,7 +3649,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car ptr_array_ordered = TMALLOC(struct line *, arr_size); ptr = start_card; - while (ptr != NULL) { + while (ptr) { // ignore .param lines without '=' if (strchr(ptr->li_line, '=')) { depends_on[num_params][0] = NULL; From 1d26f710751f81652cdfa12d376292a4103c5626 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 19:16:16 +0200 Subject: [PATCH 119/257] inpcom.c, cleanup deck loops #2/4 --- src/frontend/inpcom.c | 46 +++++++++++++------------------------------ 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 4d141e3a0..eff09b9b5 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -927,11 +927,10 @@ inp_fix_gnd_name(struct line *deck) struct line *c = deck; char *gnd; - while (c) { + for (; c; c = c->li_next) { gnd = c->li_line; // if there is a comment or no gnd, go to next line if ((*gnd == '*') || (strstr(gnd, "gnd") == NULL)) { - c = c->li_next; continue; } // replace "?gnd?" by "? 0 ?", ? being a ' ' ',' '(' ')'. @@ -944,7 +943,6 @@ inp_fix_gnd_name(struct line *deck) } // now remove the extra white spaces around 0 c->li_line = inp_remove_ws(c->li_line); - c = c->li_next; } } @@ -1888,9 +1886,8 @@ static void inp_stripcomments_deck(struct line *deck) { struct line *c = deck; - while (c) { + for (; c; c = c->li_next) { inp_stripcomments_line(c->li_line); - c = c->li_next; } } @@ -2242,9 +2239,8 @@ inp_fix_for_numparam(struct line *deck) struct line *c = deck; char *str_ptr; - while (c) { + for (; c; c = c->li_next) { if (ciprefix(".lib", c->li_line) || ciprefix("*lib", c->li_line) || ciprefix("*inc", c->li_line)) { - c = c->li_next; continue; } @@ -2254,7 +2250,6 @@ inp_fix_for_numparam(struct line *deck) if (ciprefix(".endc", c->li_line)) found_control = FALSE; if (found_control) { - c = c->li_next; continue; } @@ -2271,7 +2266,6 @@ inp_fix_for_numparam(struct line *deck) if (ciprefix(".subckt", c->li_line)) c->li_line = inp_fix_subckt(c->li_line); - c = c->li_next; } } @@ -2281,9 +2275,8 @@ inp_remove_excess_ws(struct line *deck) { struct line *c = deck; bool found_control = FALSE; - while (c) { + for (; c; c = c->li_next) { if (*c->li_line == '*') { - c = c->li_next; continue; } @@ -2293,11 +2286,9 @@ inp_remove_excess_ws(struct line *deck) if (ciprefix(".endc", c->li_line)) found_control = FALSE; if ((found_control) && (ciprefix("echo", c->li_line))) { - c = c->li_next; continue; } c->li_line = inp_remove_ws(c->li_line); /* freed in fcn */ - c = c->li_next; } } @@ -2636,8 +2627,7 @@ inp_fix_inst_calls_for_numparam(struct line *deck) if (found_mult_param(num_inst_params, inst_param_names)) { flag = FALSE; // iterate through the deck to find the subckt (last one defined wins) - d = deck; - while (d) { + for (d = deck; d; d = d->li_next) { subckt_line = d->li_line; if (ciprefix(".subckt", subckt_line)) { subckt_line = skip_non_ws(subckt_line); @@ -2649,7 +2639,6 @@ inp_fix_inst_calls_for_numparam(struct line *deck) flag = TRUE; } } - d = d->li_next; } if (flag) { num_subckt_params = inp_get_params(p->li_line, subckt_param_names, subckt_param_values); @@ -3169,34 +3158,34 @@ inp_fix_param_values(struct line *deck) wordlist *nwl; int parens; - while (c) { + for (; c; c = c->li_next) { line = c->li_line; if (*line == '*' || (ciprefix(".param", line) && strchr(line, '{'))) { - c = c->li_next; continue; } if (ciprefix(".control", line)) { control_section = TRUE; - c = c->li_next; continue; } if (ciprefix(".endc", line)) { control_section = FALSE; - c = c->li_next; continue; } + + /* no handling of params in "option" lines */ if (control_section || ciprefix(".option", line)) { - c = c->li_next; /* no handling of params in "option" lines */ continue; } + + /* no handling of params in "set" lines */ if (ciprefix("set", line)) { - c = c->li_next; /* no handling of params in "set" lines */ continue; } + + /* no handling of params in B source lines */ if (*line == 'b') { - c = c->li_next; /* no handling of params in B source lines */ continue; } @@ -3208,7 +3197,6 @@ inp_fix_param_values(struct line *deck) *(++line) = 'e'; *(++line) = 'l'; *(++line) = ' '; - c = c->li_next; continue; } @@ -3216,12 +3204,10 @@ inp_fix_param_values(struct line *deck) if (ciprefix(".model", line) && (strstr(line, "numos") || strstr(line, "numd") || strstr(line, "nbjt") || strstr(line, "nbjt2") || strstr(line, "numd2"))) { - c = c->li_next; continue; } /* exclude CIDER devices with ic.file parameter */ if (strstr(line, "ic.file")) { - c = c->li_next; continue; } @@ -3406,7 +3392,6 @@ inp_fix_param_values(struct line *deck) tfree(old_str); } } - c = c->li_next; } } @@ -3622,11 +3607,9 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car return; /* determine the number of lines with .param */ - ptr = start_card; - while (ptr) { + for (ptr = start_card; ptr; ptr = ptr->li_next) { if (strchr(ptr->li_line, '=')) num_params++; - ptr = ptr->li_next; } arr_size = num_params; @@ -3649,7 +3632,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car ptr_array_ordered = TMALLOC(struct line *, arr_size); ptr = start_card; - while (ptr) { + for (ptr = start_card; ptr; ptr = ptr->li_next) { // ignore .param lines without '=' if (strchr(ptr->li_line, '=')) { depends_on[num_params][0] = NULL; @@ -3659,7 +3642,6 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car ptr_array[num_params++] = ptr; } - ptr = ptr->li_next; } // look for duplicately defined parameters and mark earlier one to skip // param list is ordered as defined in netlist From 3ee0374c0f7c2aa33028a1e232d530142ac223ad Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 19:20:45 +0200 Subject: [PATCH 120/257] inpcom.c, cleanup deck loops #3/4 --- src/frontend/inpcom.c | 53 +++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index eff09b9b5..1e7577d57 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -922,9 +922,8 @@ readline(FILE *fd) /* replace "gnd" by " 0 " Delimiters of gnd may be ' ' or ',' or '(' or ')' */ static void -inp_fix_gnd_name(struct line *deck) +inp_fix_gnd_name(struct line *c) { - struct line *c = deck; char *gnd; for (; c; c = c->li_next) { @@ -963,12 +962,11 @@ create_new_card(char *card_str, int *line_number) { static void -inp_chk_for_multi_in_vcvs(struct line *deck, int *line_number) +inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) { int skip_control = 0; - struct line *c; - for (c = deck; c; c = c->li_next) { + for (; c; c = c->li_next) { char *line = c->li_line; /* there is no e source inside .control ... .endc */ @@ -1190,13 +1188,12 @@ chk_for_line_continuation(char *line) // .param func1(x,y) = {x*y} --> .func func1(x,y) {x*y} static void -inp_fix_macro_param_func_paren_io(struct line *begin_card) +inp_fix_macro_param_func_paren_io(struct line *card) { - struct line *card; char *str_ptr, *new_str; bool is_func = FALSE; - for (card = begin_card; card; card = card->li_next) { + for (; card; card = card->li_next) { if (*card->li_line == '*') continue; @@ -1819,13 +1816,12 @@ inp_fix_ternary_operator_str(char *line, bool all) static void -inp_fix_ternary_operator(struct line *start_card) +inp_fix_ternary_operator(struct line *card) { - struct line *card; char *line; bool found_control = FALSE; - for (card = start_card; card; card = card->li_next) { + for (; card; card = card->li_next) { line = card->li_line; /* exclude replacement of ternary function between .control and .endc */ @@ -1883,9 +1879,8 @@ inp_casefix(char *string) /* Strip all end-of-line comments from a deck */ static void -inp_stripcomments_deck(struct line *deck) +inp_stripcomments_deck(struct line *c) { - struct line *c = deck; for (; c; c = c->li_next) { inp_stripcomments_line(c->li_line); } @@ -2233,10 +2228,9 @@ inp_remove_ws(char *s) No changes to lines in .control section ! */ static void -inp_fix_for_numparam(struct line *deck) +inp_fix_for_numparam(struct line *c) { bool found_control = FALSE; - struct line *c = deck; char *str_ptr; for (; c; c = c->li_next) { @@ -2271,9 +2265,8 @@ inp_fix_for_numparam(struct line *deck) static void -inp_remove_excess_ws(struct line *deck) +inp_remove_excess_ws(struct line *c) { - struct line *c = deck; bool found_control = FALSE; for (; c; c = c->li_next) { if (*c->li_line == '*') { @@ -2302,11 +2295,10 @@ inp_remove_excess_ws(struct line *deck) */ static void -expand_section_references(struct line *deck, int call_depth, char *dir_name) +expand_section_references(struct line *c, int call_depth, char *dir_name) { - struct line *c; - for (c = deck; c; c = c->li_next) { + for (; c; c = c->li_next) { char *line = c->li_line; @@ -4142,7 +4134,7 @@ inp_split_multi_param_lines(struct line *deck, int line_num) */ static void -inp_compat(struct line *deck) +inp_compat(struct line *card) { char *str_ptr, *cut_line, *title_tok, *node1, *node2; char *out_ptr, *exp_ptr, *beg_ptr, *end_ptr, *copy_ptr, *del_ptr; @@ -4152,13 +4144,12 @@ inp_compat(struct line *deck) struct line *new_line, *tmp_ptr; struct line *param_end = NULL, *param_beg = NULL; - struct line *card; int skip_control = 0; char *equation, *tc1_ptr = NULL, *tc2_ptr = NULL; double tc1 = 0.0, tc2 = 0.0; - for (card = deck; card; card = card->li_next) { + for (; card; card = card->li_next) { char *curr_line = card->li_line; @@ -5243,18 +5234,18 @@ replace_token(char *string, char *token, int wherereplace, int total) */ static void -inp_bsource_compat(struct line *deck) +inp_bsource_compat(struct line *card) { char *equal_ptr, *str_ptr, *tmp_char, *new_str, *final_str; char actchar; - struct line *card, *new_line, *tmp_ptr; + struct line *new_line, *tmp_ptr; wordlist *wl = NULL, *wlist = NULL; char buf[512]; size_t i, xlen, ustate = 0; int skip_control = 0; int error1; - for (card = deck; card; card = card->li_next) { + for (; card; card = card->li_next) { char *curr_line = card->li_line; @@ -5682,12 +5673,11 @@ inp_add_series_resistor(struct line *deck) #ifndef XSPICE static void -inp_poly_err(struct line *deck) +inp_poly_err(struct line *card) { - struct line *card; size_t skip_control = 0; - for (card = deck; card; card = card->li_next) { + for (; card; card = card->li_next) { char *curr_line = card->li_line; if (*curr_line == '*') continue; @@ -5721,12 +5711,11 @@ inp_poly_err(struct line *deck) } #endif static void -tprint(struct line *deck) +tprint(struct line *t) { /*debug: print into file*/ FILE *fd = fopen("tprint-out.txt", "w"); - struct line *t; - for (t = deck; t; t = t->li_next) + for (; t; t = t->li_next) fprintf(fd, "%d %d %s\n", t->li_linenum_orig, t->li_linenum, t->li_line); fclose(fd); } From cf734f60ac7aae9d2f6cfa7fe4d04e14f04e006d Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 19:20:54 +0200 Subject: [PATCH 121/257] inpcom.c, cleanup deck loops #4/4 --- src/frontend/inpcom.c | 49 +++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 1e7577d57..284f77b6d 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -929,9 +929,9 @@ inp_fix_gnd_name(struct line *c) for (; c; c = c->li_next) { gnd = c->li_line; // if there is a comment or no gnd, go to next line - if ((*gnd == '*') || (strstr(gnd, "gnd") == NULL)) { + if ((*gnd == '*') || (strstr(gnd, "gnd") == NULL)) continue; - } + // replace "?gnd?" by "? 0 ?", ? being a ' ' ',' '(' ')'. while ((gnd = strstr(gnd, "gnd")) != NULL) { if ((isspace(gnd[-1]) || gnd[-1] == '(' || gnd[-1] == ',') && @@ -1881,9 +1881,8 @@ inp_casefix(char *string) static void inp_stripcomments_deck(struct line *c) { - for (; c; c = c->li_next) { + for (; c; c = c->li_next) inp_stripcomments_line(c->li_line); - } } @@ -2234,18 +2233,16 @@ inp_fix_for_numparam(struct line *c) char *str_ptr; for (; c; c = c->li_next) { - if (ciprefix(".lib", c->li_line) || ciprefix("*lib", c->li_line) || ciprefix("*inc", c->li_line)) { + if (ciprefix(".lib", c->li_line) || ciprefix("*lib", c->li_line) || ciprefix("*inc", c->li_line)) continue; - } /* exclude lines between .control and .endc from getting quotes changed */ if (ciprefix(".control", c->li_line)) found_control = TRUE; if (ciprefix(".endc", c->li_line)) found_control = FALSE; - if (found_control) { + if (found_control) continue; - } inp_change_quotes(c->li_line); @@ -2259,7 +2256,6 @@ inp_fix_for_numparam(struct line *c) if (ciprefix(".subckt", c->li_line)) c->li_line = inp_fix_subckt(c->li_line); - } } @@ -2269,18 +2265,17 @@ inp_remove_excess_ws(struct line *c) { bool found_control = FALSE; for (; c; c = c->li_next) { - if (*c->li_line == '*') { + if (*c->li_line == '*') continue; - } /* exclude echo lines between .control and .endc from removing white spaces */ if (ciprefix(".control", c->li_line)) found_control = TRUE; if (ciprefix(".endc", c->li_line)) found_control = FALSE; - if ((found_control) && (ciprefix("echo", c->li_line))) { + if ((found_control) && (ciprefix("echo", c->li_line))) continue; - } + c->li_line = inp_remove_ws(c->li_line); /* freed in fcn */ } } @@ -2297,7 +2292,6 @@ inp_remove_excess_ws(struct line *c) static void expand_section_references(struct line *c, int call_depth, char *dir_name) { - for (; c; c = c->li_next) { char *line = c->li_line; @@ -3153,9 +3147,8 @@ inp_fix_param_values(struct line *deck) for (; c; c = c->li_next) { line = c->li_line; - if (*line == '*' || (ciprefix(".param", line) && strchr(line, '{'))) { + if (*line == '*' || (ciprefix(".param", line) && strchr(line, '{'))) continue; - } if (ciprefix(".control", line)) { control_section = TRUE; @@ -3167,19 +3160,16 @@ inp_fix_param_values(struct line *deck) } /* no handling of params in "option" lines */ - if (control_section || ciprefix(".option", line)) { + if (control_section || ciprefix(".option", line)) continue; - } /* no handling of params in "set" lines */ - if (ciprefix("set", line)) { + if (ciprefix("set", line)) continue; - } /* no handling of params in B source lines */ - if (*line == 'b') { + if (*line == 'b') continue; - } /* for xspice .cmodel: replace .cmodel with .model and skip entire line) */ if (ciprefix(".cmodel", line)) { @@ -3195,13 +3185,14 @@ inp_fix_param_values(struct line *deck) /* exclude CIDER models */ if (ciprefix(".model", line) && (strstr(line, "numos") || strstr(line, "numd") || strstr(line, "nbjt") || strstr(line, "nbjt2") || - strstr(line, "numd2"))) { + strstr(line, "numd2"))) + { continue; } + /* exclude CIDER devices with ic.file parameter */ - if (strstr(line, "ic.file")) { + if (strstr(line, "ic.file")) continue; - } while ((equal_ptr = strchr(line, '=')) != NULL) { @@ -3599,10 +3590,9 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car return; /* determine the number of lines with .param */ - for (ptr = start_card; ptr; ptr = ptr->li_next) { + for (ptr = start_card; ptr; ptr = ptr->li_next) if (strchr(ptr->li_line, '=')) num_params++; - } arr_size = num_params; num_params = 0; /* This is just to keep the code in row 2907ff. */ @@ -3624,7 +3614,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car ptr_array_ordered = TMALLOC(struct line *, arr_size); ptr = start_card; - for (ptr = start_card; ptr; ptr = ptr->li_next) { + for (ptr = start_card; ptr; ptr = ptr->li_next) // ignore .param lines without '=' if (strchr(ptr->li_line, '=')) { depends_on[num_params][0] = NULL; @@ -3634,7 +3624,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car ptr_array[num_params++] = ptr; } - } + // look for duplicately defined parameters and mark earlier one to skip // param list is ordered as defined in netlist for (i = 0; i < num_params; i++) @@ -5675,7 +5665,6 @@ inp_add_series_resistor(struct line *deck) static void inp_poly_err(struct line *card) { - size_t skip_control = 0; for (; card; card = card->li_next) { char *curr_line = card->li_line; From a2d0d8031f719d38fec4bee6ba2fdda63c00b114 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 26 May 2013 21:18:51 +0200 Subject: [PATCH 122/257] indentation --- src/spicelib/parser/inpptree.c | 882 ++++++++++++++++----------------- src/spicelib/parser/ptfuncs.c | 52 +- 2 files changed, 467 insertions(+), 467 deletions(-) diff --git a/src/spicelib/parser/inpptree.c b/src/spicelib/parser/inpptree.c index 110036bdc..0e1af9648 100644 --- a/src/spicelib/parser/inpptree.c +++ b/src/spicelib/parser/inpptree.c @@ -1,6 +1,6 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group +Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group **********/ //#define TRACE @@ -15,11 +15,11 @@ extern void controlled_exit(int status); static INPparseNode *mkcon(double value); static INPparseNode *mkb(int type, INPparseNode * left, - INPparseNode * right); + INPparseNode * right); static INPparseNode *mkf(int type, INPparseNode * arg); static int PTcheck(INPparseNode * p); static INPparseNode *mkbnode(const char *opstr, INPparseNode * arg1, - INPparseNode * arg2); + INPparseNode * arg2); static INPparseNode *mkfnode(const char *fname, INPparseNode * arg); static INPparseNode *mkvnode(char *name); static INPparseNode *mkinode(char *name); @@ -108,7 +108,7 @@ static INPtables *tables; # define __func__ __FUNCTION__ /* __func__ is C99, but MSC can't */ #endif -extern IFsimulator *ft_sim; /* XXX */ +extern IFsimulator *ft_sim; /* XXX */ /* Some tables that the parser uses. */ @@ -212,8 +212,8 @@ INPgetTree(char **line, INPparseTree ** pt, CKTcircuit *ckt, INPtables * tab) if (rv || !p || !PTcheck(p)) { - *pt = NULL; - release_tree(p); + *pt = NULL; + release_tree(p); } else { @@ -258,248 +258,248 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum) case PT_TEMPERATURE: case PT_FREQUENCY: case PT_CONSTANT: - newp = mkcon(0.0); - break; + newp = mkcon(0.0); + break; case PT_VAR: - /* Is this the variable we're differentiating wrt? */ - if (p->valueIndex == varnum) - newp = mkcon(1.0); - else - newp = mkcon(0.0); - break; + /* Is this the variable we're differentiating wrt? */ + if (p->valueIndex == varnum) + newp = mkcon(1.0); + else + newp = mkcon(0.0); + break; case PT_PLUS: case PT_MINUS: - arg1 = PTdifferentiate(p->left, varnum); - arg2 = PTdifferentiate(p->right, varnum); - newp = mkb(p->type, arg1, arg2); - break; + arg1 = PTdifferentiate(p->left, varnum); + arg2 = PTdifferentiate(p->right, varnum); + newp = mkb(p->type, arg1, arg2); + break; case PT_TIMES: - /* d(a * b) = d(a) * b + d(b) * a */ - arg1 = PTdifferentiate(p->left, varnum); - arg2 = PTdifferentiate(p->right, varnum); + /* d(a * b) = d(a) * b + d(b) * a */ + arg1 = PTdifferentiate(p->left, varnum); + arg2 = PTdifferentiate(p->right, varnum); - newp = mkb(PT_PLUS, mkb(PT_TIMES, arg1, p->right), - mkb(PT_TIMES, p->left, arg2)); - break; + newp = mkb(PT_PLUS, mkb(PT_TIMES, arg1, p->right), + mkb(PT_TIMES, p->left, arg2)); + break; case PT_DIVIDE: - /* d(a / b) = (d(a) * b - d(b) * a) / b^2 */ - arg1 = PTdifferentiate(p->left, varnum); - arg2 = PTdifferentiate(p->right, varnum); + /* d(a / b) = (d(a) * b - d(b) * a) / b^2 */ + arg1 = PTdifferentiate(p->left, varnum); + arg2 = PTdifferentiate(p->right, varnum); - newp = mkb(PT_DIVIDE, mkb(PT_MINUS, mkb(PT_TIMES, arg1, - p->right), mkb(PT_TIMES, - p->left, - arg2)), - mkb(PT_POWER, p->right, mkcon(2.0))); - break; + newp = mkb(PT_DIVIDE, mkb(PT_MINUS, mkb(PT_TIMES, arg1, + p->right), mkb(PT_TIMES, + p->left, + arg2)), + mkb(PT_POWER, p->right, mkcon(2.0))); + break; case PT_POWER: - if (p->right->type == PT_CONSTANT) { - /* - * D(f^C) = C * f^(C-1) * D(f) - */ - arg1 = PTdifferentiate(p->left, varnum); + if (p->right->type == PT_CONSTANT) { + /* + * D(f^C) = C * f^(C-1) * D(f) + */ + arg1 = PTdifferentiate(p->left, varnum); + + newp = mkb(PT_TIMES, mkb(PT_TIMES, + mkcon(p->right->constant), + mkb(PT_POWER, p->left, + mkcon(p->right->constant - 1))), + arg1); + } else { + /* + * D(f^g) = D(exp(g*ln(f))) + * = exp(g*ln(f)) * D(g*ln(f)) + * = exp(g*ln(f)) * (D(g)*ln(f) + g*D(f)/f) + */ + arg1 = PTdifferentiate(p->left, varnum); + arg2 = PTdifferentiate(p->right, varnum); + newp = mkb(PT_TIMES, mkf(PTF_EXP, mkb(PT_TIMES, + p->right, mkf(PTF_LN, + p->left))), + mkb(PT_PLUS, + mkb(PT_TIMES, p->right, + mkb(PT_DIVIDE, arg1, p->left)), + mkb(PT_TIMES, arg2, mkf(PTF_LN, p->left)))); + } + break; - newp = mkb(PT_TIMES, mkb(PT_TIMES, - mkcon(p->right->constant), - mkb(PT_POWER, p->left, - mkcon(p->right->constant - 1))), - arg1); - } else { - /* - * D(f^g) = D(exp(g*ln(f))) - * = exp(g*ln(f)) * D(g*ln(f)) - * = exp(g*ln(f)) * (D(g)*ln(f) + g*D(f)/f) - */ - arg1 = PTdifferentiate(p->left, varnum); - arg2 = PTdifferentiate(p->right, varnum); - newp = mkb(PT_TIMES, mkf(PTF_EXP, mkb(PT_TIMES, - p->right, mkf(PTF_LN, - p->left))), - mkb(PT_PLUS, - mkb(PT_TIMES, p->right, - mkb(PT_DIVIDE, arg1, p->left)), - mkb(PT_TIMES, arg2, mkf(PTF_LN, p->left)))); - } - break; - case PT_TERN: /* ternary_fcn(cond,exp1,exp2) */ // naive: // d/d ternary_fcn(cond,exp1,exp2) --> ternary_fcn(cond, d/d exp1, d/d exp2) { - INPparseNode *arg1 = p->left; - INPparseNode *arg2 = p->right->left; - INPparseNode *arg3 = p->right->right; + INPparseNode *arg1 = p->left; + INPparseNode *arg2 = p->right->left; + INPparseNode *arg3 = p->right->right; -// extern void printTree(INPparseNode *); +// extern void printTree(INPparseNode *); // -// printf("debug: %s, PT_TERN: ", __func__); -// printTree(p); -// printf("\n"); +// printf("debug: %s, PT_TERN: ", __func__); +// printTree(p); +// printf("\n"); - newp = mkb(PT_TERN, arg1, mkb(PT_COMMA, - PTdifferentiate(arg2, varnum), - PTdifferentiate(arg3, varnum))); + newp = mkb(PT_TERN, arg1, mkb(PT_COMMA, + PTdifferentiate(arg2, varnum), + PTdifferentiate(arg3, varnum))); -// printf("debug, %s, returns; ", __func__); -// printTree(newp); -// printf("\n"); +// printf("debug, %s, returns; ", __func__); +// printTree(newp); +// printf("\n"); - return mkfirst(newp, p); + return mkfirst(newp, p); } case PT_FUNCTION: - /* Many cases. Set arg1 to the derivative of the function, - * and arg2 to the derivative of the argument. - */ - switch (p->funcnum) { - case PTF_ABS: /* sgn(u) */ - arg1 = mkf(PTF_SGN, p->left); - break; + /* Many cases. Set arg1 to the derivative of the function, + * and arg2 to the derivative of the argument. + */ + switch (p->funcnum) { + case PTF_ABS: /* sgn(u) */ + arg1 = mkf(PTF_SGN, p->left); + break; - case PTF_SGN: - arg1 = mkcon(0.0); - break; + case PTF_SGN: + arg1 = mkcon(0.0); + break; - case PTF_ACOS: /* - 1 / sqrt(1 - u^2) */ - arg1 = mkb(PT_DIVIDE, mkcon(-1.0), mkf(PTF_SQRT, - mkb(PT_MINUS, - mkcon(1.0), - mkb(PT_POWER, - p->left, - mkcon(2.0))))); - break; + case PTF_ACOS: /* - 1 / sqrt(1 - u^2) */ + arg1 = mkb(PT_DIVIDE, mkcon(-1.0), mkf(PTF_SQRT, + mkb(PT_MINUS, + mkcon(1.0), + mkb(PT_POWER, + p->left, + mkcon(2.0))))); + break; - case PTF_ACOSH: /* 1 / sqrt(u^2 - 1) */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkf(PTF_SQRT, - mkb(PT_MINUS, - mkb(PT_POWER, - p->left, - mkcon(2.0)), - mkcon(1.0)))); + case PTF_ACOSH: /* 1 / sqrt(u^2 - 1) */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkf(PTF_SQRT, + mkb(PT_MINUS, + mkb(PT_POWER, + p->left, + mkcon(2.0)), + mkcon(1.0)))); - break; + break; - case PTF_ASIN: /* 1 / sqrt(1 - u^2) */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkf(PTF_SQRT, - mkb(PT_MINUS, - mkcon(1.0), - mkb(PT_POWER, - p->left, - mkcon(2.0))))); - break; + case PTF_ASIN: /* 1 / sqrt(1 - u^2) */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkf(PTF_SQRT, + mkb(PT_MINUS, + mkcon(1.0), + mkb(PT_POWER, + p->left, + mkcon(2.0))))); + break; - case PTF_ASINH: /* 1 / sqrt(u^2 + 1) */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkf(PTF_SQRT, - mkb(PT_PLUS, - mkb(PT_POWER, - p->left, - mkcon(2.0)), - mkcon(1.0)))); - break; + case PTF_ASINH: /* 1 / sqrt(u^2 + 1) */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkf(PTF_SQRT, + mkb(PT_PLUS, + mkb(PT_POWER, + p->left, + mkcon(2.0)), + mkcon(1.0)))); + break; - case PTF_ATAN: /* 1 / (1 + u^2) */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_PLUS, - mkb(PT_POWER, - p->left, - mkcon(2.0)), - mkcon(1.0))); - break; + case PTF_ATAN: /* 1 / (1 + u^2) */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_PLUS, + mkb(PT_POWER, + p->left, + mkcon(2.0)), + mkcon(1.0))); + break; - case PTF_ATANH: /* 1 / (1 - u^2) */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_MINUS, - mkcon(1.0), - mkb(PT_POWER, - p->left, - mkcon(2.0)))); - break; + case PTF_ATANH: /* 1 / (1 - u^2) */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_MINUS, + mkcon(1.0), + mkb(PT_POWER, + p->left, + mkcon(2.0)))); + break; - case PTF_COS: /* - sin(u) */ - arg1 = mkf(PTF_UMINUS, mkf(PTF_SIN, p->left)); - break; + case PTF_COS: /* - sin(u) */ + arg1 = mkf(PTF_UMINUS, mkf(PTF_SIN, p->left)); + break; - case PTF_COSH: /* sinh(u) */ - arg1 = mkf(PTF_SINH, p->left); - break; + case PTF_COSH: /* sinh(u) */ + arg1 = mkf(PTF_SINH, p->left); + break; - case PTF_EXP: /* exp(u) */ - arg1 = mkf(PTF_EXP, p->left); - break; + case PTF_EXP: /* exp(u) */ + arg1 = mkf(PTF_EXP, p->left); + break; - case PTF_LN: /* 1 / u */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), p->left); - break; + case PTF_LN: /* 1 / u */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), p->left); + break; - case PTF_LOG: /* log(e) / u */ - arg1 = mkb(PT_DIVIDE, mkcon(M_LOG10E), p->left); - break; + case PTF_LOG: /* log(e) / u */ + arg1 = mkb(PT_DIVIDE, mkcon(M_LOG10E), p->left); + break; - case PTF_SIN: /* cos(u) */ - arg1 = mkf(PTF_COS, p->left); - break; + case PTF_SIN: /* cos(u) */ + arg1 = mkf(PTF_COS, p->left); + break; - case PTF_SINH: /* cosh(u) */ - arg1 = mkf(PTF_COSH, p->left); - break; + case PTF_SINH: /* cosh(u) */ + arg1 = mkf(PTF_COSH, p->left); + break; - case PTF_SQRT: /* 1 / (2 * sqrt(u)) */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_TIMES, - mkcon(2.0), - mkf(PTF_SQRT, - p->left))); - break; + case PTF_SQRT: /* 1 / (2 * sqrt(u)) */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_TIMES, + mkcon(2.0), + mkf(PTF_SQRT, + p->left))); + break; - case PTF_TAN: /* 1 / (cos(u) ^ 2) */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_POWER, - mkf(PTF_COS, - p->left), - mkcon(2.0))); - break; + case PTF_TAN: /* 1 / (cos(u) ^ 2) */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_POWER, + mkf(PTF_COS, + p->left), + mkcon(2.0))); + break; - case PTF_TANH: /* 1 / (cosh(u) ^ 2) */ - arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_POWER, - mkf(PTF_COSH, - p->left), - mkcon(2.0))); - break; + case PTF_TANH: /* 1 / (cosh(u) ^ 2) */ + arg1 = mkb(PT_DIVIDE, mkcon(1.0), mkb(PT_POWER, + mkf(PTF_COSH, + p->left), + mkcon(2.0))); + break; - case PTF_USTEP: - case PTF_EQ0: - case PTF_NE0: - case PTF_GT0: - case PTF_LT0: - case PTF_GE0: - case PTF_LE0: - arg1 = mkcon(0.0); - break; + case PTF_USTEP: + case PTF_EQ0: + case PTF_NE0: + case PTF_GT0: + case PTF_LT0: + case PTF_GE0: + case PTF_LE0: + arg1 = mkcon(0.0); + break; - case PTF_URAMP: - arg1 = mkf(PTF_USTEP, p->left); - break; + case PTF_URAMP: + arg1 = mkf(PTF_USTEP, p->left); + break; - case PTF_FLOOR: /* naive: D(floor(u)) = 0 */ - arg1 = mkcon(0.0); - break; + case PTF_FLOOR: /* naive: D(floor(u)) = 0 */ + arg1 = mkcon(0.0); + break; - case PTF_CEIL: /* naive: D(ceil(u)) = 0 */ - arg1 = mkcon(0.0); - break; + case PTF_CEIL: /* naive: D(ceil(u)) = 0 */ + arg1 = mkcon(0.0); + break; - /* MW. PTF_CIF for new cif function */ - case PTF_USTEP2: /* ustep2=uramp(x)-uramp(x-1) ustep2'=ustep(x)-ustep(x-1) */ + /* MW. PTF_CIF for new cif function */ + case PTF_USTEP2: /* ustep2=uramp(x)-uramp(x-1) ustep2'=ustep(x)-ustep(x-1) */ arg1 = mkb(PT_MINUS, mkf(PTF_USTEP, p->left), mkf(PTF_USTEP, mkb(PT_MINUS, p->left, mkcon(1.0)))); - break; - + break; + case PTF_UMINUS: /* - 1 ; like a constant (was 0 !) */ arg1 = mkcon(-1.0); break; @@ -513,8 +513,8 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum) arg1 = mkcon(0.0); break; - case PTF_MIN: - case PTF_MAX: + case PTF_MIN: + case PTF_MAX: /* min(a,b) --> (a ((a-b) < 0) ? a : b */ @@ -554,55 +554,55 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum) { /* pow(a,b) - p->left: ',' p->left->left: a p->left->right: b + p->left: ',' p->left->left: a p->left->right: b */ if (p->left->right->type == PT_CONSTANT) { - /* - * D(f^C) = C * f^(C-1) * D(f) - */ + /* + * D(f^C) = C * f^(C-1) * D(f) + */ arg1 = PTdifferentiate(p->left->left, varnum); newp = mkb(PT_TIMES, mkb(PT_TIMES, - mkcon(p->left->right->constant), - mkb(PT_POWER, p->left->left, - mkcon(p->left->right->constant - 1))), - arg1); + mkcon(p->left->right->constant), + mkb(PT_POWER, p->left->left, + mkcon(p->left->right->constant - 1))), + arg1); } else { - /* - * D(f^g) = D(exp(g*ln(f))) - * = exp(g*ln(f)) * D(g*ln(f)) - * = exp(g*ln(f)) * (D(g)*ln(f) + g*D(f)/f) - */ + /* + * D(f^g) = D(exp(g*ln(f))) + * = exp(g*ln(f)) * D(g*ln(f)) + * = exp(g*ln(f)) * (D(g)*ln(f) + g*D(f)/f) + */ arg1 = PTdifferentiate(p->left->left, varnum); arg2 = PTdifferentiate(p->left->right, varnum); newp = mkb(PT_TIMES, mkf(PTF_EXP, mkb(PT_TIMES, - p->left->right, mkf(PTF_LN, - p->left->left))), - mkb(PT_PLUS, - mkb(PT_TIMES, p->left->right, - mkb(PT_DIVIDE, arg1, p->left->left)), - mkb(PT_TIMES, arg2, mkf(PTF_LN, p->left->left)))); + p->left->right, mkf(PTF_LN, + p->left->left))), + mkb(PT_PLUS, + mkb(PT_TIMES, p->left->right, + mkb(PT_DIVIDE, arg1, p->left->left)), + mkb(PT_TIMES, arg2, mkf(PTF_LN, p->left->left)))); } return mkfirst(newp, p); } - default: - fprintf(stderr, "Internal Error: bad function # %d\n", - p->funcnum); - return mkfirst(NULL, p); - } + default: + fprintf(stderr, "Internal Error: bad function # %d\n", + p->funcnum); + return mkfirst(NULL, p); + } - arg2 = PTdifferentiate(p->left, varnum); + arg2 = PTdifferentiate(p->left, varnum); - newp = mkb(PT_TIMES, arg1, arg2); + newp = mkb(PT_TIMES, arg1, arg2); - break; + break; default: - fprintf(stderr, "Internal error: bad node type %d\n", p->type); - newp = NULL; - break; + fprintf(stderr, "Internal error: bad node type %d\n", p->type); + newp = NULL; + break; } return mkfirst(newp, p); @@ -620,90 +620,90 @@ static INPparseNode *mkcon(double value) } static INPparseNode *mkb(int type, INPparseNode * left, - INPparseNode * right) + INPparseNode * right) { INPparseNode *p; int i; if ((right->type == PT_CONSTANT) && (left->type == PT_CONSTANT)) { - double value; - switch (type) { - case PT_TIMES: - value = left->constant * right->constant; - return mkfirst(mkcon(value), mkfirst(left, right)); + double value; + switch (type) { + case PT_TIMES: + value = left->constant * right->constant; + return mkfirst(mkcon(value), mkfirst(left, right)); - case PT_DIVIDE: - value = left->constant / right->constant; - return mkfirst(mkcon(value), mkfirst(left, right)); + case PT_DIVIDE: + value = left->constant / right->constant; + return mkfirst(mkcon(value), mkfirst(left, right)); - case PT_PLUS: - value = left->constant + right->constant; - return mkfirst(mkcon(value), mkfirst(left, right)); + case PT_PLUS: + value = left->constant + right->constant; + return mkfirst(mkcon(value), mkfirst(left, right)); - case PT_MINUS: - value = left->constant - right->constant; - return mkfirst(mkcon(value), mkfirst(left, right)); + case PT_MINUS: + value = left->constant - right->constant; + return mkfirst(mkcon(value), mkfirst(left, right)); - case PT_POWER: - value = pow(left->constant, right->constant); - return mkfirst(mkcon(value), mkfirst(left, right)); - } + case PT_POWER: + value = pow(left->constant, right->constant); + return mkfirst(mkcon(value), mkfirst(left, right)); + } } switch (type) { case PT_TIMES: - if ((left->type == PT_CONSTANT) && (left->constant == 0)) - return mkfirst(left, right); - else if ((right->type == PT_CONSTANT) && (right->constant == 0)) - return mkfirst(right, left); - else if ((left->type == PT_CONSTANT) && (left->constant == 1)) - return mkfirst(right, left); - else if ((right->type == PT_CONSTANT) && (right->constant == 1)) - return mkfirst(left, right); - break; + if ((left->type == PT_CONSTANT) && (left->constant == 0)) + return mkfirst(left, right); + else if ((right->type == PT_CONSTANT) && (right->constant == 0)) + return mkfirst(right, left); + else if ((left->type == PT_CONSTANT) && (left->constant == 1)) + return mkfirst(right, left); + else if ((right->type == PT_CONSTANT) && (right->constant == 1)) + return mkfirst(left, right); + break; case PT_DIVIDE: - if ((left->type == PT_CONSTANT) && (left->constant == 0)) - return mkfirst(left, right); - else if ((right->type == PT_CONSTANT) && (right->constant == 1)) - return mkfirst(left, right); - break; + if ((left->type == PT_CONSTANT) && (left->constant == 0)) + return mkfirst(left, right); + else if ((right->type == PT_CONSTANT) && (right->constant == 1)) + return mkfirst(left, right); + break; case PT_PLUS: - if ((left->type == PT_CONSTANT) && (left->constant == 0)) - return mkfirst(right, left); - else if ((right->type == PT_CONSTANT) && (right->constant == 0)) - return mkfirst(left, right); - break; + if ((left->type == PT_CONSTANT) && (left->constant == 0)) + return mkfirst(right, left); + else if ((right->type == PT_CONSTANT) && (right->constant == 0)) + return mkfirst(left, right); + break; case PT_MINUS: - if ((right->type == PT_CONSTANT) && (right->constant == 0)) - return mkfirst(left, right); - else if ((left->type == PT_CONSTANT) && (left->constant == 0)) - return mkfirst(mkf(PTF_UMINUS, right), left); - break; + if ((right->type == PT_CONSTANT) && (right->constant == 0)) + return mkfirst(left, right); + else if ((left->type == PT_CONSTANT) && (left->constant == 0)) + return mkfirst(mkf(PTF_UMINUS, right), left); + break; case PT_POWER: - if (right->type == PT_CONSTANT) { - if (right->constant == 0) - return mkfirst(mkcon(1.0), mkfirst(left, right)); - else if (right->constant == 1) - return mkfirst(left, right); - } - break; + if (right->type == PT_CONSTANT) { + if (right->constant == 0) + return mkfirst(mkcon(1.0), mkfirst(left, right)); + else if (right->constant == 1) + return mkfirst(left, right); + } + break; case PT_TERN: - if (left->type == PT_CONSTANT) { - /*FIXME > 0.0, >= 0.5, != 0.0 or what ? */ - p = (left->constant != 0.0) ? right->left : right->right; - return mkfirst(p, mkfirst(right, left)); - } - if((right->left->type == PT_CONSTANT) && - (right->right->type == PT_CONSTANT) && - (right->left->constant == right->right->constant)) - return mkfirst(right->left, mkfirst(right, left)); - break; + if (left->type == PT_CONSTANT) { + /*FIXME > 0.0, >= 0.5, != 0.0 or what ? */ + p = (left->constant != 0.0) ? right->left : right->right; + return mkfirst(p, mkfirst(right, left)); + } + if((right->left->type == PT_CONSTANT) && + (right->right->type == PT_CONSTANT) && + (right->left->constant == right->right->constant)) + return mkfirst(right->left, mkfirst(right, left)); + break; } - + p = TMALLOC(INPparseNode, 1); p->type = type; @@ -711,20 +711,20 @@ static INPparseNode *mkb(int type, INPparseNode * left, p->left = inc_usage(left); p->right = inc_usage(right); - + if(type == PT_TERN) { - p->function = NULL; - p->funcname = NULL; - return (p); + p->function = NULL; + p->funcname = NULL; + return (p); } for (i = 0; i < NUM_OPS; i++) - if (ops[i].number == type) - break; + if (ops[i].number == type) + break; if (i == NUM_OPS) { - fprintf(stderr, "Internal Error: bad type %d\n", type); - return (NULL); + fprintf(stderr, "Internal Error: bad type %d\n", type); + return (NULL); } p->function = ops[i].funcptr; p->funcname = ops[i].name; @@ -738,16 +738,16 @@ static INPparseNode *mkf(int type, INPparseNode * arg) int i; for (i = 0; i < NUM_FUNCS; i++) - if (funcs[i].number == type) - break; + if (funcs[i].number == type) + break; if (i == NUM_FUNCS) { - fprintf(stderr, "Internal Error: bad type %d\n", type); - return (NULL); + fprintf(stderr, "Internal Error: bad type %d\n", type); + return (NULL); } if (arg->type == PT_CONSTANT) { - double constval = PTunary(funcs[i].funcptr) (arg->constant); - return mkfirst(mkcon(constval), arg); + double constval = PTunary(funcs[i].funcptr) (arg->constant); + return mkfirst(mkcon(constval), arg); } p = TMALLOC(INPparseNode, 1); @@ -772,17 +772,17 @@ static int PTcheck(INPparseNode * p) { switch (p->type) { case PT_PLACEHOLDER: - return (0); + return (0); case PT_TIME: case PT_TEMPERATURE: case PT_FREQUENCY: case PT_CONSTANT: case PT_VAR: - return (1); + return (1); case PT_FUNCTION: - return (PTcheck(p->left)); + return (PTcheck(p->left)); case PT_PLUS: case PT_MINUS: @@ -790,31 +790,31 @@ static int PTcheck(INPparseNode * p) case PT_DIVIDE: case PT_POWER: case PT_COMMA: - return (PTcheck(p->left) && PTcheck(p->right)); + return (PTcheck(p->left) && PTcheck(p->right)); case PT_TERN: - return (PTcheck(p->left) && PTcheck(p->right->left) && PTcheck(p->right->right)); + return (PTcheck(p->left) && PTcheck(p->right->left) && PTcheck(p->right->right)); default: - fprintf(stderr, "Internal error: bad node type %d\n", p->type); - return (0); + fprintf(stderr, "Internal error: bad node type %d\n", p->type); + return (0); } } /* Binop node. */ static INPparseNode *mkbnode(const char *opstr, INPparseNode * arg1, - INPparseNode * arg2) + INPparseNode * arg2) { INPparseNode *p; int i; for (i = 0; i < NUM_OPS; i++) - if (!strcmp(ops[i].name, opstr)) - break; + if (!strcmp(ops[i].name, opstr)) + break; if (i == NUM_OPS) { - fprintf(stderr, "Internal Error: no such op num %s\n", opstr); - return mkfirst(NULL, mkfirst(arg1, arg2)); + fprintf(stderr, "Internal Error: no such op num %s\n", opstr); + return mkfirst(NULL, mkfirst(arg1, arg2)); } p = TMALLOC(INPparseNode, 1); @@ -931,25 +931,25 @@ static INPparseNode *mkfnode(const char *fname, INPparseNode * arg) if(!strcmp("ternary_fcn", buf)) { - if(arg->type == PT_COMMA && arg->left->type == PT_COMMA) { + if(arg->type == PT_COMMA && arg->left->type == PT_COMMA) { - INPparseNode *arg1 = arg->left->left; - INPparseNode *arg2 = arg->left->right; - INPparseNode *arg3 = arg->right; + INPparseNode *arg1 = arg->left->left; + INPparseNode *arg2 = arg->left->right; + INPparseNode *arg3 = arg->right; - p = TMALLOC(INPparseNode, 1); + p = TMALLOC(INPparseNode, 1); - p->type = PT_TERN; - p->usecnt = 0; + p->type = PT_TERN; + p->usecnt = 0; - p->left = inc_usage(arg1); - p->right = inc_usage(mkb(PT_COMMA, arg2, arg3)); + p->left = inc_usage(arg1); + p->right = inc_usage(mkb(PT_COMMA, arg2, arg3)); - return mkfirst(p, arg); - } + return mkfirst(p, arg); + } - fprintf(stderr, "Error: bogus ternary_fcn form\n"); - return mkfirst(NULL, arg); + fprintf(stderr, "Error: bogus ternary_fcn form\n"); + return mkfirst(NULL, arg); } for (i = 0; i < NUM_FUNCS; i++) @@ -1089,41 +1089,41 @@ static INPparseNode *mksnode(const char *string, void *ckt) /* First see if it's something special. */ for (i = 0; i < ft_sim->numSpecSigs; i++) - if (!strcmp(ft_sim->specSigs[i], buf)) - break; + if (!strcmp(ft_sim->specSigs[i], buf)) + break; if (i < ft_sim->numSpecSigs) { - for (j = 0; j < numvalues; j++) - if ((types[j] == IF_STRING) && !strcmp(buf, values[i].sValue)) - break; - if (j == numvalues) { - if (numvalues) { - values = TREALLOC(IFvalue, values, numvalues + 1); - types = TREALLOC(int, types, numvalues + 1); - } else { - values = TMALLOC(IFvalue, 1); - types = TMALLOC(int, 1); - } - values[i].sValue = TMALLOC(char, strlen(buf) + 1); - strcpy(values[i].sValue, buf); - types[i] = IF_STRING; - numvalues++; - } - p->valueIndex = i; - p->type = PT_VAR; - return (p); + for (j = 0; j < numvalues; j++) + if ((types[j] == IF_STRING) && !strcmp(buf, values[i].sValue)) + break; + if (j == numvalues) { + if (numvalues) { + values = TREALLOC(IFvalue, values, numvalues + 1); + types = TREALLOC(int, types, numvalues + 1); + } else { + values = TMALLOC(IFvalue, 1); + types = TMALLOC(int, 1); + } + values[i].sValue = TMALLOC(char, strlen(buf) + 1); + strcpy(values[i].sValue, buf); + types[i] = IF_STRING; + numvalues++; + } + p->valueIndex = i; + p->type = PT_VAR; + return (p); } for (i = 0; i < NUM_CONSTANTS; i++) - if (!strcmp(constants[i].name, buf)) - break; + if (!strcmp(constants[i].name, buf)) + break; if (i == NUM_CONSTANTS) { - /* We'd better save this in case it's part of i(something). */ - p->type = PT_PLACEHOLDER; - p->funcname = copy(string); + /* We'd better save this in case it's part of i(something). */ + p->type = PT_PLACEHOLDER; + p->funcname = copy(string); } else { - p->type = PT_CONSTANT; - p->constant = constants[i].value; + p->type = PT_CONSTANT; + p->constant = constants[i].value; } return (p); @@ -1141,18 +1141,18 @@ int PTlex (YYSTYPE *lvalp, struct PTltype *llocp, char **line) sbuf = *line; #ifdef TRACE -// printf("entering lexer, sbuf = '%s', lastoken = %d, lasttype = %d\n", +// printf("entering lexer, sbuf = '%s', lastoken = %d, lasttype = %d\n", // sbuf, lasttoken, lasttype); #endif while ((*sbuf == ' ') || (*sbuf == '\t')) - sbuf++; + sbuf++; llocp->start = sbuf; switch (*sbuf) { case '\0': - token = 0; - break; + token = 0; + break; case '?': case ':': @@ -1163,8 +1163,8 @@ int PTlex (YYSTYPE *lvalp, struct PTltype *llocp, char **line) case '^': case '(': case ')': - token = *sbuf++; - break; + token = *sbuf++; + break; case '*': if(sbuf[1] == '*') { @@ -1291,28 +1291,28 @@ int PTlex (YYSTYPE *lvalp, struct PTltype *llocp, char **line) } } - td = INPevaluate(&sbuf, &err, 1); - if (err == OK) { - token = TOK_NUM; - lvalp->num = td; - } else { + td = INPevaluate(&sbuf, &err, 1); + if (err == OK) { + token = TOK_NUM; + lvalp->num = td; + } else { char *tmp; - token = TOK_STR; - for (s = sbuf; *s; s++) - if (strchr(specials, *s)) - break; - tmp = TMALLOC(char, s - sbuf + 1); - strncpy(tmp, sbuf, (size_t) (s - sbuf)); - tmp[s - sbuf] = '\0'; - lvalp->str = tmp; - sbuf = s; - } + token = TOK_STR; + for (s = sbuf; *s; s++) + if (strchr(specials, *s)) + break; + tmp = TMALLOC(char, s - sbuf + 1); + strncpy(tmp, sbuf, (size_t) (s - sbuf)); + tmp[s - sbuf] = '\0'; + lvalp->str = tmp; + sbuf = s; + } } *line = sbuf; #ifdef TRACE -// printf("PTlexer: token = %d, type = %d, left = '%s'\n", +// printf("PTlexer: token = %d, type = %d, left = '%s'\n", // el.token, el.type, sbuf); */ #endif llocp->stop = sbuf; @@ -1327,7 +1327,7 @@ void INPfreeTree(IFparseTree *ptree) int i; for (i = 0; i < pt->p.numVars; i++) - dec_usage(pt->derivs[i]); + dec_usage(pt->derivs[i]); dec_usage(pt->tree); @@ -1354,7 +1354,7 @@ void free_tree(INPparseNode *pt) case PT_FREQUENCY: case PT_CONSTANT: case PT_VAR: - break; + break; case PT_PLUS: case PT_MINUS: @@ -1363,14 +1363,14 @@ void free_tree(INPparseNode *pt) case PT_POWER: case PT_COMMA: case PT_TERN: - dec_usage(pt->right); + dec_usage(pt->right); case PT_FUNCTION: - dec_usage(pt->left); - break; + dec_usage(pt->left); + break; default: - printf("oops"); - break; + printf("oops"); + break; } if(pt->type == PT_FUNCTION && pt->funcnum == PTF_PWL) { @@ -1397,9 +1397,9 @@ void INPptPrint(char *str, IFparseTree * ptree) printTree(((INPparseTree *) ptree)->tree); printf("\n"); for (i = 0; i < ptree->numVars; i++) { - printf("d / d v%d : ", i); - printTree(((INPparseTree *) ptree)->derivs[i]); - printf("\n"); + printf("d / d v%d : ", i); + printTree(((INPparseTree *) ptree)->derivs[i]); + printf("\n"); } return; } @@ -1409,90 +1409,90 @@ void printTree(INPparseNode * pt) switch (pt->type) { case PT_TIME: printf("time(ckt = %p)", pt->data); - break; + break; case PT_TEMPERATURE: printf("temperature(ckt = %p)", pt->data); - break; + break; case PT_FREQUENCY: printf("frequency(ckt = %p)", pt->data); - break; + break; case PT_CONSTANT: - printf("%g", pt->constant); - break; + printf("%g", pt->constant); + break; case PT_VAR: - printf("v%d", pt->valueIndex); - break; + printf("v%d", pt->valueIndex); + break; case PT_PLUS: - printf("("); - printTree(pt->left); - printf(") + ("); - printTree(pt->right); - printf(")"); - break; + printf("("); + printTree(pt->left); + printf(") + ("); + printTree(pt->right); + printf(")"); + break; case PT_MINUS: - printf("("); - printTree(pt->left); - printf(") - ("); - printTree(pt->right); - printf(")"); - break; + printf("("); + printTree(pt->left); + printf(") - ("); + printTree(pt->right); + printf(")"); + break; case PT_TIMES: - printf("("); - printTree(pt->left); - printf(") * ("); - printTree(pt->right); - printf(")"); - break; + printf("("); + printTree(pt->left); + printf(") * ("); + printTree(pt->right); + printf(")"); + break; case PT_DIVIDE: - printf("("); - printTree(pt->left); - printf(") / ("); - printTree(pt->right); - printf(")"); - break; + printf("("); + printTree(pt->left); + printf(") / ("); + printTree(pt->right); + printf(")"); + break; case PT_POWER: - printf("("); - printTree(pt->left); - printf(") ^ ("); - printTree(pt->right); - printf(")"); - break; + printf("("); + printTree(pt->left); + printf(") ^ ("); + printTree(pt->right); + printf(")"); + break; + - case PT_COMMA: - printf("("); - printTree(pt->left); - printf(") , ("); - printTree(pt->right); - printf(")"); - break; + printf("("); + printTree(pt->left); + printf(") , ("); + printTree(pt->right); + printf(")"); + break; case PT_FUNCTION: - printf("%s (", pt->funcname); - printTree(pt->left); - printf(")"); - break; - + printf("%s (", pt->funcname); + printTree(pt->left); + printf(")"); + break; + case PT_TERN: - printf("ternary_fcn ("); - printTree(pt->left); - printf(") , ("); - printTree(pt->right); - printf(")"); - break; + printf("ternary_fcn ("); + printTree(pt->left); + printf(") , ("); + printTree(pt->right); + printf(")"); + break; default: - printf("oops"); - break; + printf("oops"); + break; } return; } diff --git a/src/spicelib/parser/ptfuncs.c b/src/spicelib/parser/ptfuncs.c index 5ae64ae4c..9ff1dbcb8 100644 --- a/src/spicelib/parser/ptfuncs.c +++ b/src/spicelib/parser/ptfuncs.c @@ -1,6 +1,6 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group +Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group **********/ /* @@ -20,11 +20,11 @@ Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group #ifndef HAVE_ATANH extern double asinh(), acosh(), atanh(); -#endif +#endif double PTfudge_factor; -#define MODULUS(NUM,LIMIT) ((NUM) - ((int) ((NUM) / (LIMIT))) * (LIMIT)) +#define MODULUS(NUM,LIMIT) ((NUM) - ((int) ((NUM) / (LIMIT))) * (LIMIT)) double PTabs(double arg) @@ -56,13 +56,13 @@ PTtimes(double arg1, double arg2) return (arg1 * arg2); } -double +double PTdivide(double arg1, double arg2) { if (arg2 >= 0.0) - arg2 += PTfudge_factor; + arg2 += PTfudge_factor; else - arg2 -= PTfudge_factor; + arg2 -= PTfudge_factor; if (arg2 == 0.0) return (HUGE); @@ -74,11 +74,11 @@ double PTpower(double arg1, double arg2) { if (arg1 < 0.0) { - if (fabs(arg2 - ((int) arg2)) / (arg2 + 0.001) < 0.000001) { - arg2 = (int) arg2; - } else { - arg1 = -arg1; - } + if (fabs(arg2 - ((int) arg2)) / (arg2 + 0.001) < 0.000001) { + arg2 = (int) arg2; + } else { + arg1 = -arg1; + } } return (pow(arg1, arg2)); } @@ -108,9 +108,9 @@ PTacosh(double arg) return (acosh(arg)); #else if (arg < 1.0) - arg = 1.0; + arg = 1.0; return (log(arg + sqrt(arg*arg-1.0))); -#endif +#endif } double @@ -126,7 +126,7 @@ PTasinh(double arg) return (asinh(arg)); #else return log(arg + sqrt(arg * arg + 1.0)); -#endif +#endif } double @@ -142,22 +142,22 @@ PTatanh(double arg) return (atanh(arg)); #else if (arg < -1.0) - arg = -1.0 + PTfudge_factor + 1e-10; + arg = -1.0 + PTfudge_factor + 1e-10; else if (arg > 1.0) - arg = 1.0 - PTfudge_factor - 1e-10; + arg = 1.0 - PTfudge_factor - 1e-10; return (log((1.0 + arg) / (1.0 - arg)) / 2.0); -#endif +#endif } double PTustep(double arg) { if (arg < 0.0) - return 0.0; + return 0.0; else if (arg > 0.0) - return 1.0; + return 1.0; else - return 0.5; /* Ick! */ + return 0.5; /* Ick! */ } /* MW. PTcif is like "C" if - 0 for (arg<=0), 1 elsewhere */ @@ -165,12 +165,12 @@ PTustep(double arg) double PTustep2(double arg) { - if (arg <= 0.0) - return 0.0; + if (arg <= 0.0) + return 0.0; else if (arg <= 1.0) - return arg; + return arg; else /* if (arg > 1.0) */ - return 1.0; + return 1.0; } double @@ -213,9 +213,9 @@ double PTuramp(double arg) { if (arg < 0.0) - return 0.0; + return 0.0; else - return arg; + return arg; } double From 6c885ce65bc5fd61ecf7cb9bf7a081a39ba5b710 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Wed, 29 May 2013 22:36:33 +0200 Subject: [PATCH 123/257] vcvsset.c, cleanup order of TSTALLOC() invocations --- src/spicelib/devices/vcvs/vcvsset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/vcvs/vcvsset.c b/src/spicelib/devices/vcvs/vcvsset.c index 3faef1625..b34db5d5e 100644 --- a/src/spicelib/devices/vcvs/vcvsset.c +++ b/src/spicelib/devices/vcvs/vcvsset.c @@ -52,8 +52,8 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(VCVSposIbrptr, VCVSposNode, VCVSbranch) TSTALLOC(VCVSnegIbrptr, VCVSnegNode, VCVSbranch) - TSTALLOC(VCVSibrNegptr, VCVSbranch, VCVSnegNode) TSTALLOC(VCVSibrPosptr, VCVSbranch, VCVSposNode) + TSTALLOC(VCVSibrNegptr, VCVSbranch, VCVSnegNode) TSTALLOC(VCVSibrContPosptr, VCVSbranch, VCVScontPosNode) TSTALLOC(VCVSibrContNegptr, VCVSbranch, VCVScontNegNode) } From 889c90350a2ee30e2bcf1773d7e8e34927bf435c Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 29 May 2013 22:37:16 +0200 Subject: [PATCH 124/257] inpcom.c, local scope for some variables --- src/frontend/inpcom.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 284f77b6d..865ca9440 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -924,10 +924,9 @@ readline(FILE *fd) static void inp_fix_gnd_name(struct line *c) { - char *gnd; for (; c; c = c->li_next) { - gnd = c->li_line; + char *gnd = c->li_line; // if there is a comment or no gnd, go to next line if ((*gnd == '*') || (strstr(gnd, "gnd") == NULL)) continue; @@ -1191,7 +1190,6 @@ static void inp_fix_macro_param_func_paren_io(struct line *card) { char *str_ptr, *new_str; - bool is_func = FALSE; for (; card; card = card->li_next) { @@ -1233,8 +1231,8 @@ inp_fix_macro_param_func_paren_io(struct line *card) card->li_line = inp_remove_ws(card->li_line); /* remove the extra white spaces just introduced */ } } - is_func = FALSE; if (ciprefix(".param", card->li_line)) { + bool is_func = FALSE; str_ptr = skip_non_ws(card->li_line); // skip over .param str_ptr = skip_ws(str_ptr); while (!isspace(*str_ptr) && *str_ptr != '=') { @@ -1350,12 +1348,12 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, bool has_models) { struct line *card; - char *line = NULL, *curr_subckt_name, *inst_subckt_name, *model_name, *new_names[100]; + char *curr_subckt_name, *inst_subckt_name, *model_name, *new_names[100]; bool found_subckt = FALSE, have_subckt = FALSE, found_model = FALSE; int i, num_terminals = 0, tmp_cnt = 0; for (card = start_card; card; card = card->li_next) { - line = card->li_line; + char *line = card->li_line; if (*line == '*') continue; @@ -1470,7 +1468,7 @@ static void comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) { struct line *card; - char **used_subckt_names, **used_model_names, *line = NULL, *subckt_name, *model_name; + char **used_subckt_names, **used_model_names, *subckt_name, *model_name; int num_used_subckt_names = 0, num_used_model_names = 0, i = 0, num_terminals = 0, tmp_cnt = 0; bool processing_subckt = FALSE, found_subckt = FALSE, remove_subckt = FALSE, found_model = FALSE, has_models = FALSE; int skip_control = 0, nested_subckt = 0; @@ -1492,7 +1490,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) } for (card = start_card; card; card = card->li_next) { - line = card->li_line; + char *line = card->li_line; if (*line == '*') continue; @@ -1583,7 +1581,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) /* comment out any unused subckts, currently only at top level */ for (card = start_card; card; card = card->li_next) { - line = card->li_line; + char *line = card->li_line; if (*line == '*') continue; @@ -1818,11 +1816,10 @@ inp_fix_ternary_operator_str(char *line, bool all) static void inp_fix_ternary_operator(struct line *card) { - char *line; bool found_control = FALSE; for (; card; card = card->li_next) { - line = card->li_line; + char *line = card->li_line; /* exclude replacement of ternary function between .control and .endc */ if (ciprefix(".control", line)) @@ -2230,7 +2227,6 @@ static void inp_fix_for_numparam(struct line *c) { bool found_control = FALSE; - char *str_ptr; for (; c; c = c->li_next) { if (ciprefix(".lib", c->li_line) || ciprefix("*lib", c->li_line) || ciprefix("*inc", c->li_line)) @@ -2249,7 +2245,7 @@ inp_fix_for_numparam(struct line *c) if ((inp_compat_mode == COMPATMODE_ALL) || (inp_compat_mode == COMPATMODE_PS)) if (ciprefix(".subckt", c->li_line) || ciprefix("x", c->li_line)) { /* remove params: */ - str_ptr = strstr(c->li_line, "params:"); + char *str_ptr = strstr(c->li_line, "params:"); if (str_ptr) memcpy(str_ptr, " ", 7); } From eda5c611e28e61acf60b9af48104ab8aca0a1d63 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 26 May 2013 22:57:54 +0200 Subject: [PATCH 125/257] inpcom.c, simplify tfree() usage --- src/frontend/inpcom.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 865ca9440..29541c621 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -211,8 +211,7 @@ read_a_lib(char *y, int call_depth, char *dir_name) newfp = inp_pathopen(big_buff2, "r"); if (!newfp) { fprintf(cp_err, "Error: Could not find library file %s\n", y); - if (copyy) - tfree(copyy); /* allocated by the cp_tildexpand() above */ + tfree(copyy); /* allocated by the cp_tildexpand() above */ return FALSE; } @@ -234,8 +233,7 @@ read_a_lib(char *y, int call_depth, char *dir_name) fclose(newfp); } - if (copyy) - tfree(copyy); /* allocated by the cp_tildexpand() above */ + tfree(copyy); /* allocated by the cp_tildexpand() above */ return TRUE; } @@ -395,8 +393,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile s = skip_ws(s); /* advance past space chars */ /* only the last title line remains valid */ - if (new_title != NULL) - tfree(new_title); + tfree(new_title); new_title = copy(s); if ((s = strchr(new_title, '\n')) != NULL) *s = ' '; @@ -459,8 +456,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile newfp = inp_pathopen(big_buff2, "r"); if (!newfp) { perror(y); - if (copyy) - tfree(copyy); /* allocated by the cp_tildexpand() above */ + tfree(copyy); /* allocated by the cp_tildexpand() above */ fprintf(cp_err, "Error: .include statement failed.\n"); tfree(buffer); /* allocated by readline() above */ controlled_exit(EXIT_FAILURE); @@ -480,8 +476,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile (void) fclose(newfp); } - if (copyy) - tfree(copyy); /* allocated by the cp_tildexpand() above */ + tfree(copyy); /* allocated by the cp_tildexpand() above */ /* Make the .include a comment */ *buffer = '*'; @@ -633,7 +628,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* Replace first line with the new title, if available */ if (new_title != NULL) { - if (cc->li_line) tfree(cc->li_line); + tfree(cc->li_line); cc->li_line = new_title; } @@ -1627,8 +1622,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) model_bin_match(used_model_names[i], model_name)) found_model = TRUE; } - if (model_type) - tfree(model_type); + tfree(model_type); if (!found_model) *line = '*'; tfree(model_name); @@ -1804,10 +1798,8 @@ inp_fix_ternary_operator_str(char *line, bool all) tfree(conditional); tfree(if_str); tfree(else_str); - if (beg_str != NULL) - tfree(beg_str); - if (end_str != NULL) - tfree(end_str); + tfree(beg_str); + tfree(end_str); return new_str; } From ae7afafcfd70c22f6813d983eb4e56861737dae1 Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 29 May 2013 21:34:20 +0200 Subject: [PATCH 126/257] inpcom.c, simplify error processing --- src/frontend/inpcom.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 29541c621..2bef3beb1 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -4182,13 +4182,12 @@ inp_compat(struct line *card) title_tok, node1, node2, title_tok); // get the expression str_ptr = gettok(&cut_line); /* ignore 'table' */ - if (cieq(str_ptr, "table")) { - tfree(str_ptr); - } else { + if (!cieq(str_ptr, "table")) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } + tfree(str_ptr); str_ptr = gettok_char(&cut_line, '{', FALSE, FALSE); expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */ if ((!expression) || (!str_ptr)) { @@ -4196,8 +4195,7 @@ inp_compat(struct line *card) card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } - else - tfree(str_ptr); + tfree(str_ptr); /* remove '{' and '}' from expression */ if ((str_ptr = strchr(expression, '{')) != NULL) *str_ptr = ' '; @@ -4375,13 +4373,12 @@ inp_compat(struct line *card) title_tok, node1, node2, title_tok); // get the expression str_ptr = gettok(&cut_line); /* ignore 'table' */ - if (cieq(str_ptr, "table")) { - tfree(str_ptr); - } else { + if (!cieq(str_ptr, "table")) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } + tfree(str_ptr); str_ptr = gettok_char(&cut_line, '{', FALSE, FALSE); expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */ if ((!expression) || (!str_ptr)) { @@ -4389,8 +4386,7 @@ inp_compat(struct line *card) card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } - else - tfree(str_ptr); + tfree(str_ptr); /* remove '{' and '}' from expression */ if ((str_ptr = strchr(expression, '{')) != NULL) *str_ptr = ' '; From d0c45d2af13dd27869252d281b76bddd7e0fc02c Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 29 May 2013 22:39:09 +0200 Subject: [PATCH 127/257] inpcom.c, drop some local variables --- src/frontend/inpcom.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 2bef3beb1..162994d33 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -941,10 +941,9 @@ inp_fix_gnd_name(struct line *c) static struct line* create_new_card(char *card_str, int *line_number) { - char *str = strdup(card_str); struct line *newcard = alloc(struct line); - newcard->li_line = str; + newcard->li_line = strdup(card_str); newcard->li_linenum = *line_number; newcard->li_error = NULL; newcard->li_actual = NULL; @@ -1313,15 +1312,14 @@ get_model_name(char *line, int num_terminals) static char* get_model_type(char *line) { - char *model_type, *beg_ptr; + char *beg_ptr; if (!(ciprefix(".model", line))) return NULL; beg_ptr = skip_non_ws(line); /* eat .model */ beg_ptr = skip_ws(beg_ptr); beg_ptr = skip_non_ws(beg_ptr); /* eat model name */ beg_ptr = skip_ws(beg_ptr); - model_type = gettok(&beg_ptr); - return model_type; + return gettok(&beg_ptr); } @@ -2505,14 +2503,13 @@ inp_fix_inst_line(char *inst_line, static bool found_mult_param(int num_params, char *param_names[]) { - bool found_mult = FALSE; int i; for (i = 0; i < num_params; i++) if (strcmp(param_names[i], "m") == 0) - found_mult = TRUE; + return TRUE; - return found_mult; + return FALSE; } /* If a subcircuit invocation (X-line) is found, which contains the From 56e55ea8a0cad973a4f7d0efdf0278b63a587b56 Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 29 May 2013 22:49:21 +0200 Subject: [PATCH 128/257] inpcom.c, cleanup --- src/frontend/inpcom.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 162994d33..0e3fa9c11 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -892,8 +892,7 @@ readline(FILE *fd) while ((c = getc(fd)) != EOF) { if (strlen == 0 && (c == '\t' || c == ' ')) /* Leading spaces away */ continue; - strptr[strlen] = (char) c; - strlen++; + strptr[strlen++] = (char) c; if (strlen >= memlen) { memlen += STRGROW; if ((strptr = TREALLOC(char, strptr, memlen + 1)) == NULL) @@ -940,7 +939,8 @@ inp_fix_gnd_name(struct line *c) } static struct line* -create_new_card(char *card_str, int *line_number) { +create_new_card(char *card_str, int *line_number) +{ struct line *newcard = alloc(struct line); newcard->li_line = strdup(card_str); @@ -1215,7 +1215,7 @@ inp_fix_macro_param_func_paren_io(struct line *card) } if (*str_ptr == '(') { *str_ptr = ' '; - while (*str_ptr && *str_ptr != '\0') { + while (*str_ptr != '\0') { if (*str_ptr == ')') { *str_ptr = ' '; break; @@ -1811,6 +1811,8 @@ inp_fix_ternary_operator(struct line *card) for (; card; card = card->li_next) { char *line = card->li_line; + if (*line == '*') + continue; /* exclude replacement of ternary function between .control and .endc */ if (ciprefix(".control", line)) found_control = TRUE; @@ -1822,8 +1824,6 @@ inp_fix_ternary_operator(struct line *card) /* ternary operator for B source done elsewhere */ if (*line == 'B' || *line == 'b') continue; - if (*line == '*') - continue; /* .param, .func, and .meas lines handled here (2nd argument FALSE) */ if (strchr(line, '?') && strchr(line, ':')) card->li_line = inp_fix_ternary_operator_str(line, FALSE); @@ -1954,7 +1954,7 @@ inp_change_quotes(char *s) { bool first_quote = FALSE; - while (*s) { + for (; *s; s++) if (*s == '\'') { if (first_quote == FALSE) { *s = '{'; @@ -1964,8 +1964,6 @@ inp_change_quotes(char *s) first_quote = FALSE; } } - s++; - } } @@ -5664,7 +5662,8 @@ inp_poly_err(struct line *card) /* get the fourth token in a controlled source line and exit, if it is 'poly' */ if ((ciprefix("e", curr_line)) || (ciprefix("g", curr_line)) || - (ciprefix("f", curr_line)) || (ciprefix("h", curr_line))) { + (ciprefix("f", curr_line)) || (ciprefix("h", curr_line))) + { txfree(gettok(&curr_line)); txfree(gettok(&curr_line)); txfree(gettok(&curr_line)); From 93ff2c03d8078de26940d89ce56ad40c67f05c60 Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 29 May 2013 22:50:23 +0200 Subject: [PATCH 129/257] inpcom.c, improve readability of skip_back_non_ws() and skip_back_ws() --- src/frontend/inpcom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 0e3fa9c11..b011c59b0 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -109,8 +109,8 @@ static char *get_quoted_token(char *string, char **token); static void replace_token(char *string, char *token, int where, int total); static void inp_add_series_resistor(struct line *deck); -static char *skip_back_non_ws(char *d) { --d; while (*d && !isspace(*d)) d--; return d + 1; } -static char *skip_back_ws(char *d) { --d; while (isspace(*d)) d--; return d + 1; } +static char *skip_back_non_ws(char *d) { while (d[-1] && !isspace(d[-1])) d--; return d; } +static char *skip_back_ws(char *d) { while (isspace(d[-1])) d--; return d; } static char *skip_non_ws(char *d) { while (*d && !isspace(*d)) d++; return d; } static char *skip_ws(char *d) { while (isspace(*d)) d++; return d; } From d54e9aa82fcca2e27d510782c8567d0988177c1b Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 29 May 2013 22:50:43 +0200 Subject: [PATCH 130/257] inpcom.c, drop superflous initialisation --- src/frontend/inpcom.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index b011c59b0..5316b6ba6 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -884,7 +884,6 @@ readline(FILE *fd) char *strptr; int strlen; - strptr = NULL; strlen = 0; memlen = STRGROW; strptr = TMALLOC(char, memlen); @@ -2564,7 +2563,7 @@ inp_fix_subckt_multiplier(struct line *subckt_card, static void inp_fix_inst_calls_for_numparam(struct line *deck) { - struct line *c = deck; + struct line *c; struct line *d, *p = NULL; char *inst_line; char *subckt_line; From fe244d44f2ef3e1982e54a62529429a8a0f00bf7 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 30 May 2013 10:25:59 +0200 Subject: [PATCH 131/257] cccs (F source): multiplier m added --- src/spicelib/devices/cccs/cccs.c | 1 + src/spicelib/devices/cccs/cccsask.c | 2 ++ src/spicelib/devices/cccs/cccsdefs.h | 4 ++++ src/spicelib/devices/cccs/cccspar.c | 6 ++++++ 4 files changed, 13 insertions(+) diff --git a/src/spicelib/devices/cccs/cccs.c b/src/spicelib/devices/cccs/cccs.c index 79560bfb1..a24ccf9f9 100644 --- a/src/spicelib/devices/cccs/cccs.c +++ b/src/spicelib/devices/cccs/cccs.c @@ -12,6 +12,7 @@ Author: 1987 Thomas L. Quarles IFparm CCCSpTable[] = { /* parameters */ IOPU("gain", CCCS_GAIN, IF_REAL ,"Gain of source"), IOPU("control", CCCS_CONTROL, IF_INSTANCE,"Name of controlling source"), + IOP ( "m", CCCS_M, IF_REAL , "Parallel multiplier"), IP("sens_gain",CCCS_GAIN_SENS,IF_FLAG, "flag to request sensitivity WRT gain"), OPU("neg_node", CCCS_NEG_NODE,IF_INTEGER, "Negative node of source"), OPU("pos_node", CCCS_POS_NODE,IF_INTEGER, "Positive node of source"), diff --git a/src/spicelib/devices/cccs/cccsask.c b/src/spicelib/devices/cccs/cccsask.c index 70303f095..bd0d65777 100644 --- a/src/spicelib/devices/cccs/cccsask.c +++ b/src/spicelib/devices/cccs/cccsask.c @@ -36,6 +36,8 @@ CCCSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue * case CCCS_CONTROL: value->uValue = here->CCCScontName; return (OK); + case CCCS_M: + value->rValue = here->CCCSmValue; case CCCS_POS_NODE: value->iValue = here->CCCSposNode; return (OK); diff --git a/src/spicelib/devices/cccs/cccsdefs.h b/src/spicelib/devices/cccs/cccsdefs.h index 57e573871..9c2362001 100644 --- a/src/spicelib/devices/cccs/cccsdefs.h +++ b/src/spicelib/devices/cccs/cccsdefs.h @@ -30,11 +30,14 @@ typedef struct sCCCSinstance { double CCCScoeff; /* coefficient */ + double CCCSmValue; /* Parallel multiplier */ + double *CCCSposContBrptr; /* pointer to sparse matrix element at *(positive node, control branch eq)*/ double *CCCSnegContBrptr; /* pointer to sparse matrix element at *(negative node, control branch eq)*/ unsigned CCCScoeffGiven :1 ; /* flag to indicate coeff given */ + unsigned CCCSmGiven :1 ; /* flag to indicate multiplier given */ int CCCSsenParmNo; /* parameter # for sensitivity use; set equal to 0 if not a design parameter*/ @@ -62,6 +65,7 @@ typedef struct sCCCSmodel { /* model structure for a source */ #define CCCS_CURRENT 7 #define CCCS_POWER 8 #define CCCS_VOLTS 9 +#define CCCS_M 10 /* model parameters */ diff --git a/src/spicelib/devices/cccs/cccspar.c b/src/spicelib/devices/cccs/cccspar.c index 077d85f0e..4f10557ca 100644 --- a/src/spicelib/devices/cccs/cccspar.c +++ b/src/spicelib/devices/cccs/cccspar.c @@ -23,11 +23,17 @@ CCCSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) switch(param) { case CCCS_GAIN: here->CCCScoeff = value->rValue; + if (here->CCCSmGiven) + here->CCCScoeff *= here->CCCSmValue; here->CCCScoeffGiven = TRUE; break; case CCCS_CONTROL: here->CCCScontName = value->uValue; break; + case CCCS_M: + here->CCCSmValue = value->rValue; + here->CCCSmGiven = TRUE; + break; case CCCS_GAIN_SENS: here->CCCSsenParmNo = value->iValue; break; From 47162dccabdff49ae1f6c6f5808918682c43dfec Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 30 May 2013 10:43:47 +0200 Subject: [PATCH 132/257] vccs (G source): add multiplier m --- src/spicelib/devices/vccs/vccs.c | 1 + src/spicelib/devices/vccs/vccsdefs.h | 3 +++ src/spicelib/devices/vccs/vccspar.c | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/src/spicelib/devices/vccs/vccs.c b/src/spicelib/devices/vccs/vccs.c index 313f730b5..087f3cc28 100644 --- a/src/spicelib/devices/vccs/vccs.c +++ b/src/spicelib/devices/vccs/vccs.c @@ -11,6 +11,7 @@ Author: 1987 Thomas L. Quarles IFparm VCCSpTable[] = { /* parameters */ IOPU("gain", VCCS_TRANS, IF_REAL, "Transconductance of source (gain)"), + IOP ( "m", VCCS_M, IF_REAL , "Parallel multiplier"), IP("sens_trans", VCCS_TRANS_SENS,IF_FLAG, "flag to request sensitivity WRT transconductance"), OPU("pos_node", VCCS_POS_NODE, IF_INTEGER, "Positive node of source"), diff --git a/src/spicelib/devices/vccs/vccsdefs.h b/src/spicelib/devices/vccs/vccsdefs.h index 238c2e545..8874fcd3b 100644 --- a/src/spicelib/devices/vccs/vccsdefs.h +++ b/src/spicelib/devices/vccs/vccsdefs.h @@ -31,6 +31,7 @@ typedef struct sVCCSinstance { double VCCSinitCond; /* initial condition (of controlling source) */ double VCCScoeff; /* coefficient */ + double VCCSmValue; /* Parallel multiplier */ double *VCCSposContPosptr; /* pointer to sparse matrix element at * (positive node, control positive node) */ @@ -41,6 +42,7 @@ typedef struct sVCCSinstance { double *VCCSnegContNegptr; /* pointer to sparse matrix element at * (negative node, control negative node) */ unsigned VCCScoeffGiven :1 ;/* flag to indicate function coeffs given */ + unsigned VCCSmGiven :1 ;/* flag to indicate multiplier given */ int VCCSsenParmNo; /* parameter # for sensitivity use; set equal to 0 if not a design parameter*/ @@ -73,6 +75,7 @@ typedef struct sVCCSmodel { /* model structure for a source */ #define VCCS_CURRENT 9 #define VCCS_POWER 10 #define VCCS_VOLTS 11 +#define VCCS_M 12 /* model parameters */ diff --git a/src/spicelib/devices/vccs/vccspar.c b/src/spicelib/devices/vccs/vccspar.c index 7f7b51a76..98c88279a 100644 --- a/src/spicelib/devices/vccs/vccspar.c +++ b/src/spicelib/devices/vccs/vccspar.c @@ -24,6 +24,12 @@ VCCSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) case VCCS_TRANS: here->VCCScoeff = value->rValue; here->VCCScoeffGiven = TRUE; + if (here->VCCSmGiven) + here->VCCScoeff *= here->VCCSmValue; + break; + case VCCS_M: + here->VCCSmValue = value->rValue; + here->VCCSmGiven = TRUE; break; case VCCS_TRANS_SENS: here->VCCSsenParmNo = value->iValue; From 8cb719aee0f969e6cf8536c8397177cdb287a087 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 30 May 2013 11:25:57 +0200 Subject: [PATCH 133/257] multipier m --- src/spicelib/devices/vccs/vccsask.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/spicelib/devices/vccs/vccsask.c b/src/spicelib/devices/vccs/vccsask.c index 2a5b369a4..64eef29af 100644 --- a/src/spicelib/devices/vccs/vccsask.c +++ b/src/spicelib/devices/vccs/vccsask.c @@ -31,6 +31,9 @@ VCCSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue * case VCCS_TRANS: value->rValue = here->VCCScoeff; return (OK); + case VCCS_M: + value->rValue = here->VCCSmValue; + return (OK); case VCCS_POS_NODE: value->iValue = here->VCCSposNode; return (OK); From 00d08874a06b38249b39431071aea1d29b6567f7 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 30 May 2013 12:05:46 +0200 Subject: [PATCH 134/257] inpcom.c, execute inp_fix_for_numparam() just once when call_depth == 0 --- src/frontend/inpcom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 5316b6ba6..53c6d6478 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -711,11 +711,11 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile working = cc->li_next; - inp_fix_for_numparam(working); - inp_remove_excess_ws(working); - if (call_depth == 0) { + inp_fix_for_numparam(working); + inp_remove_excess_ws(working); + comment_out_unused_subckt_models(working, line_number); line_number = inp_split_multi_param_lines(working, line_number); From e93d0895ab1aa5443a29f5aa492e8d9e0c7e7aa1 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 30 May 2013 12:48:51 +0200 Subject: [PATCH 135/257] inpcom.c, rewrite subckt_w_params business --- src/frontend/inpcom.c | 88 +++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 32 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 53c6d6478..4489fb52a 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -48,8 +48,10 @@ static struct library { static int num_libraries; -static char *subckt_w_params[N_SUBCKT_W_PARAMS]; -static int num_subckt_w_params; +struct names { + char *names[N_SUBCKT_W_PARAMS]; + int num_names; +}; struct function_env { @@ -82,15 +84,15 @@ static char *readline(FILE *fd); static int get_number_terminals(char *c); static void inp_stripcomments_deck(struct line *deck); static void inp_stripcomments_line(char *s); -static void inp_fix_for_numparam(struct line *deck); +static void inp_fix_for_numparam(struct names *subckt_w_params, struct line *deck); static void inp_remove_excess_ws(struct line *deck); static void expand_section_references(struct line *deck, int call_depth, char *dir_name); static void inp_grab_func(struct function_env *, struct line *deck); -static void inp_fix_inst_calls_for_numparam(struct line *deck); +static void inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck); static void inp_expand_macros_in_func(struct function_env *); static struct line *inp_expand_macros_in_deck(struct function_env *, struct line *deck); static void inp_fix_param_values(struct line *deck); -static void inp_reorder_params(struct line *deck, struct line *list_head, struct line *end); +static void inp_reorder_params(struct names *subckt_w_params, struct line *deck, struct line *list_head, struct line *end); static int inp_split_multi_param_lines(struct line *deck, int line_number); static void inp_sort_params(struct line *start_card, struct line *end_card, struct line *card_bf_start, struct line *s_c, struct line *e_c); static char *inp_remove_ws(char *s); @@ -239,6 +241,23 @@ read_a_lib(char *y, int call_depth, char *dir_name) } +static struct names * +new_names(void) +{ + struct names *p = TMALLOC(struct names, 1); + p -> num_names = 0; + + return p; +} + + +static void +delete_names(struct names *p) +{ + tfree(p); +} + + /*------------------------------------------------------------------------- Read the entire input file and return a pointer to the first line of the linked list of 'card' records in data. The pointer is stored in @@ -306,7 +325,6 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile bool found_end = FALSE, shell_eol_continuation = FALSE; if (call_depth == 0) { - num_subckt_w_params = 0; num_libraries = 0; global = NULL; found_end = FALSE; @@ -713,7 +731,9 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile if (call_depth == 0) { - inp_fix_for_numparam(working); + struct names *subckt_w_params = new_names(); + + inp_fix_for_numparam(subckt_w_params, working); inp_remove_excess_ws(working); comment_out_unused_subckt_models(working, line_number); @@ -731,8 +751,12 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile for (newcard = working; newcard; newcard = newcard->li_next) end = newcard; - inp_reorder_params(working, cc, end); - inp_fix_inst_calls_for_numparam(working); + inp_reorder_params(subckt_w_params, working, cc, end); + inp_fix_inst_calls_for_numparam(subckt_w_params, working); + + delete_names(subckt_w_params); + subckt_w_params = NULL; + inp_fix_gnd_name(working); inp_chk_for_multi_in_vcvs(working, &line_number); @@ -1967,32 +1991,32 @@ inp_change_quotes(char *s) static void -new_subckt_w_params(char *str) +add_name(struct names *p, char *name) { - if (num_subckt_w_params >= N_SUBCKT_W_PARAMS) { + if (p->num_names >= N_SUBCKT_W_PARAMS) { fprintf(stderr, "ERROR, N_SUBCKT_W_PARMS overflow\n"); controlled_exit(EXIT_FAILURE); } - subckt_w_params[num_subckt_w_params++] = str; + p->names[p->num_names++] = name; } static char ** -find_subckt_w_params(char *subckt_name) +find_name(struct names *p, char *name) { int i; - for (i = 0; i < num_subckt_w_params; i++) - if (strcmp(subckt_w_params[i], subckt_name) == 0) - return & subckt_w_params[i]; + for (i = 0; i < p->num_names; i++) + if (strcmp(p->names[i], name) == 0) + return & p->names[i]; return NULL; } static char* -inp_fix_subckt(char *s) +inp_fix_subckt(struct names *subckt_w_params, char *s) { struct line *head = NULL, *newcard = NULL, *start_card = NULL, *end_card = NULL, *prev_card = NULL, *c = NULL; char *equal, *beg, *buffer, *ptr1, *ptr2, *str, *new_str = NULL; @@ -2007,7 +2031,7 @@ inp_fix_subckt(char *s) for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2) && !isquote(*ptr2); ptr2++) ; - new_subckt_w_params(copy_substring(ptr1, ptr2)); + add_name(subckt_w_params, copy_substring(ptr1, ptr2)); /* go to beginning of first parameter word */ /* s will contain only subckt definition */ @@ -2211,7 +2235,7 @@ inp_remove_ws(char *s) No changes to lines in .control section ! */ static void -inp_fix_for_numparam(struct line *c) +inp_fix_for_numparam(struct names *subckt_w_params, struct line *c) { bool found_control = FALSE; @@ -2238,7 +2262,7 @@ inp_fix_for_numparam(struct line *c) } if (ciprefix(".subckt", c->li_line)) - c->li_line = inp_fix_subckt(c->li_line); + c->li_line = inp_fix_subckt(subckt_w_params, c->li_line); } } @@ -2517,7 +2541,7 @@ found_mult_param(int num_params, char *param_names[]) Function is called from inp_fix_inst_calls_for_numparam()*/ static int -inp_fix_subckt_multiplier(struct line *subckt_card, +inp_fix_subckt_multiplier(struct names *subckt_w_params, struct line *subckt_card, int num_subckt_params, char *subckt_param_names[], char *subckt_param_values[]) { struct line *card; @@ -2530,7 +2554,7 @@ inp_fix_subckt_multiplier(struct line *subckt_card, if (!strstr(subckt_card->li_line, "params:")) { new_str = TMALLOC(char, strlen(subckt_card->li_line) + 13); sprintf(new_str, "%s params: m=1", subckt_card->li_line); - new_subckt_w_params(get_subckt_model_name(subckt_card->li_line)); + add_name(subckt_w_params, get_subckt_model_name(subckt_card->li_line)); } else { new_str = TMALLOC(char, strlen(subckt_card->li_line) + 5); sprintf(new_str, "%s m=1", subckt_card->li_line); @@ -2561,7 +2585,7 @@ inp_fix_subckt_multiplier(struct line *subckt_card, static void -inp_fix_inst_calls_for_numparam(struct line *deck) +inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck) { struct line *c; struct line *d, *p = NULL; @@ -2612,7 +2636,7 @@ inp_fix_inst_calls_for_numparam(struct line *deck) num_subckt_params = inp_get_params(p->li_line, subckt_param_names, subckt_param_values); if (num_subckt_params == 0 || !found_mult_param(num_subckt_params, subckt_param_names)) - inp_fix_subckt_multiplier(p, num_subckt_params, subckt_param_names, subckt_param_values); + inp_fix_subckt_multiplier(subckt_w_params, p, num_subckt_params, subckt_param_names, subckt_param_values); } } tfree(subckt_name); @@ -2639,7 +2663,7 @@ inp_fix_inst_calls_for_numparam(struct line *deck) if (ciprefix("x", inst_line)) { subckt_name = inp_get_subckt_name(inst_line); - if (find_subckt_w_params(subckt_name)) { + if (find_name(subckt_w_params, subckt_name)) { sprintf(name_w_space, "%s ", subckt_name); /* find .subckt line */ @@ -3776,7 +3800,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car static void -inp_add_params_to_subckt(struct line *subckt_card) +inp_add_params_to_subckt(struct names *subckt_w_params, struct line *subckt_card) { struct line *card = subckt_card->li_next; char *curr_line = card->li_line; @@ -3794,7 +3818,7 @@ inp_add_params_to_subckt(struct line *subckt_card) subckt_name = skip_non_ws(subckt_card->li_line); subckt_name = skip_ws(subckt_name); end_ptr = skip_non_ws(subckt_name); - new_subckt_w_params(copy_substring(subckt_name, end_ptr)); + add_name(subckt_w_params, copy_substring(subckt_name, end_ptr)); } else { new_line = TMALLOC(char, strlen(subckt_line) + strlen(param_ptr) + 2); sprintf(new_line, "%s %s", subckt_line, param_ptr); @@ -3827,7 +3851,7 @@ inp_add_params_to_subckt(struct line *subckt_card) */ static struct line * -inp_reorder_params_subckt(struct line *subckt_card) +inp_reorder_params_subckt(struct names *subckt_w_params, struct line *subckt_card) { struct line *first_param_card = NULL; struct line *last_param_card = NULL; @@ -3846,7 +3870,7 @@ inp_reorder_params_subckt(struct line *subckt_card) } if (ciprefix(".subckt", curr_line)) { - prev_card = inp_reorder_params_subckt(c); + prev_card = inp_reorder_params_subckt(subckt_w_params, c); c = prev_card->li_next; continue; } @@ -3854,7 +3878,7 @@ inp_reorder_params_subckt(struct line *subckt_card) if (ciprefix(".ends", curr_line)) { if (first_param_card) { inp_sort_params(first_param_card, last_param_card, subckt_card, subckt_card, c); - inp_add_params_to_subckt(subckt_card); + inp_add_params_to_subckt(subckt_w_params, subckt_card); } return c; } @@ -3884,7 +3908,7 @@ inp_reorder_params_subckt(struct line *subckt_card) static void -inp_reorder_params(struct line *deck, struct line *list_head, struct line *end) +inp_reorder_params(struct names *subckt_w_params, struct line *deck, struct line *list_head, struct line *end) { struct line *first_param_card = NULL; struct line *last_param_card = NULL; @@ -3903,7 +3927,7 @@ inp_reorder_params(struct line *deck, struct line *list_head, struct line *end) } if (ciprefix(".subckt", curr_line)) { - prev_card = inp_reorder_params_subckt(c); + prev_card = inp_reorder_params_subckt(subckt_w_params, c); c = prev_card->li_next; continue; } From 5702179a2ffced3f4a8f1c79d7bc0d72549bdfad Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 30 May 2013 20:11:29 +0200 Subject: [PATCH 136/257] inpcom.c, get rid of the global `global' --- src/frontend/inpcom.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 4489fb52a..2db604fb0 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -67,8 +67,6 @@ struct function_env }; -static char *global; - static COMPATMODE_T inp_compat_mode; /* Collect information for dynamic allocation of numparam arrays */ @@ -326,7 +324,6 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile if (call_depth == 0) { num_libraries = 0; - global = NULL; found_end = FALSE; inp_compat_mode = ngspice_compat_mode(); } @@ -602,14 +599,10 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile if (call_depth == 0 && found_end == TRUE) { struct line *prev; - if (global == NULL) { - global = TMALLOC(char, strlen(".global gnd") + 1); - sprintf(global, ".global gnd"); - } global_card = alloc(struct line); global_card->li_error = NULL; global_card->li_actual = NULL; - global_card->li_line = global; + global_card->li_line = copy(".global gnd"); global_card->li_linenum = 1; prev = cc->li_next; From 9613368c295db6b336c820f2bd101eec46d44f50 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 30 May 2013 17:08:26 +0200 Subject: [PATCH 137/257] inpcom.c, drop variable `prev' --- src/frontend/inpcom.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 2db604fb0..86cf3570d 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -598,16 +598,14 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile return NULL; if (call_depth == 0 && found_end == TRUE) { - struct line *prev; global_card = alloc(struct line); global_card->li_error = NULL; global_card->li_actual = NULL; global_card->li_line = copy(".global gnd"); global_card->li_linenum = 1; - prev = cc->li_next; + global_card->li_next = cc->li_next; cc->li_next = global_card; - global_card->li_next = prev; if (inp_compat_mode == COMPATMODE_ALL || inp_compat_mode == COMPATMODE_HS || From 78862223e4e1dac30183b10a54c2f34568f6c11d Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 30 May 2013 20:12:30 +0200 Subject: [PATCH 138/257] inpcom.c, local scope for `global_card' --- src/frontend/inpcom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 86cf3570d..64aeb877d 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -300,7 +300,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile intfile: in, TRUE if deck is generated from internal circarray */ { - struct line *end = NULL, *cc = NULL, *prev, *working, *newcard, *global_card; + struct line *end = NULL, *cc = NULL, *prev, *working, *newcard; char *buffer = NULL, c; /* segfault fix */ #ifdef XSPICE @@ -598,7 +598,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile return NULL; if (call_depth == 0 && found_end == TRUE) { - global_card = alloc(struct line); + struct line *global_card = alloc(struct line); global_card->li_error = NULL; global_card->li_actual = NULL; global_card->li_line = copy(".global gnd"); From 2db5f0145d7ab9f449d83c549fa5f5ea417d9747 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 30 May 2013 17:21:16 +0200 Subject: [PATCH 139/257] inpcom.c, local scope for `str' --- src/frontend/inpcom.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 64aeb877d..072615fbc 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2010,7 +2010,7 @@ static char* inp_fix_subckt(struct names *subckt_w_params, char *s) { struct line *head = NULL, *newcard = NULL, *start_card = NULL, *end_card = NULL, *prev_card = NULL, *c = NULL; - char *equal, *beg, *buffer, *ptr1, *ptr2, *str, *new_str = NULL; + char *equal, *beg, *buffer, *ptr1, *ptr2, *new_str = NULL; char keep; int num_params = 0, i = 0, bracedepth = 0; /* find first '=' */ @@ -2073,9 +2073,8 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) } newcard = alloc(struct line); - str = strdup(ptr1); - newcard->li_line = str; + newcard->li_line = strdup(ptr1); newcard->li_next = NULL; if (start_card == NULL) @@ -2111,9 +2110,8 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) beg = p1; newcard = alloc(struct line); - str = buf; - newcard->li_line = str; + newcard->li_line = buf; newcard->li_next = NULL; if (start_card == NULL) @@ -2141,7 +2139,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) if (new_str == NULL) { new_str = strdup(c->li_line); } else { - str = new_str; + char *str = new_str; new_str = TMALLOC(char, strlen(str) + strlen(c->li_line) + 2); sprintf(new_str, "%s %s", str, c->li_line); tfree(str); From 997e58a142feddd5f8f6f38a17abf11b8304303f Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 30 May 2013 17:24:09 +0200 Subject: [PATCH 140/257] inpcom.c, reorder some stamtements --- src/frontend/inpcom.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 072615fbc..d04940477 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2139,10 +2139,10 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) if (new_str == NULL) { new_str = strdup(c->li_line); } else { - char *str = new_str; - new_str = TMALLOC(char, strlen(str) + strlen(c->li_line) + 2); - sprintf(new_str, "%s %s", str, c->li_line); - tfree(str); + char *x = TMALLOC(char, strlen(new_str) + strlen(c->li_line) + 2); + sprintf(x, "%s %s", new_str, c->li_line); + tfree(new_str); + new_str = x; } tfree(c->li_line); head = c; From b68bca464fa8b16d1498cc5e2c5862ad85b1cc5a Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 30 May 2013 21:15:44 +0200 Subject: [PATCH 141/257] subckt.c: MOS model in subckt w/o L, W --- src/frontend/subckt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/subckt.c b/src/frontend/subckt.c index 032c93e30..1b4dfd5f9 100644 --- a/src/frontend/subckt.c +++ b/src/frontend/subckt.c @@ -1968,7 +1968,7 @@ devmodtranslate(struct line *deck, char *subname, wordlist * const submod) name = gettok(&t); found = 0; - while (*t && !found) { + while (!found) { /* Now, is this a subcircuit model? */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { /* FIXME, probably too unspecific */ From 39ec824e1f835d2238df679191de7587a8977783 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Thu, 30 May 2013 23:48:24 +0200 Subject: [PATCH 142/257] subckt.c: prevent crash if 5/6 MOS nodes w/o L, W --- src/frontend/subckt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/frontend/subckt.c b/src/frontend/subckt.c index 1b4dfd5f9..278f510d6 100644 --- a/src/frontend/subckt.c +++ b/src/frontend/subckt.c @@ -1995,6 +1995,10 @@ devmodtranslate(struct line *deck, char *subname, wordlist * const submod) (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok(&t); + if (name == NULL) { + name = copy(""); /* allow 'tfree' */ + break; + } } } /* while */ From 9bb4f5ee4d4dd641df81623afbc1f5a408f97126 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 31 May 2013 14:19:05 +0200 Subject: [PATCH 143/257] pwr - a signed power implementaion for controlled sources --- src/include/ngspice/inpptree.h | 9 ++--- src/spicelib/parser/ifeval.c | 1 + src/spicelib/parser/inpptree.c | 65 +++++++++++++++++++++++++++++++--- src/spicelib/parser/inpxx.h | 1 + src/spicelib/parser/ptfuncs.c | 9 +++++ 5 files changed, 76 insertions(+), 9 deletions(-) diff --git a/src/include/ngspice/inpptree.h b/src/include/ngspice/inpptree.h index 53781d2af..77804890d 100644 --- a/src/include/ngspice/inpptree.h +++ b/src/include/ngspice/inpptree.h @@ -123,10 +123,11 @@ void INPptPrint(char *str, IFparseTree * ptree); #define PTF_GE0 28 #define PTF_LE0 29 #define PTF_POW 30 -#define PTF_MIN 31 -#define PTF_MAX 32 -#define PTF_CEIL 33 -#define PTF_FLOOR 34 +#define PTF_PWR 31 +#define PTF_MIN 32 +#define PTF_MAX 33 +#define PTF_CEIL 34 +#define PTF_FLOOR 35 /* The following things are used by the parser -- these are the token types the * lexer returns. diff --git a/src/spicelib/parser/ifeval.c b/src/spicelib/parser/ifeval.c index e3fcca3da..416ae1091 100644 --- a/src/spicelib/parser/ifeval.c +++ b/src/spicelib/parser/ifeval.c @@ -94,6 +94,7 @@ PTeval(INPparseNode * tree, double gmin, double *res, double *vals) switch(tree->funcnum) { case PTF_POW: + case PTF_PWR: case PTF_MIN: case PTF_MAX: err = PTeval(tree->left->left, gmin, &r1, vals); diff --git a/src/spicelib/parser/inpptree.c b/src/spicelib/parser/inpptree.c index 0e1af9648..0890f52a9 100644 --- a/src/spicelib/parser/inpptree.c +++ b/src/spicelib/parser/inpptree.c @@ -30,6 +30,7 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum); static void free_tree(INPparseNode *); +static void printTree(INPparseNode *); /* * LAW for INPparseNode* generator and consumer functions: @@ -167,6 +168,7 @@ static struct func { { "ge0", PTF_GE0, (void(*)(void)) PTge0}, { "le0", PTF_LE0, (void(*)(void)) PTle0}, { "pow", PTF_POW, (void(*)(void)) PTpower}, + { "pwr", PTF_PWR, (void(*)(void)) PTpwr}, { "min", PTF_MIN, (void(*)(void)) PTmin}, { "max", PTF_MAX, (void(*)(void)) PTmax}, } ; @@ -523,8 +525,6 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum) INPparseNode *b = p->left->right; int comparison = (p->funcnum == PTF_MIN) ? PTF_LT0 : PTF_GT0; #ifdef TRACE - extern void printTree(INPparseNode *); - printf("debug: %s, PTF_MIN: ", __func__); printTree(p); printf("\n"); @@ -568,6 +568,11 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum) mkb(PT_POWER, p->left->left, mkcon(p->left->right->constant - 1))), arg1); +#ifdef TRACE + printf("pow, %s, returns; ", __func__); + printTree(newp); + printf("\n"); +#endif } else { /* * D(f^g) = D(exp(g*ln(f))) @@ -587,6 +592,59 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum) return mkfirst(newp, p); } + break; + + case PTF_PWR: + { + /* + pwr(a,b) + p->left: ',' p->left->left: a p->left->right: b + */ + + if (p->left->right->type == PT_CONSTANT) { + /* + * f(a,b) = signum(a) * abs(a)^b + * D(f(a,b)) = signum(a) * abs(a)^b * b / a + * + */ + arg1 = PTdifferentiate(p->left->left, varnum); + + newp = mkb(PT_TIMES, + mkf(PTF_SGN, p->left->left), + mkb(PT_DIVIDE, mkb(PT_TIMES, + mkcon(p->left->right->constant), + mkb(PT_POWER, + mkf(PTF_ABS, p->left->left), + mkcon(p->left->right->constant))), + p->left->left)); +#ifdef TRACE + printf("pwr, %s, returns; ", __func__); + printTree(newp); + printf("\n"); +#endif + } else { + /* + * f(g) = signum(a) * abs(a)^g + * D(f^g) = signum(a) * D(exp(g*ln(f))) + * = signum(a) * exp(g*ln(f)) * D(g*ln(f)) + * = signum(a) * exp(g*ln(f)) * (D(g)*ln(f) + g*D(f)/f) + */ + arg1 = PTdifferentiate(p->left->left, varnum); + arg2 = PTdifferentiate(p->left->right, varnum); + + newp = mkb(PT_TIMES, + mkf(PTF_SGN, p->left->left), + mkb(PT_TIMES, mkf(PTF_EXP, mkb(PT_TIMES, + p->left->right, mkf(PTF_LN, + p->left->left))), + mkb(PT_PLUS, + mkb(PT_TIMES, p->left->right, + mkb(PT_DIVIDE, arg1, p->left->left)), + mkb(PT_TIMES, arg2, mkf(PTF_LN, p->left->left))))); + } + return mkfirst(newp, p); + } + default: fprintf(stderr, "Internal Error: bad function # %d\n", p->funcnum); @@ -1387,8 +1445,6 @@ void free_tree(INPparseNode *pt) /* Debugging stuff. */ -void printTree(INPparseNode *); - void INPptPrint(char *str, IFparseTree * ptree) { int i; @@ -1467,7 +1523,6 @@ void printTree(INPparseNode * pt) printf(")"); break; - case PT_COMMA: printf("("); printTree(pt->left); diff --git a/src/spicelib/parser/inpxx.h b/src/spicelib/parser/inpxx.h index 1a26ed4a1..491e3b42c 100644 --- a/src/spicelib/parser/inpxx.h +++ b/src/spicelib/parser/inpxx.h @@ -43,6 +43,7 @@ double PTminus(double arg1, double arg2); double PTtimes(double arg1, double arg2); double PTdivide(double arg1, double arg2); double PTpower(double arg1, double arg2); +double PTpwr(double arg1, double arg2); double PTacos(double arg); double PTacosh(double arg); double PTasin(double arg); diff --git a/src/spicelib/parser/ptfuncs.c b/src/spicelib/parser/ptfuncs.c index 9ff1dbcb8..2eef347c1 100644 --- a/src/spicelib/parser/ptfuncs.c +++ b/src/spicelib/parser/ptfuncs.c @@ -83,6 +83,15 @@ PTpower(double arg1, double arg2) return (pow(arg1, arg2)); } +double +PTpwr(double arg1, double arg2) +{ + if (arg1 < 0.0) + return (-pow(-arg1, arg2)); + else + return (pow(arg1, arg2)); +} + double PTmin(double arg1, double arg2) { From 6c4338b9e094297ec33b29f12eb8829bd96fdc88 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 1 Jun 2013 19:06:17 +0200 Subject: [PATCH 144/257] inp.c, inpcom.c: a very basic IF-ELSE block --- src/frontend/inp.c | 71 +++++++++++++++++++++++++++++++++++++++++++ src/frontend/inpcom.c | 32 +++++++++++++++++-- 2 files changed, 101 insertions(+), 2 deletions(-) diff --git a/src/frontend/inp.c b/src/frontend/inp.c index 551d3c4b9..8928e3f93 100644 --- a/src/frontend/inp.c +++ b/src/frontend/inp.c @@ -50,6 +50,7 @@ static char *upper(register char *string); static bool doedit(char *filename); static struct line *com_options = NULL; static void cktislinear(CKTcircuit *ckt, struct line *deck); +static void dotifeval(struct line *deck); void line_free_x(struct line *deck, bool recurse); void create_circbyline(char *line); @@ -547,6 +548,9 @@ inp_spsource(FILE *fp, bool comfile, char *filename, bool intfile) } } + /* handle .if ... .elseif ... .else ... .endif statements. */ + dotifeval(deck); + /*merge the two option line structs*/ if (!options && com_options) options = com_options; @@ -1199,3 +1203,70 @@ com_circbyline(wordlist *wl) char *newline = wl_flatten(wl); create_circbyline(newline); } + +/* handle .if('expr') ... .elseif('expr') ... .else ... .endif statements. + numparam has evaluated .if('boolean expression') to + .if ( 1.000000000e+000 ) or .elseif ( 0.000000000e+000 ) */ +static void +dotifeval(struct line *deck) +{ + int iftrue = 0, elseiftrue = 0, elsetrue = 0, iffound = 0, elseiffound = 0, elsefound = 0; + struct line *dd; + char *dottoken; + char *s, *t; + + for (dd = deck; dd; dd = dd->li_next) { + + s = t = dd->li_line; + + if (*s == '*') + continue; + + dottoken = gettok(&t); + /* find '.if' and read its parameter */ + if (cieq(dottoken, ".if")) { + elsefound = 0; + elseiffound = 0; + iffound = 1; + *s = '*'; + s = dd->li_line + 3; + iftrue = atoi(s); + } + else if (cieq(dottoken, ".elseif")) { + elsefound = 0; + elseiffound = 1; + iffound = 0; + *s = '*'; + if (!iftrue) { + s = dd->li_line + 7; + elseiftrue = atoi(s); + } + } + else if (cieq(dottoken, ".else")) { + elsefound = 1; + elseiffound = 0; + iffound = 0; + if (!iftrue && !elseiftrue) + elsetrue = 1; + *s = '*'; + } + else if (cieq(dottoken, ".endif")) { + elsefound = elseiffound = iffound = 0; + elsetrue = elseiftrue = iftrue = 0; + *s = '*'; +// inp_subcktexpand(dd); + } + else { + if (iffound && !iftrue) { + *s = '*'; + } + else if (elseiffound && !elseiftrue) { + *s = '*'; + } + else if (elsefound && !elsetrue) { + *s = '*'; + } + } + tfree(dottoken); + } +} diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d04940477..d3ceac8ac 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -96,6 +96,7 @@ static void inp_sort_params(struct line *start_card, struct line *end_card, stru static char *inp_remove_ws(char *s); static void inp_compat(struct line *deck); static void inp_bsource_compat(struct line *deck); +static void inp_dot_if(struct line *deck); static bool chk_for_line_continuation(char *line); static void comment_out_unused_subckt_models(struct line *start_card, int no_of_lines); @@ -733,7 +734,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile inp_fix_macro_param_func_paren_io(working); inp_fix_ternary_operator(working); -//tprint(working); + inp_expand_macros_in_deck(NULL, working); inp_fix_param_values(working); @@ -741,8 +742,9 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile be correct at this point */ for (newcard = working; newcard; newcard = newcard->li_next) end = newcard; - +// tprint(cc); inp_reorder_params(subckt_w_params, working, cc, end); + inp_fix_inst_calls_for_numparam(subckt_w_params, working); delete_names(subckt_w_params); @@ -764,6 +766,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile working = cc->li_next; /* B source numparam compatibility transformation */ inp_bsource_compat(working); + inp_dot_if(working); } inp_add_series_resistor(working); @@ -5700,3 +5703,28 @@ tprint(struct line *t) fprintf(fd, "%d %d %s\n", t->li_linenum_orig, t->li_linenum, t->li_line); fclose(fd); } + +/* prepare .if and .elseif for numparam + .if(expression) --> .if{expression} */ +static void +inp_dot_if(struct line *deck) +{ + struct line *card; + + for (card = deck; card; card = card->li_next) { + char *curr_line = card->li_line; + if (*curr_line == '*') + continue; + if (ciprefix(".if", curr_line) || ciprefix(".elseif", curr_line)) { + char* firstbr = strchr(curr_line, '('); + char* lastbr = strrchr(curr_line, ')'); + if ((!firstbr) || (!lastbr)) { + fprintf(cp_err, "Error in netlist line %d\n", card->li_linenum_orig); + fprintf(cp_err, " Bad syntax: %s\n\n", curr_line); + controlled_exit(EXIT_BAD); + } + *firstbr = '{'; + *lastbr = '}'; + } + } +} From 01fe243032a3957ef8489899fb5f8e56aa2f0b15 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 2 Jun 2013 12:03:07 +0200 Subject: [PATCH 145/257] inpcom.c: multiplier m for behavioral g source --- src/frontend/inpcom.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d3ceac8ac..1444be05d 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -4487,6 +4487,8 @@ inp_compat(struct line *card) BGxxx int1 0 V = {equation} */ if ((str_ptr = strstr(curr_line, "cur")) != NULL) { + char *m_ptr, *m_token; + int m_len = 0; cut_line = curr_line; /* title and nodes */ title_tok = gettok(&cut_line); @@ -4498,12 +4500,23 @@ inp_compat(struct line *card) fprintf(stderr, "ERROR: mal formed G line: %s\n", curr_line); controlled_exit(EXIT_FAILURE); } + /* find multiplier m at end of line */ + m_ptr = strstr(cut_line, "m="); + if (m_ptr) { + m_token = copy(m_ptr); + *m_ptr = '\0'; + } + else + m_token = copy("1"); + m_len = strlen(m_token); // Gxxx n1 n2 int1 0 1 + // or + // Gxxx n1 n2 int1 0 m='expr' xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) - + 20 - 4*2 + 1; + + 20 - 4*2 + m_len; ckt_array[0] = TMALLOC(char, xlen); - sprintf(ckt_array[0], "%s %s %s %s_int1 0 1", - title_tok, node1, node2, title_tok); + sprintf(ckt_array[0], "%s %s %s %s_int1 0 %s", + title_tok, node1, node2, title_tok, m_token); // BGxxx int1 0 V = {equation} xlen = 2*strlen(title_tok) + strlen(str_ptr) + 20 - 3*2 + 1; @@ -4537,6 +4550,7 @@ inp_compat(struct line *card) param_beg = param_end = NULL; tfree(title_tok); + tfree(m_token); tfree(node1); tfree(node2); } From 726162669b4fce771ef89baf43ae1d36c803e50f Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 2 Jun 2013 11:54:11 +0200 Subject: [PATCH 146/257] inpcom.c, local scope for some vars --- src/frontend/inpcom.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 1444be05d..500458b17 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -302,7 +302,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile */ { struct line *end = NULL, *cc = NULL, *prev, *working, *newcard; - char *buffer = NULL, c; + char *buffer = NULL; /* segfault fix */ #ifdef XSPICE char big_buff[5000]; @@ -313,14 +313,9 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile #endif char *new_title = NULL; int line_number = 1; /* sjb - renamed to avoid confusion with struct line */ - int line_number_orig = 1, line_number_inc = 1; - unsigned int no_braces = 0; /* number of '{' */ + int line_number_orig = 1; int cirlinecount = 0; /* length of circarray */ - size_t max_line_length = 0; /* max. line length in input deck */ - - struct line *tmp_ptr1 = NULL; - bool found_end = FALSE, shell_eol_continuation = FALSE; if (call_depth == 0) { @@ -514,9 +509,9 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile end->li_line = copy(buffer); end->li_linenum = end->li_linenum_orig = line_number++; if (newcard) { + int line_number_inc = 1; end->li_next = newcard; /* Renumber the lines */ - line_number_inc = 1; for (end = newcard; end && end->li_next; end = end->li_next) { end->li_linenum = line_number++; end->li_linenum_orig = line_number_inc++; @@ -655,7 +650,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile prev = NULL; while (working) { - char *s; + char *s, c; for (s = working->li_line; (c = *s) != '\0' && c <= ' '; s++) ; @@ -723,6 +718,11 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile if (call_depth == 0) { + unsigned int no_braces; /* number of '{' */ + size_t max_line_length; /* max. line length in input deck */ + + struct line *tmp_ptr1; + struct names *subckt_w_params = new_names(); inp_fix_for_numparam(subckt_w_params, working); @@ -777,6 +777,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile of parameter substitutions in a line*/ dynmaxline = 0; max_line_length = 0; + no_braces = 0; for (tmp_ptr1 = cc; tmp_ptr1; tmp_ptr1 = tmp_ptr1->li_next) { char *s; unsigned int braces_per_line = 0; From fe92646585cb27579c0502fc6c7e5f7ab8eda073 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 2 Jun 2013 12:17:07 +0200 Subject: [PATCH 147/257] inpcom.c, rewrite deck allocation --- src/frontend/inpcom.c | 388 ++++++++++++++++-------------------------- 1 file changed, 147 insertions(+), 241 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 500458b17..9cff41c68 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -122,6 +122,22 @@ static void inp_poly_err(struct line *deck); #endif +static struct line * +xx_new_line(struct line *next, char *line, int linenum, int linenum_orig) +{ + struct line *x = TMALLOC(struct line, 1); + + x->li_next = next; + x->li_error = NULL; + x->li_actual = NULL; + x->li_line = line; + x->li_linenum = linenum; + x->li_linenum_orig = linenum_orig; + + return x; +} + + static struct library * new_lib(void) { @@ -492,22 +508,20 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* Make the .include a comment */ *buffer = '*'; - /* now check if this is the first pass (i.e. end points to null) */ - if (end) { /* end already exists */ - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* make end point to next card */ - } else { - end = cc = alloc(struct line); /* create the deck & end. cc will - point to beginning of deck, end to - the end */ + /* append `buffer' to the (cc, end) chain of decks */ + { + struct line *x = xx_new_line(NULL, copy(buffer), line_number, line_number); + + if (end) + end->li_next = x; + else + cc = x; + + end = x; + + line_number++; } - /* now fill out rest of struct end. */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = copy(buffer); - end->li_linenum = end->li_linenum_orig = line_number++; if (newcard) { int line_number_inc = 1; end->li_next = newcard; @@ -571,22 +585,17 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile shell_eol_continuation = chk_for_line_continuation(buffer); - /* now check if this is the first pass (i.e. end points to null) */ - if (end) { /* end already exists */ - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* point to next card */ - } else { /* End doesn't exist. Create it. */ - end = cc = alloc(struct line); /* note that cc points to beginning - of deck, end to the end */ + { + struct line *x = xx_new_line(NULL, copy(buffer), line_number++, line_number_orig++); + + if (end) + end->li_next = x; + else + cc = x; + + end = x; } - /* now put buffer into li */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = copy(buffer); - end->li_linenum = line_number++; - end->li_linenum_orig = line_number_orig++; tfree(buffer); } /* end while ((buffer = readline(fp)) != NULL) */ @@ -594,14 +603,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile return NULL; if (call_depth == 0 && found_end == TRUE) { - struct line *global_card = alloc(struct line); - global_card->li_error = NULL; - global_card->li_actual = NULL; - global_card->li_line = copy(".global gnd"); - global_card->li_linenum = 1; - - global_card->li_next = cc->li_next; - cc->li_next = global_card; + cc->li_next = xx_new_line(cc->li_next, copy(".global gnd"), 1, 0); if (inp_compat_mode == COMPATMODE_ALL || inp_compat_mode == COMPATMODE_HS || @@ -618,16 +620,9 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile if (call_depth == 0) { if (found_end == TRUE) { - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* point to next card */ - - /* now put buffer into li */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = copy(".end"); - end->li_linenum = end->li_linenum_orig = line_number++; - end->li_linenum_orig = line_number_orig++; + struct line *x = xx_new_line(NULL, copy(".end"), line_number++, line_number_orig++); + end->li_next = x; + end = x; } } @@ -691,13 +686,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile end->li_next = working; tfree(s); } else { - newcard = alloc(struct line); - newcard->li_linenum = prev->li_linenum; - newcard->li_line = s; - newcard->li_next = working; - newcard->li_error = NULL; - newcard->li_actual = NULL; - prev->li_actual = newcard; + prev->li_actual = xx_new_line(working, s, prev->li_linenum, 0); } working = prev->li_next; break; @@ -956,21 +945,6 @@ inp_fix_gnd_name(struct line *c) } } -static struct line* -create_new_card(char *card_str, int *line_number) -{ - struct line *newcard = alloc(struct line); - - newcard->li_line = strdup(card_str); - newcard->li_linenum = *line_number; - newcard->li_error = NULL; - newcard->li_actual = NULL; - - *line_number += 1; - - return newcard; -} - static void inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) @@ -1061,13 +1035,13 @@ inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) sprintf(big_buf, "%s %%vd[ %s ] %%vd( %s ) %s", model_name, ctrl_node_str, node_str, model_name); - a_card = create_new_card(big_buf, line_number); + a_card = xx_new_line(NULL, copy(big_buf), *(line_number)++, 0); *a_card->li_line = 'a'; sprintf(big_buf, ".model %s multi_input_pwl ( x = [%s %s] y = [%s %s] model = \"%s\" )", model_name, xy_values1[0], xy_values2[0], xy_values1[1], xy_values2[1], fcn_name); - model_card = create_new_card(big_buf, line_number); + model_card = xx_new_line(NULL, copy(big_buf), (*line_number)++, 0); tfree(model_name); tfree(node_str); @@ -1092,7 +1066,7 @@ inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) static void inp_add_control_section(struct line *deck, int *line_number) { - struct line *c, *newcard, *prev_card = NULL; + struct line *c, *prev_card = NULL; bool found_control = FALSE, found_run = FALSE; bool found_end = FALSE; char *op_line = NULL, rawfile[1000], *line; @@ -1115,56 +1089,37 @@ inp_add_control_section(struct line *deck, int *line_number) found_control = FALSE; if (!found_run) { - newcard = create_new_card("run", line_number); - prev_card->li_next = newcard; - newcard->li_next = c; - prev_card = newcard; - found_run = TRUE; + prev_card->li_next = xx_new_line(c, copy("run"), (*line_number)++, 0); + prev_card = prev_card->li_next; + found_run = TRUE; } if (cp_getvar("rawfile", CP_STRING, rawfile)) { line = TMALLOC(char, strlen("write") + strlen(rawfile) + 2); sprintf(line, "write %s", rawfile); - newcard = create_new_card(line, line_number); - prev_card->li_next = newcard; - newcard->li_next = c; - prev_card = newcard; - tfree(line); + prev_card->li_next = xx_new_line(c, line, (*line_number)++, 0); + prev_card = prev_card->li_next; } } prev_card = c; } + // check if need to add control section if (!found_run && found_end) { - prev_card = deck->li_next; - newcard = create_new_card(".endc", line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; + + deck->li_next = xx_new_line(deck->li_next, copy(".endc"), (*line_number)++, 0); if (cp_getvar("rawfile", CP_STRING, rawfile)) { line = TMALLOC(char, strlen("write") + strlen(rawfile) + 2); sprintf(line, "write %s", rawfile); - prev_card = deck->li_next; - newcard = create_new_card(line, line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; - tfree(line); - } - if (op_line != NULL) { - prev_card = deck->li_next; - newcard = create_new_card(op_line, line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; + deck->li_next = xx_new_line(deck->li_next, line, (*line_number)++, 0); } - prev_card = deck->li_next; - newcard = create_new_card("run", line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; + if (op_line) + deck->li_next = xx_new_line(deck->li_next, copy(op_line), (*line_number)++, 0); - prev_card = deck->li_next; - newcard = create_new_card(".control", line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; + deck->li_next = xx_new_line(deck->li_next, copy("run"), (*line_number)++, 0); + + deck->li_next = xx_new_line(deck->li_next, copy(".control"), (*line_number)++, 0); } } @@ -2035,7 +1990,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) beg = skip_back_non_ws(beg); beg[-1] = '\0'; - head = alloc(struct line); + head = xx_new_line(NULL, NULL, 0, 0); /* create list of parameters that need to get sorted */ while (*beg && (ptr1 = strchr(beg, '=')) != NULL) { #ifndef NOBRACE @@ -2076,10 +2031,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) beg = ptr2 + 1; } - newcard = alloc(struct line); - - newcard->li_line = strdup(ptr1); - newcard->li_next = NULL; + newcard = xx_new_line(NULL, strdup(ptr1), 0, 0); if (start_card == NULL) head->li_next = start_card = newcard; @@ -2113,10 +2065,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) buf[buf_idx++] = '\0'; beg = p1; - newcard = alloc(struct line); - - newcard->li_line = buf; - newcard->li_next = NULL; + newcard = xx_new_line(NULL, buf, 0, 0); if (start_card == NULL) head->li_next = start_card = newcard; @@ -4035,17 +3984,14 @@ inp_split_multi_param_lines(struct line *deck, int line_num) } tmp_ptr = card->li_next; for (i = 0; i < counter; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = array[i]; - param_end->li_linenum = line_num++; + struct line *x = xx_new_line(NULL, array[i], line_num++, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current multi-param line *(card->li_line) = '*'; @@ -4261,17 +4207,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable e line *(card->li_line) = '*'; @@ -4323,17 +4266,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable e line *(card->li_line) = '*'; @@ -4453,17 +4393,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable e line *(card->li_line) = '*'; @@ -4528,17 +4465,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable g line *(card->li_line) = '*'; @@ -4643,18 +4577,12 @@ inp_compat(struct line *card) } tc1_ptr = NULL; tc2_ptr = NULL; - new_line = alloc(struct line); - new_line->li_next = NULL; - new_line->li_error = NULL; - new_line->li_actual = NULL; - new_line->li_line = xline; - new_line->li_linenum = 0; + new_line = xx_new_line(card->li_next, xline, 0, 0); + // comment out current old R line *(card->li_line) = '*'; // insert new B source line immediately after current line - tmp_ptr = card->li_next; card->li_next = new_line; - new_line->li_next = tmp_ptr; // point 'card' pointer to the new line card = new_line; tfree(title_tok); @@ -4749,17 +4677,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 3; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable capacitor line *(card->li_line) = '*'; @@ -4864,17 +4789,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 3; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable inductor line *(card->li_line) = '*'; @@ -5038,17 +4960,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (ii = paui; ii < pai; ii++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[ii]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // insert new param lines immediately after current line @@ -5159,17 +5078,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (ii = paui; ii < pai; ii++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[ii]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable capacitor line // *(ckt_array[0]) = '*'; @@ -5237,7 +5153,7 @@ inp_bsource_compat(struct line *card) { char *equal_ptr, *str_ptr, *tmp_char, *new_str, *final_str; char actchar; - struct line *new_line, *tmp_ptr; + struct line *new_line; wordlist *wl = NULL, *wlist = NULL; char buf[512]; size_t i, xlen, ustate = 0; @@ -5489,20 +5405,13 @@ inp_bsource_compat(struct line *card) final_str = TMALLOC(char, xlen); sprintf(final_str, "%s %s", tmp_char, new_str); - new_line = alloc(struct line); - new_line->li_next = NULL; - new_line->li_error = NULL; - new_line->li_actual = NULL; - new_line->li_line = final_str; /* Copy old line numbers into new B source line */ - new_line->li_linenum = card->li_linenum; - new_line->li_linenum_orig = card->li_linenum_orig; + new_line = xx_new_line(card->li_next, final_str, card->li_linenum, card->li_linenum_orig); + // comment out current line (old B source line) *(card->li_line) = '*'; // insert new B source line immediately after current line - tmp_ptr = card->li_next; card->li_next = new_line; - new_line->li_next = tmp_ptr; // point 'card' pointer to the new line card = new_line; @@ -5637,17 +5546,14 @@ inp_add_series_resistor(struct line *deck) /* assemble new L and R lines */ tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current L line *(card->li_line) = '*'; From 9ddf3b468ea40b111a8556abbe950b2304218c94 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 2 Jun 2013 12:33:26 +0200 Subject: [PATCH 148/257] inpcom.c: multiplier m for behavioral g source (cleanup) --- src/frontend/inpcom.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 9cff41c68..96a563c3a 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -4426,7 +4426,6 @@ inp_compat(struct line *card) */ if ((str_ptr = strstr(curr_line, "cur")) != NULL) { char *m_ptr, *m_token; - int m_len = 0; cut_line = curr_line; /* title and nodes */ title_tok = gettok(&cut_line); @@ -4446,12 +4445,11 @@ inp_compat(struct line *card) } else m_token = copy("1"); - m_len = strlen(m_token); // Gxxx n1 n2 int1 0 1 // or // Gxxx n1 n2 int1 0 m='expr' xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) - + 20 - 4*2 + m_len; + + 20 - 4*2 + strlen(m_token); ckt_array[0] = TMALLOC(char, xlen); sprintf(ckt_array[0], "%s %s %s %s_int1 0 %s", title_tok, node1, node2, title_tok, m_token); From 444246a638995f3dfeb6e272b1eeff0d6cc36b1f Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 2 Jun 2013 12:34:04 +0200 Subject: [PATCH 149/257] inpcom.c, drop unused assingment --- src/frontend/inpcom.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 96a563c3a..26f254f6f 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -3982,7 +3982,6 @@ inp_split_multi_param_lines(struct line *deck, int line_num) *end_param = keep; curr_line = end_param; } - tmp_ptr = card->li_next; for (i = 0; i < counter; i++) { struct line *x = xx_new_line(NULL, array[i], line_num++, 0); @@ -4205,7 +4204,6 @@ inp_compat(struct line *card) midline, lnumber + delta, lastlastno); // insert new B source line immediately after current line - tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); @@ -4264,7 +4262,6 @@ inp_compat(struct line *card) title_tok, title_tok, str_ptr); // insert new B source line immediately after current line - tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); @@ -4391,7 +4388,6 @@ inp_compat(struct line *card) midline, lnumber + delta, lastlastno); // insert new B source line immediately after current line - tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); @@ -4461,7 +4457,6 @@ inp_compat(struct line *card) title_tok, title_tok, str_ptr); // insert new B source line immediately after current line - tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); @@ -4673,7 +4668,6 @@ inp_compat(struct line *card) tc1_ptr = NULL; tc2_ptr = NULL; // insert new B source line immediately after current line - tmp_ptr = card->li_next; for (i = 0; i < 3; i++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); @@ -4785,7 +4779,6 @@ inp_compat(struct line *card) tc1_ptr = NULL; tc2_ptr = NULL; // insert new B source line immediately after current line - tmp_ptr = card->li_next; for (i = 0; i < 3; i++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); @@ -4956,7 +4949,6 @@ inp_compat(struct line *card) // remove white spaces card->li_line = inp_remove_ws(curr_line); // insert new B source line immediately after current line - tmp_ptr = card->li_next; for (ii = paui; ii < pai; ii++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); @@ -5074,7 +5066,6 @@ inp_compat(struct line *card) // remove white spaces card->li_line = inp_remove_ws(curr_line); // insert new B source line immediately after current line - tmp_ptr = card->li_next; for (ii = paui; ii < pai; ii++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); @@ -5542,7 +5533,6 @@ inp_add_series_resistor(struct line *deck) sprintf(ckt_array[1], "R%s_intern__ %s_intern__ %s %s", title_tok, node2, node2, rval); /* assemble new L and R lines */ - tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); From 820cfb5c04409b0a727725c16caf19ad4b1679af Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 2 Jun 2013 12:33:04 +0200 Subject: [PATCH 150/257] inpcom.c, rewrite `append' of some decks --- src/frontend/inpcom.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 26f254f6f..f6d39c06f 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -3909,7 +3909,7 @@ inp_reorder_params(struct names *subckt_w_params, struct line *deck, struct line static int inp_split_multi_param_lines(struct line *deck, int line_num) { - struct line *card = deck, *param_end = NULL, *param_beg = NULL, *prev = NULL, *tmp_ptr; + struct line *card = deck, *param_end = NULL, *param_beg = NULL, *prev = NULL; char *curr_line, *equal_ptr, *beg_param, *end_param, *new_line; char *array[5000]; int counter = 0, i; @@ -3995,9 +3995,8 @@ inp_split_multi_param_lines(struct line *deck, int line_num) // comment out current multi-param line *(card->li_line) = '*'; // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -4075,7 +4074,7 @@ inp_compat(struct line *card) char *xline; size_t xlen, i, pai = 0, paui = 0, ii; char *ckt_array[100]; - struct line *new_line, *tmp_ptr; + struct line *new_line; struct line *param_end = NULL, *param_beg = NULL; int skip_control = 0; @@ -4217,9 +4216,8 @@ inp_compat(struct line *card) // comment out current variable e line *(card->li_line) = '*'; // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -4275,9 +4273,8 @@ inp_compat(struct line *card) // comment out current variable e line *(card->li_line) = '*'; // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -4401,9 +4398,8 @@ inp_compat(struct line *card) // comment out current variable e line *(card->li_line) = '*'; // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -4470,9 +4466,8 @@ inp_compat(struct line *card) // comment out current variable g line *(card->li_line) = '*'; // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -4681,9 +4676,8 @@ inp_compat(struct line *card) // comment out current variable capacitor line *(card->li_line) = '*'; // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -4792,9 +4786,8 @@ inp_compat(struct line *card) // comment out current variable inductor line *(card->li_line) = '*'; // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -4961,9 +4954,8 @@ inp_compat(struct line *card) } // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -5079,9 +5071,8 @@ inp_compat(struct line *card) // comment out current variable capacitor line // *(ckt_array[0]) = '*'; // insert new param lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; @@ -5475,7 +5466,7 @@ inp_add_series_resistor(struct line *deck) struct line *card; char *tmp_p, *title_tok, *node1, *node2, *rval = NULL; char *ckt_array[10]; - struct line *tmp_ptr, *param_end = NULL, *param_beg = NULL; + struct line *param_end = NULL, *param_beg = NULL; for (card = deck; card; card = card->li_next) { char *curr_line = card->li_line; @@ -5546,9 +5537,8 @@ inp_add_series_resistor(struct line *deck) // comment out current L line *(card->li_line) = '*'; // insert new new L and R lines immediately after current line - tmp_ptr = card->li_next; + param_end->li_next = card->li_next; card->li_next = param_beg; - param_end->li_next = tmp_ptr; // point 'card' pointer to last in scalar list card = param_end; param_beg = param_end = NULL; From 4cb45122a10244c22685ec272d03952315b743a7 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 2 Jun 2013 13:23:57 +0200 Subject: [PATCH 151/257] inpcom.c: g source fix a bug and add m to TABLE --- src/frontend/inpcom.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index f6d39c06f..e4e4ad05a 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -4303,6 +4303,7 @@ inp_compat(struct line *card) */ if ((str_ptr = strstr(curr_line, "table")) != NULL) { char *expression, *firstno, *ffirstno, *secondno, *midline, *lastno, *lastlastno; + char *m_ptr, *m_token; double fnumber, lnumber, delta; int nerror; cut_line = curr_line; @@ -4311,11 +4312,21 @@ inp_compat(struct line *card) node1 = gettok(&cut_line); node2 = gettok(&cut_line); // Gxxx n1 n2 int1 0 1 + // or + // Gxxx n1 n2 int1 0 m='expr' + /* find multiplier m at end of line */ + m_ptr = strstr(cut_line, "m="); + if (m_ptr) { + m_token = copy(m_ptr+2); //get only the expression + *m_ptr = '\0'; + } + else + m_token = copy("1"); xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) - + 20 - 4*2 + 1; + + 20 - 4*2 + strlen(m_token); ckt_array[0] = TMALLOC(char, xlen); - sprintf(ckt_array[0], "%s %s %s %s_int1 0 1", - title_tok, node1, node2, title_tok); + sprintf(ckt_array[0], "%s %s %s %s_int1 0 %s", + title_tok, node1, node2, title_tok, m_token); // get the expression str_ptr = gettok(&cut_line); /* ignore 'table' */ if (!cieq(str_ptr, "table")) { @@ -4409,6 +4420,7 @@ inp_compat(struct line *card) tfree(title_tok); tfree(node1); tfree(node2); + tfree(m_token); } /* Gxxx n1 n2 CUR = {equation} @@ -4432,7 +4444,7 @@ inp_compat(struct line *card) /* find multiplier m at end of line */ m_ptr = strstr(cut_line, "m="); if (m_ptr) { - m_token = copy(m_ptr); + m_token = copy(m_ptr + 2); //get only the expression *m_ptr = '\0'; } else From 5a63ea3a8d224a06459d3ca96df6ff5827fe9cc1 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 2 Jun 2013 13:29:40 +0200 Subject: [PATCH 152/257] inpcom.c: fix loop index --- src/frontend/inpcom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index e4e4ad05a..be36148eb 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -4955,7 +4955,7 @@ inp_compat(struct line *card) card->li_line = inp_remove_ws(curr_line); // insert new B source line immediately after current line for (ii = paui; ii < pai; ii++) { - struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + struct line *x = xx_new_line(NULL, ckt_array[ii], 0, 0); if (param_end) param_end->li_next = x; From 5f18566dd05b0c7278910e7144e98dc47a34da1f Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 2 Jun 2013 16:22:42 +0200 Subject: [PATCH 153/257] inpcom.c: fix loop index --- src/frontend/inpcom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index be36148eb..e236cbe29 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -5071,7 +5071,7 @@ inp_compat(struct line *card) card->li_line = inp_remove_ws(curr_line); // insert new B source line immediately after current line for (ii = paui; ii < pai; ii++) { - struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + struct line *x = xx_new_line(NULL, ckt_array[ii], 0, 0); if (param_end) param_end->li_next = x; From 8aaa8765a642e82b7bcb5bb8c0260dfd5dad0837 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 2 Jun 2013 16:30:56 +0200 Subject: [PATCH 154/257] inpcom.c, local scope for `newcard' --- src/frontend/inpcom.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index e236cbe29..71fa86a27 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -317,7 +317,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile intfile: in, TRUE if deck is generated from internal circarray */ { - struct line *end = NULL, *cc = NULL, *prev, *working, *newcard; + struct line *end = NULL, *cc = NULL, *prev, *working; char *buffer = NULL; /* segfault fix */ #ifdef XSPICE @@ -449,6 +449,8 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile char *y = NULL; char *s, *t; + struct line *newcard; + inp_stripcomments_line(buffer); s = skip_non_ws(buffer); /* advance past non-space chars */ @@ -729,8 +731,9 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* get end card as last card in list; end card pntr does not appear to always be correct at this point */ - for (newcard = working; newcard; newcard = newcard->li_next) - end = newcard; + if (working) + for (end = working; end->li_next; end = end->li_next) + ; // tprint(cc); inp_reorder_params(subckt_w_params, working, cc, end); @@ -1968,7 +1971,7 @@ find_name(struct names *p, char *name) static char* inp_fix_subckt(struct names *subckt_w_params, char *s) { - struct line *head = NULL, *newcard = NULL, *start_card = NULL, *end_card = NULL, *prev_card = NULL, *c = NULL; + struct line *head = NULL, *start_card = NULL, *end_card = NULL, *prev_card = NULL, *c = NULL; char *equal, *beg, *buffer, *ptr1, *ptr2, *new_str = NULL; char keep; int num_params = 0, i = 0, bracedepth = 0; @@ -2031,14 +2034,14 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) beg = ptr2 + 1; } - newcard = xx_new_line(NULL, strdup(ptr1), 0, 0); + end_card = xx_new_line(NULL, strdup(ptr1), 0, 0); if (start_card == NULL) - head->li_next = start_card = newcard; + head->li_next = start_card = end_card; else - prev_card->li_next = newcard; + prev_card->li_next = end_card; - prev_card = end_card = newcard; + prev_card = end_card; num_params++; } #else @@ -2065,14 +2068,14 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) buf[buf_idx++] = '\0'; beg = p1; - newcard = xx_new_line(NULL, buf, 0, 0); + end_card = xx_new_line(NULL, buf, 0, 0); if (start_card == NULL) - head->li_next = start_card = newcard; + head->li_next = start_card = end_card; else - prev_card->li_next = newcard; + prev_card->li_next = end_card; - prev_card = end_card = newcard; + prev_card = end_card; num_params++; done = TRUE; From c6589b087b7fe5b18c0d2cebb62979ae8a0f9b07 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 2 Jun 2013 18:20:46 +0200 Subject: [PATCH 155/257] correct the pwr derivative --- src/spicelib/parser/inpptree.c | 80 +++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/src/spicelib/parser/inpptree.c b/src/spicelib/parser/inpptree.c index 0890f52a9..3533b7cd5 100644 --- a/src/spicelib/parser/inpptree.c +++ b/src/spicelib/parser/inpptree.c @@ -600,49 +600,69 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum) pwr(a,b) p->left: ',' p->left->left: a p->left->right: b */ - - if (p->left->right->type == PT_CONSTANT) { - /* - * f(a,b) = signum(a) * abs(a)^b - * D(f(a,b)) = signum(a) * abs(a)^b * b / a +#define a p->left->left +#define b p->left->right + if (b->type == PT_CONSTANT) { + /* b is a constant * + * f(a,b) = signum(a) * abs(a)^b + * = signum(a) * exp(b*ln(abs(a))) + * D(f) = signum(a) * D(exp(b*ln(abs(a)))) + * = signum(a) * exp(b*ln(abs(a))) * D(b*ln(abs(a))) + * = signum(a) * abs(a)^b * D(b*ln(abs(a))) + * = signum(a) * abs(a)^b * b * 1/abs(a) * D(abs(a)) + * = signum(a) * abs(a)^(b-1) * b * D(abs(a)) + * = signum(a) * abs(a)^(b-1) * b * signum(a) * D(a) + * = abs(a)^(b-1) * b * D(a) */ - arg1 = PTdifferentiate(p->left->left, varnum); + arg1 = PTdifferentiate(a, varnum); newp = mkb(PT_TIMES, - mkf(PTF_SGN, p->left->left), - mkb(PT_DIVIDE, mkb(PT_TIMES, - mkcon(p->left->right->constant), - mkb(PT_POWER, - mkf(PTF_ABS, p->left->left), - mkcon(p->left->right->constant))), - p->left->left)); + mkb(PT_TIMES, + mkcon(b->constant), + mkb(PT_POWER, + mkf(PTF_ABS, a), + mkcon(b->constant - 1.0))), + arg1); #ifdef TRACE printf("pwr, %s, returns; ", __func__); printTree(newp); printf("\n"); #endif } else { - /* - * f(g) = signum(a) * abs(a)^g - * D(f^g) = signum(a) * D(exp(g*ln(f))) - * = signum(a) * exp(g*ln(f)) * D(g*ln(f)) - * = signum(a) * exp(g*ln(f)) * (D(g)*ln(f) + g*D(f)/f) + /* b is a function + * + * f(a,b) = signum(a) * abs(a)^b + * = signum(a) * exp(b*ln(abs(a))) + * D(f) = signum(a) * D(exp(b*ln(abs(a)))) + * = signum(a) * exp(b*ln(abs(a))) * D(b*ln(abs(a))) + * = signum(a) * exp(b*ln(abs(a))) * (D(b) * ln(abs(a)) + b * D(ln(abs(a)))) + * = signum(a) * exp(b*ln(abs(a))) * (D(b) * ln(abs(a)) + b * 1/abs(a) * D(abs(a))) + * = signum(a) * exp(b*ln(abs(a))) * (D(b) * ln(abs(a)) + b * 1/abs(a) * signum(a)*D(a)) + * = signum(a) * exp(b*ln(abs(a))) * (D(b) * ln(abs(a)) + b/a*D(a)) + * = signum(a) * exp(b*ln(abs(a))) * D(b) * ln(abs(a) + signum(a) * exp(b*ln(abs(a))) / a * b * D(a) + * = signum(a) * exp(b*ln(abs(a))) * D(b) * ln(abs(a) + abs(a)^(b-1) * b * D(a) */ - arg1 = PTdifferentiate(p->left->left, varnum); - arg2 = PTdifferentiate(p->left->right, varnum); - - newp = mkb(PT_TIMES, - mkf(PTF_SGN, p->left->left), - mkb(PT_TIMES, mkf(PTF_EXP, mkb(PT_TIMES, - p->left->right, mkf(PTF_LN, - p->left->left))), - mkb(PT_PLUS, - mkb(PT_TIMES, p->left->right, - mkb(PT_DIVIDE, arg1, p->left->left)), - mkb(PT_TIMES, arg2, mkf(PTF_LN, p->left->left))))); + arg1 = PTdifferentiate(a, varnum); + arg2 = PTdifferentiate(b, varnum); + newp = mkb(PT_PLUS, + mkb(PT_TIMES, + mkf(PTF_SGN, a), + mkb(PT_TIMES, + mkb(PT_POWER, mkf(PTF_ABS, a), b), + mkb(PT_TIMES, arg2, + mkf(PTF_LN, mkf(PTF_ABS, a))))), + mkb(PT_TIMES, + mkb(PT_TIMES, + mkb(PT_POWER, + mkf(PTF_ABS, a), + mkb(PT_MINUS, b, mkcon(1.0))), + b), + arg1)); } return mkfirst(newp, p); +#undef b +#undef a } default: From 05c9cf10633b9fcc2a1240cfb6b26d1b2f78b741 Mon Sep 17 00:00:00 2001 From: dwarning Date: Mon, 3 Jun 2013 22:47:06 +0200 Subject: [PATCH 156/257] add rgeomod as model parameter for bsim4 --- src/spicelib/devices/bsim4/b4.c | 1 + src/spicelib/devices/bsim4/b4mask.c | 3 ++ src/spicelib/devices/bsim4/b4mpar.c | 4 ++ src/spicelib/devices/bsim4/b4set.c | 15 ++++++- src/spicelib/devices/bsim4/bsim4def.h | 51 ++++++++++++----------- src/spicelib/devices/bsim4v5/b4v5.c | 1 + src/spicelib/devices/bsim4v5/b4v5mask.c | 3 ++ src/spicelib/devices/bsim4v5/b4v5mpar.c | 4 ++ src/spicelib/devices/bsim4v5/b4v5set.c | 15 ++++++- src/spicelib/devices/bsim4v5/bsim4v5def.h | 9 ++-- src/spicelib/devices/bsim4v6/b4v6.c | 1 + src/spicelib/devices/bsim4v6/b4v6mask.c | 3 ++ src/spicelib/devices/bsim4v6/b4v6mpar.c | 4 ++ src/spicelib/devices/bsim4v6/b4v6set.c | 14 ++++++- src/spicelib/devices/bsim4v6/bsim4v6def.h | 51 ++++++++++++----------- 15 files changed, 125 insertions(+), 54 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4.c b/src/spicelib/devices/bsim4/b4.c index b48168e14..3353b2133 100644 --- a/src/spicelib/devices/bsim4/b4.c +++ b/src/spicelib/devices/bsim4/b4.c @@ -124,6 +124,7 @@ IOP( "rbodymod", BSIM4_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model selec IOP( "rgatemod", BSIM4_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), IOP( "permod", BSIM4_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), IOP( "geomod", BSIM4_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), +IOP( "rgeomod", BSIM4_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), IOP( "fnoimod", BSIM4_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), IOP( "tnoimod", BSIM4_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), IOP( "mtrlmod", BSIM4_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), diff --git a/src/spicelib/devices/bsim4/b4mask.c b/src/spicelib/devices/bsim4/b4mask.c index 52fcd9a96..4b2487834 100644 --- a/src/spicelib/devices/bsim4/b4mask.c +++ b/src/spicelib/devices/bsim4/b4mask.c @@ -84,6 +84,9 @@ IFvalue *value) case BSIM4_MOD_GEOMOD : value->iValue = model->BSIM4geoMod; return(OK); + case BSIM4_MOD_RGEOMOD : + value->iValue = model->BSIM4rgeoMod; + return(OK); case BSIM4_MOD_MTRLMOD : value->iValue = model->BSIM4mtrlMod; return(OK); diff --git a/src/spicelib/devices/bsim4/b4mpar.c b/src/spicelib/devices/bsim4/b4mpar.c index bcf8d6cf8..ca3578a3c 100644 --- a/src/spicelib/devices/bsim4/b4mpar.c +++ b/src/spicelib/devices/bsim4/b4mpar.c @@ -88,6 +88,10 @@ GENmodel *inMod) mod->BSIM4geoMod = value->iValue; mod->BSIM4geoModGiven = TRUE; break; + case BSIM4_MOD_RGEOMOD : + mod->BSIM4rgeoMod = value->iValue; + mod->BSIM4rgeoModGiven = TRUE; + break; case BSIM4_MOD_FNOIMOD : mod->BSIM4fnoiMod = value->iValue; mod->BSIM4fnoiModGiven = TRUE; diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index 2c58e9693..dd7ce8948 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -139,6 +139,12 @@ BSIM4instance **InstArray; if (!model->BSIM4geoModGiven) model->BSIM4geoMod = 0; + if (!model->BSIM4rgeoModGiven) + model->BSIM4rgeoMod = 0; + else if ((model->BSIM4rgeoMod != 0) && (model->BSIM4rgeoMod != 1)) + { model->BSIM4rgeoMod = 1; + printf("Warning: rgeoMod has been set to its default value: 1.\n"); + } if (!model->BSIM4fnoiModGiven) model->BSIM4fnoiMod = 1; else if ((model->BSIM4fnoiMod != 0) && (model->BSIM4fnoiMod != 1)) @@ -2250,8 +2256,15 @@ BSIM4instance **InstArray; if (!here->BSIM4geoModGiven) here->BSIM4geoMod = model->BSIM4geoMod; + if (!here->BSIM4rgeoModGiven) - here->BSIM4rgeoMod = 0; + here->BSIM4rgeoMod = model->BSIM4rgeoMod; + else if ((here->BSIM4rgeoMod != 0) && (here->BSIM4rgeoMod != 1)) + { here->BSIM4rgeoMod = model->BSIM4rgeoMod; + printf("Warning: rgeoMod has been set to its global value %d.\n", + model->BSIM4rgeoMod); + } + if (!here->BSIM4trnqsModGiven) here->BSIM4trnqsMod = model->BSIM4trnqsMod; else if ((here->BSIM4trnqsMod != 0) && (here->BSIM4trnqsMod != 1)) diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index 5f1cbec06..3505fc347 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -830,6 +830,7 @@ typedef struct sBSIM4model int BSIM4rgateMod; int BSIM4perMod; int BSIM4geoMod; + int BSIM4rgeoMod; int BSIM4mtrlMod; int BSIM4mtrlCompatMod; /* v4.7 */ int BSIM4gidlMod; /* v4.7 New GIDL/GISL */ @@ -1781,6 +1782,7 @@ typedef struct sBSIM4model unsigned BSIM4rgateModGiven :1; unsigned BSIM4perModGiven :1; unsigned BSIM4geoModGiven :1; + unsigned BSIM4rgeoModGiven :1; unsigned BSIM4paramChkGiven :1; unsigned BSIM4trnqsModGiven :1; unsigned BSIM4acnqsModGiven :1; @@ -2732,30 +2734,31 @@ typedef struct sBSIM4model #define BSIM4_M 38 /* Global parameters */ -#define BSIM4_MOD_TEMPEOT 66 -#define BSIM4_MOD_LEFFEOT 67 -#define BSIM4_MOD_WEFFEOT 68 -#define BSIM4_MOD_UCSTE 69 -#define BSIM4_MOD_LUCSTE 70 -#define BSIM4_MOD_WUCSTE 71 -#define BSIM4_MOD_PUCSTE 72 -#define BSIM4_MOD_UCS 73 -#define BSIM4_MOD_LUCS 74 -#define BSIM4_MOD_WUCS 75 -#define BSIM4_MOD_PUCS 76 -#define BSIM4_MOD_CVCHARGEMOD 77 -#define BSIM4_MOD_ADOS 78 -#define BSIM4_MOD_BDOS 79 -#define BSIM4_MOD_TEMPMOD 80 -#define BSIM4_MOD_MTRLMOD 81 -#define BSIM4_MOD_IGCMOD 82 -#define BSIM4_MOD_IGBMOD 83 -#define BSIM4_MOD_ACNQSMOD 84 -#define BSIM4_MOD_FNOIMOD 85 -#define BSIM4_MOD_RDSMOD 86 -#define BSIM4_MOD_DIOMOD 87 -#define BSIM4_MOD_PERMOD 88 -#define BSIM4_MOD_GEOMOD 89 +#define BSIM4_MOD_TEMPEOT 65 +#define BSIM4_MOD_LEFFEOT 66 +#define BSIM4_MOD_WEFFEOT 67 +#define BSIM4_MOD_UCSTE 68 +#define BSIM4_MOD_LUCSTE 69 +#define BSIM4_MOD_WUCSTE 70 +#define BSIM4_MOD_PUCSTE 71 +#define BSIM4_MOD_UCS 72 +#define BSIM4_MOD_LUCS 73 +#define BSIM4_MOD_WUCS 74 +#define BSIM4_MOD_PUCS 75 +#define BSIM4_MOD_CVCHARGEMOD 76 +#define BSIM4_MOD_ADOS 77 +#define BSIM4_MOD_BDOS 78 +#define BSIM4_MOD_TEMPMOD 79 +#define BSIM4_MOD_MTRLMOD 80 +#define BSIM4_MOD_IGCMOD 81 +#define BSIM4_MOD_IGBMOD 82 +#define BSIM4_MOD_ACNQSMOD 83 +#define BSIM4_MOD_FNOIMOD 84 +#define BSIM4_MOD_RDSMOD 85 +#define BSIM4_MOD_DIOMOD 86 +#define BSIM4_MOD_PERMOD 87 +#define BSIM4_MOD_GEOMOD 88 +#define BSIM4_MOD_RGEOMOD 89 #define BSIM4_MOD_RGATEMOD 90 #define BSIM4_MOD_RBODYMOD 91 #define BSIM4_MOD_CAPMOD 92 diff --git a/src/spicelib/devices/bsim4v5/b4v5.c b/src/spicelib/devices/bsim4v5/b4v5.c index c32892bb4..2f6ecea14 100644 --- a/src/spicelib/devices/bsim4v5/b4v5.c +++ b/src/spicelib/devices/bsim4v5/b4v5.c @@ -116,6 +116,7 @@ IOP( "rbodymod", BSIM4v5_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model sel IOP( "rgatemod", BSIM4v5_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), IOP( "permod", BSIM4v5_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), IOP( "geomod", BSIM4v5_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), +IOP( "rgeomod", BSIM4v5_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), IOP( "fnoimod", BSIM4v5_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), IOP( "tnoimod", BSIM4v5_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), IOP( "igcmod", BSIM4v5_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"), diff --git a/src/spicelib/devices/bsim4v5/b4v5mask.c b/src/spicelib/devices/bsim4v5/b4v5mask.c index c5be19b88..909f2fa14 100644 --- a/src/spicelib/devices/bsim4v5/b4v5mask.c +++ b/src/spicelib/devices/bsim4v5/b4v5mask.c @@ -76,6 +76,9 @@ IFvalue *value) case BSIM4v5_MOD_GEOMOD : value->iValue = model->BSIM4v5geoMod; return(OK); + case BSIM4v5_MOD_RGEOMOD : + value->iValue = model->BSIM4v5rgeoMod; + return(OK); case BSIM4v5_MOD_IGCMOD : value->iValue = model->BSIM4v5igcMod; return(OK); diff --git a/src/spicelib/devices/bsim4v5/b4v5mpar.c b/src/spicelib/devices/bsim4v5/b4v5mpar.c index 750e24de3..7b138f18d 100644 --- a/src/spicelib/devices/bsim4v5/b4v5mpar.c +++ b/src/spicelib/devices/bsim4v5/b4v5mpar.c @@ -77,6 +77,10 @@ GENmodel *inMod) mod->BSIM4v5geoMod = value->iValue; mod->BSIM4v5geoModGiven = TRUE; break; + case BSIM4v5_MOD_RGEOMOD : + mod->BSIM4v5rgeoMod = value->iValue; + mod->BSIM4v5rgeoModGiven = TRUE; + break; case BSIM4v5_MOD_FNOIMOD : mod->BSIM4v5fnoiMod = value->iValue; mod->BSIM4v5fnoiModGiven = TRUE; diff --git a/src/spicelib/devices/bsim4v5/b4v5set.c b/src/spicelib/devices/bsim4v5/b4v5set.c index 3d23a91a8..f3909ae14 100644 --- a/src/spicelib/devices/bsim4v5/b4v5set.c +++ b/src/spicelib/devices/bsim4v5/b4v5set.c @@ -122,6 +122,13 @@ JOB *job; if (!model->BSIM4v5geoModGiven) model->BSIM4v5geoMod = 0; + if (!model->BSIM4v5rgeoModGiven) + model->BSIM4v5rgeoMod = 0; + else if ((model->BSIM4v5rgeoMod != 0) && (model->BSIM4v5rgeoMod != 1)) + { model->BSIM4v5rgeoMod = 1; + printf("Warning: rgeoMod has been set to its default value: 1.\n"); + } + if (!model->BSIM4v5fnoiModGiven) model->BSIM4v5fnoiMod = 1; else if ((model->BSIM4v5fnoiMod != 0) && (model->BSIM4v5fnoiMod != 1)) @@ -1735,8 +1742,14 @@ JOB *job; if (!here->BSIM4v5geoModGiven) here->BSIM4v5geoMod = model->BSIM4v5geoMod; + if (!here->BSIM4v5rgeoModGiven) - here->BSIM4v5rgeoMod = 0; + here->BSIM4v5rgeoMod = model->BSIM4v5rgeoMod; + else if ((here->BSIM4v5rgeoMod != 0) && (here->BSIM4v5rgeoMod != 1)) + { here->BSIM4v5rgeoMod = model->BSIM4v5rgeoMod; + printf("Warning: rgeoMod has been set to its global value %d.\n", + model->BSIM4v5rgeoMod); + } if (!here->BSIM4v5trnqsModGiven) here->BSIM4v5trnqsMod = model->BSIM4v5trnqsMod; else if ((here->BSIM4v5trnqsMod != 0) && (here->BSIM4v5trnqsMod != 1)) diff --git a/src/spicelib/devices/bsim4v5/bsim4v5def.h b/src/spicelib/devices/bsim4v5/bsim4v5def.h index a44504518..3a7a59855 100644 --- a/src/spicelib/devices/bsim4v5/bsim4v5def.h +++ b/src/spicelib/devices/bsim4v5/bsim4v5def.h @@ -673,6 +673,7 @@ typedef struct sBSIM4v5model int BSIM4v5rgateMod; int BSIM4v5perMod; int BSIM4v5geoMod; + int BSIM4v5rgeoMod; int BSIM4v5igcMod; int BSIM4v5igbMod; int BSIM4v5tempMod; @@ -1486,6 +1487,7 @@ typedef struct sBSIM4v5model unsigned BSIM4v5rgateModGiven :1; unsigned BSIM4v5perModGiven :1; unsigned BSIM4v5geoModGiven :1; + unsigned BSIM4v5rgeoModGiven :1; unsigned BSIM4v5paramChkGiven :1; unsigned BSIM4v5trnqsModGiven :1; unsigned BSIM4v5acnqsModGiven :1; @@ -2310,9 +2312,10 @@ typedef struct sBSIM4v5model #define BSIM4v5_MOD_ACNQSMOD 92 #define BSIM4v5_MOD_FNOIMOD 93 #define BSIM4v5_MOD_RDSMOD 94 -#define BSIM4v5_MOD_DIOMOD 96 -#define BSIM4v5_MOD_PERMOD 97 -#define BSIM4v5_MOD_GEOMOD 98 +#define BSIM4v5_MOD_DIOMOD 95 +#define BSIM4v5_MOD_PERMOD 96 +#define BSIM4v5_MOD_GEOMOD 97 +#define BSIM4v5_MOD_RGEOMOD 98 #define BSIM4v5_MOD_RGATEMOD 99 #define BSIM4v5_MOD_RBODYMOD 100 #define BSIM4v5_MOD_CAPMOD 101 diff --git a/src/spicelib/devices/bsim4v6/b4v6.c b/src/spicelib/devices/bsim4v6/b4v6.c index 5b422cf1f..acb95ab00 100644 --- a/src/spicelib/devices/bsim4v6/b4v6.c +++ b/src/spicelib/devices/bsim4v6/b4v6.c @@ -123,6 +123,7 @@ IOP( "rbodymod", BSIM4v6_MOD_RBODYMOD, IF_INTEGER, "Distributed body R model sel IOP( "rgatemod", BSIM4v6_MOD_RGATEMOD, IF_INTEGER, "Gate R model selector"), IOP( "permod", BSIM4v6_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"), IOP( "geomod", BSIM4v6_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"), +IOP( "rgeomod", BSIM4v6_MOD_RGEOMOD, IF_INTEGER, "S/D resistance and contact model selector"), IOP( "fnoimod", BSIM4v6_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"), IOP( "tnoimod", BSIM4v6_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"), IOP( "mtrlmod", BSIM4v6_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"), diff --git a/src/spicelib/devices/bsim4v6/b4v6mask.c b/src/spicelib/devices/bsim4v6/b4v6mask.c index 626b43388..39bb05a0a 100644 --- a/src/spicelib/devices/bsim4v6/b4v6mask.c +++ b/src/spicelib/devices/bsim4v6/b4v6mask.c @@ -83,6 +83,9 @@ IFvalue *value) case BSIM4v6_MOD_GEOMOD : value->iValue = model->BSIM4v6geoMod; return(OK); + case BSIM4v6_MOD_RGEOMOD : + value->iValue = model->BSIM4v6rgeoMod; + return(OK); case BSIM4v6_MOD_MTRLMOD : value->iValue = model->BSIM4v6mtrlMod; return(OK); diff --git a/src/spicelib/devices/bsim4v6/b4v6mpar.c b/src/spicelib/devices/bsim4v6/b4v6mpar.c index 0d70ae64e..181139846 100644 --- a/src/spicelib/devices/bsim4v6/b4v6mpar.c +++ b/src/spicelib/devices/bsim4v6/b4v6mpar.c @@ -87,6 +87,10 @@ GENmodel *inMod) mod->BSIM4v6geoMod = value->iValue; mod->BSIM4v6geoModGiven = TRUE; break; + case BSIM4v6_MOD_RGEOMOD : + mod->BSIM4v6rgeoMod = value->iValue; + mod->BSIM4v6rgeoModGiven = TRUE; + break; case BSIM4v6_MOD_FNOIMOD : mod->BSIM4v6fnoiMod = value->iValue; mod->BSIM4v6fnoiModGiven = TRUE; diff --git a/src/spicelib/devices/bsim4v6/b4v6set.c b/src/spicelib/devices/bsim4v6/b4v6set.c index 6cd97e4cc..fe2e32cb0 100644 --- a/src/spicelib/devices/bsim4v6/b4v6set.c +++ b/src/spicelib/devices/bsim4v6/b4v6set.c @@ -140,6 +140,12 @@ BSIM4v6instance **InstArray; if (!model->BSIM4v6geoModGiven) model->BSIM4v6geoMod = 0; + if (!model->BSIM4v6rgeoModGiven) + model->BSIM4v6rgeoMod = 0; + else if ((model->BSIM4v6rgeoMod != 0) && (model->BSIM4v6rgeoMod != 1)) + { model->BSIM4v6rgeoMod = 1; + printf("Warning: rgeoMod has been set to its default value: 1.\n"); + } if (!model->BSIM4v6fnoiModGiven) model->BSIM4v6fnoiMod = 1; else if ((model->BSIM4v6fnoiMod != 0) && (model->BSIM4v6fnoiMod != 1)) @@ -2099,8 +2105,14 @@ BSIM4v6instance **InstArray; if (!here->BSIM4v6geoModGiven) here->BSIM4v6geoMod = model->BSIM4v6geoMod; + if (!here->BSIM4v6rgeoModGiven) - here->BSIM4v6rgeoMod = 0; + here->BSIM4v6rgeoMod = model->BSIM4v6rgeoMod; + else if ((here->BSIM4v6rgeoMod != 0) && (here->BSIM4v6rgeoMod != 1)) + { here->BSIM4v6rgeoMod = model->BSIM4v6rgeoMod; + printf("Warning: rgeoMod has been set to its global value %d.\n", + model->BSIM4v6rgeoMod); + } if (!here->BSIM4v6trnqsModGiven) here->BSIM4v6trnqsMod = model->BSIM4v6trnqsMod; else if ((here->BSIM4v6trnqsMod != 0) && (here->BSIM4v6trnqsMod != 1)) diff --git a/src/spicelib/devices/bsim4v6/bsim4v6def.h b/src/spicelib/devices/bsim4v6/bsim4v6def.h index 5961b14a3..fc0900441 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6def.h +++ b/src/spicelib/devices/bsim4v6/bsim4v6def.h @@ -814,6 +814,7 @@ typedef struct sBSIM4v6model int BSIM4v6rgateMod; int BSIM4v6perMod; int BSIM4v6geoMod; + int BSIM4v6rgeoMod; int BSIM4v6mtrlMod; int BSIM4v6igcMod; int BSIM4v6igbMod; @@ -1710,6 +1711,7 @@ typedef struct sBSIM4v6model unsigned BSIM4v6rgateModGiven :1; unsigned BSIM4v6perModGiven :1; unsigned BSIM4v6geoModGiven :1; + unsigned BSIM4v6rgeoModGiven :1; unsigned BSIM4v6paramChkGiven :1; unsigned BSIM4v6trnqsModGiven :1; unsigned BSIM4v6acnqsModGiven :1; @@ -2605,30 +2607,31 @@ typedef struct sBSIM4v6model #define BSIM4v6_M 38 /* Global parameters */ -#define BSIM4v6_MOD_TEMPEOT 66 -#define BSIM4v6_MOD_LEFFEOT 67 -#define BSIM4v6_MOD_WEFFEOT 68 -#define BSIM4v6_MOD_UCSTE 69 -#define BSIM4v6_MOD_LUCSTE 70 -#define BSIM4v6_MOD_WUCSTE 71 -#define BSIM4v6_MOD_PUCSTE 72 -#define BSIM4v6_MOD_UCS 73 -#define BSIM4v6_MOD_LUCS 74 -#define BSIM4v6_MOD_WUCS 75 -#define BSIM4v6_MOD_PUCS 76 -#define BSIM4v6_MOD_CVCHARGEMOD 77 -#define BSIM4v6_MOD_ADOS 78 -#define BSIM4v6_MOD_BDOS 79 -#define BSIM4v6_MOD_TEMPMOD 80 -#define BSIM4v6_MOD_MTRLMOD 81 -#define BSIM4v6_MOD_IGCMOD 82 -#define BSIM4v6_MOD_IGBMOD 83 -#define BSIM4v6_MOD_ACNQSMOD 84 -#define BSIM4v6_MOD_FNOIMOD 85 -#define BSIM4v6_MOD_RDSMOD 86 -#define BSIM4v6_MOD_DIOMOD 87 -#define BSIM4v6_MOD_PERMOD 88 -#define BSIM4v6_MOD_GEOMOD 89 +#define BSIM4v6_MOD_TEMPEOT 65 +#define BSIM4v6_MOD_LEFFEOT 66 +#define BSIM4v6_MOD_WEFFEOT 67 +#define BSIM4v6_MOD_UCSTE 68 +#define BSIM4v6_MOD_LUCSTE 69 +#define BSIM4v6_MOD_WUCSTE 70 +#define BSIM4v6_MOD_PUCSTE 71 +#define BSIM4v6_MOD_UCS 72 +#define BSIM4v6_MOD_LUCS 73 +#define BSIM4v6_MOD_WUCS 74 +#define BSIM4v6_MOD_PUCS 75 +#define BSIM4v6_MOD_CVCHARGEMOD 76 +#define BSIM4v6_MOD_ADOS 77 +#define BSIM4v6_MOD_BDOS 78 +#define BSIM4v6_MOD_TEMPMOD 79 +#define BSIM4v6_MOD_MTRLMOD 80 +#define BSIM4v6_MOD_IGCMOD 81 +#define BSIM4v6_MOD_IGBMOD 82 +#define BSIM4v6_MOD_ACNQSMOD 83 +#define BSIM4v6_MOD_FNOIMOD 84 +#define BSIM4v6_MOD_RDSMOD 85 +#define BSIM4v6_MOD_DIOMOD 86 +#define BSIM4v6_MOD_PERMOD 87 +#define BSIM4v6_MOD_GEOMOD 88 +#define BSIM4v6_MOD_RGEOMOD 89 #define BSIM4v6_MOD_RGATEMOD 90 #define BSIM4v6_MOD_RBODYMOD 91 #define BSIM4v6_MOD_CAPMOD 92 From 8152a0b543ea3c9378a48b6df388dc98dc6d8562 Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 5 Jun 2013 20:17:12 +0200 Subject: [PATCH 157/257] inpcom.c, cleanup `inp_split_multi_param_lines()' --- src/frontend/inpcom.c | 49 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 71fa86a27..78ba67d0c 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -3910,25 +3910,21 @@ inp_reorder_params(struct names *subckt_w_params, struct line *deck, struct line // split line up into multiple lines and place those new lines immediately // afetr the current multi-param line in the deck static int -inp_split_multi_param_lines(struct line *deck, int line_num) +inp_split_multi_param_lines(struct line *card, int line_num) { - struct line *card = deck, *param_end = NULL, *param_beg = NULL, *prev = NULL; - char *curr_line, *equal_ptr, *beg_param, *end_param, *new_line; - char *array[5000]; - int counter = 0, i; - bool get_expression = FALSE, get_paren_expression = FALSE; - char keep; + for (; card; card = card->li_next) { - while (card != NULL) { - curr_line = card->li_line; + char *curr_line = card->li_line; - if (*curr_line == '*') { - card = card->li_next; + if (*curr_line == '*') continue; - } if (ciprefix(".param", curr_line)) { - counter = 0; + + struct line *param_end, *param_beg; + char *equal_ptr, *array[5000]; + int i, counter = 0; + while ((equal_ptr = strchr(curr_line, '=')) != NULL) { // check for equality '==' if (equal_ptr[1] == '=') { @@ -3943,20 +3939,26 @@ inp_split_multi_param_lines(struct line *deck, int line_num) counter++; curr_line = equal_ptr + 1; } - if (counter <= 1) { - card = card->li_next; + + if (counter <= 1) continue; - } // need to split multi param line curr_line = card->li_line; counter = 0; while (curr_line < card->li_line+strlen(card->li_line) && (equal_ptr = strchr(curr_line, '=')) != NULL) { + + char keep, *beg_param, *end_param, *new_line; + + bool get_expression = FALSE; + bool get_paren_expression = FALSE; + // check for equality '==' if (equal_ptr[1] == '=') { curr_line = equal_ptr + 2; continue; } + // check for '!=', '<=', '>=' if (*(equal_ptr-1) == '!' || *(equal_ptr-1) == '<' || *(equal_ptr-1) == '>') { curr_line = equal_ptr + 1; @@ -3985,6 +3987,9 @@ inp_split_multi_param_lines(struct line *deck, int line_num) *end_param = keep; curr_line = end_param; } + + param_beg = param_end = NULL; + for (i = 0; i < counter; i++) { struct line *x = xx_new_line(NULL, array[i], line_num++, 0); @@ -3995,6 +4000,7 @@ inp_split_multi_param_lines(struct line *deck, int line_num) param_end = x; } + // comment out current multi-param line *(card->li_line) = '*'; // insert new param lines immediately after current line @@ -4002,16 +4008,9 @@ inp_split_multi_param_lines(struct line *deck, int line_num) card->li_next = param_beg; // point 'card' pointer to last in scalar list card = param_end; - - param_beg = param_end = NULL; - } // if (ciprefix(".param", curr_line)) - prev = card; - card = card->li_next; - } // while (card != NULL) - if (param_end) { - prev->li_next = param_beg; - prev = param_end; + } } + return line_num; } From bbd9c3308ab6e25cdf307aaf36418b4729f0c0b3 Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 5 Jun 2013 20:52:00 +0200 Subject: [PATCH 158/257] inpcom.c, abstraction, new function inp_split_multi_param_lines() --- src/frontend/inpcom.c | 119 +++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 78ba67d0c..9c0c436e4 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -273,6 +273,68 @@ delete_names(struct names *p) } +static void +inp_stitch_continuation_lines(struct line *working) +{ + struct line *prev = NULL; + + while (working) { + char *s, c, *buffer; + + for (s = working->li_line; (c = *s) != '\0' && c <= ' '; s++) + ; + +#ifdef TRACE + /* SDB debug statement */ + printf("In inp_readall, processing linked list element line = %d, s = %s . . . \n", working->li_linenum, s); +#endif + + switch (c) { + case '#': + case '$': + case '*': + case '\0': + /* this used to be commented out. Why? */ + /* prev = NULL; */ + working = working->li_next; /* for these chars, go to next card */ + break; + + case '+': /* handle continuation */ + if (!prev) { + working->li_error = copy("Illegal continuation line: ignored."); + working = working->li_next; + break; + } + + /* create buffer and write last and current line into it. */ + buffer = TMALLOC(char, strlen(prev->li_line) + strlen(s) + 2); + (void) sprintf(buffer, "%s %s", prev->li_line, s + 1); + + s = prev->li_line; + prev->li_line = buffer; + prev->li_next = working->li_next; + working->li_next = NULL; + if (prev->li_actual) { + struct line *end; + for (end = prev->li_actual; end->li_next; end = end->li_next) + ; + end->li_next = working; + tfree(s); + } else { + prev->li_actual = xx_new_line(working, s, prev->li_linenum, 0); + } + working = prev->li_next; + break; + + default: /* regular one-line card */ + prev = working; + working = working->li_next; + break; + } + } +} + + /*------------------------------------------------------------------------- Read the entire input file and return a pointer to the first line of the linked list of 'card' records in data. The pointer is stored in @@ -317,7 +379,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile intfile: in, TRUE if deck is generated from internal circarray */ { - struct line *end = NULL, *cc = NULL, *prev, *working; + struct line *end = NULL, *cc = NULL, *working; char *buffer = NULL; /* segfault fix */ #ifdef XSPICE @@ -645,60 +707,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile stripped in the following code. */ inp_stripcomments_deck(working); - prev = NULL; - while (working) { - char *s, c; - - for (s = working->li_line; (c = *s) != '\0' && c <= ' '; s++) - ; - -#ifdef TRACE - /* SDB debug statement */ - printf("In inp_readall, processing linked list element line = %d, s = %s . . . \n", working->li_linenum, s); -#endif - - switch (c) { - case '#': - case '$': - case '*': - case '\0': - /* this used to be commented out. Why? */ - /* prev = NULL; */ - working = working->li_next; /* for these chars, go to next card */ - break; - - case '+': /* handle continuation */ - if (!prev) { - working->li_error = copy("Illegal continuation line: ignored."); - working = working->li_next; - break; - } - - /* create buffer and write last and current line into it. */ - buffer = TMALLOC(char, strlen(prev->li_line) + strlen(s) + 2); - (void) sprintf(buffer, "%s %s", prev->li_line, s + 1); - - s = prev->li_line; - prev->li_line = buffer; - prev->li_next = working->li_next; - working->li_next = NULL; - if (prev->li_actual) { - for (end = prev->li_actual; end->li_next; end = end->li_next) - ; - end->li_next = working; - tfree(s); - } else { - prev->li_actual = xx_new_line(working, s, prev->li_linenum, 0); - } - working = prev->li_next; - break; - - default: /* regular one-line card */ - prev = working; - working = working->li_next; - break; - } - } + inp_stitch_continuation_lines(cc->li_next); /* The following processing of an input file is not required for command files like spinit or .spiceinit, so return command files here. */ From bdacf3d39e9245ce94a53be2747a2f017084a68b Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 5 Jun 2013 20:54:25 +0200 Subject: [PATCH 159/257] inpcom.c, cleanup --- src/frontend/inpcom.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 9c0c436e4..0b4bf8c30 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -697,15 +697,13 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile } /* Now clean up li: remove comments & stitch together continuation lines. */ - working = cc->li_next; /* cc points to head of deck. Start with the - next card. */ /* sjb - strip or convert end-of-line comments. This must be cone before stitching continuation lines. If the line only contains an end-of-line comment then it is converted into a normal comment with a '*' at the start. This will then get stripped in the following code. */ - inp_stripcomments_deck(working); + inp_stripcomments_deck(cc->li_next); inp_stitch_continuation_lines(cc->li_next); From fb5e17e40733fb2867963ddefdf0851665dcacde Mon Sep 17 00:00:00 2001 From: rlar Date: Wed, 5 Jun 2013 22:10:54 +0200 Subject: [PATCH 160/257] inpcom.c, abstraction, new function `find_assignment()' --- src/frontend/inpcom.c | 85 ++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 0b4bf8c30..d0111b547 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -335,6 +335,38 @@ inp_stitch_continuation_lines(struct line *working) } +/* + * search for `=' assignment operator + * take care of `!=' `<=' `==' and `>=' + */ + +static char * +find_assignment(char *str) +{ + char *p = str; + + while ((p = strchr(p, '=')) != NULL) { + + // check for equality '==' + if (p[1] == '=') { + p += 2; + continue; + } + + // check for '!=', '<=', '>=' + if (p > str) + if (p[-1] == '!' || p[-1] == '<' || p[-1] == '>') { + p += 1; + continue; + } + + return p; + } + + return NULL; +} + + /*------------------------------------------------------------------------- Read the entire input file and return a pointer to the first line of the linked list of 'card' records in data. The pointer is stored in @@ -2370,18 +2402,7 @@ inp_get_params(char *line, char *param_names[], char *param_values[]) char keep; bool is_expression = FALSE; - while ((equal_ptr = strchr(line, '=')) != NULL) { - - // check for equality '==' - if (equal_ptr[1] == '=') { - line = equal_ptr + 2; - continue; - } - // check for '!=', '<=', '>=' - if (*(equal_ptr-1) == '!' || *(equal_ptr-1) == '<' || *(equal_ptr-1) == '>') { - line = equal_ptr + 1; - continue; - } + while ((equal_ptr = find_assignment(line)) != NULL) { is_expression = FALSE; @@ -3152,7 +3173,7 @@ inp_fix_param_values(struct line *deck) if (strstr(line, "ic.file")) continue; - while ((equal_ptr = strchr(line, '=')) != NULL) { + while ((equal_ptr = find_assignment(line)) != NULL) { // special case: .MEASURE {DC|AC|TRAN} result FIND out_variable WHEN out_variable2=out_variable3 // no braces around out_variable3. out_variable3 may be v(...) or i(...) @@ -3167,18 +3188,6 @@ inp_fix_param_values(struct line *deck) continue; } - // skip over equality '==' - if (equal_ptr[1] == '=') { - line += 2; - continue; - } - // check for '!=', '<=', '>=' - if (*(equal_ptr-1) == '!' || *(equal_ptr-1) == '<' || *(equal_ptr-1) == '>') - { - line += 1; - continue; - } - beg_of_str = skip_ws(equal_ptr + 1); /* all cases where no {} have to be put around selected token */ if (isdigit(*beg_of_str) || @@ -3932,17 +3941,7 @@ inp_split_multi_param_lines(struct line *card, int line_num) char *equal_ptr, *array[5000]; int i, counter = 0; - while ((equal_ptr = strchr(curr_line, '=')) != NULL) { - // check for equality '==' - if (equal_ptr[1] == '=') { - curr_line = equal_ptr + 2; - continue; - } - // check for '!=', '<=', '>=' - if (*(equal_ptr-1) == '!' || *(equal_ptr-1) == '<' || *(equal_ptr-1) == '>') { - curr_line = equal_ptr + 1; - continue; - } + while ((equal_ptr = find_assignment(curr_line)) != NULL) { counter++; curr_line = equal_ptr + 1; } @@ -3953,25 +3952,13 @@ inp_split_multi_param_lines(struct line *card, int line_num) // need to split multi param line curr_line = card->li_line; counter = 0; - while (curr_line < card->li_line+strlen(card->li_line) && (equal_ptr = strchr(curr_line, '=')) != NULL) { + while ((equal_ptr = find_assignment(curr_line)) != NULL) { char keep, *beg_param, *end_param, *new_line; bool get_expression = FALSE; bool get_paren_expression = FALSE; - // check for equality '==' - if (equal_ptr[1] == '=') { - curr_line = equal_ptr + 2; - continue; - } - - // check for '!=', '<=', '>=' - if (*(equal_ptr-1) == '!' || *(equal_ptr-1) == '<' || *(equal_ptr-1) == '>') { - curr_line = equal_ptr + 1; - continue; - } - beg_param = skip_back_ws(equal_ptr); beg_param = skip_back_non_ws(beg_param); end_param = skip_ws(equal_ptr + 1); From 8f1e92503a84cba24fbad69ba20bf9a0be32d512 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Wed, 5 Jun 2013 22:51:06 +0200 Subject: [PATCH 161/257] inp.c: skip title line when searching for .if in dotifeval() --- src/frontend/inp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/frontend/inp.c b/src/frontend/inp.c index 8928e3f93..33f6d106a 100644 --- a/src/frontend/inp.c +++ b/src/frontend/inp.c @@ -1215,7 +1215,8 @@ dotifeval(struct line *deck) char *dottoken; char *s, *t; - for (dd = deck; dd; dd = dd->li_next) { + /* skip the first line (title line) */ + for (dd = deck->li_next; dd; dd = dd->li_next) { s = t = dd->li_line; From 5a4ff7dea5149b88f290792c0ca7cd59939017c3 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 6 Jun 2013 22:24:22 +0200 Subject: [PATCH 162/257] rewrite `TSTALLOC()' macro for auto indentation checked for object code invariance --- src/spicelib/devices/asrc/asrcset.c | 8 +- src/spicelib/devices/bjt/bjtsetup.c | 50 ++--- src/spicelib/devices/bsim1/b1set.c | 48 ++-- src/spicelib/devices/bsim2/b2set.c | 48 ++-- src/spicelib/devices/bsim3/b3set.c | 66 +++--- src/spicelib/devices/bsim3soi_dd/b3soiddset.c | 190 ++++++++-------- src/spicelib/devices/bsim3soi_fd/b3soifdset.c | 174 +++++++-------- src/spicelib/devices/bsim3soi_pd/b3soipdset.c | 132 +++++------ src/spicelib/devices/bsim3v0/b3v0set.c | 66 +++--- src/spicelib/devices/bsim3v1/b3v1set.c | 66 +++--- src/spicelib/devices/bsim3v32/b3v32set.c | 66 +++--- src/spicelib/devices/bsim4/b4set.c | 144 ++++++------ src/spicelib/devices/bsim4v4/b4v4set.c | 144 ++++++------ src/spicelib/devices/bsim4v5/b4v5set.c | 144 ++++++------ src/spicelib/devices/bsim4v6/b4v6set.c | 144 ++++++------ src/spicelib/devices/bsimsoi/b4soiset.c | 208 +++++++++--------- src/spicelib/devices/cap/capsetup.c | 12 +- src/spicelib/devices/cccs/cccsset.c | 8 +- src/spicelib/devices/ccvs/ccvsset.c | 14 +- src/spicelib/devices/cpl/cplsetup.c | 4 +- src/spicelib/devices/csw/cswsetup.c | 12 +- src/spicelib/devices/dio/diosetup.c | 18 +- src/spicelib/devices/hfet1/hfetsetup.c | 60 ++--- src/spicelib/devices/hfet2/hfet2setup.c | 34 +-- src/spicelib/devices/hisim2/hsm2set.c | 46 ++-- src/spicelib/devices/hisimhv1/hsmhvset.c | 110 ++++----- src/spicelib/devices/ind/indsetup.c | 14 +- src/spicelib/devices/ind/mutsetup.c | 8 +- src/spicelib/devices/jfet/jfetset.c | 34 +-- src/spicelib/devices/jfet2/jfet2set.c | 34 +-- src/spicelib/devices/ltra/ltraset.c | 44 ++-- src/spicelib/devices/mes/messetup.c | 34 +-- src/spicelib/devices/mesa/mesasetup.c | 60 ++--- src/spicelib/devices/mos1/mos1set.c | 48 ++-- src/spicelib/devices/mos2/mos2set.c | 48 ++-- src/spicelib/devices/mos3/mos3set.c | 48 ++-- src/spicelib/devices/mos6/mos6set.c | 48 ++-- src/spicelib/devices/mos9/mos9set.c | 48 ++-- src/spicelib/devices/nbjt/nbjtset.c | 22 +- src/spicelib/devices/nbjt2/nbt2set.c | 22 +- src/spicelib/devices/ndev/ndevset.c | 4 +- src/spicelib/devices/numd/numdset.c | 12 +- src/spicelib/devices/numd2/nud2set.c | 12 +- src/spicelib/devices/numos/nummset.c | 36 +-- src/spicelib/devices/res/ressetup.c | 4 +- src/spicelib/devices/soi3/soi3set.c | 118 +++++----- src/spicelib/devices/sw/swsetup.c | 12 +- src/spicelib/devices/tra/trasetup.c | 48 ++-- src/spicelib/devices/txl/txlsetup.c | 4 +- src/spicelib/devices/vbic/vbicsetup.c | 106 ++++----- src/spicelib/devices/vccs/vccsset.c | 12 +- src/spicelib/devices/vcvs/vcvsset.c | 16 +- src/spicelib/devices/vsrc/vsrcpzs.c | 14 +- src/spicelib/devices/vsrc/vsrcset.c | 12 +- src/xspice/mif/mifsetup.c | 8 +- 55 files changed, 1473 insertions(+), 1473 deletions(-) diff --git a/src/spicelib/devices/asrc/asrcset.c b/src/spicelib/devices/asrc/asrcset.c index 8f4fb22a0..84ab66f69 100644 --- a/src/spicelib/devices/asrc/asrcset.c +++ b/src/spicelib/devices/asrc/asrcset.c @@ -54,14 +54,14 @@ ASRCsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) #define MY_TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, (second)->number)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, (second)->number)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) /* For each controlling variable set the entries in the vector of the positions of the SMP */ diff --git a/src/spicelib/devices/bjt/bjtsetup.c b/src/spicelib/devices/bjt/bjtsetup.c index 5c94f2edf..0ca183775 100644 --- a/src/spicelib/devices/bjt/bjtsetup.c +++ b/src/spicelib/devices/bjt/bjtsetup.c @@ -420,28 +420,28 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} - TSTALLOC(BJTcolColPrimePtr,BJTcolNode,BJTcolPrimeNode) - TSTALLOC(BJTbaseBasePrimePtr,BJTbaseNode,BJTbasePrimeNode) - TSTALLOC(BJTemitEmitPrimePtr,BJTemitNode,BJTemitPrimeNode) - TSTALLOC(BJTcolPrimeColPtr,BJTcolPrimeNode,BJTcolNode) - TSTALLOC(BJTcolPrimeBasePrimePtr,BJTcolPrimeNode,BJTbasePrimeNode) - TSTALLOC(BJTcolPrimeEmitPrimePtr,BJTcolPrimeNode,BJTemitPrimeNode) - TSTALLOC(BJTbasePrimeBasePtr,BJTbasePrimeNode,BJTbaseNode) - TSTALLOC(BJTbasePrimeColPrimePtr,BJTbasePrimeNode,BJTcolPrimeNode) - TSTALLOC(BJTbasePrimeEmitPrimePtr,BJTbasePrimeNode,BJTemitPrimeNode) - TSTALLOC(BJTemitPrimeEmitPtr,BJTemitPrimeNode,BJTemitNode) - TSTALLOC(BJTemitPrimeColPrimePtr,BJTemitPrimeNode,BJTcolPrimeNode) - TSTALLOC(BJTemitPrimeBasePrimePtr,BJTemitPrimeNode,BJTbasePrimeNode) - TSTALLOC(BJTcolColPtr,BJTcolNode,BJTcolNode) - TSTALLOC(BJTbaseBasePtr,BJTbaseNode,BJTbaseNode) - TSTALLOC(BJTemitEmitPtr,BJTemitNode,BJTemitNode) - TSTALLOC(BJTcolPrimeColPrimePtr,BJTcolPrimeNode,BJTcolPrimeNode) - TSTALLOC(BJTbasePrimeBasePrimePtr,BJTbasePrimeNode,BJTbasePrimeNode) - TSTALLOC(BJTemitPrimeEmitPrimePtr,BJTemitPrimeNode,BJTemitPrimeNode) - TSTALLOC(BJTsubstSubstPtr,BJTsubstNode,BJTsubstNode) +} } while(0) + TSTALLOC(BJTcolColPrimePtr,BJTcolNode,BJTcolPrimeNode); + TSTALLOC(BJTbaseBasePrimePtr,BJTbaseNode,BJTbasePrimeNode); + TSTALLOC(BJTemitEmitPrimePtr,BJTemitNode,BJTemitPrimeNode); + TSTALLOC(BJTcolPrimeColPtr,BJTcolPrimeNode,BJTcolNode); + TSTALLOC(BJTcolPrimeBasePrimePtr,BJTcolPrimeNode,BJTbasePrimeNode); + TSTALLOC(BJTcolPrimeEmitPrimePtr,BJTcolPrimeNode,BJTemitPrimeNode); + TSTALLOC(BJTbasePrimeBasePtr,BJTbasePrimeNode,BJTbaseNode); + TSTALLOC(BJTbasePrimeColPrimePtr,BJTbasePrimeNode,BJTcolPrimeNode); + TSTALLOC(BJTbasePrimeEmitPrimePtr,BJTbasePrimeNode,BJTemitPrimeNode); + TSTALLOC(BJTemitPrimeEmitPtr,BJTemitPrimeNode,BJTemitNode); + TSTALLOC(BJTemitPrimeColPrimePtr,BJTemitPrimeNode,BJTcolPrimeNode); + TSTALLOC(BJTemitPrimeBasePrimePtr,BJTemitPrimeNode,BJTbasePrimeNode); + TSTALLOC(BJTcolColPtr,BJTcolNode,BJTcolNode); + TSTALLOC(BJTbaseBasePtr,BJTbaseNode,BJTbaseNode); + TSTALLOC(BJTemitEmitPtr,BJTemitNode,BJTemitNode); + TSTALLOC(BJTcolPrimeColPrimePtr,BJTcolPrimeNode,BJTcolPrimeNode); + TSTALLOC(BJTbasePrimeBasePrimePtr,BJTbasePrimeNode,BJTbasePrimeNode); + TSTALLOC(BJTemitPrimeEmitPrimePtr,BJTemitPrimeNode,BJTemitPrimeNode); + TSTALLOC(BJTsubstSubstPtr,BJTsubstNode,BJTsubstNode); if (model -> BJTsubs == LATERAL) { here -> BJTsubstConNode = here -> BJTbasePrimeNode; here -> BJTsubstConSubstConPtr = here -> BJTbasePrimeBasePrimePtr; @@ -449,10 +449,10 @@ if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ here -> BJTsubstConNode = here -> BJTcolPrimeNode; here -> BJTsubstConSubstConPtr = here -> BJTcolPrimeColPrimePtr; } - TSTALLOC(BJTsubstConSubstPtr,BJTsubstConNode,BJTsubstNode) - TSTALLOC(BJTsubstSubstConPtr,BJTsubstNode,BJTsubstConNode) - TSTALLOC(BJTbaseColPrimePtr,BJTbaseNode,BJTcolPrimeNode) - TSTALLOC(BJTcolPrimeBasePtr,BJTcolPrimeNode,BJTbaseNode) + TSTALLOC(BJTsubstConSubstPtr,BJTsubstConNode,BJTsubstNode); + TSTALLOC(BJTsubstSubstConPtr,BJTsubstNode,BJTsubstConNode); + TSTALLOC(BJTbaseColPrimePtr,BJTbaseNode,BJTcolPrimeNode); + TSTALLOC(BJTcolPrimeBasePtr,BJTcolPrimeNode,BJTbaseNode); } } return(OK); diff --git a/src/spicelib/devices/bsim1/b1set.c b/src/spicelib/devices/bsim1/b1set.c index ab29964ee..46ae6d5b2 100644 --- a/src/spicelib/devices/bsim1/b1set.c +++ b/src/spicelib/devices/bsim1/b1set.c @@ -368,32 +368,32 @@ B1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(B1DdPtr, B1dNode, B1dNode) - TSTALLOC(B1GgPtr, B1gNode, B1gNode) - TSTALLOC(B1SsPtr, B1sNode, B1sNode) - TSTALLOC(B1BbPtr, B1bNode, B1bNode) - TSTALLOC(B1DPdpPtr, B1dNodePrime, B1dNodePrime) - TSTALLOC(B1SPspPtr, B1sNodePrime, B1sNodePrime) - TSTALLOC(B1DdpPtr, B1dNode, B1dNodePrime) - TSTALLOC(B1GbPtr, B1gNode, B1bNode) - TSTALLOC(B1GdpPtr, B1gNode, B1dNodePrime) - TSTALLOC(B1GspPtr, B1gNode, B1sNodePrime) - TSTALLOC(B1SspPtr, B1sNode, B1sNodePrime) - TSTALLOC(B1BdpPtr, B1bNode, B1dNodePrime) - TSTALLOC(B1BspPtr, B1bNode, B1sNodePrime) - TSTALLOC(B1DPspPtr, B1dNodePrime, B1sNodePrime) - TSTALLOC(B1DPdPtr, B1dNodePrime, B1dNode) - TSTALLOC(B1BgPtr, B1bNode, B1gNode) - TSTALLOC(B1DPgPtr, B1dNodePrime, B1gNode) - TSTALLOC(B1SPgPtr, B1sNodePrime, B1gNode) - TSTALLOC(B1SPsPtr, B1sNodePrime, B1sNode) - TSTALLOC(B1DPbPtr, B1dNodePrime, B1bNode) - TSTALLOC(B1SPbPtr, B1sNodePrime, B1bNode) - TSTALLOC(B1SPdpPtr, B1sNodePrime, B1dNodePrime) + TSTALLOC(B1DdPtr, B1dNode, B1dNode); + TSTALLOC(B1GgPtr, B1gNode, B1gNode); + TSTALLOC(B1SsPtr, B1sNode, B1sNode); + TSTALLOC(B1BbPtr, B1bNode, B1bNode); + TSTALLOC(B1DPdpPtr, B1dNodePrime, B1dNodePrime); + TSTALLOC(B1SPspPtr, B1sNodePrime, B1sNodePrime); + TSTALLOC(B1DdpPtr, B1dNode, B1dNodePrime); + TSTALLOC(B1GbPtr, B1gNode, B1bNode); + TSTALLOC(B1GdpPtr, B1gNode, B1dNodePrime); + TSTALLOC(B1GspPtr, B1gNode, B1sNodePrime); + TSTALLOC(B1SspPtr, B1sNode, B1sNodePrime); + TSTALLOC(B1BdpPtr, B1bNode, B1dNodePrime); + TSTALLOC(B1BspPtr, B1bNode, B1sNodePrime); + TSTALLOC(B1DPspPtr, B1dNodePrime, B1sNodePrime); + TSTALLOC(B1DPdPtr, B1dNodePrime, B1dNode); + TSTALLOC(B1BgPtr, B1bNode, B1gNode); + TSTALLOC(B1DPgPtr, B1dNodePrime, B1gNode); + TSTALLOC(B1SPgPtr, B1sNodePrime, B1gNode); + TSTALLOC(B1SPsPtr, B1sNodePrime, B1sNode); + TSTALLOC(B1DPbPtr, B1dNodePrime, B1bNode); + TSTALLOC(B1SPbPtr, B1sNodePrime, B1bNode); + TSTALLOC(B1SPdpPtr, B1sNodePrime, B1dNodePrime); } } diff --git a/src/spicelib/devices/bsim2/b2set.c b/src/spicelib/devices/bsim2/b2set.c index 9721885d7..3c9dec9a3 100644 --- a/src/spicelib/devices/bsim2/b2set.c +++ b/src/spicelib/devices/bsim2/b2set.c @@ -535,32 +535,32 @@ B2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(B2DdPtr, B2dNode, B2dNode) - TSTALLOC(B2GgPtr, B2gNode, B2gNode) - TSTALLOC(B2SsPtr, B2sNode, B2sNode) - TSTALLOC(B2BbPtr, B2bNode, B2bNode) - TSTALLOC(B2DPdpPtr, B2dNodePrime, B2dNodePrime) - TSTALLOC(B2SPspPtr, B2sNodePrime, B2sNodePrime) - TSTALLOC(B2DdpPtr, B2dNode, B2dNodePrime) - TSTALLOC(B2GbPtr, B2gNode, B2bNode) - TSTALLOC(B2GdpPtr, B2gNode, B2dNodePrime) - TSTALLOC(B2GspPtr, B2gNode, B2sNodePrime) - TSTALLOC(B2SspPtr, B2sNode, B2sNodePrime) - TSTALLOC(B2BdpPtr, B2bNode, B2dNodePrime) - TSTALLOC(B2BspPtr, B2bNode, B2sNodePrime) - TSTALLOC(B2DPspPtr, B2dNodePrime, B2sNodePrime) - TSTALLOC(B2DPdPtr, B2dNodePrime, B2dNode) - TSTALLOC(B2BgPtr, B2bNode, B2gNode) - TSTALLOC(B2DPgPtr, B2dNodePrime, B2gNode) - TSTALLOC(B2SPgPtr, B2sNodePrime, B2gNode) - TSTALLOC(B2SPsPtr, B2sNodePrime, B2sNode) - TSTALLOC(B2DPbPtr, B2dNodePrime, B2bNode) - TSTALLOC(B2SPbPtr, B2sNodePrime, B2bNode) - TSTALLOC(B2SPdpPtr, B2sNodePrime, B2dNodePrime) + TSTALLOC(B2DdPtr, B2dNode, B2dNode); + TSTALLOC(B2GgPtr, B2gNode, B2gNode); + TSTALLOC(B2SsPtr, B2sNode, B2sNode); + TSTALLOC(B2BbPtr, B2bNode, B2bNode); + TSTALLOC(B2DPdpPtr, B2dNodePrime, B2dNodePrime); + TSTALLOC(B2SPspPtr, B2sNodePrime, B2sNodePrime); + TSTALLOC(B2DdpPtr, B2dNode, B2dNodePrime); + TSTALLOC(B2GbPtr, B2gNode, B2bNode); + TSTALLOC(B2GdpPtr, B2gNode, B2dNodePrime); + TSTALLOC(B2GspPtr, B2gNode, B2sNodePrime); + TSTALLOC(B2SspPtr, B2sNode, B2sNodePrime); + TSTALLOC(B2BdpPtr, B2bNode, B2dNodePrime); + TSTALLOC(B2BspPtr, B2bNode, B2sNodePrime); + TSTALLOC(B2DPspPtr, B2dNodePrime, B2sNodePrime); + TSTALLOC(B2DPdPtr, B2dNodePrime, B2dNode); + TSTALLOC(B2BgPtr, B2bNode, B2gNode); + TSTALLOC(B2DPgPtr, B2dNodePrime, B2gNode); + TSTALLOC(B2SPgPtr, B2sNodePrime, B2gNode); + TSTALLOC(B2SPsPtr, B2sNodePrime, B2sNode); + TSTALLOC(B2DPbPtr, B2dNodePrime, B2bNode); + TSTALLOC(B2SPbPtr, B2sNodePrime, B2bNode); + TSTALLOC(B2SPdpPtr, B2sNodePrime, B2dNodePrime); } } diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 7a59dc334..f85c73e04 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -1029,43 +1029,43 @@ BSIM3instance **InstArray; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(BSIM3DdPtr, BSIM3dNode, BSIM3dNode) - TSTALLOC(BSIM3GgPtr, BSIM3gNode, BSIM3gNode) - TSTALLOC(BSIM3SsPtr, BSIM3sNode, BSIM3sNode) - TSTALLOC(BSIM3BbPtr, BSIM3bNode, BSIM3bNode) - TSTALLOC(BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime) - TSTALLOC(BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime) - TSTALLOC(BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime) - TSTALLOC(BSIM3GbPtr, BSIM3gNode, BSIM3bNode) - TSTALLOC(BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime) - TSTALLOC(BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime) - TSTALLOC(BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime) - TSTALLOC(BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime) - TSTALLOC(BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime) - TSTALLOC(BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime) - TSTALLOC(BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode) - TSTALLOC(BSIM3BgPtr, BSIM3bNode, BSIM3gNode) - TSTALLOC(BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode) - TSTALLOC(BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode) - TSTALLOC(BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode) - TSTALLOC(BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode) - TSTALLOC(BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode) - TSTALLOC(BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime) + TSTALLOC(BSIM3DdPtr, BSIM3dNode, BSIM3dNode); + TSTALLOC(BSIM3GgPtr, BSIM3gNode, BSIM3gNode); + TSTALLOC(BSIM3SsPtr, BSIM3sNode, BSIM3sNode); + TSTALLOC(BSIM3BbPtr, BSIM3bNode, BSIM3bNode); + TSTALLOC(BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime); + TSTALLOC(BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime); + TSTALLOC(BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime); + TSTALLOC(BSIM3GbPtr, BSIM3gNode, BSIM3bNode); + TSTALLOC(BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime); + TSTALLOC(BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime); + TSTALLOC(BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime); + TSTALLOC(BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime); + TSTALLOC(BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime); + TSTALLOC(BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime); + TSTALLOC(BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode); + TSTALLOC(BSIM3BgPtr, BSIM3bNode, BSIM3gNode); + TSTALLOC(BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode); + TSTALLOC(BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode); + TSTALLOC(BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode); + TSTALLOC(BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode); + TSTALLOC(BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode); + TSTALLOC(BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime); - TSTALLOC(BSIM3QqPtr, BSIM3qNode, BSIM3qNode) + TSTALLOC(BSIM3QqPtr, BSIM3qNode, BSIM3qNode); - TSTALLOC(BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime) - TSTALLOC(BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime) - TSTALLOC(BSIM3QgPtr, BSIM3qNode, BSIM3gNode) - TSTALLOC(BSIM3QbPtr, BSIM3qNode, BSIM3bNode) - TSTALLOC(BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode) - TSTALLOC(BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode) - TSTALLOC(BSIM3GqPtr, BSIM3gNode, BSIM3qNode) - TSTALLOC(BSIM3BqPtr, BSIM3bNode, BSIM3qNode) + TSTALLOC(BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime); + TSTALLOC(BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime); + TSTALLOC(BSIM3QgPtr, BSIM3qNode, BSIM3gNode); + TSTALLOC(BSIM3QbPtr, BSIM3qNode, BSIM3bNode); + TSTALLOC(BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode); + TSTALLOC(BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode); + TSTALLOC(BSIM3GqPtr, BSIM3gNode, BSIM3qNode); + TSTALLOC(BSIM3BqPtr, BSIM3bNode, BSIM3qNode); } } diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddset.c b/src/spicelib/devices/bsim3soi_dd/b3soiddset.c index f103ddff1..3fed81aae 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddset.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddset.c @@ -1215,129 +1215,129 @@ IFuid tmpName; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) if ((model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0!=0.0)) { - TSTALLOC(B3SOIDDTemptempPtr, B3SOIDDtempNode, B3SOIDDtempNode) - TSTALLOC(B3SOIDDTempdpPtr, B3SOIDDtempNode, B3SOIDDdNodePrime) - TSTALLOC(B3SOIDDTempspPtr, B3SOIDDtempNode, B3SOIDDsNodePrime) - TSTALLOC(B3SOIDDTempgPtr, B3SOIDDtempNode, B3SOIDDgNode) - TSTALLOC(B3SOIDDTempbPtr, B3SOIDDtempNode, B3SOIDDbNode) - TSTALLOC(B3SOIDDTempePtr, B3SOIDDtempNode, B3SOIDDeNode) + TSTALLOC(B3SOIDDTemptempPtr, B3SOIDDtempNode, B3SOIDDtempNode); + TSTALLOC(B3SOIDDTempdpPtr, B3SOIDDtempNode, B3SOIDDdNodePrime); + TSTALLOC(B3SOIDDTempspPtr, B3SOIDDtempNode, B3SOIDDsNodePrime); + TSTALLOC(B3SOIDDTempgPtr, B3SOIDDtempNode, B3SOIDDgNode); + TSTALLOC(B3SOIDDTempbPtr, B3SOIDDtempNode, B3SOIDDbNode); + TSTALLOC(B3SOIDDTempePtr, B3SOIDDtempNode, B3SOIDDeNode); - TSTALLOC(B3SOIDDGtempPtr, B3SOIDDgNode, B3SOIDDtempNode) - TSTALLOC(B3SOIDDDPtempPtr, B3SOIDDdNodePrime, B3SOIDDtempNode) - TSTALLOC(B3SOIDDSPtempPtr, B3SOIDDsNodePrime, B3SOIDDtempNode) - TSTALLOC(B3SOIDDEtempPtr, B3SOIDDeNode, B3SOIDDtempNode) - TSTALLOC(B3SOIDDBtempPtr, B3SOIDDbNode, B3SOIDDtempNode) + TSTALLOC(B3SOIDDGtempPtr, B3SOIDDgNode, B3SOIDDtempNode); + TSTALLOC(B3SOIDDDPtempPtr, B3SOIDDdNodePrime, B3SOIDDtempNode); + TSTALLOC(B3SOIDDSPtempPtr, B3SOIDDsNodePrime, B3SOIDDtempNode); + TSTALLOC(B3SOIDDEtempPtr, B3SOIDDeNode, B3SOIDDtempNode); + TSTALLOC(B3SOIDDBtempPtr, B3SOIDDbNode, B3SOIDDtempNode); if (here->B3SOIDDbodyMod == 1) { - TSTALLOC(B3SOIDDPtempPtr, B3SOIDDpNode, B3SOIDDtempNode) + TSTALLOC(B3SOIDDPtempPtr, B3SOIDDpNode, B3SOIDDtempNode); } } if (here->B3SOIDDbodyMod == 2) { /* Don't create any Jacobian entry for pNode */ } else if (here->B3SOIDDbodyMod == 1) { - TSTALLOC(B3SOIDDBpPtr, B3SOIDDbNode, B3SOIDDpNode) - TSTALLOC(B3SOIDDPbPtr, B3SOIDDpNode, B3SOIDDbNode) - TSTALLOC(B3SOIDDPpPtr, B3SOIDDpNode, B3SOIDDpNode) - TSTALLOC(B3SOIDDPgPtr, B3SOIDDpNode, B3SOIDDgNode) - TSTALLOC(B3SOIDDPdpPtr, B3SOIDDpNode, B3SOIDDdNodePrime) - TSTALLOC(B3SOIDDPspPtr, B3SOIDDpNode, B3SOIDDsNodePrime) - TSTALLOC(B3SOIDDPePtr, B3SOIDDpNode, B3SOIDDeNode) + TSTALLOC(B3SOIDDBpPtr, B3SOIDDbNode, B3SOIDDpNode); + TSTALLOC(B3SOIDDPbPtr, B3SOIDDpNode, B3SOIDDbNode); + TSTALLOC(B3SOIDDPpPtr, B3SOIDDpNode, B3SOIDDpNode); + TSTALLOC(B3SOIDDPgPtr, B3SOIDDpNode, B3SOIDDgNode); + TSTALLOC(B3SOIDDPdpPtr, B3SOIDDpNode, B3SOIDDdNodePrime); + TSTALLOC(B3SOIDDPspPtr, B3SOIDDpNode, B3SOIDDsNodePrime); + TSTALLOC(B3SOIDDPePtr, B3SOIDDpNode, B3SOIDDeNode); } - TSTALLOC(B3SOIDDEgPtr, B3SOIDDeNode, B3SOIDDgNode) - TSTALLOC(B3SOIDDEdpPtr, B3SOIDDeNode, B3SOIDDdNodePrime) - TSTALLOC(B3SOIDDEspPtr, B3SOIDDeNode, B3SOIDDsNodePrime) - TSTALLOC(B3SOIDDGePtr, B3SOIDDgNode, B3SOIDDeNode) - TSTALLOC(B3SOIDDDPePtr, B3SOIDDdNodePrime, B3SOIDDeNode) - TSTALLOC(B3SOIDDSPePtr, B3SOIDDsNodePrime, B3SOIDDeNode) + TSTALLOC(B3SOIDDEgPtr, B3SOIDDeNode, B3SOIDDgNode); + TSTALLOC(B3SOIDDEdpPtr, B3SOIDDeNode, B3SOIDDdNodePrime); + TSTALLOC(B3SOIDDEspPtr, B3SOIDDeNode, B3SOIDDsNodePrime); + TSTALLOC(B3SOIDDGePtr, B3SOIDDgNode, B3SOIDDeNode); + TSTALLOC(B3SOIDDDPePtr, B3SOIDDdNodePrime, B3SOIDDeNode); + TSTALLOC(B3SOIDDSPePtr, B3SOIDDsNodePrime, B3SOIDDeNode); - TSTALLOC(B3SOIDDEbPtr, B3SOIDDeNode, B3SOIDDbNode) - TSTALLOC(B3SOIDDGbPtr, B3SOIDDgNode, B3SOIDDbNode) - TSTALLOC(B3SOIDDDPbPtr, B3SOIDDdNodePrime, B3SOIDDbNode) - TSTALLOC(B3SOIDDSPbPtr, B3SOIDDsNodePrime, B3SOIDDbNode) - TSTALLOC(B3SOIDDBePtr, B3SOIDDbNode, B3SOIDDeNode) - TSTALLOC(B3SOIDDBgPtr, B3SOIDDbNode, B3SOIDDgNode) - TSTALLOC(B3SOIDDBdpPtr, B3SOIDDbNode, B3SOIDDdNodePrime) - TSTALLOC(B3SOIDDBspPtr, B3SOIDDbNode, B3SOIDDsNodePrime) - TSTALLOC(B3SOIDDBbPtr, B3SOIDDbNode, B3SOIDDbNode) + TSTALLOC(B3SOIDDEbPtr, B3SOIDDeNode, B3SOIDDbNode); + TSTALLOC(B3SOIDDGbPtr, B3SOIDDgNode, B3SOIDDbNode); + TSTALLOC(B3SOIDDDPbPtr, B3SOIDDdNodePrime, B3SOIDDbNode); + TSTALLOC(B3SOIDDSPbPtr, B3SOIDDsNodePrime, B3SOIDDbNode); + TSTALLOC(B3SOIDDBePtr, B3SOIDDbNode, B3SOIDDeNode); + TSTALLOC(B3SOIDDBgPtr, B3SOIDDbNode, B3SOIDDgNode); + TSTALLOC(B3SOIDDBdpPtr, B3SOIDDbNode, B3SOIDDdNodePrime); + TSTALLOC(B3SOIDDBspPtr, B3SOIDDbNode, B3SOIDDsNodePrime); + TSTALLOC(B3SOIDDBbPtr, B3SOIDDbNode, B3SOIDDbNode); - TSTALLOC(B3SOIDDEePtr, B3SOIDDeNode, B3SOIDDeNode) + TSTALLOC(B3SOIDDEePtr, B3SOIDDeNode, B3SOIDDeNode); - TSTALLOC(B3SOIDDGgPtr, B3SOIDDgNode, B3SOIDDgNode) - TSTALLOC(B3SOIDDGdpPtr, B3SOIDDgNode, B3SOIDDdNodePrime) - TSTALLOC(B3SOIDDGspPtr, B3SOIDDgNode, B3SOIDDsNodePrime) + TSTALLOC(B3SOIDDGgPtr, B3SOIDDgNode, B3SOIDDgNode); + TSTALLOC(B3SOIDDGdpPtr, B3SOIDDgNode, B3SOIDDdNodePrime); + TSTALLOC(B3SOIDDGspPtr, B3SOIDDgNode, B3SOIDDsNodePrime); - TSTALLOC(B3SOIDDDPgPtr, B3SOIDDdNodePrime, B3SOIDDgNode) - TSTALLOC(B3SOIDDDPdpPtr, B3SOIDDdNodePrime, B3SOIDDdNodePrime) - TSTALLOC(B3SOIDDDPspPtr, B3SOIDDdNodePrime, B3SOIDDsNodePrime) - TSTALLOC(B3SOIDDDPdPtr, B3SOIDDdNodePrime, B3SOIDDdNode) + TSTALLOC(B3SOIDDDPgPtr, B3SOIDDdNodePrime, B3SOIDDgNode); + TSTALLOC(B3SOIDDDPdpPtr, B3SOIDDdNodePrime, B3SOIDDdNodePrime); + TSTALLOC(B3SOIDDDPspPtr, B3SOIDDdNodePrime, B3SOIDDsNodePrime); + TSTALLOC(B3SOIDDDPdPtr, B3SOIDDdNodePrime, B3SOIDDdNode); - TSTALLOC(B3SOIDDSPgPtr, B3SOIDDsNodePrime, B3SOIDDgNode) - TSTALLOC(B3SOIDDSPdpPtr, B3SOIDDsNodePrime, B3SOIDDdNodePrime) - TSTALLOC(B3SOIDDSPspPtr, B3SOIDDsNodePrime, B3SOIDDsNodePrime) - TSTALLOC(B3SOIDDSPsPtr, B3SOIDDsNodePrime, B3SOIDDsNode) + TSTALLOC(B3SOIDDSPgPtr, B3SOIDDsNodePrime, B3SOIDDgNode); + TSTALLOC(B3SOIDDSPdpPtr, B3SOIDDsNodePrime, B3SOIDDdNodePrime); + TSTALLOC(B3SOIDDSPspPtr, B3SOIDDsNodePrime, B3SOIDDsNodePrime); + TSTALLOC(B3SOIDDSPsPtr, B3SOIDDsNodePrime, B3SOIDDsNode); - TSTALLOC(B3SOIDDDdPtr, B3SOIDDdNode, B3SOIDDdNode) - TSTALLOC(B3SOIDDDdpPtr, B3SOIDDdNode, B3SOIDDdNodePrime) + TSTALLOC(B3SOIDDDdPtr, B3SOIDDdNode, B3SOIDDdNode); + TSTALLOC(B3SOIDDDdpPtr, B3SOIDDdNode, B3SOIDDdNodePrime); - TSTALLOC(B3SOIDDSsPtr, B3SOIDDsNode, B3SOIDDsNode) - TSTALLOC(B3SOIDDSspPtr, B3SOIDDsNode, B3SOIDDsNodePrime) + TSTALLOC(B3SOIDDSsPtr, B3SOIDDsNode, B3SOIDDsNode); + TSTALLOC(B3SOIDDSspPtr, B3SOIDDsNode, B3SOIDDsNodePrime); /* here for debugging purpose only */ if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1)) { - TSTALLOC(B3SOIDDVbsPtr, B3SOIDDvbsNode, B3SOIDDvbsNode) - TSTALLOC(B3SOIDDIdsPtr, B3SOIDDidsNode, B3SOIDDidsNode) - TSTALLOC(B3SOIDDIcPtr, B3SOIDDicNode, B3SOIDDicNode) - TSTALLOC(B3SOIDDIbsPtr, B3SOIDDibsNode, B3SOIDDibsNode) - TSTALLOC(B3SOIDDIbdPtr, B3SOIDDibdNode, B3SOIDDibdNode) - TSTALLOC(B3SOIDDIiiPtr, B3SOIDDiiiNode, B3SOIDDiiiNode) - TSTALLOC(B3SOIDDIgidlPtr, B3SOIDDigidlNode, B3SOIDDigidlNode) - TSTALLOC(B3SOIDDItunPtr, B3SOIDDitunNode, B3SOIDDitunNode) - TSTALLOC(B3SOIDDIbpPtr, B3SOIDDibpNode, B3SOIDDibpNode) - TSTALLOC(B3SOIDDAbeffPtr, B3SOIDDabeffNode, B3SOIDDabeffNode) - TSTALLOC(B3SOIDDVbs0effPtr, B3SOIDDvbs0effNode, B3SOIDDvbs0effNode) - TSTALLOC(B3SOIDDVbseffPtr, B3SOIDDvbseffNode, B3SOIDDvbseffNode) - TSTALLOC(B3SOIDDXcPtr, B3SOIDDxcNode, B3SOIDDxcNode) - TSTALLOC(B3SOIDDCbbPtr, B3SOIDDcbbNode, B3SOIDDcbbNode) - TSTALLOC(B3SOIDDCbdPtr, B3SOIDDcbdNode, B3SOIDDcbdNode) - TSTALLOC(B3SOIDDCbgPtr, B3SOIDDcbgNode, B3SOIDDcbgNode) - TSTALLOC(B3SOIDDqbPtr, B3SOIDDqbNode, B3SOIDDqbNode) - TSTALLOC(B3SOIDDQbfPtr, B3SOIDDqbfNode, B3SOIDDqbfNode) - TSTALLOC(B3SOIDDQjsPtr, B3SOIDDqjsNode, B3SOIDDqjsNode) - TSTALLOC(B3SOIDDQjdPtr, B3SOIDDqjdNode, B3SOIDDqjdNode) + TSTALLOC(B3SOIDDVbsPtr, B3SOIDDvbsNode, B3SOIDDvbsNode) ; + TSTALLOC(B3SOIDDIdsPtr, B3SOIDDidsNode, B3SOIDDidsNode); + TSTALLOC(B3SOIDDIcPtr, B3SOIDDicNode, B3SOIDDicNode); + TSTALLOC(B3SOIDDIbsPtr, B3SOIDDibsNode, B3SOIDDibsNode); + TSTALLOC(B3SOIDDIbdPtr, B3SOIDDibdNode, B3SOIDDibdNode); + TSTALLOC(B3SOIDDIiiPtr, B3SOIDDiiiNode, B3SOIDDiiiNode); + TSTALLOC(B3SOIDDIgidlPtr, B3SOIDDigidlNode, B3SOIDDigidlNode); + TSTALLOC(B3SOIDDItunPtr, B3SOIDDitunNode, B3SOIDDitunNode); + TSTALLOC(B3SOIDDIbpPtr, B3SOIDDibpNode, B3SOIDDibpNode); + TSTALLOC(B3SOIDDAbeffPtr, B3SOIDDabeffNode, B3SOIDDabeffNode); + TSTALLOC(B3SOIDDVbs0effPtr, B3SOIDDvbs0effNode, B3SOIDDvbs0effNode); + TSTALLOC(B3SOIDDVbseffPtr, B3SOIDDvbseffNode, B3SOIDDvbseffNode); + TSTALLOC(B3SOIDDXcPtr, B3SOIDDxcNode, B3SOIDDxcNode); + TSTALLOC(B3SOIDDCbbPtr, B3SOIDDcbbNode, B3SOIDDcbbNode); + TSTALLOC(B3SOIDDCbdPtr, B3SOIDDcbdNode, B3SOIDDcbdNode); + TSTALLOC(B3SOIDDCbgPtr, B3SOIDDcbgNode, B3SOIDDcbgNode); + TSTALLOC(B3SOIDDqbPtr, B3SOIDDqbNode, B3SOIDDqbNode); + TSTALLOC(B3SOIDDQbfPtr, B3SOIDDqbfNode, B3SOIDDqbfNode); + TSTALLOC(B3SOIDDQjsPtr, B3SOIDDqjsNode, B3SOIDDqjsNode); + TSTALLOC(B3SOIDDQjdPtr, B3SOIDDqjdNode, B3SOIDDqjdNode); /* clean up last */ - TSTALLOC(B3SOIDDGmPtr, B3SOIDDgmNode, B3SOIDDgmNode) - TSTALLOC(B3SOIDDGmbsPtr, B3SOIDDgmbsNode, B3SOIDDgmbsNode) - TSTALLOC(B3SOIDDGdsPtr, B3SOIDDgdsNode, B3SOIDDgdsNode) - TSTALLOC(B3SOIDDGmePtr, B3SOIDDgmeNode, B3SOIDDgmeNode) - TSTALLOC(B3SOIDDVbs0teffPtr, B3SOIDDvbs0teffNode, B3SOIDDvbs0teffNode) - TSTALLOC(B3SOIDDVthPtr, B3SOIDDvthNode, B3SOIDDvthNode) - TSTALLOC(B3SOIDDVgsteffPtr, B3SOIDDvgsteffNode, B3SOIDDvgsteffNode) - TSTALLOC(B3SOIDDXcsatPtr, B3SOIDDxcsatNode, B3SOIDDxcsatNode) - TSTALLOC(B3SOIDDVcscvPtr, B3SOIDDvcscvNode, B3SOIDDvcscvNode) - TSTALLOC(B3SOIDDVdscvPtr, B3SOIDDvdscvNode, B3SOIDDvdscvNode) - TSTALLOC(B3SOIDDCbePtr, B3SOIDDcbeNode, B3SOIDDcbeNode) - TSTALLOC(B3SOIDDDum1Ptr, B3SOIDDdum1Node, B3SOIDDdum1Node) - TSTALLOC(B3SOIDDDum2Ptr, B3SOIDDdum2Node, B3SOIDDdum2Node) - TSTALLOC(B3SOIDDDum3Ptr, B3SOIDDdum3Node, B3SOIDDdum3Node) - TSTALLOC(B3SOIDDDum4Ptr, B3SOIDDdum4Node, B3SOIDDdum4Node) - TSTALLOC(B3SOIDDDum5Ptr, B3SOIDDdum5Node, B3SOIDDdum5Node) - TSTALLOC(B3SOIDDQaccPtr, B3SOIDDqaccNode, B3SOIDDqaccNode) - TSTALLOC(B3SOIDDQsub0Ptr, B3SOIDDqsub0Node, B3SOIDDqsub0Node) - TSTALLOC(B3SOIDDQsubs1Ptr, B3SOIDDqsubs1Node, B3SOIDDqsubs1Node) - TSTALLOC(B3SOIDDQsubs2Ptr, B3SOIDDqsubs2Node, B3SOIDDqsubs2Node) - TSTALLOC(B3SOIDDqePtr, B3SOIDDqeNode, B3SOIDDqeNode) - TSTALLOC(B3SOIDDqdPtr, B3SOIDDqdNode, B3SOIDDqdNode) - TSTALLOC(B3SOIDDqgPtr, B3SOIDDqgNode, B3SOIDDqgNode) + TSTALLOC(B3SOIDDGmPtr, B3SOIDDgmNode, B3SOIDDgmNode); + TSTALLOC(B3SOIDDGmbsPtr, B3SOIDDgmbsNode, B3SOIDDgmbsNode); + TSTALLOC(B3SOIDDGdsPtr, B3SOIDDgdsNode, B3SOIDDgdsNode); + TSTALLOC(B3SOIDDGmePtr, B3SOIDDgmeNode, B3SOIDDgmeNode); + TSTALLOC(B3SOIDDVbs0teffPtr, B3SOIDDvbs0teffNode, B3SOIDDvbs0teffNode); + TSTALLOC(B3SOIDDVthPtr, B3SOIDDvthNode, B3SOIDDvthNode); + TSTALLOC(B3SOIDDVgsteffPtr, B3SOIDDvgsteffNode, B3SOIDDvgsteffNode); + TSTALLOC(B3SOIDDXcsatPtr, B3SOIDDxcsatNode, B3SOIDDxcsatNode); + TSTALLOC(B3SOIDDVcscvPtr, B3SOIDDvcscvNode, B3SOIDDvcscvNode); + TSTALLOC(B3SOIDDVdscvPtr, B3SOIDDvdscvNode, B3SOIDDvdscvNode); + TSTALLOC(B3SOIDDCbePtr, B3SOIDDcbeNode, B3SOIDDcbeNode); + TSTALLOC(B3SOIDDDum1Ptr, B3SOIDDdum1Node, B3SOIDDdum1Node); + TSTALLOC(B3SOIDDDum2Ptr, B3SOIDDdum2Node, B3SOIDDdum2Node); + TSTALLOC(B3SOIDDDum3Ptr, B3SOIDDdum3Node, B3SOIDDdum3Node); + TSTALLOC(B3SOIDDDum4Ptr, B3SOIDDdum4Node, B3SOIDDdum4Node); + TSTALLOC(B3SOIDDDum5Ptr, B3SOIDDdum5Node, B3SOIDDdum5Node); + TSTALLOC(B3SOIDDQaccPtr, B3SOIDDqaccNode, B3SOIDDqaccNode); + TSTALLOC(B3SOIDDQsub0Ptr, B3SOIDDqsub0Node, B3SOIDDqsub0Node); + TSTALLOC(B3SOIDDQsubs1Ptr, B3SOIDDqsubs1Node, B3SOIDDqsubs1Node); + TSTALLOC(B3SOIDDQsubs2Ptr, B3SOIDDqsubs2Node, B3SOIDDqsubs2Node); + TSTALLOC(B3SOIDDqePtr, B3SOIDDqeNode, B3SOIDDqeNode); + TSTALLOC(B3SOIDDqdPtr, B3SOIDDqdNode, B3SOIDDqdNode); + TSTALLOC(B3SOIDDqgPtr, B3SOIDDqgNode, B3SOIDDqgNode); } } diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdset.c b/src/spicelib/devices/bsim3soi_fd/b3soifdset.c index 6e6c8ebdb..242aa1517 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdset.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdset.c @@ -1213,120 +1213,120 @@ IFuid tmpName; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) if ((model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0!=0.0)) { - TSTALLOC(B3SOIFDTemptempPtr, B3SOIFDtempNode, B3SOIFDtempNode) - TSTALLOC(B3SOIFDTempdpPtr, B3SOIFDtempNode, B3SOIFDdNodePrime) - TSTALLOC(B3SOIFDTempspPtr, B3SOIFDtempNode, B3SOIFDsNodePrime) - TSTALLOC(B3SOIFDTempgPtr, B3SOIFDtempNode, B3SOIFDgNode) - TSTALLOC(B3SOIFDTempbPtr, B3SOIFDtempNode, B3SOIFDbNode) - TSTALLOC(B3SOIFDTempePtr, B3SOIFDtempNode, B3SOIFDeNode) + TSTALLOC(B3SOIFDTemptempPtr, B3SOIFDtempNode, B3SOIFDtempNode); + TSTALLOC(B3SOIFDTempdpPtr, B3SOIFDtempNode, B3SOIFDdNodePrime); + TSTALLOC(B3SOIFDTempspPtr, B3SOIFDtempNode, B3SOIFDsNodePrime); + TSTALLOC(B3SOIFDTempgPtr, B3SOIFDtempNode, B3SOIFDgNode); + TSTALLOC(B3SOIFDTempbPtr, B3SOIFDtempNode, B3SOIFDbNode); + TSTALLOC(B3SOIFDTempePtr, B3SOIFDtempNode, B3SOIFDeNode); - TSTALLOC(B3SOIFDGtempPtr, B3SOIFDgNode, B3SOIFDtempNode) - TSTALLOC(B3SOIFDDPtempPtr, B3SOIFDdNodePrime, B3SOIFDtempNode) - TSTALLOC(B3SOIFDSPtempPtr, B3SOIFDsNodePrime, B3SOIFDtempNode) - TSTALLOC(B3SOIFDEtempPtr, B3SOIFDeNode, B3SOIFDtempNode) - TSTALLOC(B3SOIFDBtempPtr, B3SOIFDbNode, B3SOIFDtempNode) + TSTALLOC(B3SOIFDGtempPtr, B3SOIFDgNode, B3SOIFDtempNode); + TSTALLOC(B3SOIFDDPtempPtr, B3SOIFDdNodePrime, B3SOIFDtempNode); + TSTALLOC(B3SOIFDSPtempPtr, B3SOIFDsNodePrime, B3SOIFDtempNode); + TSTALLOC(B3SOIFDEtempPtr, B3SOIFDeNode, B3SOIFDtempNode); + TSTALLOC(B3SOIFDBtempPtr, B3SOIFDbNode, B3SOIFDtempNode); if (here->B3SOIFDbodyMod == 1) { - TSTALLOC(B3SOIFDPtempPtr, B3SOIFDpNode, B3SOIFDtempNode) + TSTALLOC(B3SOIFDPtempPtr, B3SOIFDpNode, B3SOIFDtempNode); } } if (here->B3SOIFDbodyMod == 2) { /* Don't create any Jacobian entry for pNode */ } else if (here->B3SOIFDbodyMod == 1) { - TSTALLOC(B3SOIFDBpPtr, B3SOIFDbNode, B3SOIFDpNode) - TSTALLOC(B3SOIFDPbPtr, B3SOIFDpNode, B3SOIFDbNode) - TSTALLOC(B3SOIFDPpPtr, B3SOIFDpNode, B3SOIFDpNode) - TSTALLOC(B3SOIFDPgPtr, B3SOIFDpNode, B3SOIFDgNode) - TSTALLOC(B3SOIFDPdpPtr, B3SOIFDpNode, B3SOIFDdNodePrime) - TSTALLOC(B3SOIFDPspPtr, B3SOIFDpNode, B3SOIFDsNodePrime) - TSTALLOC(B3SOIFDPePtr, B3SOIFDpNode, B3SOIFDeNode) + TSTALLOC(B3SOIFDBpPtr, B3SOIFDbNode, B3SOIFDpNode); + TSTALLOC(B3SOIFDPbPtr, B3SOIFDpNode, B3SOIFDbNode); + TSTALLOC(B3SOIFDPpPtr, B3SOIFDpNode, B3SOIFDpNode); + TSTALLOC(B3SOIFDPgPtr, B3SOIFDpNode, B3SOIFDgNode); + TSTALLOC(B3SOIFDPdpPtr, B3SOIFDpNode, B3SOIFDdNodePrime); + TSTALLOC(B3SOIFDPspPtr, B3SOIFDpNode, B3SOIFDsNodePrime); + TSTALLOC(B3SOIFDPePtr, B3SOIFDpNode, B3SOIFDeNode); } - TSTALLOC(B3SOIFDEgPtr, B3SOIFDeNode, B3SOIFDgNode) - TSTALLOC(B3SOIFDEdpPtr, B3SOIFDeNode, B3SOIFDdNodePrime) - TSTALLOC(B3SOIFDEspPtr, B3SOIFDeNode, B3SOIFDsNodePrime) - TSTALLOC(B3SOIFDGePtr, B3SOIFDgNode, B3SOIFDeNode) - TSTALLOC(B3SOIFDDPePtr, B3SOIFDdNodePrime, B3SOIFDeNode) - TSTALLOC(B3SOIFDSPePtr, B3SOIFDsNodePrime, B3SOIFDeNode) + TSTALLOC(B3SOIFDEgPtr, B3SOIFDeNode, B3SOIFDgNode); + TSTALLOC(B3SOIFDEdpPtr, B3SOIFDeNode, B3SOIFDdNodePrime); + TSTALLOC(B3SOIFDEspPtr, B3SOIFDeNode, B3SOIFDsNodePrime); + TSTALLOC(B3SOIFDGePtr, B3SOIFDgNode, B3SOIFDeNode); + TSTALLOC(B3SOIFDDPePtr, B3SOIFDdNodePrime, B3SOIFDeNode); + TSTALLOC(B3SOIFDSPePtr, B3SOIFDsNodePrime, B3SOIFDeNode); - TSTALLOC(B3SOIFDEbPtr, B3SOIFDeNode, B3SOIFDbNode) - TSTALLOC(B3SOIFDEePtr, B3SOIFDeNode, B3SOIFDeNode) + TSTALLOC(B3SOIFDEbPtr, B3SOIFDeNode, B3SOIFDbNode); + TSTALLOC(B3SOIFDEePtr, B3SOIFDeNode, B3SOIFDeNode); - TSTALLOC(B3SOIFDGgPtr, B3SOIFDgNode, B3SOIFDgNode) - TSTALLOC(B3SOIFDGdpPtr, B3SOIFDgNode, B3SOIFDdNodePrime) - TSTALLOC(B3SOIFDGspPtr, B3SOIFDgNode, B3SOIFDsNodePrime) + TSTALLOC(B3SOIFDGgPtr, B3SOIFDgNode, B3SOIFDgNode); + TSTALLOC(B3SOIFDGdpPtr, B3SOIFDgNode, B3SOIFDdNodePrime); + TSTALLOC(B3SOIFDGspPtr, B3SOIFDgNode, B3SOIFDsNodePrime); - TSTALLOC(B3SOIFDDPgPtr, B3SOIFDdNodePrime, B3SOIFDgNode) - TSTALLOC(B3SOIFDDPdpPtr, B3SOIFDdNodePrime, B3SOIFDdNodePrime) - TSTALLOC(B3SOIFDDPspPtr, B3SOIFDdNodePrime, B3SOIFDsNodePrime) - TSTALLOC(B3SOIFDDPdPtr, B3SOIFDdNodePrime, B3SOIFDdNode) + TSTALLOC(B3SOIFDDPgPtr, B3SOIFDdNodePrime, B3SOIFDgNode); + TSTALLOC(B3SOIFDDPdpPtr, B3SOIFDdNodePrime, B3SOIFDdNodePrime); + TSTALLOC(B3SOIFDDPspPtr, B3SOIFDdNodePrime, B3SOIFDsNodePrime); + TSTALLOC(B3SOIFDDPdPtr, B3SOIFDdNodePrime, B3SOIFDdNode); - TSTALLOC(B3SOIFDSPgPtr, B3SOIFDsNodePrime, B3SOIFDgNode) - TSTALLOC(B3SOIFDSPdpPtr, B3SOIFDsNodePrime, B3SOIFDdNodePrime) - TSTALLOC(B3SOIFDSPspPtr, B3SOIFDsNodePrime, B3SOIFDsNodePrime) - TSTALLOC(B3SOIFDSPsPtr, B3SOIFDsNodePrime, B3SOIFDsNode) + TSTALLOC(B3SOIFDSPgPtr, B3SOIFDsNodePrime, B3SOIFDgNode); + TSTALLOC(B3SOIFDSPdpPtr, B3SOIFDsNodePrime, B3SOIFDdNodePrime); + TSTALLOC(B3SOIFDSPspPtr, B3SOIFDsNodePrime, B3SOIFDsNodePrime); + TSTALLOC(B3SOIFDSPsPtr, B3SOIFDsNodePrime, B3SOIFDsNode); - TSTALLOC(B3SOIFDDdPtr, B3SOIFDdNode, B3SOIFDdNode) - TSTALLOC(B3SOIFDDdpPtr, B3SOIFDdNode, B3SOIFDdNodePrime) + TSTALLOC(B3SOIFDDdPtr, B3SOIFDdNode, B3SOIFDdNode); + TSTALLOC(B3SOIFDDdpPtr, B3SOIFDdNode, B3SOIFDdNodePrime); - TSTALLOC(B3SOIFDSsPtr, B3SOIFDsNode, B3SOIFDsNode) - TSTALLOC(B3SOIFDSspPtr, B3SOIFDsNode, B3SOIFDsNodePrime) + TSTALLOC(B3SOIFDSsPtr, B3SOIFDsNode, B3SOIFDsNode); + TSTALLOC(B3SOIFDSspPtr, B3SOIFDsNode, B3SOIFDsNodePrime); /* here for debugging purpose only */ if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1)) { - TSTALLOC(B3SOIFDVbsPtr, B3SOIFDvbsNode, B3SOIFDvbsNode) - TSTALLOC(B3SOIFDIdsPtr, B3SOIFDidsNode, B3SOIFDidsNode) - TSTALLOC(B3SOIFDIcPtr, B3SOIFDicNode, B3SOIFDicNode) - TSTALLOC(B3SOIFDIbsPtr, B3SOIFDibsNode, B3SOIFDibsNode) - TSTALLOC(B3SOIFDIbdPtr, B3SOIFDibdNode, B3SOIFDibdNode) - TSTALLOC(B3SOIFDIiiPtr, B3SOIFDiiiNode, B3SOIFDiiiNode) - TSTALLOC(B3SOIFDIgidlPtr, B3SOIFDigidlNode, B3SOIFDigidlNode) - TSTALLOC(B3SOIFDItunPtr, B3SOIFDitunNode, B3SOIFDitunNode) - TSTALLOC(B3SOIFDIbpPtr, B3SOIFDibpNode, B3SOIFDibpNode) - TSTALLOC(B3SOIFDAbeffPtr, B3SOIFDabeffNode, B3SOIFDabeffNode) - TSTALLOC(B3SOIFDVbs0effPtr, B3SOIFDvbs0effNode, B3SOIFDvbs0effNode) - TSTALLOC(B3SOIFDVbseffPtr, B3SOIFDvbseffNode, B3SOIFDvbseffNode) - TSTALLOC(B3SOIFDXcPtr, B3SOIFDxcNode, B3SOIFDxcNode) - TSTALLOC(B3SOIFDCbbPtr, B3SOIFDcbbNode, B3SOIFDcbbNode) - TSTALLOC(B3SOIFDCbdPtr, B3SOIFDcbdNode, B3SOIFDcbdNode) - TSTALLOC(B3SOIFDCbgPtr, B3SOIFDcbgNode, B3SOIFDcbgNode) - TSTALLOC(B3SOIFDqbPtr, B3SOIFDqbNode, B3SOIFDqbNode) - TSTALLOC(B3SOIFDQbfPtr, B3SOIFDqbfNode, B3SOIFDqbfNode) - TSTALLOC(B3SOIFDQjsPtr, B3SOIFDqjsNode, B3SOIFDqjsNode) - TSTALLOC(B3SOIFDQjdPtr, B3SOIFDqjdNode, B3SOIFDqjdNode) + TSTALLOC(B3SOIFDVbsPtr, B3SOIFDvbsNode, B3SOIFDvbsNode) ; + TSTALLOC(B3SOIFDIdsPtr, B3SOIFDidsNode, B3SOIFDidsNode); + TSTALLOC(B3SOIFDIcPtr, B3SOIFDicNode, B3SOIFDicNode); + TSTALLOC(B3SOIFDIbsPtr, B3SOIFDibsNode, B3SOIFDibsNode); + TSTALLOC(B3SOIFDIbdPtr, B3SOIFDibdNode, B3SOIFDibdNode); + TSTALLOC(B3SOIFDIiiPtr, B3SOIFDiiiNode, B3SOIFDiiiNode); + TSTALLOC(B3SOIFDIgidlPtr, B3SOIFDigidlNode, B3SOIFDigidlNode); + TSTALLOC(B3SOIFDItunPtr, B3SOIFDitunNode, B3SOIFDitunNode); + TSTALLOC(B3SOIFDIbpPtr, B3SOIFDibpNode, B3SOIFDibpNode); + TSTALLOC(B3SOIFDAbeffPtr, B3SOIFDabeffNode, B3SOIFDabeffNode); + TSTALLOC(B3SOIFDVbs0effPtr, B3SOIFDvbs0effNode, B3SOIFDvbs0effNode); + TSTALLOC(B3SOIFDVbseffPtr, B3SOIFDvbseffNode, B3SOIFDvbseffNode); + TSTALLOC(B3SOIFDXcPtr, B3SOIFDxcNode, B3SOIFDxcNode); + TSTALLOC(B3SOIFDCbbPtr, B3SOIFDcbbNode, B3SOIFDcbbNode); + TSTALLOC(B3SOIFDCbdPtr, B3SOIFDcbdNode, B3SOIFDcbdNode); + TSTALLOC(B3SOIFDCbgPtr, B3SOIFDcbgNode, B3SOIFDcbgNode); + TSTALLOC(B3SOIFDqbPtr, B3SOIFDqbNode, B3SOIFDqbNode); + TSTALLOC(B3SOIFDQbfPtr, B3SOIFDqbfNode, B3SOIFDqbfNode); + TSTALLOC(B3SOIFDQjsPtr, B3SOIFDqjsNode, B3SOIFDqjsNode); + TSTALLOC(B3SOIFDQjdPtr, B3SOIFDqjdNode, B3SOIFDqjdNode); /* clean up last */ - TSTALLOC(B3SOIFDGmPtr, B3SOIFDgmNode, B3SOIFDgmNode) - TSTALLOC(B3SOIFDGmbsPtr, B3SOIFDgmbsNode, B3SOIFDgmbsNode) - TSTALLOC(B3SOIFDGdsPtr, B3SOIFDgdsNode, B3SOIFDgdsNode) - TSTALLOC(B3SOIFDGmePtr, B3SOIFDgmeNode, B3SOIFDgmeNode) - TSTALLOC(B3SOIFDVbs0teffPtr, B3SOIFDvbs0teffNode, B3SOIFDvbs0teffNode) - TSTALLOC(B3SOIFDVthPtr, B3SOIFDvthNode, B3SOIFDvthNode) - TSTALLOC(B3SOIFDVgsteffPtr, B3SOIFDvgsteffNode, B3SOIFDvgsteffNode) - TSTALLOC(B3SOIFDXcsatPtr, B3SOIFDxcsatNode, B3SOIFDxcsatNode) - TSTALLOC(B3SOIFDVcscvPtr, B3SOIFDvcscvNode, B3SOIFDvcscvNode) - TSTALLOC(B3SOIFDVdscvPtr, B3SOIFDvdscvNode, B3SOIFDvdscvNode) - TSTALLOC(B3SOIFDCbePtr, B3SOIFDcbeNode, B3SOIFDcbeNode) - TSTALLOC(B3SOIFDDum1Ptr, B3SOIFDdum1Node, B3SOIFDdum1Node) - TSTALLOC(B3SOIFDDum2Ptr, B3SOIFDdum2Node, B3SOIFDdum2Node) - TSTALLOC(B3SOIFDDum3Ptr, B3SOIFDdum3Node, B3SOIFDdum3Node) - TSTALLOC(B3SOIFDDum4Ptr, B3SOIFDdum4Node, B3SOIFDdum4Node) - TSTALLOC(B3SOIFDDum5Ptr, B3SOIFDdum5Node, B3SOIFDdum5Node) - TSTALLOC(B3SOIFDQaccPtr, B3SOIFDqaccNode, B3SOIFDqaccNode) - TSTALLOC(B3SOIFDQsub0Ptr, B3SOIFDqsub0Node, B3SOIFDqsub0Node) - TSTALLOC(B3SOIFDQsubs1Ptr, B3SOIFDqsubs1Node, B3SOIFDqsubs1Node) - TSTALLOC(B3SOIFDQsubs2Ptr, B3SOIFDqsubs2Node, B3SOIFDqsubs2Node) - TSTALLOC(B3SOIFDqePtr, B3SOIFDqeNode, B3SOIFDqeNode) - TSTALLOC(B3SOIFDqdPtr, B3SOIFDqdNode, B3SOIFDqdNode) - TSTALLOC(B3SOIFDqgPtr, B3SOIFDqgNode, B3SOIFDqgNode) + TSTALLOC(B3SOIFDGmPtr, B3SOIFDgmNode, B3SOIFDgmNode); + TSTALLOC(B3SOIFDGmbsPtr, B3SOIFDgmbsNode, B3SOIFDgmbsNode); + TSTALLOC(B3SOIFDGdsPtr, B3SOIFDgdsNode, B3SOIFDgdsNode); + TSTALLOC(B3SOIFDGmePtr, B3SOIFDgmeNode, B3SOIFDgmeNode); + TSTALLOC(B3SOIFDVbs0teffPtr, B3SOIFDvbs0teffNode, B3SOIFDvbs0teffNode); + TSTALLOC(B3SOIFDVthPtr, B3SOIFDvthNode, B3SOIFDvthNode); + TSTALLOC(B3SOIFDVgsteffPtr, B3SOIFDvgsteffNode, B3SOIFDvgsteffNode); + TSTALLOC(B3SOIFDXcsatPtr, B3SOIFDxcsatNode, B3SOIFDxcsatNode); + TSTALLOC(B3SOIFDVcscvPtr, B3SOIFDvcscvNode, B3SOIFDvcscvNode); + TSTALLOC(B3SOIFDVdscvPtr, B3SOIFDvdscvNode, B3SOIFDvdscvNode); + TSTALLOC(B3SOIFDCbePtr, B3SOIFDcbeNode, B3SOIFDcbeNode); + TSTALLOC(B3SOIFDDum1Ptr, B3SOIFDdum1Node, B3SOIFDdum1Node); + TSTALLOC(B3SOIFDDum2Ptr, B3SOIFDdum2Node, B3SOIFDdum2Node); + TSTALLOC(B3SOIFDDum3Ptr, B3SOIFDdum3Node, B3SOIFDdum3Node); + TSTALLOC(B3SOIFDDum4Ptr, B3SOIFDdum4Node, B3SOIFDdum4Node); + TSTALLOC(B3SOIFDDum5Ptr, B3SOIFDdum5Node, B3SOIFDdum5Node); + TSTALLOC(B3SOIFDQaccPtr, B3SOIFDqaccNode, B3SOIFDqaccNode); + TSTALLOC(B3SOIFDQsub0Ptr, B3SOIFDqsub0Node, B3SOIFDqsub0Node); + TSTALLOC(B3SOIFDQsubs1Ptr, B3SOIFDqsubs1Node, B3SOIFDqsubs1Node); + TSTALLOC(B3SOIFDQsubs2Ptr, B3SOIFDqsubs2Node, B3SOIFDqsubs2Node); + TSTALLOC(B3SOIFDqePtr, B3SOIFDqeNode, B3SOIFDqeNode); + TSTALLOC(B3SOIFDqdPtr, B3SOIFDqdNode, B3SOIFDqdNode); + TSTALLOC(B3SOIFDqgPtr, B3SOIFDqgNode, B3SOIFDqgNode); } } diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c b/src/spicelib/devices/bsim3soi_pd/b3soipdset.c index eeb731037..8a4e3b047 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdset.c @@ -1347,98 +1347,98 @@ IFuid tmpName; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0.0)) { - TSTALLOC(B3SOIPDTemptempPtr, B3SOIPDtempNode, B3SOIPDtempNode) - TSTALLOC(B3SOIPDTempdpPtr, B3SOIPDtempNode, B3SOIPDdNodePrime) - TSTALLOC(B3SOIPDTempspPtr, B3SOIPDtempNode, B3SOIPDsNodePrime) - TSTALLOC(B3SOIPDTempgPtr, B3SOIPDtempNode, B3SOIPDgNode) - TSTALLOC(B3SOIPDTempbPtr, B3SOIPDtempNode, B3SOIPDbNode) + TSTALLOC(B3SOIPDTemptempPtr, B3SOIPDtempNode, B3SOIPDtempNode); + TSTALLOC(B3SOIPDTempdpPtr, B3SOIPDtempNode, B3SOIPDdNodePrime); + TSTALLOC(B3SOIPDTempspPtr, B3SOIPDtempNode, B3SOIPDsNodePrime); + TSTALLOC(B3SOIPDTempgPtr, B3SOIPDtempNode, B3SOIPDgNode); + TSTALLOC(B3SOIPDTempbPtr, B3SOIPDtempNode, B3SOIPDbNode); - TSTALLOC(B3SOIPDGtempPtr, B3SOIPDgNode, B3SOIPDtempNode) - TSTALLOC(B3SOIPDDPtempPtr, B3SOIPDdNodePrime, B3SOIPDtempNode) - TSTALLOC(B3SOIPDSPtempPtr, B3SOIPDsNodePrime, B3SOIPDtempNode) - TSTALLOC(B3SOIPDEtempPtr, B3SOIPDeNode, B3SOIPDtempNode) - TSTALLOC(B3SOIPDBtempPtr, B3SOIPDbNode, B3SOIPDtempNode) + TSTALLOC(B3SOIPDGtempPtr, B3SOIPDgNode, B3SOIPDtempNode); + TSTALLOC(B3SOIPDDPtempPtr, B3SOIPDdNodePrime, B3SOIPDtempNode); + TSTALLOC(B3SOIPDSPtempPtr, B3SOIPDsNodePrime, B3SOIPDtempNode); + TSTALLOC(B3SOIPDEtempPtr, B3SOIPDeNode, B3SOIPDtempNode); + TSTALLOC(B3SOIPDBtempPtr, B3SOIPDbNode, B3SOIPDtempNode); if (here->B3SOIPDbodyMod == 1) { - TSTALLOC(B3SOIPDPtempPtr, B3SOIPDpNode, B3SOIPDtempNode) + TSTALLOC(B3SOIPDPtempPtr, B3SOIPDpNode, B3SOIPDtempNode); } } if (here->B3SOIPDbodyMod == 2) { /* Don't create any Jacobian entry for pNode */ } else if (here->B3SOIPDbodyMod == 1) { - TSTALLOC(B3SOIPDBpPtr, B3SOIPDbNode, B3SOIPDpNode) - TSTALLOC(B3SOIPDPbPtr, B3SOIPDpNode, B3SOIPDbNode) - TSTALLOC(B3SOIPDPpPtr, B3SOIPDpNode, B3SOIPDpNode) + TSTALLOC(B3SOIPDBpPtr, B3SOIPDbNode, B3SOIPDpNode); + TSTALLOC(B3SOIPDPbPtr, B3SOIPDpNode, B3SOIPDbNode); + TSTALLOC(B3SOIPDPpPtr, B3SOIPDpNode, B3SOIPDpNode); } - TSTALLOC(B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode) - TSTALLOC(B3SOIPDGbPtr, B3SOIPDgNode, B3SOIPDbNode) - TSTALLOC(B3SOIPDDPbPtr, B3SOIPDdNodePrime, B3SOIPDbNode) - TSTALLOC(B3SOIPDSPbPtr, B3SOIPDsNodePrime, B3SOIPDbNode) - TSTALLOC(B3SOIPDBePtr, B3SOIPDbNode, B3SOIPDeNode) - TSTALLOC(B3SOIPDBgPtr, B3SOIPDbNode, B3SOIPDgNode) - TSTALLOC(B3SOIPDBdpPtr, B3SOIPDbNode, B3SOIPDdNodePrime) - TSTALLOC(B3SOIPDBspPtr, B3SOIPDbNode, B3SOIPDsNodePrime) - TSTALLOC(B3SOIPDBbPtr, B3SOIPDbNode, B3SOIPDbNode) + TSTALLOC(B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode); + TSTALLOC(B3SOIPDGbPtr, B3SOIPDgNode, B3SOIPDbNode); + TSTALLOC(B3SOIPDDPbPtr, B3SOIPDdNodePrime, B3SOIPDbNode); + TSTALLOC(B3SOIPDSPbPtr, B3SOIPDsNodePrime, B3SOIPDbNode); + TSTALLOC(B3SOIPDBePtr, B3SOIPDbNode, B3SOIPDeNode); + TSTALLOC(B3SOIPDBgPtr, B3SOIPDbNode, B3SOIPDgNode); + TSTALLOC(B3SOIPDBdpPtr, B3SOIPDbNode, B3SOIPDdNodePrime); + TSTALLOC(B3SOIPDBspPtr, B3SOIPDbNode, B3SOIPDsNodePrime); + TSTALLOC(B3SOIPDBbPtr, B3SOIPDbNode, B3SOIPDbNode); - TSTALLOC(B3SOIPDEgPtr, B3SOIPDeNode, B3SOIPDgNode) - TSTALLOC(B3SOIPDEdpPtr, B3SOIPDeNode, B3SOIPDdNodePrime) - TSTALLOC(B3SOIPDEspPtr, B3SOIPDeNode, B3SOIPDsNodePrime) - TSTALLOC(B3SOIPDGePtr, B3SOIPDgNode, B3SOIPDeNode) - TSTALLOC(B3SOIPDDPePtr, B3SOIPDdNodePrime, B3SOIPDeNode) - TSTALLOC(B3SOIPDSPePtr, B3SOIPDsNodePrime, B3SOIPDeNode) + TSTALLOC(B3SOIPDEgPtr, B3SOIPDeNode, B3SOIPDgNode); + TSTALLOC(B3SOIPDEdpPtr, B3SOIPDeNode, B3SOIPDdNodePrime); + TSTALLOC(B3SOIPDEspPtr, B3SOIPDeNode, B3SOIPDsNodePrime); + TSTALLOC(B3SOIPDGePtr, B3SOIPDgNode, B3SOIPDeNode); + TSTALLOC(B3SOIPDDPePtr, B3SOIPDdNodePrime, B3SOIPDeNode); + TSTALLOC(B3SOIPDSPePtr, B3SOIPDsNodePrime, B3SOIPDeNode); - TSTALLOC(B3SOIPDEePtr, B3SOIPDeNode, B3SOIPDeNode) + TSTALLOC(B3SOIPDEePtr, B3SOIPDeNode, B3SOIPDeNode); - TSTALLOC(B3SOIPDGgPtr, B3SOIPDgNode, B3SOIPDgNode) - TSTALLOC(B3SOIPDGdpPtr, B3SOIPDgNode, B3SOIPDdNodePrime) - TSTALLOC(B3SOIPDGspPtr, B3SOIPDgNode, B3SOIPDsNodePrime) + TSTALLOC(B3SOIPDGgPtr, B3SOIPDgNode, B3SOIPDgNode); + TSTALLOC(B3SOIPDGdpPtr, B3SOIPDgNode, B3SOIPDdNodePrime); + TSTALLOC(B3SOIPDGspPtr, B3SOIPDgNode, B3SOIPDsNodePrime); - TSTALLOC(B3SOIPDDPgPtr, B3SOIPDdNodePrime, B3SOIPDgNode) - TSTALLOC(B3SOIPDDPdpPtr, B3SOIPDdNodePrime, B3SOIPDdNodePrime) - TSTALLOC(B3SOIPDDPspPtr, B3SOIPDdNodePrime, B3SOIPDsNodePrime) - TSTALLOC(B3SOIPDDPdPtr, B3SOIPDdNodePrime, B3SOIPDdNode) + TSTALLOC(B3SOIPDDPgPtr, B3SOIPDdNodePrime, B3SOIPDgNode); + TSTALLOC(B3SOIPDDPdpPtr, B3SOIPDdNodePrime, B3SOIPDdNodePrime); + TSTALLOC(B3SOIPDDPspPtr, B3SOIPDdNodePrime, B3SOIPDsNodePrime); + TSTALLOC(B3SOIPDDPdPtr, B3SOIPDdNodePrime, B3SOIPDdNode); - TSTALLOC(B3SOIPDSPgPtr, B3SOIPDsNodePrime, B3SOIPDgNode) - TSTALLOC(B3SOIPDSPdpPtr, B3SOIPDsNodePrime, B3SOIPDdNodePrime) - TSTALLOC(B3SOIPDSPspPtr, B3SOIPDsNodePrime, B3SOIPDsNodePrime) - TSTALLOC(B3SOIPDSPsPtr, B3SOIPDsNodePrime, B3SOIPDsNode) + TSTALLOC(B3SOIPDSPgPtr, B3SOIPDsNodePrime, B3SOIPDgNode); + TSTALLOC(B3SOIPDSPdpPtr, B3SOIPDsNodePrime, B3SOIPDdNodePrime); + TSTALLOC(B3SOIPDSPspPtr, B3SOIPDsNodePrime, B3SOIPDsNodePrime); + TSTALLOC(B3SOIPDSPsPtr, B3SOIPDsNodePrime, B3SOIPDsNode); - TSTALLOC(B3SOIPDDdPtr, B3SOIPDdNode, B3SOIPDdNode) - TSTALLOC(B3SOIPDDdpPtr, B3SOIPDdNode, B3SOIPDdNodePrime) + TSTALLOC(B3SOIPDDdPtr, B3SOIPDdNode, B3SOIPDdNode); + TSTALLOC(B3SOIPDDdpPtr, B3SOIPDdNode, B3SOIPDdNodePrime); - TSTALLOC(B3SOIPDSsPtr, B3SOIPDsNode, B3SOIPDsNode) - TSTALLOC(B3SOIPDSspPtr, B3SOIPDsNode, B3SOIPDsNodePrime) + TSTALLOC(B3SOIPDSsPtr, B3SOIPDsNode, B3SOIPDsNode); + TSTALLOC(B3SOIPDSspPtr, B3SOIPDsNode, B3SOIPDsNodePrime); /* here for debugging purpose only */ if (here->B3SOIPDdebugMod != 0) { - TSTALLOC(B3SOIPDVbsPtr, B3SOIPDvbsNode, B3SOIPDvbsNode) - TSTALLOC(B3SOIPDIdsPtr, B3SOIPDidsNode, B3SOIPDidsNode) - TSTALLOC(B3SOIPDIcPtr, B3SOIPDicNode, B3SOIPDicNode) - TSTALLOC(B3SOIPDIbsPtr, B3SOIPDibsNode, B3SOIPDibsNode) - TSTALLOC(B3SOIPDIbdPtr, B3SOIPDibdNode, B3SOIPDibdNode) - TSTALLOC(B3SOIPDIiiPtr, B3SOIPDiiiNode, B3SOIPDiiiNode) - TSTALLOC(B3SOIPDIgPtr, B3SOIPDigNode, B3SOIPDigNode) - TSTALLOC(B3SOIPDGiggPtr, B3SOIPDgiggNode, B3SOIPDgiggNode) - TSTALLOC(B3SOIPDGigdPtr, B3SOIPDgigdNode, B3SOIPDgigdNode) - TSTALLOC(B3SOIPDGigbPtr, B3SOIPDgigbNode, B3SOIPDgigbNode) - TSTALLOC(B3SOIPDIgidlPtr, B3SOIPDigidlNode, B3SOIPDigidlNode) - TSTALLOC(B3SOIPDItunPtr, B3SOIPDitunNode, B3SOIPDitunNode) - TSTALLOC(B3SOIPDIbpPtr, B3SOIPDibpNode, B3SOIPDibpNode) - TSTALLOC(B3SOIPDCbbPtr, B3SOIPDcbbNode, B3SOIPDcbbNode) - TSTALLOC(B3SOIPDCbdPtr, B3SOIPDcbdNode, B3SOIPDcbdNode) - TSTALLOC(B3SOIPDCbgPtr, B3SOIPDcbgNode, B3SOIPDcbgNode) - TSTALLOC(B3SOIPDQbfPtr, B3SOIPDqbfNode, B3SOIPDqbfNode) - TSTALLOC(B3SOIPDQjsPtr, B3SOIPDqjsNode, B3SOIPDqjsNode) - TSTALLOC(B3SOIPDQjdPtr, B3SOIPDqjdNode, B3SOIPDqjdNode) + TSTALLOC(B3SOIPDVbsPtr, B3SOIPDvbsNode, B3SOIPDvbsNode); + TSTALLOC(B3SOIPDIdsPtr, B3SOIPDidsNode, B3SOIPDidsNode); + TSTALLOC(B3SOIPDIcPtr, B3SOIPDicNode, B3SOIPDicNode); + TSTALLOC(B3SOIPDIbsPtr, B3SOIPDibsNode, B3SOIPDibsNode); + TSTALLOC(B3SOIPDIbdPtr, B3SOIPDibdNode, B3SOIPDibdNode); + TSTALLOC(B3SOIPDIiiPtr, B3SOIPDiiiNode, B3SOIPDiiiNode); + TSTALLOC(B3SOIPDIgPtr, B3SOIPDigNode, B3SOIPDigNode); + TSTALLOC(B3SOIPDGiggPtr, B3SOIPDgiggNode, B3SOIPDgiggNode); + TSTALLOC(B3SOIPDGigdPtr, B3SOIPDgigdNode, B3SOIPDgigdNode); + TSTALLOC(B3SOIPDGigbPtr, B3SOIPDgigbNode, B3SOIPDgigbNode); + TSTALLOC(B3SOIPDIgidlPtr, B3SOIPDigidlNode, B3SOIPDigidlNode); + TSTALLOC(B3SOIPDItunPtr, B3SOIPDitunNode, B3SOIPDitunNode); + TSTALLOC(B3SOIPDIbpPtr, B3SOIPDibpNode, B3SOIPDibpNode); + TSTALLOC(B3SOIPDCbbPtr, B3SOIPDcbbNode, B3SOIPDcbbNode); + TSTALLOC(B3SOIPDCbdPtr, B3SOIPDcbdNode, B3SOIPDcbdNode); + TSTALLOC(B3SOIPDCbgPtr, B3SOIPDcbgNode, B3SOIPDcbgNode); + TSTALLOC(B3SOIPDQbfPtr, B3SOIPDqbfNode, B3SOIPDqbfNode); + TSTALLOC(B3SOIPDQjsPtr, B3SOIPDqjsNode, B3SOIPDqjsNode); + TSTALLOC(B3SOIPDQjdPtr, B3SOIPDqjdNode, B3SOIPDqjdNode); } diff --git a/src/spicelib/devices/bsim3v0/b3v0set.c b/src/spicelib/devices/bsim3v0/b3v0set.c index 8016aa937..4243b7456 100644 --- a/src/spicelib/devices/bsim3v0/b3v0set.c +++ b/src/spicelib/devices/bsim3v0/b3v0set.c @@ -848,43 +848,43 @@ IFuid tmpName; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(BSIM3v0DdPtr, BSIM3v0dNode, BSIM3v0dNode) - TSTALLOC(BSIM3v0GgPtr, BSIM3v0gNode, BSIM3v0gNode) - TSTALLOC(BSIM3v0SsPtr, BSIM3v0sNode, BSIM3v0sNode) - TSTALLOC(BSIM3v0BbPtr, BSIM3v0bNode, BSIM3v0bNode) - TSTALLOC(BSIM3v0DPdpPtr, BSIM3v0dNodePrime, BSIM3v0dNodePrime) - TSTALLOC(BSIM3v0SPspPtr, BSIM3v0sNodePrime, BSIM3v0sNodePrime) - TSTALLOC(BSIM3v0DdpPtr, BSIM3v0dNode, BSIM3v0dNodePrime) - TSTALLOC(BSIM3v0GbPtr, BSIM3v0gNode, BSIM3v0bNode) - TSTALLOC(BSIM3v0GdpPtr, BSIM3v0gNode, BSIM3v0dNodePrime) - TSTALLOC(BSIM3v0GspPtr, BSIM3v0gNode, BSIM3v0sNodePrime) - TSTALLOC(BSIM3v0SspPtr, BSIM3v0sNode, BSIM3v0sNodePrime) - TSTALLOC(BSIM3v0BdpPtr, BSIM3v0bNode, BSIM3v0dNodePrime) - TSTALLOC(BSIM3v0BspPtr, BSIM3v0bNode, BSIM3v0sNodePrime) - TSTALLOC(BSIM3v0DPspPtr, BSIM3v0dNodePrime, BSIM3v0sNodePrime) - TSTALLOC(BSIM3v0DPdPtr, BSIM3v0dNodePrime, BSIM3v0dNode) - TSTALLOC(BSIM3v0BgPtr, BSIM3v0bNode, BSIM3v0gNode) - TSTALLOC(BSIM3v0DPgPtr, BSIM3v0dNodePrime, BSIM3v0gNode) - TSTALLOC(BSIM3v0SPgPtr, BSIM3v0sNodePrime, BSIM3v0gNode) - TSTALLOC(BSIM3v0SPsPtr, BSIM3v0sNodePrime, BSIM3v0sNode) - TSTALLOC(BSIM3v0DPbPtr, BSIM3v0dNodePrime, BSIM3v0bNode) - TSTALLOC(BSIM3v0SPbPtr, BSIM3v0sNodePrime, BSIM3v0bNode) - TSTALLOC(BSIM3v0SPdpPtr, BSIM3v0sNodePrime, BSIM3v0dNodePrime) + TSTALLOC(BSIM3v0DdPtr, BSIM3v0dNode, BSIM3v0dNode); + TSTALLOC(BSIM3v0GgPtr, BSIM3v0gNode, BSIM3v0gNode); + TSTALLOC(BSIM3v0SsPtr, BSIM3v0sNode, BSIM3v0sNode); + TSTALLOC(BSIM3v0BbPtr, BSIM3v0bNode, BSIM3v0bNode); + TSTALLOC(BSIM3v0DPdpPtr, BSIM3v0dNodePrime, BSIM3v0dNodePrime); + TSTALLOC(BSIM3v0SPspPtr, BSIM3v0sNodePrime, BSIM3v0sNodePrime); + TSTALLOC(BSIM3v0DdpPtr, BSIM3v0dNode, BSIM3v0dNodePrime); + TSTALLOC(BSIM3v0GbPtr, BSIM3v0gNode, BSIM3v0bNode); + TSTALLOC(BSIM3v0GdpPtr, BSIM3v0gNode, BSIM3v0dNodePrime); + TSTALLOC(BSIM3v0GspPtr, BSIM3v0gNode, BSIM3v0sNodePrime); + TSTALLOC(BSIM3v0SspPtr, BSIM3v0sNode, BSIM3v0sNodePrime); + TSTALLOC(BSIM3v0BdpPtr, BSIM3v0bNode, BSIM3v0dNodePrime); + TSTALLOC(BSIM3v0BspPtr, BSIM3v0bNode, BSIM3v0sNodePrime); + TSTALLOC(BSIM3v0DPspPtr, BSIM3v0dNodePrime, BSIM3v0sNodePrime); + TSTALLOC(BSIM3v0DPdPtr, BSIM3v0dNodePrime, BSIM3v0dNode); + TSTALLOC(BSIM3v0BgPtr, BSIM3v0bNode, BSIM3v0gNode); + TSTALLOC(BSIM3v0DPgPtr, BSIM3v0dNodePrime, BSIM3v0gNode); + TSTALLOC(BSIM3v0SPgPtr, BSIM3v0sNodePrime, BSIM3v0gNode); + TSTALLOC(BSIM3v0SPsPtr, BSIM3v0sNodePrime, BSIM3v0sNode); + TSTALLOC(BSIM3v0DPbPtr, BSIM3v0dNodePrime, BSIM3v0bNode); + TSTALLOC(BSIM3v0SPbPtr, BSIM3v0sNodePrime, BSIM3v0bNode); + TSTALLOC(BSIM3v0SPdpPtr, BSIM3v0sNodePrime, BSIM3v0dNodePrime); - TSTALLOC(BSIM3v0QqPtr, BSIM3v0qNode, BSIM3v0qNode) + TSTALLOC(BSIM3v0QqPtr, BSIM3v0qNode, BSIM3v0qNode); - TSTALLOC(BSIM3v0QdpPtr, BSIM3v0qNode, BSIM3v0dNodePrime) - TSTALLOC(BSIM3v0QspPtr, BSIM3v0qNode, BSIM3v0sNodePrime) - TSTALLOC(BSIM3v0QgPtr, BSIM3v0qNode, BSIM3v0gNode) - TSTALLOC(BSIM3v0QbPtr, BSIM3v0qNode, BSIM3v0bNode) - TSTALLOC(BSIM3v0DPqPtr, BSIM3v0dNodePrime, BSIM3v0qNode) - TSTALLOC(BSIM3v0SPqPtr, BSIM3v0sNodePrime, BSIM3v0qNode) - TSTALLOC(BSIM3v0GqPtr, BSIM3v0gNode, BSIM3v0qNode) - TSTALLOC(BSIM3v0BqPtr, BSIM3v0bNode, BSIM3v0qNode) + TSTALLOC(BSIM3v0QdpPtr, BSIM3v0qNode, BSIM3v0dNodePrime); + TSTALLOC(BSIM3v0QspPtr, BSIM3v0qNode, BSIM3v0sNodePrime); + TSTALLOC(BSIM3v0QgPtr, BSIM3v0qNode, BSIM3v0gNode); + TSTALLOC(BSIM3v0QbPtr, BSIM3v0qNode, BSIM3v0bNode); + TSTALLOC(BSIM3v0DPqPtr, BSIM3v0dNodePrime, BSIM3v0qNode); + TSTALLOC(BSIM3v0SPqPtr, BSIM3v0sNodePrime, BSIM3v0qNode); + TSTALLOC(BSIM3v0GqPtr, BSIM3v0gNode, BSIM3v0qNode); + TSTALLOC(BSIM3v0BqPtr, BSIM3v0bNode, BSIM3v0qNode); } } diff --git a/src/spicelib/devices/bsim3v1/b3v1set.c b/src/spicelib/devices/bsim3v1/b3v1set.c index e87a372a1..e3bedcbb9 100644 --- a/src/spicelib/devices/bsim3v1/b3v1set.c +++ b/src/spicelib/devices/bsim3v1/b3v1set.c @@ -908,43 +908,43 @@ IFuid tmpName; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(BSIM3v1DdPtr, BSIM3v1dNode, BSIM3v1dNode) - TSTALLOC(BSIM3v1GgPtr, BSIM3v1gNode, BSIM3v1gNode) - TSTALLOC(BSIM3v1SsPtr, BSIM3v1sNode, BSIM3v1sNode) - TSTALLOC(BSIM3v1BbPtr, BSIM3v1bNode, BSIM3v1bNode) - TSTALLOC(BSIM3v1DPdpPtr, BSIM3v1dNodePrime, BSIM3v1dNodePrime) - TSTALLOC(BSIM3v1SPspPtr, BSIM3v1sNodePrime, BSIM3v1sNodePrime) - TSTALLOC(BSIM3v1DdpPtr, BSIM3v1dNode, BSIM3v1dNodePrime) - TSTALLOC(BSIM3v1GbPtr, BSIM3v1gNode, BSIM3v1bNode) - TSTALLOC(BSIM3v1GdpPtr, BSIM3v1gNode, BSIM3v1dNodePrime) - TSTALLOC(BSIM3v1GspPtr, BSIM3v1gNode, BSIM3v1sNodePrime) - TSTALLOC(BSIM3v1SspPtr, BSIM3v1sNode, BSIM3v1sNodePrime) - TSTALLOC(BSIM3v1BdpPtr, BSIM3v1bNode, BSIM3v1dNodePrime) - TSTALLOC(BSIM3v1BspPtr, BSIM3v1bNode, BSIM3v1sNodePrime) - TSTALLOC(BSIM3v1DPspPtr, BSIM3v1dNodePrime, BSIM3v1sNodePrime) - TSTALLOC(BSIM3v1DPdPtr, BSIM3v1dNodePrime, BSIM3v1dNode) - TSTALLOC(BSIM3v1BgPtr, BSIM3v1bNode, BSIM3v1gNode) - TSTALLOC(BSIM3v1DPgPtr, BSIM3v1dNodePrime, BSIM3v1gNode) - TSTALLOC(BSIM3v1SPgPtr, BSIM3v1sNodePrime, BSIM3v1gNode) - TSTALLOC(BSIM3v1SPsPtr, BSIM3v1sNodePrime, BSIM3v1sNode) - TSTALLOC(BSIM3v1DPbPtr, BSIM3v1dNodePrime, BSIM3v1bNode) - TSTALLOC(BSIM3v1SPbPtr, BSIM3v1sNodePrime, BSIM3v1bNode) - TSTALLOC(BSIM3v1SPdpPtr, BSIM3v1sNodePrime, BSIM3v1dNodePrime) + TSTALLOC(BSIM3v1DdPtr, BSIM3v1dNode, BSIM3v1dNode); + TSTALLOC(BSIM3v1GgPtr, BSIM3v1gNode, BSIM3v1gNode); + TSTALLOC(BSIM3v1SsPtr, BSIM3v1sNode, BSIM3v1sNode); + TSTALLOC(BSIM3v1BbPtr, BSIM3v1bNode, BSIM3v1bNode); + TSTALLOC(BSIM3v1DPdpPtr, BSIM3v1dNodePrime, BSIM3v1dNodePrime); + TSTALLOC(BSIM3v1SPspPtr, BSIM3v1sNodePrime, BSIM3v1sNodePrime); + TSTALLOC(BSIM3v1DdpPtr, BSIM3v1dNode, BSIM3v1dNodePrime); + TSTALLOC(BSIM3v1GbPtr, BSIM3v1gNode, BSIM3v1bNode); + TSTALLOC(BSIM3v1GdpPtr, BSIM3v1gNode, BSIM3v1dNodePrime); + TSTALLOC(BSIM3v1GspPtr, BSIM3v1gNode, BSIM3v1sNodePrime); + TSTALLOC(BSIM3v1SspPtr, BSIM3v1sNode, BSIM3v1sNodePrime); + TSTALLOC(BSIM3v1BdpPtr, BSIM3v1bNode, BSIM3v1dNodePrime); + TSTALLOC(BSIM3v1BspPtr, BSIM3v1bNode, BSIM3v1sNodePrime); + TSTALLOC(BSIM3v1DPspPtr, BSIM3v1dNodePrime, BSIM3v1sNodePrime); + TSTALLOC(BSIM3v1DPdPtr, BSIM3v1dNodePrime, BSIM3v1dNode); + TSTALLOC(BSIM3v1BgPtr, BSIM3v1bNode, BSIM3v1gNode); + TSTALLOC(BSIM3v1DPgPtr, BSIM3v1dNodePrime, BSIM3v1gNode); + TSTALLOC(BSIM3v1SPgPtr, BSIM3v1sNodePrime, BSIM3v1gNode); + TSTALLOC(BSIM3v1SPsPtr, BSIM3v1sNodePrime, BSIM3v1sNode); + TSTALLOC(BSIM3v1DPbPtr, BSIM3v1dNodePrime, BSIM3v1bNode); + TSTALLOC(BSIM3v1SPbPtr, BSIM3v1sNodePrime, BSIM3v1bNode); + TSTALLOC(BSIM3v1SPdpPtr, BSIM3v1sNodePrime, BSIM3v1dNodePrime); - TSTALLOC(BSIM3v1QqPtr, BSIM3v1qNode, BSIM3v1qNode) + TSTALLOC(BSIM3v1QqPtr, BSIM3v1qNode, BSIM3v1qNode); - TSTALLOC(BSIM3v1QdpPtr, BSIM3v1qNode, BSIM3v1dNodePrime) - TSTALLOC(BSIM3v1QspPtr, BSIM3v1qNode, BSIM3v1sNodePrime) - TSTALLOC(BSIM3v1QgPtr, BSIM3v1qNode, BSIM3v1gNode) - TSTALLOC(BSIM3v1QbPtr, BSIM3v1qNode, BSIM3v1bNode) - TSTALLOC(BSIM3v1DPqPtr, BSIM3v1dNodePrime, BSIM3v1qNode) - TSTALLOC(BSIM3v1SPqPtr, BSIM3v1sNodePrime, BSIM3v1qNode) - TSTALLOC(BSIM3v1GqPtr, BSIM3v1gNode, BSIM3v1qNode) - TSTALLOC(BSIM3v1BqPtr, BSIM3v1bNode, BSIM3v1qNode) + TSTALLOC(BSIM3v1QdpPtr, BSIM3v1qNode, BSIM3v1dNodePrime); + TSTALLOC(BSIM3v1QspPtr, BSIM3v1qNode, BSIM3v1sNodePrime); + TSTALLOC(BSIM3v1QgPtr, BSIM3v1qNode, BSIM3v1gNode); + TSTALLOC(BSIM3v1QbPtr, BSIM3v1qNode, BSIM3v1bNode); + TSTALLOC(BSIM3v1DPqPtr, BSIM3v1dNodePrime, BSIM3v1qNode); + TSTALLOC(BSIM3v1SPqPtr, BSIM3v1sNodePrime, BSIM3v1qNode); + TSTALLOC(BSIM3v1GqPtr, BSIM3v1gNode, BSIM3v1qNode); + TSTALLOC(BSIM3v1BqPtr, BSIM3v1bNode, BSIM3v1qNode); } } diff --git a/src/spicelib/devices/bsim3v32/b3v32set.c b/src/spicelib/devices/bsim3v32/b3v32set.c index 185681c77..e558536e3 100644 --- a/src/spicelib/devices/bsim3v32/b3v32set.c +++ b/src/spicelib/devices/bsim3v32/b3v32set.c @@ -1029,43 +1029,43 @@ IFuid tmpName; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(BSIM3v32DdPtr, BSIM3v32dNode, BSIM3v32dNode) - TSTALLOC(BSIM3v32GgPtr, BSIM3v32gNode, BSIM3v32gNode) - TSTALLOC(BSIM3v32SsPtr, BSIM3v32sNode, BSIM3v32sNode) - TSTALLOC(BSIM3v32BbPtr, BSIM3v32bNode, BSIM3v32bNode) - TSTALLOC(BSIM3v32DPdpPtr, BSIM3v32dNodePrime, BSIM3v32dNodePrime) - TSTALLOC(BSIM3v32SPspPtr, BSIM3v32sNodePrime, BSIM3v32sNodePrime) - TSTALLOC(BSIM3v32DdpPtr, BSIM3v32dNode, BSIM3v32dNodePrime) - TSTALLOC(BSIM3v32GbPtr, BSIM3v32gNode, BSIM3v32bNode) - TSTALLOC(BSIM3v32GdpPtr, BSIM3v32gNode, BSIM3v32dNodePrime) - TSTALLOC(BSIM3v32GspPtr, BSIM3v32gNode, BSIM3v32sNodePrime) - TSTALLOC(BSIM3v32SspPtr, BSIM3v32sNode, BSIM3v32sNodePrime) - TSTALLOC(BSIM3v32BdpPtr, BSIM3v32bNode, BSIM3v32dNodePrime) - TSTALLOC(BSIM3v32BspPtr, BSIM3v32bNode, BSIM3v32sNodePrime) - TSTALLOC(BSIM3v32DPspPtr, BSIM3v32dNodePrime, BSIM3v32sNodePrime) - TSTALLOC(BSIM3v32DPdPtr, BSIM3v32dNodePrime, BSIM3v32dNode) - TSTALLOC(BSIM3v32BgPtr, BSIM3v32bNode, BSIM3v32gNode) - TSTALLOC(BSIM3v32DPgPtr, BSIM3v32dNodePrime, BSIM3v32gNode) - TSTALLOC(BSIM3v32SPgPtr, BSIM3v32sNodePrime, BSIM3v32gNode) - TSTALLOC(BSIM3v32SPsPtr, BSIM3v32sNodePrime, BSIM3v32sNode) - TSTALLOC(BSIM3v32DPbPtr, BSIM3v32dNodePrime, BSIM3v32bNode) - TSTALLOC(BSIM3v32SPbPtr, BSIM3v32sNodePrime, BSIM3v32bNode) - TSTALLOC(BSIM3v32SPdpPtr, BSIM3v32sNodePrime, BSIM3v32dNodePrime) + TSTALLOC(BSIM3v32DdPtr, BSIM3v32dNode, BSIM3v32dNode); + TSTALLOC(BSIM3v32GgPtr, BSIM3v32gNode, BSIM3v32gNode); + TSTALLOC(BSIM3v32SsPtr, BSIM3v32sNode, BSIM3v32sNode); + TSTALLOC(BSIM3v32BbPtr, BSIM3v32bNode, BSIM3v32bNode); + TSTALLOC(BSIM3v32DPdpPtr, BSIM3v32dNodePrime, BSIM3v32dNodePrime); + TSTALLOC(BSIM3v32SPspPtr, BSIM3v32sNodePrime, BSIM3v32sNodePrime); + TSTALLOC(BSIM3v32DdpPtr, BSIM3v32dNode, BSIM3v32dNodePrime); + TSTALLOC(BSIM3v32GbPtr, BSIM3v32gNode, BSIM3v32bNode); + TSTALLOC(BSIM3v32GdpPtr, BSIM3v32gNode, BSIM3v32dNodePrime); + TSTALLOC(BSIM3v32GspPtr, BSIM3v32gNode, BSIM3v32sNodePrime); + TSTALLOC(BSIM3v32SspPtr, BSIM3v32sNode, BSIM3v32sNodePrime); + TSTALLOC(BSIM3v32BdpPtr, BSIM3v32bNode, BSIM3v32dNodePrime); + TSTALLOC(BSIM3v32BspPtr, BSIM3v32bNode, BSIM3v32sNodePrime); + TSTALLOC(BSIM3v32DPspPtr, BSIM3v32dNodePrime, BSIM3v32sNodePrime); + TSTALLOC(BSIM3v32DPdPtr, BSIM3v32dNodePrime, BSIM3v32dNode); + TSTALLOC(BSIM3v32BgPtr, BSIM3v32bNode, BSIM3v32gNode); + TSTALLOC(BSIM3v32DPgPtr, BSIM3v32dNodePrime, BSIM3v32gNode); + TSTALLOC(BSIM3v32SPgPtr, BSIM3v32sNodePrime, BSIM3v32gNode); + TSTALLOC(BSIM3v32SPsPtr, BSIM3v32sNodePrime, BSIM3v32sNode); + TSTALLOC(BSIM3v32DPbPtr, BSIM3v32dNodePrime, BSIM3v32bNode); + TSTALLOC(BSIM3v32SPbPtr, BSIM3v32sNodePrime, BSIM3v32bNode); + TSTALLOC(BSIM3v32SPdpPtr, BSIM3v32sNodePrime, BSIM3v32dNodePrime); - TSTALLOC(BSIM3v32QqPtr, BSIM3v32qNode, BSIM3v32qNode) + TSTALLOC(BSIM3v32QqPtr, BSIM3v32qNode, BSIM3v32qNode); - TSTALLOC(BSIM3v32QdpPtr, BSIM3v32qNode, BSIM3v32dNodePrime) - TSTALLOC(BSIM3v32QspPtr, BSIM3v32qNode, BSIM3v32sNodePrime) - TSTALLOC(BSIM3v32QgPtr, BSIM3v32qNode, BSIM3v32gNode) - TSTALLOC(BSIM3v32QbPtr, BSIM3v32qNode, BSIM3v32bNode) - TSTALLOC(BSIM3v32DPqPtr, BSIM3v32dNodePrime, BSIM3v32qNode) - TSTALLOC(BSIM3v32SPqPtr, BSIM3v32sNodePrime, BSIM3v32qNode) - TSTALLOC(BSIM3v32GqPtr, BSIM3v32gNode, BSIM3v32qNode) - TSTALLOC(BSIM3v32BqPtr, BSIM3v32bNode, BSIM3v32qNode) + TSTALLOC(BSIM3v32QdpPtr, BSIM3v32qNode, BSIM3v32dNodePrime); + TSTALLOC(BSIM3v32QspPtr, BSIM3v32qNode, BSIM3v32sNodePrime); + TSTALLOC(BSIM3v32QgPtr, BSIM3v32qNode, BSIM3v32gNode); + TSTALLOC(BSIM3v32QbPtr, BSIM3v32qNode, BSIM3v32bNode); + TSTALLOC(BSIM3v32DPqPtr, BSIM3v32dNodePrime, BSIM3v32qNode); + TSTALLOC(BSIM3v32SPqPtr, BSIM3v32sNodePrime, BSIM3v32qNode); + TSTALLOC(BSIM3v32GqPtr, BSIM3v32gNode, BSIM3v32qNode); + TSTALLOC(BSIM3v32BqPtr, BSIM3v32bNode, BSIM3v32qNode); } } diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index dd7ce8948..20e935efb 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -2463,96 +2463,96 @@ BSIM4instance **InstArray; /* set Sparse Matrix Pointers * macro to make elements with built-in out-of-memory test */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ +do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(BSIM4DPbpPtr, BSIM4dNodePrime, BSIM4bNodePrime) - TSTALLOC(BSIM4GPbpPtr, BSIM4gNodePrime, BSIM4bNodePrime) - TSTALLOC(BSIM4SPbpPtr, BSIM4sNodePrime, BSIM4bNodePrime) + TSTALLOC(BSIM4DPbpPtr, BSIM4dNodePrime, BSIM4bNodePrime); + TSTALLOC(BSIM4GPbpPtr, BSIM4gNodePrime, BSIM4bNodePrime); + TSTALLOC(BSIM4SPbpPtr, BSIM4sNodePrime, BSIM4bNodePrime); - TSTALLOC(BSIM4BPdpPtr, BSIM4bNodePrime, BSIM4dNodePrime) - TSTALLOC(BSIM4BPgpPtr, BSIM4bNodePrime, BSIM4gNodePrime) - TSTALLOC(BSIM4BPspPtr, BSIM4bNodePrime, BSIM4sNodePrime) - TSTALLOC(BSIM4BPbpPtr, BSIM4bNodePrime, BSIM4bNodePrime) + TSTALLOC(BSIM4BPdpPtr, BSIM4bNodePrime, BSIM4dNodePrime); + TSTALLOC(BSIM4BPgpPtr, BSIM4bNodePrime, BSIM4gNodePrime); + TSTALLOC(BSIM4BPspPtr, BSIM4bNodePrime, BSIM4sNodePrime); + TSTALLOC(BSIM4BPbpPtr, BSIM4bNodePrime, BSIM4bNodePrime); - TSTALLOC(BSIM4DdPtr, BSIM4dNode, BSIM4dNode) - TSTALLOC(BSIM4GPgpPtr, BSIM4gNodePrime, BSIM4gNodePrime) - TSTALLOC(BSIM4SsPtr, BSIM4sNode, BSIM4sNode) - TSTALLOC(BSIM4DPdpPtr, BSIM4dNodePrime, BSIM4dNodePrime) - TSTALLOC(BSIM4SPspPtr, BSIM4sNodePrime, BSIM4sNodePrime) - TSTALLOC(BSIM4DdpPtr, BSIM4dNode, BSIM4dNodePrime) - TSTALLOC(BSIM4GPdpPtr, BSIM4gNodePrime, BSIM4dNodePrime) - TSTALLOC(BSIM4GPspPtr, BSIM4gNodePrime, BSIM4sNodePrime) - TSTALLOC(BSIM4SspPtr, BSIM4sNode, BSIM4sNodePrime) - TSTALLOC(BSIM4DPspPtr, BSIM4dNodePrime, BSIM4sNodePrime) - TSTALLOC(BSIM4DPdPtr, BSIM4dNodePrime, BSIM4dNode) - TSTALLOC(BSIM4DPgpPtr, BSIM4dNodePrime, BSIM4gNodePrime) - TSTALLOC(BSIM4SPgpPtr, BSIM4sNodePrime, BSIM4gNodePrime) - TSTALLOC(BSIM4SPsPtr, BSIM4sNodePrime, BSIM4sNode) - TSTALLOC(BSIM4SPdpPtr, BSIM4sNodePrime, BSIM4dNodePrime) + TSTALLOC(BSIM4DdPtr, BSIM4dNode, BSIM4dNode); + TSTALLOC(BSIM4GPgpPtr, BSIM4gNodePrime, BSIM4gNodePrime); + TSTALLOC(BSIM4SsPtr, BSIM4sNode, BSIM4sNode); + TSTALLOC(BSIM4DPdpPtr, BSIM4dNodePrime, BSIM4dNodePrime); + TSTALLOC(BSIM4SPspPtr, BSIM4sNodePrime, BSIM4sNodePrime); + TSTALLOC(BSIM4DdpPtr, BSIM4dNode, BSIM4dNodePrime); + TSTALLOC(BSIM4GPdpPtr, BSIM4gNodePrime, BSIM4dNodePrime); + TSTALLOC(BSIM4GPspPtr, BSIM4gNodePrime, BSIM4sNodePrime); + TSTALLOC(BSIM4SspPtr, BSIM4sNode, BSIM4sNodePrime); + TSTALLOC(BSIM4DPspPtr, BSIM4dNodePrime, BSIM4sNodePrime); + TSTALLOC(BSIM4DPdPtr, BSIM4dNodePrime, BSIM4dNode); + TSTALLOC(BSIM4DPgpPtr, BSIM4dNodePrime, BSIM4gNodePrime); + TSTALLOC(BSIM4SPgpPtr, BSIM4sNodePrime, BSIM4gNodePrime); + TSTALLOC(BSIM4SPsPtr, BSIM4sNodePrime, BSIM4sNode); + TSTALLOC(BSIM4SPdpPtr, BSIM4sNodePrime, BSIM4dNodePrime); - TSTALLOC(BSIM4QqPtr, BSIM4qNode, BSIM4qNode) - TSTALLOC(BSIM4QbpPtr, BSIM4qNode, BSIM4bNodePrime) - TSTALLOC(BSIM4QdpPtr, BSIM4qNode, BSIM4dNodePrime) - TSTALLOC(BSIM4QspPtr, BSIM4qNode, BSIM4sNodePrime) - TSTALLOC(BSIM4QgpPtr, BSIM4qNode, BSIM4gNodePrime) - TSTALLOC(BSIM4DPqPtr, BSIM4dNodePrime, BSIM4qNode) - TSTALLOC(BSIM4SPqPtr, BSIM4sNodePrime, BSIM4qNode) - TSTALLOC(BSIM4GPqPtr, BSIM4gNodePrime, BSIM4qNode) + TSTALLOC(BSIM4QqPtr, BSIM4qNode, BSIM4qNode); + TSTALLOC(BSIM4QbpPtr, BSIM4qNode, BSIM4bNodePrime) ; + TSTALLOC(BSIM4QdpPtr, BSIM4qNode, BSIM4dNodePrime); + TSTALLOC(BSIM4QspPtr, BSIM4qNode, BSIM4sNodePrime); + TSTALLOC(BSIM4QgpPtr, BSIM4qNode, BSIM4gNodePrime); + TSTALLOC(BSIM4DPqPtr, BSIM4dNodePrime, BSIM4qNode); + TSTALLOC(BSIM4SPqPtr, BSIM4sNodePrime, BSIM4qNode); + TSTALLOC(BSIM4GPqPtr, BSIM4gNodePrime, BSIM4qNode); if (here->BSIM4rgateMod != 0) - { TSTALLOC(BSIM4GEgePtr, BSIM4gNodeExt, BSIM4gNodeExt) - TSTALLOC(BSIM4GEgpPtr, BSIM4gNodeExt, BSIM4gNodePrime) - TSTALLOC(BSIM4GPgePtr, BSIM4gNodePrime, BSIM4gNodeExt) - TSTALLOC(BSIM4GEdpPtr, BSIM4gNodeExt, BSIM4dNodePrime) - TSTALLOC(BSIM4GEspPtr, BSIM4gNodeExt, BSIM4sNodePrime) - TSTALLOC(BSIM4GEbpPtr, BSIM4gNodeExt, BSIM4bNodePrime) + { TSTALLOC(BSIM4GEgePtr, BSIM4gNodeExt, BSIM4gNodeExt); + TSTALLOC(BSIM4GEgpPtr, BSIM4gNodeExt, BSIM4gNodePrime); + TSTALLOC(BSIM4GPgePtr, BSIM4gNodePrime, BSIM4gNodeExt); + TSTALLOC(BSIM4GEdpPtr, BSIM4gNodeExt, BSIM4dNodePrime); + TSTALLOC(BSIM4GEspPtr, BSIM4gNodeExt, BSIM4sNodePrime); + TSTALLOC(BSIM4GEbpPtr, BSIM4gNodeExt, BSIM4bNodePrime); - TSTALLOC(BSIM4GMdpPtr, BSIM4gNodeMid, BSIM4dNodePrime) - TSTALLOC(BSIM4GMgpPtr, BSIM4gNodeMid, BSIM4gNodePrime) - TSTALLOC(BSIM4GMgmPtr, BSIM4gNodeMid, BSIM4gNodeMid) - TSTALLOC(BSIM4GMgePtr, BSIM4gNodeMid, BSIM4gNodeExt) - TSTALLOC(BSIM4GMspPtr, BSIM4gNodeMid, BSIM4sNodePrime) - TSTALLOC(BSIM4GMbpPtr, BSIM4gNodeMid, BSIM4bNodePrime) - TSTALLOC(BSIM4DPgmPtr, BSIM4dNodePrime, BSIM4gNodeMid) - TSTALLOC(BSIM4GPgmPtr, BSIM4gNodePrime, BSIM4gNodeMid) - TSTALLOC(BSIM4GEgmPtr, BSIM4gNodeExt, BSIM4gNodeMid) - TSTALLOC(BSIM4SPgmPtr, BSIM4sNodePrime, BSIM4gNodeMid) - TSTALLOC(BSIM4BPgmPtr, BSIM4bNodePrime, BSIM4gNodeMid) + TSTALLOC(BSIM4GMdpPtr, BSIM4gNodeMid, BSIM4dNodePrime); + TSTALLOC(BSIM4GMgpPtr, BSIM4gNodeMid, BSIM4gNodePrime); + TSTALLOC(BSIM4GMgmPtr, BSIM4gNodeMid, BSIM4gNodeMid); + TSTALLOC(BSIM4GMgePtr, BSIM4gNodeMid, BSIM4gNodeExt); + TSTALLOC(BSIM4GMspPtr, BSIM4gNodeMid, BSIM4sNodePrime); + TSTALLOC(BSIM4GMbpPtr, BSIM4gNodeMid, BSIM4bNodePrime); + TSTALLOC(BSIM4DPgmPtr, BSIM4dNodePrime, BSIM4gNodeMid); + TSTALLOC(BSIM4GPgmPtr, BSIM4gNodePrime, BSIM4gNodeMid); + TSTALLOC(BSIM4GEgmPtr, BSIM4gNodeExt, BSIM4gNodeMid); + TSTALLOC(BSIM4SPgmPtr, BSIM4sNodePrime, BSIM4gNodeMid); + TSTALLOC(BSIM4BPgmPtr, BSIM4bNodePrime, BSIM4gNodeMid); } if ((here->BSIM4rbodyMod ==1) || (here->BSIM4rbodyMod ==2)) - { TSTALLOC(BSIM4DPdbPtr, BSIM4dNodePrime, BSIM4dbNode) - TSTALLOC(BSIM4SPsbPtr, BSIM4sNodePrime, BSIM4sbNode) + { TSTALLOC(BSIM4DPdbPtr, BSIM4dNodePrime, BSIM4dbNode); + TSTALLOC(BSIM4SPsbPtr, BSIM4sNodePrime, BSIM4sbNode); - TSTALLOC(BSIM4DBdpPtr, BSIM4dbNode, BSIM4dNodePrime) - TSTALLOC(BSIM4DBdbPtr, BSIM4dbNode, BSIM4dbNode) - TSTALLOC(BSIM4DBbpPtr, BSIM4dbNode, BSIM4bNodePrime) - TSTALLOC(BSIM4DBbPtr, BSIM4dbNode, BSIM4bNode) + TSTALLOC(BSIM4DBdpPtr, BSIM4dbNode, BSIM4dNodePrime); + TSTALLOC(BSIM4DBdbPtr, BSIM4dbNode, BSIM4dbNode); + TSTALLOC(BSIM4DBbpPtr, BSIM4dbNode, BSIM4bNodePrime); + TSTALLOC(BSIM4DBbPtr, BSIM4dbNode, BSIM4bNode); - TSTALLOC(BSIM4BPdbPtr, BSIM4bNodePrime, BSIM4dbNode) - TSTALLOC(BSIM4BPbPtr, BSIM4bNodePrime, BSIM4bNode) - TSTALLOC(BSIM4BPsbPtr, BSIM4bNodePrime, BSIM4sbNode) + TSTALLOC(BSIM4BPdbPtr, BSIM4bNodePrime, BSIM4dbNode); + TSTALLOC(BSIM4BPbPtr, BSIM4bNodePrime, BSIM4bNode); + TSTALLOC(BSIM4BPsbPtr, BSIM4bNodePrime, BSIM4sbNode); - TSTALLOC(BSIM4SBspPtr, BSIM4sbNode, BSIM4sNodePrime) - TSTALLOC(BSIM4SBbpPtr, BSIM4sbNode, BSIM4bNodePrime) - TSTALLOC(BSIM4SBbPtr, BSIM4sbNode, BSIM4bNode) - TSTALLOC(BSIM4SBsbPtr, BSIM4sbNode, BSIM4sbNode) + TSTALLOC(BSIM4SBspPtr, BSIM4sbNode, BSIM4sNodePrime); + TSTALLOC(BSIM4SBbpPtr, BSIM4sbNode, BSIM4bNodePrime); + TSTALLOC(BSIM4SBbPtr, BSIM4sbNode, BSIM4bNode); + TSTALLOC(BSIM4SBsbPtr, BSIM4sbNode, BSIM4sbNode); - TSTALLOC(BSIM4BdbPtr, BSIM4bNode, BSIM4dbNode) - TSTALLOC(BSIM4BbpPtr, BSIM4bNode, BSIM4bNodePrime) - TSTALLOC(BSIM4BsbPtr, BSIM4bNode, BSIM4sbNode) - TSTALLOC(BSIM4BbPtr, BSIM4bNode, BSIM4bNode) + TSTALLOC(BSIM4BdbPtr, BSIM4bNode, BSIM4dbNode); + TSTALLOC(BSIM4BbpPtr, BSIM4bNode, BSIM4bNodePrime); + TSTALLOC(BSIM4BsbPtr, BSIM4bNode, BSIM4sbNode); + TSTALLOC(BSIM4BbPtr, BSIM4bNode, BSIM4bNode); } if (model->BSIM4rdsMod) - { TSTALLOC(BSIM4DgpPtr, BSIM4dNode, BSIM4gNodePrime) - TSTALLOC(BSIM4DspPtr, BSIM4dNode, BSIM4sNodePrime) - TSTALLOC(BSIM4DbpPtr, BSIM4dNode, BSIM4bNodePrime) - TSTALLOC(BSIM4SdpPtr, BSIM4sNode, BSIM4dNodePrime) - TSTALLOC(BSIM4SgpPtr, BSIM4sNode, BSIM4gNodePrime) - TSTALLOC(BSIM4SbpPtr, BSIM4sNode, BSIM4bNodePrime) + { TSTALLOC(BSIM4DgpPtr, BSIM4dNode, BSIM4gNodePrime); + TSTALLOC(BSIM4DspPtr, BSIM4dNode, BSIM4sNodePrime); + TSTALLOC(BSIM4DbpPtr, BSIM4dNode, BSIM4bNodePrime); + TSTALLOC(BSIM4SdpPtr, BSIM4sNode, BSIM4dNodePrime); + TSTALLOC(BSIM4SgpPtr, BSIM4sNode, BSIM4gNodePrime); + TSTALLOC(BSIM4SbpPtr, BSIM4sNode, BSIM4bNodePrime); } } } diff --git a/src/spicelib/devices/bsim4v4/b4v4set.c b/src/spicelib/devices/bsim4v4/b4v4set.c index a1f483973..cf01a4a80 100644 --- a/src/spicelib/devices/bsim4v4/b4v4set.c +++ b/src/spicelib/devices/bsim4v4/b4v4set.c @@ -1849,96 +1849,96 @@ JOB *job; /* set Sparse Matrix Pointers * macro to make elements with built-in out-of-memory test */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(BSIM4v4DPbpPtr, BSIM4v4dNodePrime, BSIM4v4bNodePrime) - TSTALLOC(BSIM4v4GPbpPtr, BSIM4v4gNodePrime, BSIM4v4bNodePrime) - TSTALLOC(BSIM4v4SPbpPtr, BSIM4v4sNodePrime, BSIM4v4bNodePrime) + TSTALLOC(BSIM4v4DPbpPtr, BSIM4v4dNodePrime, BSIM4v4bNodePrime); + TSTALLOC(BSIM4v4GPbpPtr, BSIM4v4gNodePrime, BSIM4v4bNodePrime); + TSTALLOC(BSIM4v4SPbpPtr, BSIM4v4sNodePrime, BSIM4v4bNodePrime); - TSTALLOC(BSIM4v4BPdpPtr, BSIM4v4bNodePrime, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4BPgpPtr, BSIM4v4bNodePrime, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4BPspPtr, BSIM4v4bNodePrime, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4BPbpPtr, BSIM4v4bNodePrime, BSIM4v4bNodePrime) + TSTALLOC(BSIM4v4BPdpPtr, BSIM4v4bNodePrime, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4BPgpPtr, BSIM4v4bNodePrime, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4BPspPtr, BSIM4v4bNodePrime, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4BPbpPtr, BSIM4v4bNodePrime, BSIM4v4bNodePrime); - TSTALLOC(BSIM4v4DdPtr, BSIM4v4dNode, BSIM4v4dNode) - TSTALLOC(BSIM4v4GPgpPtr, BSIM4v4gNodePrime, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4SsPtr, BSIM4v4sNode, BSIM4v4sNode) - TSTALLOC(BSIM4v4DPdpPtr, BSIM4v4dNodePrime, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4SPspPtr, BSIM4v4sNodePrime, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4DdpPtr, BSIM4v4dNode, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4GPdpPtr, BSIM4v4gNodePrime, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4GPspPtr, BSIM4v4gNodePrime, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4SspPtr, BSIM4v4sNode, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4DPspPtr, BSIM4v4dNodePrime, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4DPdPtr, BSIM4v4dNodePrime, BSIM4v4dNode) - TSTALLOC(BSIM4v4DPgpPtr, BSIM4v4dNodePrime, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4SPgpPtr, BSIM4v4sNodePrime, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4SPsPtr, BSIM4v4sNodePrime, BSIM4v4sNode) - TSTALLOC(BSIM4v4SPdpPtr, BSIM4v4sNodePrime, BSIM4v4dNodePrime) + TSTALLOC(BSIM4v4DdPtr, BSIM4v4dNode, BSIM4v4dNode); + TSTALLOC(BSIM4v4GPgpPtr, BSIM4v4gNodePrime, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4SsPtr, BSIM4v4sNode, BSIM4v4sNode); + TSTALLOC(BSIM4v4DPdpPtr, BSIM4v4dNodePrime, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4SPspPtr, BSIM4v4sNodePrime, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4DdpPtr, BSIM4v4dNode, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4GPdpPtr, BSIM4v4gNodePrime, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4GPspPtr, BSIM4v4gNodePrime, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4SspPtr, BSIM4v4sNode, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4DPspPtr, BSIM4v4dNodePrime, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4DPdPtr, BSIM4v4dNodePrime, BSIM4v4dNode); + TSTALLOC(BSIM4v4DPgpPtr, BSIM4v4dNodePrime, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4SPgpPtr, BSIM4v4sNodePrime, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4SPsPtr, BSIM4v4sNodePrime, BSIM4v4sNode); + TSTALLOC(BSIM4v4SPdpPtr, BSIM4v4sNodePrime, BSIM4v4dNodePrime); - TSTALLOC(BSIM4v4QqPtr, BSIM4v4qNode, BSIM4v4qNode) - TSTALLOC(BSIM4v4QbpPtr, BSIM4v4qNode, BSIM4v4bNodePrime) - TSTALLOC(BSIM4v4QdpPtr, BSIM4v4qNode, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4QspPtr, BSIM4v4qNode, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4QgpPtr, BSIM4v4qNode, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4DPqPtr, BSIM4v4dNodePrime, BSIM4v4qNode) - TSTALLOC(BSIM4v4SPqPtr, BSIM4v4sNodePrime, BSIM4v4qNode) - TSTALLOC(BSIM4v4GPqPtr, BSIM4v4gNodePrime, BSIM4v4qNode) + TSTALLOC(BSIM4v4QqPtr, BSIM4v4qNode, BSIM4v4qNode); + TSTALLOC(BSIM4v4QbpPtr, BSIM4v4qNode, BSIM4v4bNodePrime); + TSTALLOC(BSIM4v4QdpPtr, BSIM4v4qNode, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4QspPtr, BSIM4v4qNode, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4QgpPtr, BSIM4v4qNode, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4DPqPtr, BSIM4v4dNodePrime, BSIM4v4qNode); + TSTALLOC(BSIM4v4SPqPtr, BSIM4v4sNodePrime, BSIM4v4qNode); + TSTALLOC(BSIM4v4GPqPtr, BSIM4v4gNodePrime, BSIM4v4qNode); if (here->BSIM4v4rgateMod != 0) - { TSTALLOC(BSIM4v4GEgePtr, BSIM4v4gNodeExt, BSIM4v4gNodeExt) - TSTALLOC(BSIM4v4GEgpPtr, BSIM4v4gNodeExt, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4GPgePtr, BSIM4v4gNodePrime, BSIM4v4gNodeExt) - TSTALLOC(BSIM4v4GEdpPtr, BSIM4v4gNodeExt, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4GEspPtr, BSIM4v4gNodeExt, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4GEbpPtr, BSIM4v4gNodeExt, BSIM4v4bNodePrime) + { TSTALLOC(BSIM4v4GEgePtr, BSIM4v4gNodeExt, BSIM4v4gNodeExt); + TSTALLOC(BSIM4v4GEgpPtr, BSIM4v4gNodeExt, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4GPgePtr, BSIM4v4gNodePrime, BSIM4v4gNodeExt); + TSTALLOC(BSIM4v4GEdpPtr, BSIM4v4gNodeExt, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4GEspPtr, BSIM4v4gNodeExt, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4GEbpPtr, BSIM4v4gNodeExt, BSIM4v4bNodePrime); - TSTALLOC(BSIM4v4GMdpPtr, BSIM4v4gNodeMid, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4GMgpPtr, BSIM4v4gNodeMid, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4GMgmPtr, BSIM4v4gNodeMid, BSIM4v4gNodeMid) - TSTALLOC(BSIM4v4GMgePtr, BSIM4v4gNodeMid, BSIM4v4gNodeExt) - TSTALLOC(BSIM4v4GMspPtr, BSIM4v4gNodeMid, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4GMbpPtr, BSIM4v4gNodeMid, BSIM4v4bNodePrime) - TSTALLOC(BSIM4v4DPgmPtr, BSIM4v4dNodePrime, BSIM4v4gNodeMid) - TSTALLOC(BSIM4v4GPgmPtr, BSIM4v4gNodePrime, BSIM4v4gNodeMid) - TSTALLOC(BSIM4v4GEgmPtr, BSIM4v4gNodeExt, BSIM4v4gNodeMid) - TSTALLOC(BSIM4v4SPgmPtr, BSIM4v4sNodePrime, BSIM4v4gNodeMid) - TSTALLOC(BSIM4v4BPgmPtr, BSIM4v4bNodePrime, BSIM4v4gNodeMid) + TSTALLOC(BSIM4v4GMdpPtr, BSIM4v4gNodeMid, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4GMgpPtr, BSIM4v4gNodeMid, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4GMgmPtr, BSIM4v4gNodeMid, BSIM4v4gNodeMid); + TSTALLOC(BSIM4v4GMgePtr, BSIM4v4gNodeMid, BSIM4v4gNodeExt); + TSTALLOC(BSIM4v4GMspPtr, BSIM4v4gNodeMid, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4GMbpPtr, BSIM4v4gNodeMid, BSIM4v4bNodePrime); + TSTALLOC(BSIM4v4DPgmPtr, BSIM4v4dNodePrime, BSIM4v4gNodeMid); + TSTALLOC(BSIM4v4GPgmPtr, BSIM4v4gNodePrime, BSIM4v4gNodeMid); + TSTALLOC(BSIM4v4GEgmPtr, BSIM4v4gNodeExt, BSIM4v4gNodeMid); + TSTALLOC(BSIM4v4SPgmPtr, BSIM4v4sNodePrime, BSIM4v4gNodeMid); + TSTALLOC(BSIM4v4BPgmPtr, BSIM4v4bNodePrime, BSIM4v4gNodeMid); } if (here->BSIM4v4rbodyMod) - { TSTALLOC(BSIM4v4DPdbPtr, BSIM4v4dNodePrime, BSIM4v4dbNode) - TSTALLOC(BSIM4v4SPsbPtr, BSIM4v4sNodePrime, BSIM4v4sbNode) + { TSTALLOC(BSIM4v4DPdbPtr, BSIM4v4dNodePrime, BSIM4v4dbNode); + TSTALLOC(BSIM4v4SPsbPtr, BSIM4v4sNodePrime, BSIM4v4sbNode); - TSTALLOC(BSIM4v4DBdpPtr, BSIM4v4dbNode, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4DBdbPtr, BSIM4v4dbNode, BSIM4v4dbNode) - TSTALLOC(BSIM4v4DBbpPtr, BSIM4v4dbNode, BSIM4v4bNodePrime) - TSTALLOC(BSIM4v4DBbPtr, BSIM4v4dbNode, BSIM4v4bNode) + TSTALLOC(BSIM4v4DBdpPtr, BSIM4v4dbNode, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4DBdbPtr, BSIM4v4dbNode, BSIM4v4dbNode); + TSTALLOC(BSIM4v4DBbpPtr, BSIM4v4dbNode, BSIM4v4bNodePrime); + TSTALLOC(BSIM4v4DBbPtr, BSIM4v4dbNode, BSIM4v4bNode); - TSTALLOC(BSIM4v4BPdbPtr, BSIM4v4bNodePrime, BSIM4v4dbNode) - TSTALLOC(BSIM4v4BPbPtr, BSIM4v4bNodePrime, BSIM4v4bNode) - TSTALLOC(BSIM4v4BPsbPtr, BSIM4v4bNodePrime, BSIM4v4sbNode) + TSTALLOC(BSIM4v4BPdbPtr, BSIM4v4bNodePrime, BSIM4v4dbNode); + TSTALLOC(BSIM4v4BPbPtr, BSIM4v4bNodePrime, BSIM4v4bNode); + TSTALLOC(BSIM4v4BPsbPtr, BSIM4v4bNodePrime, BSIM4v4sbNode); - TSTALLOC(BSIM4v4SBspPtr, BSIM4v4sbNode, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4SBbpPtr, BSIM4v4sbNode, BSIM4v4bNodePrime) - TSTALLOC(BSIM4v4SBbPtr, BSIM4v4sbNode, BSIM4v4bNode) - TSTALLOC(BSIM4v4SBsbPtr, BSIM4v4sbNode, BSIM4v4sbNode) + TSTALLOC(BSIM4v4SBspPtr, BSIM4v4sbNode, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4SBbpPtr, BSIM4v4sbNode, BSIM4v4bNodePrime); + TSTALLOC(BSIM4v4SBbPtr, BSIM4v4sbNode, BSIM4v4bNode); + TSTALLOC(BSIM4v4SBsbPtr, BSIM4v4sbNode, BSIM4v4sbNode); - TSTALLOC(BSIM4v4BdbPtr, BSIM4v4bNode, BSIM4v4dbNode) - TSTALLOC(BSIM4v4BbpPtr, BSIM4v4bNode, BSIM4v4bNodePrime) - TSTALLOC(BSIM4v4BsbPtr, BSIM4v4bNode, BSIM4v4sbNode) - TSTALLOC(BSIM4v4BbPtr, BSIM4v4bNode, BSIM4v4bNode) + TSTALLOC(BSIM4v4BdbPtr, BSIM4v4bNode, BSIM4v4dbNode); + TSTALLOC(BSIM4v4BbpPtr, BSIM4v4bNode, BSIM4v4bNodePrime); + TSTALLOC(BSIM4v4BsbPtr, BSIM4v4bNode, BSIM4v4sbNode); + TSTALLOC(BSIM4v4BbPtr, BSIM4v4bNode, BSIM4v4bNode); } if (model->BSIM4v4rdsMod) - { TSTALLOC(BSIM4v4DgpPtr, BSIM4v4dNode, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4DspPtr, BSIM4v4dNode, BSIM4v4sNodePrime) - TSTALLOC(BSIM4v4DbpPtr, BSIM4v4dNode, BSIM4v4bNodePrime) - TSTALLOC(BSIM4v4SdpPtr, BSIM4v4sNode, BSIM4v4dNodePrime) - TSTALLOC(BSIM4v4SgpPtr, BSIM4v4sNode, BSIM4v4gNodePrime) - TSTALLOC(BSIM4v4SbpPtr, BSIM4v4sNode, BSIM4v4bNodePrime) + { TSTALLOC(BSIM4v4DgpPtr, BSIM4v4dNode, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4DspPtr, BSIM4v4dNode, BSIM4v4sNodePrime); + TSTALLOC(BSIM4v4DbpPtr, BSIM4v4dNode, BSIM4v4bNodePrime); + TSTALLOC(BSIM4v4SdpPtr, BSIM4v4sNode, BSIM4v4dNodePrime); + TSTALLOC(BSIM4v4SgpPtr, BSIM4v4sNode, BSIM4v4gNodePrime); + TSTALLOC(BSIM4v4SbpPtr, BSIM4v4sNode, BSIM4v4bNodePrime); } } } diff --git a/src/spicelib/devices/bsim4v5/b4v5set.c b/src/spicelib/devices/bsim4v5/b4v5set.c index f3909ae14..667a86c7c 100644 --- a/src/spicelib/devices/bsim4v5/b4v5set.c +++ b/src/spicelib/devices/bsim4v5/b4v5set.c @@ -1966,96 +1966,96 @@ JOB *job; /* set Sparse Matrix Pointers * macro to make elements with built-in out-of-memory test */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(BSIM4v5DPbpPtr, BSIM4v5dNodePrime, BSIM4v5bNodePrime) - TSTALLOC(BSIM4v5GPbpPtr, BSIM4v5gNodePrime, BSIM4v5bNodePrime) - TSTALLOC(BSIM4v5SPbpPtr, BSIM4v5sNodePrime, BSIM4v5bNodePrime) + TSTALLOC(BSIM4v5DPbpPtr, BSIM4v5dNodePrime, BSIM4v5bNodePrime); + TSTALLOC(BSIM4v5GPbpPtr, BSIM4v5gNodePrime, BSIM4v5bNodePrime); + TSTALLOC(BSIM4v5SPbpPtr, BSIM4v5sNodePrime, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5BPdpPtr, BSIM4v5bNodePrime, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5BPgpPtr, BSIM4v5bNodePrime, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5BPspPtr, BSIM4v5bNodePrime, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5BPbpPtr, BSIM4v5bNodePrime, BSIM4v5bNodePrime) + TSTALLOC(BSIM4v5BPdpPtr, BSIM4v5bNodePrime, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5BPgpPtr, BSIM4v5bNodePrime, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5BPspPtr, BSIM4v5bNodePrime, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5BPbpPtr, BSIM4v5bNodePrime, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5DdPtr, BSIM4v5dNode, BSIM4v5dNode) - TSTALLOC(BSIM4v5GPgpPtr, BSIM4v5gNodePrime, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5SsPtr, BSIM4v5sNode, BSIM4v5sNode) - TSTALLOC(BSIM4v5DPdpPtr, BSIM4v5dNodePrime, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5SPspPtr, BSIM4v5sNodePrime, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5DdpPtr, BSIM4v5dNode, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5GPdpPtr, BSIM4v5gNodePrime, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5GPspPtr, BSIM4v5gNodePrime, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5SspPtr, BSIM4v5sNode, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5DPspPtr, BSIM4v5dNodePrime, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5DPdPtr, BSIM4v5dNodePrime, BSIM4v5dNode) - TSTALLOC(BSIM4v5DPgpPtr, BSIM4v5dNodePrime, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5SPgpPtr, BSIM4v5sNodePrime, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5SPsPtr, BSIM4v5sNodePrime, BSIM4v5sNode) - TSTALLOC(BSIM4v5SPdpPtr, BSIM4v5sNodePrime, BSIM4v5dNodePrime) + TSTALLOC(BSIM4v5DdPtr, BSIM4v5dNode, BSIM4v5dNode); + TSTALLOC(BSIM4v5GPgpPtr, BSIM4v5gNodePrime, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5SsPtr, BSIM4v5sNode, BSIM4v5sNode); + TSTALLOC(BSIM4v5DPdpPtr, BSIM4v5dNodePrime, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5SPspPtr, BSIM4v5sNodePrime, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5DdpPtr, BSIM4v5dNode, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5GPdpPtr, BSIM4v5gNodePrime, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5GPspPtr, BSIM4v5gNodePrime, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5SspPtr, BSIM4v5sNode, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5DPspPtr, BSIM4v5dNodePrime, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5DPdPtr, BSIM4v5dNodePrime, BSIM4v5dNode); + TSTALLOC(BSIM4v5DPgpPtr, BSIM4v5dNodePrime, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5SPgpPtr, BSIM4v5sNodePrime, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5SPsPtr, BSIM4v5sNodePrime, BSIM4v5sNode); + TSTALLOC(BSIM4v5SPdpPtr, BSIM4v5sNodePrime, BSIM4v5dNodePrime); - TSTALLOC(BSIM4v5QqPtr, BSIM4v5qNode, BSIM4v5qNode) - TSTALLOC(BSIM4v5QbpPtr, BSIM4v5qNode, BSIM4v5bNodePrime) - TSTALLOC(BSIM4v5QdpPtr, BSIM4v5qNode, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5QspPtr, BSIM4v5qNode, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5QgpPtr, BSIM4v5qNode, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5DPqPtr, BSIM4v5dNodePrime, BSIM4v5qNode) - TSTALLOC(BSIM4v5SPqPtr, BSIM4v5sNodePrime, BSIM4v5qNode) - TSTALLOC(BSIM4v5GPqPtr, BSIM4v5gNodePrime, BSIM4v5qNode) + TSTALLOC(BSIM4v5QqPtr, BSIM4v5qNode, BSIM4v5qNode); + TSTALLOC(BSIM4v5QbpPtr, BSIM4v5qNode, BSIM4v5bNodePrime) ; + TSTALLOC(BSIM4v5QdpPtr, BSIM4v5qNode, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5QspPtr, BSIM4v5qNode, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5QgpPtr, BSIM4v5qNode, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5DPqPtr, BSIM4v5dNodePrime, BSIM4v5qNode); + TSTALLOC(BSIM4v5SPqPtr, BSIM4v5sNodePrime, BSIM4v5qNode); + TSTALLOC(BSIM4v5GPqPtr, BSIM4v5gNodePrime, BSIM4v5qNode); if (here->BSIM4v5rgateMod != 0) - { TSTALLOC(BSIM4v5GEgePtr, BSIM4v5gNodeExt, BSIM4v5gNodeExt) - TSTALLOC(BSIM4v5GEgpPtr, BSIM4v5gNodeExt, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5GPgePtr, BSIM4v5gNodePrime, BSIM4v5gNodeExt) - TSTALLOC(BSIM4v5GEdpPtr, BSIM4v5gNodeExt, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5GEspPtr, BSIM4v5gNodeExt, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5GEbpPtr, BSIM4v5gNodeExt, BSIM4v5bNodePrime) + { TSTALLOC(BSIM4v5GEgePtr, BSIM4v5gNodeExt, BSIM4v5gNodeExt); + TSTALLOC(BSIM4v5GEgpPtr, BSIM4v5gNodeExt, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5GPgePtr, BSIM4v5gNodePrime, BSIM4v5gNodeExt); + TSTALLOC(BSIM4v5GEdpPtr, BSIM4v5gNodeExt, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5GEspPtr, BSIM4v5gNodeExt, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5GEbpPtr, BSIM4v5gNodeExt, BSIM4v5bNodePrime); - TSTALLOC(BSIM4v5GMdpPtr, BSIM4v5gNodeMid, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5GMgpPtr, BSIM4v5gNodeMid, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5GMgmPtr, BSIM4v5gNodeMid, BSIM4v5gNodeMid) - TSTALLOC(BSIM4v5GMgePtr, BSIM4v5gNodeMid, BSIM4v5gNodeExt) - TSTALLOC(BSIM4v5GMspPtr, BSIM4v5gNodeMid, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5GMbpPtr, BSIM4v5gNodeMid, BSIM4v5bNodePrime) - TSTALLOC(BSIM4v5DPgmPtr, BSIM4v5dNodePrime, BSIM4v5gNodeMid) - TSTALLOC(BSIM4v5GPgmPtr, BSIM4v5gNodePrime, BSIM4v5gNodeMid) - TSTALLOC(BSIM4v5GEgmPtr, BSIM4v5gNodeExt, BSIM4v5gNodeMid) - TSTALLOC(BSIM4v5SPgmPtr, BSIM4v5sNodePrime, BSIM4v5gNodeMid) - TSTALLOC(BSIM4v5BPgmPtr, BSIM4v5bNodePrime, BSIM4v5gNodeMid) + TSTALLOC(BSIM4v5GMdpPtr, BSIM4v5gNodeMid, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5GMgpPtr, BSIM4v5gNodeMid, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5GMgmPtr, BSIM4v5gNodeMid, BSIM4v5gNodeMid); + TSTALLOC(BSIM4v5GMgePtr, BSIM4v5gNodeMid, BSIM4v5gNodeExt); + TSTALLOC(BSIM4v5GMspPtr, BSIM4v5gNodeMid, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5GMbpPtr, BSIM4v5gNodeMid, BSIM4v5bNodePrime); + TSTALLOC(BSIM4v5DPgmPtr, BSIM4v5dNodePrime, BSIM4v5gNodeMid); + TSTALLOC(BSIM4v5GPgmPtr, BSIM4v5gNodePrime, BSIM4v5gNodeMid); + TSTALLOC(BSIM4v5GEgmPtr, BSIM4v5gNodeExt, BSIM4v5gNodeMid); + TSTALLOC(BSIM4v5SPgmPtr, BSIM4v5sNodePrime, BSIM4v5gNodeMid); + TSTALLOC(BSIM4v5BPgmPtr, BSIM4v5bNodePrime, BSIM4v5gNodeMid); } if ((here->BSIM4v5rbodyMod ==1) || (here->BSIM4v5rbodyMod ==2)) - { TSTALLOC(BSIM4v5DPdbPtr, BSIM4v5dNodePrime, BSIM4v5dbNode) - TSTALLOC(BSIM4v5SPsbPtr, BSIM4v5sNodePrime, BSIM4v5sbNode) + { TSTALLOC(BSIM4v5DPdbPtr, BSIM4v5dNodePrime, BSIM4v5dbNode); + TSTALLOC(BSIM4v5SPsbPtr, BSIM4v5sNodePrime, BSIM4v5sbNode); - TSTALLOC(BSIM4v5DBdpPtr, BSIM4v5dbNode, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5DBdbPtr, BSIM4v5dbNode, BSIM4v5dbNode) - TSTALLOC(BSIM4v5DBbpPtr, BSIM4v5dbNode, BSIM4v5bNodePrime) - TSTALLOC(BSIM4v5DBbPtr, BSIM4v5dbNode, BSIM4v5bNode) + TSTALLOC(BSIM4v5DBdpPtr, BSIM4v5dbNode, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5DBdbPtr, BSIM4v5dbNode, BSIM4v5dbNode); + TSTALLOC(BSIM4v5DBbpPtr, BSIM4v5dbNode, BSIM4v5bNodePrime); + TSTALLOC(BSIM4v5DBbPtr, BSIM4v5dbNode, BSIM4v5bNode); - TSTALLOC(BSIM4v5BPdbPtr, BSIM4v5bNodePrime, BSIM4v5dbNode) - TSTALLOC(BSIM4v5BPbPtr, BSIM4v5bNodePrime, BSIM4v5bNode) - TSTALLOC(BSIM4v5BPsbPtr, BSIM4v5bNodePrime, BSIM4v5sbNode) + TSTALLOC(BSIM4v5BPdbPtr, BSIM4v5bNodePrime, BSIM4v5dbNode); + TSTALLOC(BSIM4v5BPbPtr, BSIM4v5bNodePrime, BSIM4v5bNode); + TSTALLOC(BSIM4v5BPsbPtr, BSIM4v5bNodePrime, BSIM4v5sbNode); - TSTALLOC(BSIM4v5SBspPtr, BSIM4v5sbNode, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5SBbpPtr, BSIM4v5sbNode, BSIM4v5bNodePrime) - TSTALLOC(BSIM4v5SBbPtr, BSIM4v5sbNode, BSIM4v5bNode) - TSTALLOC(BSIM4v5SBsbPtr, BSIM4v5sbNode, BSIM4v5sbNode) + TSTALLOC(BSIM4v5SBspPtr, BSIM4v5sbNode, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5SBbpPtr, BSIM4v5sbNode, BSIM4v5bNodePrime); + TSTALLOC(BSIM4v5SBbPtr, BSIM4v5sbNode, BSIM4v5bNode); + TSTALLOC(BSIM4v5SBsbPtr, BSIM4v5sbNode, BSIM4v5sbNode); - TSTALLOC(BSIM4v5BdbPtr, BSIM4v5bNode, BSIM4v5dbNode) - TSTALLOC(BSIM4v5BbpPtr, BSIM4v5bNode, BSIM4v5bNodePrime) - TSTALLOC(BSIM4v5BsbPtr, BSIM4v5bNode, BSIM4v5sbNode) - TSTALLOC(BSIM4v5BbPtr, BSIM4v5bNode, BSIM4v5bNode) + TSTALLOC(BSIM4v5BdbPtr, BSIM4v5bNode, BSIM4v5dbNode); + TSTALLOC(BSIM4v5BbpPtr, BSIM4v5bNode, BSIM4v5bNodePrime); + TSTALLOC(BSIM4v5BsbPtr, BSIM4v5bNode, BSIM4v5sbNode); + TSTALLOC(BSIM4v5BbPtr, BSIM4v5bNode, BSIM4v5bNode); } if (model->BSIM4v5rdsMod) - { TSTALLOC(BSIM4v5DgpPtr, BSIM4v5dNode, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5DspPtr, BSIM4v5dNode, BSIM4v5sNodePrime) - TSTALLOC(BSIM4v5DbpPtr, BSIM4v5dNode, BSIM4v5bNodePrime) - TSTALLOC(BSIM4v5SdpPtr, BSIM4v5sNode, BSIM4v5dNodePrime) - TSTALLOC(BSIM4v5SgpPtr, BSIM4v5sNode, BSIM4v5gNodePrime) - TSTALLOC(BSIM4v5SbpPtr, BSIM4v5sNode, BSIM4v5bNodePrime) + { TSTALLOC(BSIM4v5DgpPtr, BSIM4v5dNode, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5DspPtr, BSIM4v5dNode, BSIM4v5sNodePrime); + TSTALLOC(BSIM4v5DbpPtr, BSIM4v5dNode, BSIM4v5bNodePrime); + TSTALLOC(BSIM4v5SdpPtr, BSIM4v5sNode, BSIM4v5dNodePrime); + TSTALLOC(BSIM4v5SgpPtr, BSIM4v5sNode, BSIM4v5gNodePrime); + TSTALLOC(BSIM4v5SbpPtr, BSIM4v5sNode, BSIM4v5bNodePrime); } } } diff --git a/src/spicelib/devices/bsim4v6/b4v6set.c b/src/spicelib/devices/bsim4v6/b4v6set.c index fe2e32cb0..93e573eaf 100644 --- a/src/spicelib/devices/bsim4v6/b4v6set.c +++ b/src/spicelib/devices/bsim4v6/b4v6set.c @@ -2310,96 +2310,96 @@ BSIM4v6instance **InstArray; /* set Sparse Matrix Pointers * macro to make elements with built-in out-of-memory test */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(BSIM4v6DPbpPtr, BSIM4v6dNodePrime, BSIM4v6bNodePrime) - TSTALLOC(BSIM4v6GPbpPtr, BSIM4v6gNodePrime, BSIM4v6bNodePrime) - TSTALLOC(BSIM4v6SPbpPtr, BSIM4v6sNodePrime, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6DPbpPtr, BSIM4v6dNodePrime, BSIM4v6bNodePrime); + TSTALLOC(BSIM4v6GPbpPtr, BSIM4v6gNodePrime, BSIM4v6bNodePrime); + TSTALLOC(BSIM4v6SPbpPtr, BSIM4v6sNodePrime, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6BPdpPtr, BSIM4v6bNodePrime, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6BPgpPtr, BSIM4v6bNodePrime, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6BPspPtr, BSIM4v6bNodePrime, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6BPbpPtr, BSIM4v6bNodePrime, BSIM4v6bNodePrime) + TSTALLOC(BSIM4v6BPdpPtr, BSIM4v6bNodePrime, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6BPgpPtr, BSIM4v6bNodePrime, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6BPspPtr, BSIM4v6bNodePrime, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6BPbpPtr, BSIM4v6bNodePrime, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6DdPtr, BSIM4v6dNode, BSIM4v6dNode) - TSTALLOC(BSIM4v6GPgpPtr, BSIM4v6gNodePrime, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6SsPtr, BSIM4v6sNode, BSIM4v6sNode) - TSTALLOC(BSIM4v6DPdpPtr, BSIM4v6dNodePrime, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6SPspPtr, BSIM4v6sNodePrime, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6DdpPtr, BSIM4v6dNode, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6GPdpPtr, BSIM4v6gNodePrime, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6GPspPtr, BSIM4v6gNodePrime, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6SspPtr, BSIM4v6sNode, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6DPspPtr, BSIM4v6dNodePrime, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6DPdPtr, BSIM4v6dNodePrime, BSIM4v6dNode) - TSTALLOC(BSIM4v6DPgpPtr, BSIM4v6dNodePrime, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6SPgpPtr, BSIM4v6sNodePrime, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6SPsPtr, BSIM4v6sNodePrime, BSIM4v6sNode) - TSTALLOC(BSIM4v6SPdpPtr, BSIM4v6sNodePrime, BSIM4v6dNodePrime) + TSTALLOC(BSIM4v6DdPtr, BSIM4v6dNode, BSIM4v6dNode); + TSTALLOC(BSIM4v6GPgpPtr, BSIM4v6gNodePrime, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6SsPtr, BSIM4v6sNode, BSIM4v6sNode); + TSTALLOC(BSIM4v6DPdpPtr, BSIM4v6dNodePrime, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6SPspPtr, BSIM4v6sNodePrime, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6DdpPtr, BSIM4v6dNode, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6GPdpPtr, BSIM4v6gNodePrime, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6GPspPtr, BSIM4v6gNodePrime, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6SspPtr, BSIM4v6sNode, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6DPspPtr, BSIM4v6dNodePrime, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6DPdPtr, BSIM4v6dNodePrime, BSIM4v6dNode); + TSTALLOC(BSIM4v6DPgpPtr, BSIM4v6dNodePrime, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6SPgpPtr, BSIM4v6sNodePrime, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6SPsPtr, BSIM4v6sNodePrime, BSIM4v6sNode); + TSTALLOC(BSIM4v6SPdpPtr, BSIM4v6sNodePrime, BSIM4v6dNodePrime); - TSTALLOC(BSIM4v6QqPtr, BSIM4v6qNode, BSIM4v6qNode) - TSTALLOC(BSIM4v6QbpPtr, BSIM4v6qNode, BSIM4v6bNodePrime) - TSTALLOC(BSIM4v6QdpPtr, BSIM4v6qNode, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6QspPtr, BSIM4v6qNode, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6QgpPtr, BSIM4v6qNode, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6DPqPtr, BSIM4v6dNodePrime, BSIM4v6qNode) - TSTALLOC(BSIM4v6SPqPtr, BSIM4v6sNodePrime, BSIM4v6qNode) - TSTALLOC(BSIM4v6GPqPtr, BSIM4v6gNodePrime, BSIM4v6qNode) + TSTALLOC(BSIM4v6QqPtr, BSIM4v6qNode, BSIM4v6qNode); + TSTALLOC(BSIM4v6QbpPtr, BSIM4v6qNode, BSIM4v6bNodePrime) ; + TSTALLOC(BSIM4v6QdpPtr, BSIM4v6qNode, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6QspPtr, BSIM4v6qNode, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6QgpPtr, BSIM4v6qNode, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6DPqPtr, BSIM4v6dNodePrime, BSIM4v6qNode); + TSTALLOC(BSIM4v6SPqPtr, BSIM4v6sNodePrime, BSIM4v6qNode); + TSTALLOC(BSIM4v6GPqPtr, BSIM4v6gNodePrime, BSIM4v6qNode); if (here->BSIM4v6rgateMod != 0) - { TSTALLOC(BSIM4v6GEgePtr, BSIM4v6gNodeExt, BSIM4v6gNodeExt) - TSTALLOC(BSIM4v6GEgpPtr, BSIM4v6gNodeExt, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6GPgePtr, BSIM4v6gNodePrime, BSIM4v6gNodeExt) - TSTALLOC(BSIM4v6GEdpPtr, BSIM4v6gNodeExt, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6GEspPtr, BSIM4v6gNodeExt, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6GEbpPtr, BSIM4v6gNodeExt, BSIM4v6bNodePrime) + { TSTALLOC(BSIM4v6GEgePtr, BSIM4v6gNodeExt, BSIM4v6gNodeExt); + TSTALLOC(BSIM4v6GEgpPtr, BSIM4v6gNodeExt, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6GPgePtr, BSIM4v6gNodePrime, BSIM4v6gNodeExt); + TSTALLOC(BSIM4v6GEdpPtr, BSIM4v6gNodeExt, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6GEspPtr, BSIM4v6gNodeExt, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6GEbpPtr, BSIM4v6gNodeExt, BSIM4v6bNodePrime); - TSTALLOC(BSIM4v6GMdpPtr, BSIM4v6gNodeMid, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6GMgpPtr, BSIM4v6gNodeMid, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6GMgmPtr, BSIM4v6gNodeMid, BSIM4v6gNodeMid) - TSTALLOC(BSIM4v6GMgePtr, BSIM4v6gNodeMid, BSIM4v6gNodeExt) - TSTALLOC(BSIM4v6GMspPtr, BSIM4v6gNodeMid, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6GMbpPtr, BSIM4v6gNodeMid, BSIM4v6bNodePrime) - TSTALLOC(BSIM4v6DPgmPtr, BSIM4v6dNodePrime, BSIM4v6gNodeMid) - TSTALLOC(BSIM4v6GPgmPtr, BSIM4v6gNodePrime, BSIM4v6gNodeMid) - TSTALLOC(BSIM4v6GEgmPtr, BSIM4v6gNodeExt, BSIM4v6gNodeMid) - TSTALLOC(BSIM4v6SPgmPtr, BSIM4v6sNodePrime, BSIM4v6gNodeMid) - TSTALLOC(BSIM4v6BPgmPtr, BSIM4v6bNodePrime, BSIM4v6gNodeMid) + TSTALLOC(BSIM4v6GMdpPtr, BSIM4v6gNodeMid, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6GMgpPtr, BSIM4v6gNodeMid, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6GMgmPtr, BSIM4v6gNodeMid, BSIM4v6gNodeMid); + TSTALLOC(BSIM4v6GMgePtr, BSIM4v6gNodeMid, BSIM4v6gNodeExt); + TSTALLOC(BSIM4v6GMspPtr, BSIM4v6gNodeMid, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6GMbpPtr, BSIM4v6gNodeMid, BSIM4v6bNodePrime); + TSTALLOC(BSIM4v6DPgmPtr, BSIM4v6dNodePrime, BSIM4v6gNodeMid); + TSTALLOC(BSIM4v6GPgmPtr, BSIM4v6gNodePrime, BSIM4v6gNodeMid); + TSTALLOC(BSIM4v6GEgmPtr, BSIM4v6gNodeExt, BSIM4v6gNodeMid); + TSTALLOC(BSIM4v6SPgmPtr, BSIM4v6sNodePrime, BSIM4v6gNodeMid); + TSTALLOC(BSIM4v6BPgmPtr, BSIM4v6bNodePrime, BSIM4v6gNodeMid); } if ((here->BSIM4v6rbodyMod ==1) || (here->BSIM4v6rbodyMod ==2)) - { TSTALLOC(BSIM4v6DPdbPtr, BSIM4v6dNodePrime, BSIM4v6dbNode) - TSTALLOC(BSIM4v6SPsbPtr, BSIM4v6sNodePrime, BSIM4v6sbNode) + { TSTALLOC(BSIM4v6DPdbPtr, BSIM4v6dNodePrime, BSIM4v6dbNode); + TSTALLOC(BSIM4v6SPsbPtr, BSIM4v6sNodePrime, BSIM4v6sbNode); - TSTALLOC(BSIM4v6DBdpPtr, BSIM4v6dbNode, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6DBdbPtr, BSIM4v6dbNode, BSIM4v6dbNode) - TSTALLOC(BSIM4v6DBbpPtr, BSIM4v6dbNode, BSIM4v6bNodePrime) - TSTALLOC(BSIM4v6DBbPtr, BSIM4v6dbNode, BSIM4v6bNode) + TSTALLOC(BSIM4v6DBdpPtr, BSIM4v6dbNode, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6DBdbPtr, BSIM4v6dbNode, BSIM4v6dbNode); + TSTALLOC(BSIM4v6DBbpPtr, BSIM4v6dbNode, BSIM4v6bNodePrime); + TSTALLOC(BSIM4v6DBbPtr, BSIM4v6dbNode, BSIM4v6bNode); - TSTALLOC(BSIM4v6BPdbPtr, BSIM4v6bNodePrime, BSIM4v6dbNode) - TSTALLOC(BSIM4v6BPbPtr, BSIM4v6bNodePrime, BSIM4v6bNode) - TSTALLOC(BSIM4v6BPsbPtr, BSIM4v6bNodePrime, BSIM4v6sbNode) + TSTALLOC(BSIM4v6BPdbPtr, BSIM4v6bNodePrime, BSIM4v6dbNode); + TSTALLOC(BSIM4v6BPbPtr, BSIM4v6bNodePrime, BSIM4v6bNode); + TSTALLOC(BSIM4v6BPsbPtr, BSIM4v6bNodePrime, BSIM4v6sbNode); - TSTALLOC(BSIM4v6SBspPtr, BSIM4v6sbNode, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6SBbpPtr, BSIM4v6sbNode, BSIM4v6bNodePrime) - TSTALLOC(BSIM4v6SBbPtr, BSIM4v6sbNode, BSIM4v6bNode) - TSTALLOC(BSIM4v6SBsbPtr, BSIM4v6sbNode, BSIM4v6sbNode) + TSTALLOC(BSIM4v6SBspPtr, BSIM4v6sbNode, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6SBbpPtr, BSIM4v6sbNode, BSIM4v6bNodePrime); + TSTALLOC(BSIM4v6SBbPtr, BSIM4v6sbNode, BSIM4v6bNode); + TSTALLOC(BSIM4v6SBsbPtr, BSIM4v6sbNode, BSIM4v6sbNode); - TSTALLOC(BSIM4v6BdbPtr, BSIM4v6bNode, BSIM4v6dbNode) - TSTALLOC(BSIM4v6BbpPtr, BSIM4v6bNode, BSIM4v6bNodePrime) - TSTALLOC(BSIM4v6BsbPtr, BSIM4v6bNode, BSIM4v6sbNode) - TSTALLOC(BSIM4v6BbPtr, BSIM4v6bNode, BSIM4v6bNode) + TSTALLOC(BSIM4v6BdbPtr, BSIM4v6bNode, BSIM4v6dbNode); + TSTALLOC(BSIM4v6BbpPtr, BSIM4v6bNode, BSIM4v6bNodePrime); + TSTALLOC(BSIM4v6BsbPtr, BSIM4v6bNode, BSIM4v6sbNode); + TSTALLOC(BSIM4v6BbPtr, BSIM4v6bNode, BSIM4v6bNode); } if (model->BSIM4v6rdsMod) - { TSTALLOC(BSIM4v6DgpPtr, BSIM4v6dNode, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6DspPtr, BSIM4v6dNode, BSIM4v6sNodePrime) - TSTALLOC(BSIM4v6DbpPtr, BSIM4v6dNode, BSIM4v6bNodePrime) - TSTALLOC(BSIM4v6SdpPtr, BSIM4v6sNode, BSIM4v6dNodePrime) - TSTALLOC(BSIM4v6SgpPtr, BSIM4v6sNode, BSIM4v6gNodePrime) - TSTALLOC(BSIM4v6SbpPtr, BSIM4v6sNode, BSIM4v6bNodePrime) + { TSTALLOC(BSIM4v6DgpPtr, BSIM4v6dNode, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6DspPtr, BSIM4v6dNode, BSIM4v6sNodePrime); + TSTALLOC(BSIM4v6DbpPtr, BSIM4v6dNode, BSIM4v6bNodePrime); + TSTALLOC(BSIM4v6SdpPtr, BSIM4v6sNode, BSIM4v6dNodePrime); + TSTALLOC(BSIM4v6SgpPtr, BSIM4v6sNode, BSIM4v6gNodePrime); + TSTALLOC(BSIM4v6SbpPtr, BSIM4v6sNode, BSIM4v6bNodePrime); } } } /* end of loop through all the BSIM4v6 device models */ diff --git a/src/spicelib/devices/bsimsoi/b4soiset.c b/src/spicelib/devices/bsimsoi/b4soiset.c index eb1e21db4..29d6df025 100644 --- a/src/spicelib/devices/bsimsoi/b4soiset.c +++ b/src/spicelib/devices/bsimsoi/b4soiset.c @@ -2515,32 +2515,32 @@ B4SOIinstance **InstArray; /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ +do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ -} +} } while(0) if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0.0)) { - TSTALLOC(B4SOITemptempPtr, B4SOItempNode, B4SOItempNode) - TSTALLOC(B4SOITempdpPtr, B4SOItempNode, B4SOIdNodePrime) - TSTALLOC(B4SOITempspPtr, B4SOItempNode, B4SOIsNodePrime) - TSTALLOC(B4SOITempgPtr, B4SOItempNode, B4SOIgNode) - TSTALLOC(B4SOITempbPtr, B4SOItempNode, B4SOIbNode) + TSTALLOC(B4SOITemptempPtr, B4SOItempNode, B4SOItempNode); + TSTALLOC(B4SOITempdpPtr, B4SOItempNode, B4SOIdNodePrime); + TSTALLOC(B4SOITempspPtr, B4SOItempNode, B4SOIsNodePrime); + TSTALLOC(B4SOITempgPtr, B4SOItempNode, B4SOIgNode); + TSTALLOC(B4SOITempbPtr, B4SOItempNode, B4SOIbNode); - TSTALLOC(B4SOIGtempPtr, B4SOIgNode, B4SOItempNode) + TSTALLOC(B4SOIGtempPtr, B4SOIgNode, B4SOItempNode); - TSTALLOC(B4SOIDPtempPtr, B4SOIdNodePrime, B4SOItempNode) - TSTALLOC(B4SOISPtempPtr, B4SOIsNodePrime, B4SOItempNode) - TSTALLOC(B4SOIEtempPtr, B4SOIeNode, B4SOItempNode) - TSTALLOC(B4SOIBtempPtr, B4SOIbNode, B4SOItempNode) + TSTALLOC(B4SOIDPtempPtr, B4SOIdNodePrime, B4SOItempNode); + TSTALLOC(B4SOISPtempPtr, B4SOIsNodePrime, B4SOItempNode); + TSTALLOC(B4SOIEtempPtr, B4SOIeNode, B4SOItempNode); + TSTALLOC(B4SOIBtempPtr, B4SOIbNode, B4SOItempNode); if (here->B4SOIbodyMod == 1) { - TSTALLOC(B4SOIPtempPtr, B4SOIpNode, B4SOItempNode) + TSTALLOC(B4SOIPtempPtr, B4SOIpNode, B4SOItempNode); } /* v3.0 */ if (here->B4SOIsoiMod != 0) { /* v3.2 */ - TSTALLOC(B4SOITempePtr, B4SOItempNode, B4SOIeNode) + TSTALLOC(B4SOITempePtr, B4SOItempNode, B4SOIeNode); } } @@ -2548,40 +2548,40 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ /* Don't create any Jacobian entry for pNode */ } else if (here->B4SOIbodyMod == 1) { - TSTALLOC(B4SOIBpPtr, B4SOIbNode, B4SOIpNode) - TSTALLOC(B4SOIPbPtr, B4SOIpNode, B4SOIbNode) - TSTALLOC(B4SOIPpPtr, B4SOIpNode, B4SOIpNode) + TSTALLOC(B4SOIBpPtr, B4SOIbNode, B4SOIpNode); + TSTALLOC(B4SOIPbPtr, B4SOIpNode, B4SOIbNode); + TSTALLOC(B4SOIPpPtr, B4SOIpNode, B4SOIpNode); /* 4.1 for Igb2_agbcp2 */ - TSTALLOC(B4SOIPgPtr , B4SOIpNode, B4SOIgNode) - TSTALLOC(B4SOIGpPtr , B4SOIgNode, B4SOIpNode) + TSTALLOC(B4SOIPgPtr , B4SOIpNode, B4SOIgNode); + TSTALLOC(B4SOIGpPtr , B4SOIgNode, B4SOIpNode); } /* v3.1 added for RF */ if (here->B4SOIrgateMod != 0) - { TSTALLOC(B4SOIGEgePtr, B4SOIgNodeExt, B4SOIgNodeExt) - TSTALLOC(B4SOIGEgPtr, B4SOIgNodeExt, B4SOIgNode) - TSTALLOC(B4SOIGgePtr, B4SOIgNode, B4SOIgNodeExt) - TSTALLOC(B4SOIGEdpPtr, B4SOIgNodeExt, B4SOIdNodePrime) - TSTALLOC(B4SOIGEspPtr, B4SOIgNodeExt, B4SOIsNodePrime) + { TSTALLOC(B4SOIGEgePtr, B4SOIgNodeExt, B4SOIgNodeExt); + TSTALLOC(B4SOIGEgPtr, B4SOIgNodeExt, B4SOIgNode); + TSTALLOC(B4SOIGgePtr, B4SOIgNode, B4SOIgNodeExt); + TSTALLOC(B4SOIGEdpPtr, B4SOIgNodeExt, B4SOIdNodePrime); + TSTALLOC(B4SOIGEspPtr, B4SOIgNodeExt, B4SOIsNodePrime); if (here->B4SOIsoiMod !=2) /* v3.2 */ - TSTALLOC(B4SOIGEbPtr, B4SOIgNodeExt, B4SOIbNode) + TSTALLOC(B4SOIGEbPtr, B4SOIgNodeExt, B4SOIbNode); - TSTALLOC(B4SOIGMdpPtr, B4SOIgNodeMid, B4SOIdNodePrime) - TSTALLOC(B4SOIGMgPtr, B4SOIgNodeMid, B4SOIgNode) - TSTALLOC(B4SOIGMgmPtr, B4SOIgNodeMid, B4SOIgNodeMid) - TSTALLOC(B4SOIGMgePtr, B4SOIgNodeMid, B4SOIgNodeExt) - TSTALLOC(B4SOIGMspPtr, B4SOIgNodeMid, B4SOIsNodePrime) + TSTALLOC(B4SOIGMdpPtr, B4SOIgNodeMid, B4SOIdNodePrime); + TSTALLOC(B4SOIGMgPtr, B4SOIgNodeMid, B4SOIgNode); + TSTALLOC(B4SOIGMgmPtr, B4SOIgNodeMid, B4SOIgNodeMid); + TSTALLOC(B4SOIGMgePtr, B4SOIgNodeMid, B4SOIgNodeExt); + TSTALLOC(B4SOIGMspPtr, B4SOIgNodeMid, B4SOIsNodePrime); if (here->B4SOIsoiMod !=2) /* v3.2 */ - TSTALLOC(B4SOIGMbPtr, B4SOIgNodeMid, B4SOIbNode) + TSTALLOC(B4SOIGMbPtr, B4SOIgNodeMid, B4SOIbNode); - TSTALLOC(B4SOIGMePtr, B4SOIgNodeMid, B4SOIeNode) - TSTALLOC(B4SOIDPgmPtr, B4SOIdNodePrime, B4SOIgNodeMid) - TSTALLOC(B4SOIGgmPtr, B4SOIgNode, B4SOIgNodeMid) - TSTALLOC(B4SOIGEgmPtr, B4SOIgNodeExt, B4SOIgNodeMid) - TSTALLOC(B4SOISPgmPtr, B4SOIsNodePrime, B4SOIgNodeMid) - TSTALLOC(B4SOIEgmPtr, B4SOIeNode, B4SOIgNodeMid) + TSTALLOC(B4SOIGMePtr, B4SOIgNodeMid, B4SOIeNode); + TSTALLOC(B4SOIDPgmPtr, B4SOIdNodePrime, B4SOIgNodeMid); + TSTALLOC(B4SOIGgmPtr, B4SOIgNode, B4SOIgNodeMid); + TSTALLOC(B4SOIGEgmPtr, B4SOIgNodeExt, B4SOIgNodeMid); + TSTALLOC(B4SOISPgmPtr, B4SOIsNodePrime, B4SOIgNodeMid); + TSTALLOC(B4SOIEgmPtr, B4SOIeNode, B4SOIgNodeMid); } /* v3.1 added for RF end */ @@ -2589,74 +2589,74 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ /* v3.1 */ if (here->B4SOIsoiMod != 2) /* v3.2 */ { - TSTALLOC(B4SOIEbPtr, B4SOIeNode, B4SOIbNode) - TSTALLOC(B4SOIGbPtr, B4SOIgNode, B4SOIbNode) - TSTALLOC(B4SOIDPbPtr, B4SOIdNodePrime, B4SOIbNode) - TSTALLOC(B4SOISPbPtr, B4SOIsNodePrime, B4SOIbNode) - TSTALLOC(B4SOIBePtr, B4SOIbNode, B4SOIeNode) - TSTALLOC(B4SOIBgPtr, B4SOIbNode, B4SOIgNode) - TSTALLOC(B4SOIBdpPtr, B4SOIbNode, B4SOIdNodePrime) - TSTALLOC(B4SOIBspPtr, B4SOIbNode, B4SOIsNodePrime) - TSTALLOC(B4SOIBbPtr, B4SOIbNode, B4SOIbNode) + TSTALLOC(B4SOIEbPtr, B4SOIeNode, B4SOIbNode); + TSTALLOC(B4SOIGbPtr, B4SOIgNode, B4SOIbNode); + TSTALLOC(B4SOIDPbPtr, B4SOIdNodePrime, B4SOIbNode); + TSTALLOC(B4SOISPbPtr, B4SOIsNodePrime, B4SOIbNode); + TSTALLOC(B4SOIBePtr, B4SOIbNode, B4SOIeNode); + TSTALLOC(B4SOIBgPtr, B4SOIbNode, B4SOIgNode); + TSTALLOC(B4SOIBdpPtr, B4SOIbNode, B4SOIdNodePrime); + TSTALLOC(B4SOIBspPtr, B4SOIbNode, B4SOIsNodePrime); + TSTALLOC(B4SOIBbPtr, B4SOIbNode, B4SOIbNode); } /* v3.1 */ - TSTALLOC(B4SOIEgPtr, B4SOIeNode, B4SOIgNode) - TSTALLOC(B4SOIEdpPtr, B4SOIeNode, B4SOIdNodePrime) - TSTALLOC(B4SOIEspPtr, B4SOIeNode, B4SOIsNodePrime) - TSTALLOC(B4SOIGePtr, B4SOIgNode, B4SOIeNode) - TSTALLOC(B4SOIDPePtr, B4SOIdNodePrime, B4SOIeNode) - TSTALLOC(B4SOISPePtr, B4SOIsNodePrime, B4SOIeNode) + TSTALLOC(B4SOIEgPtr, B4SOIeNode, B4SOIgNode); + TSTALLOC(B4SOIEdpPtr, B4SOIeNode, B4SOIdNodePrime); + TSTALLOC(B4SOIEspPtr, B4SOIeNode, B4SOIsNodePrime); + TSTALLOC(B4SOIGePtr, B4SOIgNode, B4SOIeNode); + TSTALLOC(B4SOIDPePtr, B4SOIdNodePrime, B4SOIeNode); + TSTALLOC(B4SOISPePtr, B4SOIsNodePrime, B4SOIeNode); - TSTALLOC(B4SOIEbPtr, B4SOIeNode, B4SOIbNode) - TSTALLOC(B4SOIEePtr, B4SOIeNode, B4SOIeNode) + TSTALLOC(B4SOIEbPtr, B4SOIeNode, B4SOIbNode); + TSTALLOC(B4SOIEePtr, B4SOIeNode, B4SOIeNode); - TSTALLOC(B4SOIGgPtr, B4SOIgNode, B4SOIgNode) - TSTALLOC(B4SOIGdpPtr, B4SOIgNode, B4SOIdNodePrime) - TSTALLOC(B4SOIGspPtr, B4SOIgNode, B4SOIsNodePrime) + TSTALLOC(B4SOIGgPtr, B4SOIgNode, B4SOIgNode); + TSTALLOC(B4SOIGdpPtr, B4SOIgNode, B4SOIdNodePrime); + TSTALLOC(B4SOIGspPtr, B4SOIgNode, B4SOIsNodePrime); - TSTALLOC(B4SOIDPgPtr, B4SOIdNodePrime, B4SOIgNode) - TSTALLOC(B4SOIDPdpPtr, B4SOIdNodePrime, B4SOIdNodePrime) - TSTALLOC(B4SOIDPspPtr, B4SOIdNodePrime, B4SOIsNodePrime) - TSTALLOC(B4SOIDPdPtr, B4SOIdNodePrime, B4SOIdNode) + TSTALLOC(B4SOIDPgPtr, B4SOIdNodePrime, B4SOIgNode); + TSTALLOC(B4SOIDPdpPtr, B4SOIdNodePrime, B4SOIdNodePrime); + TSTALLOC(B4SOIDPspPtr, B4SOIdNodePrime, B4SOIsNodePrime); + TSTALLOC(B4SOIDPdPtr, B4SOIdNodePrime, B4SOIdNode); - TSTALLOC(B4SOISPgPtr, B4SOIsNodePrime, B4SOIgNode) - TSTALLOC(B4SOISPdpPtr, B4SOIsNodePrime, B4SOIdNodePrime) - TSTALLOC(B4SOISPspPtr, B4SOIsNodePrime, B4SOIsNodePrime) - TSTALLOC(B4SOISPsPtr, B4SOIsNodePrime, B4SOIsNode) + TSTALLOC(B4SOISPgPtr, B4SOIsNodePrime, B4SOIgNode); + TSTALLOC(B4SOISPdpPtr, B4SOIsNodePrime, B4SOIdNodePrime); + TSTALLOC(B4SOISPspPtr, B4SOIsNodePrime, B4SOIsNodePrime); + TSTALLOC(B4SOISPsPtr, B4SOIsNodePrime, B4SOIsNode); - TSTALLOC(B4SOIDdPtr, B4SOIdNode, B4SOIdNode) - TSTALLOC(B4SOIDdpPtr, B4SOIdNode, B4SOIdNodePrime) + TSTALLOC(B4SOIDdPtr, B4SOIdNode, B4SOIdNode); + TSTALLOC(B4SOIDdpPtr, B4SOIdNode, B4SOIdNodePrime); - TSTALLOC(B4SOISsPtr, B4SOIsNode, B4SOIsNode) - TSTALLOC(B4SOISspPtr, B4SOIsNode, B4SOIsNodePrime) + TSTALLOC(B4SOISsPtr, B4SOIsNode, B4SOIsNode); + TSTALLOC(B4SOISspPtr, B4SOIsNode, B4SOIsNodePrime); /* v4.0 */ if (here->B4SOIrbodyMod == 1) - { TSTALLOC(B4SOIDPdbPtr, B4SOIdNodePrime, B4SOIdbNode) - TSTALLOC(B4SOISPsbPtr, B4SOIsNodePrime, B4SOIsbNode) + { TSTALLOC(B4SOIDPdbPtr, B4SOIdNodePrime, B4SOIdbNode); + TSTALLOC(B4SOISPsbPtr, B4SOIsNodePrime, B4SOIsbNode); - TSTALLOC(B4SOIDBdpPtr, B4SOIdbNode, B4SOIdNodePrime) - TSTALLOC(B4SOIDBdbPtr, B4SOIdbNode, B4SOIdbNode) - TSTALLOC(B4SOIDBbPtr, B4SOIdbNode, B4SOIbNode) + TSTALLOC(B4SOIDBdpPtr, B4SOIdbNode, B4SOIdNodePrime); + TSTALLOC(B4SOIDBdbPtr, B4SOIdbNode, B4SOIdbNode); + TSTALLOC(B4SOIDBbPtr, B4SOIdbNode, B4SOIbNode); - TSTALLOC(B4SOISBspPtr, B4SOIsbNode, B4SOIsNodePrime) - TSTALLOC(B4SOISBsbPtr, B4SOIsbNode, B4SOIsbNode) - TSTALLOC(B4SOISBbPtr, B4SOIsbNode, B4SOIbNode) + TSTALLOC(B4SOISBspPtr, B4SOIsbNode, B4SOIsNodePrime); + TSTALLOC(B4SOISBsbPtr, B4SOIsbNode, B4SOIsbNode); + TSTALLOC(B4SOISBbPtr, B4SOIsbNode, B4SOIbNode); - TSTALLOC(B4SOIBdbPtr, B4SOIbNode, B4SOIdbNode) - TSTALLOC(B4SOIBsbPtr, B4SOIbNode, B4SOIsbNode) + TSTALLOC(B4SOIBdbPtr, B4SOIbNode, B4SOIdbNode); + TSTALLOC(B4SOIBsbPtr, B4SOIbNode, B4SOIsbNode); } if (model->B4SOIrdsMod) - { TSTALLOC(B4SOIDgPtr, B4SOIdNode, B4SOIgNode) - TSTALLOC(B4SOIDspPtr, B4SOIdNode, B4SOIsNodePrime) - TSTALLOC(B4SOISdpPtr, B4SOIsNode, B4SOIdNodePrime) - TSTALLOC(B4SOISgPtr, B4SOIsNode, B4SOIgNode) + { TSTALLOC(B4SOIDgPtr, B4SOIdNode, B4SOIgNode); + TSTALLOC(B4SOIDspPtr, B4SOIdNode, B4SOIsNodePrime); + TSTALLOC(B4SOISdpPtr, B4SOIsNode, B4SOIdNodePrime); + TSTALLOC(B4SOISgPtr, B4SOIsNode, B4SOIgNode); if (model->B4SOIsoiMod != 2) { - TSTALLOC(B4SOIDbPtr, B4SOIdNode, B4SOIbNode) - TSTALLOC(B4SOISbPtr, B4SOIsNode, B4SOIbNode) + TSTALLOC(B4SOIDbPtr, B4SOIdNode, B4SOIbNode); + TSTALLOC(B4SOISbPtr, B4SOIsNode, B4SOIbNode); } } @@ -2666,25 +2666,25 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ /* here for debugging purpose only */ if (here->B4SOIdebugMod != 0) { - TSTALLOC(B4SOIVbsPtr, B4SOIvbsNode, B4SOIvbsNode) - TSTALLOC(B4SOIIdsPtr, B4SOIidsNode, B4SOIidsNode) - TSTALLOC(B4SOIIcPtr, B4SOIicNode, B4SOIicNode) - TSTALLOC(B4SOIIbsPtr, B4SOIibsNode, B4SOIibsNode) - TSTALLOC(B4SOIIbdPtr, B4SOIibdNode, B4SOIibdNode) - TSTALLOC(B4SOIIiiPtr, B4SOIiiiNode, B4SOIiiiNode) - TSTALLOC(B4SOIIgPtr, B4SOIigNode, B4SOIigNode) - TSTALLOC(B4SOIGiggPtr, B4SOIgiggNode, B4SOIgiggNode) - TSTALLOC(B4SOIGigdPtr, B4SOIgigdNode, B4SOIgigdNode) - TSTALLOC(B4SOIGigbPtr, B4SOIgigbNode, B4SOIgigbNode) - TSTALLOC(B4SOIIgidlPtr, B4SOIigidlNode, B4SOIigidlNode) - TSTALLOC(B4SOIItunPtr, B4SOIitunNode, B4SOIitunNode) - TSTALLOC(B4SOIIbpPtr, B4SOIibpNode, B4SOIibpNode) - TSTALLOC(B4SOICbbPtr, B4SOIcbbNode, B4SOIcbbNode) - TSTALLOC(B4SOICbdPtr, B4SOIcbdNode, B4SOIcbdNode) - TSTALLOC(B4SOICbgPtr, B4SOIcbgNode, B4SOIcbgNode) - TSTALLOC(B4SOIQbfPtr, B4SOIqbfNode, B4SOIqbfNode) - TSTALLOC(B4SOIQjsPtr, B4SOIqjsNode, B4SOIqjsNode) - TSTALLOC(B4SOIQjdPtr, B4SOIqjdNode, B4SOIqjdNode) + TSTALLOC(B4SOIVbsPtr, B4SOIvbsNode, B4SOIvbsNode); + TSTALLOC(B4SOIIdsPtr, B4SOIidsNode, B4SOIidsNode); + TSTALLOC(B4SOIIcPtr, B4SOIicNode, B4SOIicNode); + TSTALLOC(B4SOIIbsPtr, B4SOIibsNode, B4SOIibsNode); + TSTALLOC(B4SOIIbdPtr, B4SOIibdNode, B4SOIibdNode); + TSTALLOC(B4SOIIiiPtr, B4SOIiiiNode, B4SOIiiiNode); + TSTALLOC(B4SOIIgPtr, B4SOIigNode, B4SOIigNode); + TSTALLOC(B4SOIGiggPtr, B4SOIgiggNode, B4SOIgiggNode); + TSTALLOC(B4SOIGigdPtr, B4SOIgigdNode, B4SOIgigdNode); + TSTALLOC(B4SOIGigbPtr, B4SOIgigbNode, B4SOIgigbNode); + TSTALLOC(B4SOIIgidlPtr, B4SOIigidlNode, B4SOIigidlNode); + TSTALLOC(B4SOIItunPtr, B4SOIitunNode, B4SOIitunNode); + TSTALLOC(B4SOIIbpPtr, B4SOIibpNode, B4SOIibpNode); + TSTALLOC(B4SOICbbPtr, B4SOIcbbNode, B4SOIcbbNode); + TSTALLOC(B4SOICbdPtr, B4SOIcbdNode, B4SOIcbdNode); + TSTALLOC(B4SOICbgPtr, B4SOIcbgNode, B4SOIcbgNode); + TSTALLOC(B4SOIQbfPtr, B4SOIqbfNode, B4SOIqbfNode); + TSTALLOC(B4SOIQjsPtr, B4SOIqjsNode, B4SOIqjsNode); + TSTALLOC(B4SOIQjdPtr, B4SOIqjdNode, B4SOIqjdNode); } diff --git a/src/spicelib/devices/cap/capsetup.c b/src/spicelib/devices/cap/capsetup.c index e37e4136d..f41c85fdf 100644 --- a/src/spicelib/devices/cap/capsetup.c +++ b/src/spicelib/devices/cap/capsetup.c @@ -101,14 +101,14 @@ CAPsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(CAPposPosptr,CAPposNode,CAPposNode) - TSTALLOC(CAPnegNegptr,CAPnegNode,CAPnegNode) - TSTALLOC(CAPposNegptr,CAPposNode,CAPnegNode) - TSTALLOC(CAPnegPosptr,CAPnegNode,CAPposNode) + TSTALLOC(CAPposPosptr,CAPposNode,CAPposNode); + TSTALLOC(CAPnegNegptr,CAPnegNode,CAPnegNode); + TSTALLOC(CAPposNegptr,CAPposNode,CAPnegNode); + TSTALLOC(CAPnegPosptr,CAPnegNode,CAPposNode); } } return(OK); diff --git a/src/spicelib/devices/cccs/cccsset.c b/src/spicelib/devices/cccs/cccsset.c index baaeea27e..99087d9eb 100644 --- a/src/spicelib/devices/cccs/cccsset.c +++ b/src/spicelib/devices/cccs/cccsset.c @@ -45,12 +45,12 @@ CCCSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(CCCSposContBrptr,CCCSposNode,CCCScontBranch) - TSTALLOC(CCCSnegContBrptr,CCCSnegNode,CCCScontBranch) + TSTALLOC(CCCSposContBrptr,CCCSposNode,CCCScontBranch); + TSTALLOC(CCCSnegContBrptr,CCCSnegNode,CCCScontBranch); } } return(OK); diff --git a/src/spicelib/devices/ccvs/ccvsset.c b/src/spicelib/devices/ccvs/ccvsset.c index 3cedc4fec..5edea19dd 100644 --- a/src/spicelib/devices/ccvs/ccvsset.c +++ b/src/spicelib/devices/ccvs/ccvsset.c @@ -54,15 +54,15 @@ CCVSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(CCVSposIbrptr, CCVSposNode, CCVSbranch) - TSTALLOC(CCVSnegIbrptr, CCVSnegNode, CCVSbranch) - TSTALLOC(CCVSibrNegptr, CCVSbranch, CCVSnegNode) - TSTALLOC(CCVSibrPosptr, CCVSbranch, CCVSposNode) - TSTALLOC(CCVSibrContBrptr, CCVSbranch, CCVScontBranch) + TSTALLOC(CCVSposIbrptr, CCVSposNode, CCVSbranch); + TSTALLOC(CCVSnegIbrptr, CCVSnegNode, CCVSbranch); + TSTALLOC(CCVSibrNegptr, CCVSbranch, CCVSnegNode); + TSTALLOC(CCVSibrPosptr, CCVSbranch, CCVSposNode); + TSTALLOC(CCVSibrContBrptr, CCVSbranch, CCVScontBranch); } } return(OK); diff --git a/src/spicelib/devices/cpl/cplsetup.c b/src/spicelib/devices/cpl/cplsetup.c index f936bd374..37fc7d732 100644 --- a/src/spicelib/devices/cpl/cplsetup.c +++ b/src/spicelib/devices/cpl/cplsetup.c @@ -185,9 +185,9 @@ CPLsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) noL = here->dimension; diff --git a/src/spicelib/devices/csw/cswsetup.c b/src/spicelib/devices/csw/cswsetup.c index f2fd38fa5..5794a33d7 100644 --- a/src/spicelib/devices/csw/cswsetup.c +++ b/src/spicelib/devices/csw/cswsetup.c @@ -60,14 +60,14 @@ CSWsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(CSWposPosptr, CSWposNode, CSWposNode) - TSTALLOC(CSWposNegptr, CSWposNode, CSWnegNode) - TSTALLOC(CSWnegPosptr, CSWnegNode, CSWposNode) - TSTALLOC(CSWnegNegptr, CSWnegNode, CSWnegNode) + TSTALLOC(CSWposPosptr, CSWposNode, CSWposNode); + TSTALLOC(CSWposNegptr, CSWposNode, CSWnegNode); + TSTALLOC(CSWnegPosptr, CSWnegNode, CSWposNode); + TSTALLOC(CSWnegNegptr, CSWnegNode, CSWnegNode); } } return(OK); diff --git a/src/spicelib/devices/dio/diosetup.c b/src/spicelib/devices/dio/diosetup.c index 8f39b2933..fc0d37b16 100644 --- a/src/spicelib/devices/dio/diosetup.c +++ b/src/spicelib/devices/dio/diosetup.c @@ -219,17 +219,17 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(DIOposPosPrimePtr,DIOposNode,DIOposPrimeNode) - TSTALLOC(DIOnegPosPrimePtr,DIOnegNode,DIOposPrimeNode) - TSTALLOC(DIOposPrimePosPtr,DIOposPrimeNode,DIOposNode) - TSTALLOC(DIOposPrimeNegPtr,DIOposPrimeNode,DIOnegNode) - TSTALLOC(DIOposPosPtr,DIOposNode,DIOposNode) - TSTALLOC(DIOnegNegPtr,DIOnegNode,DIOnegNode) - TSTALLOC(DIOposPrimePosPrimePtr,DIOposPrimeNode,DIOposPrimeNode) + TSTALLOC(DIOposPosPrimePtr,DIOposNode,DIOposPrimeNode); + TSTALLOC(DIOnegPosPrimePtr,DIOnegNode,DIOposPrimeNode); + TSTALLOC(DIOposPrimePosPtr,DIOposPrimeNode,DIOposNode); + TSTALLOC(DIOposPrimeNegPtr,DIOposPrimeNode,DIOnegNode); + TSTALLOC(DIOposPosPtr,DIOposNode,DIOposNode); + TSTALLOC(DIOnegNegPtr,DIOnegNode,DIOnegNode); + TSTALLOC(DIOposPrimePosPrimePtr,DIOposPrimeNode,DIOposPrimeNode); } } return(OK); diff --git a/src/spicelib/devices/hfet1/hfetsetup.c b/src/spicelib/devices/hfet1/hfetsetup.c index 26c0174a4..410ccedfd 100644 --- a/src/spicelib/devices/hfet1/hfetsetup.c +++ b/src/spicelib/devices/hfet1/hfetsetup.c @@ -363,38 +363,38 @@ HFETAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(HFETAdrainDrainPrimePtr,HFETAdrainNode,HFETAdrainPrimeNode) - TSTALLOC(HFETAgatePrimeDrainPrimePtr,HFETAgatePrimeNode,HFETAdrainPrimeNode) - TSTALLOC(HFETAgatePrimeSourcePrimePtr,HFETAgatePrimeNode,HFETAsourcePrimeNode) - TSTALLOC(HFETAsourceSourcePrimePtr,HFETAsourceNode,HFETAsourcePrimeNode) - TSTALLOC(HFETAdrainPrimeDrainPtr,HFETAdrainPrimeNode,HFETAdrainNode) - TSTALLOC(HFETAdrainPrimeGatePrimePtr,HFETAdrainPrimeNode,HFETAgatePrimeNode) - TSTALLOC(HFETAdrainPrimeSourcePrimePtr,HFETAdrainPrimeNode,HFETAsourcePrimeNode) - TSTALLOC(HFETAsourcePrimeGatePrimePtr,HFETAsourcePrimeNode,HFETAgatePrimeNode) - TSTALLOC(HFETAsourcePrimeSourcePtr,HFETAsourcePrimeNode,HFETAsourceNode) - TSTALLOC(HFETAsourcePrimeDrainPrimePtr,HFETAsourcePrimeNode,HFETAdrainPrimeNode) - TSTALLOC(HFETAdrainDrainPtr,HFETAdrainNode,HFETAdrainNode) - TSTALLOC(HFETAgatePrimeGatePrimePtr,HFETAgatePrimeNode,HFETAgatePrimeNode) - TSTALLOC(HFETAsourceSourcePtr,HFETAsourceNode,HFETAsourceNode) - TSTALLOC(HFETAdrainPrimeDrainPrimePtr,HFETAdrainPrimeNode,HFETAdrainPrimeNode) - TSTALLOC(HFETAsourcePrimeSourcePrimePtr,HFETAsourcePrimeNode,HFETAsourcePrimeNode) - TSTALLOC(HFETAdrainPrimeDrainPrmPrmPtr,HFETAdrainPrimeNode,HFETAdrainPrmPrmNode) - TSTALLOC(HFETAdrainPrmPrmDrainPrimePtr,HFETAdrainPrmPrmNode,HFETAdrainPrimeNode) - TSTALLOC(HFETAdrainPrmPrmGatePrimePtr,HFETAdrainPrmPrmNode,HFETAgatePrimeNode) - TSTALLOC(HFETAgatePrimeDrainPrmPrmPtr,HFETAgatePrimeNode,HFETAdrainPrmPrmNode) - TSTALLOC(HFETAdrainPrmPrmDrainPrmPrmPtr,HFETAdrainPrmPrmNode,HFETAdrainPrmPrmNode) - TSTALLOC(HFETAsourcePrimeSourcePrmPrmPtr,HFETAsourcePrimeNode,HFETAsourcePrmPrmNode) - TSTALLOC(HFETAsourcePrmPrmSourcePrimePtr,HFETAsourcePrmPrmNode,HFETAsourcePrimeNode) - TSTALLOC(HFETAsourcePrmPrmGatePrimePtr,HFETAsourcePrmPrmNode,HFETAgatePrimeNode) - TSTALLOC(HFETAgatePrimeSourcePrmPrmPtr,HFETAgatePrimeNode,HFETAsourcePrmPrmNode) - TSTALLOC(HFETAsourcePrmPrmSourcePrmPrmPtr,HFETAsourcePrmPrmNode,HFETAsourcePrmPrmNode) - TSTALLOC(HFETAgateGatePtr,HFETAgateNode,HFETAgateNode) - TSTALLOC(HFETAgateGatePrimePtr,HFETAgateNode,HFETAgatePrimeNode) - TSTALLOC(HFETAgatePrimeGatePtr,HFETAgatePrimeNode,HFETAgateNode) + TSTALLOC(HFETAdrainDrainPrimePtr,HFETAdrainNode,HFETAdrainPrimeNode); + TSTALLOC(HFETAgatePrimeDrainPrimePtr,HFETAgatePrimeNode,HFETAdrainPrimeNode); + TSTALLOC(HFETAgatePrimeSourcePrimePtr,HFETAgatePrimeNode,HFETAsourcePrimeNode); + TSTALLOC(HFETAsourceSourcePrimePtr,HFETAsourceNode,HFETAsourcePrimeNode); + TSTALLOC(HFETAdrainPrimeDrainPtr,HFETAdrainPrimeNode,HFETAdrainNode); + TSTALLOC(HFETAdrainPrimeGatePrimePtr,HFETAdrainPrimeNode,HFETAgatePrimeNode); + TSTALLOC(HFETAdrainPrimeSourcePrimePtr,HFETAdrainPrimeNode,HFETAsourcePrimeNode); + TSTALLOC(HFETAsourcePrimeGatePrimePtr,HFETAsourcePrimeNode,HFETAgatePrimeNode); + TSTALLOC(HFETAsourcePrimeSourcePtr,HFETAsourcePrimeNode,HFETAsourceNode); + TSTALLOC(HFETAsourcePrimeDrainPrimePtr,HFETAsourcePrimeNode,HFETAdrainPrimeNode); + TSTALLOC(HFETAdrainDrainPtr,HFETAdrainNode,HFETAdrainNode); + TSTALLOC(HFETAgatePrimeGatePrimePtr,HFETAgatePrimeNode,HFETAgatePrimeNode); + TSTALLOC(HFETAsourceSourcePtr,HFETAsourceNode,HFETAsourceNode); + TSTALLOC(HFETAdrainPrimeDrainPrimePtr,HFETAdrainPrimeNode,HFETAdrainPrimeNode); + TSTALLOC(HFETAsourcePrimeSourcePrimePtr,HFETAsourcePrimeNode,HFETAsourcePrimeNode); + TSTALLOC(HFETAdrainPrimeDrainPrmPrmPtr,HFETAdrainPrimeNode,HFETAdrainPrmPrmNode); + TSTALLOC(HFETAdrainPrmPrmDrainPrimePtr,HFETAdrainPrmPrmNode,HFETAdrainPrimeNode); + TSTALLOC(HFETAdrainPrmPrmGatePrimePtr,HFETAdrainPrmPrmNode,HFETAgatePrimeNode); + TSTALLOC(HFETAgatePrimeDrainPrmPrmPtr,HFETAgatePrimeNode,HFETAdrainPrmPrmNode); + TSTALLOC(HFETAdrainPrmPrmDrainPrmPrmPtr,HFETAdrainPrmPrmNode,HFETAdrainPrmPrmNode); + TSTALLOC(HFETAsourcePrimeSourcePrmPrmPtr,HFETAsourcePrimeNode,HFETAsourcePrmPrmNode); + TSTALLOC(HFETAsourcePrmPrmSourcePrimePtr,HFETAsourcePrmPrmNode,HFETAsourcePrimeNode); + TSTALLOC(HFETAsourcePrmPrmGatePrimePtr,HFETAsourcePrmPrmNode,HFETAgatePrimeNode); + TSTALLOC(HFETAgatePrimeSourcePrmPrmPtr,HFETAgatePrimeNode,HFETAsourcePrmPrmNode); + TSTALLOC(HFETAsourcePrmPrmSourcePrmPrmPtr,HFETAsourcePrmPrmNode,HFETAsourcePrmPrmNode); + TSTALLOC(HFETAgateGatePtr,HFETAgateNode,HFETAgateNode); + TSTALLOC(HFETAgateGatePrimePtr,HFETAgateNode,HFETAgatePrimeNode); + TSTALLOC(HFETAgatePrimeGatePtr,HFETAgatePrimeNode,HFETAgateNode); } } return(OK); diff --git a/src/spicelib/devices/hfet2/hfet2setup.c b/src/spicelib/devices/hfet2/hfet2setup.c index 72bf46852..96044f989 100644 --- a/src/spicelib/devices/hfet2/hfet2setup.c +++ b/src/spicelib/devices/hfet2/hfet2setup.c @@ -177,25 +177,25 @@ int HFET2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(HFET2drainDrainPrimePtr,HFET2drainNode,HFET2drainPrimeNode) - TSTALLOC(HFET2gateDrainPrimePtr,HFET2gateNode,HFET2drainPrimeNode) - TSTALLOC(HFET2gateSourcePrimePtr,HFET2gateNode,HFET2sourcePrimeNode) - TSTALLOC(HFET2sourceSourcePrimePtr,HFET2sourceNode,HFET2sourcePrimeNode) - TSTALLOC(HFET2drainPrimeDrainPtr,HFET2drainPrimeNode,HFET2drainNode) - TSTALLOC(HFET2drainPrimeGatePtr,HFET2drainPrimeNode,HFET2gateNode) - TSTALLOC(HFET2drainPriHFET2ourcePrimePtr,HFET2drainPrimeNode,HFET2sourcePrimeNode) - TSTALLOC(HFET2sourcePrimeGatePtr,HFET2sourcePrimeNode,HFET2gateNode) - TSTALLOC(HFET2sourcePriHFET2ourcePtr,HFET2sourcePrimeNode,HFET2sourceNode) - TSTALLOC(HFET2sourcePrimeDrainPrimePtr,HFET2sourcePrimeNode,HFET2drainPrimeNode) - TSTALLOC(HFET2drainDrainPtr,HFET2drainNode,HFET2drainNode) - TSTALLOC(HFET2gateGatePtr,HFET2gateNode,HFET2gateNode) - TSTALLOC(HFET2sourceSourcePtr,HFET2sourceNode,HFET2sourceNode) - TSTALLOC(HFET2drainPrimeDrainPrimePtr,HFET2drainPrimeNode,HFET2drainPrimeNode) - TSTALLOC(HFET2sourcePriHFET2ourcePrimePtr,HFET2sourcePrimeNode,HFET2sourcePrimeNode) + TSTALLOC(HFET2drainDrainPrimePtr,HFET2drainNode,HFET2drainPrimeNode); + TSTALLOC(HFET2gateDrainPrimePtr,HFET2gateNode,HFET2drainPrimeNode); + TSTALLOC(HFET2gateSourcePrimePtr,HFET2gateNode,HFET2sourcePrimeNode); + TSTALLOC(HFET2sourceSourcePrimePtr,HFET2sourceNode,HFET2sourcePrimeNode); + TSTALLOC(HFET2drainPrimeDrainPtr,HFET2drainPrimeNode,HFET2drainNode); + TSTALLOC(HFET2drainPrimeGatePtr,HFET2drainPrimeNode,HFET2gateNode); + TSTALLOC(HFET2drainPriHFET2ourcePrimePtr,HFET2drainPrimeNode,HFET2sourcePrimeNode); + TSTALLOC(HFET2sourcePrimeGatePtr,HFET2sourcePrimeNode,HFET2gateNode); + TSTALLOC(HFET2sourcePriHFET2ourcePtr,HFET2sourcePrimeNode,HFET2sourceNode); + TSTALLOC(HFET2sourcePrimeDrainPrimePtr,HFET2sourcePrimeNode,HFET2drainPrimeNode); + TSTALLOC(HFET2drainDrainPtr,HFET2drainNode,HFET2drainNode); + TSTALLOC(HFET2gateGatePtr,HFET2gateNode,HFET2gateNode); + TSTALLOC(HFET2sourceSourcePtr,HFET2sourceNode,HFET2sourceNode); + TSTALLOC(HFET2drainPrimeDrainPrimePtr,HFET2drainPrimeNode,HFET2drainPrimeNode); + TSTALLOC(HFET2sourcePriHFET2ourcePrimePtr,HFET2sourcePrimeNode,HFET2sourcePrimeNode); } } diff --git a/src/spicelib/devices/hisim2/hsm2set.c b/src/spicelib/devices/hisim2/hsm2set.c index 305b18105..7b7412a5c 100644 --- a/src/spicelib/devices/hisim2/hsm2set.c +++ b/src/spicelib/devices/hisim2/hsm2set.c @@ -774,33 +774,33 @@ int HSM2setup( /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ +do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(HSM2DPbpPtr, HSM2dNodePrime, HSM2bNodePrime) - TSTALLOC(HSM2SPbpPtr, HSM2sNodePrime, HSM2bNodePrime) - TSTALLOC(HSM2GPbpPtr, HSM2gNodePrime, HSM2bNodePrime) + TSTALLOC(HSM2DPbpPtr, HSM2dNodePrime, HSM2bNodePrime); + TSTALLOC(HSM2SPbpPtr, HSM2sNodePrime, HSM2bNodePrime); + TSTALLOC(HSM2GPbpPtr, HSM2gNodePrime, HSM2bNodePrime); - TSTALLOC(HSM2BPdpPtr, HSM2bNodePrime, HSM2dNodePrime) - TSTALLOC(HSM2BPspPtr, HSM2bNodePrime, HSM2sNodePrime) - TSTALLOC(HSM2BPgpPtr, HSM2bNodePrime, HSM2gNodePrime) - TSTALLOC(HSM2BPbpPtr, HSM2bNodePrime, HSM2bNodePrime) + TSTALLOC(HSM2BPdpPtr, HSM2bNodePrime, HSM2dNodePrime); + TSTALLOC(HSM2BPspPtr, HSM2bNodePrime, HSM2sNodePrime); + TSTALLOC(HSM2BPgpPtr, HSM2bNodePrime, HSM2gNodePrime); + TSTALLOC(HSM2BPbpPtr, HSM2bNodePrime, HSM2bNodePrime); - TSTALLOC(HSM2DdPtr, HSM2dNode, HSM2dNode) - TSTALLOC(HSM2GPgpPtr, HSM2gNodePrime, HSM2gNodePrime) - TSTALLOC(HSM2SsPtr, HSM2sNode, HSM2sNode) - TSTALLOC(HSM2DPdpPtr, HSM2dNodePrime, HSM2dNodePrime) - TSTALLOC(HSM2SPspPtr, HSM2sNodePrime, HSM2sNodePrime) - TSTALLOC(HSM2DdpPtr, HSM2dNode, HSM2dNodePrime) - TSTALLOC(HSM2GPdpPtr, HSM2gNodePrime, HSM2dNodePrime) - TSTALLOC(HSM2GPspPtr, HSM2gNodePrime, HSM2sNodePrime) - TSTALLOC(HSM2SspPtr, HSM2sNode, HSM2sNodePrime) - TSTALLOC(HSM2DPspPtr, HSM2dNodePrime, HSM2sNodePrime) - TSTALLOC(HSM2DPdPtr, HSM2dNodePrime, HSM2dNode) - TSTALLOC(HSM2DPgpPtr, HSM2dNodePrime, HSM2gNodePrime) - TSTALLOC(HSM2SPgpPtr, HSM2sNodePrime, HSM2gNodePrime) - TSTALLOC(HSM2SPsPtr, HSM2sNodePrime, HSM2sNode) + TSTALLOC(HSM2DdPtr, HSM2dNode, HSM2dNode); + TSTALLOC(HSM2GPgpPtr, HSM2gNodePrime, HSM2gNodePrime); + TSTALLOC(HSM2SsPtr, HSM2sNode, HSM2sNode); + TSTALLOC(HSM2DPdpPtr, HSM2dNodePrime, HSM2dNodePrime); + TSTALLOC(HSM2SPspPtr, HSM2sNodePrime, HSM2sNodePrime); + TSTALLOC(HSM2DdpPtr, HSM2dNode, HSM2dNodePrime); + TSTALLOC(HSM2GPdpPtr, HSM2gNodePrime, HSM2dNodePrime); + TSTALLOC(HSM2GPspPtr, HSM2gNodePrime, HSM2sNodePrime); + TSTALLOC(HSM2SspPtr, HSM2sNode, HSM2sNodePrime); + TSTALLOC(HSM2DPspPtr, HSM2dNodePrime, HSM2sNodePrime); + TSTALLOC(HSM2DPdPtr, HSM2dNodePrime, HSM2dNode); + TSTALLOC(HSM2DPgpPtr, HSM2dNodePrime, HSM2gNodePrime); + TSTALLOC(HSM2SPgpPtr, HSM2sNodePrime, HSM2gNodePrime); + TSTALLOC(HSM2SPsPtr, HSM2sNodePrime, HSM2sNode); TSTALLOC(HSM2SPdpPtr, HSM2sNodePrime, HSM2dNodePrime); if ( here->HSM2_corg == 1 ) { diff --git a/src/spicelib/devices/hisimhv1/hsmhvset.c b/src/spicelib/devices/hisimhv1/hsmhvset.c index 12b000329..a3bd0db4e 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvset.c +++ b/src/spicelib/devices/hisimhv1/hsmhvset.c @@ -938,35 +938,35 @@ int HSMHVsetup( /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ +do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(HSMHVDPbpPtr, HSMHVdNodePrime, HSMHVbNodePrime) - TSTALLOC(HSMHVSPbpPtr, HSMHVsNodePrime, HSMHVbNodePrime) - TSTALLOC(HSMHVGPbpPtr, HSMHVgNodePrime, HSMHVbNodePrime) + TSTALLOC(HSMHVDPbpPtr, HSMHVdNodePrime, HSMHVbNodePrime); + TSTALLOC(HSMHVSPbpPtr, HSMHVsNodePrime, HSMHVbNodePrime); + TSTALLOC(HSMHVGPbpPtr, HSMHVgNodePrime, HSMHVbNodePrime); - TSTALLOC(HSMHVBPdPtr, HSMHVbNodePrime, HSMHVdNode) - TSTALLOC(HSMHVBPsPtr, HSMHVbNodePrime, HSMHVsNode) - TSTALLOC(HSMHVBPdpPtr, HSMHVbNodePrime, HSMHVdNodePrime) - TSTALLOC(HSMHVBPspPtr, HSMHVbNodePrime, HSMHVsNodePrime) - TSTALLOC(HSMHVBPgpPtr, HSMHVbNodePrime, HSMHVgNodePrime) - TSTALLOC(HSMHVBPbpPtr, HSMHVbNodePrime, HSMHVbNodePrime) + TSTALLOC(HSMHVBPdPtr, HSMHVbNodePrime, HSMHVdNode); + TSTALLOC(HSMHVBPsPtr, HSMHVbNodePrime, HSMHVsNode); + TSTALLOC(HSMHVBPdpPtr, HSMHVbNodePrime, HSMHVdNodePrime); + TSTALLOC(HSMHVBPspPtr, HSMHVbNodePrime, HSMHVsNodePrime); + TSTALLOC(HSMHVBPgpPtr, HSMHVbNodePrime, HSMHVgNodePrime); + TSTALLOC(HSMHVBPbpPtr, HSMHVbNodePrime, HSMHVbNodePrime); - TSTALLOC(HSMHVDdPtr, HSMHVdNode, HSMHVdNode) - TSTALLOC(HSMHVGPgpPtr, HSMHVgNodePrime, HSMHVgNodePrime) - TSTALLOC(HSMHVSsPtr, HSMHVsNode, HSMHVsNode) - TSTALLOC(HSMHVDPdpPtr, HSMHVdNodePrime, HSMHVdNodePrime) - TSTALLOC(HSMHVSPspPtr, HSMHVsNodePrime, HSMHVsNodePrime) - TSTALLOC(HSMHVDdpPtr, HSMHVdNode, HSMHVdNodePrime) - TSTALLOC(HSMHVGPdpPtr, HSMHVgNodePrime, HSMHVdNodePrime) - TSTALLOC(HSMHVGPspPtr, HSMHVgNodePrime, HSMHVsNodePrime) - TSTALLOC(HSMHVSspPtr, HSMHVsNode, HSMHVsNodePrime) - TSTALLOC(HSMHVDPspPtr, HSMHVdNodePrime, HSMHVsNodePrime) - TSTALLOC(HSMHVDPdPtr, HSMHVdNodePrime, HSMHVdNode) - TSTALLOC(HSMHVDPgpPtr, HSMHVdNodePrime, HSMHVgNodePrime) - TSTALLOC(HSMHVSPgpPtr, HSMHVsNodePrime, HSMHVgNodePrime) - TSTALLOC(HSMHVSPsPtr, HSMHVsNodePrime, HSMHVsNode) + TSTALLOC(HSMHVDdPtr, HSMHVdNode, HSMHVdNode); + TSTALLOC(HSMHVGPgpPtr, HSMHVgNodePrime, HSMHVgNodePrime); + TSTALLOC(HSMHVSsPtr, HSMHVsNode, HSMHVsNode); + TSTALLOC(HSMHVDPdpPtr, HSMHVdNodePrime, HSMHVdNodePrime); + TSTALLOC(HSMHVSPspPtr, HSMHVsNodePrime, HSMHVsNodePrime); + TSTALLOC(HSMHVDdpPtr, HSMHVdNode, HSMHVdNodePrime); + TSTALLOC(HSMHVGPdpPtr, HSMHVgNodePrime, HSMHVdNodePrime); + TSTALLOC(HSMHVGPspPtr, HSMHVgNodePrime, HSMHVsNodePrime); + TSTALLOC(HSMHVSspPtr, HSMHVsNode, HSMHVsNodePrime); + TSTALLOC(HSMHVDPspPtr, HSMHVdNodePrime, HSMHVsNodePrime); + TSTALLOC(HSMHVDPdPtr, HSMHVdNodePrime, HSMHVdNode); + TSTALLOC(HSMHVDPgpPtr, HSMHVdNodePrime, HSMHVgNodePrime); + TSTALLOC(HSMHVSPgpPtr, HSMHVsNodePrime, HSMHVgNodePrime); + TSTALLOC(HSMHVSPsPtr, HSMHVsNodePrime, HSMHVsNode); TSTALLOC(HSMHVSPdpPtr, HSMHVsNodePrime, HSMHVdNodePrime); TSTALLOC(HSMHVGgPtr, HSMHVgNode, HSMHVgNode); @@ -1019,44 +1019,44 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ TSTALLOC(HSMHVSPsubPtr, HSMHVsNodePrime, HSMHVsubNode); } if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ - TSTALLOC(HSMHVTemptempPtr, HSMHVtempNode, HSMHVtempNode) - TSTALLOC(HSMHVTempdPtr, HSMHVtempNode, HSMHVdNode) - TSTALLOC(HSMHVTempdpPtr, HSMHVtempNode, HSMHVdNodePrime) - TSTALLOC(HSMHVTempsPtr, HSMHVtempNode, HSMHVsNode) - TSTALLOC(HSMHVTempspPtr, HSMHVtempNode, HSMHVsNodePrime) - TSTALLOC(HSMHVDPtempPtr, HSMHVdNodePrime, HSMHVtempNode) - TSTALLOC(HSMHVSPtempPtr, HSMHVsNodePrime, HSMHVtempNode) + TSTALLOC(HSMHVTemptempPtr, HSMHVtempNode, HSMHVtempNode); + TSTALLOC(HSMHVTempdPtr, HSMHVtempNode, HSMHVdNode); + TSTALLOC(HSMHVTempdpPtr, HSMHVtempNode, HSMHVdNodePrime); + TSTALLOC(HSMHVTempsPtr, HSMHVtempNode, HSMHVsNode); + TSTALLOC(HSMHVTempspPtr, HSMHVtempNode, HSMHVsNodePrime); + TSTALLOC(HSMHVDPtempPtr, HSMHVdNodePrime, HSMHVtempNode); + TSTALLOC(HSMHVSPtempPtr, HSMHVsNodePrime, HSMHVtempNode); - TSTALLOC(HSMHVTempgpPtr, HSMHVtempNode, HSMHVgNodePrime) - TSTALLOC(HSMHVTempbpPtr, HSMHVtempNode, HSMHVbNodePrime) + TSTALLOC(HSMHVTempgpPtr, HSMHVtempNode, HSMHVgNodePrime); + TSTALLOC(HSMHVTempbpPtr, HSMHVtempNode, HSMHVbNodePrime); - TSTALLOC(HSMHVGPtempPtr, HSMHVgNodePrime, HSMHVtempNode) - TSTALLOC(HSMHVBPtempPtr, HSMHVbNodePrime, HSMHVtempNode) + TSTALLOC(HSMHVGPtempPtr, HSMHVgNodePrime, HSMHVtempNode); + TSTALLOC(HSMHVBPtempPtr, HSMHVbNodePrime, HSMHVtempNode); - TSTALLOC(HSMHVDBtempPtr, HSMHVdbNode, HSMHVtempNode) - TSTALLOC(HSMHVSBtempPtr, HSMHVsbNode, HSMHVtempNode) + TSTALLOC(HSMHVDBtempPtr, HSMHVdbNode, HSMHVtempNode); + TSTALLOC(HSMHVSBtempPtr, HSMHVsbNode, HSMHVtempNode); TSTALLOC(HSMHVDtempPtr, HSMHVdNode, HSMHVtempNode); TSTALLOC(HSMHVStempPtr, HSMHVsNode, HSMHVtempNode); } if ( model->HSMHV_conqs ) { /* flat handling of NQS */ - TSTALLOC(HSMHVDPqiPtr, HSMHVdNodePrime, HSMHVqiNode) - TSTALLOC(HSMHVGPqiPtr, HSMHVgNodePrime, HSMHVqiNode) - TSTALLOC(HSMHVGPqbPtr, HSMHVgNodePrime, HSMHVqbNode) - TSTALLOC(HSMHVSPqiPtr, HSMHVsNodePrime, HSMHVqiNode) - TSTALLOC(HSMHVBPqbPtr, HSMHVbNodePrime, HSMHVqbNode) - TSTALLOC(HSMHVQIdpPtr, HSMHVqiNode, HSMHVdNodePrime) - TSTALLOC(HSMHVQIgpPtr, HSMHVqiNode, HSMHVgNodePrime) - TSTALLOC(HSMHVQIspPtr, HSMHVqiNode, HSMHVsNodePrime) - TSTALLOC(HSMHVQIbpPtr, HSMHVqiNode, HSMHVbNodePrime) - TSTALLOC(HSMHVQIqiPtr, HSMHVqiNode, HSMHVqiNode) - TSTALLOC(HSMHVQBdpPtr, HSMHVqbNode, HSMHVdNodePrime) - TSTALLOC(HSMHVQBgpPtr, HSMHVqbNode, HSMHVgNodePrime) - TSTALLOC(HSMHVQBspPtr, HSMHVqbNode, HSMHVsNodePrime) - TSTALLOC(HSMHVQBbpPtr, HSMHVqbNode, HSMHVbNodePrime) - TSTALLOC(HSMHVQBqbPtr, HSMHVqbNode, HSMHVqbNode) + TSTALLOC(HSMHVDPqiPtr, HSMHVdNodePrime, HSMHVqiNode); + TSTALLOC(HSMHVGPqiPtr, HSMHVgNodePrime, HSMHVqiNode); + TSTALLOC(HSMHVGPqbPtr, HSMHVgNodePrime, HSMHVqbNode); + TSTALLOC(HSMHVSPqiPtr, HSMHVsNodePrime, HSMHVqiNode); + TSTALLOC(HSMHVBPqbPtr, HSMHVbNodePrime, HSMHVqbNode); + TSTALLOC(HSMHVQIdpPtr, HSMHVqiNode, HSMHVdNodePrime); + TSTALLOC(HSMHVQIgpPtr, HSMHVqiNode, HSMHVgNodePrime); + TSTALLOC(HSMHVQIspPtr, HSMHVqiNode, HSMHVsNodePrime); + TSTALLOC(HSMHVQIbpPtr, HSMHVqiNode, HSMHVbNodePrime); + TSTALLOC(HSMHVQIqiPtr, HSMHVqiNode, HSMHVqiNode); + TSTALLOC(HSMHVQBdpPtr, HSMHVqbNode, HSMHVdNodePrime); + TSTALLOC(HSMHVQBgpPtr, HSMHVqbNode, HSMHVgNodePrime); + TSTALLOC(HSMHVQBspPtr, HSMHVqbNode, HSMHVsNodePrime); + TSTALLOC(HSMHVQBbpPtr, HSMHVqbNode, HSMHVbNodePrime); + TSTALLOC(HSMHVQBqbPtr, HSMHVqbNode, HSMHVqbNode); if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ - TSTALLOC(HSMHVQItempPtr, HSMHVqiNode, HSMHVtempNode) - TSTALLOC(HSMHVQBtempPtr, HSMHVqbNode, HSMHVtempNode) + TSTALLOC(HSMHVQItempPtr, HSMHVqiNode, HSMHVtempNode); + TSTALLOC(HSMHVQBtempPtr, HSMHVqbNode, HSMHVtempNode); } } diff --git a/src/spicelib/devices/ind/indsetup.c b/src/spicelib/devices/ind/indsetup.c index d686adbe7..b42bb9fbe 100644 --- a/src/spicelib/devices/ind/indsetup.c +++ b/src/spicelib/devices/ind/indsetup.c @@ -89,15 +89,15 @@ INDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(INDposIbrptr,INDposNode,INDbrEq) - TSTALLOC(INDnegIbrptr,INDnegNode,INDbrEq) - TSTALLOC(INDibrNegptr,INDbrEq,INDnegNode) - TSTALLOC(INDibrPosptr,INDbrEq,INDposNode) - TSTALLOC(INDibrIbrptr,INDbrEq,INDbrEq) + TSTALLOC(INDposIbrptr,INDposNode,INDbrEq); + TSTALLOC(INDnegIbrptr,INDnegNode,INDbrEq); + TSTALLOC(INDibrNegptr,INDbrEq,INDnegNode); + TSTALLOC(INDibrPosptr,INDbrEq,INDposNode); + TSTALLOC(INDibrIbrptr,INDbrEq,INDbrEq); } } return(OK); diff --git a/src/spicelib/devices/ind/mutsetup.c b/src/spicelib/devices/ind/mutsetup.c index 096f8d5b4..fd19a3710 100644 --- a/src/spicelib/devices/ind/mutsetup.c +++ b/src/spicelib/devices/ind/mutsetup.c @@ -69,12 +69,12 @@ MUTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(MUTbr1br2,MUTind1->INDbrEq,MUTind2->INDbrEq) - TSTALLOC(MUTbr2br1,MUTind2->INDbrEq,MUTind1->INDbrEq) + TSTALLOC(MUTbr1br2,MUTind1->INDbrEq,MUTind2->INDbrEq); + TSTALLOC(MUTbr2br1,MUTind2->INDbrEq,MUTind1->INDbrEq); } } return(OK); diff --git a/src/spicelib/devices/jfet/jfetset.c b/src/spicelib/devices/jfet/jfetset.c index 4bcf17d70..026595d85 100644 --- a/src/spicelib/devices/jfet/jfetset.c +++ b/src/spicelib/devices/jfet/jfetset.c @@ -159,25 +159,25 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(JFETdrainDrainPrimePtr,JFETdrainNode,JFETdrainPrimeNode) - TSTALLOC(JFETgateDrainPrimePtr,JFETgateNode,JFETdrainPrimeNode) - TSTALLOC(JFETgateSourcePrimePtr,JFETgateNode,JFETsourcePrimeNode) - TSTALLOC(JFETsourceSourcePrimePtr,JFETsourceNode,JFETsourcePrimeNode) - TSTALLOC(JFETdrainPrimeDrainPtr,JFETdrainPrimeNode,JFETdrainNode) - TSTALLOC(JFETdrainPrimeGatePtr,JFETdrainPrimeNode,JFETgateNode) - TSTALLOC(JFETdrainPrimeSourcePrimePtr,JFETdrainPrimeNode,JFETsourcePrimeNode) - TSTALLOC(JFETsourcePrimeGatePtr,JFETsourcePrimeNode,JFETgateNode) - TSTALLOC(JFETsourcePrimeSourcePtr,JFETsourcePrimeNode,JFETsourceNode) - TSTALLOC(JFETsourcePrimeDrainPrimePtr,JFETsourcePrimeNode,JFETdrainPrimeNode) - TSTALLOC(JFETdrainDrainPtr,JFETdrainNode,JFETdrainNode) - TSTALLOC(JFETgateGatePtr,JFETgateNode,JFETgateNode) - TSTALLOC(JFETsourceSourcePtr,JFETsourceNode,JFETsourceNode) - TSTALLOC(JFETdrainPrimeDrainPrimePtr,JFETdrainPrimeNode,JFETdrainPrimeNode) - TSTALLOC(JFETsourcePrimeSourcePrimePtr,JFETsourcePrimeNode,JFETsourcePrimeNode) + TSTALLOC(JFETdrainDrainPrimePtr,JFETdrainNode,JFETdrainPrimeNode); + TSTALLOC(JFETgateDrainPrimePtr,JFETgateNode,JFETdrainPrimeNode); + TSTALLOC(JFETgateSourcePrimePtr,JFETgateNode,JFETsourcePrimeNode); + TSTALLOC(JFETsourceSourcePrimePtr,JFETsourceNode,JFETsourcePrimeNode); + TSTALLOC(JFETdrainPrimeDrainPtr,JFETdrainPrimeNode,JFETdrainNode); + TSTALLOC(JFETdrainPrimeGatePtr,JFETdrainPrimeNode,JFETgateNode); + TSTALLOC(JFETdrainPrimeSourcePrimePtr,JFETdrainPrimeNode,JFETsourcePrimeNode); + TSTALLOC(JFETsourcePrimeGatePtr,JFETsourcePrimeNode,JFETgateNode); + TSTALLOC(JFETsourcePrimeSourcePtr,JFETsourcePrimeNode,JFETsourceNode); + TSTALLOC(JFETsourcePrimeDrainPrimePtr,JFETsourcePrimeNode,JFETdrainPrimeNode); + TSTALLOC(JFETdrainDrainPtr,JFETdrainNode,JFETdrainNode); + TSTALLOC(JFETgateGatePtr,JFETgateNode,JFETgateNode); + TSTALLOC(JFETsourceSourcePtr,JFETsourceNode,JFETsourceNode); + TSTALLOC(JFETdrainPrimeDrainPrimePtr,JFETdrainPrimeNode,JFETdrainPrimeNode); + TSTALLOC(JFETsourcePrimeSourcePrimePtr,JFETsourcePrimeNode,JFETsourcePrimeNode); } } return(OK); diff --git a/src/spicelib/devices/jfet2/jfet2set.c b/src/spicelib/devices/jfet2/jfet2set.c index af6964496..ece5ef269 100644 --- a/src/spicelib/devices/jfet2/jfet2set.c +++ b/src/spicelib/devices/jfet2/jfet2set.c @@ -99,25 +99,25 @@ JFET2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(JFET2drainDrainPrimePtr,JFET2drainNode,JFET2drainPrimeNode) - TSTALLOC(JFET2gateDrainPrimePtr,JFET2gateNode,JFET2drainPrimeNode) - TSTALLOC(JFET2gateSourcePrimePtr,JFET2gateNode,JFET2sourcePrimeNode) - TSTALLOC(JFET2sourceSourcePrimePtr,JFET2sourceNode,JFET2sourcePrimeNode) - TSTALLOC(JFET2drainPrimeDrainPtr,JFET2drainPrimeNode,JFET2drainNode) - TSTALLOC(JFET2drainPrimeGatePtr,JFET2drainPrimeNode,JFET2gateNode) - TSTALLOC(JFET2drainPrimeSourcePrimePtr,JFET2drainPrimeNode,JFET2sourcePrimeNode) - TSTALLOC(JFET2sourcePrimeGatePtr,JFET2sourcePrimeNode,JFET2gateNode) - TSTALLOC(JFET2sourcePrimeSourcePtr,JFET2sourcePrimeNode,JFET2sourceNode) - TSTALLOC(JFET2sourcePrimeDrainPrimePtr,JFET2sourcePrimeNode,JFET2drainPrimeNode) - TSTALLOC(JFET2drainDrainPtr,JFET2drainNode,JFET2drainNode) - TSTALLOC(JFET2gateGatePtr,JFET2gateNode,JFET2gateNode) - TSTALLOC(JFET2sourceSourcePtr,JFET2sourceNode,JFET2sourceNode) - TSTALLOC(JFET2drainPrimeDrainPrimePtr,JFET2drainPrimeNode,JFET2drainPrimeNode) - TSTALLOC(JFET2sourcePrimeSourcePrimePtr,JFET2sourcePrimeNode,JFET2sourcePrimeNode) + TSTALLOC(JFET2drainDrainPrimePtr,JFET2drainNode,JFET2drainPrimeNode); + TSTALLOC(JFET2gateDrainPrimePtr,JFET2gateNode,JFET2drainPrimeNode); + TSTALLOC(JFET2gateSourcePrimePtr,JFET2gateNode,JFET2sourcePrimeNode); + TSTALLOC(JFET2sourceSourcePrimePtr,JFET2sourceNode,JFET2sourcePrimeNode); + TSTALLOC(JFET2drainPrimeDrainPtr,JFET2drainPrimeNode,JFET2drainNode); + TSTALLOC(JFET2drainPrimeGatePtr,JFET2drainPrimeNode,JFET2gateNode); + TSTALLOC(JFET2drainPrimeSourcePrimePtr,JFET2drainPrimeNode,JFET2sourcePrimeNode); + TSTALLOC(JFET2sourcePrimeGatePtr,JFET2sourcePrimeNode,JFET2gateNode); + TSTALLOC(JFET2sourcePrimeSourcePtr,JFET2sourcePrimeNode,JFET2sourceNode); + TSTALLOC(JFET2sourcePrimeDrainPrimePtr,JFET2sourcePrimeNode,JFET2drainPrimeNode); + TSTALLOC(JFET2drainDrainPtr,JFET2drainNode,JFET2drainNode); + TSTALLOC(JFET2gateGatePtr,JFET2gateNode,JFET2gateNode); + TSTALLOC(JFET2sourceSourcePtr,JFET2sourceNode,JFET2sourceNode); + TSTALLOC(JFET2drainPrimeDrainPrimePtr,JFET2drainPrimeNode,JFET2drainPrimeNode); + TSTALLOC(JFET2sourcePrimeSourcePrimePtr,JFET2sourcePrimeNode,JFET2sourcePrimeNode); } } return(OK); diff --git a/src/spicelib/devices/ltra/ltraset.c b/src/spicelib/devices/ltra/ltraset.c index 408a90dc5..273fc38ef 100644 --- a/src/spicelib/devices/ltra/ltraset.c +++ b/src/spicelib/devices/ltra/ltraset.c @@ -186,34 +186,34 @@ LTRAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state) } /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(LTRAibr1Pos1Ptr, LTRAbrEq1, LTRAposNode1) - TSTALLOC(LTRAibr1Neg1Ptr, LTRAbrEq1, LTRAnegNode1) - TSTALLOC(LTRAibr1Pos2Ptr, LTRAbrEq1, LTRAposNode2) - TSTALLOC(LTRAibr1Neg2Ptr, LTRAbrEq1, LTRAnegNode2) - TSTALLOC(LTRAibr1Ibr1Ptr, LTRAbrEq1, LTRAbrEq1) - TSTALLOC(LTRAibr1Ibr2Ptr, LTRAbrEq1, LTRAbrEq2) - TSTALLOC(LTRAibr2Pos1Ptr, LTRAbrEq2, LTRAposNode1) - TSTALLOC(LTRAibr2Neg1Ptr, LTRAbrEq2, LTRAnegNode1) - TSTALLOC(LTRAibr2Pos2Ptr, LTRAbrEq2, LTRAposNode2) - TSTALLOC(LTRAibr2Neg2Ptr, LTRAbrEq2, LTRAnegNode2) - TSTALLOC(LTRAibr2Ibr1Ptr, LTRAbrEq2, LTRAbrEq1) - TSTALLOC(LTRAibr2Ibr2Ptr, LTRAbrEq2, LTRAbrEq2) - TSTALLOC(LTRApos1Ibr1Ptr, LTRAposNode1, LTRAbrEq1) - TSTALLOC(LTRAneg1Ibr1Ptr, LTRAnegNode1, LTRAbrEq1) - TSTALLOC(LTRApos2Ibr2Ptr, LTRAposNode2, LTRAbrEq2) - TSTALLOC(LTRAneg2Ibr2Ptr, LTRAnegNode2, LTRAbrEq2) + TSTALLOC(LTRAibr1Pos1Ptr, LTRAbrEq1, LTRAposNode1); + TSTALLOC(LTRAibr1Neg1Ptr, LTRAbrEq1, LTRAnegNode1); + TSTALLOC(LTRAibr1Pos2Ptr, LTRAbrEq1, LTRAposNode2); + TSTALLOC(LTRAibr1Neg2Ptr, LTRAbrEq1, LTRAnegNode2); + TSTALLOC(LTRAibr1Ibr1Ptr, LTRAbrEq1, LTRAbrEq1); + TSTALLOC(LTRAibr1Ibr2Ptr, LTRAbrEq1, LTRAbrEq2); + TSTALLOC(LTRAibr2Pos1Ptr, LTRAbrEq2, LTRAposNode1); + TSTALLOC(LTRAibr2Neg1Ptr, LTRAbrEq2, LTRAnegNode1); + TSTALLOC(LTRAibr2Pos2Ptr, LTRAbrEq2, LTRAposNode2); + TSTALLOC(LTRAibr2Neg2Ptr, LTRAbrEq2, LTRAnegNode2); + TSTALLOC(LTRAibr2Ibr1Ptr, LTRAbrEq2, LTRAbrEq1); + TSTALLOC(LTRAibr2Ibr2Ptr, LTRAbrEq2, LTRAbrEq2); + TSTALLOC(LTRApos1Ibr1Ptr, LTRAposNode1, LTRAbrEq1); + TSTALLOC(LTRAneg1Ibr1Ptr, LTRAnegNode1, LTRAbrEq1); + TSTALLOC(LTRApos2Ibr2Ptr, LTRAposNode2, LTRAbrEq2); + TSTALLOC(LTRAneg2Ibr2Ptr, LTRAnegNode2, LTRAbrEq2); /* * the following are done so that SMPpreOrder does not screw up on * occasion - for example, when one end of the lossy line is hanging */ - TSTALLOC(LTRApos1Pos1Ptr, LTRAposNode1, LTRAposNode1) - TSTALLOC(LTRAneg1Neg1Ptr, LTRAnegNode1, LTRAnegNode1) - TSTALLOC(LTRApos2Pos2Ptr, LTRAposNode2, LTRAposNode2) - TSTALLOC(LTRAneg2Neg2Ptr, LTRAnegNode2, LTRAnegNode2) + TSTALLOC(LTRApos1Pos1Ptr, LTRAposNode1, LTRAposNode1); + TSTALLOC(LTRAneg1Neg1Ptr, LTRAnegNode1, LTRAnegNode1); + TSTALLOC(LTRApos2Pos2Ptr, LTRAposNode2, LTRAposNode2); + TSTALLOC(LTRAneg2Neg2Ptr, LTRAnegNode2, LTRAnegNode2); } } return (OK); diff --git a/src/spicelib/devices/mes/messetup.c b/src/spicelib/devices/mes/messetup.c index 129b93da6..a65449159 100644 --- a/src/spicelib/devices/mes/messetup.c +++ b/src/spicelib/devices/mes/messetup.c @@ -132,25 +132,25 @@ MESsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(MESdrainDrainPrimePtr,MESdrainNode,MESdrainPrimeNode) - TSTALLOC(MESgateDrainPrimePtr,MESgateNode,MESdrainPrimeNode) - TSTALLOC(MESgateSourcePrimePtr,MESgateNode,MESsourcePrimeNode) - TSTALLOC(MESsourceSourcePrimePtr,MESsourceNode,MESsourcePrimeNode) - TSTALLOC(MESdrainPrimeDrainPtr,MESdrainPrimeNode,MESdrainNode) - TSTALLOC(MESdrainPrimeGatePtr,MESdrainPrimeNode,MESgateNode) - TSTALLOC(MESdrainPrimeSourcePrimePtr,MESdrainPrimeNode,MESsourcePrimeNode) - TSTALLOC(MESsourcePrimeGatePtr,MESsourcePrimeNode,MESgateNode) - TSTALLOC(MESsourcePrimeSourcePtr,MESsourcePrimeNode,MESsourceNode) - TSTALLOC(MESsourcePrimeDrainPrimePtr,MESsourcePrimeNode,MESdrainPrimeNode) - TSTALLOC(MESdrainDrainPtr,MESdrainNode,MESdrainNode) - TSTALLOC(MESgateGatePtr,MESgateNode,MESgateNode) - TSTALLOC(MESsourceSourcePtr,MESsourceNode,MESsourceNode) - TSTALLOC(MESdrainPrimeDrainPrimePtr,MESdrainPrimeNode,MESdrainPrimeNode) - TSTALLOC(MESsourcePrimeSourcePrimePtr,MESsourcePrimeNode,MESsourcePrimeNode) + TSTALLOC(MESdrainDrainPrimePtr,MESdrainNode,MESdrainPrimeNode); + TSTALLOC(MESgateDrainPrimePtr,MESgateNode,MESdrainPrimeNode); + TSTALLOC(MESgateSourcePrimePtr,MESgateNode,MESsourcePrimeNode); + TSTALLOC(MESsourceSourcePrimePtr,MESsourceNode,MESsourcePrimeNode); + TSTALLOC(MESdrainPrimeDrainPtr,MESdrainPrimeNode,MESdrainNode); + TSTALLOC(MESdrainPrimeGatePtr,MESdrainPrimeNode,MESgateNode); + TSTALLOC(MESdrainPrimeSourcePrimePtr,MESdrainPrimeNode,MESsourcePrimeNode); + TSTALLOC(MESsourcePrimeGatePtr,MESsourcePrimeNode,MESgateNode); + TSTALLOC(MESsourcePrimeSourcePtr,MESsourcePrimeNode,MESsourceNode); + TSTALLOC(MESsourcePrimeDrainPrimePtr,MESsourcePrimeNode,MESdrainPrimeNode); + TSTALLOC(MESdrainDrainPtr,MESdrainNode,MESdrainNode); + TSTALLOC(MESgateGatePtr,MESgateNode,MESgateNode); + TSTALLOC(MESsourceSourcePtr,MESsourceNode,MESsourceNode); + TSTALLOC(MESdrainPrimeDrainPrimePtr,MESdrainPrimeNode,MESdrainPrimeNode); + TSTALLOC(MESsourcePrimeSourcePrimePtr,MESsourcePrimeNode,MESsourcePrimeNode); } } return(OK); diff --git a/src/spicelib/devices/mesa/mesasetup.c b/src/spicelib/devices/mesa/mesasetup.c index c13cdf4eb..ed775721c 100644 --- a/src/spicelib/devices/mesa/mesasetup.c +++ b/src/spicelib/devices/mesa/mesasetup.c @@ -369,38 +369,38 @@ MESAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) } #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(MESAdrainDrainPtr,MESAdrainNode,MESAdrainNode) - TSTALLOC(MESAdrainPrimeDrainPrimePtr,MESAdrainPrimeNode,MESAdrainPrimeNode) - TSTALLOC(MESAdrainPrmPrmDrainPrmPrmPtr,MESAdrainPrmPrmNode,MESAdrainPrmPrmNode) - TSTALLOC(MESAgateGatePtr,MESAgateNode,MESAgateNode) - TSTALLOC(MESAgatePrimeGatePrimePtr,MESAgatePrimeNode,MESAgatePrimeNode) - TSTALLOC(MESAsourceSourcePtr,MESAsourceNode,MESAsourceNode) - TSTALLOC(MESAsourcePrimeSourcePrimePtr,MESAsourcePrimeNode,MESAsourcePrimeNode) - TSTALLOC(MESAsourcePrmPrmSourcePrmPrmPtr,MESAsourcePrmPrmNode,MESAsourcePrmPrmNode) - TSTALLOC(MESAdrainDrainPrimePtr,MESAdrainNode,MESAdrainPrimeNode) - TSTALLOC(MESAdrainPrimeDrainPtr,MESAdrainPrimeNode,MESAdrainNode) - TSTALLOC(MESAgatePrimeDrainPrimePtr,MESAgatePrimeNode,MESAdrainPrimeNode) - TSTALLOC(MESAdrainPrimeGatePrimePtr,MESAdrainPrimeNode,MESAgatePrimeNode) - TSTALLOC(MESAgatePrimeSourcePrimePtr,MESAgatePrimeNode,MESAsourcePrimeNode) - TSTALLOC(MESAsourcePrimeGatePrimePtr,MESAsourcePrimeNode,MESAgatePrimeNode) - TSTALLOC(MESAsourceSourcePrimePtr,MESAsourceNode,MESAsourcePrimeNode) - TSTALLOC(MESAsourcePrimeSourcePtr,MESAsourcePrimeNode,MESAsourceNode) - TSTALLOC(MESAdrainPrimeSourcePrimePtr,MESAdrainPrimeNode,MESAsourcePrimeNode) - TSTALLOC(MESAsourcePrimeDrainPrimePtr,MESAsourcePrimeNode,MESAdrainPrimeNode) - TSTALLOC(MESAgatePrimeGatePtr,MESAgatePrimeNode,MESAgateNode) - TSTALLOC(MESAgateGatePrimePtr,MESAgateNode,MESAgatePrimeNode) - TSTALLOC(MESAsourcePrmPrmSourcePrimePtr,MESAsourcePrmPrmNode,MESAsourcePrimeNode) - TSTALLOC(MESAsourcePrimeSourcePrmPrmPtr,MESAsourcePrimeNode,MESAsourcePrmPrmNode) - TSTALLOC(MESAsourcePrmPrmGatePrimePtr,MESAsourcePrmPrmNode,MESAgatePrimeNode) - TSTALLOC(MESAgatePrimeSourcePrmPrmPtr,MESAgatePrimeNode,MESAsourcePrmPrmNode) - TSTALLOC(MESAdrainPrmPrmDrainPrimePtr,MESAdrainPrmPrmNode,MESAdrainPrimeNode) - TSTALLOC(MESAdrainPrimeDrainPrmPrmPtr,MESAdrainPrimeNode,MESAdrainPrmPrmNode) - TSTALLOC(MESAdrainPrmPrmGatePrimePtr,MESAdrainPrmPrmNode,MESAgatePrimeNode) - TSTALLOC(MESAgatePrimeDrainPrmPrmPtr,MESAgatePrimeNode,MESAdrainPrmPrmNode) + TSTALLOC(MESAdrainDrainPtr,MESAdrainNode,MESAdrainNode); + TSTALLOC(MESAdrainPrimeDrainPrimePtr,MESAdrainPrimeNode,MESAdrainPrimeNode); + TSTALLOC(MESAdrainPrmPrmDrainPrmPrmPtr,MESAdrainPrmPrmNode,MESAdrainPrmPrmNode); + TSTALLOC(MESAgateGatePtr,MESAgateNode,MESAgateNode); + TSTALLOC(MESAgatePrimeGatePrimePtr,MESAgatePrimeNode,MESAgatePrimeNode); + TSTALLOC(MESAsourceSourcePtr,MESAsourceNode,MESAsourceNode); + TSTALLOC(MESAsourcePrimeSourcePrimePtr,MESAsourcePrimeNode,MESAsourcePrimeNode); + TSTALLOC(MESAsourcePrmPrmSourcePrmPrmPtr,MESAsourcePrmPrmNode,MESAsourcePrmPrmNode); + TSTALLOC(MESAdrainDrainPrimePtr,MESAdrainNode,MESAdrainPrimeNode); + TSTALLOC(MESAdrainPrimeDrainPtr,MESAdrainPrimeNode,MESAdrainNode); + TSTALLOC(MESAgatePrimeDrainPrimePtr,MESAgatePrimeNode,MESAdrainPrimeNode); + TSTALLOC(MESAdrainPrimeGatePrimePtr,MESAdrainPrimeNode,MESAgatePrimeNode); + TSTALLOC(MESAgatePrimeSourcePrimePtr,MESAgatePrimeNode,MESAsourcePrimeNode); + TSTALLOC(MESAsourcePrimeGatePrimePtr,MESAsourcePrimeNode,MESAgatePrimeNode) ; + TSTALLOC(MESAsourceSourcePrimePtr,MESAsourceNode,MESAsourcePrimeNode); + TSTALLOC(MESAsourcePrimeSourcePtr,MESAsourcePrimeNode,MESAsourceNode); + TSTALLOC(MESAdrainPrimeSourcePrimePtr,MESAdrainPrimeNode,MESAsourcePrimeNode); + TSTALLOC(MESAsourcePrimeDrainPrimePtr,MESAsourcePrimeNode,MESAdrainPrimeNode); + TSTALLOC(MESAgatePrimeGatePtr,MESAgatePrimeNode,MESAgateNode); + TSTALLOC(MESAgateGatePrimePtr,MESAgateNode,MESAgatePrimeNode); + TSTALLOC(MESAsourcePrmPrmSourcePrimePtr,MESAsourcePrmPrmNode,MESAsourcePrimeNode); + TSTALLOC(MESAsourcePrimeSourcePrmPrmPtr,MESAsourcePrimeNode,MESAsourcePrmPrmNode); + TSTALLOC(MESAsourcePrmPrmGatePrimePtr,MESAsourcePrmPrmNode,MESAgatePrimeNode); + TSTALLOC(MESAgatePrimeSourcePrmPrmPtr,MESAgatePrimeNode,MESAsourcePrmPrmNode); + TSTALLOC(MESAdrainPrmPrmDrainPrimePtr,MESAdrainPrmPrmNode,MESAdrainPrimeNode); + TSTALLOC(MESAdrainPrimeDrainPrmPrmPtr,MESAdrainPrimeNode,MESAdrainPrmPrmNode); + TSTALLOC(MESAdrainPrmPrmGatePrimePtr,MESAdrainPrmPrmNode,MESAgatePrimeNode); + TSTALLOC(MESAgatePrimeDrainPrmPrmPtr,MESAgatePrimeNode,MESAdrainPrmPrmNode); } } return(OK); diff --git a/src/spicelib/devices/mos1/mos1set.c b/src/spicelib/devices/mos1/mos1set.c index 32a4c37b9..521ff3fbf 100644 --- a/src/spicelib/devices/mos1/mos1set.c +++ b/src/spicelib/devices/mos1/mos1set.c @@ -180,31 +180,31 @@ MOS1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} - TSTALLOC(MOS1DdPtr,MOS1dNode,MOS1dNode) - TSTALLOC(MOS1GgPtr,MOS1gNode,MOS1gNode) - TSTALLOC(MOS1SsPtr,MOS1sNode,MOS1sNode) - TSTALLOC(MOS1BbPtr,MOS1bNode,MOS1bNode) - TSTALLOC(MOS1DPdpPtr,MOS1dNodePrime,MOS1dNodePrime) - TSTALLOC(MOS1SPspPtr,MOS1sNodePrime,MOS1sNodePrime) - TSTALLOC(MOS1DdpPtr,MOS1dNode,MOS1dNodePrime) - TSTALLOC(MOS1GbPtr,MOS1gNode,MOS1bNode) - TSTALLOC(MOS1GdpPtr,MOS1gNode,MOS1dNodePrime) - TSTALLOC(MOS1GspPtr,MOS1gNode,MOS1sNodePrime) - TSTALLOC(MOS1SspPtr,MOS1sNode,MOS1sNodePrime) - TSTALLOC(MOS1BdpPtr,MOS1bNode,MOS1dNodePrime) - TSTALLOC(MOS1BspPtr,MOS1bNode,MOS1sNodePrime) - TSTALLOC(MOS1DPspPtr,MOS1dNodePrime,MOS1sNodePrime) - TSTALLOC(MOS1DPdPtr,MOS1dNodePrime,MOS1dNode) - TSTALLOC(MOS1BgPtr,MOS1bNode,MOS1gNode) - TSTALLOC(MOS1DPgPtr,MOS1dNodePrime,MOS1gNode) - TSTALLOC(MOS1SPgPtr,MOS1sNodePrime,MOS1gNode) - TSTALLOC(MOS1SPsPtr,MOS1sNodePrime,MOS1sNode) - TSTALLOC(MOS1DPbPtr,MOS1dNodePrime,MOS1bNode) - TSTALLOC(MOS1SPbPtr,MOS1sNodePrime,MOS1bNode) - TSTALLOC(MOS1SPdpPtr,MOS1sNodePrime,MOS1dNodePrime) +} } while(0) + TSTALLOC(MOS1DdPtr,MOS1dNode,MOS1dNode); + TSTALLOC(MOS1GgPtr,MOS1gNode,MOS1gNode); + TSTALLOC(MOS1SsPtr,MOS1sNode,MOS1sNode); + TSTALLOC(MOS1BbPtr,MOS1bNode,MOS1bNode); + TSTALLOC(MOS1DPdpPtr,MOS1dNodePrime,MOS1dNodePrime); + TSTALLOC(MOS1SPspPtr,MOS1sNodePrime,MOS1sNodePrime); + TSTALLOC(MOS1DdpPtr,MOS1dNode,MOS1dNodePrime); + TSTALLOC(MOS1GbPtr,MOS1gNode,MOS1bNode); + TSTALLOC(MOS1GdpPtr,MOS1gNode,MOS1dNodePrime); + TSTALLOC(MOS1GspPtr,MOS1gNode,MOS1sNodePrime); + TSTALLOC(MOS1SspPtr,MOS1sNode,MOS1sNodePrime); + TSTALLOC(MOS1BdpPtr,MOS1bNode,MOS1dNodePrime); + TSTALLOC(MOS1BspPtr,MOS1bNode,MOS1sNodePrime); + TSTALLOC(MOS1DPspPtr,MOS1dNodePrime,MOS1sNodePrime); + TSTALLOC(MOS1DPdPtr,MOS1dNodePrime,MOS1dNode); + TSTALLOC(MOS1BgPtr,MOS1bNode,MOS1gNode); + TSTALLOC(MOS1DPgPtr,MOS1dNodePrime,MOS1gNode); + TSTALLOC(MOS1SPgPtr,MOS1sNodePrime,MOS1gNode); + TSTALLOC(MOS1SPsPtr,MOS1sNodePrime,MOS1sNode); + TSTALLOC(MOS1DPbPtr,MOS1dNodePrime,MOS1bNode); + TSTALLOC(MOS1SPbPtr,MOS1sNodePrime,MOS1bNode); + TSTALLOC(MOS1SPdpPtr,MOS1sNodePrime,MOS1dNodePrime); } } diff --git a/src/spicelib/devices/mos2/mos2set.c b/src/spicelib/devices/mos2/mos2set.c index 3bf2fb4ba..c86daaf37 100644 --- a/src/spicelib/devices/mos2/mos2set.c +++ b/src/spicelib/devices/mos2/mos2set.c @@ -202,32 +202,32 @@ MOS2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(MOS2DdPtr, MOS2dNode, MOS2dNode) - TSTALLOC(MOS2GgPtr, MOS2gNode, MOS2gNode) - TSTALLOC(MOS2SsPtr, MOS2sNode, MOS2sNode) - TSTALLOC(MOS2BbPtr, MOS2bNode, MOS2bNode) - TSTALLOC(MOS2DPdpPtr, MOS2dNodePrime, MOS2dNodePrime) - TSTALLOC(MOS2SPspPtr, MOS2sNodePrime, MOS2sNodePrime) - TSTALLOC(MOS2DdpPtr, MOS2dNode, MOS2dNodePrime) - TSTALLOC(MOS2GbPtr, MOS2gNode, MOS2bNode) - TSTALLOC(MOS2GdpPtr, MOS2gNode, MOS2dNodePrime) - TSTALLOC(MOS2GspPtr, MOS2gNode, MOS2sNodePrime) - TSTALLOC(MOS2SspPtr, MOS2sNode, MOS2sNodePrime) - TSTALLOC(MOS2BdpPtr, MOS2bNode, MOS2dNodePrime) - TSTALLOC(MOS2BspPtr, MOS2bNode, MOS2sNodePrime) - TSTALLOC(MOS2DPspPtr, MOS2dNodePrime, MOS2sNodePrime) - TSTALLOC(MOS2DPdPtr, MOS2dNodePrime, MOS2dNode) - TSTALLOC(MOS2BgPtr, MOS2bNode, MOS2gNode) - TSTALLOC(MOS2DPgPtr, MOS2dNodePrime, MOS2gNode) - TSTALLOC(MOS2SPgPtr, MOS2sNodePrime, MOS2gNode) - TSTALLOC(MOS2SPsPtr, MOS2sNodePrime, MOS2sNode) - TSTALLOC(MOS2DPbPtr, MOS2dNodePrime, MOS2bNode) - TSTALLOC(MOS2SPbPtr, MOS2sNodePrime, MOS2bNode) - TSTALLOC(MOS2SPdpPtr, MOS2sNodePrime, MOS2dNodePrime) + TSTALLOC(MOS2DdPtr, MOS2dNode, MOS2dNode); + TSTALLOC(MOS2GgPtr, MOS2gNode, MOS2gNode); + TSTALLOC(MOS2SsPtr, MOS2sNode, MOS2sNode); + TSTALLOC(MOS2BbPtr, MOS2bNode, MOS2bNode); + TSTALLOC(MOS2DPdpPtr, MOS2dNodePrime, MOS2dNodePrime); + TSTALLOC(MOS2SPspPtr, MOS2sNodePrime, MOS2sNodePrime); + TSTALLOC(MOS2DdpPtr, MOS2dNode, MOS2dNodePrime); + TSTALLOC(MOS2GbPtr, MOS2gNode, MOS2bNode); + TSTALLOC(MOS2GdpPtr, MOS2gNode, MOS2dNodePrime); + TSTALLOC(MOS2GspPtr, MOS2gNode, MOS2sNodePrime); + TSTALLOC(MOS2SspPtr, MOS2sNode, MOS2sNodePrime); + TSTALLOC(MOS2BdpPtr, MOS2bNode, MOS2dNodePrime); + TSTALLOC(MOS2BspPtr, MOS2bNode, MOS2sNodePrime); + TSTALLOC(MOS2DPspPtr, MOS2dNodePrime, MOS2sNodePrime); + TSTALLOC(MOS2DPdPtr, MOS2dNodePrime, MOS2dNode); + TSTALLOC(MOS2BgPtr, MOS2bNode, MOS2gNode); + TSTALLOC(MOS2DPgPtr, MOS2dNodePrime, MOS2gNode); + TSTALLOC(MOS2SPgPtr, MOS2sNodePrime, MOS2gNode); + TSTALLOC(MOS2SPsPtr, MOS2sNodePrime, MOS2sNode); + TSTALLOC(MOS2DPbPtr, MOS2dNodePrime, MOS2bNode); + TSTALLOC(MOS2SPbPtr, MOS2sNodePrime, MOS2bNode); + TSTALLOC(MOS2SPdpPtr, MOS2sNodePrime, MOS2dNodePrime); } } diff --git a/src/spicelib/devices/mos3/mos3set.c b/src/spicelib/devices/mos3/mos3set.c index 334160723..5ff4ca879 100644 --- a/src/spicelib/devices/mos3/mos3set.c +++ b/src/spicelib/devices/mos3/mos3set.c @@ -227,32 +227,32 @@ MOS3setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(MOS3DdPtr, MOS3dNode, MOS3dNode) - TSTALLOC(MOS3GgPtr, MOS3gNode, MOS3gNode) - TSTALLOC(MOS3SsPtr, MOS3sNode, MOS3sNode) - TSTALLOC(MOS3BbPtr, MOS3bNode, MOS3bNode) - TSTALLOC(MOS3DPdpPtr, MOS3dNodePrime, MOS3dNodePrime) - TSTALLOC(MOS3SPspPtr, MOS3sNodePrime, MOS3sNodePrime) - TSTALLOC(MOS3DdpPtr, MOS3dNode, MOS3dNodePrime) - TSTALLOC(MOS3GbPtr, MOS3gNode, MOS3bNode) - TSTALLOC(MOS3GdpPtr, MOS3gNode, MOS3dNodePrime) - TSTALLOC(MOS3GspPtr, MOS3gNode, MOS3sNodePrime) - TSTALLOC(MOS3SspPtr, MOS3sNode, MOS3sNodePrime) - TSTALLOC(MOS3BdpPtr, MOS3bNode, MOS3dNodePrime) - TSTALLOC(MOS3BspPtr, MOS3bNode, MOS3sNodePrime) - TSTALLOC(MOS3DPspPtr, MOS3dNodePrime, MOS3sNodePrime) - TSTALLOC(MOS3DPdPtr, MOS3dNodePrime, MOS3dNode) - TSTALLOC(MOS3BgPtr, MOS3bNode, MOS3gNode) - TSTALLOC(MOS3DPgPtr, MOS3dNodePrime, MOS3gNode) - TSTALLOC(MOS3SPgPtr, MOS3sNodePrime, MOS3gNode) - TSTALLOC(MOS3SPsPtr, MOS3sNodePrime, MOS3sNode) - TSTALLOC(MOS3DPbPtr, MOS3dNodePrime, MOS3bNode) - TSTALLOC(MOS3SPbPtr, MOS3sNodePrime, MOS3bNode) - TSTALLOC(MOS3SPdpPtr, MOS3sNodePrime, MOS3dNodePrime) + TSTALLOC(MOS3DdPtr, MOS3dNode, MOS3dNode); + TSTALLOC(MOS3GgPtr, MOS3gNode, MOS3gNode); + TSTALLOC(MOS3SsPtr, MOS3sNode, MOS3sNode); + TSTALLOC(MOS3BbPtr, MOS3bNode, MOS3bNode); + TSTALLOC(MOS3DPdpPtr, MOS3dNodePrime, MOS3dNodePrime); + TSTALLOC(MOS3SPspPtr, MOS3sNodePrime, MOS3sNodePrime); + TSTALLOC(MOS3DdpPtr, MOS3dNode, MOS3dNodePrime); + TSTALLOC(MOS3GbPtr, MOS3gNode, MOS3bNode); + TSTALLOC(MOS3GdpPtr, MOS3gNode, MOS3dNodePrime); + TSTALLOC(MOS3GspPtr, MOS3gNode, MOS3sNodePrime); + TSTALLOC(MOS3SspPtr, MOS3sNode, MOS3sNodePrime); + TSTALLOC(MOS3BdpPtr, MOS3bNode, MOS3dNodePrime); + TSTALLOC(MOS3BspPtr, MOS3bNode, MOS3sNodePrime); + TSTALLOC(MOS3DPspPtr, MOS3dNodePrime, MOS3sNodePrime); + TSTALLOC(MOS3DPdPtr, MOS3dNodePrime, MOS3dNode); + TSTALLOC(MOS3BgPtr, MOS3bNode, MOS3gNode); + TSTALLOC(MOS3DPgPtr, MOS3dNodePrime, MOS3gNode); + TSTALLOC(MOS3SPgPtr, MOS3sNodePrime, MOS3gNode); + TSTALLOC(MOS3SPsPtr, MOS3sNodePrime, MOS3sNode); + TSTALLOC(MOS3DPbPtr, MOS3dNodePrime, MOS3bNode); + TSTALLOC(MOS3SPbPtr, MOS3sNodePrime, MOS3bNode); + TSTALLOC(MOS3SPdpPtr, MOS3sNodePrime, MOS3dNodePrime); } } diff --git a/src/spicelib/devices/mos6/mos6set.c b/src/spicelib/devices/mos6/mos6set.c index 28554c50f..8a1cd3d80 100644 --- a/src/spicelib/devices/mos6/mos6set.c +++ b/src/spicelib/devices/mos6/mos6set.c @@ -189,32 +189,32 @@ MOS6setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, } /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(MOS6DdPtr,MOS6dNode,MOS6dNode) - TSTALLOC(MOS6GgPtr,MOS6gNode,MOS6gNode) - TSTALLOC(MOS6SsPtr,MOS6sNode,MOS6sNode) - TSTALLOC(MOS6BbPtr,MOS6bNode,MOS6bNode) - TSTALLOC(MOS6DPdpPtr,MOS6dNodePrime,MOS6dNodePrime) - TSTALLOC(MOS6SPspPtr,MOS6sNodePrime,MOS6sNodePrime) - TSTALLOC(MOS6DdpPtr,MOS6dNode,MOS6dNodePrime) - TSTALLOC(MOS6GbPtr,MOS6gNode,MOS6bNode) - TSTALLOC(MOS6GdpPtr,MOS6gNode,MOS6dNodePrime) - TSTALLOC(MOS6GspPtr,MOS6gNode,MOS6sNodePrime) - TSTALLOC(MOS6SspPtr,MOS6sNode,MOS6sNodePrime) - TSTALLOC(MOS6BdpPtr,MOS6bNode,MOS6dNodePrime) - TSTALLOC(MOS6BspPtr,MOS6bNode,MOS6sNodePrime) - TSTALLOC(MOS6DPspPtr,MOS6dNodePrime,MOS6sNodePrime) - TSTALLOC(MOS6DPdPtr,MOS6dNodePrime,MOS6dNode) - TSTALLOC(MOS6BgPtr,MOS6bNode,MOS6gNode) - TSTALLOC(MOS6DPgPtr,MOS6dNodePrime,MOS6gNode) - TSTALLOC(MOS6SPgPtr,MOS6sNodePrime,MOS6gNode) - TSTALLOC(MOS6SPsPtr,MOS6sNodePrime,MOS6sNode) - TSTALLOC(MOS6DPbPtr,MOS6dNodePrime,MOS6bNode) - TSTALLOC(MOS6SPbPtr,MOS6sNodePrime,MOS6bNode) - TSTALLOC(MOS6SPdpPtr,MOS6sNodePrime,MOS6dNodePrime) + TSTALLOC(MOS6DdPtr,MOS6dNode,MOS6dNode); + TSTALLOC(MOS6GgPtr,MOS6gNode,MOS6gNode); + TSTALLOC(MOS6SsPtr,MOS6sNode,MOS6sNode); + TSTALLOC(MOS6BbPtr,MOS6bNode,MOS6bNode); + TSTALLOC(MOS6DPdpPtr,MOS6dNodePrime,MOS6dNodePrime); + TSTALLOC(MOS6SPspPtr,MOS6sNodePrime,MOS6sNodePrime); + TSTALLOC(MOS6DdpPtr,MOS6dNode,MOS6dNodePrime); + TSTALLOC(MOS6GbPtr,MOS6gNode,MOS6bNode); + TSTALLOC(MOS6GdpPtr,MOS6gNode,MOS6dNodePrime); + TSTALLOC(MOS6GspPtr,MOS6gNode,MOS6sNodePrime); + TSTALLOC(MOS6SspPtr,MOS6sNode,MOS6sNodePrime); + TSTALLOC(MOS6BdpPtr,MOS6bNode,MOS6dNodePrime); + TSTALLOC(MOS6BspPtr,MOS6bNode,MOS6sNodePrime); + TSTALLOC(MOS6DPspPtr,MOS6dNodePrime,MOS6sNodePrime); + TSTALLOC(MOS6DPdPtr,MOS6dNodePrime,MOS6dNode); + TSTALLOC(MOS6BgPtr,MOS6bNode,MOS6gNode); + TSTALLOC(MOS6DPgPtr,MOS6dNodePrime,MOS6gNode); + TSTALLOC(MOS6SPgPtr,MOS6sNodePrime,MOS6gNode); + TSTALLOC(MOS6SPsPtr,MOS6sNodePrime,MOS6sNode); + TSTALLOC(MOS6DPbPtr,MOS6dNodePrime,MOS6bNode); + TSTALLOC(MOS6SPbPtr,MOS6sNodePrime,MOS6bNode); + TSTALLOC(MOS6SPdpPtr,MOS6sNodePrime,MOS6dNodePrime); } } diff --git a/src/spicelib/devices/mos9/mos9set.c b/src/spicelib/devices/mos9/mos9set.c index 129ebccfe..b32c91b2a 100644 --- a/src/spicelib/devices/mos9/mos9set.c +++ b/src/spicelib/devices/mos9/mos9set.c @@ -227,32 +227,32 @@ MOS9setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(MOS9DdPtr, MOS9dNode, MOS9dNode) - TSTALLOC(MOS9GgPtr, MOS9gNode, MOS9gNode) - TSTALLOC(MOS9SsPtr, MOS9sNode, MOS9sNode) - TSTALLOC(MOS9BbPtr, MOS9bNode, MOS9bNode) - TSTALLOC(MOS9DPdpPtr, MOS9dNodePrime, MOS9dNodePrime) - TSTALLOC(MOS9SPspPtr, MOS9sNodePrime, MOS9sNodePrime) - TSTALLOC(MOS9DdpPtr, MOS9dNode, MOS9dNodePrime) - TSTALLOC(MOS9GbPtr, MOS9gNode, MOS9bNode) - TSTALLOC(MOS9GdpPtr, MOS9gNode, MOS9dNodePrime) - TSTALLOC(MOS9GspPtr, MOS9gNode, MOS9sNodePrime) - TSTALLOC(MOS9SspPtr, MOS9sNode, MOS9sNodePrime) - TSTALLOC(MOS9BdpPtr, MOS9bNode, MOS9dNodePrime) - TSTALLOC(MOS9BspPtr, MOS9bNode, MOS9sNodePrime) - TSTALLOC(MOS9DPspPtr, MOS9dNodePrime, MOS9sNodePrime) - TSTALLOC(MOS9DPdPtr, MOS9dNodePrime, MOS9dNode) - TSTALLOC(MOS9BgPtr, MOS9bNode, MOS9gNode) - TSTALLOC(MOS9DPgPtr, MOS9dNodePrime, MOS9gNode) - TSTALLOC(MOS9SPgPtr, MOS9sNodePrime, MOS9gNode) - TSTALLOC(MOS9SPsPtr, MOS9sNodePrime, MOS9sNode) - TSTALLOC(MOS9DPbPtr, MOS9dNodePrime, MOS9bNode) - TSTALLOC(MOS9SPbPtr, MOS9sNodePrime, MOS9bNode) - TSTALLOC(MOS9SPdpPtr, MOS9sNodePrime, MOS9dNodePrime) + TSTALLOC(MOS9DdPtr, MOS9dNode, MOS9dNode); + TSTALLOC(MOS9GgPtr, MOS9gNode, MOS9gNode); + TSTALLOC(MOS9SsPtr, MOS9sNode, MOS9sNode); + TSTALLOC(MOS9BbPtr, MOS9bNode, MOS9bNode); + TSTALLOC(MOS9DPdpPtr, MOS9dNodePrime, MOS9dNodePrime); + TSTALLOC(MOS9SPspPtr, MOS9sNodePrime, MOS9sNodePrime); + TSTALLOC(MOS9DdpPtr, MOS9dNode, MOS9dNodePrime); + TSTALLOC(MOS9GbPtr, MOS9gNode, MOS9bNode); + TSTALLOC(MOS9GdpPtr, MOS9gNode, MOS9dNodePrime); + TSTALLOC(MOS9GspPtr, MOS9gNode, MOS9sNodePrime); + TSTALLOC(MOS9SspPtr, MOS9sNode, MOS9sNodePrime); + TSTALLOC(MOS9BdpPtr, MOS9bNode, MOS9dNodePrime); + TSTALLOC(MOS9BspPtr, MOS9bNode, MOS9sNodePrime); + TSTALLOC(MOS9DPspPtr, MOS9dNodePrime, MOS9sNodePrime); + TSTALLOC(MOS9DPdPtr, MOS9dNodePrime, MOS9dNode); + TSTALLOC(MOS9BgPtr, MOS9bNode, MOS9gNode); + TSTALLOC(MOS9DPgPtr, MOS9dNodePrime, MOS9gNode); + TSTALLOC(MOS9SPgPtr, MOS9sNodePrime, MOS9gNode); + TSTALLOC(MOS9SPsPtr, MOS9sNodePrime, MOS9sNode); + TSTALLOC(MOS9DPbPtr, MOS9dNodePrime, MOS9bNode); + TSTALLOC(MOS9SPbPtr, MOS9sNodePrime, MOS9bNode); + TSTALLOC(MOS9SPdpPtr, MOS9sNodePrime, MOS9dNodePrime); } } diff --git a/src/spicelib/devices/nbjt/nbjtset.c b/src/spicelib/devices/nbjt/nbjtset.c index b9da8fb7a..110a57a09 100644 --- a/src/spicelib/devices/nbjt/nbjtset.c +++ b/src/spicelib/devices/nbjt/nbjtset.c @@ -228,19 +228,19 @@ NBJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ +do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(NBJTcolColPtr, NBJTcolNode, NBJTcolNode) - TSTALLOC(NBJTbaseBasePtr, NBJTbaseNode, NBJTbaseNode) - TSTALLOC(NBJTemitEmitPtr, NBJTemitNode, NBJTemitNode) - TSTALLOC(NBJTcolBasePtr, NBJTcolNode, NBJTbaseNode) - TSTALLOC(NBJTcolEmitPtr, NBJTcolNode, NBJTemitNode) - TSTALLOC(NBJTbaseColPtr, NBJTbaseNode, NBJTcolNode) - TSTALLOC(NBJTbaseEmitPtr, NBJTbaseNode, NBJTemitNode) - TSTALLOC(NBJTemitColPtr, NBJTemitNode, NBJTcolNode) - TSTALLOC(NBJTemitBasePtr, NBJTemitNode, NBJTbaseNode) + TSTALLOC(NBJTcolColPtr, NBJTcolNode, NBJTcolNode); + TSTALLOC(NBJTbaseBasePtr, NBJTbaseNode, NBJTbaseNode); + TSTALLOC(NBJTemitEmitPtr, NBJTemitNode, NBJTemitNode); + TSTALLOC(NBJTcolBasePtr, NBJTcolNode, NBJTbaseNode); + TSTALLOC(NBJTcolEmitPtr, NBJTcolNode, NBJTemitNode); + TSTALLOC(NBJTbaseColPtr, NBJTbaseNode, NBJTcolNode); + TSTALLOC(NBJTbaseEmitPtr, NBJTbaseNode, NBJTemitNode); + TSTALLOC(NBJTemitColPtr, NBJTemitNode, NBJTcolNode); + TSTALLOC(NBJTemitBasePtr, NBJTemitNode, NBJTbaseNode); } /* Clean up lists */ killCoordInfo(xCoordList); diff --git a/src/spicelib/devices/nbjt2/nbt2set.c b/src/spicelib/devices/nbjt2/nbt2set.c index 385fcc5b6..231ee561d 100644 --- a/src/spicelib/devices/nbjt2/nbt2set.c +++ b/src/spicelib/devices/nbjt2/nbt2set.c @@ -244,19 +244,19 @@ NBJT2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ +do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(NBJT2colColPtr, NBJT2colNode, NBJT2colNode) - TSTALLOC(NBJT2colBasePtr, NBJT2colNode, NBJT2baseNode) - TSTALLOC(NBJT2colEmitPtr, NBJT2colNode, NBJT2emitNode) - TSTALLOC(NBJT2baseColPtr, NBJT2baseNode, NBJT2colNode) - TSTALLOC(NBJT2baseBasePtr, NBJT2baseNode, NBJT2baseNode) - TSTALLOC(NBJT2baseEmitPtr, NBJT2baseNode, NBJT2emitNode) - TSTALLOC(NBJT2emitColPtr, NBJT2emitNode, NBJT2colNode) - TSTALLOC(NBJT2emitBasePtr, NBJT2emitNode, NBJT2baseNode) - TSTALLOC(NBJT2emitEmitPtr, NBJT2emitNode, NBJT2emitNode) + TSTALLOC(NBJT2colColPtr, NBJT2colNode, NBJT2colNode); + TSTALLOC(NBJT2colBasePtr, NBJT2colNode, NBJT2baseNode); + TSTALLOC(NBJT2colEmitPtr, NBJT2colNode, NBJT2emitNode); + TSTALLOC(NBJT2baseColPtr, NBJT2baseNode, NBJT2colNode); + TSTALLOC(NBJT2baseBasePtr, NBJT2baseNode, NBJT2baseNode); + TSTALLOC(NBJT2baseEmitPtr, NBJT2baseNode, NBJT2emitNode); + TSTALLOC(NBJT2emitColPtr, NBJT2emitNode, NBJT2colNode); + TSTALLOC(NBJT2emitBasePtr, NBJT2emitNode, NBJT2baseNode); + TSTALLOC(NBJT2emitEmitPtr, NBJT2emitNode, NBJT2emitNode); } /* Clean up lists */ killCoordInfo(xCoordList); diff --git a/src/spicelib/devices/ndev/ndevset.c b/src/spicelib/devices/ndev/ndevset.c index 9f7e0ecd4..b6fe6b484 100644 --- a/src/spicelib/devices/ndev/ndevset.c +++ b/src/spicelib/devices/ndev/ndevset.c @@ -51,9 +51,9 @@ int NDEVsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states send(model->sock,&(here->Ndevinfo),sizeof(here->Ndevinfo),0); /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) for(i=0;iterm;i++) for(j=0;jterm;j++) diff --git a/src/spicelib/devices/numd/numdset.c b/src/spicelib/devices/numd/numdset.c index 5e4108e91..027a68db7 100644 --- a/src/spicelib/devices/numd/numdset.c +++ b/src/spicelib/devices/numd/numdset.c @@ -217,14 +217,14 @@ NUMDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ +do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(NUMDposPosPtr, NUMDposNode, NUMDposNode) - TSTALLOC(NUMDnegNegPtr, NUMDnegNode, NUMDnegNode) - TSTALLOC(NUMDnegPosPtr, NUMDnegNode, NUMDposNode) - TSTALLOC(NUMDposNegPtr, NUMDposNode, NUMDnegNode) + TSTALLOC(NUMDposPosPtr, NUMDposNode, NUMDposNode); + TSTALLOC(NUMDnegNegPtr, NUMDnegNode, NUMDnegNode); + TSTALLOC(NUMDnegPosPtr, NUMDnegNode, NUMDposNode); + TSTALLOC(NUMDposNegPtr, NUMDposNode, NUMDnegNode); } /* Clean up lists */ killCoordInfo(xCoordList); diff --git a/src/spicelib/devices/numd2/nud2set.c b/src/spicelib/devices/numd2/nud2set.c index 521fec661..fde80d7ad 100644 --- a/src/spicelib/devices/numd2/nud2set.c +++ b/src/spicelib/devices/numd2/nud2set.c @@ -242,14 +242,14 @@ NUMD2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ +do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(NUMD2posPosPtr, NUMD2posNode, NUMD2posNode) - TSTALLOC(NUMD2negNegPtr, NUMD2negNode, NUMD2negNode) - TSTALLOC(NUMD2negPosPtr, NUMD2negNode, NUMD2posNode) - TSTALLOC(NUMD2posNegPtr, NUMD2posNode, NUMD2negNode) + TSTALLOC(NUMD2posPosPtr, NUMD2posNode, NUMD2posNode); + TSTALLOC(NUMD2negNegPtr, NUMD2negNode, NUMD2negNode); + TSTALLOC(NUMD2negPosPtr, NUMD2negNode, NUMD2posNode); + TSTALLOC(NUMD2posNegPtr, NUMD2posNode, NUMD2negNode); } /* Clean up lists */ killCoordInfo(xCoordList); diff --git a/src/spicelib/devices/numos/nummset.c b/src/spicelib/devices/numos/nummset.c index 895901ba8..4d1af7282 100644 --- a/src/spicelib/devices/numos/nummset.c +++ b/src/spicelib/devices/numos/nummset.c @@ -241,26 +241,26 @@ NUMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ +do { if ((inst->ptr = SMPmakeElt(matrix, inst->first, inst->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(NUMOSdrainDrainPtr, NUMOSdrainNode, NUMOSdrainNode) - TSTALLOC(NUMOSdrainSourcePtr, NUMOSdrainNode, NUMOSsourceNode) - TSTALLOC(NUMOSdrainGatePtr, NUMOSdrainNode, NUMOSgateNode) - TSTALLOC(NUMOSdrainBulkPtr, NUMOSdrainNode, NUMOSbulkNode) - TSTALLOC(NUMOSsourceDrainPtr, NUMOSsourceNode, NUMOSdrainNode) - TSTALLOC(NUMOSsourceSourcePtr, NUMOSsourceNode, NUMOSsourceNode) - TSTALLOC(NUMOSsourceGatePtr, NUMOSsourceNode, NUMOSgateNode) - TSTALLOC(NUMOSsourceBulkPtr, NUMOSsourceNode, NUMOSbulkNode) - TSTALLOC(NUMOSgateDrainPtr, NUMOSgateNode, NUMOSdrainNode) - TSTALLOC(NUMOSgateSourcePtr, NUMOSgateNode, NUMOSsourceNode) - TSTALLOC(NUMOSgateGatePtr, NUMOSgateNode, NUMOSgateNode) - TSTALLOC(NUMOSgateBulkPtr, NUMOSgateNode, NUMOSbulkNode) - TSTALLOC(NUMOSbulkDrainPtr, NUMOSbulkNode, NUMOSdrainNode) - TSTALLOC(NUMOSbulkSourcePtr, NUMOSbulkNode, NUMOSsourceNode) - TSTALLOC(NUMOSbulkGatePtr, NUMOSbulkNode, NUMOSgateNode) - TSTALLOC(NUMOSbulkBulkPtr, NUMOSbulkNode, NUMOSbulkNode) + TSTALLOC(NUMOSdrainDrainPtr, NUMOSdrainNode, NUMOSdrainNode); + TSTALLOC(NUMOSdrainSourcePtr, NUMOSdrainNode, NUMOSsourceNode); + TSTALLOC(NUMOSdrainGatePtr, NUMOSdrainNode, NUMOSgateNode); + TSTALLOC(NUMOSdrainBulkPtr, NUMOSdrainNode, NUMOSbulkNode); + TSTALLOC(NUMOSsourceDrainPtr, NUMOSsourceNode, NUMOSdrainNode); + TSTALLOC(NUMOSsourceSourcePtr, NUMOSsourceNode, NUMOSsourceNode); + TSTALLOC(NUMOSsourceGatePtr, NUMOSsourceNode, NUMOSgateNode); + TSTALLOC(NUMOSsourceBulkPtr, NUMOSsourceNode, NUMOSbulkNode); + TSTALLOC(NUMOSgateDrainPtr, NUMOSgateNode, NUMOSdrainNode); + TSTALLOC(NUMOSgateSourcePtr, NUMOSgateNode, NUMOSsourceNode); + TSTALLOC(NUMOSgateGatePtr, NUMOSgateNode, NUMOSgateNode); + TSTALLOC(NUMOSgateBulkPtr, NUMOSgateNode, NUMOSbulkNode); + TSTALLOC(NUMOSbulkDrainPtr, NUMOSbulkNode, NUMOSdrainNode); + TSTALLOC(NUMOSbulkSourcePtr, NUMOSbulkNode, NUMOSsourceNode); + TSTALLOC(NUMOSbulkGatePtr, NUMOSbulkNode, NUMOSgateNode); + TSTALLOC(NUMOSbulkBulkPtr, NUMOSbulkNode, NUMOSbulkNode); } /* Clean up lists */ killCoordInfo(xCoordList); diff --git a/src/spicelib/devices/res/ressetup.c b/src/spicelib/devices/res/ressetup.c index 80c7c0e5b..0b70e4e7d 100644 --- a/src/spicelib/devices/res/ressetup.c +++ b/src/spicelib/devices/res/ressetup.c @@ -34,9 +34,9 @@ RESsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit*ckt, int *state) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) TSTALLOC(RESposPosptr, RESposNode, RESposNode); TSTALLOC(RESnegNegptr, RESnegNode, RESnegNode); diff --git a/src/spicelib/devices/soi3/soi3set.c b/src/spicelib/devices/soi3/soi3set.c index 4eb10b95b..879852314 100644 --- a/src/spicelib/devices/soi3/soi3set.c +++ b/src/spicelib/devices/soi3/soi3set.c @@ -566,94 +566,94 @@ SOI3setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(SOI3D_dPtr,SOI3dNode,SOI3dNode) - TSTALLOC(SOI3D_dpPtr,SOI3dNode,SOI3dNodePrime) - TSTALLOC(SOI3DP_dPtr,SOI3dNodePrime,SOI3dNode) + TSTALLOC(SOI3D_dPtr,SOI3dNode,SOI3dNode); + TSTALLOC(SOI3D_dpPtr,SOI3dNode,SOI3dNodePrime); + TSTALLOC(SOI3DP_dPtr,SOI3dNodePrime,SOI3dNode); - TSTALLOC(SOI3S_sPtr,SOI3sNode,SOI3sNode) - TSTALLOC(SOI3S_spPtr,SOI3sNode,SOI3sNodePrime) - TSTALLOC(SOI3SP_sPtr,SOI3sNodePrime,SOI3sNode) + TSTALLOC(SOI3S_sPtr,SOI3sNode,SOI3sNode); + TSTALLOC(SOI3S_spPtr,SOI3sNode,SOI3sNodePrime); + TSTALLOC(SOI3SP_sPtr,SOI3sNodePrime,SOI3sNode); - TSTALLOC(SOI3GF_gfPtr,SOI3gfNode,SOI3gfNode) - TSTALLOC(SOI3GF_gbPtr,SOI3gfNode,SOI3gbNode) - TSTALLOC(SOI3GF_dpPtr,SOI3gfNode,SOI3dNodePrime) - TSTALLOC(SOI3GF_spPtr,SOI3gfNode,SOI3sNodePrime) - TSTALLOC(SOI3GF_bPtr,SOI3gfNode,SOI3bNode) + TSTALLOC(SOI3GF_gfPtr,SOI3gfNode,SOI3gfNode); + TSTALLOC(SOI3GF_gbPtr,SOI3gfNode,SOI3gbNode); + TSTALLOC(SOI3GF_dpPtr,SOI3gfNode,SOI3dNodePrime); + TSTALLOC(SOI3GF_spPtr,SOI3gfNode,SOI3sNodePrime); + TSTALLOC(SOI3GF_bPtr,SOI3gfNode,SOI3bNode); - TSTALLOC(SOI3GB_gfPtr,SOI3gbNode,SOI3gfNode) - TSTALLOC(SOI3GB_gbPtr,SOI3gbNode,SOI3gbNode) - TSTALLOC(SOI3GB_dpPtr,SOI3gbNode,SOI3dNodePrime) - TSTALLOC(SOI3GB_spPtr,SOI3gbNode,SOI3sNodePrime) - TSTALLOC(SOI3GB_bPtr,SOI3gbNode,SOI3bNode) + TSTALLOC(SOI3GB_gfPtr,SOI3gbNode,SOI3gfNode); + TSTALLOC(SOI3GB_gbPtr,SOI3gbNode,SOI3gbNode); + TSTALLOC(SOI3GB_dpPtr,SOI3gbNode,SOI3dNodePrime); + TSTALLOC(SOI3GB_spPtr,SOI3gbNode,SOI3sNodePrime); + TSTALLOC(SOI3GB_bPtr,SOI3gbNode,SOI3bNode); - TSTALLOC(SOI3B_gfPtr,SOI3bNode,SOI3gfNode) - TSTALLOC(SOI3B_gbPtr,SOI3bNode,SOI3gbNode) - TSTALLOC(SOI3B_dpPtr,SOI3bNode,SOI3dNodePrime) - TSTALLOC(SOI3B_spPtr,SOI3bNode,SOI3sNodePrime) - TSTALLOC(SOI3B_bPtr,SOI3bNode,SOI3bNode) + TSTALLOC(SOI3B_gfPtr,SOI3bNode,SOI3gfNode); + TSTALLOC(SOI3B_gbPtr,SOI3bNode,SOI3gbNode); + TSTALLOC(SOI3B_dpPtr,SOI3bNode,SOI3dNodePrime); + TSTALLOC(SOI3B_spPtr,SOI3bNode,SOI3sNodePrime); + TSTALLOC(SOI3B_bPtr,SOI3bNode,SOI3bNode); - TSTALLOC(SOI3DP_gfPtr,SOI3dNodePrime,SOI3gfNode) - TSTALLOC(SOI3DP_gbPtr,SOI3dNodePrime,SOI3gbNode) - TSTALLOC(SOI3DP_dpPtr,SOI3dNodePrime,SOI3dNodePrime) - TSTALLOC(SOI3DP_spPtr,SOI3dNodePrime,SOI3sNodePrime) - TSTALLOC(SOI3DP_bPtr,SOI3dNodePrime,SOI3bNode) + TSTALLOC(SOI3DP_gfPtr,SOI3dNodePrime,SOI3gfNode); + TSTALLOC(SOI3DP_gbPtr,SOI3dNodePrime,SOI3gbNode); + TSTALLOC(SOI3DP_dpPtr,SOI3dNodePrime,SOI3dNodePrime); + TSTALLOC(SOI3DP_spPtr,SOI3dNodePrime,SOI3sNodePrime); + TSTALLOC(SOI3DP_bPtr,SOI3dNodePrime,SOI3bNode); - TSTALLOC(SOI3SP_gfPtr,SOI3sNodePrime,SOI3gfNode) - TSTALLOC(SOI3SP_gbPtr,SOI3sNodePrime,SOI3gbNode) - TSTALLOC(SOI3SP_dpPtr,SOI3sNodePrime,SOI3dNodePrime) - TSTALLOC(SOI3SP_spPtr,SOI3sNodePrime,SOI3sNodePrime) - TSTALLOC(SOI3SP_bPtr,SOI3sNodePrime,SOI3bNode) + TSTALLOC(SOI3SP_gfPtr,SOI3sNodePrime,SOI3gfNode); + TSTALLOC(SOI3SP_gbPtr,SOI3sNodePrime,SOI3gbNode); + TSTALLOC(SOI3SP_dpPtr,SOI3sNodePrime,SOI3dNodePrime); + TSTALLOC(SOI3SP_spPtr,SOI3sNodePrime,SOI3sNodePrime); + TSTALLOC(SOI3SP_bPtr,SOI3sNodePrime,SOI3bNode); if (here->SOI3rt == 0) { - TSTALLOC(SOI3TOUT_ibrPtr,SOI3toutNode,SOI3branch) - TSTALLOC(SOI3IBR_toutPtr,SOI3branch,SOI3toutNode) + TSTALLOC(SOI3TOUT_ibrPtr,SOI3toutNode,SOI3branch); + TSTALLOC(SOI3IBR_toutPtr,SOI3branch,SOI3toutNode); } else { - TSTALLOC(SOI3TOUT_toutPtr,SOI3toutNode,SOI3toutNode) + TSTALLOC(SOI3TOUT_toutPtr,SOI3toutNode,SOI3toutNode); if (here->SOI3numThermalNodes > 1) { - TSTALLOC(SOI3TOUT_tout1Ptr,SOI3toutNode,SOI3tout1Node) - TSTALLOC(SOI3TOUT1_toutPtr,SOI3tout1Node,SOI3toutNode) - TSTALLOC(SOI3TOUT1_tout1Ptr,SOI3tout1Node,SOI3tout1Node) + TSTALLOC(SOI3TOUT_tout1Ptr,SOI3toutNode,SOI3tout1Node); + TSTALLOC(SOI3TOUT1_toutPtr,SOI3tout1Node,SOI3toutNode); + TSTALLOC(SOI3TOUT1_tout1Ptr,SOI3tout1Node,SOI3tout1Node); } if (here->SOI3numThermalNodes > 2) { - TSTALLOC(SOI3TOUT1_tout2Ptr,SOI3tout1Node,SOI3tout2Node) - TSTALLOC(SOI3TOUT2_tout1Ptr,SOI3tout2Node,SOI3tout1Node) - TSTALLOC(SOI3TOUT2_tout2Ptr,SOI3tout2Node,SOI3tout2Node) + TSTALLOC(SOI3TOUT1_tout2Ptr,SOI3tout1Node,SOI3tout2Node); + TSTALLOC(SOI3TOUT2_tout1Ptr,SOI3tout2Node,SOI3tout1Node); + TSTALLOC(SOI3TOUT2_tout2Ptr,SOI3tout2Node,SOI3tout2Node); } if (here->SOI3numThermalNodes > 3) { - TSTALLOC(SOI3TOUT2_tout3Ptr,SOI3tout2Node,SOI3tout3Node) - TSTALLOC(SOI3TOUT3_tout2Ptr,SOI3tout3Node,SOI3tout2Node) - TSTALLOC(SOI3TOUT3_tout3Ptr,SOI3tout3Node,SOI3tout3Node) + TSTALLOC(SOI3TOUT2_tout3Ptr,SOI3tout2Node,SOI3tout3Node); + TSTALLOC(SOI3TOUT3_tout2Ptr,SOI3tout3Node,SOI3tout2Node); + TSTALLOC(SOI3TOUT3_tout3Ptr,SOI3tout3Node,SOI3tout3Node); } if (here->SOI3numThermalNodes > 4) { - TSTALLOC(SOI3TOUT3_tout4Ptr,SOI3tout3Node,SOI3tout4Node) - TSTALLOC(SOI3TOUT4_tout3Ptr,SOI3tout4Node,SOI3tout3Node) - TSTALLOC(SOI3TOUT4_tout4Ptr,SOI3tout4Node,SOI3tout4Node) + TSTALLOC(SOI3TOUT3_tout4Ptr,SOI3tout3Node,SOI3tout4Node); + TSTALLOC(SOI3TOUT4_tout3Ptr,SOI3tout4Node,SOI3tout3Node); + TSTALLOC(SOI3TOUT4_tout4Ptr,SOI3tout4Node,SOI3tout4Node); } - TSTALLOC(SOI3TOUT_toutPtr,SOI3toutNode,SOI3toutNode) - TSTALLOC(SOI3TOUT_gfPtr,SOI3toutNode,SOI3gfNode) - TSTALLOC(SOI3TOUT_gbPtr,SOI3toutNode,SOI3gbNode) - TSTALLOC(SOI3TOUT_dpPtr,SOI3toutNode,SOI3dNodePrime) - TSTALLOC(SOI3TOUT_spPtr,SOI3toutNode,SOI3sNodePrime) - TSTALLOC(SOI3TOUT_bPtr,SOI3toutNode,SOI3bNode) + TSTALLOC(SOI3TOUT_toutPtr,SOI3toutNode,SOI3toutNode); + TSTALLOC(SOI3TOUT_gfPtr,SOI3toutNode,SOI3gfNode); + TSTALLOC(SOI3TOUT_gbPtr,SOI3toutNode,SOI3gbNode); + TSTALLOC(SOI3TOUT_dpPtr,SOI3toutNode,SOI3dNodePrime); + TSTALLOC(SOI3TOUT_spPtr,SOI3toutNode,SOI3sNodePrime); + TSTALLOC(SOI3TOUT_bPtr,SOI3toutNode,SOI3bNode); - TSTALLOC(SOI3GF_toutPtr,SOI3gfNode,SOI3toutNode) - TSTALLOC(SOI3GB_toutPtr,SOI3gbNode,SOI3toutNode) - TSTALLOC(SOI3DP_toutPtr,SOI3dNodePrime,SOI3toutNode) - TSTALLOC(SOI3SP_toutPtr,SOI3sNodePrime,SOI3toutNode) - TSTALLOC(SOI3B_toutPtr,SOI3bNode,SOI3toutNode) + TSTALLOC(SOI3GF_toutPtr,SOI3gfNode,SOI3toutNode); + TSTALLOC(SOI3GB_toutPtr,SOI3gbNode,SOI3toutNode); + TSTALLOC(SOI3DP_toutPtr,SOI3dNodePrime,SOI3toutNode); + TSTALLOC(SOI3SP_toutPtr,SOI3sNodePrime,SOI3toutNode); + TSTALLOC(SOI3B_toutPtr,SOI3bNode,SOI3toutNode); } } } diff --git a/src/spicelib/devices/sw/swsetup.c b/src/spicelib/devices/sw/swsetup.c index 44b0f803e..384e05324 100644 --- a/src/spicelib/devices/sw/swsetup.c +++ b/src/spicelib/devices/sw/swsetup.c @@ -52,14 +52,14 @@ SWsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(SWposPosptr, SWposNode, SWposNode) - TSTALLOC(SWposNegptr, SWposNode, SWnegNode) - TSTALLOC(SWnegPosptr, SWnegNode, SWposNode) - TSTALLOC(SWnegNegptr, SWnegNode, SWnegNode) + TSTALLOC(SWposPosptr, SWposNode, SWposNode); + TSTALLOC(SWposNegptr, SWposNode, SWnegNode); + TSTALLOC(SWnegPosptr, SWnegNode, SWposNode); + TSTALLOC(SWnegNegptr, SWnegNode, SWnegNode); } } return(OK); diff --git a/src/spicelib/devices/tra/trasetup.c b/src/spicelib/devices/tra/trasetup.c index 197dcda75..67d280a15 100644 --- a/src/spicelib/devices/tra/trasetup.c +++ b/src/spicelib/devices/tra/trasetup.c @@ -64,32 +64,32 @@ TRAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(TRAibr1Ibr2Ptr, TRAbrEq1, TRAbrEq2) - TSTALLOC(TRAibr1Int1Ptr, TRAbrEq1, TRAintNode1) - TSTALLOC(TRAibr1Neg1Ptr, TRAbrEq1, TRAnegNode1) - TSTALLOC(TRAibr1Neg2Ptr, TRAbrEq1, TRAnegNode2) - TSTALLOC(TRAibr1Pos2Ptr, TRAbrEq1, TRAposNode2) - TSTALLOC(TRAibr2Ibr1Ptr, TRAbrEq2, TRAbrEq1) - TSTALLOC(TRAibr2Int2Ptr, TRAbrEq2, TRAintNode2) - TSTALLOC(TRAibr2Neg1Ptr, TRAbrEq2, TRAnegNode1) - TSTALLOC(TRAibr2Neg2Ptr, TRAbrEq2, TRAnegNode2) - TSTALLOC(TRAibr2Pos1Ptr, TRAbrEq2, TRAposNode1) - TSTALLOC(TRAint1Ibr1Ptr, TRAintNode1, TRAbrEq1) - TSTALLOC(TRAint1Int1Ptr, TRAintNode1, TRAintNode1) - TSTALLOC(TRAint1Pos1Ptr, TRAintNode1, TRAposNode1) - TSTALLOC(TRAint2Ibr2Ptr, TRAintNode2, TRAbrEq2) - TSTALLOC(TRAint2Int2Ptr, TRAintNode2, TRAintNode2) - TSTALLOC(TRAint2Pos2Ptr, TRAintNode2, TRAposNode2) - TSTALLOC(TRAneg1Ibr1Ptr, TRAnegNode1, TRAbrEq1) - TSTALLOC(TRAneg2Ibr2Ptr, TRAnegNode2, TRAbrEq2) - TSTALLOC(TRApos1Int1Ptr, TRAposNode1, TRAintNode1) - TSTALLOC(TRApos1Pos1Ptr, TRAposNode1, TRAposNode1) - TSTALLOC(TRApos2Int2Ptr, TRAposNode2, TRAintNode2) - TSTALLOC(TRApos2Pos2Ptr, TRAposNode2, TRAposNode2) + TSTALLOC(TRAibr1Ibr2Ptr, TRAbrEq1, TRAbrEq2); + TSTALLOC(TRAibr1Int1Ptr, TRAbrEq1, TRAintNode1); + TSTALLOC(TRAibr1Neg1Ptr, TRAbrEq1, TRAnegNode1); + TSTALLOC(TRAibr1Neg2Ptr, TRAbrEq1, TRAnegNode2); + TSTALLOC(TRAibr1Pos2Ptr, TRAbrEq1, TRAposNode2); + TSTALLOC(TRAibr2Ibr1Ptr, TRAbrEq2, TRAbrEq1); + TSTALLOC(TRAibr2Int2Ptr, TRAbrEq2, TRAintNode2); + TSTALLOC(TRAibr2Neg1Ptr, TRAbrEq2, TRAnegNode1); + TSTALLOC(TRAibr2Neg2Ptr, TRAbrEq2, TRAnegNode2); + TSTALLOC(TRAibr2Pos1Ptr, TRAbrEq2, TRAposNode1); + TSTALLOC(TRAint1Ibr1Ptr, TRAintNode1, TRAbrEq1); + TSTALLOC(TRAint1Int1Ptr, TRAintNode1, TRAintNode1); + TSTALLOC(TRAint1Pos1Ptr, TRAintNode1, TRAposNode1); + TSTALLOC(TRAint2Ibr2Ptr, TRAintNode2, TRAbrEq2); + TSTALLOC(TRAint2Int2Ptr, TRAintNode2, TRAintNode2); + TSTALLOC(TRAint2Pos2Ptr, TRAintNode2, TRAposNode2); + TSTALLOC(TRAneg1Ibr1Ptr, TRAnegNode1, TRAbrEq1); + TSTALLOC(TRAneg2Ibr2Ptr, TRAnegNode2, TRAbrEq2); + TSTALLOC(TRApos1Int1Ptr, TRAposNode1, TRAintNode1); + TSTALLOC(TRApos1Pos1Ptr, TRAposNode1, TRAposNode1); + TSTALLOC(TRApos2Int2Ptr, TRAposNode2, TRAintNode2); + TSTALLOC(TRApos2Pos2Ptr, TRAposNode2, TRAposNode2); if(!here->TRAnlGiven) { here->TRAnl = .25; diff --git a/src/spicelib/devices/txl/txlsetup.c b/src/spicelib/devices/txl/txlsetup.c index 9a176a7b4..f30d9c66b 100644 --- a/src/spicelib/devices/txl/txlsetup.c +++ b/src/spicelib/devices/txl/txlsetup.c @@ -120,9 +120,9 @@ TXLsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit*ckt, int *state) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) if (! here->TXLibr1Given) { error = CKTmkCur(ckt, &tmp, here->TXLname, "branch1"); diff --git a/src/spicelib/devices/vbic/vbicsetup.c b/src/spicelib/devices/vbic/vbicsetup.c index b233105c5..248a98b8c 100644 --- a/src/spicelib/devices/vbic/vbicsetup.c +++ b/src/spicelib/devices/vbic/vbicsetup.c @@ -472,62 +472,62 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} - TSTALLOC(VBICcollCollPtr,VBICcollNode,VBICcollNode) - TSTALLOC(VBICbaseBasePtr,VBICbaseNode,VBICbaseNode) - TSTALLOC(VBICemitEmitPtr,VBICemitNode,VBICemitNode) - TSTALLOC(VBICsubsSubsPtr,VBICsubsNode,VBICsubsNode) - TSTALLOC(VBICcollCXCollCXPtr,VBICcollCXNode,VBICcollCXNode) - TSTALLOC(VBICcollCICollCIPtr,VBICcollCINode,VBICcollCINode) - TSTALLOC(VBICbaseBXBaseBXPtr,VBICbaseBXNode,VBICbaseBXNode) - TSTALLOC(VBICbaseBIBaseBIPtr,VBICbaseBINode,VBICbaseBINode) - TSTALLOC(VBICemitEIEmitEIPtr,VBICemitEINode,VBICemitEINode) - TSTALLOC(VBICbaseBPBaseBPPtr,VBICbaseBPNode,VBICbaseBPNode) - TSTALLOC(VBICsubsSISubsSIPtr,VBICsubsSINode,VBICsubsSINode) +} } while(0) + TSTALLOC(VBICcollCollPtr,VBICcollNode,VBICcollNode); + TSTALLOC(VBICbaseBasePtr,VBICbaseNode,VBICbaseNode); + TSTALLOC(VBICemitEmitPtr,VBICemitNode,VBICemitNode); + TSTALLOC(VBICsubsSubsPtr,VBICsubsNode,VBICsubsNode); + TSTALLOC(VBICcollCXCollCXPtr,VBICcollCXNode,VBICcollCXNode); + TSTALLOC(VBICcollCICollCIPtr,VBICcollCINode,VBICcollCINode); + TSTALLOC(VBICbaseBXBaseBXPtr,VBICbaseBXNode,VBICbaseBXNode); + TSTALLOC(VBICbaseBIBaseBIPtr,VBICbaseBINode,VBICbaseBINode); + TSTALLOC(VBICemitEIEmitEIPtr,VBICemitEINode,VBICemitEINode); + TSTALLOC(VBICbaseBPBaseBPPtr,VBICbaseBPNode,VBICbaseBPNode); + TSTALLOC(VBICsubsSISubsSIPtr,VBICsubsSINode,VBICsubsSINode); - TSTALLOC(VBICbaseEmitPtr,VBICbaseNode,VBICemitNode) - TSTALLOC(VBICemitBasePtr,VBICemitNode,VBICbaseNode) - TSTALLOC(VBICbaseCollPtr,VBICbaseNode,VBICcollNode) - TSTALLOC(VBICcollBasePtr,VBICcollNode,VBICbaseNode) - TSTALLOC(VBICcollCollCXPtr,VBICcollNode,VBICcollCXNode) - TSTALLOC(VBICbaseBaseBXPtr,VBICbaseNode,VBICbaseBXNode) - TSTALLOC(VBICemitEmitEIPtr,VBICemitNode,VBICemitEINode) - TSTALLOC(VBICsubsSubsSIPtr,VBICsubsNode,VBICsubsSINode) - TSTALLOC(VBICcollCXCollCIPtr,VBICcollCXNode,VBICcollCINode) - TSTALLOC(VBICcollCXBaseBXPtr,VBICcollCXNode,VBICbaseBXNode) - TSTALLOC(VBICcollCXBaseBIPtr,VBICcollCXNode,VBICbaseBINode) - TSTALLOC(VBICcollCXBaseBPPtr,VBICcollCXNode,VBICbaseBPNode) - TSTALLOC(VBICcollCIBaseBIPtr,VBICcollCINode,VBICbaseBINode) - TSTALLOC(VBICcollCIEmitEIPtr,VBICcollCINode,VBICemitEINode) - TSTALLOC(VBICbaseBXBaseBIPtr,VBICbaseBXNode,VBICbaseBINode) - TSTALLOC(VBICbaseBXEmitEIPtr,VBICbaseBXNode,VBICemitEINode) - TSTALLOC(VBICbaseBXBaseBPPtr,VBICbaseBXNode,VBICbaseBPNode) - TSTALLOC(VBICbaseBXSubsSIPtr,VBICbaseBXNode,VBICsubsSINode) - TSTALLOC(VBICbaseBIEmitEIPtr,VBICbaseBINode,VBICemitEINode) - TSTALLOC(VBICbaseBPSubsSIPtr,VBICbaseBPNode,VBICsubsSINode) + TSTALLOC(VBICbaseEmitPtr,VBICbaseNode,VBICemitNode); + TSTALLOC(VBICemitBasePtr,VBICemitNode,VBICbaseNode); + TSTALLOC(VBICbaseCollPtr,VBICbaseNode,VBICcollNode); + TSTALLOC(VBICcollBasePtr,VBICcollNode,VBICbaseNode); + TSTALLOC(VBICcollCollCXPtr,VBICcollNode,VBICcollCXNode); + TSTALLOC(VBICbaseBaseBXPtr,VBICbaseNode,VBICbaseBXNode); + TSTALLOC(VBICemitEmitEIPtr,VBICemitNode,VBICemitEINode); + TSTALLOC(VBICsubsSubsSIPtr,VBICsubsNode,VBICsubsSINode); + TSTALLOC(VBICcollCXCollCIPtr,VBICcollCXNode,VBICcollCINode); + TSTALLOC(VBICcollCXBaseBXPtr,VBICcollCXNode,VBICbaseBXNode); + TSTALLOC(VBICcollCXBaseBIPtr,VBICcollCXNode,VBICbaseBINode); + TSTALLOC(VBICcollCXBaseBPPtr,VBICcollCXNode,VBICbaseBPNode); + TSTALLOC(VBICcollCIBaseBIPtr,VBICcollCINode,VBICbaseBINode); + TSTALLOC(VBICcollCIEmitEIPtr,VBICcollCINode,VBICemitEINode); + TSTALLOC(VBICbaseBXBaseBIPtr,VBICbaseBXNode,VBICbaseBINode); + TSTALLOC(VBICbaseBXEmitEIPtr,VBICbaseBXNode,VBICemitEINode); + TSTALLOC(VBICbaseBXBaseBPPtr,VBICbaseBXNode,VBICbaseBPNode); + TSTALLOC(VBICbaseBXSubsSIPtr,VBICbaseBXNode,VBICsubsSINode); + TSTALLOC(VBICbaseBIEmitEIPtr,VBICbaseBINode,VBICemitEINode); + TSTALLOC(VBICbaseBPSubsSIPtr,VBICbaseBPNode,VBICsubsSINode); - TSTALLOC(VBICcollCXCollPtr,VBICcollCXNode,VBICcollNode) - TSTALLOC(VBICbaseBXBasePtr,VBICbaseBXNode,VBICbaseNode) - TSTALLOC(VBICemitEIEmitPtr,VBICemitEINode,VBICemitNode) - TSTALLOC(VBICsubsSISubsPtr,VBICsubsSINode,VBICsubsNode) - TSTALLOC(VBICcollCICollCXPtr,VBICcollCINode,VBICcollCXNode) - TSTALLOC(VBICbaseBICollCXPtr,VBICbaseBINode,VBICcollCXNode) - TSTALLOC(VBICbaseBPCollCXPtr,VBICbaseBPNode,VBICcollCXNode) - TSTALLOC(VBICbaseBXCollCIPtr,VBICbaseBXNode,VBICcollCINode) - TSTALLOC(VBICbaseBICollCIPtr,VBICbaseBINode,VBICcollCINode) - TSTALLOC(VBICemitEICollCIPtr,VBICemitEINode,VBICcollCINode) - TSTALLOC(VBICbaseBPCollCIPtr,VBICbaseBPNode,VBICcollCINode) - TSTALLOC(VBICbaseBIBaseBXPtr,VBICbaseBINode,VBICbaseBXNode) - TSTALLOC(VBICemitEIBaseBXPtr,VBICemitEINode,VBICbaseBXNode) - TSTALLOC(VBICbaseBPBaseBXPtr,VBICbaseBPNode,VBICbaseBXNode) - TSTALLOC(VBICsubsSIBaseBXPtr,VBICsubsSINode,VBICbaseBXNode) - TSTALLOC(VBICemitEIBaseBIPtr,VBICemitEINode,VBICbaseBINode) - TSTALLOC(VBICbaseBPBaseBIPtr,VBICbaseBPNode,VBICbaseBINode) - TSTALLOC(VBICsubsSICollCIPtr,VBICsubsSINode,VBICcollCINode) - TSTALLOC(VBICsubsSIBaseBIPtr,VBICsubsSINode,VBICbaseBINode) - TSTALLOC(VBICsubsSIBaseBPPtr,VBICsubsSINode,VBICbaseBPNode) + TSTALLOC(VBICcollCXCollPtr,VBICcollCXNode,VBICcollNode); + TSTALLOC(VBICbaseBXBasePtr,VBICbaseBXNode,VBICbaseNode); + TSTALLOC(VBICemitEIEmitPtr,VBICemitEINode,VBICemitNode); + TSTALLOC(VBICsubsSISubsPtr,VBICsubsSINode,VBICsubsNode); + TSTALLOC(VBICcollCICollCXPtr,VBICcollCINode,VBICcollCXNode); + TSTALLOC(VBICbaseBICollCXPtr,VBICbaseBINode,VBICcollCXNode); + TSTALLOC(VBICbaseBPCollCXPtr,VBICbaseBPNode,VBICcollCXNode); + TSTALLOC(VBICbaseBXCollCIPtr,VBICbaseBXNode,VBICcollCINode); + TSTALLOC(VBICbaseBICollCIPtr,VBICbaseBINode,VBICcollCINode); + TSTALLOC(VBICemitEICollCIPtr,VBICemitEINode,VBICcollCINode); + TSTALLOC(VBICbaseBPCollCIPtr,VBICbaseBPNode,VBICcollCINode); + TSTALLOC(VBICbaseBIBaseBXPtr,VBICbaseBINode,VBICbaseBXNode); + TSTALLOC(VBICemitEIBaseBXPtr,VBICemitEINode,VBICbaseBXNode); + TSTALLOC(VBICbaseBPBaseBXPtr,VBICbaseBPNode,VBICbaseBXNode); + TSTALLOC(VBICsubsSIBaseBXPtr,VBICsubsSINode,VBICbaseBXNode); + TSTALLOC(VBICemitEIBaseBIPtr,VBICemitEINode,VBICbaseBINode); + TSTALLOC(VBICbaseBPBaseBIPtr,VBICbaseBPNode,VBICbaseBINode); + TSTALLOC(VBICsubsSICollCIPtr,VBICsubsSINode,VBICcollCINode); + TSTALLOC(VBICsubsSIBaseBIPtr,VBICsubsSINode,VBICbaseBINode); + TSTALLOC(VBICsubsSIBaseBPPtr,VBICsubsSINode,VBICbaseBPNode); } } diff --git a/src/spicelib/devices/vccs/vccsset.c b/src/spicelib/devices/vccs/vccsset.c index 16e951218..0399385e2 100644 --- a/src/spicelib/devices/vccs/vccsset.c +++ b/src/spicelib/devices/vccs/vccsset.c @@ -36,14 +36,14 @@ VCCSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(VCCSposContPosptr, VCCSposNode, VCCScontPosNode) - TSTALLOC(VCCSposContNegptr, VCCSposNode, VCCScontNegNode) - TSTALLOC(VCCSnegContPosptr, VCCSnegNode, VCCScontPosNode) - TSTALLOC(VCCSnegContNegptr, VCCSnegNode, VCCScontNegNode) + TSTALLOC(VCCSposContPosptr, VCCSposNode, VCCScontPosNode); + TSTALLOC(VCCSposContNegptr, VCCSposNode, VCCScontNegNode); + TSTALLOC(VCCSnegContPosptr, VCCSnegNode, VCCScontPosNode); + TSTALLOC(VCCSnegContNegptr, VCCSnegNode, VCCScontNegNode); } } return(OK); diff --git a/src/spicelib/devices/vcvs/vcvsset.c b/src/spicelib/devices/vcvs/vcvsset.c index b34db5d5e..33ad194d2 100644 --- a/src/spicelib/devices/vcvs/vcvsset.c +++ b/src/spicelib/devices/vcvs/vcvsset.c @@ -46,16 +46,16 @@ VCVSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(VCVSposIbrptr, VCVSposNode, VCVSbranch) - TSTALLOC(VCVSnegIbrptr, VCVSnegNode, VCVSbranch) - TSTALLOC(VCVSibrPosptr, VCVSbranch, VCVSposNode) - TSTALLOC(VCVSibrNegptr, VCVSbranch, VCVSnegNode) - TSTALLOC(VCVSibrContPosptr, VCVSbranch, VCVScontPosNode) - TSTALLOC(VCVSibrContNegptr, VCVSbranch, VCVScontNegNode) + TSTALLOC(VCVSposIbrptr, VCVSposNode, VCVSbranch); + TSTALLOC(VCVSnegIbrptr, VCVSnegNode, VCVSbranch); + TSTALLOC(VCVSibrPosptr, VCVSbranch, VCVSposNode); + TSTALLOC(VCVSibrNegptr, VCVSbranch, VCVSnegNode); + TSTALLOC(VCVSibrContPosptr, VCVSbranch, VCVScontPosNode); + TSTALLOC(VCVSibrContNegptr, VCVSbranch, VCVScontNegNode); } } return(OK); diff --git a/src/spicelib/devices/vsrc/vsrcpzs.c b/src/spicelib/devices/vsrc/vsrcpzs.c index 616802832..42b125cbd 100644 --- a/src/spicelib/devices/vsrc/vsrcpzs.c +++ b/src/spicelib/devices/vsrc/vsrcpzs.c @@ -38,15 +38,15 @@ VSRCpzSetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(VSRCposIbrptr, VSRCposNode, VSRCbranch) - TSTALLOC(VSRCnegIbrptr, VSRCnegNode, VSRCbranch) - TSTALLOC(VSRCibrNegptr, VSRCbranch, VSRCnegNode) - TSTALLOC(VSRCibrPosptr, VSRCbranch, VSRCposNode) - TSTALLOC(VSRCibrIbrptr, VSRCbranch, VSRCbranch) + TSTALLOC(VSRCposIbrptr, VSRCposNode, VSRCbranch); + TSTALLOC(VSRCnegIbrptr, VSRCnegNode, VSRCbranch); + TSTALLOC(VSRCibrNegptr, VSRCbranch, VSRCnegNode); + TSTALLOC(VSRCibrPosptr, VSRCbranch, VSRCposNode); + TSTALLOC(VSRCibrIbrptr, VSRCbranch, VSRCbranch); } } return(OK); diff --git a/src/spicelib/devices/vsrc/vsrcset.c b/src/spicelib/devices/vsrc/vsrcset.c index 0428bbc86..79160d7a0 100644 --- a/src/spicelib/devices/vsrc/vsrcset.c +++ b/src/spicelib/devices/vsrc/vsrcset.c @@ -45,14 +45,14 @@ VSRCsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state) /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ +do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ -} +} } while(0) - TSTALLOC(VSRCposIbrptr, VSRCposNode, VSRCbranch) - TSTALLOC(VSRCnegIbrptr, VSRCnegNode, VSRCbranch) - TSTALLOC(VSRCibrNegptr, VSRCbranch, VSRCnegNode) - TSTALLOC(VSRCibrPosptr, VSRCbranch, VSRCposNode) + TSTALLOC(VSRCposIbrptr, VSRCposNode, VSRCbranch); + TSTALLOC(VSRCnegIbrptr, VSRCnegNode, VSRCbranch); + TSTALLOC(VSRCibrNegptr, VSRCbranch, VSRCnegNode); + TSTALLOC(VSRCibrPosptr, VSRCbranch, VSRCposNode); } } return(OK); diff --git a/src/xspice/mif/mifsetup.c b/src/xspice/mif/mifsetup.c index cd9a3b365..5e10ad61c 100644 --- a/src/xspice/mif/mifsetup.c +++ b/src/xspice/mif/mifsetup.c @@ -56,17 +56,17 @@ NON-STANDARD FEATURES /* define macro for easy creation of matrix entries/pointers for outputs */ #define TSTALLOC(ptr,first,second) \ - if((smp_data_out->ptr = \ + do { if((smp_data_out->ptr = \ SMPmakeElt(matrix, smp_data_out->first, smp_data_out->second)) == NULL) { \ return(E_NOMEM); \ - } + } } while(0) /* define macro for easy creation of matrix entries/pointers for inputs */ #define CTSTALLOC(ptr,first,second) \ - if((smp_data_out->input[k].port[l].ptr = \ + do { if((smp_data_out->input[k].port[l].ptr = \ SMPmakeElt(matrix, smp_data_out->first, smp_data_cntl->second)) == NULL) { \ return(E_NOMEM); \ - } + } } while(0) From a798e8b7f3b902c8b0a074ba0b62fd74d48c6e42 Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 7 Jun 2013 21:21:52 +0200 Subject: [PATCH 163/257] inpcom.c, minor rewrites --- src/frontend/inpcom.c | 57 +++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d0111b547..d99792c91 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -162,11 +162,9 @@ find_lib(char *name) static struct line * -find_section_definition(struct line *deck, char *name) +find_section_definition(struct line *c, char *name) { - struct line *c; - - for (c = deck; c; c = c->li_next) { + for (; c; c = c->li_next) { char *line = c->li_line; if (ciprefix(".lib", line)) { char *s, *t, *y; @@ -893,7 +891,7 @@ inp_pathopen(char *name, char *mode) return (fopen(name, mode)); #endif - while (v) { + for (; v; v = v->va_next) { switch (v->va_type) { case CP_STRING: cp_wstrip(v->va_string); @@ -912,7 +910,6 @@ inp_pathopen(char *name, char *mode) } if ((fp = fopen(buf, mode)) != NULL) return (fp); - v = v->va_next; } return (NULL); } @@ -2562,8 +2559,6 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck { struct line *c; struct line *d, *p = NULL; - char *inst_line; - char *subckt_line; char *subckt_name; char *subckt_param_names[1000]; char *subckt_param_values[1000]; @@ -2580,7 +2575,7 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck // first iterate through instances and find occurences where 'm' multiplier needs to be // added to the subcircuit -- subsequent instances will then need this parameter as well for (c = deck; c; c = c->li_next) { - inst_line = c->li_line; + char *inst_line = c->li_line; if (*inst_line == '*') continue; @@ -2593,7 +2588,7 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck flag = FALSE; // iterate through the deck to find the subckt (last one defined wins) for (d = deck; d; d = d->li_next) { - subckt_line = d->li_line; + char *subckt_line = d->li_line; if (ciprefix(".subckt", subckt_line)) { subckt_line = skip_non_ws(subckt_line); subckt_line = skip_ws(subckt_line); @@ -2625,12 +2620,10 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck } } - c = deck; - while (c != NULL) { - inst_line = c->li_line; + for (c = deck; c; c = c->li_next) { + char *inst_line = c->li_line; if (*inst_line == '*') { - c = c->li_next; continue; } if (ciprefix("x", inst_line)) { @@ -2644,7 +2637,7 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck d = deck; while (d != NULL) { - subckt_line = d->li_line; + char *subckt_line = d->li_line; if (ciprefix(".subckt", subckt_line)) { subckt_line = skip_non_ws(subckt_line); subckt_line = skip_ws(subckt_line); @@ -2699,7 +2692,6 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck } tfree(subckt_name); } - c = c->li_next; } } @@ -3114,17 +3106,16 @@ inp_expand_macros_in_deck(struct function_env *env, struct line *c) * May be obsolete? */ static void -inp_fix_param_values(struct line *deck) +inp_fix_param_values(struct line *c) { - struct line *c = deck; - char *line, *beg_of_str, *end_of_str, *old_str, *equal_ptr, *new_str; + char *beg_of_str, *end_of_str, *old_str, *equal_ptr, *new_str; char *vec_str, *tmp_str, *natok, *buffer, *newvec, *whereisgt; bool control_section = FALSE; wordlist *nwl; int parens; for (; c; c = c->li_next) { - line = c->li_line; + char *line = c->li_line; if (*line == '*' || (ciprefix(".param", line) && strchr(line, '{'))) continue; @@ -3538,7 +3529,6 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car bool found_in_list = FALSE; struct line *ptr; - char *curr_line; char *str_ptr, *beg, *end, *new_str; int skipped = 0; int arr_size = 12000; @@ -3651,30 +3641,25 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car } /* look for unquoted parameters and quote them */ - ptr = s_c; in_control = FALSE; - while (ptr != NULL && ptr != e_c) { - curr_line = ptr->li_line; + for (ptr = s_c; ptr && ptr != e_c; ptr = ptr->li_next) { + char *curr_line = ptr->li_line; if (ciprefix(".control", curr_line)) { in_control = TRUE; - ptr = ptr->li_next; continue; } if (ciprefix(".endc", curr_line)) { in_control = FALSE; - ptr = ptr->li_next; continue; } if (in_control || curr_line[0] == '.' || curr_line[0] == '*') { - ptr = ptr->li_next; continue; } num_terminals = get_number_terminals(curr_line); if (num_terminals <= 0) { - ptr = ptr->li_next; continue; } @@ -3716,7 +3701,6 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car str_ptr++; } } - ptr = ptr->li_next; } ind = 0; @@ -3764,11 +3748,13 @@ static void inp_add_params_to_subckt(struct names *subckt_w_params, struct line *subckt_card) { struct line *card = subckt_card->li_next; - char *curr_line = card->li_line; char *subckt_line = subckt_card->li_line; char *new_line, *param_ptr, *subckt_name, *end_ptr; - while (card != NULL && ciprefix(".param", curr_line)) { + for (; card; card = card->li_next) { + char *curr_line = card->li_line; + if (!ciprefix(".param", curr_line)) + break; param_ptr = strchr(curr_line, ' '); param_ptr = skip_ws(param_ptr); @@ -3789,9 +3775,6 @@ inp_add_params_to_subckt(struct names *subckt_w_params, struct line *subckt_card subckt_card->li_line = subckt_line = new_line; *curr_line = '*'; - - card = card->li_next; - curr_line = card->li_line; } } @@ -5614,11 +5597,9 @@ tprint(struct line *t) /* prepare .if and .elseif for numparam .if(expression) --> .if{expression} */ static void -inp_dot_if(struct line *deck) +inp_dot_if(struct line *card) { - struct line *card; - - for (card = deck; card; card = card->li_next) { + for (; card; card = card->li_next) { char *curr_line = card->li_line; if (*curr_line == '*') continue; From 41944a62434268ea37fbbf720c5ec491a61690c2 Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 7 Jun 2013 22:23:53 +0200 Subject: [PATCH 164/257] inpcom.c, cleanup `inp_add_params_to_subckt()' --- src/frontend/inpcom.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d99792c91..88f14b6a9 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -3752,9 +3752,12 @@ inp_add_params_to_subckt(struct names *subckt_w_params, struct line *subckt_card char *new_line, *param_ptr, *subckt_name, *end_ptr; for (; card; card = card->li_next) { + char *curr_line = card->li_line; + if (!ciprefix(".param", curr_line)) break; + param_ptr = strchr(curr_line, ' '); param_ptr = skip_ws(param_ptr); @@ -3762,7 +3765,7 @@ inp_add_params_to_subckt(struct names *subckt_w_params, struct line *subckt_card new_line = TMALLOC(char, strlen(subckt_line) + strlen("params: ") + strlen(param_ptr) + 2); sprintf(new_line, "%s params: %s", subckt_line, param_ptr); - subckt_name = skip_non_ws(subckt_card->li_line); + subckt_name = skip_non_ws(subckt_line); subckt_name = skip_ws(subckt_name); end_ptr = skip_non_ws(subckt_name); add_name(subckt_w_params, copy_substring(subckt_name, end_ptr)); @@ -3772,10 +3775,12 @@ inp_add_params_to_subckt(struct names *subckt_w_params, struct line *subckt_card } tfree(subckt_line); - subckt_card->li_line = subckt_line = new_line; + subckt_line = new_line; *curr_line = '*'; } + + subckt_card->li_line = subckt_line; } From 3b3a808213a2d508acfbcc482f81e0a1977ddece Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 7 Jun 2013 22:29:59 +0200 Subject: [PATCH 165/257] inpcom.c, cleanup --- src/frontend/inpcom.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 88f14b6a9..88feb4136 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -664,7 +664,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* find the true .end command out of .endc, .ends, .endl, .end (comments may follow) */ if (ciprefix(".end", buffer)) - if ((buffer[4] == '\0') || (isspace(buffer[4]))) { + if ((buffer[4] == '\0') || isspace(buffer[4])) { found_end = TRUE; *buffer = '*'; } @@ -968,7 +968,7 @@ inp_fix_gnd_name(struct line *c) for (; c; c = c->li_next) { char *gnd = c->li_line; // if there is a comment or no gnd, go to next line - if ((*gnd == '*') || (strstr(gnd, "gnd") == NULL)) + if ((*gnd == '*') || !strstr(gnd, "gnd")) continue; // replace "?gnd?" by "? 0 ?", ? being a ' ' ',' '(' ')'. @@ -1325,7 +1325,7 @@ static char* get_model_type(char *line) { char *beg_ptr; - if (!(ciprefix(".model", line))) + if (!ciprefix(".model", line)) return NULL; beg_ptr = skip_non_ws(line); /* eat .model */ beg_ptr = skip_ws(beg_ptr); @@ -1667,12 +1667,12 @@ inp_fix_ternary_operator_str(char *line, bool all) else str_ptr = strchr(line, ')'); - if ((str_ptr == NULL) && all == FALSE) { + if (!str_ptr && all == FALSE) { fprintf(stderr, "ERROR: mal formed .param, .func or .meas line:\n %s\n", line); controlled_exit(EXIT_FAILURE); } - if ((str_ptr == NULL) && all == TRUE) { + if (!str_ptr && all == TRUE) { fprintf(stderr, "ERROR: mal formed expression in line:\n %s\n", line); fprintf(stderr, " We need parentheses around 'if' clause and nested ternary functions\n"); fprintf(stderr, " like: Rtern4 1 0 '(ut > 0.7) ? 2k : ((ut < 0.3) ? 500 : 1k)'\n"); @@ -2261,7 +2261,7 @@ inp_remove_excess_ws(struct line *c) found_control = TRUE; if (ciprefix(".endc", c->li_line)) found_control = FALSE; - if ((found_control) && (ciprefix("echo", c->li_line))) + if (found_control && ciprefix("echo", c->li_line)) continue; c->li_line = inp_remove_ws(c->li_line); /* freed in fcn */ @@ -4129,7 +4129,7 @@ inp_compat(struct line *card) tfree(str_ptr); str_ptr = gettok_char(&cut_line, '{', FALSE, FALSE); expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */ - if ((!expression) || (!str_ptr)) { + if (!expression || !str_ptr) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); @@ -4321,7 +4321,7 @@ inp_compat(struct line *card) tfree(str_ptr); str_ptr = gettok_char(&cut_line, '{', FALSE, FALSE); expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */ - if ((!expression) || (!str_ptr)) { + if (!expression || !str_ptr) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); From e4a28bc1c3dccadfdec776a740db4a1416af2f48 Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 7 Jun 2013 23:11:52 +0200 Subject: [PATCH 166/257] inpcom.c, rewrite `inp_fix_param_values()' --- src/frontend/inpcom.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 88feb4136..42951db91 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -3340,26 +3340,22 @@ inp_fix_param_values(struct line *c) static char* get_param_name(char *line) { - char *name = NULL, *equal_ptr, *beg; - char keep; + char *beg; + char *equal_ptr = strchr(line, '='); - if ((equal_ptr = strchr(line, '=')) != NULL) { - equal_ptr = skip_back_ws(equal_ptr); - - beg = equal_ptr - 1; - while (!isspace(*beg) && beg != line) - beg--; - if (beg != line) - beg++; - keep = *equal_ptr; - *equal_ptr = '\0'; - name = strdup(beg); - *equal_ptr = keep; - } else { + if (!equal_ptr) { fprintf(stderr, "ERROR: could not find '=' on parameter line '%s'!\n", line); controlled_exit(EXIT_FAILURE); + return NULL; } - return name; + + equal_ptr = skip_back_ws(equal_ptr); + + beg = equal_ptr; + while (beg > line && !isspace(beg[-1])) + beg--; + + return copy_substring(beg, equal_ptr); } From 229385b4391f22aa65cc7a979904f0764b68fbc2 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 8 Jun 2013 17:13:57 +0200 Subject: [PATCH 167/257] inpcom.c, minor cleanup --- src/frontend/inpcom.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 42951db91..1f7de7a86 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2079,7 +2079,6 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) prev_card = end_card; num_params++; - } #else /* patch provided by Ivan Riis Nielsen */ bool done = FALSE; @@ -2119,8 +2118,8 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) else p2 = p1; } - } #endif + } /* now sort parameters in order of dependencies */ inp_sort_params(start_card, end_card, head, start_card, end_card); From 087cc1cb413637bc60ce7436e2f2c93d9350243d Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 8 Jun 2013 17:14:21 +0200 Subject: [PATCH 168/257] inpcom.c, introduce better skip_back functions --- src/frontend/inpcom.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 1f7de7a86..3dc69d5e9 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -115,6 +115,9 @@ static char *skip_back_ws(char *d) { while (isspace(d[-1])) d--; r static char *skip_non_ws(char *d) { while (*d && !isspace(*d)) d++; return d; } static char *skip_ws(char *d) { while (isspace(*d)) d++; return d; } +static char *skip_back_non_ws_(char *d, char *start) { while (d > start && !isspace(d[-1])) d--; return d; } +static char *skip_back_ws_(char *d, char *start) { while (d > start && isspace(d[-1])) d--; return d; } + static void tprint(struct line *deck); #ifndef XSPICE @@ -3350,9 +3353,7 @@ get_param_name(char *line) equal_ptr = skip_back_ws(equal_ptr); - beg = equal_ptr; - while (beg > line && !isspace(beg[-1])) - beg--; + beg = skip_back_non_ws_(equal_ptr, line); return copy_substring(beg, equal_ptr); } From 077d0aee9860e87b85926e956095d83009039aa4 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 8 Jun 2013 17:17:57 +0200 Subject: [PATCH 169/257] inpcom.c, rewrite `chk_for_line_continuation()' --- src/frontend/inpcom.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 3dc69d5e9..800a2b19e 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1170,15 +1170,12 @@ inp_add_control_section(struct line *deck, int *line_number) static bool chk_for_line_continuation(char *line) { - char *ptr = line + strlen(line) - 1; - if (*line != '*' && *line != '$') { - while (ptr >= line && *ptr && isspace(*ptr)) - ptr--; + char *ptr = skip_back_ws_(line + strlen(line), line); - if ((ptr-1) >= line && *ptr == '\\' && *(ptr-1) && *(ptr-1) == '\\') { - *ptr = ' '; - *(ptr-1) = ' '; + if ((ptr - 2 >= line) && (ptr[-1] == '\\') && (ptr[-2] == '\\')) { + ptr[-1] = ' '; + ptr[-2] = ' '; return TRUE; } } From 35ae433aa14f3554ab98fe806392ce82557117fc Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 8 Jun 2013 18:33:08 +0200 Subject: [PATCH 170/257] inpcom.c, use better skip_back functions --- src/frontend/inpcom.c | 46 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 800a2b19e..867bbf457 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1271,15 +1271,15 @@ get_instance_subckt(char *line) // see if instance has parameters if (equal_ptr) { - end_ptr = skip_back_ws(equal_ptr); - end_ptr = skip_back_non_ws(end_ptr); + end_ptr = skip_back_ws_(equal_ptr, line); + end_ptr = skip_back_non_ws_(end_ptr, line); } else { end_ptr = line + strlen(line); } - end_ptr = skip_back_ws(end_ptr); + end_ptr = skip_back_ws_(end_ptr, line); - inst_name_ptr = skip_back_non_ws(end_ptr); + inst_name_ptr = skip_back_non_ws_(end_ptr, line); return copy_substring(inst_name_ptr, end_ptr); } @@ -1340,8 +1340,8 @@ get_adevice_model_name(char *line) { char *ptr_end, *ptr_beg; - ptr_end = skip_back_ws(line + strlen(line)); - ptr_beg = skip_back_non_ws(ptr_end); + ptr_end = skip_back_ws_(line + strlen(line), line); + ptr_beg = skip_back_non_ws_(ptr_end, line); return copy_substring(ptr_beg, ptr_end); } @@ -2025,9 +2025,9 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) /* go to beginning of first parameter word */ /* s will contain only subckt definition */ /* beg will point to start of param list */ - beg = skip_back_ws(equal); - beg = skip_back_non_ws(beg); - beg[-1] = '\0'; + beg = skip_back_ws_(equal, s); + beg = skip_back_non_ws_(beg, s); + beg[-1] = '\0'; /* fixme can be < s */ head = xx_new_line(NULL, NULL, 0, 0); /* create list of parameters that need to get sorted */ @@ -2036,8 +2036,8 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) /* alternative patch to cope with spaces: get expression between braces {...} */ ptr2 = skip_ws(ptr1 + 1); - ptr1 = skip_back_ws(ptr1); - ptr1 = skip_back_non_ws(ptr1); + ptr1 = skip_back_ws_(ptr1, beg); + ptr1 = skip_back_non_ws_(ptr1, beg); /* ptr1 points to beginning of parameter */ /* if parameter is an expression and starts with '{', find closing '}' @@ -2375,14 +2375,14 @@ inp_get_subckt_name(char *s) char *subckt_name, *end_ptr = strchr(s, '='); if (end_ptr) { - end_ptr = skip_back_ws(end_ptr); - end_ptr = skip_back_non_ws(end_ptr); + end_ptr = skip_back_ws_(end_ptr, s); + end_ptr = skip_back_non_ws_(end_ptr, s); } else { end_ptr = s + strlen(s); } - end_ptr = skip_back_ws(end_ptr); - subckt_name = skip_back_non_ws(end_ptr); + end_ptr = skip_back_ws_(end_ptr, s); + subckt_name = skip_back_non_ws_(end_ptr, s); return copy_substring(subckt_name, end_ptr); } @@ -2403,8 +2403,8 @@ inp_get_params(char *line, char *param_names[], char *param_values[]) is_expression = FALSE; /* get parameter name */ - end = skip_back_ws(equal_ptr); - name = skip_back_non_ws(end); + end = skip_back_ws_(equal_ptr, line); + name = skip_back_non_ws_(end, line); param_names[num_params++] = copy_substring(name, end); @@ -2454,9 +2454,9 @@ inp_fix_inst_line(char *inst_line, end = strchr(inst_line, '='); if (end) { - end = skip_back_ws(end); - end = skip_back_non_ws(end); - end[-1] = '\0'; + end = skip_back_ws_(end, inst_line); + end = skip_back_non_ws_(end, inst_line); + end[-1] = '\0'; /* fixme can be < inst_line */ } for (i = 0; i < num_subckt_params; i++) @@ -3348,7 +3348,7 @@ get_param_name(char *line) return NULL; } - equal_ptr = skip_back_ws(equal_ptr); + equal_ptr = skip_back_ws_(equal_ptr, line); beg = skip_back_non_ws_(equal_ptr, line); @@ -3940,8 +3940,8 @@ inp_split_multi_param_lines(struct line *card, int line_num) bool get_expression = FALSE; bool get_paren_expression = FALSE; - beg_param = skip_back_ws(equal_ptr); - beg_param = skip_back_non_ws(beg_param); + beg_param = skip_back_ws_(equal_ptr, curr_line); + beg_param = skip_back_non_ws_(beg_param, curr_line); end_param = skip_ws(equal_ptr + 1); while (*end_param != '\0' && (!isspace(*end_param) || get_expression || get_paren_expression)) { if (*end_param == '{') From 11ed05191f5c14d9147b3ae543e54523b26139c3 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 8 Jun 2013 12:09:26 +0200 Subject: [PATCH 171/257] inpcom.c, use strchr(,'\0') --- src/frontend/inpcom.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 867bbf457..84acf7e5d 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1171,7 +1171,7 @@ static bool chk_for_line_continuation(char *line) { if (*line != '*' && *line != '$') { - char *ptr = skip_back_ws_(line + strlen(line), line); + char *ptr = skip_back_ws_(strchr(line, '\0'), line); if ((ptr - 2 >= line) && (ptr[-1] == '\\') && (ptr[-2] == '\\')) { ptr[-1] = ' '; @@ -1274,7 +1274,7 @@ get_instance_subckt(char *line) end_ptr = skip_back_ws_(equal_ptr, line); end_ptr = skip_back_non_ws_(end_ptr, line); } else { - end_ptr = line + strlen(line); + end_ptr = strchr(line, '\0'); } end_ptr = skip_back_ws_(end_ptr, line); @@ -1340,7 +1340,7 @@ get_adevice_model_name(char *line) { char *ptr_end, *ptr_beg; - ptr_end = skip_back_ws_(line + strlen(line), line); + ptr_end = skip_back_ws_(strchr(line, '\0'), line); ptr_beg = skip_back_non_ws_(ptr_end, line); return copy_substring(ptr_beg, ptr_end); } @@ -2378,7 +2378,7 @@ inp_get_subckt_name(char *s) end_ptr = skip_back_ws_(end_ptr, s); end_ptr = skip_back_non_ws_(end_ptr, s); } else { - end_ptr = s + strlen(s); + end_ptr = strchr(s, '\0'); } end_ptr = skip_back_ws_(end_ptr, s); From 0dfbbbedceded127edc1f661a41cd97bebac412e Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 8 Jun 2013 22:09:45 +0200 Subject: [PATCH 172/257] inpcom.c, cleanup --- src/frontend/inpcom.c | 134 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 123 insertions(+), 11 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 84acf7e5d..dbcdc5b9b 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -157,9 +157,11 @@ static struct library * find_lib(char *name) { int i; + for (i = 0; i < num_libraries; i++) if (cieq(libraries[i].name, name)) return & libraries[i]; + return NULL; } @@ -168,9 +170,13 @@ static struct line * find_section_definition(struct line *c, char *name) { for (; c; c = c->li_next) { + char *line = c->li_line; + if (ciprefix(".lib", line)) { + char *s, *t, *y; + s = skip_non_ws(line); while (isspace(*s) || isquote(*s)) s++; @@ -403,6 +409,7 @@ find_assignment(char *str) ... debug printout to debug-out.txt *-------------------------------------------------------------------------*/ + struct line * inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile) /* fp: in, pointer to file to be read, @@ -839,6 +846,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile (int) max_line_length, no_braces, dynmaxline); } } + return cc; } @@ -848,6 +856,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile if the file isn't in . and it isn't an abs path name. For MS Windows: First try the path of the source file. *-------------------------------------------------------------------------*/ + FILE * inp_pathopen(char *name, char *mode) { @@ -857,6 +866,7 @@ inp_pathopen(char *name, char *mode) #if defined(HAS_WINGUI) char buf2[BSIZE_SP]; + /* search in the path where the source (input) file has been found, but only if "name" is just a file name */ if (!strchr(name, DIR_TERM) && !strchr(name, DIR_TERM_LINUX) && cp_getvar("sourcefile", CP_STRING, buf2)) { @@ -878,6 +888,7 @@ inp_pathopen(char *name, char *mode) if ((fp = fopen(buf2, mode)) != NULL) return (fp); } + /* If this is an abs pathname, or there is no sourcepath var, just * do an fopen. */ @@ -886,15 +897,16 @@ inp_pathopen(char *name, char *mode) return (fopen(name, mode)); #else - /* If this is an abs pathname, or there is no sourcepath var, just * do an fopen. */ if (strchr(name, DIR_TERM) || !cp_getvar("sourcepath", CP_LIST, &v)) return (fopen(name, mode)); + #endif for (; v; v = v->va_next) { + switch (v->va_type) { case CP_STRING: cp_wstrip(v->va_string); @@ -906,17 +918,20 @@ inp_pathopen(char *name, char *mode) case CP_REAL: /* This is foolish */ (void) sprintf(buf, "%g%s%s", v->va_real, DIR_PATHSEP, name); break; - default: { + default: fprintf(stderr, "ERROR: enumeration value `CP_BOOL' or `CP_LIST' not handled in inp_pathopen\nAborting...\n"); controlled_exit(EXIT_FAILURE); + break; } - } + if ((fp = fopen(buf, mode)) != NULL) return (fp); } + return (NULL); } + /*-------------------------------------------------------------------------* * This routine reads a line (of arbitrary length), up to a '\n' or 'EOF' * * and returns a pointer to the resulting null terminated string. * @@ -924,6 +939,7 @@ inp_pathopen(char *name, char *mode) * From: jason@ucbopal.BERKELEY.EDU (Jason Venner) * * Newsgroups: net.sources * *-------------------------------------------------------------------------*/ + #define STRGROW 256 static char * @@ -938,38 +954,48 @@ readline(FILE *fd) memlen = STRGROW; strptr = TMALLOC(char, memlen); memlen -= 1; /* Save constant -1's in while loop */ + while ((c = getc(fd)) != EOF) { + if (strlen == 0 && (c == '\t' || c == ' ')) /* Leading spaces away */ continue; + strptr[strlen++] = (char) c; + if (strlen >= memlen) { memlen += STRGROW; if ((strptr = TREALLOC(char, strptr, memlen + 1)) == NULL) return (NULL); } + if (c == '\n') break; } + if (!strlen) { tfree(strptr); return (NULL); } + // strptr[strlen] = '\0'; /* Trim the string */ strptr = TREALLOC(char, strptr, strlen + 1); strptr[strlen] = '\0'; + return (strptr); } /* replace "gnd" by " 0 " Delimiters of gnd may be ' ' or ',' or '(' or ')' */ + static void inp_fix_gnd_name(struct line *c) { - for (; c; c = c->li_next) { + char *gnd = c->li_line; + // if there is a comment or no gnd, go to next line if ((*gnd == '*') || !strstr(gnd, "gnd")) continue; @@ -982,6 +1008,7 @@ inp_fix_gnd_name(struct line *c) } gnd += 3; } + // now remove the extra white spaces around 0 c->li_line = inp_remove_ws(c->li_line); } @@ -994,6 +1021,7 @@ inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) int skip_control = 0; for (; c; c = c->li_next) { + char *line = c->li_line; /* there is no e source inside .control ... .endc */ @@ -1114,19 +1142,24 @@ inp_add_control_section(struct line *deck, int *line_number) char *op_line = NULL, rawfile[1000], *line; for (c = deck; c; c = c->li_next) { + if (*c->li_line == '*') continue; + if (ciprefix(".op ", c->li_line)) { *c->li_line = '*'; op_line = c->li_line + 1; } + if (ciprefix(".end", c->li_line)) found_end = TRUE; + if (found_control && ciprefix("run", c->li_line)) found_run = TRUE; if (ciprefix(".control", c->li_line)) found_control = TRUE; + if (ciprefix(".endc", c->li_line)) { found_control = FALSE; @@ -1135,6 +1168,7 @@ inp_add_control_section(struct line *deck, int *line_number) prev_card = prev_card->li_next; found_run = TRUE; } + if (cp_getvar("rawfile", CP_STRING, rawfile)) { line = TMALLOC(char, strlen("write") + strlen(rawfile) + 2); sprintf(line, "write %s", rawfile); @@ -1142,6 +1176,7 @@ inp_add_control_section(struct line *deck, int *line_number) prev_card = prev_card->li_next; } } + prev_card = c; } @@ -1167,10 +1202,12 @@ inp_add_control_section(struct line *deck, int *line_number) // look for shell-style end-of-line continuation '\\' + static bool chk_for_line_continuation(char *line) { if (*line != '*' && *line != '$') { + char *ptr = skip_back_ws_(strchr(line, '\0'), line); if ((ptr - 2 >= line) && (ptr[-1] == '\\') && (ptr[-2] == '\\')) { @@ -1237,6 +1274,7 @@ inp_fix_macro_param_func_paren_io(struct line *card) card->li_line = inp_remove_ws(card->li_line); /* remove the extra white spaces just introduced */ } } + if (ciprefix(".param", card->li_line)) { bool is_func = FALSE; str_ptr = skip_non_ws(card->li_line); // skip over .param @@ -1280,6 +1318,7 @@ get_instance_subckt(char *line) end_ptr = skip_back_ws_(end_ptr, line); inst_name_ptr = skip_back_non_ws_(end_ptr, line); + return copy_substring(inst_name_ptr, end_ptr); } @@ -1293,6 +1332,7 @@ get_subckt_model_name(char *line) name = skip_ws(name); end_ptr = skip_non_ws(name); + return copy_substring(name, end_ptr); } @@ -1310,6 +1350,7 @@ get_model_name(char *line, int num_terminals) beg_ptr = skip_non_ws(beg_ptr); beg_ptr = skip_ws(beg_ptr); } + if (*line == 'r') /* special dealing for r models */ if ((*beg_ptr == '+') || (*beg_ptr == '-') || isdigit(*beg_ptr)) { /* looking for a value before model */ beg_ptr = skip_non_ws(beg_ptr); /* skip the value */ @@ -1317,6 +1358,7 @@ get_model_name(char *line, int num_terminals) } end_ptr = skip_non_ws(beg_ptr); + return copy_substring(beg_ptr, end_ptr); } @@ -1325,12 +1367,16 @@ static char* get_model_type(char *line) { char *beg_ptr; + if (!ciprefix(".model", line)) return NULL; + beg_ptr = skip_non_ws(line); /* eat .model */ beg_ptr = skip_ws(beg_ptr); + beg_ptr = skip_non_ws(beg_ptr); /* eat model name */ beg_ptr = skip_ws(beg_ptr); + return gettok(&beg_ptr); } @@ -1342,6 +1388,7 @@ get_adevice_model_name(char *line) ptr_end = skip_back_ws_(strchr(line, '\0'), line); ptr_beg = skip_back_non_ws_(ptr_end, line); + return copy_substring(ptr_beg, ptr_end); } @@ -1358,6 +1405,7 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, int i, num_terminals = 0, tmp_cnt = 0; for (card = start_card; card; card = card->li_next) { + char *line = card->li_line; if (*line == '*') @@ -1374,6 +1422,7 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, tfree(curr_subckt_name); } + if (found_subckt) { if (*line == 'x') { inst_subckt_name = get_instance_subckt(line); @@ -1431,6 +1480,7 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, } } } + // now make recursive call on instances just found above for (i = 0; i < tmp_cnt; i++) get_subckts_for_subckt(start_card, new_names[i], used_subckt_names, num_used_subckt_names, @@ -1441,6 +1491,7 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, /* check if current token matches model bin name -- .[0-9]+ */ + static bool model_bin_match(char *token, char *model_name) { @@ -1469,6 +1520,7 @@ model_bin_match(char *token, char *model_name) (don't want to waste time processing everything) also comment out .param lines with no parameters defined */ + static void comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) { @@ -1482,6 +1534,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) with 1000, but increase, if number of lines in deck is larger */ if (no_of_lines < 1000) no_of_lines = 1000; + used_subckt_names = TMALLOC(char*, no_of_lines); used_model_names = TMALLOC(char*, no_of_lines); @@ -1495,6 +1548,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) } for (card = start_card; card; card = card->li_next) { + char *line = card->li_line; if (*line == '*') @@ -1578,6 +1632,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) } /* if (has_models) */ } /* if (!processing_subckt) */ } /* for loop through all cards */ + for (i = 0; i < tmp_cnt; i++) get_subckts_for_subckt (start_card, used_subckt_names[i], @@ -1586,6 +1641,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) /* comment out any unused subckts, currently only at top level */ for (card = start_card; card; card = card->li_next) { + char *line = card->li_line; if (*line == '*') @@ -1603,6 +1659,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) } tfree(subckt_name); } + if (ciprefix(".ends", line) || ciprefix(".eom", line)) { nested_subckt--; if (remove_subckt) @@ -1610,6 +1667,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) if (nested_subckt == 0) remove_subckt = FALSE; } + if (remove_subckt) *line = '*'; else if (has_models && @@ -1638,6 +1696,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) tfree(model_name); } } + for (i = 0; i < num_used_subckt_names; i++) tfree(used_subckt_names[i]); for (i = 0; i < num_used_model_names; i++) @@ -1649,6 +1708,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) /* replace ternary operator ? : by fcn ternary_fcn() in .param, .func, and .meas lines, if all is FALSE, for all lines if all is TRUE */ + static char* inp_fix_ternary_operator_str(char *line, bool all) { @@ -1685,6 +1745,7 @@ inp_fix_ternary_operator_str(char *line, bool all) } else { return line; } + all = TRUE; // get conditional question = strchr(str_ptr, '?'); @@ -1821,21 +1882,25 @@ inp_fix_ternary_operator(struct line *card) bool found_control = FALSE; for (; card; card = card->li_next) { + char *line = card->li_line; if (*line == '*') continue; + /* exclude replacement of ternary function between .control and .endc */ if (ciprefix(".control", line)) found_control = TRUE; if (ciprefix(".endc", line)) found_control = FALSE; + if (found_control) continue; /* ternary operator for B source done elsewhere */ if (*line == 'B' || *line == 'b') continue; + /* .param, .func, and .meas lines handled here (2nd argument FALSE) */ if (strchr(line, '?') && strchr(line, ':')) card->li_line = inp_fix_ternary_operator_str(line, FALSE); @@ -1847,6 +1912,7 @@ inp_fix_ternary_operator(struct line *card) removes " " quotes, returns lower case letters, replaces non-printable characterss with '_' * *-------------------------------------------------------------------------*/ + void inp_casefix(char *string) { @@ -1904,6 +1970,7 @@ inp_stripcomments_deck(struct line *c) the whole line is converted to a normal comment line (i.e. one that begins with a '*'). BUG: comment characters in side of string literals are not ignored. */ + static void inp_stripcomments_line(char *s) { @@ -2150,6 +2217,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) s = buffer; } + return s; } @@ -2214,12 +2282,14 @@ inp_remove_ws(char *s) modify .subckt lines by calling inp_fix_subckt() No changes to lines in .control section ! */ + static void inp_fix_for_numparam(struct names *subckt_w_params, struct line *c) { bool found_control = FALSE; for (; c; c = c->li_next) { + if (ciprefix(".lib", c->li_line) || ciprefix("*lib", c->li_line) || ciprefix("*inc", c->li_line)) continue; @@ -2228,6 +2298,7 @@ inp_fix_for_numparam(struct names *subckt_w_params, struct line *c) found_control = TRUE; if (ciprefix(".endc", c->li_line)) found_control = FALSE; + if (found_control) continue; @@ -2251,7 +2322,9 @@ static void inp_remove_excess_ws(struct line *c) { bool found_control = FALSE; + for (; c; c = c->li_next) { + if (*c->li_line == '*') continue; @@ -2260,6 +2333,7 @@ inp_remove_excess_ws(struct line *c) found_control = TRUE; if (ciprefix(".endc", c->li_line)) found_control = FALSE; + if (found_control && ciprefix("echo", c->li_line)) continue; @@ -2487,9 +2561,11 @@ inp_fix_inst_line(char *inst_line, return curr_line; } + /* If multiplier parameter 'm' is found on a X line, flag is set to TRUE. Function is called from inp_fix_inst_calls_for_numparam()*/ + static bool found_mult_param(int num_params, char *param_names[]) { @@ -2502,6 +2578,7 @@ found_mult_param(int num_params, char *param_names[]) return FALSE; } + /* If a subcircuit invocation (X-line) is found, which contains the multiplier parameter 'm', m is added to all lines inside the corresponding subcircuit except of some excluded in the code below @@ -2509,6 +2586,7 @@ found_mult_param(int num_params, char *param_names[]) for all devices that are not supporting the 'm' parameter). Function is called from inp_fix_inst_calls_for_numparam()*/ + static int inp_fix_subckt_multiplier(struct names *subckt_w_params, struct line *subckt_card, int num_subckt_params, char *subckt_param_names[], char *subckt_param_values[]) @@ -2586,6 +2664,7 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck if (found_mult_param(num_inst_params, inst_param_names)) { flag = FALSE; // iterate through the deck to find the subckt (last one defined wins) + for (d = deck; d; d = d->li_next) { char *subckt_line = d->li_line; if (ciprefix(".subckt", subckt_line)) { @@ -2622,9 +2701,9 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck for (c = deck; c; c = c->li_next) { char *inst_line = c->li_line; - if (*inst_line == '*') { + if (*inst_line == '*') continue; - } + if (ciprefix("x", inst_line)) { subckt_name = inp_get_subckt_name(inst_line); @@ -2843,12 +2922,14 @@ inp_do_macro_param_replace(struct function *fcn, char *params[]) return strdup(fcn->macro); for (i = 0; i < fcn->num_parameters; i++) { + if (curr_str == NULL) { search_ptr = curr_ptr = fcn->macro; } else { search_ptr = curr_ptr = curr_str; curr_str = NULL; } + while ((param_ptr = strstr(search_ptr, fcn->params[i])) != NULL) { /* make sure actually have the parameter name */ @@ -2884,6 +2965,7 @@ inp_do_macro_param_replace(struct function *fcn, char *params[]) *param_ptr = keep; search_ptr = curr_ptr = param_ptr + strlen(fcn->params[i]); } + if (param_ptr == NULL) { if (curr_str == NULL) { curr_str = curr_ptr; @@ -2895,6 +2977,7 @@ inp_do_macro_param_replace(struct function *fcn, char *params[]) } } } + return curr_str; } @@ -3087,6 +3170,7 @@ inp_expand_macros_in_deck(struct function_env *env, struct line *c) } env = delete_function_env(env); + return c; } @@ -3104,6 +3188,7 @@ inp_expand_macros_in_deck(struct function_env *env, struct line *c) * Usage of numparam requires {} around the parameters in the .cmodel line. * May be obsolete? */ + static void inp_fix_param_values(struct line *c) { @@ -3123,6 +3208,7 @@ inp_fix_param_values(struct line *c) control_section = TRUE; continue; } + if (ciprefix(".endc", line)) { control_section = FALSE; continue; @@ -3369,7 +3455,6 @@ get_param_str(char *line) static int -//inp_get_param_level(int param_num, char *depends_on[12000][100], char *param_names[12000], char *param_strs[12000], int total_params, int *level) inp_get_param_level(int param_num, char ***depends_on, char **param_names, char **param_strs, int total_params, int *level) { int index1 = 0, comp_level = 0, temp_level = 0; @@ -3395,7 +3480,9 @@ inp_get_param_level(int param_num, char ***depends_on, char **param_names, char comp_level = temp_level; index1++; } + level[param_num] = comp_level; + return comp_level; } @@ -3512,6 +3599,7 @@ get_number_terminals(char *c) /* sort parameters based on parameter dependencies */ + static void inp_sort_params(struct line *start_card, struct line *end_card, struct line *card_bf_start, struct line *s_c, struct line *e_c) { @@ -3540,6 +3628,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car return; /* determine the number of lines with .param */ + for (ptr = start_card; ptr; ptr = ptr->li_next) if (strchr(ptr->li_line, '=')) num_params++; @@ -3634,27 +3723,29 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car } /* look for unquoted parameters and quote them */ + in_control = FALSE; for (ptr = s_c; ptr && ptr != e_c; ptr = ptr->li_next) { + char *curr_line = ptr->li_line; if (ciprefix(".control", curr_line)) { in_control = TRUE; continue; } + if (ciprefix(".endc", curr_line)) { in_control = FALSE; continue; } - if (in_control || curr_line[0] == '.' || curr_line[0] == '*') { + + if (in_control || curr_line[0] == '.' || curr_line[0] == '*') continue; - } num_terminals = get_number_terminals(curr_line); - if (num_terminals <= 0) { + if (num_terminals <= 0) continue; - } for (i = 0; i < num_params; i++) { str_ptr = curr_line; @@ -3906,6 +3997,7 @@ inp_reorder_params(struct names *subckt_w_params, struct line *deck, struct line // // split line up into multiple lines and place those new lines immediately // afetr the current multi-param line in the deck + static int inp_split_multi_param_lines(struct line *card, int line_num) { @@ -4043,6 +4135,7 @@ inp_split_multi_param_lines(struct line *card, int line_num) Bxxx n1 n2 V = v(n-aux) * 1e-16 */ + static void inp_compat(struct line *card) { @@ -5073,8 +5166,10 @@ inp_compat(struct line *card) } } + /* replace a token (length 4 char) in string by spaces, if it is found at the correct position and the total number of tokens is o.k. */ + static void replace_token(char *string, char *token, int wherereplace, int total) { @@ -5540,18 +5635,24 @@ inp_add_series_resistor(struct line *deck) tfree(rval); } + /* If XSPICE option is not selected, run this function to alert and exit if the 'poly' option is found in e, g, f, or h controlled sources. */ #ifndef XSPICE + static void inp_poly_err(struct line *card) { size_t skip_control = 0; + for (; card; card = card->li_next) { + char *curr_line = card->li_line; + if (*curr_line == '*') continue; + /* exclude any command inside .control ... .endc */ if (ciprefix(".control", curr_line)) { skip_control ++; @@ -5562,6 +5663,7 @@ inp_poly_err(struct line *card) } else if (skip_control > 0) { continue; } + /* get the fourth token in a controlled source line and exit, if it is 'poly' */ if ((ciprefix("e", curr_line)) || (ciprefix("g", curr_line)) || @@ -5581,26 +5683,36 @@ inp_poly_err(struct line *card) } } } + #endif + + static void tprint(struct line *t) { /*debug: print into file*/ FILE *fd = fopen("tprint-out.txt", "w"); + for (; t; t = t->li_next) fprintf(fd, "%d %d %s\n", t->li_linenum_orig, t->li_linenum, t->li_line); + fclose(fd); } + /* prepare .if and .elseif for numparam .if(expression) --> .if{expression} */ + static void inp_dot_if(struct line *card) { for (; card; card = card->li_next) { + char *curr_line = card->li_line; + if (*curr_line == '*') continue; + if (ciprefix(".if", curr_line) || ciprefix(".elseif", curr_line)) { char* firstbr = strchr(curr_line, '('); char* lastbr = strrchr(curr_line, ')'); From 4f2b086e156a5976f84d2f820c1d754829a3c107 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 8 Jun 2013 22:26:20 +0200 Subject: [PATCH 173/257] inpcom.c, whitespace --- src/frontend/inpcom.c | 396 +++++++++++++++++++++--------------------- 1 file changed, 198 insertions(+), 198 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index dbcdc5b9b..04719b70e 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -4,10 +4,10 @@ Author: 1985 Wayne A. Christopher **********/ /* - For dealing with spice input decks and command scripts + For dealing with spice input decks and command scripts - Central function is inp_readall() - */ + Central function is inp_readall() +*/ #include "ngspice/ngspice.h" @@ -375,40 +375,40 @@ find_assignment(char *str) /*------------------------------------------------------------------------- - Read the entire input file and return a pointer to the first line of - the linked list of 'card' records in data. The pointer is stored in - *data. - Called from fcn inp_spsource() in inp.c to load circuit or command files. - Called from fcn com_alter_mod() in device.c to load model files. - Called from here to load .library or .include files. + Read the entire input file and return a pointer to the first line of + the linked list of 'card' records in data. The pointer is stored in + *data. + Called from fcn inp_spsource() in inp.c to load circuit or command files. + Called from fcn com_alter_mod() in device.c to load model files. + Called from here to load .library or .include files. - Procedure: - read in all lines & put them in the struct cc - read next line - process .TITLE line - store contents in string new_title - process .lib lines - read file and library name, open file using fcn inp_pathopen() - read file contents and put into struct libraries[].deck, one entry per .lib line - process .inc lines - read file and library name, open file using fcn inp_pathopen() - read file contents and add lines to cc - make line entry lower case - allow for shell end of line continuation (\\) - add '+' to beginning of next line - add line entry to list cc - add '.global gnd' - add libraries - find library section - add lines - add .end card - strip end-of-line comments - make continuation lines a single line -*** end of processing for command files *** - start preparation of input deck for numparam - ... - debug printout to debug-out.txt - *-------------------------------------------------------------------------*/ + Procedure: + read in all lines & put them in the struct cc + read next line + process .TITLE line + store contents in string new_title + process .lib lines + read file and library name, open file using fcn inp_pathopen() + read file contents and put into struct libraries[].deck, one entry per .lib line + process .inc lines + read file and library name, open file using fcn inp_pathopen() + read file contents and add lines to cc + make line entry lower case + allow for shell end of line continuation (\\) + add '+' to beginning of next line + add line entry to list cc + add '.global gnd' + add libraries + find library section + add lines + add .end card + strip end-of-line comments + make continuation lines a single line + *** end of processing for command files *** + start preparation of input deck for numparam + ... + debug printout to debug-out.txt + *-------------------------------------------------------------------------*/ struct line * inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile) @@ -486,7 +486,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile } } - /* gtri - end - 12/12/90 */ + /* gtri - end - 12/12/90 */ #else buffer = readline(fp); if(!buffer) @@ -643,8 +643,8 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile } /* end of .include handling */ /* loop through 'buffer' until end is reached. Then test for - premature end. If premature end is reached, spew - error and zap the line. */ + premature end. If premature end is reached, spew + error and zap the line. */ { char *s; @@ -739,10 +739,10 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* Now clean up li: remove comments & stitch together continuation lines. */ /* sjb - strip or convert end-of-line comments. - This must be cone before stitching continuation lines. - If the line only contains an end-of-line comment then it is converted - into a normal comment with a '*' at the start. This will then get - stripped in the following code. */ + This must be cone before stitching continuation lines. + If the line only contains an end-of-line comment then it is converted + into a normal comment with a '*' at the start. This will then get + stripped in the following code. */ inp_stripcomments_deck(cc->li_next); inp_stitch_continuation_lines(cc->li_next); @@ -855,7 +855,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile Look up the variable sourcepath and try everything in the list in order if the file isn't in . and it isn't an abs path name. For MS Windows: First try the path of the source file. - *-------------------------------------------------------------------------*/ + *-------------------------------------------------------------------------*/ FILE * inp_pathopen(char *name, char *mode) @@ -871,7 +871,7 @@ inp_pathopen(char *name, char *mode) but only if "name" is just a file name */ if (!strchr(name, DIR_TERM) && !strchr(name, DIR_TERM_LINUX) && cp_getvar("sourcefile", CP_STRING, buf2)) { /* If pathname is found, get path. - (char *dirname(const char *name) might have been used here) */ + (char *dirname(const char *name) might have been used here) */ if (substring(DIR_PATHSEP, buf2) || substring(DIR_PATHSEP_LINUX, buf2)) { int i, j = 0; for (i = 0; i < BSIZE_SP-1; i++) { @@ -1109,8 +1109,8 @@ inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) *a_card->li_line = 'a'; sprintf(big_buf, ".model %s multi_input_pwl ( x = [%s %s] y = [%s %s] model = \"%s\" )", - model_name, xy_values1[0], xy_values2[0], - xy_values1[1], xy_values2[1], fcn_name); + model_name, xy_values1[0], xy_values2[0], + xy_values1[1], xy_values2[1], fcn_name); model_card = xx_new_line(NULL, copy(big_buf), (*line_number)++, 0); tfree(model_name); @@ -1395,9 +1395,9 @@ get_adevice_model_name(char *line) static void get_subckts_for_subckt(struct line *start_card, char *subckt_name, - char *used_subckt_names[], int *num_used_subckt_names, - char *used_model_names[], int *num_used_model_names, - bool has_models) + char *used_subckt_names[], int *num_used_subckt_names, + char *used_model_names[], int *num_used_model_names, + bool has_models) { struct line *card; char *curr_subckt_name, *inst_subckt_name, *model_name, *new_names[100]; @@ -1456,14 +1456,14 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, tmp_name1 = tmp_name = model_name = get_model_name(line, num_terminals); if (isalpha(*model_name) || - /* first character is digit, second is alpha, third is digit, - e.g. 1N4002 */ - ((strlen(model_name) > 2) && isdigit(*tmp_name) && - isalpha(*(++tmp_name)) && isdigit(*(++tmp_name))) || - /* first character is is digit, second is alpha, third is alpha, fourth is digit - e.g. 2SK456 */ - ((strlen(model_name) > 3) && isdigit(*tmp_name1) && isalpha(*(++tmp_name1)) && - isalpha(*(++tmp_name1)) && isdigit(*(++tmp_name1)))) { + /* first character is digit, second is alpha, third is digit, + e.g. 1N4002 */ + ((strlen(model_name) > 2) && isdigit(*tmp_name) && + isalpha(*(++tmp_name)) && isdigit(*(++tmp_name))) || + /* first character is is digit, second is alpha, third is alpha, fourth is digit + e.g. 2SK456 */ + ((strlen(model_name) > 3) && isdigit(*tmp_name1) && isalpha(*(++tmp_name1)) && + isalpha(*(++tmp_name1)) && isdigit(*(++tmp_name1)))) { found_model = FALSE; for (i = 0; i < *num_used_model_names; i++) if (strcmp(used_model_names[i], model_name) == 0) found_model = TRUE; @@ -1484,13 +1484,13 @@ get_subckts_for_subckt(struct line *start_card, char *subckt_name, // now make recursive call on instances just found above for (i = 0; i < tmp_cnt; i++) get_subckts_for_subckt(start_card, new_names[i], used_subckt_names, num_used_subckt_names, - used_model_names, num_used_model_names, has_models); + used_model_names, num_used_model_names, has_models); } /* check if current token matches model bin name -- .[0-9]+ - */ +*/ static bool model_bin_match(char *token, char *model_name) @@ -1519,7 +1519,7 @@ model_bin_match(char *token, char *model_name) iterate through the deck and comment out unused subckts, models (don't want to waste time processing everything) also comment out .param lines with no parameters defined - */ +*/ static void comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) @@ -1531,7 +1531,7 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) int skip_control = 0, nested_subckt = 0; /* generate arrays of *char for subckt or model names. Start - with 1000, but increase, if number of lines in deck is larger */ + with 1000, but increase, if number of lines in deck is larger */ if (no_of_lines < 1000) no_of_lines = 1000; @@ -1593,8 +1593,8 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) tfree(model_name); } else if (has_models) { /* This is a preliminary version, until we have found a reliable - method to detect the model name out of the input line (Many - options have to be taken into account.). */ + method to detect the model name out of the input line (Many + options have to be taken into account.). */ num_terminals = get_number_terminals(line); if (num_terminals != 0) { bool model_ok = FALSE; @@ -1604,18 +1604,18 @@ comment_out_unused_subckt_models(struct line *start_card, int no_of_lines) if (isalpha(*model_name)) model_ok = TRUE; /* first character is digit, second is alpha, third is digit, - e.g. 1N4002 */ + e.g. 1N4002 */ else if ((strlen(model_name) > 2) && isdigit(*tmp_name) && isalpha(*(++tmp_name)) && isdigit(*(++tmp_name))) model_ok = TRUE; /* first character is is digit, second is alpha, third is alpha, fourth is digit - e.g. 2SK456 */ + e.g. 2SK456 */ else if ((strlen(model_name) > 3) && isdigit(*tmp_name1) && isalpha(*(++tmp_name1)) && isalpha(*(++tmp_name1)) && isdigit(*(++tmp_name1))) model_ok = TRUE; /* Check if model has already been recognized, if not, add its name to - list used_model_names[i] */ + list used_model_names[i] */ if (model_ok) { found_model = FALSE; for (i = 0; i < num_used_model_names; i++) @@ -1909,9 +1909,9 @@ inp_fix_ternary_operator(struct line *card) /*-------------------------------------------------------------------------* - removes " " quotes, returns lower case letters, - replaces non-printable characterss with '_' * - *-------------------------------------------------------------------------*/ + removes " " quotes, returns lower case letters, + replaces non-printable characterss with '_' * + *-------------------------------------------------------------------------*/ void inp_casefix(char *string) @@ -1966,10 +1966,10 @@ inp_stripcomments_deck(struct line *c) * Lines that contain only an end-of-line comment with or without leading white * space are also allowed. - If there is only white space before the end-of-line comment the - the whole line is converted to a normal comment line (i.e. one that - begins with a '*'). - BUG: comment characters in side of string literals are not ignored. */ + If there is only white space before the end-of-line comment the + the whole line is converted to a normal comment line (i.e. one that + begins with a '*'). + BUG: comment characters in side of string literals are not ignored. */ static void inp_stripcomments_line(char *s) @@ -2125,7 +2125,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) ptr2++;/* ptr2 points past end of parameter {...} */ } else - /* take only the next token (separated by space) as the parameter */ + /* take only the next token (separated by space) as the parameter */ ptr2 = skip_non_ws(ptr2); /* ptr2 points past end of parameter */ keep = *ptr2; @@ -2278,9 +2278,9 @@ inp_remove_ws(char *s) /* change quotes from '' to {} .subckt name 1 2 3 params: l=1 w=2 --> .subckt name 1 2 3 l=1 w=2 - x1 1 2 3 params: l=1 w=2 --> x1 1 2 3 l=1 w=2 - modify .subckt lines by calling inp_fix_subckt() - No changes to lines in .control section ! + x1 1 2 3 params: l=1 w=2 --> x1 1 2 3 l=1 w=2 + modify .subckt lines by calling inp_fix_subckt() + No changes to lines in .control section ! */ static void @@ -2306,7 +2306,7 @@ inp_fix_for_numparam(struct names *subckt_w_params, struct line *c) if ((inp_compat_mode == COMPATMODE_ALL) || (inp_compat_mode == COMPATMODE_PS)) if (ciprefix(".subckt", c->li_line) || ciprefix("x", c->li_line)) { - /* remove params: */ + /* remove params: */ char *str_ptr = strstr(c->li_line, "params:"); if (str_ptr) memcpy(str_ptr, " ", 7); @@ -2516,8 +2516,8 @@ inp_get_params(char *line, char *param_names[], char *param_values[]) static char* inp_fix_inst_line(char *inst_line, - int num_subckt_params, char *subckt_param_names[], char *subckt_param_values[], - int num_inst_params, char *inst_param_names[], char *inst_param_values[]) + int num_subckt_params, char *subckt_param_names[], char *subckt_param_values[], + int num_inst_params, char *inst_param_names[], char *inst_param_values[]) { char *end, *inst_name, *inst_name_end; char *curr_line = inst_line, *new_line = NULL; @@ -2708,65 +2708,65 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck subckt_name = inp_get_subckt_name(inst_line); if (find_name(subckt_w_params, subckt_name)) { - sprintf(name_w_space, "%s ", subckt_name); + sprintf(name_w_space, "%s ", subckt_name); - /* find .subckt line */ - found_subckt = FALSE; + /* find .subckt line */ + found_subckt = FALSE; - d = deck; - while (d != NULL) { - char *subckt_line = d->li_line; - if (ciprefix(".subckt", subckt_line)) { - subckt_line = skip_non_ws(subckt_line); - subckt_line = skip_ws(subckt_line); + d = deck; + while (d != NULL) { + char *subckt_line = d->li_line; + if (ciprefix(".subckt", subckt_line)) { + subckt_line = skip_non_ws(subckt_line); + subckt_line = skip_ws(subckt_line); - if (strncmp(subckt_line, name_w_space, strlen(name_w_space)) == 0) { - num_subckt_params = inp_get_params(subckt_line, subckt_param_names, subckt_param_values); - num_inst_params = inp_get_params(inst_line, inst_param_names, inst_param_values); + if (strncmp(subckt_line, name_w_space, strlen(name_w_space)) == 0) { + num_subckt_params = inp_get_params(subckt_line, subckt_param_names, subckt_param_values); + num_inst_params = inp_get_params(inst_line, inst_param_names, inst_param_values); - // make sure that if have inst params that one matches subckt - found_param_match = FALSE; - if (num_inst_params == 0) { - found_param_match = TRUE; - } else { - for (j = 0; j < num_inst_params; j++) { - for (k = 0; k < num_subckt_params; k++) - if (strcmp(subckt_param_names[k], inst_param_names[j]) == 0) { - found_param_match = TRUE; - break; - } - if (found_param_match) + // make sure that if have inst params that one matches subckt + found_param_match = FALSE; + if (num_inst_params == 0) { + found_param_match = TRUE; + } else { + for (j = 0; j < num_inst_params; j++) { + for (k = 0; k < num_subckt_params; k++) + if (strcmp(subckt_param_names[k], inst_param_names[j]) == 0) { + found_param_match = TRUE; break; - } - } - - if (!found_param_match) { - // comment out .subckt and continue - while (d != NULL && !ciprefix(".ends", d->li_line)) { - *(d->li_line) = '*'; - d = d->li_next; - } - *(d->li_line) = '*'; - d = d->li_next; - continue; - } - - c->li_line = inp_fix_inst_line(inst_line, num_subckt_params, subckt_param_names, subckt_param_values, num_inst_params, inst_param_names, inst_param_values); - found_subckt = TRUE; - for (i = 0; i < num_subckt_params; i++) { - tfree(subckt_param_names[i]); - tfree(subckt_param_values[i]); - } - for (i = 0; i < num_inst_params; i++) { - tfree(inst_param_names[i]); - tfree(inst_param_values[i]); + } + if (found_param_match) + break; } } + + if (!found_param_match) { + // comment out .subckt and continue + while (d != NULL && !ciprefix(".ends", d->li_line)) { + *(d->li_line) = '*'; + d = d->li_next; + } + *(d->li_line) = '*'; + d = d->li_next; + continue; + } + + c->li_line = inp_fix_inst_line(inst_line, num_subckt_params, subckt_param_names, subckt_param_values, num_inst_params, inst_param_names, inst_param_values); + found_subckt = TRUE; + for (i = 0; i < num_subckt_params; i++) { + tfree(subckt_param_names[i]); + tfree(subckt_param_values[i]); + } + for (i = 0; i < num_inst_params; i++) { + tfree(inst_param_names[i]); + tfree(inst_param_values[i]); + } } - if (found_subckt) - break; - d = d->li_next; } + if (found_subckt) + break; + d = d->li_next; + } } tfree(subckt_name); } @@ -2879,8 +2879,8 @@ inp_get_func_from_line(struct function_env *env, char *line) /* -* grab functions at the current .subckt nesting level -*/ + * grab functions at the current .subckt nesting level + */ static void inp_grab_func(struct function_env *env, struct line *c) @@ -3182,12 +3182,12 @@ inp_expand_macros_in_deck(struct function_env *env, struct line *c) Special handling of vectors with [] and complex values with < > h_vogt 20 April 2008 - * For xspice and num_pram compatibility .cmodel added - * .cmodel will be replaced by .model in inp_fix_param_values() - * and then the entire line is skipped (will not be changed by this function). - * Usage of numparam requires {} around the parameters in the .cmodel line. - * May be obsolete? - */ + * For xspice and num_pram compatibility .cmodel added + * .cmodel will be replaced by .model in inp_fix_param_values() + * and then the entire line is skipped (will not be changed by this function). + * Usage of numparam requires {} around the parameters in the .cmodel line. + * May be obsolete? + */ static void inp_fix_param_values(struct line *c) @@ -3278,7 +3278,7 @@ inp_fix_param_values(struct line *c) line = equal_ptr + 1; } else if (*beg_of_str == '[') { /* A vector following the '=' token: code to put curly brackets around all params - inside a pair of square brackets */ + inside a pair of square brackets */ end_of_str = beg_of_str; while (*end_of_str != ']') end_of_str++; @@ -3345,7 +3345,7 @@ inp_fix_param_values(struct line *c) tfree(old_str); } else if (*beg_of_str == '<') { /* A complex value following the '=' token: code to put curly brackets around all params - inside a pair < > */ + inside a pair < > */ end_of_str = beg_of_str; while (*end_of_str != '>') end_of_str++; @@ -3573,8 +3573,8 @@ get_number_terminals(char *c) bool only_digits = TRUE; char *nametmp = name[k]; /* MNAME has to contain at least one alpha character. AREA may be assumed - if we have a token with only digits, and where the previous token does not - end with a ',' */ + if we have a token with only digits, and where the previous token does not + end with a ',' */ while (*nametmp) { if (isalpha(*nametmp) || (*nametmp == ',')) only_digits = FALSE; @@ -3760,7 +3760,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car char before = *(str_ptr-1); char after = *(str_ptr+strlen(param_names[i])); if (!(is_arith_char(before) || isspace(before) || (str_ptr-1) < curr_line) || - !(is_arith_char(after) || isspace(after) || after == '\0')) { + !(is_arith_char(after) || isspace(after) || after == '\0')) { str_ptr ++; continue; } @@ -4123,18 +4123,18 @@ inp_split_multi_param_lines(struct line *card, int line_num) resistance may be lost. Cxxx n1 n2 C = {equation} or Cxxx n1 n2 {equation} - --> - Exxx n-aux 0 n1 n2 1 - Cxxx n-aux 0 1 - Bxxx n2 n1 I = i(Exxx) * equation + --> + Exxx n-aux 0 n1 n2 1 + Cxxx n-aux 0 1 + Bxxx n2 n1 I = i(Exxx) * equation Lxxx n1 n2 L = {equation} or Lxxx n1 n2 {equation} - --> - Fxxx n-aux 0 Bxxx -1 - Lxxx n-aux 0 1 - Bxxx n1 n2 V = v(n-aux) * 1e-16 + --> + Fxxx n-aux 0 Bxxx -1 + Lxxx n-aux 0 1 + Bxxx n1 n2 V = v(n-aux) * 1e-16 - */ +*/ static void inp_compat(struct line *card) @@ -4189,7 +4189,7 @@ inp_compat(struct line *card) --> Exxx n1 n2 int1 0 1 BExxx int1 0 V = pwl (expression, x0-(x2-x0)/2, y0, x0, y0, x1, y1, x2, y2, x2+(x2-x0)/2, y2) - */ + */ if ((str_ptr = strstr(curr_line, "table")) != NULL) { char *expression, *firstno, *ffirstno, *secondno, *midline, *lastno, *lastlastno; double fnumber, lnumber, delta; @@ -4201,7 +4201,7 @@ inp_compat(struct line *card) node2 = gettok(&cut_line); // Exxx n1 n2 int1 0 1 xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) - + 20 - 4*2 + 1; + + 20 - 4*2 + 1; ckt_array[0] = TMALLOC(char, xlen); sprintf(ckt_array[0], "%s %s %s %s_int1 0 1", title_tok, node1, node2, title_tok); @@ -4209,7 +4209,7 @@ inp_compat(struct line *card) str_ptr = gettok(&cut_line); /* ignore 'table' */ if (!cieq(str_ptr, "table")) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", - card->li_linenum_orig, card->li_line); + card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } tfree(str_ptr); @@ -4217,7 +4217,7 @@ inp_compat(struct line *card) expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */ if (!expression || !str_ptr) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", - card->li_linenum_orig, card->li_line); + card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } tfree(str_ptr); @@ -4239,7 +4239,7 @@ inp_compat(struct line *card) ffirstno = gettok_node(&cut_line); if (!ffirstno) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", - card->li_linenum_orig, card->li_line); + card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } firstno = copy(ffirstno); @@ -4261,7 +4261,7 @@ inp_compat(struct line *card) lastlastno = gettok_node(&cut_line); if (!secondno || (*midline == 0) || (delta <= 0.) || !lastlastno) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", - card->li_linenum_orig, card->li_line); + card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } xlen = 2*strlen(title_tok) + strlen(expression) + 14 + strlen(firstno) + @@ -4318,13 +4318,13 @@ inp_compat(struct line *card) // Exxx n1 n2 int1 0 1 xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) - + 20 - 4*2 + 1; + + 20 - 4*2 + 1; ckt_array[0] = TMALLOC(char, xlen); sprintf(ckt_array[0], "%s %s %s %s_int1 0 1", title_tok, node1, node2, title_tok); // BExxx int1 0 V = {equation} xlen = 2*strlen(title_tok) + strlen(str_ptr) - + 20 - 3*2 + 1; + + 20 - 3*2 + 1; ckt_array[1] = TMALLOC(char, xlen); sprintf(ckt_array[1], "b%s %s_int1 0 v = %s", title_tok, title_tok, str_ptr); @@ -4370,7 +4370,7 @@ inp_compat(struct line *card) --> Gxxx n1 n2 int1 0 1 BGxxx int1 0 V = pwl (expression, x0-(x2-x0)/2, y0, x0, y0, x1, y1, x2, y2, x2+(x2-x0)/2, y2) - */ + */ if ((str_ptr = strstr(curr_line, "table")) != NULL) { char *expression, *firstno, *ffirstno, *secondno, *midline, *lastno, *lastlastno; char *m_ptr, *m_token; @@ -4393,7 +4393,7 @@ inp_compat(struct line *card) else m_token = copy("1"); xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) - + 20 - 4*2 + strlen(m_token); + + 20 - 4*2 + strlen(m_token); ckt_array[0] = TMALLOC(char, xlen); sprintf(ckt_array[0], "%s %s %s %s_int1 0 %s", title_tok, node1, node2, title_tok, m_token); @@ -4401,7 +4401,7 @@ inp_compat(struct line *card) str_ptr = gettok(&cut_line); /* ignore 'table' */ if (!cieq(str_ptr, "table")) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", - card->li_linenum_orig, card->li_line); + card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } tfree(str_ptr); @@ -4409,7 +4409,7 @@ inp_compat(struct line *card) expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */ if (!expression || !str_ptr) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", - card->li_linenum_orig, card->li_line); + card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } tfree(str_ptr); @@ -4431,7 +4431,7 @@ inp_compat(struct line *card) ffirstno = gettok_node(&cut_line); if (!ffirstno) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", - card->li_linenum_orig, card->li_line); + card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } firstno = copy(ffirstno); @@ -4453,7 +4453,7 @@ inp_compat(struct line *card) lastlastno = gettok_node(&cut_line); if (!secondno || (*midline == 0) || (delta <= 0.) || !lastlastno) { fprintf(stderr, "Error: bad sytax in line %d\n %s\n", - card->li_linenum_orig, card->li_line); + card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } /* BGxxx int1 0 V = pwl (expression, x0-(x2-x0)/2, y0, x0, y0, x1, y1, x2, y2, x2+(x2-x0)/2, y2) */ @@ -4493,10 +4493,10 @@ inp_compat(struct line *card) tfree(m_token); } /* - Gxxx n1 n2 CUR = {equation} - --> - Gxxx n1 n2 int1 0 1 - BGxxx int1 0 V = {equation} + Gxxx n1 n2 CUR = {equation} + --> + Gxxx n1 n2 int1 0 1 + BGxxx int1 0 V = {equation} */ if ((str_ptr = strstr(curr_line, "cur")) != NULL) { char *m_ptr, *m_token; @@ -4523,13 +4523,13 @@ inp_compat(struct line *card) // or // Gxxx n1 n2 int1 0 m='expr' xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) - + 20 - 4*2 + strlen(m_token); + + 20 - 4*2 + strlen(m_token); ckt_array[0] = TMALLOC(char, xlen); sprintf(ckt_array[0], "%s %s %s %s_int1 0 %s", title_tok, node1, node2, title_tok, m_token); // BGxxx int1 0 V = {equation} xlen = 2*strlen(title_tok) + strlen(str_ptr) - + 20 - 3*2 + 1; + + 20 - 3*2 + 1; ckt_array[1] = TMALLOC(char, xlen); sprintf(ckt_array[1], "b%s %s_int1 0 v = %s", title_tok, title_tok, str_ptr); @@ -4625,22 +4625,22 @@ inp_compat(struct line *card) } if ((tc1_ptr == NULL) && (tc2_ptr == NULL)) { xlen = strlen(title_tok) + strlen(node1) + strlen(node2) + - strlen(node1) + strlen(node2) + strlen(equation) + - 28 - 6*2 + 1; + strlen(node1) + strlen(node2) + strlen(equation) + + 28 - 6*2 + 1; xline = TMALLOC(char, xlen); sprintf(xline, "b%s %s %s i = v(%s, %s)/(%s)", title_tok, node1, node2, node1, node2, equation); } else if (tc2_ptr == NULL) { xlen = strlen(title_tok) + strlen(node1) + strlen(node2) + - strlen(node1) + strlen(node2) + strlen(equation) + - 28 - 6*2 + 1 + 21 + 13; + strlen(node1) + strlen(node2) + strlen(equation) + + 28 - 6*2 + 1 + 21 + 13; xline = TMALLOC(char, xlen); sprintf(xline, "b%s %s %s i = v(%s, %s)/(%s) tc1=%15.8e reciproctc=1", title_tok, node1, node2, node1, node2, equation, tc1); } else { xlen = strlen(title_tok) + strlen(node1) + strlen(node2) + - strlen(node1) + strlen(node2) + strlen(equation) + - 28 - 6*2 + 1 + 21 + 21 + 13; + strlen(node1) + strlen(node2) + strlen(equation) + + 28 - 6*2 + 1 + 21 + 21 + 13; xline = TMALLOC(char, xlen); sprintf(xline, "b%s %s %s i = v(%s, %s)/(%s) tc1=%15.8e tc2=%15.8e reciproctc=1", title_tok, node1, node2, node1, node2, equation, tc1, tc2); @@ -4665,7 +4665,7 @@ inp_compat(struct line *card) Exxx n-aux 0 n1 n2 1 Cxxx n-aux 0 1 Bxxx n2 n1 I = i(Exxx) * equation - */ + */ else if (*curr_line == 'c') { cut_line = curr_line; title_tok = gettok(&cut_line); @@ -4713,31 +4713,31 @@ inp_compat(struct line *card) } // Exxx n-aux 0 n1 n2 1 xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) - + 21 - 4*2 + 1; + + 21 - 4*2 + 1; ckt_array[0] = TMALLOC(char, xlen); sprintf(ckt_array[0], "e%s %s_int2 0 %s %s 1", title_tok, title_tok, node1, node2); // Cxxx n-aux 0 1 xlen = 2*strlen(title_tok) - + 15 - 2*2 + 1; + + 15 - 2*2 + 1; ckt_array[1] = TMALLOC(char, xlen); sprintf(ckt_array[1], "c%s %s_int2 0 1", title_tok, title_tok); // Bxxx n2 n1 I = i(Exxx) * equation if ((tc1_ptr == NULL) && (tc2_ptr == NULL)) { xlen = 2*strlen(title_tok) + strlen(node2) + strlen(node1) - + strlen(equation) + 27 - 2*5 + 1; + + strlen(equation) + 27 - 2*5 + 1; ckt_array[2] = TMALLOC(char, xlen); sprintf(ckt_array[2], "b%s %s %s i = i(e%s) * (%s)", title_tok, node2, node1, title_tok, equation); } else if (tc2_ptr == NULL) { xlen = 2*strlen(title_tok) + strlen(node2) + strlen(node1) - + strlen(equation) + 27 - 2*5 + 1 + 21 + 13; + + strlen(equation) + 27 - 2*5 + 1 + 21 + 13; ckt_array[2] = TMALLOC(char, xlen); sprintf(ckt_array[2], "b%s %s %s i = i(e%s) * (%s) tc1=%15.8e reciproctc=1", title_tok, node2, node1, title_tok, equation, tc1); } else { xlen = 2*strlen(title_tok) + strlen(node2) + strlen(node1) - + strlen(equation) + 27 - 2*5 + 1 + 21 + 21 + 13; + + strlen(equation) + 27 - 2*5 + 1 + 21 + 21 + 13; ckt_array[2] = TMALLOC(char, xlen); sprintf(ckt_array[2], "b%s %s %s i = i(e%s) * (%s) tc1=%15.8e tc2=%15.8e reciproctc=1", title_tok, node2, node1, title_tok, equation, tc1, tc2); @@ -4775,7 +4775,7 @@ inp_compat(struct line *card) Fxxx n-aux 0 Bxxx -1 Lxxx n-aux 0 1 Bxxx n1 n2 V = v(n-aux) * equation - */ + */ else if (*curr_line == 'l') { cut_line = curr_line; /* title and nodes */ @@ -4823,31 +4823,31 @@ inp_compat(struct line *card) } // Fxxx n-aux 0 Bxxx 1 xlen = 3*strlen(title_tok) - + 20 - 3*2 + 1; + + 20 - 3*2 + 1; ckt_array[0] = TMALLOC(char, xlen); sprintf(ckt_array[0], "f%s %s_int2 0 b%s -1", title_tok, title_tok, title_tok); // Lxxx n-aux 0 1 xlen = 2*strlen(title_tok) - + 15 - 2*2 + 1; + + 15 - 2*2 + 1; ckt_array[1] = TMALLOC(char, xlen); sprintf(ckt_array[1], "l%s %s_int2 0 1", title_tok, title_tok); // Bxxx n1 n2 V = v(n-aux) * equation if ((tc1_ptr == NULL) && (tc2_ptr == NULL)) { xlen = 2*strlen(title_tok) + strlen(node2) + strlen(node1) - + strlen(equation) + 31 - 2*5 + 1; + + strlen(equation) + 31 - 2*5 + 1; ckt_array[2] = TMALLOC(char, xlen); sprintf(ckt_array[2], "b%s %s %s v = v(%s_int2) * (%s)", title_tok, node1, node2, title_tok, equation); } else if (tc2_ptr == NULL) { xlen = 2*strlen(title_tok) + strlen(node2) + strlen(node1) - + strlen(equation) + 31 - 2*5 + 1 + 21 + 13; + + strlen(equation) + 31 - 2*5 + 1 + 21 + 13; ckt_array[2] = TMALLOC(char, xlen); sprintf(ckt_array[2], "b%s %s %s v = v(%s_int2) * (%s) tc1=%15.8e reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1); } else { xlen = 2*strlen(title_tok) + strlen(node2) + strlen(node1) - + strlen(equation) + 31 - 2*5 + 1 + 21 + 21 + 13; + + strlen(equation) + 31 - 2*5 + 1 + 21 + 21 + 13; ckt_array[2] = TMALLOC(char, xlen); sprintf(ckt_array[2], "b%s %s %s v = v(%s_int2) * (%s) tc1=%15.8e tc2=%15.8e reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1, tc2); @@ -5168,7 +5168,7 @@ inp_compat(struct line *card) /* replace a token (length 4 char) in string by spaces, if it is found - at the correct position and the total number of tokens is o.k. */ + at the correct position and the total number of tokens is o.k. */ static void replace_token(char *string, char *token, int wherereplace, int total) @@ -5351,8 +5351,8 @@ inp_bsource_compat(struct line *card) Put braces around tokens and around expressions, use ',' as separator like: pwl(i(Vin), {x0-1},{y0}, - {x0},{y0},{x1},{y1}, {x2},{y2},{x3},{y3}, - {x3+1},{y3}) + {x0},{y0},{x1},{y1}, {x2},{y2},{x3},{y3}, + {x3+1},{y3}) */ /* * if (cieq(buf, "pwl")) { @@ -5540,7 +5540,7 @@ get_quoted_token(char *string, char **token) * --> * Lxxx n1 n2_intern__ Lval * RLxxx_n2_intern__ n2_intern__ n2 rval -*/ + */ static void inp_add_series_resistor(struct line *deck) @@ -5665,7 +5665,7 @@ inp_poly_err(struct line *card) } /* get the fourth token in a controlled source line and exit, - if it is 'poly' */ + if it is 'poly' */ if ((ciprefix("e", curr_line)) || (ciprefix("g", curr_line)) || (ciprefix("f", curr_line)) || (ciprefix("h", curr_line))) { @@ -5674,8 +5674,8 @@ inp_poly_err(struct line *card) txfree(gettok(&curr_line)); if (ciprefix("poly", curr_line)) { fprintf(stderr, - "\nError: XSPICE is required to run the 'poly' option in line %d\n", - card->li_linenum_orig); + "\nError: XSPICE is required to run the 'poly' option in line %d\n", + card->li_linenum_orig); fprintf(stderr, " %s\n", card->li_line); fprintf(stderr, "\nSee manual chapt. 31 for installation instructions\n"); controlled_exit(EXIT_BAD); From 2c5b78c18bddaec8438aa1c7296de7f0ccb710f7 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 9 Jun 2013 10:20:20 +0200 Subject: [PATCH 174/257] cktop.c: indentation --- src/spicelib/analysis/cktop.c | 856 +++++++++++++++++----------------- 1 file changed, 423 insertions(+), 433 deletions(-) diff --git a/src/spicelib/analysis/cktop.c b/src/spicelib/analysis/cktop.c index 403b2c389..35d2bc33b 100644 --- a/src/spicelib/analysis/cktop.c +++ b/src/spicelib/analysis/cktop.c @@ -21,62 +21,61 @@ int CKTop (CKTcircuit * ckt, long int firstmode, long int continuemode, int iterlim) { - int converged; + int converged; #ifdef HAS_PROGREP - SetAnalyse("op", 0); + SetAnalyse("op", 0); #endif -ckt->CKTmode = firstmode; + ckt->CKTmode = firstmode; - if (!ckt->CKTnoOpIter){ + if (!ckt->CKTnoOpIter) { #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - if ((ckt->CKTnumGminSteps <= 0) && (ckt->CKTnumSrcSteps <= 0)) - ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; - else - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + if ((ckt->CKTnumGminSteps <= 0) && (ckt->CKTnumSrcSteps <= 0)) + ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; + else + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif - converged = NIiter (ckt, iterlim); + converged = NIiter (ckt, iterlim); } else { - converged = 1; /* the 'go directly to gmin stepping' option */ - } + converged = 1; /* the 'go directly to gmin stepping' option */ + } - if (converged != 0) - { - /* no convergence on the first try, so we do something else */ - /* first, check if we should try gmin stepping */ + if (converged != 0) { + /* no convergence on the first try, so we do something else */ + /* first, check if we should try gmin stepping */ - if (ckt->CKTnumGminSteps >= 1){ - if (ckt->CKTnumGminSteps == 1) - converged = dynamic_gmin(ckt, firstmode, continuemode, iterlim); - else - converged = spice3_gmin(ckt, firstmode, continuemode, iterlim); - } - if (!converged) /* If gmin-stepping worked... move out */ - return (0); + if (ckt->CKTnumGminSteps >= 1) { + if (ckt->CKTnumGminSteps == 1) + converged = dynamic_gmin(ckt, firstmode, continuemode, iterlim); + else + converged = spice3_gmin(ckt, firstmode, continuemode, iterlim); + } + if (!converged) /* If gmin-stepping worked... move out */ + return (0); - /* ... otherwise try stepping sources ... - * now, we'll try source stepping - we scale the sources - * to 0, converge, then start stepping them up until they - * are at their normal values - */ + /* ... otherwise try stepping sources ... + * now, we'll try source stepping - we scale the sources + * to 0, converge, then start stepping them up until they + * are at their normal values + */ - if (ckt->CKTnumSrcSteps >= 1){ - if (ckt->CKTnumSrcSteps == 1) - converged = gillespie_src(ckt, firstmode, continuemode, iterlim); - else - converged = spice3_src(ckt, firstmode, continuemode, iterlim); - } + if (ckt->CKTnumSrcSteps >= 1) { + if (ckt->CKTnumSrcSteps == 1) + converged = gillespie_src(ckt, firstmode, continuemode, iterlim); + else + converged = spice3_src(ckt, firstmode, continuemode, iterlim); + } #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif - } - return (converged); - + } + return (converged); + } @@ -84,7 +83,7 @@ ckt->CKTmode = firstmode; /* CKTconvTest(ckt) * this is a driver program to iterate through all the various * convTest functions provided for the circuit elements in the - * given circuit + * given circuit */ int @@ -93,18 +92,15 @@ CKTconvTest (CKTcircuit * ckt) int i; int error = OK; - for (i = 0; i < DEVmaxnum; i++) - { - if (DEVices[i] && DEVices[i]->DEVconvTest && ckt->CKThead[i]) - { + for (i = 0; i < DEVmaxnum; i++) { + if (DEVices[i] && DEVices[i]->DEVconvTest && ckt->CKThead[i]) { error = DEVices[i]->DEVconvTest (ckt->CKThead[i], ckt); } if (error) return (error); - if (ckt->CKTnoncon) - { + if (ckt->CKTnoncon) { /* printf("convTest: device %s failed\n", * DEVices[i]->DEVpublic.name); */ return (OK); @@ -118,505 +114,499 @@ CKTconvTest (CKTcircuit * ckt) /* Dynamic gmin stepping * Algorithm by Alan Gillespie * Modified 2005 - Paolo Nenzi (extracted from CKTop.c code) - * + * * return value: * 0 -> method converged * 1 -> method failed - * - * Note that no path out of this code allows ckt->CKTdiagGmin to be + * + * Note that no path out of this code allows ckt->CKTdiagGmin to be * anything but CKTgshunt. */ static int dynamic_gmin (CKTcircuit * ckt, long int firstmode, - long int continuemode, int iterlim) + long int continuemode, int iterlim) { - double OldGmin, gtarget, factor; - int success, failed, converged; + double OldGmin, gtarget, factor; + int success, failed, converged; - int NumNodes, iters, i; - double *OldRhsOld, *OldCKTstate0; - CKTnode *n; + int NumNodes, iters, i; + double *OldRhsOld, *OldCKTstate0; + CKTnode *n; - ckt->CKTmode = firstmode; - SPfrontEnd->IFerror (ERR_INFO, - "Starting dynamic gmin stepping", NULL); + ckt->CKTmode = firstmode; + SPfrontEnd->IFerror (ERR_INFO, + "Starting dynamic gmin stepping", NULL); - NumNodes = 0; - for (n = ckt->CKTnodes; n; n = n->next) - NumNodes++; - - OldRhsOld = TMALLOC(double, NumNodes + 1); - OldCKTstate0 = - TMALLOC(double, ckt->CKTnumStates + 1); + NumNodes = 0; + for (n = ckt->CKTnodes; n; n = n->next) + NumNodes++; - for (n = ckt->CKTnodes; n; n = n->next) - ckt->CKTrhsOld [n->number] = 0; + OldRhsOld = TMALLOC(double, NumNodes + 1); + OldCKTstate0 = + TMALLOC(double, ckt->CKTnumStates + 1); - for (i = 0; i < ckt->CKTnumStates; i++) - ckt->CKTstate0 [i] = 0; - - factor = ckt->CKTgminFactor; - OldGmin = 1e-2; - ckt->CKTdiagGmin = OldGmin / factor; - gtarget = MAX (ckt->CKTgmin, ckt->CKTgshunt); - success = failed = 0; + for (n = ckt->CKTnodes; n; n = n->next) + ckt->CKTrhsOld [n->number] = 0; - while ((!success) && (!failed)){ - fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTdiagGmin); - ckt->CKTnoncon = 1; - iters = ckt->CKTstat->STATnumIter; + for (i = 0; i < ckt->CKTnumStates; i++) + ckt->CKTstate0 [i] = 0; - converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); - iters = (ckt->CKTstat->STATnumIter) - iters; + factor = ckt->CKTgminFactor; + OldGmin = 1e-2; + ckt->CKTdiagGmin = OldGmin / factor; + gtarget = MAX (ckt->CKTgmin, ckt->CKTgshunt); + success = failed = 0; - if (converged == 0){ - ckt->CKTmode = continuemode; - SPfrontEnd->IFerror (ERR_INFO, - "One successful gmin step", NULL); + while ((!success) && (!failed)) { + fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTdiagGmin); + ckt->CKTnoncon = 1; + iters = ckt->CKTstat->STATnumIter; - if (ckt->CKTdiagGmin <= gtarget){ - success = 1; - } else { - i = 0; - for (n = ckt->CKTnodes; n; n = n->next){ - OldRhsOld[i] = ckt->CKTrhsOld[n->number]; - i++; - } - - for (i = 0; i < ckt->CKTnumStates; i++){ - OldCKTstate0[i] = ckt->CKTstate0[i]; - } + converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); + iters = (ckt->CKTstat->STATnumIter) - iters; - if (iters <= (ckt->CKTdcTrcvMaxIter / 4)){ - factor *= sqrt (factor); - if (factor > ckt->CKTgminFactor) - factor = ckt->CKTgminFactor; - } + if (converged == 0) { + ckt->CKTmode = continuemode; + SPfrontEnd->IFerror (ERR_INFO, + "One successful gmin step", NULL); - if (iters > (3 * ckt->CKTdcTrcvMaxIter / 4)) - factor = sqrt (factor); - - OldGmin = ckt->CKTdiagGmin; + if (ckt->CKTdiagGmin <= gtarget) { + success = 1; + } else { + i = 0; + for (n = ckt->CKTnodes; n; n = n->next) { + OldRhsOld[i] = ckt->CKTrhsOld[n->number]; + i++; + } - if ((ckt->CKTdiagGmin) < (factor * gtarget)){ - factor = ckt->CKTdiagGmin / gtarget; - ckt->CKTdiagGmin = gtarget; - } else { - ckt->CKTdiagGmin /= factor; - } - } - } else { - if (factor < 1.00005){ - failed = 1; - SPfrontEnd->IFerror (ERR_WARNING, - "Last gmin step failed", - NULL); - } else { - SPfrontEnd->IFerror (ERR_WARNING, - "Further gmin increment", - NULL); - factor = sqrt (sqrt (factor)); - ckt->CKTdiagGmin = OldGmin / factor; + for (i = 0; i < ckt->CKTnumStates; i++) { + OldCKTstate0[i] = ckt->CKTstate0[i]; + } - i = 0; - for (n = ckt->CKTnodes; n; n = n->next){ - ckt->CKTrhsOld[n->number] = OldRhsOld[i]; - i++; - } + if (iters <= (ckt->CKTdcTrcvMaxIter / 4)) { + factor *= sqrt (factor); + if (factor > ckt->CKTgminFactor) + factor = ckt->CKTgminFactor; + } - for (i = 0; i < ckt->CKTnumStates; i++){ - ckt->CKTstate0[i] = OldCKTstate0[i]; - } - } - } - } + if (iters > (3 * ckt->CKTdcTrcvMaxIter / 4)) + factor = sqrt (factor); - ckt->CKTdiagGmin = ckt->CKTgshunt; - FREE (OldRhsOld); - FREE (OldCKTstate0); + OldGmin = ckt->CKTdiagGmin; + + if ((ckt->CKTdiagGmin) < (factor * gtarget)) { + factor = ckt->CKTdiagGmin / gtarget; + ckt->CKTdiagGmin = gtarget; + } else { + ckt->CKTdiagGmin /= factor; + } + } + } else { + if (factor < 1.00005) { + failed = 1; + SPfrontEnd->IFerror (ERR_WARNING, + "Last gmin step failed", + NULL); + } else { + SPfrontEnd->IFerror (ERR_WARNING, + "Further gmin increment", + NULL); + factor = sqrt (sqrt (factor)); + ckt->CKTdiagGmin = OldGmin / factor; + + i = 0; + for (n = ckt->CKTnodes; n; n = n->next) { + ckt->CKTrhsOld[n->number] = OldRhsOld[i]; + i++; + } + + for (i = 0; i < ckt->CKTnumStates; i++) { + ckt->CKTstate0[i] = OldCKTstate0[i]; + } + } + } + } + + ckt->CKTdiagGmin = ckt->CKTgshunt; + FREE (OldRhsOld); + FREE (OldCKTstate0); #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - if (ckt->CKTnumSrcSteps <= 0) - ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; - else - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + if (ckt->CKTnumSrcSteps <= 0) + ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; + else + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif - - converged = NIiter (ckt, iterlim); - if (converged != 0){ - SPfrontEnd->IFerror (ERR_WARNING, - "Dynamic gmin stepping failed", - NULL); + converged = NIiter (ckt, iterlim); + + if (converged != 0) { + SPfrontEnd->IFerror (ERR_WARNING, + "Dynamic gmin stepping failed", + NULL); } else { - SPfrontEnd->IFerror (ERR_INFO, - "Dynamic gmin stepping completed", - NULL); + SPfrontEnd->IFerror (ERR_INFO, + "Dynamic gmin stepping completed", + NULL); #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif } - return (converged); + return (converged); } /* Spice3 gmin stepping * Modified 2000 - Alan Gillespie (added gshunt) * Modified 2005 - Paolo Nenzi (extracted from CKTop.c code) - * + * * return value: * 0 -> method converged * 1 -> method failed * - * Note that no path out of this code allows ckt->CKTdiagGmin to be + * Note that no path out of this code allows ckt->CKTdiagGmin to be * anything but CKTgshunt. */ static int spice3_gmin (CKTcircuit * ckt, long int firstmode, - long int continuemode, int iterlim) + long int continuemode, int iterlim) { - int converged, i; + int converged, i; - ckt->CKTmode = firstmode; - SPfrontEnd->IFerror (ERR_INFO, - "Starting gmin stepping", NULL); + ckt->CKTmode = firstmode; + SPfrontEnd->IFerror (ERR_INFO, + "Starting gmin stepping", NULL); - if (ckt->CKTgshunt == 0) - ckt->CKTdiagGmin = ckt->CKTgmin; - else - ckt->CKTdiagGmin = ckt->CKTgshunt; + if (ckt->CKTgshunt == 0) + ckt->CKTdiagGmin = ckt->CKTgmin; + else + ckt->CKTdiagGmin = ckt->CKTgshunt; - for (i = 0; i < ckt->CKTnumGminSteps; i++) - ckt->CKTdiagGmin *= ckt->CKTgminFactor; - + for (i = 0; i < ckt->CKTnumGminSteps; i++) + ckt->CKTdiagGmin *= ckt->CKTgminFactor; - for (i = 0; i <= ckt->CKTnumGminSteps; i++){ - fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTdiagGmin); - ckt->CKTnoncon = 1; - converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); - if (converged != 0){ - ckt->CKTdiagGmin = ckt->CKTgshunt; - SPfrontEnd->IFerror (ERR_WARNING, - "gmin step failed", NULL); - break; - } + for (i = 0; i <= ckt->CKTnumGminSteps; i++) { + fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTdiagGmin); + ckt->CKTnoncon = 1; + converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); - ckt->CKTdiagGmin /= ckt->CKTgminFactor; - ckt->CKTmode = continuemode; + if (converged != 0) { + ckt->CKTdiagGmin = ckt->CKTgshunt; + SPfrontEnd->IFerror (ERR_WARNING, + "gmin step failed", NULL); + break; + } - SPfrontEnd->IFerror (ERR_INFO, - "One successful gmin step", NULL); - } + ckt->CKTdiagGmin /= ckt->CKTgminFactor; + ckt->CKTmode = continuemode; - ckt->CKTdiagGmin = ckt->CKTgshunt; + SPfrontEnd->IFerror (ERR_INFO, + "One successful gmin step", NULL); + } + + ckt->CKTdiagGmin = ckt->CKTgshunt; #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - if (ckt->CKTnumSrcSteps <= 0) - ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; - else - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + if (ckt->CKTnumSrcSteps <= 0) + ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; + else + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif - converged = NIiter (ckt, iterlim); + converged = NIiter (ckt, iterlim); - if (converged == 0){ - SPfrontEnd->IFerror (ERR_INFO, - "gmin stepping completed", NULL); + if (converged == 0) { + SPfrontEnd->IFerror (ERR_INFO, + "gmin stepping completed", NULL); #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif } else { - SPfrontEnd->IFerror (ERR_WARNING, - "gmin stepping failed", NULL); + SPfrontEnd->IFerror (ERR_WARNING, + "gmin stepping failed", NULL); } - return (converged); + return (converged); } /* Gillespie's Source stepping * Modified 2005 - Paolo Nenzi (extracted from CKTop.c code) - * + * * return value: * 0 -> method converged * 1 -> method failed * - * Note that no path out of this code allows ckt->CKTsrcFact to be + * Note that no path out of this code allows ckt->CKTsrcFact to be * anything but 1.00000. */ static int gillespie_src (CKTcircuit * ckt, long int firstmode, - long int continuemode, int iterlim) + long int continuemode, int iterlim) { - int converged, NumNodes, i, iters; - double raise, ConvFact; - double *OldRhsOld, *OldCKTstate0; - CKTnode *n; + int converged, NumNodes, i, iters; + double raise, ConvFact; + double *OldRhsOld, *OldCKTstate0; + CKTnode *n; - NG_IGNORE(iterlim); + NG_IGNORE(iterlim); - ckt->CKTmode = firstmode; - SPfrontEnd->IFerror (ERR_INFO, - "Starting source stepping", NULL); + ckt->CKTmode = firstmode; + SPfrontEnd->IFerror (ERR_INFO, + "Starting source stepping", NULL); - ckt->CKTsrcFact = 0; - raise = 0.001; - ConvFact = 0; + ckt->CKTsrcFact = 0; + raise = 0.001; + ConvFact = 0; - NumNodes = 0; - for (n = ckt->CKTnodes; n; n = n->next){ - NumNodes++; - } - - OldRhsOld = TMALLOC(double, NumNodes + 1); - OldCKTstate0 = - TMALLOC(double, ckt->CKTnumStates + 1); - - for (n = ckt->CKTnodes; n; n = n->next) - ckt->CKTrhsOld[n->number] = 0; - - for (i = 0; i < ckt->CKTnumStates; i++) - ckt->CKTstate0[i] = 0; - -/* First, try a straight solution with all sources at zero */ - - fprintf (stderr, "Supplies reduced to %8.4f%% ", ckt->CKTsrcFact * 100); - converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); - -/* If this doesn't work, try gmin stepping as well for the first solution */ - - if (converged != 0){ - fprintf (stderr, "\n"); - if (ckt->CKTgshunt <= 0){ - ckt->CKTdiagGmin = ckt->CKTgmin; - } else { - ckt->CKTdiagGmin = ckt->CKTgshunt; - } - - for (i = 0; i < 10; i++) - ckt->CKTdiagGmin *= 10; - - for (i = 0; i <= 10; i++){ - fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTdiagGmin); - ckt->CKTnoncon = 1; - -#ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; -/* gtri - end - wbk - add convergence problem reporting flags */ -#endif - - converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); - - if (converged != 0){ - ckt->CKTdiagGmin = ckt->CKTgshunt; - SPfrontEnd->IFerror (ERR_WARNING, - "gmin step failed", NULL); - #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ -#endif - break; - } - - ckt->CKTdiagGmin /= 10; - ckt->CKTmode = continuemode; - SPfrontEnd->IFerror (ERR_INFO, - "One successful gmin step", - NULL); - } - ckt->CKTdiagGmin = ckt->CKTgshunt; - } - -/* If we've got convergence, then try stepping up the sources */ - - if (converged == 0){ - i = 0; - for (n = ckt->CKTnodes; n; n = n->next){ - OldRhsOld[i] = ckt->CKTrhsOld[n->number]; - i++; - } - - for (i = 0; i < ckt->CKTnumStates; i++) - OldCKTstate0[i] = ckt->CKTstate0[i]; - - - SPfrontEnd->IFerror (ERR_INFO, - "One successful source step", NULL); - ckt->CKTsrcFact = ConvFact + raise; - } - - - if (converged == 0) - do { - fprintf (stderr, - "Supplies reduced to %8.4f%% ", ckt->CKTsrcFact * 100); - - iters = ckt->CKTstat->STATnumIter; - -#ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; -/* gtri - end - wbk - add convergence problem reporting flags */ -#endif - converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); - - iters = (ckt->CKTstat->STATnumIter) - iters; - - ckt->CKTmode = continuemode; - - if (converged == 0){ - ConvFact = ckt->CKTsrcFact; - i = 0; - - for (n = ckt->CKTnodes; n; n = n->next){ - OldRhsOld[i] = ckt->CKTrhsOld[n->number]; - i++; - } - - for (i = 0; i < ckt->CKTnumStates; i++) - OldCKTstate0[i] = ckt->CKTstate0[i]; - - SPfrontEnd->IFerror (ERR_INFO, - "One successful source step", - NULL); - - ckt->CKTsrcFact = ConvFact + raise; - - if (iters <= (ckt->CKTdcTrcvMaxIter / 4)){ - raise = raise * 1.5; - } - - if (iters > (3 * ckt->CKTdcTrcvMaxIter / 4)){ - raise = raise * 0.5; - } - -/* if (raise>0.01) raise=0.01; */ - - } else { - - if ((ckt->CKTsrcFact - ConvFact) < 1e-8) - break; - - raise = raise / 10; - - if (raise > 0.01) - raise = 0.01; - - ckt->CKTsrcFact = ConvFact; - i = 0; - - for (n = ckt->CKTnodes; n; n = n->next){ - ckt->CKTrhsOld[n->number] = OldRhsOld[i]; - i++; - } - - for (i = 0; i < ckt->CKTnumStates; i++) - ckt->CKTstate0[i] = OldCKTstate0[i]; - - } - - if ((ckt->CKTsrcFact) > 1) - ckt->CKTsrcFact = 1; - - } - while ((raise >= 1e-7) && (ConvFact < 1)); - - FREE (OldRhsOld); - FREE (OldCKTstate0); - ckt->CKTsrcFact = 1; - - if (ConvFact != 1) - { - ckt->CKTsrcFact = 1; - ckt->CKTcurrentAnalysis = DOING_TRAN; - SPfrontEnd->IFerror (ERR_WARNING, - "source stepping failed", NULL); - return (E_ITERLIM); + NumNodes = 0; + for (n = ckt->CKTnodes; n; n = n->next) { + NumNodes++; } - else - { - SPfrontEnd->IFerror (ERR_INFO, - "Source stepping completed", NULL); - return (0); + + OldRhsOld = TMALLOC(double, NumNodes + 1); + OldCKTstate0 = + TMALLOC(double, ckt->CKTnumStates + 1); + + for (n = ckt->CKTnodes; n; n = n->next) + ckt->CKTrhsOld[n->number] = 0; + + for (i = 0; i < ckt->CKTnumStates; i++) + ckt->CKTstate0[i] = 0; + + /* First, try a straight solution with all sources at zero */ + + fprintf (stderr, "Supplies reduced to %8.4f%% ", ckt->CKTsrcFact * 100); + converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); + + /* If this doesn't work, try gmin stepping as well for the first solution */ + + if (converged != 0) { + fprintf (stderr, "\n"); + if (ckt->CKTgshunt <= 0) { + ckt->CKTdiagGmin = ckt->CKTgmin; + } else { + ckt->CKTdiagGmin = ckt->CKTgshunt; + } + + for (i = 0; i < 10; i++) + ckt->CKTdiagGmin *= 10; + + for (i = 0; i <= 10; i++) { + fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTdiagGmin); + ckt->CKTnoncon = 1; + +#ifdef XSPICE + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; + /* gtri - end - wbk - add convergence problem reporting flags */ +#endif + + converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); + + if (converged != 0) { + ckt->CKTdiagGmin = ckt->CKTgshunt; + SPfrontEnd->IFerror (ERR_WARNING, + "gmin step failed", NULL); +#ifdef XSPICE + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ +#endif + break; + } + + ckt->CKTdiagGmin /= 10; + ckt->CKTmode = continuemode; + SPfrontEnd->IFerror (ERR_INFO, + "One successful gmin step", + NULL); + } + ckt->CKTdiagGmin = ckt->CKTgshunt; + } + + /* If we've got convergence, then try stepping up the sources */ + + if (converged == 0) { + i = 0; + for (n = ckt->CKTnodes; n; n = n->next) { + OldRhsOld[i] = ckt->CKTrhsOld[n->number]; + i++; + } + + for (i = 0; i < ckt->CKTnumStates; i++) + OldCKTstate0[i] = ckt->CKTstate0[i]; + + + SPfrontEnd->IFerror (ERR_INFO, + "One successful source step", NULL); + ckt->CKTsrcFact = ConvFact + raise; + } + + + if (converged == 0) + do { + fprintf (stderr, + "Supplies reduced to %8.4f%% ", ckt->CKTsrcFact * 100); + + iters = ckt->CKTstat->STATnumIter; + +#ifdef XSPICE + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; + /* gtri - end - wbk - add convergence problem reporting flags */ +#endif + converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); + + iters = (ckt->CKTstat->STATnumIter) - iters; + + ckt->CKTmode = continuemode; + + if (converged == 0) { + ConvFact = ckt->CKTsrcFact; + i = 0; + + for (n = ckt->CKTnodes; n; n = n->next) { + OldRhsOld[i] = ckt->CKTrhsOld[n->number]; + i++; + } + + for (i = 0; i < ckt->CKTnumStates; i++) + OldCKTstate0[i] = ckt->CKTstate0[i]; + + SPfrontEnd->IFerror (ERR_INFO, + "One successful source step", + NULL); + + ckt->CKTsrcFact = ConvFact + raise; + + if (iters <= (ckt->CKTdcTrcvMaxIter / 4)) { + raise = raise * 1.5; + } + + if (iters > (3 * ckt->CKTdcTrcvMaxIter / 4)) { + raise = raise * 0.5; + } + + /* if (raise>0.01) raise=0.01; */ + + } else { + + if ((ckt->CKTsrcFact - ConvFact) < 1e-8) + break; + + raise = raise / 10; + + if (raise > 0.01) + raise = 0.01; + + ckt->CKTsrcFact = ConvFact; + i = 0; + + for (n = ckt->CKTnodes; n; n = n->next) { + ckt->CKTrhsOld[n->number] = OldRhsOld[i]; + i++; + } + + for (i = 0; i < ckt->CKTnumStates; i++) + ckt->CKTstate0[i] = OldCKTstate0[i]; + + } + + if ((ckt->CKTsrcFact) > 1) + ckt->CKTsrcFact = 1; + + } while ((raise >= 1e-7) && (ConvFact < 1)); + + FREE (OldRhsOld); + FREE (OldCKTstate0); + ckt->CKTsrcFact = 1; + + if (ConvFact != 1) { + ckt->CKTsrcFact = 1; + ckt->CKTcurrentAnalysis = DOING_TRAN; + SPfrontEnd->IFerror (ERR_WARNING, + "source stepping failed", NULL); + return (E_ITERLIM); + } else { + SPfrontEnd->IFerror (ERR_INFO, + "Source stepping completed", NULL); + return (0); } } /* Spice3 Source stepping * Modified 2005 - Paolo Nenzi (extracted from CKTop.c code) - * + * * return value: * 0 -> method converged * 1 -> method failed * - * Note that no path out of this code allows ckt->CKTsrcFact to be + * Note that no path out of this code allows ckt->CKTsrcFact to be * anything but 1.00000. */ static int spice3_src (CKTcircuit * ckt, long int firstmode, - long int continuemode, int iterlim) + long int continuemode, int iterlim) { - int converged, i; + int converged, i; - NG_IGNORE(iterlim); + NG_IGNORE(iterlim); - ckt->CKTmode = firstmode; - SPfrontEnd->IFerror (ERR_INFO, - "Starting source stepping", NULL); + ckt->CKTmode = firstmode; + SPfrontEnd->IFerror (ERR_INFO, + "Starting source stepping", NULL); - for (i = 0; i <= ckt->CKTnumSrcSteps; i++) - { - ckt->CKTsrcFact = ((double) i) / ((double) ckt->CKTnumSrcSteps); + for (i = 0; i <= ckt->CKTnumSrcSteps; i++) { + ckt->CKTsrcFact = ((double) i) / ((double) ckt->CKTnumSrcSteps); #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif - converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); - ckt->CKTmode = continuemode; - if (converged != 0) - { - ckt->CKTsrcFact = 1; - ckt->CKTcurrentAnalysis = DOING_TRAN; - SPfrontEnd->IFerror (ERR_WARNING, - "source stepping failed", NULL); + converged = NIiter (ckt, ckt->CKTdcTrcvMaxIter); + ckt->CKTmode = continuemode; + if (converged != 0) { + ckt->CKTsrcFact = 1; + ckt->CKTcurrentAnalysis = DOING_TRAN; + SPfrontEnd->IFerror (ERR_WARNING, + "source stepping failed", NULL); #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif - return (converged); - } - SPfrontEnd->IFerror (ERR_INFO, - "One successful source step", NULL); + return (converged); + } + SPfrontEnd->IFerror (ERR_INFO, + "One successful source step", NULL); } - SPfrontEnd->IFerror (ERR_INFO, - "Source stepping completed", NULL); - ckt->CKTsrcFact = 1; + SPfrontEnd->IFerror (ERR_INFO, + "Source stepping completed", NULL); + ckt->CKTsrcFact = 1; #ifdef XSPICE -/* gtri - begin - wbk - add convergence problem reporting flags */ - ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; -/* gtri - end - wbk - add convergence problem reporting flags */ + /* gtri - begin - wbk - add convergence problem reporting flags */ + ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; + /* gtri - end - wbk - add convergence problem reporting flags */ #endif - return (0); + return (0); } From d269bd380509ef1782d4a5af12172ea801640b50 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 9 Jun 2013 11:06:05 +0200 Subject: [PATCH 175/257] nicomcof.c: xmu used to calculate trap integration coefficient --- src/maths/ni/nicomcof.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/maths/ni/nicomcof.c b/src/maths/ni/nicomcof.c index 7dcd7ed38..2dfb8f64b 100644 --- a/src/maths/ni/nicomcof.c +++ b/src/maths/ni/nicomcof.c @@ -7,6 +7,11 @@ Author: 1985 Thomas L. Quarles #include "ngspice/cktdefs.h" #include "ngspice/sperror.h" +/* xmu=0: Backward Euler, xmu=0.5: trapezoidal (standard), + xmu=0.48: good damping of current ringing, e.g. in R.O.s. + SpiceOpus adapts xmu to lower values if numerical oscillations + of current in capacitors are detected, t.b.d. */ +#define xmu 0.5 int NIcomCof(CKTcircuit *ckt) @@ -17,6 +22,7 @@ NIcomCof(CKTcircuit *ckt) double arg; double arg1; + /* this routine calculates the timestep-dependent terms used in the * numerical integration. */ @@ -35,10 +41,8 @@ NIcomCof(CKTcircuit *ckt) break; case 2: - ckt->CKTag[0]=1.0/ckt->CKTdelta/(1.0-0.5) ; - ckt->CKTag[1]=0.5/(1.0 - 0.5) ; - /* above lines should have 'xmu' instead of .5 eventually */ - /* (in all three places) */ + ckt->CKTag[0] = 1.0 / ckt->CKTdelta/(1.0 - xmu) ; + ckt->CKTag[1] = xmu / (1.0 - xmu) ; break; default: From 0fd4339c4d5cb7c6927051db51eae2997781dc4e Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 9 Jun 2013 21:41:11 +0200 Subject: [PATCH 176/257] use r/res model parameter for elements w/o value as default --- src/spicelib/devices/res/res.c | 3 ++- src/spicelib/devices/res/resdefs.h | 2 ++ src/spicelib/devices/res/resmask.c | 27 +++++++++++++++------------ src/spicelib/devices/res/resmpar.c | 4 ++-- src/spicelib/devices/res/resparam.c | 4 +--- src/spicelib/devices/res/restemp.c | 13 ++++++++----- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/spicelib/devices/res/res.c b/src/spicelib/devices/res/res.c index 693489766..2b5f4c7dc 100644 --- a/src/spicelib/devices/res/res.c +++ b/src/spicelib/devices/res/res.c @@ -54,7 +54,8 @@ IFparm RESmPTable[] = { /* model parameters */ IOPQ( "kf", RES_MOD_KF, IF_REAL,"Flicker noise coefficient"), IOPQ( "af", RES_MOD_AF, IF_REAL,"Flicker noise exponent"), IOPXU( "tnom", RES_MOD_TNOM, IF_REAL,"Parameter measurement temperature"), - IP( "r", RES_MOD_R, IF_FLAG,"Device is a resistor model") + IOP( "r", RES_MOD_R, IF_FLAG,"Resistor model default value"), + IOPR( "res", RES_MOD_R, IF_FLAG,"Resistor model default value") }; char *RESnames[] = { diff --git a/src/spicelib/devices/res/resdefs.h b/src/spicelib/devices/res/resdefs.h index 3aaec4fb1..ed8581e71 100644 --- a/src/spicelib/devices/res/resdefs.h +++ b/src/spicelib/devices/res/resdefs.h @@ -104,6 +104,7 @@ typedef struct sRESmodel { /* model structure for a resistor */ double RESshort; /* amount by which device is shorter than drawn */ double RESfNcoef; /* Flicker noise coefficient */ double RESfNexp; /* Flicker noise exponent */ + double RESres; /* Default model resistance */ unsigned REStnomGiven :1; /* flag to indicate nominal temp. was given */ unsigned REStc1Given :1; /* flag to indicate tc1 was specified */ unsigned REStc2Given :1; /* flag to indicate tc2 was specified */ @@ -114,6 +115,7 @@ typedef struct sRESmodel { /* model structure for a resistor */ unsigned RESshortGiven :1; /* flag to indicate short effect given */ unsigned RESfNcoefGiven :1; /* flag to indicate kf given */ unsigned RESfNexpGiven :1; /* flag to indicate af given */ + unsigned RESresGiven :1; /* flag to indicate model resistance given */ } RESmodel; /* device parameters */ diff --git a/src/spicelib/devices/res/resmask.c b/src/spicelib/devices/res/resmask.c index 437e0e504..28af7fc82 100644 --- a/src/spicelib/devices/res/resmask.c +++ b/src/spicelib/devices/res/resmask.c @@ -48,18 +48,21 @@ RESmodAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) case RES_MOD_SHORT: value->rValue = model->RESshort; return(OK); - case RES_MOD_KF: - if (model->RESfNcoefGiven) - value->rValue = model->RESfNcoef; - else - value->rValue = 0.0; - return(OK); - case RES_MOD_AF: - if (model->RESfNexpGiven) - value->rValue = model->RESfNexp; - else - value->rValue = 0.0; - return(OK); + case RES_MOD_KF: + if (model->RESfNcoefGiven) + value->rValue = model->RESfNcoef; + else + value->rValue = 0.0; + return(OK); + case RES_MOD_AF: + if (model->RESfNexpGiven) + value->rValue = model->RESfNexp; + else + value->rValue = 0.0; + return(OK); + case RES_MOD_R: + value->rValue = model->RESres; + return(OK); default: return(E_BADPARM); } diff --git a/src/spicelib/devices/res/resmpar.c b/src/spicelib/devices/res/resmpar.c index c5c5896e4..7e92919e1 100644 --- a/src/spicelib/devices/res/resmpar.c +++ b/src/spicelib/devices/res/resmpar.c @@ -60,8 +60,8 @@ RESmParam(int param, IFvalue *value, GENmodel *inModel) break; case RES_MOD_R: - /* just being reassured by user that this is a resistor model */ - /* no-op */ + model->RESres = value->rValue; + model->RESresGiven = TRUE; break; default: return(E_BADPARM); diff --git a/src/spicelib/devices/res/resparam.c b/src/spicelib/devices/res/resparam.c index a11505f2e..d00ff04a6 100644 --- a/src/spicelib/devices/res/resparam.c +++ b/src/spicelib/devices/res/resparam.c @@ -29,9 +29,7 @@ RESparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) break; case RES_RESIST: /* 0 valued resistor causes ngspice to hang -- can't solve for initial voltage */ - if ( AlmostEqualUlps( value->rValue, 0, 3 ) ) value->rValue = 0.001; /* 0.0001 should be sufficiently small */ - /* it's the value that smartspice uses */ - + if ( AlmostEqualUlps( value->rValue, 0, 3 ) ) value->rValue = 0.001; /* 0.001 should be sufficiently small */ here->RESresist = value->rValue; here->RESresGiven = TRUE; break; diff --git a/src/spicelib/devices/res/restemp.c b/src/spicelib/devices/res/restemp.c index bd19bd03b..16f32526a 100644 --- a/src/spicelib/devices/res/restemp.c +++ b/src/spicelib/devices/res/restemp.c @@ -62,14 +62,17 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) if(!here->RESmGiven) here->RESm = 1.0; if(!here->RESnoisyGiven) here->RESnoisy = 1; if(!here->RESresGiven) { - if(model->RESsheetResGiven && (model->RESsheetRes != 0) && - (here->RESlength != 0)) { + if(here->RESlength * here->RESwidth * model->RESsheetRes > 0.0) { here->RESresist = model->RESsheetRes * (here->RESlength - model->RESshort) / (here->RESwidth - model->RESnarrow); } else { - SPfrontEnd->IFerror (ERR_WARNING, - "%s: resistance = 0 ohm, set to 1000 ohm",&(here->RESname)); - here->RESresist=1000; + if(model->RESresGiven) { + here->RESresist = model->RESres; + } else { + SPfrontEnd->IFerror (ERR_WARNING, + "%s: resistance = 0 ohm, set to 1000 ohm",&(here->RESname)); + here->RESresist=1000; + } } } From eba521476b7341bd6d0ee4486e193798966d5b74 Mon Sep 17 00:00:00 2001 From: dwarning Date: Mon, 10 Jun 2013 21:40:13 +0200 Subject: [PATCH 177/257] correct the r/res model parameter type and set minimal resistor value to 1 mOhm --- src/spicelib/devices/res/res.c | 4 ++-- src/spicelib/devices/res/resmpar.c | 7 ++++--- src/spicelib/devices/res/restemp.c | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/spicelib/devices/res/res.c b/src/spicelib/devices/res/res.c index 2b5f4c7dc..61449f300 100644 --- a/src/spicelib/devices/res/res.c +++ b/src/spicelib/devices/res/res.c @@ -54,8 +54,8 @@ IFparm RESmPTable[] = { /* model parameters */ IOPQ( "kf", RES_MOD_KF, IF_REAL,"Flicker noise coefficient"), IOPQ( "af", RES_MOD_AF, IF_REAL,"Flicker noise exponent"), IOPXU( "tnom", RES_MOD_TNOM, IF_REAL,"Parameter measurement temperature"), - IOP( "r", RES_MOD_R, IF_FLAG,"Resistor model default value"), - IOPR( "res", RES_MOD_R, IF_FLAG,"Resistor model default value") + IOP( "r", RES_MOD_R, IF_REAL,"Resistor model default value"), + IOPR( "res", RES_MOD_R, IF_REAL,"Resistor model default value") }; char *RESnames[] = { diff --git a/src/spicelib/devices/res/resmpar.c b/src/spicelib/devices/res/resmpar.c index 7e92919e1..d47e36202 100644 --- a/src/spicelib/devices/res/resmpar.c +++ b/src/spicelib/devices/res/resmpar.c @@ -58,10 +58,11 @@ RESmParam(int param, IFvalue *value, GENmodel *inModel) model->RESfNexp = value->rValue; model->RESfNexpGiven = TRUE; break; - case RES_MOD_R: - model->RESres = value->rValue; - model->RESresGiven = TRUE; + if ( value->rValue > 1e-03 ) { + model->RESres = value->rValue; + model->RESresGiven = TRUE; + } break; default: return(E_BADPARM); diff --git a/src/spicelib/devices/res/restemp.c b/src/spicelib/devices/res/restemp.c index 16f32526a..9a93c9a7b 100644 --- a/src/spicelib/devices/res/restemp.c +++ b/src/spicelib/devices/res/restemp.c @@ -70,8 +70,8 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt) here->RESresist = model->RESres; } else { SPfrontEnd->IFerror (ERR_WARNING, - "%s: resistance = 0 ohm, set to 1000 ohm",&(here->RESname)); - here->RESresist=1000; + "%s: resistance to low, set to 1 mOhm",&(here->RESname)); + here->RESresist=1e-03; } } } From 2e4e7535b73b7b764b074a7fdf84a711ba150f53 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Tue, 11 Jun 2013 22:49:35 +0200 Subject: [PATCH 178/257] nicomcof.c: update comments --- src/maths/ni/nicomcof.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/maths/ni/nicomcof.c b/src/maths/ni/nicomcof.c index 2dfb8f64b..4fde133e8 100644 --- a/src/maths/ni/nicomcof.c +++ b/src/maths/ni/nicomcof.c @@ -8,9 +8,7 @@ Author: 1985 Thomas L. Quarles #include "ngspice/sperror.h" /* xmu=0: Backward Euler, xmu=0.5: trapezoidal (standard), - xmu=0.48: good damping of current ringing, e.g. in R.O.s. - SpiceOpus adapts xmu to lower values if numerical oscillations - of current in capacitors are detected, t.b.d. */ + xmu=0.48: good damping of current ringing, e.g. in R.O.s. */ #define xmu 0.5 int From e9cadf9dc8edd23ca9f60e5a90f7cfa78609b653 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Fri, 21 Jun 2013 23:24:14 +0200 Subject: [PATCH 179/257] sharedspice.c: preliminary fixes: ftime() usage, prevent crash if controlled_exit from worker thread --- src/sharedspice.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/sharedspice.c b/src/sharedspice.c index fcad3a18a..a6ba69309 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -136,11 +136,9 @@ typedef pthread_t threadId_t; #include #include -#ifndef HAVE_GETRUSAGE #ifdef HAVE_FTIME #include #endif -#endif /* To interupt a spice run */ #include @@ -501,7 +499,6 @@ ngSpice_running (void) } #endif - /* Initialise ngspice and setup native methods */ IMPEXP int @@ -1289,6 +1286,7 @@ void SetAnalyse( int DecaPercent /*in: 10 times the progress [%]*/ /*HWND hwAnalyse, in: global handle to analysis window */ ) { +#ifdef HAVE_FTIME static int OldPercent = -2; /* Previous progress value */ static char OldAn[128]; /* Previous analysis type */ char* s; /* outputs to callback function */ @@ -1352,6 +1350,17 @@ void SetAnalyse( result = statfcn(s, userptr); } tfree(s); +#else + char* s; + int result; + static bool havesent = FALSE; + if (!havesent) { + s = copy("No usage info available"); + result = statfcn(s, userptr); + tfree(s); + havesent = TRUE; + } +#endif } /* a dll or shared library should never exit, if loaded dynamically, @@ -1395,8 +1404,23 @@ void shared_exit(int status) tfree(outsend); } #endif + // if we are in a worker thread, we exit it here + // detaching then has to be done explicitely by the caller + if (fl_running && !fl_exited) { + fl_exited = TRUE; + bgtr(fl_exited, userptr); + // set a flag that ngspice wants to be detached + ngexit(status, FALSE, coquit, userptr); + // finish and exit the worker thread +#ifdef HAVE_LIBPTHREAD + pthread_exit(1); +#elif defined _MSC_VER || defined __MINGW32__ + _endthreadex(1); +#endif + } // set a flag in caller to detach ngspice.dll ngexit(status, immediate, coquit, userptr); + // jump back to finish the calling function if (!intermj) longjmp(errbufm,1); /* jump back to ngSpice_Circ() */ From 5288973f747961e3bacd0b48132c8b085805f273 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 15 Jun 2013 21:39:37 +0200 Subject: [PATCH 180/257] fix for automatic indention this part of > commit f9144f90b3e121ec866bf437e95ebf7aa8aa890e > Author: pnenzi > Date: Tue May 23 20:04:32 2000 +0000 > > Applied Widlok patch is hostile to automatic indention --- src/spicelib/analysis/cktpzstr.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/spicelib/analysis/cktpzstr.c b/src/spicelib/analysis/cktpzstr.c index 4f5d12e97..479e26d04 100644 --- a/src/spicelib/analysis/cktpzstr.c +++ b/src/spicelib/analysis/cktpzstr.c @@ -635,12 +635,12 @@ CKTpzRunTrial(CKTcircuit *ckt, PZtrial **new_trialp, PZtrial **set) if (!(p->flags & ISAROOT) && CKTpzTrapped == 3 && NIpzK != 0.0 && NIpzK_mag > -10) { #ifdef notdef - if (p->flags & ISAROOT) { - /* Ugh! muller doesn't work right */ - new_trial->flags = ISAMINIMA; - new_trial->s.imag = scalb(NIpzK, (int) (NIpzK_mag / 2)); - pretest = 0; - } else { +// if (p->flags & ISAROOT) { +// /* Ugh! muller doesn't work right */ +// new_trial->flags = ISAMINIMA; +// new_trial->s.imag = scalb(NIpzK, (int) (NIpzK_mag / 2)); +// pretest = 0; +// } else { #endif p->flags |= ISAMINIMA; tfree(new_trial); From d2207784b5f71d829c9f6c499f2b4e7fa7ad05a4 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 22 Jun 2013 20:51:33 +0200 Subject: [PATCH 181/257] convert K&R function definitions to ansi style --- src/spicelib/analysis/cktsgen.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/spicelib/analysis/cktsgen.c b/src/spicelib/analysis/cktsgen.c index b50e1e0b1..70cc4c13d 100644 --- a/src/spicelib/analysis/cktsgen.c +++ b/src/spicelib/analysis/cktsgen.c @@ -237,8 +237,8 @@ int set_param(sgen *sg) } #ifdef notdef -sgen_suspend(sg) - sgen *sg; +void +sgen_suspend(sgen *sg) { sg->devlist[sg->dev] = sg->first_model; sg->model->GENnextModel = sg->next_model; @@ -246,8 +246,8 @@ sgen_suspend(sg) sg->model->GENinstances = sg->first_instance; } -sgen_restore(sg) - sgen *sg; +void +sgen_restore(sgen *sg) { sg->devlist[sg->dev] = sg->model; sg->model->GENnextModel = NULL; From 052898ec274049f84749355766b3e6b120712114 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 22 Jun 2013 20:52:14 +0200 Subject: [PATCH 182/257] avoid `(IFuid) 0' cast --- src/spicelib/analysis/cktmknod.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/analysis/cktmknod.c b/src/spicelib/analysis/cktmknod.c index 114f5b9e6..9e6d54066 100644 --- a/src/spicelib/analysis/cktmknod.c +++ b/src/spicelib/analysis/cktmknod.c @@ -26,7 +26,7 @@ CKTmkNode(CKTcircuit *ckt, CKTnode **node) mynode = TMALLOC(CKTnode, 1); if(mynode == NULL) return(E_NOMEM); mynode->next = NULL; - mynode->name = (IFuid) 0; + mynode->name = NULL; if(node) *node = mynode; return(OK); From e8481585f4e778fd70d5bb62258c8975ef53538c Mon Sep 17 00:00:00 2001 From: Henrik Forsten Date: Sun, 23 Jun 2013 00:09:44 +0200 Subject: [PATCH 183/257] inpsymt.c, use "Daniel J. Bernstein" hash function instead of a simple sum. just for note, there is a wealth of newer hash functions. For example "The FNV Non-Cryptographic Hash Algorithm" from http://tools.ietf.org/html/draft-eastlake-fnv-03 --- src/spicelib/parser/inpsymt.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/spicelib/parser/inpsymt.c b/src/spicelib/parser/inpsymt.c index c56f0779d..d77b23265 100644 --- a/src/spicelib/parser/inpsymt.c +++ b/src/spicelib/parser/inpsymt.c @@ -273,10 +273,11 @@ void INPtabEnd(INPtables * tab) static int hash(char *name, int tsize) { - char *s; - register int i = 0; + unsigned int hash = 5381; + char c; - for (s = name; *s; s++) - i += *s; - return (i % tsize); + while ((c = *name++) != '\0') + hash = (hash * 33) ^ (unsigned) c; + + return (int) (hash % (unsigned) tsize); } From e40b1a354cc34a59806f300479020c7d3f4c3768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Forst=C3=A9n?= Date: Mon, 24 Jun 2013 22:01:40 +0200 Subject: [PATCH 184/257] rewrite AlmostEqualUlps() to avoid compiler warnings concerning `strict-aliasing' --- src/maths/misc/equality.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/maths/misc/equality.c b/src/maths/misc/equality.c index 83c4ad3c5..f16380431 100644 --- a/src/maths/misc/equality.c +++ b/src/maths/misc/equality.c @@ -24,6 +24,11 @@ bool AlmostEqualUlps(double A, double B, int maxUlps) { int64_t aInt, bInt, intDiff; + union { + double d; + int64_t i; + } uA, uB; + if (A == B) return TRUE; @@ -34,12 +39,14 @@ bool AlmostEqualUlps(double A, double B, int maxUlps) /* default NAN won't compare as equal to anything. */ assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024); - aInt = *(int64_t*)&A; + uA.d = A; + aInt = uA.i; /* Make aInt lexicographically ordered as a twos-complement int */ if (aInt < 0) aInt = int64_min - aInt; - bInt = *(int64_t*)&B; + uB.d = B; + bInt = uB.i; /* Make bInt lexicographically ordered as a twos-complement int */ if (bInt < 0) bInt = int64_min - bInt; From 868235b3b296c482e8cc8141e0be27e97de31cc2 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 25 Jun 2013 22:03:32 +0200 Subject: [PATCH 185/257] prevent NaN in sqrt for negative value of model parameter PHI --- src/spicelib/devices/mos1/mos1temp.c | 6 +++++- src/spicelib/devices/mos2/mos2temp.c | 6 +++++- src/spicelib/devices/mos3/mos3temp.c | 5 +++++ src/spicelib/devices/mos6/mos6temp.c | 6 +++++- src/spicelib/devices/mos9/mos9temp.c | 6 +++++- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/mos1/mos1temp.c b/src/spicelib/devices/mos1/mos1temp.c index 3764bc96a..e73b6dada 100644 --- a/src/spicelib/devices/mos1/mos1temp.c +++ b/src/spicelib/devices/mos1/mos1temp.c @@ -51,7 +51,11 @@ MOS1temp(GENmodel *inModel, CKTcircuit *ckt) pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); /* now model parameter preprocessing */ - + if (model->MOS1phi <= 0.0) { + SPfrontEnd->IFerror (ERR_FATAL, + "%s: Phi is not positive.",&model->MOS1modName); + return(E_BADPARM); + } if(!model->MOS1oxideThicknessGiven || model->MOS1oxideThickness == 0) { model->MOS1oxideCapFactor = 0; } else { diff --git a/src/spicelib/devices/mos2/mos2temp.c b/src/spicelib/devices/mos2/mos2temp.c index 982c784dd..9f8b19a7e 100644 --- a/src/spicelib/devices/mos2/mos2temp.c +++ b/src/spicelib/devices/mos2/mos2temp.c @@ -53,7 +53,11 @@ MOS2temp(GENmodel *inModel, CKTcircuit *ckt) arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP)); pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); - + if (model->MOS2phi <= 0.0) { + SPfrontEnd->IFerror (ERR_FATAL, + "%s: Phi is not positive.",&model->MOS2modName); + return(E_BADPARM); + } if(!model->MOS2oxideThicknessGiven) { model->MOS2oxideThickness = 1e-7; } diff --git a/src/spicelib/devices/mos3/mos3temp.c b/src/spicelib/devices/mos3/mos3temp.c index 7357b47ae..e91523431 100644 --- a/src/spicelib/devices/mos3/mos3temp.c +++ b/src/spicelib/devices/mos3/mos3temp.c @@ -53,6 +53,11 @@ MOS3temp(GENmodel *inModel, CKTcircuit *ckt) CONSTKoverQ); ni_temp=1.45e16*nifact; + if (model->MOS3phi <= 0.0) { + SPfrontEnd->IFerror (ERR_FATAL, + "%s: Phi is not positive.",&model->MOS3modName); + return(E_BADPARM); + } model->MOS3oxideCapFactor = 3.9 * 8.854214871e-12/ model->MOS3oxideThickness; if(!model->MOS3surfaceMobilityGiven) model->MOS3surfaceMobility=600; diff --git a/src/spicelib/devices/mos6/mos6temp.c b/src/spicelib/devices/mos6/mos6temp.c index 046f62c79..a896700e1 100644 --- a/src/spicelib/devices/mos6/mos6temp.c +++ b/src/spicelib/devices/mos6/mos6temp.c @@ -50,7 +50,11 @@ MOS6temp(GENmodel *inModel, CKTcircuit *ckt) pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1); /* now model parameter preprocessing */ - + if (model->MOS6phi <= 0.0) { + SPfrontEnd->IFerror (ERR_FATAL, + "%s: Phi is not positive.",&model->MOS6modName); + return(E_BADPARM); + } if(!model->MOS6oxideThicknessGiven || model->MOS6oxideThickness == 0) { model->MOS6oxideCapFactor = 0; } else { diff --git a/src/spicelib/devices/mos9/mos9temp.c b/src/spicelib/devices/mos9/mos9temp.c index 0ffcd11df..f71aa6648 100644 --- a/src/spicelib/devices/mos9/mos9temp.c +++ b/src/spicelib/devices/mos9/mos9temp.c @@ -54,7 +54,11 @@ MOS9temp(GENmodel *inModel, CKTcircuit *ckt) CONSTKoverQ); ni_temp=1.45e16*nifact; - + if (model->MOS9phi <= 0.0) { + SPfrontEnd->IFerror (ERR_FATAL, + "%s: Phi is not positive.",&model->MOS9modName); + return(E_BADPARM); + } model->MOS9oxideCapFactor = 3.9 * 8.854214871e-12/ model->MOS9oxideThickness; if(!model->MOS9surfaceMobilityGiven) model->MOS9surfaceMobility=600; From fb1686802f541dabf34c4c1f6c6b6eeb27d7b579 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 27 Jun 2013 20:05:44 +0200 Subject: [PATCH 186/257] allow format like .5 in b-sources --- src/frontend/inpcom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 04719b70e..548929e9a 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -5430,7 +5430,7 @@ inp_bsource_compat(struct line *card) } } ustate = 0; /* we have a number */ - } else if (isdigit(actchar)) { + } else if (isdigit(actchar) || (actchar == '.')) { /* allow .5 format too */ /* allow 100p, 5MEG etc. */ double dvalue = INPevaluate(&str_ptr, &error1, 0); char cvalue[19]; From c659c21e7ea48c8cec75e046bc0c003cb8e95ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Forst=C3=A9n?= Date: Sat, 29 Jun 2013 19:45:50 +0200 Subject: [PATCH 187/257] fix "sytax" spelling --- src/frontend/inpcom.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 548929e9a..54230527c 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -4208,7 +4208,7 @@ inp_compat(struct line *card) // get the expression str_ptr = gettok(&cut_line); /* ignore 'table' */ if (!cieq(str_ptr, "table")) { - fprintf(stderr, "Error: bad sytax in line %d\n %s\n", + fprintf(stderr, "Error: bad syntax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } @@ -4216,7 +4216,7 @@ inp_compat(struct line *card) str_ptr = gettok_char(&cut_line, '{', FALSE, FALSE); expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */ if (!expression || !str_ptr) { - fprintf(stderr, "Error: bad sytax in line %d\n %s\n", + fprintf(stderr, "Error: bad syntax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } @@ -4238,7 +4238,7 @@ inp_compat(struct line *card) str_ptr = cut_line; ffirstno = gettok_node(&cut_line); if (!ffirstno) { - fprintf(stderr, "Error: bad sytax in line %d\n %s\n", + fprintf(stderr, "Error: bad syntax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } @@ -4260,7 +4260,7 @@ inp_compat(struct line *card) delta = (lnumber-fnumber)/2.; lastlastno = gettok_node(&cut_line); if (!secondno || (*midline == 0) || (delta <= 0.) || !lastlastno) { - fprintf(stderr, "Error: bad sytax in line %d\n %s\n", + fprintf(stderr, "Error: bad syntax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } @@ -4400,7 +4400,7 @@ inp_compat(struct line *card) // get the expression str_ptr = gettok(&cut_line); /* ignore 'table' */ if (!cieq(str_ptr, "table")) { - fprintf(stderr, "Error: bad sytax in line %d\n %s\n", + fprintf(stderr, "Error: bad syntax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } @@ -4408,7 +4408,7 @@ inp_compat(struct line *card) str_ptr = gettok_char(&cut_line, '{', FALSE, FALSE); expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */ if (!expression || !str_ptr) { - fprintf(stderr, "Error: bad sytax in line %d\n %s\n", + fprintf(stderr, "Error: bad syntax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } @@ -4430,7 +4430,7 @@ inp_compat(struct line *card) str_ptr = cut_line; ffirstno = gettok_node(&cut_line); if (!ffirstno) { - fprintf(stderr, "Error: bad sytax in line %d\n %s\n", + fprintf(stderr, "Error: bad syntax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } @@ -4452,7 +4452,7 @@ inp_compat(struct line *card) delta = (lnumber-fnumber)/2.; lastlastno = gettok_node(&cut_line); if (!secondno || (*midline == 0) || (delta <= 0.) || !lastlastno) { - fprintf(stderr, "Error: bad sytax in line %d\n %s\n", + fprintf(stderr, "Error: bad syntax in line %d\n %s\n", card->li_linenum_orig, card->li_line); controlled_exit(EXIT_BAD); } From e9e3bf2a698a4ebb6ba68dae24fb525835468454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Forst=C3=A9n?= Date: Sat, 29 Jun 2013 20:00:21 +0200 Subject: [PATCH 188/257] search just once for basic device types --- src/spicelib/parser/inp2c.c | 9 +++++---- src/spicelib/parser/inp2i.c | 9 +++++---- src/spicelib/parser/inp2l.c | 9 +++++---- src/spicelib/parser/inp2r.c | 9 +++++---- src/spicelib/parser/inp2v.c | 9 +++++---- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/spicelib/parser/inp2c.c b/src/spicelib/parser/inp2c.c index b8aaac369..b69453d57 100644 --- a/src/spicelib/parser/inp2c.c +++ b/src/spicelib/parser/inp2c.c @@ -16,7 +16,7 @@ void INP2C(CKTcircuit *ckt, INPtables * tab, card * current) /* parse a capacitor card */ /* Cname [] [] [IC=] */ - int mytype; /* the type we determine capacitors are */ + static int mytype = -1; /* the type we determine capacitors are */ int type = 0; /* the type the model says it is */ char *line; /* the part of the current line left to parse */ char *saveline; /* ... just in case we need to go back... */ @@ -41,10 +41,11 @@ void INP2C(CKTcircuit *ckt, INPtables * tab, card * current) printf("In INP2C, Current line: %s\n", current->line); #endif - mytype = INPtypelook("Capacitor"); if (mytype < 0) { - LITERR("Device type Capacitor not supported by this binary\n"); - return; + if ((mytype = INPtypelook("Capacitor")) < 0) { + LITERR("Device type Capacitor not supported by this binary\n"); + return; + } } line = current->line; INPgetTok(&line, &name, 1); diff --git a/src/spicelib/parser/inp2i.c b/src/spicelib/parser/inp2i.c index 8895eb5fe..644e174b5 100644 --- a/src/spicelib/parser/inp2i.c +++ b/src/spicelib/parser/inp2i.c @@ -17,7 +17,7 @@ void INP2I(CKTcircuit *ckt, INPtables * tab, card * current) /* Iname [ [DC] ] [AC [ [ ] ] ] * [] */ - int type; /* the type the model says it is */ + static int type = -1; /* the type the model says it is */ char *line; /* the part of the current line left to parse */ char *name; /* the resistor's name */ char *nname1; /* the first node's name */ @@ -31,10 +31,11 @@ void INP2I(CKTcircuit *ckt, INPtables * tab, card * current) double leadval; /* actual value of unlabeled number */ IFuid uid; /* uid for default model */ - type = INPtypelook("Isource"); if (type < 0) { - LITERR("Device type Isource not supported by this binary\n"); - return; + if ((type = INPtypelook("Isource")) < 0) { + LITERR("Device type Isource not supported by this binary\n"); + return; + } } line = current->line; INPgetTok(&line, &name, 1); diff --git a/src/spicelib/parser/inp2l.c b/src/spicelib/parser/inp2l.c index d72330a6e..971034698 100644 --- a/src/spicelib/parser/inp2l.c +++ b/src/spicelib/parser/inp2l.c @@ -16,7 +16,7 @@ void INP2L(CKTcircuit *ckt, INPtables * tab, card * current) /* parse an inductor card */ /* Lname [] [] [IC=] */ - int mytype; /* the type we determine inductors are */ + int mytype = -1; /* the type we determine inductors are */ int type = 0; /* the type the model says it is */ char *line; /* the part of the current line left to parse */ char *saveline; /* ... just in case we need to go back... */ @@ -41,10 +41,11 @@ void INP2L(CKTcircuit *ckt, INPtables * tab, card * current) printf("In INP2L, Current line: %s\n", current->line); #endif - mytype = INPtypelook("Inductor"); if (mytype < 0) { - LITERR("Device type Inductor not supported by this binary\n"); - return; + if ((mytype = INPtypelook("Inductor")) < 0) { + LITERR("Device type Inductor not supported by this binary\n"); + return; + } } line = current->line; INPgetTok(&line, &name, 1); diff --git a/src/spicelib/parser/inp2r.c b/src/spicelib/parser/inp2r.c index 29c5b6db3..45dce2d83 100644 --- a/src/spicelib/parser/inp2r.c +++ b/src/spicelib/parser/inp2r.c @@ -22,7 +22,7 @@ void INP2R(CKTcircuit *ckt, INPtables * tab, card * current) /* parse a resistor card */ /* Rname [][][w=][l=][ac=] */ - int mytype; /* the type we determine resistors are */ + static int mytype = -1; /* the type we determine resistors are */ int type = 0; /* the type the model says it is */ char *line; /* the part of the current line left to parse */ char *saveline; /* ... just in case we need to go back... */ @@ -49,10 +49,11 @@ void INP2R(CKTcircuit *ckt, INPtables * tab, card * current) printf("In INP2R, Current line: %s\n", current->line); #endif - mytype = INPtypelook("Resistor"); if (mytype < 0) { - LITERR("Device type Resistor not supported by this binary\n"); - return; + if ((mytype = INPtypelook("Resistor")) < 0) { + LITERR("Device type Resistor not supported by this binary\n"); + return; + } } line = current->line; INPgetTok(&line, &name, 1); /* Rname */ diff --git a/src/spicelib/parser/inp2v.c b/src/spicelib/parser/inp2v.c index 01ce5ddf8..0c726ad18 100644 --- a/src/spicelib/parser/inp2v.c +++ b/src/spicelib/parser/inp2v.c @@ -17,7 +17,7 @@ void INP2V(CKTcircuit *ckt, INPtables * tab, card * current) /* Vname [ [DC] ] [AC [ [ ] ] ] * [] */ - int type; /* the type the model says it is */ + static int type = -1; /* the type the model says it is */ char *line; /* the part of the current line left to parse */ char *name; /* the resistor's name */ char *nname1; /* the first node's name */ @@ -31,10 +31,11 @@ void INP2V(CKTcircuit *ckt, INPtables * tab, card * current) double leadval; /* actual value of unlabeled number */ IFuid uid; /* uid for default model */ - type = INPtypelook("Vsource"); if (type < 0) { - LITERR("Device type Vsource not supported by this binary\n"); - return; + if ((type = INPtypelook("Vsource")) < 0) { + LITERR("Device type Vsource not supported by this binary\n"); + return; + } } line = current->line; INPgetTok(&line, &name, 1); From 03dfb3bd227310d47315fb2f17bee1c00f7ea17e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Forst=C3=A9n?= Date: Sat, 29 Jun 2013 21:29:40 +0200 Subject: [PATCH 189/257] numparm, speedup modernizeex() for the common case --- src/frontend/numparam/spicenum.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/frontend/numparam/spicenum.c b/src/frontend/numparam/spicenum.c index 5010c6470..4b98d5062 100644 --- a/src/frontend/numparam/spicenum.c +++ b/src/frontend/numparam/spicenum.c @@ -243,6 +243,11 @@ modernizeex(SPICE_DSTRINGPTR dstr_p) state = 0; ls = spice_dstring_length(dstr_p); s = spice_dstring_value(dstr_p); + + /* check if string might need modernizing */ + if (!memchr(s, Intro, (size_t) ls)) + return; + spice_dstring_init(&t); while (i < ls) { From 5b7a6d6c3774640f7a077d4038aaab84b7673189 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 11:38:12 +0200 Subject: [PATCH 190/257] abstraction, new function `find_instance()' --- src/spicelib/devices/cktfinddev.c | 32 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/spicelib/devices/cktfinddev.c b/src/spicelib/devices/cktfinddev.c index 2db4ff231..4956073c5 100644 --- a/src/spicelib/devices/cktfinddev.c +++ b/src/spicelib/devices/cktfinddev.c @@ -10,6 +10,17 @@ Author: 1985 Thomas L. Quarles #include "string.h" +static GENinstance * +find_instance(GENinstance *here, IFuid name) +{ + for (; here; here = here->GENnextInstance) + if (here->GENname == name) + return here; + + return NULL; +} + + int CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel *modfast, IFuid modname) { @@ -28,8 +39,8 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * if(modfast) { /* have model, just need device */ mods = modfast; - for (here = mods->GENinstances; here != NULL; here = here->GENnextInstance) { - if (here->GENname == name) { + here = find_instance(mods->GENinstances, name); + if (here) { if (fast != NULL) *fast = here; @@ -38,7 +49,6 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * return OK; } - } return E_NODEV; } @@ -51,16 +61,12 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * { /* and all instances */ if (modname == NULL || mods->GENmodName == modname) { - for (here = mods->GENinstances; - here != NULL; - here = here->GENnextInstance) - { - if (here->GENname == name) { + here = find_instance(mods->GENinstances, name); + if (here) { if (fast != 0) *fast = here; return OK; } - } if(mods->GENmodName == modname) { return E_NODEV; } @@ -77,16 +83,12 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * { /* and all instances */ if(modname == NULL || mods->GENmodName == modname) { - for (here = mods->GENinstances; - here != NULL; - here = here->GENnextInstance) - { - if (here->GENname == name) { + here = find_instance(mods->GENinstances, name); + if (here) { if(fast != 0) *fast = here; return OK; } - } if(mods->GENmodName == modname) { return E_NODEV; } From 065d71d1a846a7cbba9f74f642699cac9f070481 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 12:47:24 +0200 Subject: [PATCH 191/257] CKTfndDev(), #1/6, whitespace --- src/spicelib/devices/cktfinddev.c | 128 +++++++++++++++--------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/src/spicelib/devices/cktfinddev.c b/src/spicelib/devices/cktfinddev.c index 4956073c5..c37224118 100644 --- a/src/spicelib/devices/cktfinddev.c +++ b/src/spicelib/devices/cktfinddev.c @@ -24,79 +24,79 @@ find_instance(GENinstance *here, IFuid name) int CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel *modfast, IFuid modname) { - GENinstance *here; - GENmodel *mods; + GENinstance *here; + GENmodel *mods; - if(fast != NULL && - *fast != NULL) - { - /* already have fast, so nothing much to do just get & set type */ - if (type) - *type = (*fast)->GENmodPtr->GENmodType; - return(OK); - } + if (fast != NULL && + *fast != NULL) + { + /* already have fast, so nothing much to do just get & set type */ + if (type) + *type = (*fast)->GENmodPtr->GENmodType; + return(OK); + } - if(modfast) { - /* have model, just need device */ - mods = modfast; - here = find_instance(mods->GENinstances, name); - if (here) { + if (modfast) { + /* have model, just need device */ + mods = modfast; + here = find_instance(mods->GENinstances, name); + if (here) { if (fast != NULL) - *fast = here; + *fast = here; if (type) - *type = mods->GENmodType; + *type = mods->GENmodType; return OK; - } - return E_NODEV; - } + } + return E_NODEV; + } - if (*type >= 0 && *type < DEVmaxnum) { - /* have device type, need to find model & device */ - /* look through all models */ - for (mods = ckt->CKThead[*type]; - mods != NULL ; - mods = mods->GENnextModel) - { - /* and all instances */ - if (modname == NULL || mods->GENmodName == modname) { - here = find_instance(mods->GENinstances, name); - if (here) { - if (fast != 0) - *fast = here; - return OK; - } - if(mods->GENmodName == modname) { - return E_NODEV; - } - } - } - return E_NOMOD; - } else if (*type == -1) { - /* look through all types (UGH - worst case - take forever) */ - for(*type = 0; *type < DEVmaxnum; (*type)++) { - /* need to find model & device */ - /* look through all models */ - for(mods = ckt->CKThead[*type]; mods != NULL; - mods = mods->GENnextModel) - { + if (*type >= 0 && *type < DEVmaxnum) { + /* have device type, need to find model & device */ + /* look through all models */ + for (mods = ckt->CKThead[*type]; + mods != NULL ; + mods = mods->GENnextModel) + { /* and all instances */ - if(modname == NULL || mods->GENmodName == modname) { - here = find_instance(mods->GENinstances, name); - if (here) { - if(fast != 0) + if (modname == NULL || mods->GENmodName == modname) { + here = find_instance(mods->GENinstances, name); + if (here) { + if (fast != 0) *fast = here; - return OK; - } - if(mods->GENmodName == modname) { - return E_NODEV; - } + return OK; + } + if (mods->GENmodName == modname) { + return E_NODEV; + } } - } - } - *type = -1; - return E_NODEV; - } else - return E_BADPARM; + } + return E_NOMOD; + } else if (*type == -1) { + /* look through all types (UGH - worst case - take forever) */ + for (*type = 0; *type < DEVmaxnum; (*type)++) { + /* need to find model & device */ + /* look through all models */ + for (mods = ckt->CKThead[*type]; mods != NULL; + mods = mods->GENnextModel) + { + /* and all instances */ + if (modname == NULL || mods->GENmodName == modname) { + here = find_instance(mods->GENinstances, name); + if (here) { + if (fast != 0) + *fast = here; + return OK; + } + if (mods->GENmodName == modname) { + return E_NODEV; + } + } + } + } + *type = -1; + return E_NODEV; + } else + return E_BADPARM; } From eb973396379fb7c2e13c45fe643da6ea4b341515 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 12:47:50 +0200 Subject: [PATCH 192/257] CKTfndDev(), #2/6, cleanup --- src/spicelib/devices/cktfinddev.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/spicelib/devices/cktfinddev.c b/src/spicelib/devices/cktfinddev.c index c37224118..fe870fc1d 100644 --- a/src/spicelib/devices/cktfinddev.c +++ b/src/spicelib/devices/cktfinddev.c @@ -33,7 +33,7 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * /* already have fast, so nothing much to do just get & set type */ if (type) *type = (*fast)->GENmodPtr->GENmodType; - return(OK); + return OK; } if (modfast) { @@ -67,9 +67,8 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * *fast = here; return OK; } - if (mods->GENmodName == modname) { + if (mods->GENmodName == modname) return E_NODEV; - } } } return E_NOMOD; @@ -89,9 +88,8 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * *fast = here; return OK; } - if (mods->GENmodName == modname) { + if (mods->GENmodName == modname) return E_NODEV; - } } } } From d2759742bed97d8f76c60fa6b55b94684c9a4605 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 12:47:59 +0200 Subject: [PATCH 193/257] CKTfndDev(), #3/6, cleanup --- src/spicelib/devices/cktfinddev.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/spicelib/devices/cktfinddev.c b/src/spicelib/devices/cktfinddev.c index fe870fc1d..31e7da113 100644 --- a/src/spicelib/devices/cktfinddev.c +++ b/src/spicelib/devices/cktfinddev.c @@ -27,8 +27,8 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * GENinstance *here; GENmodel *mods; - if (fast != NULL && - *fast != NULL) + if (fast && + *fast) { /* already have fast, so nothing much to do just get & set type */ if (type) @@ -41,7 +41,7 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * mods = modfast; here = find_instance(mods->GENinstances, name); if (here) { - if (fast != NULL) + if (fast) *fast = here; if (type) @@ -56,14 +56,14 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * /* have device type, need to find model & device */ /* look through all models */ for (mods = ckt->CKThead[*type]; - mods != NULL ; + mods ; mods = mods->GENnextModel) { /* and all instances */ - if (modname == NULL || mods->GENmodName == modname) { + if (!modname || mods->GENmodName == modname) { here = find_instance(mods->GENinstances, name); if (here) { - if (fast != 0) + if (fast) *fast = here; return OK; } @@ -77,14 +77,14 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * for (*type = 0; *type < DEVmaxnum; (*type)++) { /* need to find model & device */ /* look through all models */ - for (mods = ckt->CKThead[*type]; mods != NULL; + for (mods = ckt->CKThead[*type]; mods; mods = mods->GENnextModel) { /* and all instances */ - if (modname == NULL || mods->GENmodName == modname) { + if (!modname || mods->GENmodName == modname) { here = find_instance(mods->GENinstances, name); if (here) { - if (fast != 0) + if (fast) *fast = here; return OK; } From 3fcf1ea8559a6de18be86e11a8c6828199e4d0e3 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 12:48:12 +0200 Subject: [PATCH 194/257] CKTfndDev(), #4/6, cleanup --- src/spicelib/devices/cktfinddev.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/spicelib/devices/cktfinddev.c b/src/spicelib/devices/cktfinddev.c index 31e7da113..f6da1ea82 100644 --- a/src/spicelib/devices/cktfinddev.c +++ b/src/spicelib/devices/cktfinddev.c @@ -27,9 +27,7 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * GENinstance *here; GENmodel *mods; - if (fast && - *fast) - { + if (fast && *fast) { /* already have fast, so nothing much to do just get & set type */ if (type) *type = (*fast)->GENmodPtr->GENmodType; @@ -55,10 +53,7 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * if (*type >= 0 && *type < DEVmaxnum) { /* have device type, need to find model & device */ /* look through all models */ - for (mods = ckt->CKThead[*type]; - mods ; - mods = mods->GENnextModel) - { + for (mods = ckt->CKThead[*type]; mods ; mods = mods->GENnextModel) { /* and all instances */ if (!modname || mods->GENmodName == modname) { here = find_instance(mods->GENinstances, name); @@ -72,14 +67,14 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * } } return E_NOMOD; - } else if (*type == -1) { + } + + if (*type == -1) { /* look through all types (UGH - worst case - take forever) */ for (*type = 0; *type < DEVmaxnum; (*type)++) { /* need to find model & device */ /* look through all models */ - for (mods = ckt->CKThead[*type]; mods; - mods = mods->GENnextModel) - { + for (mods = ckt->CKThead[*type]; mods; mods = mods->GENnextModel) { /* and all instances */ if (!modname || mods->GENmodName == modname) { here = find_instance(mods->GENinstances, name); @@ -95,6 +90,7 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * } *type = -1; return E_NODEV; - } else - return E_BADPARM; + } + + return E_BADPARM; } From 8a32c75138d8431475b6bcd23c1d35b1386d1ae1 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 12:48:37 +0200 Subject: [PATCH 195/257] CKTfndDev(), #5/6, cleanup --- src/spicelib/devices/cktfinddev.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/spicelib/devices/cktfinddev.c b/src/spicelib/devices/cktfinddev.c index f6da1ea82..89e99c9f2 100644 --- a/src/spicelib/devices/cktfinddev.c +++ b/src/spicelib/devices/cktfinddev.c @@ -27,15 +27,15 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * GENinstance *here; GENmodel *mods; + /* we know the device instance `fast' */ if (fast && *fast) { - /* already have fast, so nothing much to do just get & set type */ if (type) *type = (*fast)->GENmodPtr->GENmodType; return OK; } + /* we know the model `modfast', but need to find the device instance */ if (modfast) { - /* have model, just need device */ mods = modfast; here = find_instance(mods->GENinstances, name); if (here) { @@ -50,8 +50,8 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * return E_NODEV; } + /* we know device `type', but need to find model and device instance */ if (*type >= 0 && *type < DEVmaxnum) { - /* have device type, need to find model & device */ /* look through all models */ for (mods = ckt->CKThead[*type]; mods ; mods = mods->GENnextModel) { /* and all instances */ @@ -69,10 +69,9 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * return E_NOMOD; } + /* we don't even know `type', search all of them */ if (*type == -1) { - /* look through all types (UGH - worst case - take forever) */ for (*type = 0; *type < DEVmaxnum; (*type)++) { - /* need to find model & device */ /* look through all models */ for (mods = ckt->CKThead[*type]; mods; mods = mods->GENnextModel) { /* and all instances */ From 0afe0eab8fe8dc07d08a323f0b0b80ab3d9f7597 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 12:48:47 +0200 Subject: [PATCH 196/257] CKTfndDev(), #6/6, cleanup --- src/spicelib/devices/cktfinddev.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/spicelib/devices/cktfinddev.c b/src/spicelib/devices/cktfinddev.c index 89e99c9f2..23087fafb 100644 --- a/src/spicelib/devices/cktfinddev.c +++ b/src/spicelib/devices/cktfinddev.c @@ -36,14 +36,13 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * /* we know the model `modfast', but need to find the device instance */ if (modfast) { - mods = modfast; - here = find_instance(mods->GENinstances, name); + here = find_instance(modfast->GENinstances, name); if (here) { if (fast) *fast = here; if (type) - *type = mods->GENmodType; + *type = modfast->GENmodType; return OK; } From fa1d115ec2cc53140888addc386687ab8b10b9fd Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 20:23:58 +0200 Subject: [PATCH 197/257] unify, use `ckt' instead of `ck' --- src/frontend/spiceif.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/spiceif.c b/src/frontend/spiceif.c index 08c81ad4d..b72060604 100644 --- a/src/frontend/spiceif.c +++ b/src/frontend/spiceif.c @@ -81,10 +81,10 @@ static IFvalue *doask(CKTcircuit *ckt, int typecode, GENinstance *dev, GENmodel IFparm *opt, int ind); static int doset(CKTcircuit *ckt, int typecode, GENinstance *dev, GENmodel *mod, IFparm *opt, struct dvec *val); -static int finddev(CKTcircuit *ck, char *name, GENinstance **devptr, GENmodel **modptr); +static int finddev(CKTcircuit *ckt, char *name, GENinstance **devptr, GENmodel **modptr); /* espice fix integration */ -static int finddev_special(CKTcircuit *ck, char *name, GENinstance **devptr, GENmodel **modptr, int *device_or_model); +static int finddev_special(CKTcircuit *ckt, char *name, GENinstance **devptr, GENmodel **modptr, int *device_or_model); /* Input a single deck, and return a pointer to the circuit. */ @@ -1212,19 +1212,19 @@ doset(CKTcircuit *ckt, int typecode, GENinstance *dev, GENmodel *mod, IFparm *op */ static int -finddev(CKTcircuit *ck, char *name, GENinstance **devptr, GENmodel **modptr) +finddev(CKTcircuit *ckt, char *name, GENinstance **devptr, GENmodel **modptr) { int err; int type = -1; - err = ft_sim->findInstance (ck, &type, devptr, name, NULL, NULL); + err = ft_sim->findInstance (ckt, &type, devptr, name, NULL, NULL); if (err == OK) return (type); type = -1; *devptr = NULL; - err = ft_sim->findModel (ck, &type, modptr, name); + err = ft_sim->findModel (ckt, &type, modptr, name); if (err == OK) return (type); From 0cc59b1dc8d337e6da0f29c7c0660ca687bdcd0a Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 20:24:13 +0200 Subject: [PATCH 198/257] cleanup CKTfndDev(), findInstance() invocation --- src/spicelib/analysis/noisean.c | 6 ++---- src/spicelib/analysis/tfanal.c | 7 ++----- src/spicelib/devices/ind/mutsetup.c | 6 ++---- src/spicelib/parser/inpaname.c | 3 +-- src/unsupported/snstart.c | 4 +--- 5 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/spicelib/analysis/noisean.c b/src/spicelib/analysis/noisean.c index 06a2ae81c..f42c6f33e 100644 --- a/src/spicelib/analysis/noisean.c +++ b/src/spicelib/analysis/noisean.c @@ -47,8 +47,7 @@ NOISEan (CKTcircuit *ckt, int restart) inst = NULL; code = CKTtypelook("Vsource"); if (code != -1) { - error = CKTfndDev(ckt, &code, &inst, - job->input, NULL, NULL); + error = CKTfndDev(ckt, &code, &inst, job->input, NULL, NULL); if (!error && !((VSRCinstance *)inst)->VSRCacGiven) { errMsg = TMALLOC(char, strlen(noacinput) + 1); strcpy(errMsg,noacinput); @@ -58,8 +57,7 @@ NOISEan (CKTcircuit *ckt, int restart) code = CKTtypelook("Isource"); if (code != -1 && inst==NULL) { - error = CKTfndDev(ckt, &code, &inst, - job->input, NULL, NULL); + error = CKTfndDev(ckt, &code, &inst, job->input, NULL, NULL); if (error) { /* XXX ??? */ SPfrontEnd->IFerror (ERR_WARNING, diff --git a/src/spicelib/analysis/tfanal.c b/src/spicelib/analysis/tfanal.c index aa7fa2439..c29f32a5b 100644 --- a/src/spicelib/analysis/tfanal.c +++ b/src/spicelib/analysis/tfanal.c @@ -51,8 +51,7 @@ TFanal(CKTcircuit *ckt, int restart) Itype = CKTtypelook("Isource"); Vtype = CKTtypelook("Vsource"); if(Itype != -1) { - error = CKTfndDev(ckt,&Itype,&ptr, - job->TFinSrc, NULL, NULL); + error = CKTfndDev(ckt, &Itype, &ptr, job->TFinSrc, NULL, NULL); if(error ==0) { job->TFinIsI = 1; job->TFinIsV = 0; @@ -62,9 +61,7 @@ TFanal(CKTcircuit *ckt, int restart) } if( (Vtype != -1) && (ptr==NULL) ) { - error = CKTfndDev(ckt,&Vtype,&ptr, - job->TFinSrc, NULL, - NULL); + error = CKTfndDev(ckt, &Vtype, &ptr, job->TFinSrc, NULL, NULL); job->TFinIsV = 1; job->TFinIsI = 0; if(error !=0) { diff --git a/src/spicelib/devices/ind/mutsetup.c b/src/spicelib/devices/ind/mutsetup.c index fd19a3710..07f221ab1 100644 --- a/src/spicelib/devices/ind/mutsetup.c +++ b/src/spicelib/devices/ind/mutsetup.c @@ -43,8 +43,7 @@ MUTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) return(E_INTERN); } - error = CKTfndDev(ckt,&ktype,(GENinstance **)&(here->MUTind1), - here->MUTindName1, NULL, NULL); + error = CKTfndDev(ckt, &ktype, (GENinstance **) &(here->MUTind1), here->MUTindName1, NULL, NULL); if(error && error!= E_NODEV && error != E_NOMOD) return(error); if(error) { IFuid namarray[2]; @@ -54,8 +53,7 @@ MUTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) "%s: coupling to non-existant inductor %s.", namarray); } - error = CKTfndDev(ckt,&ktype,(GENinstance **)&(here->MUTind2), - here->MUTindName2, NULL, NULL); + error = CKTfndDev(ckt, &ktype, (GENinstance **) &(here->MUTind2), here->MUTindName2, NULL, NULL); if(error && error!= E_NODEV && error != E_NOMOD) return(error); if(error) { IFuid namarray[2]; diff --git a/src/spicelib/parser/inpaname.c b/src/spicelib/parser/inpaname.c index 5a251f916..2679835f9 100644 --- a/src/spicelib/parser/inpaname.c +++ b/src/spicelib/parser/inpaname.c @@ -40,8 +40,7 @@ INPaName(char *parm, IFvalue * val, CKTcircuit *ckt, int *dev, char *devnam, * (name, type, direct pointer) - the type and direct pointer * WILL be set on return unless error is not OK */ - error = sim->findInstance (ckt, dev, fast, devnam, NULL, - NULL); + error = sim->findInstance (ckt, dev, fast, devnam, NULL, NULL); if (error) return (error); diff --git a/src/unsupported/snstart.c b/src/unsupported/snstart.c index 9d812494a..ce29683b1 100644 --- a/src/unsupported/snstart.c +++ b/src/unsupported/snstart.c @@ -43,9 +43,7 @@ SENstartup(CKTcircuit *ckt, int restart) type = -1; fast = NULL; - err = CKTfndDev(ckt, &type, &fast, - ckt->CKTsenInfo->SENdevices[i], - NULL, NULL); + err = CKTfndDev(ckt, &type, &fast, ckt->CKTsenInfo->SENdevices[i], NULL, NULL); if (err != OK) return err; From 113d4ede7a8dc7e9f50c887cdf8bf7eebcaa90a6 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 30 Jun 2013 20:24:21 +0200 Subject: [PATCH 199/257] CKTfndDev(), drop unused argument `modname' which is always NULL --- src/frontend/spiceif.c | 4 ++-- src/include/ngspice/cktdefs.h | 2 +- src/include/ngspice/ifsim.h | 2 +- src/spicelib/analysis/noisean.c | 4 ++-- src/spicelib/analysis/tfanal.c | 4 ++-- src/spicelib/devices/cktcrte.c | 2 +- src/spicelib/devices/cktfinddev.c | 10 +++------- src/spicelib/devices/ind/mutsetup.c | 4 ++-- src/spicelib/parser/inpaname.c | 2 +- src/tclspice.c | 2 +- src/unsupported/snstart.c | 2 +- 11 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/frontend/spiceif.c b/src/frontend/spiceif.c index b72060604..671f88da0 100644 --- a/src/frontend/spiceif.c +++ b/src/frontend/spiceif.c @@ -616,7 +616,7 @@ finddev_special( int err; int type = -1; - err = ft_sim->findInstance (ckt, &type, devptr, name, NULL, NULL); + err = ft_sim->findInstance (ckt, &type, devptr, name, NULL); if (err == OK) { *device_or_model = 0; return (type); @@ -1217,7 +1217,7 @@ finddev(CKTcircuit *ckt, char *name, GENinstance **devptr, GENmodel **modptr) int err; int type = -1; - err = ft_sim->findInstance (ckt, &type, devptr, name, NULL, NULL); + err = ft_sim->findInstance (ckt, &type, devptr, name, NULL); if (err == OK) return (type); diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 80ac6259e..2126aff36 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -316,7 +316,7 @@ extern void NDEVacct(CKTcircuit *ckt, FILE *file); extern void CKTncDump(CKTcircuit *); extern int CKTfndAnal(CKTcircuit *, int *, JOB **, IFuid , TSKtask *, IFuid); extern int CKTfndBranch(CKTcircuit *, IFuid); -extern int CKTfndDev(CKTcircuit *, int *, GENinstance **, IFuid , GENmodel *, IFuid); +extern int CKTfndDev(CKTcircuit *, int *, GENinstance **, IFuid , GENmodel *); extern int CKTfndMod(CKTcircuit *, int *, GENmodel **, IFuid); extern int CKTfndNode(CKTcircuit *, CKTnode **, IFuid); extern int CKTfndTask(CKTcircuit *, TSKtask **, IFuid ); diff --git a/src/include/ngspice/ifsim.h b/src/include/ngspice/ifsim.h index 47b328435..e24f4f111 100644 --- a/src/include/ngspice/ifsim.h +++ b/src/include/ngspice/ifsim.h @@ -370,7 +370,7 @@ struct IFsimulator { /* set a parameter on an instance */ int (*askInstanceQuest) (CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); /* ask a question about an instance */ - int (*findInstance) (CKTcircuit *, int *, GENinstance **, IFuid, GENmodel *, IFuid); + int (*findInstance) (CKTcircuit *, int *, GENinstance **, IFuid, GENmodel *); /* find a specific instance */ int (*deleteInstance) (CKTcircuit *, void *); /* delete an instance from the circuit */ diff --git a/src/spicelib/analysis/noisean.c b/src/spicelib/analysis/noisean.c index f42c6f33e..f154c08f3 100644 --- a/src/spicelib/analysis/noisean.c +++ b/src/spicelib/analysis/noisean.c @@ -47,7 +47,7 @@ NOISEan (CKTcircuit *ckt, int restart) inst = NULL; code = CKTtypelook("Vsource"); if (code != -1) { - error = CKTfndDev(ckt, &code, &inst, job->input, NULL, NULL); + error = CKTfndDev(ckt, &code, &inst, job->input, NULL); if (!error && !((VSRCinstance *)inst)->VSRCacGiven) { errMsg = TMALLOC(char, strlen(noacinput) + 1); strcpy(errMsg,noacinput); @@ -57,7 +57,7 @@ NOISEan (CKTcircuit *ckt, int restart) code = CKTtypelook("Isource"); if (code != -1 && inst==NULL) { - error = CKTfndDev(ckt, &code, &inst, job->input, NULL, NULL); + error = CKTfndDev(ckt, &code, &inst, job->input, NULL); if (error) { /* XXX ??? */ SPfrontEnd->IFerror (ERR_WARNING, diff --git a/src/spicelib/analysis/tfanal.c b/src/spicelib/analysis/tfanal.c index c29f32a5b..b1b2c7cda 100644 --- a/src/spicelib/analysis/tfanal.c +++ b/src/spicelib/analysis/tfanal.c @@ -51,7 +51,7 @@ TFanal(CKTcircuit *ckt, int restart) Itype = CKTtypelook("Isource"); Vtype = CKTtypelook("Vsource"); if(Itype != -1) { - error = CKTfndDev(ckt, &Itype, &ptr, job->TFinSrc, NULL, NULL); + error = CKTfndDev(ckt, &Itype, &ptr, job->TFinSrc, NULL); if(error ==0) { job->TFinIsI = 1; job->TFinIsV = 0; @@ -61,7 +61,7 @@ TFanal(CKTcircuit *ckt, int restart) } if( (Vtype != -1) && (ptr==NULL) ) { - error = CKTfndDev(ckt, &Vtype, &ptr, job->TFinSrc, NULL, NULL); + error = CKTfndDev(ckt, &Vtype, &ptr, job->TFinSrc, NULL); job->TFinIsV = 1; job->TFinIsI = 0; if(error !=0) { diff --git a/src/spicelib/devices/cktcrte.c b/src/spicelib/devices/cktcrte.c index 6a9bb0ddc..549287d9c 100644 --- a/src/spicelib/devices/cktcrte.c +++ b/src/spicelib/devices/cktcrte.c @@ -31,7 +31,7 @@ CKTcrtElt(CKTcircuit *ckt, GENmodel *modPtr, GENinstance **inInstPtr, IFuid name type = modPtr->GENmodType; - error = CKTfndDev(ckt, &type, &instPtr, name, modPtr, NULL); + error = CKTfndDev(ckt, &type, &instPtr, name, modPtr); if (error == OK) { if (inInstPtr) diff --git a/src/spicelib/devices/cktfinddev.c b/src/spicelib/devices/cktfinddev.c index 23087fafb..19359fe69 100644 --- a/src/spicelib/devices/cktfinddev.c +++ b/src/spicelib/devices/cktfinddev.c @@ -22,7 +22,7 @@ find_instance(GENinstance *here, IFuid name) int -CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel *modfast, IFuid modname) +CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel *modfast) { GENinstance *here; GENmodel *mods; @@ -54,16 +54,14 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * /* look through all models */ for (mods = ckt->CKThead[*type]; mods ; mods = mods->GENnextModel) { /* and all instances */ - if (!modname || mods->GENmodName == modname) { here = find_instance(mods->GENinstances, name); if (here) { if (fast) *fast = here; return OK; } - if (mods->GENmodName == modname) + if (mods->GENmodName == NULL) return E_NODEV; - } } return E_NOMOD; } @@ -74,16 +72,14 @@ CKTfndDev(CKTcircuit *ckt, int *type, GENinstance **fast, IFuid name, GENmodel * /* look through all models */ for (mods = ckt->CKThead[*type]; mods; mods = mods->GENnextModel) { /* and all instances */ - if (!modname || mods->GENmodName == modname) { here = find_instance(mods->GENinstances, name); if (here) { if (fast) *fast = here; return OK; } - if (mods->GENmodName == modname) + if (mods->GENmodName == NULL) return E_NODEV; - } } } *type = -1; diff --git a/src/spicelib/devices/ind/mutsetup.c b/src/spicelib/devices/ind/mutsetup.c index 07f221ab1..ae7fc1cab 100644 --- a/src/spicelib/devices/ind/mutsetup.c +++ b/src/spicelib/devices/ind/mutsetup.c @@ -43,7 +43,7 @@ MUTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) return(E_INTERN); } - error = CKTfndDev(ckt, &ktype, (GENinstance **) &(here->MUTind1), here->MUTindName1, NULL, NULL); + error = CKTfndDev(ckt, &ktype, (GENinstance **) &(here->MUTind1), here->MUTindName1, NULL); if(error && error!= E_NODEV && error != E_NOMOD) return(error); if(error) { IFuid namarray[2]; @@ -53,7 +53,7 @@ MUTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) "%s: coupling to non-existant inductor %s.", namarray); } - error = CKTfndDev(ckt, &ktype, (GENinstance **) &(here->MUTind2), here->MUTindName2, NULL, NULL); + error = CKTfndDev(ckt, &ktype, (GENinstance **) &(here->MUTind2), here->MUTindName2, NULL); if(error && error!= E_NODEV && error != E_NOMOD) return(error); if(error) { IFuid namarray[2]; diff --git a/src/spicelib/parser/inpaname.c b/src/spicelib/parser/inpaname.c index 2679835f9..ed8f65d45 100644 --- a/src/spicelib/parser/inpaname.c +++ b/src/spicelib/parser/inpaname.c @@ -40,7 +40,7 @@ INPaName(char *parm, IFvalue * val, CKTcircuit *ckt, int *dev, char *devnam, * (name, type, direct pointer) - the type and direct pointer * WILL be set on return unless error is not OK */ - error = sim->findInstance (ckt, dev, fast, devnam, NULL, NULL); + error = sim->findInstance (ckt, dev, fast, devnam, NULL); if (error) return (error); diff --git a/src/tclspice.c b/src/tclspice.c index 4c3201c55..a5b323c2e 100644 --- a/src/tclspice.c +++ b/src/tclspice.c @@ -1394,7 +1394,7 @@ get_mod_param TCL_CMDPROCARGS(clientData, interp, argc, argv) /* get the unique IFuid for name (device/model) */ INPretrieve(&name, ft_curckt->ci_symtab); - err = ft_sim->findInstance (ft_curckt->ci_ckt, &typecode, &devptr, name, NULL, NULL); + err = ft_sim->findInstance (ft_curckt->ci_ckt, &typecode, &devptr, name, NULL); if (err != OK) { typecode = -1; devptr = NULL; diff --git a/src/unsupported/snstart.c b/src/unsupported/snstart.c index ce29683b1..c12af4560 100644 --- a/src/unsupported/snstart.c +++ b/src/unsupported/snstart.c @@ -43,7 +43,7 @@ SENstartup(CKTcircuit *ckt, int restart) type = -1; fast = NULL; - err = CKTfndDev(ckt, &type, &fast, ckt->CKTsenInfo->SENdevices[i], NULL, NULL); + err = CKTfndDev(ckt, &type, &fast, ckt->CKTsenInfo->SENdevices[i], NULL); if (err != OK) return err; From 9552449c87f50fa1e285589b21a7fe3b31c93d56 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 7 Jul 2013 11:35:29 +0200 Subject: [PATCH 200/257] inp2y.c, TXL bug fix reported by John Reuben P on the ngspice-users mailing list need to insert instance names into the symbol table with INPinsert() --- src/spicelib/parser/inp2y.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/spicelib/parser/inp2y.c b/src/spicelib/parser/inp2y.c index 49545098d..a735e6737 100644 --- a/src/spicelib/parser/inp2y.c +++ b/src/spicelib/parser/inp2y.c @@ -30,8 +30,8 @@ char *buf; /* temporary buffer for parsing */ char *model; /* the name of the resistor's model */ char *nname1; /* the first node's name */ char *nname2; /* the second node's name */ -char rname1[10], rname2[10], rname3[10]; -char cname1[10], cname2[10], cname3[10], cname4[10]; +char *rname1, *rname2, *rname3; +char *cname1, *cname2, *cname3, *cname4; char *internal1, *internal2; char *ground1, *ground2; CKTnode *node1; /* the first node's node pointer */ @@ -115,15 +115,16 @@ int lenvalgiven = 0; INPgetTok(&line,&buf,1); } if (lenval && rval && lval && rval/lval > 1.6e10) { - /* use 3-pi model */ + /* use 3-pi model for high resistance as fall back */ rval = 3.0 / (rval * lenval); cval = cval * lenval / 6.0; type = INPtypelook("Resistor"); /* resistor between node1 and internal1 */ - internal1 = TMALLOC(char, 10); + internal1 = TMALLOC(char, 10 + strlen(name)); strcpy(internal1, "txlnd1"); + strcat(internal1, name); INPtermInsert(ckt, &internal1, tab, &inode1); if(!tab->defRmod) { /* create default R model */ @@ -131,7 +132,10 @@ int lenvalgiven = 0; IFC(newModel, (ckt,type,&(tab->defRmod),uid)) } mdfast = tab->defRmod; + rname1 = TMALLOC(char, 10 + strlen(name)); strcpy(rname1, "txlres1"); + strcat(rname1, name); + INPinsert(&rname1, tab); IFC(newInstance,(ckt,mdfast,&fast,rname1)) IFC(bindNode,(ckt,fast,1,node1)) IFC(bindNode,(ckt,fast,2,inode1)) @@ -139,10 +143,14 @@ int lenvalgiven = 0; GCA(INPpName,("resistance",&ptemp,ckt,type,fast)) /* resistor between internal1 and internal2 */ - internal2 = TMALLOC(char, 10); + internal2 = TMALLOC(char, 10 + strlen(name)); strcpy(internal2, "txlnd2"); + strcat(internal2, name); INPtermInsert(ckt, &internal2, tab, &inode2); + rname2 = TMALLOC(char, 10 + strlen(name)); strcpy(rname2, "txlres2"); + strcat(rname2, name); + INPinsert(&rname2, tab); mdfast2 = tab->defRmod; IFC(newInstance,(ckt,mdfast2,&fast2,rname2)) IFC(bindNode,(ckt,fast2,1,inode1)) @@ -151,7 +159,10 @@ int lenvalgiven = 0; GCA(INPpName,("resistance",&ptemp,ckt,type,fast2)) /* resistor between internal2 and node2 */ + rname3 = TMALLOC(char, 10 + strlen(name)); strcpy(rname3, "txlres3"); + strcat(rname3, name); + INPinsert(&rname3, tab); mdfast3 = tab->defRmod; IFC(newInstance,(ckt,mdfast3,&fast3,rname3)) IFC(bindNode,(ckt,fast3,1,inode2)) @@ -166,7 +177,10 @@ int lenvalgiven = 0; IFC(newModel,(ckt,type,&(tab->defCmod),uid)) } mdfast4 = tab->defCmod; + cname1 = TMALLOC(char, 10 + strlen(name)); strcpy(cname1, "txlcap1"); + strcat(cname1, name); + INPinsert(&cname1, tab); IFC(newInstance,(ckt,mdfast4,&fast4,cname1)) IFC(bindNode,(ckt,fast4,1,node1)) IFC(bindNode,(ckt,fast4,2,gnode1)) @@ -174,7 +188,10 @@ int lenvalgiven = 0; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)) /* capacitor on internal1 */ + cname2 = TMALLOC(char, 10 + strlen(name)); strcpy(cname2, "txlcap2"); + strcat(cname2, name); + INPinsert(&cname2, tab); mdfast4 = tab->defCmod; IFC(newInstance,(ckt,mdfast4,&fast4,cname2)) IFC(bindNode,(ckt,fast4,1,inode1)) @@ -183,7 +200,10 @@ int lenvalgiven = 0; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)) /* capacitor on internal2 */ + cname3 = TMALLOC(char, 10 + strlen(name)); strcpy(cname3, "txlcap3"); + strcat(cname3, name); + INPinsert(&cname3, tab); mdfast5 = tab->defCmod; IFC(newInstance,(ckt,mdfast5,&fast5,cname3)) IFC(bindNode,(ckt,fast5,1,inode2)) @@ -192,7 +212,10 @@ int lenvalgiven = 0; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast5)) /* capacitor on node2 */ + cname4 = TMALLOC(char, 10 + strlen(name)); strcpy(cname4, "txlcap4"); + strcat(cname4, name); + INPinsert(&cname4, tab); mdfast6 = tab->defCmod; IFC(newInstance,(ckt,mdfast6,&fast6,cname4)) IFC(bindNode,(ckt,fast6,1,node2)) From a808ce8d42ca74d270070377075de96f6dc4cee2 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Fri, 12 Jul 2013 00:24:06 +0200 Subject: [PATCH 201/257] misc_time.c: make timediff always availabe when timeb.h is found --- src/misc/misc_time.c | 4 ---- src/misc/misc_time.h | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/misc/misc_time.c b/src/misc/misc_time.c index 9df4367ce..d3f3b2f07 100644 --- a/src/misc/misc_time.c +++ b/src/misc/misc_time.c @@ -65,8 +65,6 @@ datestring(void) /* return time interval in seconds and milliseconds */ -#ifndef HAVE_GETRUSAGE -#ifndef HAVE_TIMES #ifdef HAVE_FTIME struct timeb timebegin; @@ -84,8 +82,6 @@ void timediff(struct timeb *now, struct timeb *begin, int *sec, int *msec) } -#endif -#endif #endif /* diff --git a/src/misc/misc_time.h b/src/misc/misc_time.h index 0424554a0..95cc1bcb2 100644 --- a/src/misc/misc_time.h +++ b/src/misc/misc_time.h @@ -9,16 +9,12 @@ char * datestring(void); double seconds(void); -#ifndef HAVE_GETRUSAGE -#ifndef HAVE_TIMES #ifdef HAVE_FTIME extern struct timeb timebegin; void timediff(struct timeb *, struct timeb *, int *, int *); -#endif -#endif #endif #endif From f14c42b571f21b55ee97ff56b01a1d298ce50395 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:00:50 +0200 Subject: [PATCH 202/257] polish `MERROR' macro checked for object file invariance --- src/include/ngspice/macros.h | 11 ++++++----- src/spicelib/analysis/pzan.c | 10 +++++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/include/ngspice/macros.h b/src/include/ngspice/macros.h index 284edab31..c485517cf 100644 --- a/src/include/ngspice/macros.h +++ b/src/include/ngspice/macros.h @@ -43,11 +43,12 @@ #define NIL(type) ((type *)0) #define ABORT() fflush(stderr);fflush(stdout);abort(); -#define MERROR(CODE,MESSAGE) { \ - errMsg = TMALLOC(char, strlen(MESSAGE) + 1); \ - strcpy(errMsg, (MESSAGE)); \ - return (CODE); \ - } +#define MERROR(CODE, MESSAGE) \ + do { \ + errMsg = TMALLOC(char, strlen(MESSAGE) + 1); \ + strcpy(errMsg, (MESSAGE)); \ + return (CODE); \ + } while(0) #define NEW(TYPE) (TMALLOC(TYPE, 1)) #define NEWN(TYPE,COUNT) (TMALLOC(TYPE, COUNT)) diff --git a/src/spicelib/analysis/pzan.c b/src/spicelib/analysis/pzan.c index 6117f67df..0e1655d09 100644 --- a/src/spicelib/analysis/pzan.c +++ b/src/spicelib/analysis/pzan.c @@ -94,7 +94,7 @@ PZinit(CKTcircuit *ckt) i = CKTtypelook("LTRA"); } if (i != -1 && ckt->CKThead[i] != NULL) - MERROR(E_XMISSIONLINE, "Transmission lines not supported") + MERROR(E_XMISSIONLINE, "Transmission lines not supported"); job->PZpoleList = NULL; job->PZzeroList = NULL; @@ -102,19 +102,19 @@ PZinit(CKTcircuit *ckt) job->PZnZeros = 0; if (job->PZin_pos == job->PZin_neg) - MERROR(E_SHORT, "Input is shorted") + MERROR(E_SHORT, "Input is shorted"); if (job->PZout_pos == job->PZout_neg) - MERROR(E_SHORT, "Output is shorted") + MERROR(E_SHORT, "Output is shorted"); if (job->PZin_pos == job->PZout_pos && job->PZin_neg == job->PZout_neg && job->PZinput_type == PZ_IN_VOL) - MERROR(E_INISOUT, "Transfer function is unity") + MERROR(E_INISOUT, "Transfer function is unity"); else if (job->PZin_pos == job->PZout_neg && job->PZin_neg == job->PZout_pos && job->PZinput_type == PZ_IN_VOL) - MERROR(E_INISOUT, "Transfer function is -1") + MERROR(E_INISOUT, "Transfer function is -1"); return(OK); } From 9ad007cc7d3fce882cf8892687a2e4e7e551bc50 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:03:53 +0200 Subject: [PATCH 203/257] polish `IFC' macro checked for object file invariance, different code for inppas3.c, seems to be ok --- src/include/ngspice/inpmacs.h | 12 ++++++-- src/spicelib/parser/inp2m.c | 12 ++++---- src/spicelib/parser/inp2p.c | 6 ++-- src/spicelib/parser/inp2y.c | 54 +++++++++++++++++------------------ src/spicelib/parser/inppas3.c | 2 +- src/xspice/mif/mif_inp2.c | 2 +- 6 files changed, 47 insertions(+), 41 deletions(-) diff --git a/src/include/ngspice/inpmacs.h b/src/include/ngspice/inpmacs.h index 02aaa7604..b43f9d94d 100644 --- a/src/include/ngspice/inpmacs.h +++ b/src/include/ngspice/inpmacs.h @@ -1,6 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. **********/ + /* a couple of macros to make much of the input code * much much shorter and easier to handle. * @@ -9,9 +10,14 @@ Copyright 1990 Regents of the University of California. All rights reserved. * If necessary, get the proper error message and tack it on the current * error */ -#define IFC(func,args)\ -error=(*(ft_sim->func))args;\ -if(error)current->error = INPerrCat(current->error,INPerror(error)); + +#define IFC(func, args) \ + do { \ + error = (*(ft_sim->func)) args; \ + if (error) \ + current->error = INPerrCat(current->error, INPerror(error)); \ + } while(0) + /* and one for calling more General functions that still return an * error code as above diff --git a/src/spicelib/parser/inp2m.c b/src/spicelib/parser/inp2m.c index 29c03657a..f0fdb314b 100644 --- a/src/spicelib/parser/inp2m.c +++ b/src/spicelib/parser/inp2m.c @@ -282,19 +282,19 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current) fast->GENnode7 = -1; break; case 1: - IFC (bindNode, (ckt, fast, 5, node5)) + IFC (bindNode, (ckt, fast, 5, node5)); fast->GENnode6 = -1; fast->GENnode7 = -1; break; case 2: - IFC (bindNode, (ckt, fast, 5, node5)) - IFC (bindNode, (ckt, fast, 6, node6)) + IFC (bindNode, (ckt, fast, 5, node5)); + IFC (bindNode, (ckt, fast, 6, node6)); fast->GENnode7 = -1; break; case 3: - IFC (bindNode, (ckt, fast, 5, node5)) - IFC (bindNode, (ckt, fast, 6, node6)) - IFC (bindNode, (ckt, fast, 7, node7)) + IFC (bindNode, (ckt, fast, 5, node5)); + IFC (bindNode, (ckt, fast, 6, node6)); + IFC (bindNode, (ckt, fast, 7, node7)); break; default: break; diff --git a/src/spicelib/parser/inp2p.c b/src/spicelib/parser/inp2p.c index da733acfa..288adbde5 100644 --- a/src/spicelib/parser/inp2p.c +++ b/src/spicelib/parser/inp2p.c @@ -97,11 +97,11 @@ int num, i; if(!tab->defPmod) { /* create default P model */ IFnewUid(ckt, &uid, NULL, "P", UID_MODEL, NULL); - IFC(newModel, (ckt,type,&(tab->defPmod),uid)) + IFC(newModel, (ckt,type,&(tab->defPmod),uid)); } mdfast = tab->defPmod; } - IFC(newInstance,(ckt,mdfast,&fast,name)) + IFC(newInstance,(ckt,mdfast,&fast,name)); INPgetTok(&line,&model,1); if ((strcmp(model, "length") == 0) || (strcmp(model, "len") == 0)) { lenval = INPevaluate(&line,&error1,1); @@ -112,7 +112,7 @@ int num, i; return; } - /* IFC(bindNode,(ckt,fast,1,fakename)) */ + /* IFC(bindNode,(ckt,fast,1,fakename)); */ ptemp.iValue = num; GCA(INPpName,("dimension", &ptemp,ckt,type,fast)) diff --git a/src/spicelib/parser/inp2y.c b/src/spicelib/parser/inp2y.c index a735e6737..46fae06a4 100644 --- a/src/spicelib/parser/inp2y.c +++ b/src/spicelib/parser/inp2y.c @@ -129,16 +129,16 @@ int lenvalgiven = 0; if(!tab->defRmod) { /* create default R model */ IFnewUid(ckt, &uid, NULL, "R", UID_MODEL, NULL); - IFC(newModel, (ckt,type,&(tab->defRmod),uid)) + IFC(newModel, (ckt,type,&(tab->defRmod),uid)); } mdfast = tab->defRmod; rname1 = TMALLOC(char, 10 + strlen(name)); strcpy(rname1, "txlres1"); strcat(rname1, name); INPinsert(&rname1, tab); - IFC(newInstance,(ckt,mdfast,&fast,rname1)) - IFC(bindNode,(ckt,fast,1,node1)) - IFC(bindNode,(ckt,fast,2,inode1)) + IFC(newInstance,(ckt,mdfast,&fast,rname1)); + IFC(bindNode,(ckt,fast,1,node1)); + IFC(bindNode,(ckt,fast,2,inode1)); ptemp.rValue = rval; GCA(INPpName,("resistance",&ptemp,ckt,type,fast)) @@ -152,9 +152,9 @@ int lenvalgiven = 0; strcat(rname2, name); INPinsert(&rname2, tab); mdfast2 = tab->defRmod; - IFC(newInstance,(ckt,mdfast2,&fast2,rname2)) - IFC(bindNode,(ckt,fast2,1,inode1)) - IFC(bindNode,(ckt,fast2,2,inode2)) + IFC(newInstance,(ckt,mdfast2,&fast2,rname2)); + IFC(bindNode,(ckt,fast2,1,inode1)); + IFC(bindNode,(ckt,fast2,2,inode2)); ptemp.rValue = rval; GCA(INPpName,("resistance",&ptemp,ckt,type,fast2)) @@ -164,9 +164,9 @@ int lenvalgiven = 0; strcat(rname3, name); INPinsert(&rname3, tab); mdfast3 = tab->defRmod; - IFC(newInstance,(ckt,mdfast3,&fast3,rname3)) - IFC(bindNode,(ckt,fast3,1,inode2)) - IFC(bindNode,(ckt,fast3,2,node2)) + IFC(newInstance,(ckt,mdfast3,&fast3,rname3)); + IFC(bindNode,(ckt,fast3,1,inode2)); + IFC(bindNode,(ckt,fast3,2,node2)); ptemp.rValue = rval; GCA(INPpName,("resistance",&ptemp,ckt,type,fast3)) @@ -174,16 +174,16 @@ int lenvalgiven = 0; type = INPtypelook("Capacitor"); if(!tab->defCmod) { IFnewUid(ckt, &uid, NULL, "C", UID_MODEL, NULL); - IFC(newModel,(ckt,type,&(tab->defCmod),uid)) + IFC(newModel,(ckt,type,&(tab->defCmod),uid)); } mdfast4 = tab->defCmod; cname1 = TMALLOC(char, 10 + strlen(name)); strcpy(cname1, "txlcap1"); strcat(cname1, name); INPinsert(&cname1, tab); - IFC(newInstance,(ckt,mdfast4,&fast4,cname1)) - IFC(bindNode,(ckt,fast4,1,node1)) - IFC(bindNode,(ckt,fast4,2,gnode1)) + IFC(newInstance,(ckt,mdfast4,&fast4,cname1)); + IFC(bindNode,(ckt,fast4,1,node1)); + IFC(bindNode,(ckt,fast4,2,gnode1)); ptemp.rValue = cval; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)) @@ -193,9 +193,9 @@ int lenvalgiven = 0; strcat(cname2, name); INPinsert(&cname2, tab); mdfast4 = tab->defCmod; - IFC(newInstance,(ckt,mdfast4,&fast4,cname2)) - IFC(bindNode,(ckt,fast4,1,inode1)) - IFC(bindNode,(ckt,fast4,2,gnode1)) + IFC(newInstance,(ckt,mdfast4,&fast4,cname2)); + IFC(bindNode,(ckt,fast4,1,inode1)); + IFC(bindNode,(ckt,fast4,2,gnode1)); ptemp.rValue = cval * 2; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)) @@ -205,9 +205,9 @@ int lenvalgiven = 0; strcat(cname3, name); INPinsert(&cname3, tab); mdfast5 = tab->defCmod; - IFC(newInstance,(ckt,mdfast5,&fast5,cname3)) - IFC(bindNode,(ckt,fast5,1,inode2)) - IFC(bindNode,(ckt,fast5,2,gnode1)) + IFC(newInstance,(ckt,mdfast5,&fast5,cname3)); + IFC(bindNode,(ckt,fast5,1,inode2)); + IFC(bindNode,(ckt,fast5,2,gnode1)); ptemp.rValue = cval * 2; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast5)) @@ -217,9 +217,9 @@ int lenvalgiven = 0; strcat(cname4, name); INPinsert(&cname4, tab); mdfast6 = tab->defCmod; - IFC(newInstance,(ckt,mdfast6,&fast6,cname4)) - IFC(bindNode,(ckt,fast6,1,node2)) - IFC(bindNode,(ckt,fast6,2,gnode1)) + IFC(newInstance,(ckt,mdfast6,&fast6,cname4)); + IFC(bindNode,(ckt,fast6,1,node2)); + IFC(bindNode,(ckt,fast6,2,gnode1)); ptemp.rValue = cval; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast6)) return; @@ -234,11 +234,11 @@ int lenvalgiven = 0; if(!tab->defYmod) { /* create default Y model */ IFnewUid(ckt, &uid, NULL, "Y", UID_MODEL, NULL); - IFC(newModel, (ckt,type,&(tab->defYmod),uid)) + IFC(newModel, (ckt,type,&(tab->defYmod),uid)); } mdfast = tab->defYmod; } - IFC(newInstance,(ckt,mdfast,&fast,name)) + IFC(newInstance,(ckt,mdfast,&fast,name)); } else { LITERR("model name is not found") return; @@ -249,8 +249,8 @@ int lenvalgiven = 0; GCA(INPpName,("length",&ptemp,ckt,type,fast)) } - IFC(bindNode,(ckt,fast,1,node1)) - IFC(bindNode,(ckt,fast,2,node2)) + IFC(bindNode,(ckt,fast,1,node1)); + IFC(bindNode,(ckt,fast,2,node2)); txl = /*fixme*/ fast; diff --git a/src/spicelib/parser/inppas3.c b/src/spicelib/parser/inppas3.c index 35bcaf4a5..84b35b190 100644 --- a/src/spicelib/parser/inppas3.c +++ b/src/spicelib/parser/inppas3.c @@ -124,7 +124,7 @@ INPpas3(CKTcircuit *ckt, card *data, INPtables *tab, TSKtask *task, fprintf(stderr, "Warning : IC on non-existant node - %s\n", name); ptemp.rValue = INPevaluate(&line,&error,1); - IFC(setNodeParm, (ckt, node1, which, &ptemp, NULL)) + IFC(setNodeParm, (ckt, node1, which, &ptemp, NULL)); continue; } LITERR(" Error: .ic syntax error.\n") diff --git a/src/xspice/mif/mif_inp2.c b/src/xspice/mif/mif_inp2.c index c1240e1b1..a31de88f7 100644 --- a/src/xspice/mif/mif_inp2.c +++ b/src/xspice/mif/mif_inp2.c @@ -219,7 +219,7 @@ MIF_INP2A ( /* create a new structure for this instance in ckt */ mdfast = (MIFmodel*) thismodel->INPmodfast; - IFC(newInstance, (ckt, (GENmodel*)mdfast, (GENinstance **)fast, name)) + IFC(newInstance, (ckt, (GENmodel*)mdfast, (GENinstance **)fast, name)); /* initialize the code model specific elements of the inst struct */ From aef068ba106d80aa2a5fa04c5bcf04c16311a7d6 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:05:00 +0200 Subject: [PATCH 204/257] polish `GCA' macro checked for object file invariance --- src/include/ngspice/inpmacs.h | 11 ++++++++--- src/spicelib/parser/inp2dot.c | 12 ++++++------ src/spicelib/parser/inp2p.c | 8 ++++---- src/spicelib/parser/inp2r.c | 2 +- src/spicelib/parser/inp2y.c | 16 ++++++++-------- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/include/ngspice/inpmacs.h b/src/include/ngspice/inpmacs.h index b43f9d94d..c0dac6618 100644 --- a/src/include/ngspice/inpmacs.h +++ b/src/include/ngspice/inpmacs.h @@ -22,9 +22,14 @@ Copyright 1990 Regents of the University of California. All rights reserved. /* and one for calling more General functions that still return an * error code as above */ -#define GCA(func,args)\ -error=func args;\ -if(error)current->error = INPerrCat(current->error,INPerror(error)); + +#define GCA(func, args) \ + do { \ + error = func args; \ + if (error) \ + current->error = INPerrCat(current->error, INPerror(error)); \ + } while(0) + /* and one for putting our own error messages onto the current * line's error string diff --git a/src/spicelib/parser/inp2dot.c b/src/spicelib/parser/inp2dot.c index 69b1ab283..3813bec70 100644 --- a/src/spicelib/parser/inp2dot.c +++ b/src/spicelib/parser/inp2dot.c @@ -58,7 +58,7 @@ dot_noise(char *line, CKTcircuit *ckt, INPtables *tab, card *current, INPgetNetTok(&line, &nname1, 0); INPtermInsert(ckt, &nname1, tab, &node1); ptemp.nValue = node1; - GCA(INPapName, (ckt, which, foo, "output", &ptemp)) + GCA(INPapName, (ckt, which, foo, "output", &ptemp)); if (*line != ')') { INPgetNetTok(&line, &nname2, 1); @@ -67,12 +67,12 @@ dot_noise(char *line, CKTcircuit *ckt, INPtables *tab, card *current, } else { ptemp.nValue = gnode; } - GCA(INPapName, (ckt, which, foo, "outputref", &ptemp)) + GCA(INPapName, (ckt, which, foo, "outputref", &ptemp)); INPgetTok(&line, &name, 1); INPinsert(&name, tab); ptemp.uValue = name; - GCA(INPapName, (ckt, which, foo, "input", &ptemp)) + GCA(INPapName, (ckt, which, foo, "input", &ptemp)); INPgetTok(&line, &steptype, 1); ptemp.iValue = 1; @@ -501,7 +501,7 @@ dot_sens(char *line, CKTcircuit *ckt, INPtables *tab, card *current, INPgetNetTok(&line, &nname1, 0); INPtermInsert(ckt, &nname1, tab, &node1); ptemp.nValue = node1; - GCA(INPapName, (ckt, which, foo, "outpos", &ptemp)) + GCA(INPapName, (ckt, which, foo, "outpos", &ptemp)); if (*line != ')') { INPgetNetTok(&line, &nname2, 1); @@ -532,7 +532,7 @@ dot_sens(char *line, CKTcircuit *ckt, INPtables *tab, card *current, INPgetTok(&line, &name, 1); if (name && !strcmp(name, "pct")) { ptemp.iValue = 1; - GCA(INPapName, (ckt, which, foo, "pct", &ptemp)) + GCA(INPapName, (ckt, which, foo, "pct", &ptemp)); INPgetTok(&line, &name, 1); } if (name && !strcmp(name, "ac")) { @@ -669,7 +669,7 @@ dot_pss(char *line, void *ckt, INPtables *tab, card *current, INPgetNetTok(&line, &nname, 0); INPtermInsert(ckt, &nname, tab, &nnode); ptemp.nValue = nnode; - GCA(INPapName, (ckt, which, foo, "oscnode", &ptemp)) /* OscNode given as string */ + GCA(INPapName, (ckt, which, foo, "oscnode", &ptemp)); /* OscNode given as string */ parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* PSS points */ GCA(INPapName, (ckt, which, foo, "points", parm)); diff --git a/src/spicelib/parser/inp2p.c b/src/spicelib/parser/inp2p.c index 288adbde5..3fac63d39 100644 --- a/src/spicelib/parser/inp2p.c +++ b/src/spicelib/parser/inp2p.c @@ -115,14 +115,14 @@ int num, i; /* IFC(bindNode,(ckt,fast,1,fakename)); */ ptemp.iValue = num; - GCA(INPpName,("dimension", &ptemp,ckt,type,fast)) + GCA(INPpName,("dimension", &ptemp,ckt,type,fast)); ptemp.v.vec.sVec = nname1; - GCA(INPpName,("pos_nodes", &ptemp,ckt,type,fast)) + GCA(INPpName,("pos_nodes", &ptemp,ckt,type,fast)); ptemp.v.vec.sVec = nname2; - GCA(INPpName,("neg_nodes", &ptemp,ckt,type,fast)) + GCA(INPpName,("neg_nodes", &ptemp,ckt,type,fast)); if (error1 == 0 && lenvalgiven) { ptemp.rValue = lenval; - GCA(INPpName,("length",&ptemp,ckt,type,fast)) + GCA(INPpName,("length",&ptemp,ckt,type,fast)); } return; diff --git a/src/spicelib/parser/inp2r.c b/src/spicelib/parser/inp2r.c index 45dce2d83..f0cb066c8 100644 --- a/src/spicelib/parser/inp2r.c +++ b/src/spicelib/parser/inp2r.c @@ -200,7 +200,7 @@ void INP2R(CKTcircuit *ckt, INPtables * tab, card * current) if (error1 == 0) { /* got a resistance above */ ptemp.rValue = val; - GCA(INPpName, ("resistance", &ptemp, ckt, type, fast)) + GCA(INPpName, ("resistance", &ptemp, ckt, type, fast)); } IFC(bindNode, (ckt, fast, 1, node1)); diff --git a/src/spicelib/parser/inp2y.c b/src/spicelib/parser/inp2y.c index 46fae06a4..8ce9a87b6 100644 --- a/src/spicelib/parser/inp2y.c +++ b/src/spicelib/parser/inp2y.c @@ -140,7 +140,7 @@ int lenvalgiven = 0; IFC(bindNode,(ckt,fast,1,node1)); IFC(bindNode,(ckt,fast,2,inode1)); ptemp.rValue = rval; - GCA(INPpName,("resistance",&ptemp,ckt,type,fast)) + GCA(INPpName,("resistance",&ptemp,ckt,type,fast)); /* resistor between internal1 and internal2 */ internal2 = TMALLOC(char, 10 + strlen(name)); @@ -156,7 +156,7 @@ int lenvalgiven = 0; IFC(bindNode,(ckt,fast2,1,inode1)); IFC(bindNode,(ckt,fast2,2,inode2)); ptemp.rValue = rval; - GCA(INPpName,("resistance",&ptemp,ckt,type,fast2)) + GCA(INPpName,("resistance",&ptemp,ckt,type,fast2)); /* resistor between internal2 and node2 */ rname3 = TMALLOC(char, 10 + strlen(name)); @@ -168,7 +168,7 @@ int lenvalgiven = 0; IFC(bindNode,(ckt,fast3,1,inode2)); IFC(bindNode,(ckt,fast3,2,node2)); ptemp.rValue = rval; - GCA(INPpName,("resistance",&ptemp,ckt,type,fast3)) + GCA(INPpName,("resistance",&ptemp,ckt,type,fast3)); /* capacitor on node1 */ type = INPtypelook("Capacitor"); @@ -185,7 +185,7 @@ int lenvalgiven = 0; IFC(bindNode,(ckt,fast4,1,node1)); IFC(bindNode,(ckt,fast4,2,gnode1)); ptemp.rValue = cval; - GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)) + GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)); /* capacitor on internal1 */ cname2 = TMALLOC(char, 10 + strlen(name)); @@ -197,7 +197,7 @@ int lenvalgiven = 0; IFC(bindNode,(ckt,fast4,1,inode1)); IFC(bindNode,(ckt,fast4,2,gnode1)); ptemp.rValue = cval * 2; - GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)) + GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)); /* capacitor on internal2 */ cname3 = TMALLOC(char, 10 + strlen(name)); @@ -209,7 +209,7 @@ int lenvalgiven = 0; IFC(bindNode,(ckt,fast5,1,inode2)); IFC(bindNode,(ckt,fast5,2,gnode1)); ptemp.rValue = cval * 2; - GCA(INPpName,("capacitance",&ptemp,ckt,type,fast5)) + GCA(INPpName,("capacitance",&ptemp,ckt,type,fast5)); /* capacitor on node2 */ cname4 = TMALLOC(char, 10 + strlen(name)); @@ -221,7 +221,7 @@ int lenvalgiven = 0; IFC(bindNode,(ckt,fast6,1,node2)); IFC(bindNode,(ckt,fast6,2,gnode1)); ptemp.rValue = cval; - GCA(INPpName,("capacitance",&ptemp,ckt,type,fast6)) + GCA(INPpName,("capacitance",&ptemp,ckt,type,fast6)); return; } @@ -246,7 +246,7 @@ int lenvalgiven = 0; if (error1 == 0 && lenvalgiven) { ptemp.rValue = lenval; - GCA(INPpName,("length",&ptemp,ckt,type,fast)) + GCA(INPpName,("length",&ptemp,ckt,type,fast)); } IFC(bindNode,(ckt,fast,1,node1)); From 7189a87bbfc3fe6664eeb0a14e7f21eb7d6b1d2f Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:06:12 +0200 Subject: [PATCH 205/257] polish `LITERR' macro checked for object file invariance --- src/include/ngspice/inpmacs.h | 8 ++++++-- src/spicelib/parser/inp2d.c | 2 +- src/spicelib/parser/inp2m.c | 9 ++++++--- src/spicelib/parser/inp2p.c | 6 +++--- src/spicelib/parser/inp2q.c | 6 +++--- src/spicelib/parser/inp2y.c | 6 +++--- src/spicelib/parser/inp2z.c | 2 +- src/spicelib/parser/inppas3.c | 8 ++++---- 8 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/include/ngspice/inpmacs.h b/src/include/ngspice/inpmacs.h index c0dac6618..e94dd8107 100644 --- a/src/include/ngspice/inpmacs.h +++ b/src/include/ngspice/inpmacs.h @@ -31,10 +31,14 @@ Copyright 1990 Regents of the University of California. All rights reserved. } while(0) -/* and one for putting our own error messages onto the current +/* and one for putting our own error messages onto the current * line's error string */ -#define LITERR(text) current->error=INPerrCat(current->error,INPmkTemp(text)); + +#define LITERR(text) \ + do { \ + current->error = INPerrCat(current->error, INPmkTemp(text)); \ + } while(0) /* and now a special one for calling INPdevParse which returns an diff --git a/src/spicelib/parser/inp2d.c b/src/spicelib/parser/inp2d.c index 2a6489f2c..f85d1ad33 100644 --- a/src/spicelib/parser/inp2d.c +++ b/src/spicelib/parser/inp2d.c @@ -81,7 +81,7 @@ void INP2D(CKTcircuit *ckt, INPtables * tab, card * current) #ifdef CIDER if( type == INPtypelook("NUMD2") ) { - LITERR(" error: no unlabelled parameter permitted on NUMD2\n") + LITERR(" error: no unlabelled parameter permitted on NUMD2\n"); } else { #endif ptemp.rValue = leadval; diff --git a/src/spicelib/parser/inp2m.c b/src/spicelib/parser/inp2m.c index f0fdb314b..f9492e346 100644 --- a/src/spicelib/parser/inp2m.c +++ b/src/spicelib/parser/inp2m.c @@ -124,7 +124,8 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current) ) { /* if model is not variable node B3SOIPD/FD/DD model, error! */ - LITERR ("only level 55-58: B3SOI(PD|FD|DD) and B4SOI can have 7 nodes") return; + LITERR ("only level 55-58: B3SOI(PD|FD|DD) and B4SOI can have 7 nodes"); + return; } else { /* if looking at B3SOIPD/FD/DD or B4SOI model, allocate the 7th node */ @@ -155,7 +156,8 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current) ) { /* if model is not variable node B3SOIPD/FD/DD or STAG model, error! */ - LITERR ("only level 55-58,61,62: B3SOI(PD|FD|DD), B4SOI, STAG (SOI3) and HiSIMHV can have 6 nodes") return; + LITERR ("only level 55-58,61,62: B3SOI(PD|FD|DD), B4SOI, STAG (SOI3) and HiSIMHV can have 6 nodes"); + return; } else { /* if looking at B3SOIPD/FD/DD, B4SOI, STAG (SOI3) or HiSIMHV model, allocate the 6th node */ @@ -176,7 +178,8 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current) ) { /* if model is not variable node B3SOIPD/FD/DD model, error! */ - LITERR ("only level 55-58,61,62: B3SOI(PD|FD|DD), B4SOI, STAG (SOI3) and HiSIMHV can have 5 nodes") return; + LITERR ("only level 55-58,61,62: B3SOI(PD|FD|DD), B4SOI, STAG (SOI3) and HiSIMHV can have 5 nodes"); + return; } else { /* if looking at B3SOIPD/FD/DD, B4SOI, STAG (SOI3) or HiSIMHV model, allocate the 5th node */ diff --git a/src/spicelib/parser/inp2p.c b/src/spicelib/parser/inp2p.c index 3fac63d39..da5cc4928 100644 --- a/src/spicelib/parser/inp2p.c +++ b/src/spicelib/parser/inp2p.c @@ -43,7 +43,7 @@ int num, i; mytype = INPtypelook("CplLines"); if(mytype < 0 ) { - LITERR("Device type CplLines not supported by this binary\n") + LITERR("Device type CplLines not supported by this binary\n"); return; } line = current->line; @@ -87,7 +87,7 @@ int num, i; current->error = INPgetMod(ckt,model,&thismodel,tab); if(thismodel != NULL) { if(mytype != thismodel->INPmodType) { - LITERR("incorrect model type") + LITERR("incorrect model type"); return; } mdfast = thismodel->INPmodfast; @@ -108,7 +108,7 @@ int num, i; lenvalgiven = 1; } } else { - LITERR("model name is not found") + LITERR("model name is not found"); return; } diff --git a/src/spicelib/parser/inp2q.c b/src/spicelib/parser/inp2q.c index d3f859bec..d114b8e60 100644 --- a/src/spicelib/parser/inp2q.c +++ b/src/spicelib/parser/inp2q.c @@ -129,7 +129,7 @@ void INP2Q(CKTcircuit *ckt, INPtables * tab, card * current, CKTnode *gnode) #endif && (thismodel->INPmodType != INPtypelook("VBIC"))) { - LITERR("incorrect model type") + LITERR("incorrect model type"); return; } #ifdef ADMS @@ -137,7 +137,7 @@ void INP2Q(CKTcircuit *ckt, INPtables * tab, card * current, CKTnode *gnode) && (nodeflag && (thismodel->INPmodType != INPtypelook("hicum2"))) && (nodeflag && (thismodel->INPmodType != INPtypelook("bjt504t")))) { - LITERR("Too much nodes for this model type") + LITERR("Too much nodes for this model type"); return; } #endif @@ -182,7 +182,7 @@ void INP2Q(CKTcircuit *ckt, INPtables * tab, card * current, CKTnode *gnode) if (waslead) { #ifdef CIDER if( type == INPtypelook("NBJT2") ) { - LITERR(" error: no unlabeled parameter permitted on NBJT2\n") + LITERR(" error: no unlabeled parameter permitted on NBJT2\n"); } else { #endif ptemp.rValue = leadval; diff --git a/src/spicelib/parser/inp2y.c b/src/spicelib/parser/inp2y.c index 8ce9a87b6..ea7b01a44 100644 --- a/src/spicelib/parser/inp2y.c +++ b/src/spicelib/parser/inp2y.c @@ -54,7 +54,7 @@ int lenvalgiven = 0; mytype2 = INPtypelook("CplLines"); if(mytype < 0 ) { - LITERR("Device type TransLine not supported by this binary\n") + LITERR("Device type TransLine not supported by this binary\n"); return; } line = current->line; @@ -85,7 +85,7 @@ int lenvalgiven = 0; return; } else if (mytype != thismodel->INPmodType) { - LITERR("incorrect model type") + LITERR("incorrect model type"); return; } line = thismodel->INPmodLine->line; @@ -240,7 +240,7 @@ int lenvalgiven = 0; } IFC(newInstance,(ckt,mdfast,&fast,name)); } else { - LITERR("model name is not found") + LITERR("model name is not found"); return; } diff --git a/src/spicelib/parser/inp2z.c b/src/spicelib/parser/inp2z.c index fc50ab3b8..c259e2491 100644 --- a/src/spicelib/parser/inp2z.c +++ b/src/spicelib/parser/inp2z.c @@ -62,7 +62,7 @@ void INP2Z(CKTcircuit *ckt, INPtables * tab, card * current) && thismodel->INPmodType != INPtypelook("HFET1") && thismodel->INPmodType != INPtypelook("HFET2")) { - LITERR("incorrect model type") + LITERR("incorrect model type"); return; } diff --git a/src/spicelib/parser/inppas3.c b/src/spicelib/parser/inppas3.c index 84b35b190..10eb40c28 100644 --- a/src/spicelib/parser/inppas3.c +++ b/src/spicelib/parser/inppas3.c @@ -61,7 +61,7 @@ INPpas3(CKTcircuit *ckt, card *data, INPtables *tab, TSKtask *task, } if(which == -1) { - LITERR("nodeset unknown to simulator. \n") + LITERR("nodeset unknown to simulator. \n"); goto quit; } @@ -91,7 +91,7 @@ INPpas3(CKTcircuit *ckt, card *data, INPtables *tab, TSKtask *task, IFC(setNodeParm, (ckt, node1, which, &ptemp, NULL)); continue; } - LITERR(" Error: .nodeset syntax error.\n") + LITERR(" Error: .nodeset syntax error.\n"); break; } } else if ((strcmp(token,".ic") == 0)) { @@ -105,7 +105,7 @@ INPpas3(CKTcircuit *ckt, card *data, INPtables *tab, TSKtask *task, } if(which==-1) { - LITERR("ic unknown to simulator. \n") + LITERR("ic unknown to simulator. \n"); goto quit; } @@ -127,7 +127,7 @@ INPpas3(CKTcircuit *ckt, card *data, INPtables *tab, TSKtask *task, IFC(setNodeParm, (ckt, node1, which, &ptemp, NULL)); continue; } - LITERR(" Error: .ic syntax error.\n") + LITERR(" Error: .ic syntax error.\n"); break; } } From dc3a79836960f16829b8af47e6f0a0e310129067 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:06:47 +0200 Subject: [PATCH 206/257] polish `PARSECALL' macro checked for object file invariance --- src/include/ngspice/inpmacs.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/include/ngspice/inpmacs.h b/src/include/ngspice/inpmacs.h index e94dd8107..dd5799e32 100644 --- a/src/include/ngspice/inpmacs.h +++ b/src/include/ngspice/inpmacs.h @@ -44,5 +44,8 @@ Copyright 1990 Regents of the University of California. All rights reserved. /* and now a special one for calling INPdevParse which returns an * already concatenated list of error messages or NUL */ -#define PARSECALL(args)\ -current->error = INPerrCat(current->error,INPdevParse args ); + +#define PARSECALL(args) \ + do { \ + current->error = INPerrCat(current->error, INPdevParse args); \ + } while(0) From 72ddab42139b22c9ef0b4f0ba2a3fa3612e3ea8a Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:07:22 +0200 Subject: [PATCH 207/257] cleanup comment --- src/spicelib/analysis/noisean.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/spicelib/analysis/noisean.c b/src/spicelib/analysis/noisean.c index f154c08f3..eee7a9108 100644 --- a/src/spicelib/analysis/noisean.c +++ b/src/spicelib/analysis/noisean.c @@ -1,14 +1,15 @@ -/* Patch to noisean.c by Richard D. McRoberts. - * Patched with modifications from Weidong Liu (2000) - * Patched with modifications ftom Weidong Liu - * in bsim4.1.0 code - */ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1987 Gary W. Ng Modified: 2001 AlansFixes **********/ +/* Patch to noisean.c by Richard D. McRoberts. + * Patched with modifications from Weidong Liu (2000) + * Patched with modifications ftom Weidong Liu + * in bsim4.1.0 code + */ + #include "ngspice/ngspice.h" #include "ngspice/acdefs.h" #include "ngspice/cktdefs.h" From 4a2821184fe9ac592e0c1ea062217f257787e07d Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:08:46 +0200 Subject: [PATCH 208/257] cleanup stuttered semicolon --- src/maths/sparse/spsmp.c | 2 +- src/spicelib/parser/ifeval.c | 2 +- src/xspice/icm/xtradev/potentiometer/cfunc.mod | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/maths/sparse/spsmp.c b/src/maths/sparse/spsmp.c index 748b73b80..daa736d9c 100644 --- a/src/maths/sparse/spsmp.c +++ b/src/maths/sparse/spsmp.c @@ -501,7 +501,7 @@ SMPcAddCol(SMPmatrix *Matrix, int Accum_Col, int Addend_Col) Addend = Matrix->FirstInCol[Addend_Col]; Prev = &Matrix->FirstInCol[Accum_Col]; - Accum = *Prev;; + Accum = *Prev; while (Addend != NULL) { while (Accum && Accum->Row < Addend->Row) { diff --git a/src/spicelib/parser/ifeval.c b/src/spicelib/parser/ifeval.c index 416ae1091..eadb89ab2 100644 --- a/src/spicelib/parser/ifeval.c +++ b/src/spicelib/parser/ifeval.c @@ -29,7 +29,7 @@ IFeval(IFparseTree * tree, double gmin, double *result, double *vals, double *derivs) { int i, err; - INPparseTree *myTree = (INPparseTree *) tree;; + INPparseTree *myTree = (INPparseTree *) tree; #ifdef TRACE INPptPrint("calling PTeval, tree = ", tree); diff --git a/src/xspice/icm/xtradev/potentiometer/cfunc.mod b/src/xspice/icm/xtradev/potentiometer/cfunc.mod index c4bd69b34..955aaabe6 100644 --- a/src/xspice/icm/xtradev/potentiometer/cfunc.mod +++ b/src/xspice/icm/xtradev/potentiometer/cfunc.mod @@ -171,7 +171,7 @@ void cm_potentiometer (ARGS) PARTIAL(r0,wiper) = -1.0 / r_lower; PARTIAL(r1,r0) = 0.0; - PARTIAL(r1,r1) = 1.0 / r_upper;; + PARTIAL(r1,r1) = 1.0 / r_upper; PARTIAL(r1,wiper) = -1.0 / r_upper; PARTIAL(wiper,r0) = -1.0 / r_lower; From ca90bc647c5dd4b5b69d7a471754ba72650ba745 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:11:00 +0200 Subject: [PATCH 209/257] cleanup OUTpBeginPlot() invocations checked for object file invariance --- src/frontend/spiceif.c | 10 +++--- src/spicelib/analysis/acan.c | 40 ++++++++++----------- src/spicelib/analysis/cktsens.c | 10 +++--- src/spicelib/analysis/dcop.c | 10 +++--- src/spicelib/analysis/dcpss.c | 27 +++++++------- src/spicelib/analysis/dctran.c | 20 +++++------ src/spicelib/analysis/dctrcurv.c | 20 +++++------ src/spicelib/analysis/distoan.c | 60 ++++++++++++++++---------------- src/spicelib/analysis/noisean.c | 30 ++++++++-------- src/spicelib/analysis/pzan.c | 20 +++++------ src/spicelib/analysis/tfanal.c | 10 +++--- 11 files changed, 130 insertions(+), 127 deletions(-) diff --git a/src/frontend/spiceif.c b/src/frontend/spiceif.c index 671f88da0..379430281 100644 --- a/src/frontend/spiceif.c +++ b/src/frontend/spiceif.c @@ -1616,11 +1616,11 @@ void com_snload(wordlist *wl) return; } SPfrontEnd->IFnewUid (ckt, &timeUid, NULL, "time", UID_OTHER, NULL); - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - ckt->CKTcurJob->JOBname, - timeUid, IF_REAL, - numNames, nameList, IF_REAL, &(((TRANan*)ckt->CKTcurJob)->TRANplot)); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + ckt->CKTcurJob->JOBname, + timeUid, IF_REAL, + numNames, nameList, IF_REAL, + &(((TRANan*)ckt->CKTcurJob)->TRANplot)); if (error) { fprintf(cp_err, "error in CKTnames\n"); return; diff --git a/src/spicelib/analysis/acan.c b/src/spicelib/analysis/acan.c index 2e0ad1e94..08d2d80d8 100644 --- a/src/spicelib/analysis/acan.c +++ b/src/spicelib/analysis/acan.c @@ -149,11 +149,11 @@ ACan(CKTcircuit *ckt, int restart) * Moreover the begin plot has not even been done yet at this * point... */ - SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - ckt->CKTcurJob->JOBname, - NULL, IF_REAL, - numNames, nameList, IF_REAL, &acPlot); + SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + ckt->CKTcurJob->JOBname, + NULL, IF_REAL, + numNames, nameList, IF_REAL, + &acPlot); tfree(nameList); ipc_send_dcop_prefix(); @@ -174,11 +174,11 @@ ACan(CKTcircuit *ckt, int restart) if (ckt->CKTkeepOpInfo) { /* Dump operating point. */ - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "AC Operating Point", - NULL, IF_REAL, - numNames, nameList, IF_REAL, &plot); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "AC Operating Point", + NULL, IF_REAL, + numNames, nameList, IF_REAL, + &plot); if(error) return(error); CKTdump(ckt, 0.0, plot); SPfrontEnd->OUTendPlot (plot); @@ -187,11 +187,11 @@ ACan(CKTcircuit *ckt, int restart) SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - ckt->CKTcurJob->JOBname, - freqUid, IF_REAL, - numNames, nameList, IF_COMPLEX, &acPlot); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + ckt->CKTcurJob->JOBname, + freqUid, IF_REAL, + numNames, nameList, IF_COMPLEX, + &acPlot); tfree(nameList); if(error) return(error); @@ -205,11 +205,11 @@ ACan(CKTcircuit *ckt, int restart) freq = job->ACsaveFreq; job->ACsaveFreq = 0; /* clear the 'old' frequency */ /* fix resume? saj, indeed !*/ - error = SPfrontEnd->OUTpBeginPlot ( - NULL, NULL, - NULL, - NULL, 0, - 666, NULL, 666, &acPlot); + error = SPfrontEnd->OUTpBeginPlot (NULL, NULL, + NULL, + NULL, 0, + 666, NULL, 666, + &acPlot); /* saj*/ } diff --git a/src/spicelib/analysis/cktsens.c b/src/spicelib/analysis/cktsens.c index 74760dbbf..ef6b27c73 100644 --- a/src/spicelib/analysis/cktsens.c +++ b/src/spicelib/analysis/cktsens.c @@ -197,11 +197,11 @@ int sens_sens(CKTcircuit *ckt, int restart) "frequency", UID_OTHER, NULL); } - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - ckt->CKTcurJob->JOBname, - freq_name, IF_REAL, - num_vars, output_names, type, &sen_data); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + ckt->CKTcurJob->JOBname, + freq_name, IF_REAL, + num_vars, output_names, type, + &sen_data); if (error) return error; diff --git a/src/spicelib/analysis/dcop.c b/src/spicelib/analysis/dcop.c index 55c79d90e..1e33a6bfa 100644 --- a/src/spicelib/analysis/dcop.c +++ b/src/spicelib/analysis/dcop.c @@ -50,11 +50,11 @@ DCop(CKTcircuit *ckt, int notused) error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - ckt->CKTcurJob->JOBname, - NULL, IF_REAL, - numNames, nameList, IF_REAL, &plot); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + ckt->CKTcurJob->JOBname, + NULL, IF_REAL, + numNames, nameList, IF_REAL, + &plot); tfree(nameList); /* va: nameList not used any longer, it was a memory leak */ if(error) return(error); diff --git a/src/spicelib/analysis/dcpss.c b/src/spicelib/analysis/dcpss.c index 1e64514d1..8568d6531 100644 --- a/src/spicelib/analysis/dcpss.c +++ b/src/spicelib/analysis/dcpss.c @@ -239,11 +239,11 @@ DCpss(CKTcircuit *ckt, if(error) return(error); SPfrontEnd->IFnewUid (ckt, &timeUid, NULL, "time", UID_OTHER, NULL); - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "Time Domain Periodic Steady State Analysis", - timeUid, IF_REAL, - numNames, nameList, IF_REAL, &(job->PSSplot_td)); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "Time Domain Periodic Steady State Analysis", + timeUid, IF_REAL, + numNames, nameList, IF_REAL, + &(job->PSSplot_td)); tfree(nameList); if(error) return(error); @@ -406,11 +406,11 @@ DCpss(CKTcircuit *ckt, if(ckt->CKTminBreak==0) ckt->CKTminBreak=ckt->CKTmaxStep*5e-5; firsttime=0; /* To get rawfile working saj*/ - error = SPfrontEnd->OUTpBeginPlot ( - NULL, NULL, - NULL, - NULL, 0, - 666, NULL, 666, &(job->PSSplot_td)); + error = SPfrontEnd->OUTpBeginPlot (NULL, NULL, + NULL, + NULL, 0, + 666, NULL, 666, + &(job->PSSplot_td)); if(error) { fprintf(stderr, "Couldn't relink rawfile\n"); return error; @@ -1039,8 +1039,11 @@ DCpss(CKTcircuit *ckt, if (error) return (error) ; SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL) ; - error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, "Frequency Domain Periodic Steady State Analysis", - freqUid, IF_REAL, numNames, nameList, IF_REAL, &(job->PSSplot_fd)) ; + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "Frequency Domain Periodic Steady State Analysis", + freqUid, IF_REAL, + numNames, nameList, IF_REAL, + &(job->PSSplot_fd)) ; tfree (nameList) ; SPfrontEnd->OUTattributes (job->PSSplot_fd, NULL, PLOT_COMB, NULL) ; diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index f90493f76..d2a6fdb4b 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -156,11 +156,11 @@ DCtran(CKTcircuit *ckt, if(error) return(error); SPfrontEnd->IFnewUid (ckt, &timeUid, NULL, "time", UID_OTHER, NULL); - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - ckt->CKTcurJob->JOBname, - timeUid, IF_REAL, - numNames, nameList, IF_REAL, &(job->TRANplot)); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + ckt->CKTcurJob->JOBname, + timeUid, IF_REAL, + numNames, nameList, IF_REAL, + &(job->TRANplot)); tfree(nameList); if(error) return(error); @@ -350,11 +350,11 @@ DCtran(CKTcircuit *ckt, if(ckt->CKTminBreak==0) ckt->CKTminBreak=ckt->CKTmaxStep*5e-5; firsttime=0; /* To get rawfile working saj*/ - error = SPfrontEnd->OUTpBeginPlot ( - NULL, NULL, - NULL, - NULL, 0, - 666, NULL, 666, &(job->TRANplot)); + error = SPfrontEnd->OUTpBeginPlot (NULL, NULL, + NULL, + NULL, 0, + 666, NULL, 666, + &(job->TRANplot)); if(error) { fprintf(stderr, "Couldn't relink rawfile\n"); return error; diff --git a/src/spicelib/analysis/dctrcurv.c b/src/spicelib/analysis/dctrcurv.c index b847f1649..62033ad3d 100644 --- a/src/spicelib/analysis/dctrcurv.c +++ b/src/spicelib/analysis/dctrcurv.c @@ -67,11 +67,11 @@ DCtrCurv(CKTcircuit *ckt, int restart) /* continuing */ i = job->TRCVnestState; /* resume to work? saj*/ - error = SPfrontEnd->OUTpBeginPlot ( - NULL, NULL, - NULL, - NULL, 0, - 666, NULL, 666, &plot); + error = SPfrontEnd->OUTpBeginPlot (NULL, NULL, + NULL, + NULL, 0, + 666, NULL, 666, + &plot); goto resume; } ckt->CKTtime = 0; @@ -218,11 +218,11 @@ found:; } /* TEMP_CODE */ } /* rcode*/ - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - ckt->CKTcurJob->JOBname, - varUid, IF_REAL, - numNames, nameList, IF_REAL, &plot); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + ckt->CKTcurJob->JOBname, + varUid, IF_REAL, + numNames, nameList, IF_REAL, + &plot); tfree(nameList); if(error) return(error); diff --git a/src/spicelib/analysis/distoan.c b/src/spicelib/analysis/distoan.c index b28564230..cf5b2603f 100644 --- a/src/spicelib/analysis/distoan.c +++ b/src/spicelib/analysis/distoan.c @@ -107,11 +107,11 @@ time1 = SPfrontEnd->IFseconds(); if (ckt->CKTkeepOpInfo) { /* Dump operating point. */ - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "Distortion Operating Point", - NULL, IF_REAL, - numNames, nameList, IF_REAL, &acPlot); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "Distortion Operating Point", + NULL, IF_REAL, + numNames, nameList, IF_REAL, + &acPlot); if(error) return(error); CKTdump(ckt, 0.0, acPlot); SPfrontEnd->OUTendPlot (acPlot); @@ -518,11 +518,11 @@ time1 = SPfrontEnd->IFseconds(); if(error) return(error); SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); - SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "DISTORTION - 2nd harmonic", - freqUid, IF_REAL, - numNames, nameList, IF_COMPLEX, &acPlot); + SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "DISTORTION - 2nd harmonic", + freqUid, IF_REAL, + numNames, nameList, IF_COMPLEX, + &acPlot); if (job->DstepType != LINEAR) { SPfrontEnd->OUTattributes (acPlot, NULL, OUT_SCALE_LOG, NULL); @@ -544,11 +544,11 @@ time1 = SPfrontEnd->IFseconds(); if(error) return(error); SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); - SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "DISTORTION - 3rd harmonic", - freqUid, IF_REAL, - numNames, nameList, IF_COMPLEX, &acPlot); + SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "DISTORTION - 3rd harmonic", + freqUid, IF_REAL, + numNames, nameList, IF_COMPLEX, + &acPlot); for (i=0; i< displacement ; i++) { DkerProc(D_THRF1,job->r3H11stor[i], @@ -568,11 +568,11 @@ time1 = SPfrontEnd->IFseconds(); if(error) return(error); SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); - SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "DISTORTION - IM: f1+f2", - freqUid, IF_REAL, - numNames, nameList, IF_COMPLEX, &acPlot); + SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "DISTORTION - IM: f1+f2", + freqUid, IF_REAL, + numNames, nameList, IF_COMPLEX, + &acPlot); for (i=0; i< displacement ; i++) { DkerProc(D_F1PF2,job->r2H12stor[i], @@ -590,11 +590,11 @@ time1 = SPfrontEnd->IFseconds(); if(error) return(error); SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); - SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "DISTORTION - IM: f1-f2", - freqUid, IF_REAL, - numNames, nameList, IF_COMPLEX, &acPlot); + SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "DISTORTION - IM: f1-f2", + freqUid, IF_REAL, + numNames, nameList, IF_COMPLEX, + &acPlot); for (i=0; i< displacement ; i++) { DkerProc(D_F1MF2, @@ -613,11 +613,11 @@ time1 = SPfrontEnd->IFseconds(); if(error) return(error); SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); - SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "DISTORTION - IM: 2f1-f2", - freqUid, IF_REAL, - numNames, nameList, IF_COMPLEX, &acPlot); + SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "DISTORTION - IM: 2f1-f2", + freqUid, IF_REAL, + numNames, nameList, IF_COMPLEX, + &acPlot); for (i=0; i< displacement ; i++) { DkerProc(D_2F1MF2, diff --git a/src/spicelib/analysis/noisean.c b/src/spicelib/analysis/noisean.c index eee7a9108..195eaa54a 100644 --- a/src/spicelib/analysis/noisean.c +++ b/src/spicelib/analysis/noisean.c @@ -130,11 +130,11 @@ NOISEan (CKTcircuit *ckt, int restart) * plot */ - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "Noise Spectral Density Curves - (V^2 or A^2)/Hz", - freqUid, IF_REAL, - data->numPlots, data->namelist, IF_REAL, &(data->NplotPtr)); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "Noise Spectral Density Curves - (V^2 or A^2)/Hz", + freqUid, IF_REAL, + data->numPlots, data->namelist, IF_REAL, + &(data->NplotPtr)); if (error) return(error); if (job->NstpType != LINEAR) { @@ -165,11 +165,11 @@ NOISEan (CKTcircuit *ckt, int restart) data->outNoiz = job->NsavOnoise; data->inNoise = job->NsavInoise; /* saj resume rawfile fix*/ - error = SPfrontEnd->OUTpBeginPlot ( - NULL, NULL, - NULL, - NULL, 0, - 666, NULL, 666, &(data->NplotPtr)); + error = SPfrontEnd->OUTpBeginPlot (NULL, NULL, + NULL, + NULL, 0, + 666, NULL, 666, + &(data->NplotPtr)); /*saj*/ } @@ -277,11 +277,11 @@ NOISEan (CKTcircuit *ckt, int restart) if (error) return(error); - SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "Integrated Noise - V^2 or A^2", - NULL, 0, - data->numPlots, data->namelist, IF_REAL, &(data->NplotPtr)); + SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "Integrated Noise - V^2 or A^2", + NULL, 0, + data->numPlots, data->namelist, IF_REAL, + &(data->NplotPtr)); error = CKTnoise(ckt,INT_NOIZ,N_CALC,data); if (error) return(error); diff --git a/src/spicelib/analysis/pzan.c b/src/spicelib/analysis/pzan.c index 0e1655d09..eea10a609 100644 --- a/src/spicelib/analysis/pzan.c +++ b/src/spicelib/analysis/pzan.c @@ -46,11 +46,11 @@ PZan(CKTcircuit *ckt, int reset) /* Dump operating point. */ error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - "Distortion Operating Point", - NULL, IF_REAL, - numNames, nameList, IF_REAL, &plot); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + "Distortion Operating Point", + NULL, IF_REAL, + numNames, nameList, IF_REAL, + &plot); if(error) return(error); CKTdump(ckt, 0.0, plot); SPfrontEnd->OUTendPlot (plot); @@ -150,11 +150,11 @@ PZpost(CKTcircuit *ckt) name, UID_OTHER, NULL); } - SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - ckt->CKTcurJob->JOBname, - NULL, 0, - job->PZnPoles + job->PZnZeros, namelist, IF_COMPLEX, &pzPlotPtr); + SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + ckt->CKTcurJob->JOBname, + NULL, 0, + job->PZnPoles + job->PZnZeros, namelist, IF_COMPLEX, + &pzPlotPtr); j = 0; if (job->PZnPoles > 0) { diff --git a/src/spicelib/analysis/tfanal.c b/src/spicelib/analysis/tfanal.c index b1b2c7cda..757289865 100644 --- a/src/spicelib/analysis/tfanal.c +++ b/src/spicelib/analysis/tfanal.c @@ -110,11 +110,11 @@ TFanal(CKTcircuit *ckt, int restart) name, UID_OTHER, NULL); } - error = SPfrontEnd->OUTpBeginPlot ( - ckt, ckt->CKTcurJob, - job->JOBname, - NULL, 0, - 3, uids, IF_REAL, &plotptr); + error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, + job->JOBname, + NULL, 0, + 3, uids, IF_REAL, + &plotptr); if(error) return(error); /*find transfer function */ From f2343d2fe81e92dd87dce9b5cf0190f336abc88f Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:15:04 +0200 Subject: [PATCH 210/257] cleanup IFnewUid() invocations checked for object file invariance --- src/frontend/spiceif.c | 9 +++------ src/spicelib/analysis/acan.c | 3 +-- src/spicelib/analysis/cktmapn.c | 8 ++------ src/spicelib/analysis/cktmkcur.c | 3 +-- src/spicelib/analysis/cktmkvol.c | 3 +-- src/spicelib/analysis/cktnoise.c | 8 ++++---- src/spicelib/analysis/cktsens.c | 8 ++------ src/spicelib/analysis/dcpss.c | 3 +-- src/spicelib/analysis/dctran.c | 3 +-- src/spicelib/analysis/dctrcurv.c | 15 +++++---------- src/spicelib/analysis/distoan.c | 15 +++++---------- src/spicelib/analysis/noisean.c | 3 +-- src/spicelib/analysis/pzan.c | 6 ++---- src/spicelib/analysis/tfanal.c | 12 ++++-------- src/spicelib/parser/inp2c.c | 6 ++---- src/spicelib/parser/inp2d.c | 3 +-- src/spicelib/parser/inp2j.c | 3 +-- src/spicelib/parser/inp2l.c | 6 ++---- src/spicelib/parser/inp2o.c | 3 +-- src/spicelib/parser/inp2r.c | 6 ++---- src/spicelib/parser/inp2s.c | 3 +-- src/spicelib/parser/inp2u.c | 3 +-- src/spicelib/parser/inp2w.c | 3 +-- src/spicelib/parser/inp2z.c | 3 +-- 24 files changed, 46 insertions(+), 92 deletions(-) diff --git a/src/frontend/spiceif.c b/src/frontend/spiceif.c index 379430281..ae78087db 100644 --- a/src/frontend/spiceif.c +++ b/src/frontend/spiceif.c @@ -252,8 +252,7 @@ if_run(CKTcircuit *ckt, char *what, wordlist *args, INPtables *tab) /*CDHW Create an interactive task AAA with a new UID. ci_specTask will point to it CDHW*/ - err = IFnewUid(ft_curckt->ci_ckt, &specUid, NULL, "special", - UID_TASK, NULL); + err = IFnewUid(ft_curckt->ci_ckt, &specUid, NULL, "special", UID_TASK, NULL); if (err) { ft_sperror(err, "newUid"); return (2); @@ -281,8 +280,7 @@ if_run(CKTcircuit *ckt, char *what, wordlist *args, INPtables *tab) } if (which != -1) { /*CDHW options are available CDHW*/ - err = IFnewUid(ft_curckt->ci_ckt, &optUid, NULL, "options", - UID_ANALYSIS, NULL); + err = IFnewUid(ft_curckt->ci_ckt, &optUid, NULL, "options", UID_ANALYSIS, NULL); if (err) { ft_sperror(err, "newUid"); return (2); @@ -1273,8 +1271,7 @@ if_tranparams(struct circ *ci, double *start, double *stop, double *step) if (which == -1) return (FALSE); - err = IFnewUid(ci->ci_ckt, &tranUid, NULL, "Transient Analysis", - UID_ANALYSIS, NULL); + err = IFnewUid(ci->ci_ckt, &tranUid, NULL, "Transient Analysis", UID_ANALYSIS, NULL); if (err != OK) return (FALSE); diff --git a/src/spicelib/analysis/acan.c b/src/spicelib/analysis/acan.c index 08d2d80d8..e4ba6bf49 100644 --- a/src/spicelib/analysis/acan.c +++ b/src/spicelib/analysis/acan.c @@ -185,8 +185,7 @@ ACan(CKTcircuit *ckt, int restart) plot = NULL; } - SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, - "frequency", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, ckt->CKTcurJob->JOBname, freqUid, IF_REAL, diff --git a/src/spicelib/analysis/cktmapn.c b/src/spicelib/analysis/cktmapn.c index 96e0abe66..c9564160b 100644 --- a/src/spicelib/analysis/cktmapn.c +++ b/src/spicelib/analysis/cktmapn.c @@ -35,12 +35,8 @@ CKTmapNode(CKTcircuit *ckt, CKTnode **node, IFuid name) /* not found, so must be a new one */ error = CKTmkNode(ckt,&mynode); /*allocate the node*/ if(error) return(error); - error = SPfrontEnd->IFnewUid (ckt, - &uid, - NULL, - name, - UID_SIGNAL, - &mynode); /* get a uid for it */ + /* get a uid for it */ + error = SPfrontEnd->IFnewUid (ckt, &uid, NULL, name, UID_SIGNAL, &mynode); if(error) return(error); mynode->name = uid; /* set the info we have */ mynode->type = SP_VOLTAGE; diff --git a/src/spicelib/analysis/cktmkcur.c b/src/spicelib/analysis/cktmkcur.c index 029dd694b..b014fb007 100644 --- a/src/spicelib/analysis/cktmkcur.c +++ b/src/spicelib/analysis/cktmkcur.c @@ -29,8 +29,7 @@ CKTmkCur(CKTcircuit *ckt, CKTnode **node, IFuid basename, char *suffix) error = CKTmkNode(ckt,&mynode); if(error) return(error); checknode = mynode; - error = SPfrontEnd->IFnewUid (ckt, &uid, basename, - suffix, UID_SIGNAL, &checknode); + error = SPfrontEnd->IFnewUid (ckt, &uid, basename, suffix, UID_SIGNAL, &checknode); if(error) { FREE(mynode); if(node) *node = checknode; diff --git a/src/spicelib/analysis/cktmkvol.c b/src/spicelib/analysis/cktmkvol.c index e3e821d49..74007547d 100644 --- a/src/spicelib/analysis/cktmkvol.c +++ b/src/spicelib/analysis/cktmkvol.c @@ -27,8 +27,7 @@ CKTmkVolt(CKTcircuit *ckt, CKTnode **node, IFuid basename, char *suffix) error = CKTmkNode(ckt,&mynode); if(error) return(error); checknode = mynode; - error = SPfrontEnd->IFnewUid (ckt, &uid, basename, - suffix, UID_SIGNAL, &checknode); + error = SPfrontEnd->IFnewUid (ckt, &uid, basename, suffix, UID_SIGNAL, &checknode); if(error) { FREE(mynode); if(node) *node = checknode; diff --git a/src/spicelib/analysis/cktnoise.c b/src/spicelib/analysis/cktnoise.c index a1f1f995f..d088c8bb5 100644 --- a/src/spicelib/analysis/cktnoise.c +++ b/src/spicelib/analysis/cktnoise.c @@ -56,12 +56,12 @@ CKTnoise (CKTcircuit *ckt, int mode, int operation, Ndata *data) data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]), - NULL, "onoise_spectrum", UID_OTHER, NULL); + NULL, "onoise_spectrum", UID_OTHER, NULL); data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]), - NULL, "inoise_spectrum", UID_OTHER, NULL); + NULL, "inoise_spectrum", UID_OTHER, NULL); /* we've added two more plots */ @@ -73,11 +73,11 @@ CKTnoise (CKTcircuit *ckt, int mode, int operation, Ndata *data) data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]), - NULL, "onoise_total", UID_OTHER, NULL); + NULL, "onoise_total", UID_OTHER, NULL); data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]), - NULL, "inoise_total", UID_OTHER, NULL); + NULL, "inoise_total", UID_OTHER, NULL); /* we've added two more plots */ data->outpVector = diff --git a/src/spicelib/analysis/cktsens.c b/src/spicelib/analysis/cktsens.c index ef6b27c73..168f0e815 100644 --- a/src/spicelib/analysis/cktsens.c +++ b/src/spicelib/analysis/cktsens.c @@ -181,9 +181,7 @@ int sens_sens(CKTcircuit *ckt, int restart) sg->ptable[sg->param].keyword); } - SPfrontEnd->IFnewUid (ckt, - output_names + k, NULL, - namebuf, UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, output_names + k, NULL, namebuf, UID_OTHER, NULL); k += 1; } @@ -192,9 +190,7 @@ int sens_sens(CKTcircuit *ckt, int restart) freq_name = NULL; } else { type = IF_COMPLEX; - SPfrontEnd->IFnewUid (ckt, - &freq_name, NULL, - "frequency", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &freq_name, NULL, "frequency", UID_OTHER, NULL); } error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, diff --git a/src/spicelib/analysis/dcpss.c b/src/spicelib/analysis/dcpss.c index 8568d6531..97dac499d 100644 --- a/src/spicelib/analysis/dcpss.c +++ b/src/spicelib/analysis/dcpss.c @@ -237,8 +237,7 @@ DCpss(CKTcircuit *ckt, /* Time Domain plot start and prepared to be filled in later */ error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - SPfrontEnd->IFnewUid (ckt, &timeUid, NULL, - "time", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &timeUid, NULL, "time", UID_OTHER, NULL); error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, "Time Domain Periodic Steady State Analysis", timeUid, IF_REAL, diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index d2a6fdb4b..90bb6da3a 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -154,8 +154,7 @@ DCtran(CKTcircuit *ckt, #endif error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - SPfrontEnd->IFnewUid (ckt, &timeUid, NULL, - "time", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &timeUid, NULL, "time", UID_OTHER, NULL); error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, ckt->CKTcurJob->JOBname, timeUid, IF_REAL, diff --git a/src/spicelib/analysis/dctrcurv.c b/src/spicelib/analysis/dctrcurv.c index 62033ad3d..0001f4024 100644 --- a/src/spicelib/analysis/dctrcurv.c +++ b/src/spicelib/analysis/dctrcurv.c @@ -193,27 +193,22 @@ found:; if (job->TRCVvType[i] == vcode) - SPfrontEnd->IFnewUid (ckt, &varUid, NULL, - "v-sweep", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &varUid, NULL, "v-sweep", UID_OTHER, NULL); else { if (job->TRCVvType[i] == icode) - SPfrontEnd->IFnewUid (ckt, &varUid, NULL, - "i-sweep", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &varUid, NULL, "i-sweep", UID_OTHER, NULL); else { if (job->TRCVvType[i] == TEMP_CODE) - SPfrontEnd->IFnewUid (ckt, &varUid, NULL, - "temp-sweep", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &varUid, NULL, "temp-sweep", UID_OTHER, NULL); else { if (job->TRCVvType[i] == rcode) - SPfrontEnd->IFnewUid (ckt, &varUid, NULL, - "res-sweep", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &varUid, NULL, "res-sweep", UID_OTHER, NULL); else - SPfrontEnd->IFnewUid (ckt, &varUid, NULL, - "?-sweep", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &varUid, NULL, "?-sweep", UID_OTHER, NULL); } /* icode */ } /* TEMP_CODE */ } /* rcode*/ diff --git a/src/spicelib/analysis/distoan.c b/src/spicelib/analysis/distoan.c index cf5b2603f..0a083edba 100644 --- a/src/spicelib/analysis/distoan.c +++ b/src/spicelib/analysis/distoan.c @@ -516,8 +516,7 @@ time1 = SPfrontEnd->IFseconds(); if (! job->Df2wanted) { error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, - "frequency", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, "DISTORTION - 2nd harmonic", freqUid, IF_REAL, @@ -542,8 +541,7 @@ time1 = SPfrontEnd->IFseconds(); error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, - "frequency", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, "DISTORTION - 3rd harmonic", freqUid, IF_REAL, @@ -566,8 +564,7 @@ time1 = SPfrontEnd->IFseconds(); error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, - "frequency", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, "DISTORTION - IM: f1+f2", freqUid, IF_REAL, @@ -588,8 +585,7 @@ time1 = SPfrontEnd->IFseconds(); error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, - "frequency", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, "DISTORTION - IM: f1-f2", freqUid, IF_REAL, @@ -611,8 +607,7 @@ time1 = SPfrontEnd->IFseconds(); error = CKTnames(ckt,&numNames,&nameList); if(error) return(error); - SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, - "frequency", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, "DISTORTION - IM: 2f1-f2", freqUid, IF_REAL, diff --git a/src/spicelib/analysis/noisean.c b/src/spicelib/analysis/noisean.c index 195eaa54a..7c419e6ab 100644 --- a/src/spicelib/analysis/noisean.c +++ b/src/spicelib/analysis/noisean.c @@ -118,8 +118,7 @@ NOISEan (CKTcircuit *ckt, int restart) /* the current front-end needs the namelist to be fully declared before an OUTpBeginplot */ - SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, - "frequency", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL); data->numPlots = 0; /* we don't have any plots yet */ error = CKTnoise(ckt,N_DENS,N_OPEN,data); diff --git a/src/spicelib/analysis/pzan.c b/src/spicelib/analysis/pzan.c index eea10a609..9c975889e 100644 --- a/src/spicelib/analysis/pzan.c +++ b/src/spicelib/analysis/pzan.c @@ -141,13 +141,11 @@ PZpost(CKTcircuit *ckt) j = 0; for (i = 0; i < job->PZnPoles; i++) { sprintf(name, "pole(%-u)", i+1); - SPfrontEnd->IFnewUid (ckt, &(namelist[j++]), NULL, - name, UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &(namelist[j++]), NULL, name, UID_OTHER, NULL); } for (i = 0; i < job->PZnZeros; i++) { sprintf(name, "zero(%-u)", i+1); - SPfrontEnd->IFnewUid (ckt, &(namelist[j++]), NULL, - name, UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &(namelist[j++]), NULL, name, UID_OTHER, NULL); } SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, diff --git a/src/spicelib/analysis/tfanal.c b/src/spicelib/analysis/tfanal.c index 757289865..2a611cbb1 100644 --- a/src/spicelib/analysis/tfanal.c +++ b/src/spicelib/analysis/tfanal.c @@ -91,23 +91,19 @@ TFanal(CKTcircuit *ckt, int restart) ckt->CKTrhs[0]=0; /* make a UID for the transfer function output */ - SPfrontEnd->IFnewUid (ckt, &tfuid, NULL, "Transfer_function", - UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &tfuid, NULL, "Transfer_function", UID_OTHER, NULL); /* make a UID for the input impedance */ - SPfrontEnd->IFnewUid (ckt, &inuid, job->TFinSrc, - "Input_impedance", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &inuid, job->TFinSrc, "Input_impedance", UID_OTHER, NULL); /* make a UID for the output impedance */ if (job->TFoutIsI) { - SPfrontEnd->IFnewUid (ckt, &outuid, job->TFoutSrc - ,"Output_impedance", UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &outuid, job->TFoutSrc ,"Output_impedance", UID_OTHER, NULL); } else { name = TMALLOC(char, strlen(job->TFoutName) + 22); (void)sprintf(name,"output_impedance_at_%s", job->TFoutName); - SPfrontEnd->IFnewUid (ckt, &outuid, NULL, - name, UID_OTHER, NULL); + SPfrontEnd->IFnewUid (ckt, &outuid, NULL, name, UID_OTHER, NULL); } error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, diff --git a/src/spicelib/parser/inp2c.c b/src/spicelib/parser/inp2c.c index b69453d57..5a926ec45 100644 --- a/src/spicelib/parser/inp2c.c +++ b/src/spicelib/parser/inp2c.c @@ -81,8 +81,7 @@ void INP2C(CKTcircuit *ckt, INPtables * tab, card * current) line = saveline; /* go back */ type = mytype; if (!tab->defCmod) { /* create default C model */ - IFnewUid(ckt, &uid, NULL, "C", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "C", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defCmod), uid)); } mdfast = tab->defCmod; @@ -94,8 +93,7 @@ void INP2C(CKTcircuit *ckt, INPtables * tab, card * current) type = mytype; if (!tab->defCmod) { /* create default C model */ - IFnewUid(ckt, &uid, NULL, "C", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "C", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defCmod), uid)); } IFC(newInstance, (ckt, tab->defCmod, &fast, name)); diff --git a/src/spicelib/parser/inp2d.c b/src/spicelib/parser/inp2d.c index f85d1ad33..ea1c28242 100644 --- a/src/spicelib/parser/inp2d.c +++ b/src/spicelib/parser/inp2d.c @@ -67,8 +67,7 @@ void INP2D(CKTcircuit *ckt, INPtables * tab, card * current) type = mytype; if (!tab->defDmod) { /* create default D model */ - IFnewUid(ckt, &uid, NULL, "D", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "D", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defDmod), uid)); } mdfast = tab->defDmod; diff --git a/src/spicelib/parser/inp2j.c b/src/spicelib/parser/inp2j.c index 5dcd3be41..39dacd03c 100644 --- a/src/spicelib/parser/inp2j.c +++ b/src/spicelib/parser/inp2j.c @@ -65,8 +65,7 @@ void INP2J(CKTcircuit *ckt, INPtables * tab, card * current) } if (!tab->defJmod) { /* create default J model */ - IFnewUid(ckt, &uid, NULL, "J", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "J", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defJmod), uid)); } mdfast = tab->defJmod; diff --git a/src/spicelib/parser/inp2l.c b/src/spicelib/parser/inp2l.c index 971034698..ea466c9e5 100644 --- a/src/spicelib/parser/inp2l.c +++ b/src/spicelib/parser/inp2l.c @@ -81,8 +81,7 @@ void INP2L(CKTcircuit *ckt, INPtables * tab, card * current) line = saveline; /* go back */ type = mytype; if (!tab->defLmod) { /* create default L model */ - IFnewUid(ckt, &uid, NULL, "L", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "L", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defLmod), uid)); } mdfast = tab->defLmod; @@ -94,8 +93,7 @@ void INP2L(CKTcircuit *ckt, INPtables * tab, card * current) type = mytype; if (!tab->defLmod) { /* create default L model */ - IFnewUid(ckt, &uid, NULL, "L", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "L", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defLmod), uid)); } IFC(newInstance, (ckt, tab->defLmod, &fast, name)); diff --git a/src/spicelib/parser/inp2o.c b/src/spicelib/parser/inp2o.c index d401d5aed..d2ea82b9c 100644 --- a/src/spicelib/parser/inp2o.c +++ b/src/spicelib/parser/inp2o.c @@ -76,8 +76,7 @@ void INP2O(CKTcircuit *ckt, INPtables * tab, card * current) } else { if (!tab->defOmod) { /* create default O model */ - IFnewUid(ckt, &uid, NULL, "O", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "O", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defOmod), uid)); } mdfast = tab->defOmod; diff --git a/src/spicelib/parser/inp2r.c b/src/spicelib/parser/inp2r.c index f0cb066c8..da0d370aa 100644 --- a/src/spicelib/parser/inp2r.c +++ b/src/spicelib/parser/inp2r.c @@ -172,8 +172,7 @@ void INP2R(CKTcircuit *ckt, INPtables * tab, card * current) line = saveline; /* go back */ type = mytype; if (!tab->defRmod) { /* create default R model */ - IFnewUid(ckt, &uid, NULL, "R", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "R", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defRmod), uid)); } mdfast = tab->defRmod; @@ -185,8 +184,7 @@ void INP2R(CKTcircuit *ckt, INPtables * tab, card * current) type = mytype; if (!tab->defRmod) { /* create default R model */ - IFnewUid(ckt, &uid, NULL, "R", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "R", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defRmod), uid)); } IFC(newInstance, (ckt, tab->defRmod, &fast, name)); diff --git a/src/spicelib/parser/inp2s.c b/src/spicelib/parser/inp2s.c index 720241609..bcd3c2cda 100644 --- a/src/spicelib/parser/inp2s.c +++ b/src/spicelib/parser/inp2s.c @@ -68,8 +68,7 @@ void INP2S(CKTcircuit *ckt, INPtables * tab, card * current) type = mytype; if (!tab->defSmod) { /* create deafult S model */ - IFnewUid(ckt, &uid, NULL, "S", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "S", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defSmod), uid)); } mdfast = tab->defSmod; diff --git a/src/spicelib/parser/inp2u.c b/src/spicelib/parser/inp2u.c index 8505b5513..5e6bb6275 100644 --- a/src/spicelib/parser/inp2u.c +++ b/src/spicelib/parser/inp2u.c @@ -62,8 +62,7 @@ void INP2U(CKTcircuit *ckt, INPtables * tab, card * current) type = mytype; if (!tab->defUmod) { /* create deafult U model */ - IFnewUid(ckt, &uid, NULL, "U", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "U", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defUmod), uid)); } mdfast = tab->defUmod; diff --git a/src/spicelib/parser/inp2w.c b/src/spicelib/parser/inp2w.c index 813e6439f..78046fde1 100644 --- a/src/spicelib/parser/inp2w.c +++ b/src/spicelib/parser/inp2w.c @@ -65,8 +65,7 @@ void INP2W(CKTcircuit *ckt, INPtables * tab, card * current) type = mytype; if (!tab->defWmod) { /* create deafult W model */ - IFnewUid(ckt, &uid, NULL, "W", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "W", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defWmod), uid)); } mdfast = tab->defWmod; diff --git a/src/spicelib/parser/inp2z.c b/src/spicelib/parser/inp2z.c index c259e2491..24a25e21c 100644 --- a/src/spicelib/parser/inp2z.c +++ b/src/spicelib/parser/inp2z.c @@ -79,8 +79,7 @@ void INP2Z(CKTcircuit *ckt, INPtables * tab, card * current) if (!tab->defZmod) { /* create default Z model */ - IFnewUid(ckt, &uid, NULL, "Z", UID_MODEL, - NULL); + IFnewUid(ckt, &uid, NULL, "Z", UID_MODEL, NULL); IFC(newModel, (ckt, type, &(tab->defZmod), uid)); } mdfast = tab->defZmod; From b19342581b7a758cb46c08765f91d897733cd46b Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 15:15:38 +0200 Subject: [PATCH 211/257] cleanup OUTattributes() invocations checked for object file invariance --- src/spicelib/analysis/acan.c | 3 +-- src/spicelib/analysis/cktsens.c | 3 +-- src/spicelib/analysis/distoan.c | 3 +-- src/spicelib/analysis/noisean.c | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/spicelib/analysis/acan.c b/src/spicelib/analysis/acan.c index e4ba6bf49..90c321f13 100644 --- a/src/spicelib/analysis/acan.c +++ b/src/spicelib/analysis/acan.c @@ -195,8 +195,7 @@ ACan(CKTcircuit *ckt, int restart) if(error) return(error); if (job->ACstepType != LINEAR) { - SPfrontEnd->OUTattributes (acPlot, NULL, - OUT_SCALE_LOG, NULL); + SPfrontEnd->OUTattributes (acPlot, NULL, OUT_SCALE_LOG, NULL); } freq = job->ACstartFreq; diff --git a/src/spicelib/analysis/cktsens.c b/src/spicelib/analysis/cktsens.c index 168f0e815..2bc1bc89a 100644 --- a/src/spicelib/analysis/cktsens.c +++ b/src/spicelib/analysis/cktsens.c @@ -209,8 +209,7 @@ int sens_sens(CKTcircuit *ckt, int restart) output_values = NULL; output_cvalues = NEWN(IFcomplex, num_vars); if (job->step_type != SENS_LINEAR) - SPfrontEnd->OUTattributes (sen_data, - NULL, OUT_SCALE_LOG, NULL); + SPfrontEnd->OUTattributes (sen_data, NULL, OUT_SCALE_LOG, NULL); } diff --git a/src/spicelib/analysis/distoan.c b/src/spicelib/analysis/distoan.c index 0a083edba..c7c2aea10 100644 --- a/src/spicelib/analysis/distoan.c +++ b/src/spicelib/analysis/distoan.c @@ -523,8 +523,7 @@ time1 = SPfrontEnd->IFseconds(); numNames, nameList, IF_COMPLEX, &acPlot); if (job->DstepType != LINEAR) { - SPfrontEnd->OUTattributes (acPlot, NULL, - OUT_SCALE_LOG, NULL); + SPfrontEnd->OUTattributes (acPlot, NULL, OUT_SCALE_LOG, NULL); } for (i=0; i< displacement ; i++) { diff --git a/src/spicelib/analysis/noisean.c b/src/spicelib/analysis/noisean.c index 7c419e6ab..dbb68dc71 100644 --- a/src/spicelib/analysis/noisean.c +++ b/src/spicelib/analysis/noisean.c @@ -137,8 +137,7 @@ NOISEan (CKTcircuit *ckt, int restart) if (error) return(error); if (job->NstpType != LINEAR) { - SPfrontEnd->OUTattributes (data->NplotPtr, NULL, - OUT_SCALE_LOG, NULL); + SPfrontEnd->OUTattributes (data->NplotPtr, NULL, OUT_SCALE_LOG, NULL); } } else { /* we must have paused before. pick up where we left off */ From 5754a213623318a5d923092ea64d5b015c387ae5 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 14 Jul 2013 18:45:49 +0200 Subject: [PATCH 212/257] shared ngspice: external voltage source --- src/spicelib/devices/vsrc/vsrc.c | 2 +- src/spicelib/devices/vsrc/vsrcacct.c | 7 ++++++- src/spicelib/devices/vsrc/vsrcdefs.h | 2 ++ src/spicelib/devices/vsrc/vsrcload.c | 13 ++++++++++++- src/spicelib/devices/vsrc/vsrcpar.c | 11 +++++++++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/spicelib/devices/vsrc/vsrc.c b/src/spicelib/devices/vsrc/vsrc.c index 88ae8eb3a..41bac74bd 100644 --- a/src/spicelib/devices/vsrc/vsrc.c +++ b/src/spicelib/devices/vsrc/vsrc.c @@ -23,7 +23,7 @@ IFparm VSRCpTable[] = { /* parameters */ IOP ("am", VSRC_AM, IF_REALVEC,"Amplitude modulation description"), IOP ("trnoise", VSRC_TRNOISE, IF_REALVEC,"Transient noise description"), IOP ("trrandom", VSRC_TRRANDOM, IF_REALVEC,"random source description"), - + IOP ("external", VSRC_EXTERNAL, IF_REALVEC,"external source description"), OPU ("pos_node",VSRC_POS_NODE, IF_INTEGER,"Positive node of source"), OPU ("neg_node",VSRC_NEG_NODE, IF_INTEGER,"Negative node of source"), OPU ("function",VSRC_FCN_TYPE, IF_INTEGER,"Function of the source"), diff --git a/src/spicelib/devices/vsrc/vsrcacct.c b/src/spicelib/devices/vsrc/vsrcacct.c index 7ce21fda4..0081ee918 100644 --- a/src/spicelib/devices/vsrc/vsrcacct.c +++ b/src/spicelib/devices/vsrc/vsrcacct.c @@ -290,7 +290,12 @@ VSRCaccept(CKTcircuit *ckt, GENmodel *inModel) } } break; - +#ifdef SHARED_MODULE + case EXTERNAL:{ + /* no breakpoints (yet) */ + } + break; +#endif } // switch } // if ... else bkptset: ; diff --git a/src/spicelib/devices/vsrc/vsrcdefs.h b/src/spicelib/devices/vsrc/vsrcdefs.h index d8f71ec5e..1e60e3db3 100644 --- a/src/spicelib/devices/vsrc/vsrcdefs.h +++ b/src/spicelib/devices/vsrc/vsrcdefs.h @@ -99,6 +99,7 @@ typedef struct sVSRCmodel { #define AM 6 #define TRNOISE 7 #define TRRANDOM 8 +#define EXTERNAL 9 #endif /*PULSE*/ /* device parameters */ @@ -129,6 +130,7 @@ typedef struct sVSRCmodel { #define VSRC_TD 24 #define VSRC_TRNOISE 25 #define VSRC_TRRANDOM 26 +#define VSRC_EXTERNAL 27 /* model parameters */ diff --git a/src/spicelib/devices/vsrc/vsrcload.c b/src/spicelib/devices/vsrc/vsrcload.c index 28734b156..60ff58e9d 100644 --- a/src/spicelib/devices/vsrc/vsrcload.c +++ b/src/spicelib/devices/vsrc/vsrcload.c @@ -18,6 +18,10 @@ Modified: 2000 AlansFixes /* gtri - end - wbk - modify for supply ramping option */ #endif +#ifdef SHARED_MODULE +extern double getvsrcval(double, char*); +#endif + int VSRCload(GENmodel *inModel, CKTcircuit *ckt) /* actually load the current value into the @@ -384,7 +388,14 @@ VNoi3 3 0 DC 0 TRNOISE(0 0 0 0 15m 22u 50u) : generate RTS noise value += here->VSRCdcValue; } break; - +#ifdef SHARED_MODULE + case EXTERNAL: { + value = getvsrcval(time, here->VSRCname); + if(here -> VSRCdcGiven) + value += here->VSRCdcValue; + } + break; +#endif } // switch } // else (line 48) loadDone: diff --git a/src/spicelib/devices/vsrc/vsrcpar.c b/src/spicelib/devices/vsrc/vsrcpar.c index e0db81974..f21ec4354 100644 --- a/src/spicelib/devices/vsrc/vsrcpar.c +++ b/src/spicelib/devices/vsrc/vsrcpar.c @@ -261,6 +261,17 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) } break; +#ifdef SHARED_MODULE + case VSRC_EXTERNAL: { + here->VSRCfunctionType = EXTERNAL; + here->VSRCfuncTGiven = TRUE; + /* no coefficients + copy_coeffs(here, value); + */ + } + break; +#endif + default: return(E_BADPARM); } From b973d32778e1f5f1cf2f4425856a87f9179a824f Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 14 Jul 2013 18:49:25 +0200 Subject: [PATCH 213/257] shared ngspice, dctran.c fcn to add breakpoints --- src/spicelib/analysis/dctran.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index 90bb6da3a..24e0801f5 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -34,6 +34,9 @@ extern struct dbcomm *dbs; #include "ngspice/cluster.h" #endif +#ifdef SHARED_MODULE +extern int add_bkpt(void); +#endif #define INIT_STATS() \ do { \ @@ -131,7 +134,9 @@ DCtran(CKTcircuit *ckt, ckt->CKTbreaks[0] = 0; ckt->CKTbreaks[1] = ckt->CKTfinalTime; ckt->CKTbreakSize = 2; - +#ifdef SHARED_MODULE + add_bkpt(); +#endif #ifdef XSPICE /* gtri - begin - wbk - 12/19/90 - Modify setting of CKTminBreak */ /* Set to 10 times delmin for ATESSE 1 compatibity */ From 8066aacfff9292a08ed5a71aaabb83504d67e090 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 14 Jul 2013 18:54:44 +0200 Subject: [PATCH 214/257] sharedspice.c, .h: fcn to initialize Sync, fcn to set breakpoint, callback fcn to read vsrc external inputs --- src/include/ngspice/sharedspice.h | 22 +++++++ src/sharedspice.c | 102 ++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) diff --git a/src/include/ngspice/sharedspice.h b/src/include/ngspice/sharedspice.h index ca8f4b71e..efdc6ff60 100644 --- a/src/include/ngspice/sharedspice.h +++ b/src/include/ngspice/sharedspice.h @@ -209,6 +209,18 @@ typedef int (BGThreadRunning)(bool, void*); void* return pointer received from caller */ +/* callback functions +addresses received from caller with ngSpice_Init_Sync() function +*/ + +/* ask for VSRC EXTERNAL value */ +typedef int (GetVSRCData)(double*, double, char*, void*); +/* + double* return voltage value + double actual time + char* node name + void* return pointer received from caller +*/ /* ngspice initialization, printfcn: pointer to callback function for reading printf, fprintf @@ -223,6 +235,12 @@ IMPEXP int ngSpice_Init(SendChar* printfcn, SendStat* statfcn, ControlledExit* ngexit, SendData* sdata, SendInitData* sinitdata, BGThreadRunning* bgtrun, void* userData); +/* initialization of synchronizing functions +vsrcdat: pointer to callback function for retrieving a voltage source value +ident: pointer to integer unique to this shared library (defaults to 0) +*/ +IMPEXP +int ngSpice_Init_Sync(GetVSRCData* vsrcdat, int* ident, void* userData); /* Caller may send ngspice commands to ngspice.dll. Commands are executed immediately */ @@ -263,6 +281,10 @@ char** ngSpice_AllVecs(char* plotname); IMPEXP bool ngSpice_running(void); +/* set a breakpoint in ngspice */ +IMPEXP +bool ngSpice_SetBkpt(double time); + #ifdef __cplusplus } diff --git a/src/sharedspice.c b/src/sharedspice.c index a6ba69309..adc6579ea 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -198,6 +198,7 @@ int sh_vfprintf(FILE *f, const char *fmt, va_list args); int sh_fputsll(const char *input, FILE* outf); int sh_ExecutePerLoop(void); +double getvsrcval(double, char*); int sh_vecinit(runDesc *run); void shared_exit(int status); @@ -206,6 +207,8 @@ void sighandler_sharedspice(int num); void wl_delete_first(wordlist **wlstart, wordlist **wlend); +int add_bkpt(void); + #if !defined(low_latency) static char* outstorage(char*, bool); static void printsend(void); @@ -220,6 +223,7 @@ static ControlledExit* ngexit; static SendData* datfcn; static SendInitData* datinitfcn; static BGThreadRunning* bgtr; +static GetVSRCData* getvdat; static pvector_info myvec = NULL; char **allvecs = NULL; char **allplots = NULL; @@ -228,6 +232,7 @@ static bool nostatuswanted = FALSE; static bool nodatawanted = FALSE; static bool nodatainitwanted = FALSE; static bool nobgtrwanted = FALSE; +static bool wantvdat = FALSE; static bool immediate = FALSE; static bool coquit = FALSE; static jmp_buf errbufm, errbufc; @@ -247,6 +252,9 @@ mutexType fputsMutex; static bool is_initialized = FALSE; static char* no_init = "Error: ngspice is not initialized!\n Run ngSpice_Init first"; +/* identifier for this ngspice invocation */ +static int ng_ident = 0; + /*helper function*//* static struct plot * @@ -499,6 +507,26 @@ ngSpice_running (void) } #endif +/* Initialise external voltage source */ +IMPEXP +int +ngSpice_Init_Sync(GetVSRCData* vsrcdat, int* ident, void* userData) +{ + getvdat = vsrcdat; + /* set userdata, but don't overwrite with NULL */ + if (userData) + userptr = userData; + /* set ngspice shared lib identification number */ + ng_ident = *ident; + /* if caller sends NULL, don't try to retrieve voltage */ + if (getvdat) { + wantvdat = TRUE; + return 0; + } + return 1; +} + + /* Initialise ngspice and setup native methods */ IMPEXP int @@ -826,6 +854,65 @@ char** ngSpice_AllVecs(char* plotname) } +static double *bkpttmp = NULL; +static int bkpttmpsize = 0; + +/* set a breakpoint in ngspice */ +IMPEXP +bool ngSpice_SetBkpt(double time) +{ + int error; + CKTcircuit *ckt = NULL; + + if (!ft_curckt || !ft_curckt->ci_ckt) { + fprintf(cp_err, "Error: no circuit loaded.\n"); + return(FALSE); + } + + ckt = ft_curckt->ci_ckt; + if (ckt->CKTbreakSize == 0) { + /* breakpoints have not yet been set up, so store here preliminary + and add with fcn add_bkpt() called from DCTran()*/ + if (bkpttmp == NULL) { + bkpttmp = TMALLOC(double, bkpttmpsize + 1); + if(bkpttmp == NULL) + return(FALSE); + bkpttmpsize++; + } + else { + bkpttmp = TREALLOC(double, bkpttmp, bkpttmpsize + 1); + bkpttmpsize++; + } + bkpttmp[bkpttmpsize-1] = time; + error = 0; + } + else + error = CKTsetBreak(ckt, time); + if(error) + return(FALSE); + return(TRUE); +} + +/* add the preliminary breakpoints to the list. + called from dctran.c */ +int +add_bkpt(void) +{ + int i; + int error = 0; + CKTcircuit *ckt = ft_curckt->ci_ckt; + + if((bkpttmp) && (bkpttmpsize > 0)) { + for (i = 0; i < bkpttmpsize; i++) + error = CKTsetBreak(ckt, bkpttmp[i]); + FREE(bkpttmp); + bkpttmpsize = 0; + } + if(error) + return(error); + return(OK); +} + /*------------------------------------------------------*/ /* Redefine the vfprintf() functions for callback */ /*------------------------------------------------------*/ @@ -1612,3 +1699,18 @@ int sh_vecinit(runDesc *run) return 0; } +/* issue callback to request external voltage data for source vname*/ +double getvsrcval(double time, char* vname) +{ + double vval; + if (!wantvdat) { + fprintf(stderr, "Error: No callback supplied for source %s\n", vname); + shared_exit(EXIT_BAD); + return(EXIT_BAD); + } + else { + /* callback fcn */ + getvdat(&vval, time, vname, userptr); + return vval; + } +} From b85a3b6c9de9a8ff45483efcb36292aeba19c65d Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 20:30:52 +0200 Subject: [PATCH 215/257] fix "misc_time.c: make timediff always availabe when timeb.h is found" --- src/misc/misc_time.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/misc/misc_time.c b/src/misc/misc_time.c index d3f3b2f07..1300735cb 100644 --- a/src/misc/misc_time.c +++ b/src/misc/misc_time.c @@ -32,6 +32,9 @@ Copyright 1990 Regents of the University of California. All rights reserved. # endif #endif +#ifdef HAVE_FTIME +# include +#endif /* Return the date. Return value is static data. */ From 950d372e13df81f5c3834b80a28fb49b9b39c0fa Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 20:12:17 +0200 Subject: [PATCH 216/257] simplify #ifdef nesting #1/4 --- src/spicelib/analysis/dcpss.c | 9 ++++++--- src/spicelib/analysis/dctran.c | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/spicelib/analysis/dcpss.c b/src/spicelib/analysis/dcpss.c index 97dac499d..8fe76ddbe 100644 --- a/src/spicelib/analysis/dcpss.c +++ b/src/spicelib/analysis/dcpss.c @@ -1206,6 +1206,12 @@ resume: #endif } +#ifndef XSPICE + /* don't want to get below delmin for no reason */ + ckt->CKTdelta = MAX(ckt->CKTdelta, ckt->CKTdelmin*2.0); + } +#endif + #ifdef XSPICE } @@ -1251,9 +1257,6 @@ resume: /* gtri - end - wbk - Modify Breakpoint stuff */ #else /* !XSPICE */ - /* don't want to get below delmin for no reason */ - ckt->CKTdelta = MAX(ckt->CKTdelta, ckt->CKTdelmin*2.0); - } else if(ckt->CKTtime + ckt->CKTdelta >= ckt->CKTbreaks[0]) { ckt->CKTsaveDelta = ckt->CKTdelta; ckt->CKTdelta = ckt->CKTbreaks[0] - ckt->CKTtime; diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index 24e0801f5..084051d5a 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -559,6 +559,12 @@ resume: #endif } +#ifndef XSPICE + /* don't want to get below delmin for no reason */ + ckt->CKTdelta = MAX(ckt->CKTdelta, ckt->CKTdelmin*2.0); + } +#endif + #ifdef XSPICE } @@ -604,9 +610,6 @@ resume: /* gtri - end - wbk - Modify Breakpoint stuff */ #else /* !XSPICE */ - /* don't want to get below delmin for no reason */ - ckt->CKTdelta = MAX(ckt->CKTdelta, ckt->CKTdelmin*2.0); - } else if(ckt->CKTtime + ckt->CKTdelta >= ckt->CKTbreaks[0]) { ckt->CKTsaveDelta = ckt->CKTdelta; ckt->CKTdelta = ckt->CKTbreaks[0] - ckt->CKTtime; From 1f21bcfbe30cb15522fa31b27a1a79d011dee71c Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 20:12:27 +0200 Subject: [PATCH 217/257] simplify #ifdef nesting #2/4 --- src/spicelib/analysis/dcpss.c | 3 +-- src/spicelib/analysis/dctran.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/spicelib/analysis/dcpss.c b/src/spicelib/analysis/dcpss.c index 8fe76ddbe..b77f84a09 100644 --- a/src/spicelib/analysis/dcpss.c +++ b/src/spicelib/analysis/dcpss.c @@ -1209,12 +1209,11 @@ resume: #ifndef XSPICE /* don't want to get below delmin for no reason */ ckt->CKTdelta = MAX(ckt->CKTdelta, ckt->CKTdelmin*2.0); - } #endif -#ifdef XSPICE } +#ifdef XSPICE /* gtri - begin - wbk - Add Breakpoint stuff */ if(ckt->CKTtime + ckt->CKTdelta >= g_mif_info.breakpoint.current) { diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index 084051d5a..90ad29a80 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -562,12 +562,11 @@ resume: #ifndef XSPICE /* don't want to get below delmin for no reason */ ckt->CKTdelta = MAX(ckt->CKTdelta, ckt->CKTdelmin*2.0); - } #endif -#ifdef XSPICE } +#ifdef XSPICE /* gtri - begin - wbk - Add Breakpoint stuff */ if(ckt->CKTtime + ckt->CKTdelta >= g_mif_info.breakpoint.current) { From 656db6805d528e99e65f9aefafec559bc94aefb0 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 20:12:40 +0200 Subject: [PATCH 218/257] simplify #ifdef nesting #3/4 --- src/spicelib/analysis/dcpss.c | 18 +++++++++++------- src/spicelib/analysis/dctran.c | 22 +++++++++++++--------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/spicelib/analysis/dcpss.c b/src/spicelib/analysis/dcpss.c index b77f84a09..368cd288e 100644 --- a/src/spicelib/analysis/dcpss.c +++ b/src/spicelib/analysis/dcpss.c @@ -1213,6 +1213,17 @@ resume: } +#ifndef XSPICE + else if(ckt->CKTtime + ckt->CKTdelta >= ckt->CKTbreaks[0]) { + ckt->CKTsaveDelta = ckt->CKTdelta; + ckt->CKTdelta = ckt->CKTbreaks[0] - ckt->CKTtime; + /* fprintf (stderr, "delta cut to %g to hit breakpoint\n" ,ckt->CKTdelta) ; */ + fflush(stdout); + ckt->CKTbreak = 1; /* why? the current pt. is not a bkpt. */ + } +#endif /* !XSPICE */ + + #ifdef XSPICE /* gtri - begin - wbk - Add Breakpoint stuff */ @@ -1256,13 +1267,6 @@ resume: /* gtri - end - wbk - Modify Breakpoint stuff */ #else /* !XSPICE */ - else if(ckt->CKTtime + ckt->CKTdelta >= ckt->CKTbreaks[0]) { - ckt->CKTsaveDelta = ckt->CKTdelta; - ckt->CKTdelta = ckt->CKTbreaks[0] - ckt->CKTtime; - /* fprintf (stderr, "delta cut to %g to hit breakpoint\n" ,ckt->CKTdelta) ; */ - fflush(stdout); - ckt->CKTbreak = 1; /* why? the current pt. is not a bkpt. */ - } #ifdef CLUSTER if(!CLUsync(ckt->CKTtime,&ckt->CKTdelta,0)) { fprintf (stderr, "Sync error!\n"); diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index 90ad29a80..b5263ffe9 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -566,6 +566,19 @@ resume: } +#ifndef XSPICE + else if(ckt->CKTtime + ckt->CKTdelta >= ckt->CKTbreaks[0]) { + ckt->CKTsaveDelta = ckt->CKTdelta; + ckt->CKTdelta = ckt->CKTbreaks[0] - ckt->CKTtime; +#ifdef STEPDEBUG + (void)printf("delta cut to %g to hit breakpoint\n",ckt->CKTdelta); + fflush(stdout); +#endif + ckt->CKTbreak = 1; /* why? the current pt. is not a bkpt. */ + } +#endif /* !XSPICE */ + + #ifdef XSPICE /* gtri - begin - wbk - Add Breakpoint stuff */ @@ -609,15 +622,6 @@ resume: /* gtri - end - wbk - Modify Breakpoint stuff */ #else /* !XSPICE */ - else if(ckt->CKTtime + ckt->CKTdelta >= ckt->CKTbreaks[0]) { - ckt->CKTsaveDelta = ckt->CKTdelta; - ckt->CKTdelta = ckt->CKTbreaks[0] - ckt->CKTtime; -#ifdef STEPDEBUG - (void)printf("delta cut to %g to hit breakpoint\n",ckt->CKTdelta); - fflush(stdout); -#endif - ckt->CKTbreak = 1; /* why? the current pt. is not a bkpt. */ - } #ifdef CLUSTER if(!CLUsync(ckt->CKTtime,&ckt->CKTdelta,0)) { printf("Sync error!\n"); From 1e85da2369a8dc54ba349d8b21e48f8e94c1af05 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 14 Jul 2013 20:12:49 +0200 Subject: [PATCH 219/257] simplify #ifdef nesting #4/4 --- src/spicelib/analysis/dcpss.c | 20 +++++++++----------- src/spicelib/analysis/dctran.c | 20 +++++++++----------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/spicelib/analysis/dcpss.c b/src/spicelib/analysis/dcpss.c index 368cd288e..2afb2374f 100644 --- a/src/spicelib/analysis/dcpss.c +++ b/src/spicelib/analysis/dcpss.c @@ -1265,18 +1265,7 @@ resume: } /* gtri - end - wbk - Modify Breakpoint stuff */ -#else /* !XSPICE */ -#ifdef CLUSTER - if(!CLUsync(ckt->CKTtime,&ckt->CKTdelta,0)) { - fprintf (stderr, "Sync error!\n"); - exit(0); - } -#endif - -#endif /* XSPICE */ - -#ifdef XSPICE /* gtri - begin - wbk - Do event solution */ if(ckt->evt->counts.num_insts > 0) { @@ -1319,6 +1308,15 @@ resume: } /* end if there are event instances */ /* gtri - end - wbk - Do event solution */ +#else + +#ifdef CLUSTER + if(!CLUsync(ckt->CKTtime,&ckt->CKTdelta,0)) { + fprintf (stderr, "Sync error!\n"); + exit(0); + } +#endif /* CLUSTER */ + #endif /* What is that??? */ diff --git a/src/spicelib/analysis/dctran.c b/src/spicelib/analysis/dctran.c index b5263ffe9..7652b95e2 100644 --- a/src/spicelib/analysis/dctran.c +++ b/src/spicelib/analysis/dctran.c @@ -620,18 +620,7 @@ resume: } /* gtri - end - wbk - Modify Breakpoint stuff */ -#else /* !XSPICE */ -#ifdef CLUSTER - if(!CLUsync(ckt->CKTtime,&ckt->CKTdelta,0)) { - printf("Sync error!\n"); - exit(0); - } -#endif - -#endif /* XSPICE */ - -#ifdef XSPICE /* gtri - begin - wbk - Do event solution */ if(ckt->evt->counts.num_insts > 0) { @@ -674,6 +663,15 @@ resume: } /* end if there are event instances */ /* gtri - end - wbk - Do event solution */ +#else + +#ifdef CLUSTER + if(!CLUsync(ckt->CKTtime,&ckt->CKTdelta,0)) { + printf("Sync error!\n"); + exit(0); + } +#endif /* CLUSTER */ + #endif for(i=5; i>=0; i--) ckt->CKTdeltaOld[i+1] = ckt->CKTdeltaOld[i]; From d1c6492157d69b572704b2d7c3b35c9367a919f9 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 14 Jan 2013 11:37:41 +0100 Subject: [PATCH 220/257] Implemented the KCL verification in place of the classical SPICE3 check for the circuit currents This version modifies every model directly to obtain fvk in a separate vector, instead of using a matrix-vector product --- src/include/ngspice/cktdefs.h | 5 ++++ src/maths/ni/niconv.c | 51 +++++++++++++++++++++++++-------- src/maths/ni/niiter.c | 13 +++++++++ src/maths/ni/nireinit.c | 1 + src/spicelib/analysis/cktload.c | 1 + 5 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 2126aff36..1e63aa708 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -110,6 +110,7 @@ struct CKTcircuit { double *CKTrhs; /* current rhs value - being loaded */ double *CKTrhsOld; /* previous rhs value for convergence testing */ + double *CKTfvk ; /* KCL Verification array */ double *CKTrhsSpare; /* spare rhs value for reordering */ double *CKTirhs; /* current rhs value - being loaded (imag) */ @@ -429,6 +430,10 @@ extern void NInzIter(CKTcircuit *, int, int); extern int NIpred(CKTcircuit *ckt); #endif +/* KCL Verification */ +extern int NIkclVerification (CKTcircuit *) ; +/********************/ + extern IFfrontEnd *SPfrontEnd; #endif diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 988fd30f2..deb9c9016 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -45,18 +45,6 @@ NIconvTest(CKTcircuit *ckt) #ifdef STEPDEBUG printf(" non-convergence at node (type=3) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",CKTnodName(ckt,i),new,old,tol); printf(" reltol: %g voltTol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + voltTol)\n",ckt->CKTreltol,ckt->CKTvoltTol); -#endif /* STEPDEBUG */ - ckt->CKTtroubleNode = i; - ckt->CKTtroubleElt = NULL; - return(1); - } - } else { - tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + - ckt->CKTabstol; - if (fabs(new-old) >tol ) { -#ifdef STEPDEBUG - printf(" non-convergence at node (type=%d) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",node->type,CKTnodName(ckt,i),new,old,tol); - printf(" reltol: %g abstol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + abstol)\n",ckt->CKTreltol,ckt->CKTabstol); #endif /* STEPDEBUG */ ckt->CKTtroubleNode = i; ckt->CKTtroubleElt = NULL; @@ -74,3 +62,42 @@ NIconvTest(CKTcircuit *ckt) return(0); #endif /* NEWCONV */ } + + +/** + * Routine to Verify the KCL + */ + +int NIkclVerification (CKTcircuit *ckt) +{ + int i, size ; + double maximum = 0 ; + CKTnode *node ; + + size = SMPmatSize (ckt->CKTmatrix) ; + + node = ckt->CKTnodes ; + for (i = 1 ; i <= size ; i++) + { + if (node->type == SP_CURRENT) + { + if (maximum < fabs (ckt->CKTrhsOld [i])) + maximum = fabs (ckt->CKTrhsOld [i]) ; + } + node = node->next ; + } + + node = ckt->CKTnodes ; + for (i = 1 ; i <= size ; i++) + { + if (node->type == SP_VOLTAGE) + { + if ((ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) +// if ((ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + return 1 ; + } + node = node->next ; + } + + return 0 ; +} diff --git a/src/maths/ni/niiter.c b/src/maths/ni/niiter.c index 4d6c83e08..d540cae43 100644 --- a/src/maths/ni/niiter.c +++ b/src/maths/ni/niiter.c @@ -37,6 +37,9 @@ NIiter(CKTcircuit *ckt, int maxIter) CKTnode *node; /* current matrix entry */ double diff, maxdiff, damp_factor, *OldCKTstate0=NULL; + /* KCL_verified */ + int KCL_verified ; + if ( maxIter < 100 ) maxIter = 100; /* some convergence issues that get resolved by increasing max iter */ iterno=0; @@ -110,6 +113,16 @@ NIiter(CKTcircuit *ckt, int maxIter) ckt->CKTniState |= NISHOULDREORDER; } + /* KCL Verification */ + if ((ckt->CKTnoncon == 0) && (iterno != 1)) + { + KCL_verified = NIkclVerification (ckt) ; + if (KCL_verified) /* NOT VERIFIED */ + ckt->CKTnoncon = 1 ; + else + ckt->CKTnoncon = 0 ; + } + if(ckt->CKTniState & NISHOULDREORDER) { startTime = SPfrontEnd->IFseconds(); error = SMPreorder(ckt->CKTmatrix,ckt->CKTpivotAbsTol, diff --git a/src/maths/ni/nireinit.c b/src/maths/ni/nireinit.c index cc14aee53..3c2641fc4 100644 --- a/src/maths/ni/nireinit.c +++ b/src/maths/ni/nireinit.c @@ -29,6 +29,7 @@ NIreinit( CKTcircuit *ckt) size = SMPmatSize(ckt->CKTmatrix); CKALLOC(CKTrhs,size+1,double); CKALLOC(CKTrhsOld,size+1,double); + CKALLOC(CKTfvk,size+1,double); CKALLOC(CKTrhsSpare,size+1,double); CKALLOC(CKTirhs,size+1,double); CKALLOC(CKTirhsOld,size+1,double); diff --git a/src/spicelib/analysis/cktload.c b/src/spicelib/analysis/cktload.c index 62b6f2a47..ca5a7cadc 100644 --- a/src/spicelib/analysis/cktload.c +++ b/src/spicelib/analysis/cktload.c @@ -52,6 +52,7 @@ CKTload(CKTcircuit *ckt) size = SMPmatSize(ckt->CKTmatrix); for (i = 0; i <= size; i++) { ckt->CKTrhs[i] = 0; + ckt->CKTfvk[i] = 0; } SMPclear(ckt->CKTmatrix); #ifdef STEPDEBUG From 765af7836da2599ec96f8d4e3dc42d5b41115f33 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 14 Jan 2013 11:37:41 +0100 Subject: [PATCH 221/257] Added support for "new_kirchoff" for CAP, ISRC devices --- src/spicelib/devices/cap/capload.c | 3 +++ src/spicelib/devices/isrc/isrcload.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index d6796d5b2..2f5277647 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -77,6 +77,9 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) *(here->CAPnegPosptr) -= m * geq; *(ckt->CKTrhs+here->CAPposNode) -= m * ceq; *(ckt->CKTrhs+here->CAPnegNode) += m * ceq; + + *(ckt->CKTfvk+here->CAPposNode) += m * *(ckt->CKTstate0+here->CAPqcap+1) ; + *(ckt->CKTfvk+here->CAPnegNode) -= m * *(ckt->CKTstate0+here->CAPqcap+1) ; } else *(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap; } diff --git a/src/spicelib/devices/isrc/isrcload.c b/src/spicelib/devices/isrc/isrcload.c index fc34fca0d..5c1f2e257 100644 --- a/src/spicelib/devices/isrc/isrcload.c +++ b/src/spicelib/devices/isrc/isrcload.c @@ -386,6 +386,9 @@ loadDone: *(ckt->CKTrhs + (here->ISRCposNode)) += m * value; *(ckt->CKTrhs + (here->ISRCnegNode)) -= m * value; + *(ckt->CKTfvk + (here->ISRCposNode)) -= value; + *(ckt->CKTfvk + (here->ISRCnegNode)) += value; + /* gtri - end - wbk - modify to process srcFact, etc. for all sources */ #ifdef XSPICE From f3891e5af3816165d88f830fbc6e57486f63ba67 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 14 Jan 2013 11:37:41 +0100 Subject: [PATCH 222/257] Added support for "new_kirchoff" for IND, RES, VSRC devices --- src/spicelib/devices/ind/indload.c | 3 +++ src/spicelib/devices/res/resload.c | 13 ++++++++----- src/spicelib/devices/vsrc/vsrcload.c | 4 ++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/spicelib/devices/ind/indload.c b/src/spicelib/devices/ind/indload.c index 711953f89..878e68463 100644 --- a/src/spicelib/devices/ind/indload.c +++ b/src/spicelib/devices/ind/indload.c @@ -121,6 +121,9 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) *(here->INDibrPosptr) += 1; *(here->INDibrNegptr) -= 1; *(here->INDibrIbrptr) -= req; + + *(ckt->CKTfvk+here->INDposNode) += *(ckt->CKTrhsOld+here->INDbrEq) ; + *(ckt->CKTfvk+here->INDnegNode) -= *(ckt->CKTrhsOld+here->INDbrEq) ; } } return(OK); diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index 9b9506f87..84d39e404 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -29,11 +29,14 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) here->REScurrent = (*(ckt->CKTrhsOld+here->RESposNode) - *(ckt->CKTrhsOld+here->RESnegNode)) * here->RESconduct; - m = (here->RESm); - *(here->RESposPosptr) += m * here->RESconduct; - *(here->RESnegNegptr) += m * here->RESconduct; - *(here->RESposNegptr) -= m * here->RESconduct; - *(here->RESnegPosptr) -= m * here->RESconduct; + *(here->RESposPosptr) += m * here->RESconduct; + *(here->RESnegNegptr) += m * here->RESconduct; + *(here->RESposNegptr) -= m * here->RESconduct; + *(here->RESnegPosptr) -= m * here->RESconduct; + + *(ckt->CKTfvk+here->RESposNode) += here->REScurrent ; + *(ckt->CKTfvk+here->RESnegNode) -= here->REScurrent ; + } } return(OK); diff --git a/src/spicelib/devices/vsrc/vsrcload.c b/src/spicelib/devices/vsrc/vsrcload.c index 60ff58e9d..a3b7b6869 100644 --- a/src/spicelib/devices/vsrc/vsrcload.c +++ b/src/spicelib/devices/vsrc/vsrcload.c @@ -44,6 +44,10 @@ VSRCload(GENmodel *inModel, CKTcircuit *ckt) *(here->VSRCnegIbrptr) -= 1.0 ; *(here->VSRCibrPosptr) += 1.0 ; *(here->VSRCibrNegptr) -= 1.0 ; + + *(ckt->CKTfvk+here->VSRCposNode) += *(ckt->CKTrhsOld+here->VSRCbranch) ; + *(ckt->CKTfvk+here->VSRCnegNode) -= *(ckt->CKTrhsOld+here->VSRCbranch) ; + if( (ckt->CKTmode & (MODEDCOP | MODEDCTRANCURVE)) && here->VSRCdcGiven ) { /* load using DC value */ From fb306e5385cf389d8306f7ec7a5394a8cd64f9e2 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 14 Jan 2013 11:37:41 +0100 Subject: [PATCH 223/257] Reviewed IND, ISRC, RES and VSRC to work with the "new_kirchhoff" KCL verification --- src/include/ngspice/cktdefs.h | 4 --- src/maths/ni/niconv.c | 61 +++++++++++++---------------------- src/maths/ni/niiter.c | 13 -------- 3 files changed, 22 insertions(+), 56 deletions(-) diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 1e63aa708..c0a32582d 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -430,10 +430,6 @@ extern void NInzIter(CKTcircuit *, int, int); extern int NIpred(CKTcircuit *ckt); #endif -/* KCL Verification */ -extern int NIkclVerification (CKTcircuit *) ; -/********************/ - extern IFfrontEnd *SPfrontEnd; #endif diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index deb9c9016..a51b89fce 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -25,8 +25,22 @@ NIconvTest(CKTcircuit *ckt) double new; double tol; + /* KCL_verification */ + double maximum = 0 ; + node = ckt->CKTnodes; size = SMPmatSize(ckt->CKTmatrix); + + for (i = 1 ; i <= size ; i++) + { + if (node->type == SP_CURRENT) + { + if (maximum < fabs (ckt->CKTrhsOld [i])) + maximum = fabs (ckt->CKTrhsOld [i]) ; + } + node = node->next ; + } + #ifdef STEPDEBUG for (i=1;i<=size;i++) { new = ckt->CKTrhs [i] ; @@ -34,6 +48,8 @@ NIconvTest(CKTcircuit *ckt) printf("chk for convergence: %s new: %g old: %g\n",CKTnodName(ckt,i),new,old); } #endif /* STEPDEBUG */ + + node = ckt->CKTnodes ; for (i=1;i<=size;i++) { node = node->next; new = ckt->CKTrhs [i] ; @@ -50,6 +66,12 @@ NIconvTest(CKTcircuit *ckt) ckt->CKTtroubleElt = NULL; return(1); } + + /* KCL Verification */ +// printf ("Valore: %-.9g\tSoglia: %-.9g\n", fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]), (ckt->CKTreltol * maximum + ckt->CKTabstol)) ; +// if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + if (fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + return 1 ; } } @@ -62,42 +84,3 @@ NIconvTest(CKTcircuit *ckt) return(0); #endif /* NEWCONV */ } - - -/** - * Routine to Verify the KCL - */ - -int NIkclVerification (CKTcircuit *ckt) -{ - int i, size ; - double maximum = 0 ; - CKTnode *node ; - - size = SMPmatSize (ckt->CKTmatrix) ; - - node = ckt->CKTnodes ; - for (i = 1 ; i <= size ; i++) - { - if (node->type == SP_CURRENT) - { - if (maximum < fabs (ckt->CKTrhsOld [i])) - maximum = fabs (ckt->CKTrhsOld [i]) ; - } - node = node->next ; - } - - node = ckt->CKTnodes ; - for (i = 1 ; i <= size ; i++) - { - if (node->type == SP_VOLTAGE) - { - if ((ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) -// if ((ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) - return 1 ; - } - node = node->next ; - } - - return 0 ; -} diff --git a/src/maths/ni/niiter.c b/src/maths/ni/niiter.c index d540cae43..4d6c83e08 100644 --- a/src/maths/ni/niiter.c +++ b/src/maths/ni/niiter.c @@ -37,9 +37,6 @@ NIiter(CKTcircuit *ckt, int maxIter) CKTnode *node; /* current matrix entry */ double diff, maxdiff, damp_factor, *OldCKTstate0=NULL; - /* KCL_verified */ - int KCL_verified ; - if ( maxIter < 100 ) maxIter = 100; /* some convergence issues that get resolved by increasing max iter */ iterno=0; @@ -113,16 +110,6 @@ NIiter(CKTcircuit *ckt, int maxIter) ckt->CKTniState |= NISHOULDREORDER; } - /* KCL Verification */ - if ((ckt->CKTnoncon == 0) && (iterno != 1)) - { - KCL_verified = NIkclVerification (ckt) ; - if (KCL_verified) /* NOT VERIFIED */ - ckt->CKTnoncon = 1 ; - else - ckt->CKTnoncon = 0 ; - } - if(ckt->CKTniState & NISHOULDREORDER) { startTime = SPfrontEnd->IFseconds(); error = SMPreorder(ckt->CKTmatrix,ckt->CKTpivotAbsTol, From 521302fd007febf05567024f7ef5cd8febb33942 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 14 Jan 2013 17:56:23 +0100 Subject: [PATCH 224/257] Added support for "new_kirchhoff" for CCCS, CCVS, VCCS and VCVS devices --- src/spicelib/devices/cccs/cccsload.c | 3 +++ src/spicelib/devices/ccvs/ccvsload.c | 3 +++ src/spicelib/devices/vccs/vccsload.c | 5 +++++ src/spicelib/devices/vcvs/vcvsload.c | 3 +++ 4 files changed, 14 insertions(+) diff --git a/src/spicelib/devices/cccs/cccsload.c b/src/spicelib/devices/cccs/cccsload.c index fcf823c85..e019ee816 100644 --- a/src/spicelib/devices/cccs/cccsload.c +++ b/src/spicelib/devices/cccs/cccsload.c @@ -34,6 +34,9 @@ CCCSload(GENmodel *inModel, CKTcircuit *ckt) *(here->CCCSposContBrptr) += here->CCCScoeff ; *(here->CCCSnegContBrptr) -= here->CCCScoeff ; + + *(ckt->CKTfvk+here->CCCSposNode) += here->CCCScoeff * *(ckt->CKTrhsOld+here->CCCScontBranch) ; + *(ckt->CKTfvk+here->CCCSnegNode) -= here->CCCScoeff * *(ckt->CKTrhsOld+here->CCCScontBranch) ; } } return(OK); diff --git a/src/spicelib/devices/ccvs/ccvsload.c b/src/spicelib/devices/ccvs/ccvsload.c index 1c101f81b..ec36ea789 100644 --- a/src/spicelib/devices/ccvs/ccvsload.c +++ b/src/spicelib/devices/ccvs/ccvsload.c @@ -37,6 +37,9 @@ CCVSload(GENmodel *inModel, CKTcircuit *ckt) *(here->CCVSibrPosptr) += 1.0 ; *(here->CCVSibrNegptr) -= 1.0 ; *(here->CCVSibrContBrptr) -= here->CCVScoeff ; + + *(ckt->CKTfvk+here->CCVSposNode) += *(ckt->CKTrhsOld+here->CCVSbranch) ; + *(ckt->CKTfvk+here->CCVSnegNode) -= *(ckt->CKTrhsOld+here->CCVSbranch) ; } } return(OK); diff --git a/src/spicelib/devices/vccs/vccsload.c b/src/spicelib/devices/vccs/vccsload.c index a647d4f1a..6c45fd96c 100644 --- a/src/spicelib/devices/vccs/vccsload.c +++ b/src/spicelib/devices/vccs/vccsload.c @@ -35,6 +35,11 @@ VCCSload(GENmodel *inModel, CKTcircuit *ckt) *(here->VCCSposContNegptr) -= here->VCCScoeff ; *(here->VCCSnegContPosptr) -= here->VCCScoeff ; *(here->VCCSnegContNegptr) += here->VCCScoeff ; + + *(ckt->CKTfvk+here->VCCSposNode) += here->VCCScoeff * *(ckt->CKTrhsOld+here->VCCScontPosNode) ; + *(ckt->CKTfvk+here->VCCSposNode) -= here->VCCScoeff * *(ckt->CKTrhsOld+here->VCCScontNegNode) ; + *(ckt->CKTfvk+here->VCCSnegNode) -= here->VCCScoeff * *(ckt->CKTrhsOld+here->VCCScontPosNode) ; + *(ckt->CKTfvk+here->VCCSnegNode) += here->VCCScoeff * *(ckt->CKTrhsOld+here->VCCScontNegNode) ; } } return(OK); diff --git a/src/spicelib/devices/vcvs/vcvsload.c b/src/spicelib/devices/vcvs/vcvsload.c index 81a154b80..da5a1ec1b 100644 --- a/src/spicelib/devices/vcvs/vcvsload.c +++ b/src/spicelib/devices/vcvs/vcvsload.c @@ -37,6 +37,9 @@ VCVSload(GENmodel *inModel, CKTcircuit *ckt) *(here->VCVSibrNegptr) -= 1.0 ; *(here->VCVSibrContPosptr) -= here->VCVScoeff ; *(here->VCVSibrContNegptr) += here->VCVScoeff ; + + *(ckt->CKTfvk+here->VCVSposNode) += *(ckt->CKTrhsOld+here->VCVSbranch) ; + *(ckt->CKTfvk+here->VCVSnegNode) -= *(ckt->CKTrhsOld+here->VCVSbranch) ; } } return(OK); From 1f53d76a3715427ba2f4e78226b07b1c88bc946e Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Thu, 17 Jan 2013 00:02:54 +0100 Subject: [PATCH 225/257] Added MOS1 to the "new_kirchhoff" KCL verification --- src/spicelib/devices/mos1/mos1load.c | 40 +++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/spicelib/devices/mos1/mos1load.c b/src/spicelib/devices/mos1/mos1load.c index 78904c25a..a4f949e87 100644 --- a/src/spicelib/devices/mos1/mos1load.c +++ b/src/spicelib/devices/mos1/mos1load.c @@ -33,13 +33,13 @@ MOS1load(GENmodel *inModel, CKTcircuit *ckt) double cbhat; double cdhat; double cdrain; - double cdreq; + double cdreq, cdreq_fvk ; double ceq; - double ceqbd; - double ceqbs; - double ceqgb; - double ceqgd; - double ceqgs; + double ceqbd, ceqbd_fvk ; + double ceqbs, ceqbs_fvk ; + double ceqgb, ceqgb_fvk ; + double ceqgd, ceqgd_fvk ; + double ceqgs, ceqgs_fvk ; double delvbd; double delvbs; double delvds; @@ -847,10 +847,13 @@ next1: if(vbs <= -3*vt) { */ gcgs=0; ceqgs=0; + ceqgs_fvk = 0 ; gcgd=0; ceqgd=0; + ceqgd_fvk = 0 ; gcgb=0; ceqgb=0; + ceqgb_fvk = 0 ; } else { if(capgs == 0) *(ckt->CKTstate0 + here->MOS1cqgs) =0; if(capgd == 0) *(ckt->CKTstate0 + here->MOS1cqgd) =0; @@ -867,10 +870,13 @@ next1: if(vbs <= -3*vt) { if(error) return(error); ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS1qgs); + ceqgs_fvk = *(ckt->CKTstate0 + here->MOS1cqgs) ; ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS1qgd); + ceqgd_fvk = *(ckt->CKTstate0 + here->MOS1cqgd) ; ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS1qgb); + ceqgb_fvk = *(ckt->CKTstate0 + here->MOS1cqgb) ; } /* * store charge storage info for meyer's cap in lx table @@ -881,18 +887,22 @@ next1: if(vbs <= -3*vt) { */ ceqbs = model->MOS1type * (here->MOS1cbs-(here->MOS1gbs)*vbs); + ceqbs_fvk = model->MOS1type * here->MOS1cbs ; ceqbd = model->MOS1type * (here->MOS1cbd-(here->MOS1gbd)*vbd); + ceqbd_fvk = model->MOS1type * here->MOS1cbd ; if (here->MOS1mode >= 0) { xnrm=1; xrev=0; cdreq=model->MOS1type*(cdrain-here->MOS1gds*vds- here->MOS1gm*vgs-here->MOS1gmbs*vbs); + cdreq_fvk = model->MOS1type * cdrain ; } else { xnrm=0; xrev=1; cdreq = -(model->MOS1type)*(cdrain-here->MOS1gds*(-vds)- here->MOS1gm*vgd-here->MOS1gmbs*vbd); + cdreq_fvk = - model->MOS1type * cdrain ; } *(ckt->CKTrhs + here->MOS1gNode) -= (model->MOS1type * (ceqgs + ceqgb + ceqgd)); @@ -934,6 +944,24 @@ next1: if(vbs <= -3*vt) { *(here->MOS1SPbPtr) += (-here->MOS1gbs-(xnrm-xrev)*here->MOS1gmbs); *(here->MOS1SPdpPtr) += (-here->MOS1gds-xrev* (here->MOS1gm+here->MOS1gmbs)); + + + /* KCL verification - Linear-Dynamic Part */ + *(ckt->CKTfvk+here->MOS1gNode) += model->MOS1type * (ceqgs_fvk + ceqgb_fvk + ceqgd_fvk) ; + *(ckt->CKTfvk+here->MOS1bNode) += ceqbs_fvk + ceqbd_fvk - model->MOS1type * ceqgb_fvk ; + *(ckt->CKTfvk+here->MOS1dNodePrime) -= (ceqbd_fvk - cdreq_fvk + model->MOS1type * ceqgd_fvk) ; + *(ckt->CKTfvk+here->MOS1sNodePrime) -= (cdreq_fvk + ceqbs_fvk + model->MOS1type * ceqgs_fvk) ; + + + /* KCL verification - Linear-Static Part */ + *(ckt->CKTfvk+here->MOS1dNode) += here->MOS1drainConductance * *(ckt->CKTrhsOld+here->MOS1dNode) ; + *(ckt->CKTfvk+here->MOS1sNode) += here->MOS1sourceConductance * *(ckt->CKTrhsOld+here->MOS1sNode) ; + *(ckt->CKTfvk+here->MOS1dNodePrime) += here->MOS1drainConductance * *(ckt->CKTrhsOld+here->MOS1dNodePrime) ; + *(ckt->CKTfvk+here->MOS1sNodePrime) += here->MOS1sourceConductance * *(ckt->CKTrhsOld+here->MOS1sNodePrime) ; + *(ckt->CKTfvk+here->MOS1dNode) -= here->MOS1drainConductance * *(ckt->CKTrhsOld+here->MOS1dNodePrime) ; + *(ckt->CKTfvk+here->MOS1sNode) -= here->MOS1sourceConductance * *(ckt->CKTrhsOld+here->MOS1sNodePrime) ; + *(ckt->CKTfvk+here->MOS1dNodePrime) -= here->MOS1drainConductance * *(ckt->CKTrhsOld+here->MOS1dNode) ; + *(ckt->CKTfvk+here->MOS1sNodePrime) -= here->MOS1sourceConductance * *(ckt->CKTrhsOld+here->MOS1sNode) ; } } return(OK); From 083904d8473416c46f06a935a7117f156a451a67 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sat, 19 Jan 2013 00:22:57 +0100 Subject: [PATCH 226/257] Added BSIM2 to the "new_kirchhoff" KCL verification --- src/spicelib/devices/bsim2/b2ld.c | 42 +++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/spicelib/devices/bsim2/b2ld.c b/src/spicelib/devices/bsim2/b2ld.c index 1dca6b163..75ca9f5b0 100644 --- a/src/spicelib/devices/bsim2/b2ld.c +++ b/src/spicelib/devices/bsim2/b2ld.c @@ -40,13 +40,13 @@ B2load(GENmodel *inModel, CKTcircuit *ckt) double cd; double cdrain; double cdhat; - double cdreq; + double cdreq, cdreq_fvk ; double ceq; - double ceqbd; - double ceqbs; - double ceqqb; - double ceqqd; - double ceqqg; + double ceqbd, ceqbd_fvk ; + double ceqbs, ceqbs_fvk ; + double ceqqb, ceqqb_fvk ; + double ceqqd, ceqqd_fvk ; + double ceqqg, ceqqg_fvk ; double czbd; double czbdsw; double czbs; @@ -628,7 +628,7 @@ line755: line850: /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; + ceqqg = ceqqg_fvk = ceqqb = ceqqb_fvk = ceqqd = ceqqd_fvk = 0.0; gcdgb = gcddb = gcdsb = 0.0; gcsgb = gcsdb = gcssb = 0.0; gcggb = gcgdb = gcgsb = 0.0; @@ -641,8 +641,11 @@ line860: cqbulk = *(ckt->CKTstate0 + here->B2iqb); cqdrn = *(ckt->CKTstate0 + here->B2iqd); ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; + ceqqg_fvk = cqgate ; ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; + ceqqb_fvk = cqbulk ; ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; + ceqqd_fvk = cqdrn ; if(ckt->CKTmode & MODEINITTRAN ) { *(ckt->CKTstate1 + here->B2iqb) = @@ -661,19 +664,25 @@ line900: m = here->B2m; ceqbs = model->B2type * (cbs-(gbs-ckt->CKTgmin)*vbs); + ceqbs_fvk = model->B2type * (cbs + ckt->CKTgmin * vbs) ; ceqbd = model->B2type * (cbd-(gbd-ckt->CKTgmin)*vbd); - + ceqbd_fvk = model->B2type * (cbd + ckt->CKTgmin * vbd) ; ceqqg = model->B2type * ceqqg; + ceqqg_fvk = model->B2type * ceqqg_fvk ; ceqqb = model->B2type * ceqqb; + ceqqb_fvk = model->B2type * ceqqb_fvk ; ceqqd = model->B2type * ceqqd; + ceqqd_fvk = model->B2type * ceqqd_fvk ; if (here->B2mode >= 0) { xnrm=1; xrev=0; cdreq=model->B2type*(cdrain-gds*vds-gm*vgs-gmbs*vbs); + cdreq_fvk = model->B2type * cdrain ; } else { xnrm=0; xrev=1; cdreq = -(model->B2type)*(cdrain+gds*vds-gm*vgd-gmbs*vbd); + cdreq_fvk = - (model->B2type * cdrain) ; } *(ckt->CKTrhs + here->B2gNode) -= m * (ceqqg); @@ -713,6 +722,23 @@ line900: *(here->B2SPdpPtr) += m * (-gds-xrev*(gm+gmbs)+gcsdb); + /* KCL verification - Dynamic Part */ + *(ckt->CKTfvk + here->B2gNode) += m * ceqqg_fvk ; + *(ckt->CKTfvk + here->B2bNode) += m * (ceqbs_fvk + ceqbd_fvk + ceqqb_fvk) ; + *(ckt->CKTfvk + here->B2dNodePrime) -= m * (ceqbd_fvk - cdreq_fvk - ceqqd_fvk) ; + *(ckt->CKTfvk + here->B2sNodePrime) -= m * (cdreq_fvk + ceqbs_fvk + ceqqg_fvk + ceqqb_fvk + ceqqd_fvk) ; + + + /* KCL verification - Linear and Static Part */ + *(ckt->CKTfvk + here->B2dNode) += m * (here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNode) ; + *(ckt->CKTfvk + here->B2sNode) += m * (here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNode) ; + *(ckt->CKTfvk + here->B2dNodePrime) += m * (here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNodePrime) ; + *(ckt->CKTfvk + here->B2sNodePrime) += m * (here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNodePrime) ; + *(ckt->CKTfvk + here->B2dNode) += m * (-here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNodePrime) ; + *(ckt->CKTfvk + here->B2sNode) += m * (-here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNodePrime) ; + *(ckt->CKTfvk + here->B2dNodePrime) += m * (-here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNode) ; + *(ckt->CKTfvk + here->B2sNodePrime) += m * (-here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNode) ; + line1000: ; } /* End of Mosfet Instance */ From 2f8d8a59b30e996a9ff4d66a90fe060dc591b2c3 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sat, 19 Jan 2013 00:24:38 +0100 Subject: [PATCH 227/257] Added MOS6 to the "new_kirchhoff" KCL verification --- src/spicelib/devices/mos6/mos6load.c | 40 +++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/spicelib/devices/mos6/mos6load.c b/src/spicelib/devices/mos6/mos6load.c index 0f1eea531..ebbab1115 100644 --- a/src/spicelib/devices/mos6/mos6load.c +++ b/src/spicelib/devices/mos6/mos6load.c @@ -33,13 +33,13 @@ MOS6load(GENmodel *inModel, CKTcircuit *ckt) double cbhat; double cdhat; double cdrain; - double cdreq; + double cdreq, cdreq_fvk ; double ceq; - double ceqbd; - double ceqbs; - double ceqgb; - double ceqgd; - double ceqgs; + double ceqbd, ceqbd_fvk ; + double ceqbs, ceqbs_fvk ; + double ceqgb, ceqgb_fvk ; + double ceqgd, ceqgd_fvk ; + double ceqgs, ceqgs_fvk ; double delvbd; double delvbs; double delvds; @@ -860,10 +860,13 @@ bypass: */ gcgs=0; ceqgs=0; + ceqgs_fvk = 0 ; gcgd=0; ceqgd=0; + ceqgd_fvk = 0 ; gcgb=0; ceqgb=0; + ceqgb_fvk = 0 ; } else { if(capgs == 0) *(ckt->CKTstate0 + here->MOS6cqgs) =0; if(capgd == 0) *(ckt->CKTstate0 + here->MOS6cqgd) =0; @@ -880,10 +883,13 @@ bypass: if(error) return(error); ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS6qgs); + ceqgs_fvk = *(ckt->CKTstate0 + here->MOS6cqgs) ; ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS6qgd); + ceqgd_fvk = *(ckt->CKTstate0 + here->MOS6cqgd) ; ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS6qgb); + ceqgb_fvk = *(ckt->CKTstate0 + here->MOS6cqgb) ; } /* * store charge storage info for meyer's cap in lx table @@ -897,18 +903,22 @@ bypass: ceqbs = model->MOS6type * (here->MOS6cbs-(here->MOS6gbs)*vbs); + ceqbs_fvk = model->MOS6type * here->MOS6cbs ; ceqbd = model->MOS6type * (here->MOS6cbd-(here->MOS6gbd)*vbd); + ceqbd_fvk = model->MOS6type * here->MOS6cbd ; if (here->MOS6mode >= 0) { xnrm=1; xrev=0; cdreq=model->MOS6type*(cdrain-here->MOS6gds*vds- here->MOS6gm*vgs-here->MOS6gmbs*vbs); + cdreq_fvk = model->MOS6type * cdrain ; } else { xnrm=0; xrev=1; cdreq = -(model->MOS6type)*(cdrain-here->MOS6gds*(-vds)- here->MOS6gm*vgd-here->MOS6gmbs*vbd); + cdreq_fvk = - (model->MOS6type * cdrain) ; } *(ckt->CKTrhs + here->MOS6gNode) -= m * (model->MOS6type * (ceqgs + ceqgb + ceqgd)); @@ -950,6 +960,24 @@ bypass: *(here->MOS6SPbPtr) += m * (-here->MOS6gbs-(xnrm-xrev)*here->MOS6gmbs); *(here->MOS6SPdpPtr) += m * (-here->MOS6gds-xrev* (here->MOS6gm+here->MOS6gmbs)); + + + /* KCL verification - Dynamic Part */ + *(ckt->CKTfvk+here->MOS6gNode) += model->MOS6type * (ceqgs_fvk + ceqgb_fvk + ceqgd_fvk) ; + *(ckt->CKTfvk+here->MOS6bNode) += ceqbs_fvk + ceqbd_fvk - model->MOS6type * ceqgb_fvk ; + *(ckt->CKTfvk+here->MOS6dNodePrime) -= (ceqbd_fvk - cdreq_fvk + model->MOS6type * ceqgd_fvk) ; + *(ckt->CKTfvk+here->MOS6sNodePrime) -= (cdreq_fvk + ceqbs_fvk + model->MOS6type * ceqgs_fvk) ; + + + /* KCL verification - Linear and Static Part */ + *(ckt->CKTfvk+here->MOS6dNode) += here->MOS6drainConductance * *(ckt->CKTrhsOld+here->MOS6dNode) ; + *(ckt->CKTfvk+here->MOS6sNode) += here->MOS6sourceConductance * *(ckt->CKTrhsOld+here->MOS6sNode) ; + *(ckt->CKTfvk+here->MOS6dNodePrime) += here->MOS6drainConductance * *(ckt->CKTrhsOld+here->MOS6dNodePrime) ; + *(ckt->CKTfvk+here->MOS6sNodePrime) += here->MOS6sourceConductance * *(ckt->CKTrhsOld+here->MOS6sNodePrime) ; + *(ckt->CKTfvk+here->MOS6dNode) -= here->MOS6drainConductance * *(ckt->CKTrhsOld+here->MOS6dNodePrime) ; + *(ckt->CKTfvk+here->MOS6sNode) -= here->MOS6sourceConductance * *(ckt->CKTrhsOld+here->MOS6sNodePrime) ; + *(ckt->CKTfvk+here->MOS6dNodePrime) -= here->MOS6drainConductance * *(ckt->CKTrhsOld+here->MOS6dNode) ; + *(ckt->CKTfvk+here->MOS6sNodePrime) -= here->MOS6sourceConductance * *(ckt->CKTrhsOld+here->MOS6sNode) ; } } return(OK); From efe9f389b529c839f4d42623461ab92ebb98de74 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sat, 19 Jan 2013 00:31:24 +0100 Subject: [PATCH 228/257] Added BSIM3 to the "new_kirchhoff" KCL verification --- src/spicelib/devices/bsim3/b3ld.c | 117 ++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 24 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index 8d352d607..3c510d191 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -71,7 +71,8 @@ BSIM3instance *here; #endif double SourceSatCurrent, DrainSatCurrent; double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; -double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; +double cdrain, cdhat, cdreq, cdreq_fvk, ceqbd, ceqbd_fvk, ceqbs, ceqbs_fvk, ceqqb, ceqqd, ceqqg, ceq, geq; +double ceqqb_fvk, ceqqb_SnodePrime_fvk, ceqqd_fvk, ceqqd_SnodePrime_fvk, ceqqg_fvk, ceqqg_SnodePrime_fvk ; double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; double delvbd, delvbs, delvds, delvgd, delvgs; double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; @@ -153,7 +154,7 @@ double Leff, Weff, dWeff_dVg, dWeff_dVb; double AbulkCV, dAbulkCV_dVb; double qgdo, qgso, cgdo, cgso; -double qcheq=0.0, qdef, gqdef=0.0, cqdef, cqcheq, gtau_diff, gtau_drift; +double qcheq=0.0, qdef, gqdef=0.0, cqdef, cqdef_fvk, cqcheq, cqcheq_fvk, 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; @@ -2793,7 +2794,8 @@ line755: } } - cqdef = cqcheq = 0.0; + cqdef = cqdef_fvk = cqcheq = cqcheq_fvk = 0.0; + if (ByPass) goto line860; *(ckt->CKTstate0 + here->BSIM3qg) = qgate; @@ -2852,8 +2854,8 @@ line755: line850: /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - cqcheq = cqdef = 0.0; + ceqqg = ceqqg_fvk = ceqqg_SnodePrime_fvk = ceqqb = ceqqb_fvk = ceqqb_SnodePrime_fvk = ceqqd = ceqqd_fvk = ceqqd_SnodePrime_fvk = 0.0; + cqcheq = cqcheq_fvk = cqdef = cqdef_fvk = 0.0; gcdgb = gcddb = gcdsb = 0.0; gcsgb = gcsdb = gcssb = 0.0; @@ -2883,8 +2885,14 @@ line860: cqdrn = *(ckt->CKTstate0 + here->BSIM3cqd); ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; + ceqqg_fvk = cqgate ; + ceqqg_SnodePrime_fvk = ceqqg ; ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; + ceqqb_fvk = cqbulk ; + ceqqb_SnodePrime_fvk = ceqqb ; ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; + ceqqd_fvk = cqdrn ; + ceqqd_SnodePrime_fvk = ceqqd ; if (here->BSIM3nqsMod) { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; @@ -2893,8 +2901,10 @@ line860: ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd * vbd - ddxpart_dVs * vbs); cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef; + cqdef_fvk = *(ckt->CKTstate0 + here->BSIM3cqcdump) ; cqcheq = *(ckt->CKTstate0 + here->BSIM3cqcheq) - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; + cqcheq_fvk = *(ckt->CKTstate0 + here->BSIM3cqcheq) ; } if (ckt->CKTmode & MODEINITTRAN) @@ -2924,12 +2934,13 @@ line900: FwdSum = Gm + Gmbs; RevSum = 0.0; cdreq = model->BSIM3type * (cdrain - here->BSIM3gds * vds - - Gm * vgs - Gmbs * vbs); - - ceqbd = -model->BSIM3type * (here->BSIM3csub - - here->BSIM3gbds * vds - here->BSIM3gbgs * vgs - - here->BSIM3gbbs * vbs); - ceqbs = 0.0; + - Gm * vgs - Gmbs * vbs); + cdreq_fvk = model->BSIM3type * cdrain ; + ceqbd = -model->BSIM3type * (here->BSIM3csub + - here->BSIM3gbds * vds - here->BSIM3gbgs * vgs + - here->BSIM3gbbs * vbs); + ceqbd_fvk = - (model->BSIM3type * here->BSIM3csub) ; + ceqbs = ceqbs_fvk = 0.0; gbbdp = -here->BSIM3gbds; gbbsp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); @@ -2951,11 +2962,12 @@ line900: RevSum = -(Gm + Gmbs); cdreq = -model->BSIM3type * (cdrain + here->BSIM3gds * vds + Gm * vgd + Gmbs * vbd); - - ceqbs = -model->BSIM3type * (here->BSIM3csub - + here->BSIM3gbds * vds - here->BSIM3gbgs * vgd - - here->BSIM3gbbs * vbd); - ceqbd = 0.0; + cdreq_fvk = - (model->BSIM3type * cdrain) ; + ceqbs = -model->BSIM3type * (here->BSIM3csub + + here->BSIM3gbds * vds - here->BSIM3gbgs * vgd + - here->BSIM3gbbs * vbd); + ceqbs_fvk = - (model->BSIM3type * here->BSIM3csub) ; + ceqbd = ceqbd_fvk = 0.0; gbbsp = -here->BSIM3gbds; gbbdp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); @@ -2971,26 +2983,38 @@ line900: gbspdp = -(gbspg + gbspsp + gbspb); } - if (model->BSIM3type > 0) - { ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); + if (model->BSIM3type > 0) + { ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); + ceqbs_fvk += here->BSIM3cbs ; ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd); - /* + ceqbd_fvk += here->BSIM3cbd ; + /* ceqqg = ceqqg; ceqqb = ceqqb; ceqqd = ceqqd; cqdef = cqdef; cqcheq = cqcheq; - */ - } - else - { ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); + */ + } + else + { ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); + ceqbs_fvk -= here->BSIM3cbs ; ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd); + ceqbd_fvk -= here->BSIM3cbd ; ceqqg = -ceqqg; + ceqqg_fvk = - ceqqg_fvk ; + ceqqg_SnodePrime_fvk = - ceqqg_SnodePrime_fvk ; ceqqb = -ceqqb; + ceqqb_fvk = - ceqqb_fvk ; + ceqqb_SnodePrime_fvk = - ceqqb_SnodePrime_fvk ; ceqqd = -ceqqd; + ceqqd_fvk = - ceqqd_fvk ; + ceqqd_SnodePrime_fvk = - ceqqd_SnodePrime_fvk ; cqdef = -cqdef; + cqdef_fvk = - cqdef_fvk ; cqcheq = -cqcheq; - } + cqcheq_fvk = - cqcheq_fvk ; + } m = here->BSIM3m; #ifdef USE_OMP @@ -3117,6 +3141,51 @@ line900: *(here->BSIM3QspPtr) += m * (ggts - gcqsb); *(here->BSIM3QbPtr) += m * (ggtb - gcqbb); } + + + /* KCL verification - Dynamic Part */ + *(ckt->CKTfvk+here->BSIM3gNode) += m * ceqqg_fvk ; + *(ckt->CKTfvk+here->BSIM3bNode) += m * (ceqbs_fvk + ceqbd_fvk + ceqqb_fvk) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * (ceqbd_fvk - cdreq_fvk - ceqqd_fvk) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (cdreq_fvk + ceqbs_fvk + ceqqg_SnodePrime_fvk + ceqqb_SnodePrime_fvk + ceqqd_SnodePrime_fvk) ; + if (here->BSIM3nqsMod) + *(ckt->CKTfvk+here->BSIM3qNode) -= m * (cqcheq_fvk - cqdef_fvk) ; + + + /* KCL verification - Linear and Static Part */ + *(ckt->CKTfvk+here->BSIM3dNode) += m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNode) ; + *(ckt->CKTfvk+here->BSIM3sNode) += m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNode) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) += m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) += m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + *(ckt->CKTfvk+here->BSIM3dNode) -= m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + *(ckt->CKTfvk+here->BSIM3sNode) -= m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNode) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNode) ; + + if (here->BSIM3nqsMod) //DA RIVEDERE + { + *(here->BSIM3QqPtr) += m * (gqdef + here->BSIM3gtau); + *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); + *(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau); + *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; + } + + + /* KCL verification - Linear and Dynamic Part ??? */ + *(ckt->CKTfvk+here->BSIM3gNode) -= m * ggtg * *(ckt->CKTrhsOld+here->BSIM3gNode) ; + *(ckt->CKTfvk+here->BSIM3gNode) -= m * ggtb * *(ckt->CKTrhsOld+here->BSIM3bNode) ; + *(ckt->CKTfvk+here->BSIM3gNode) -= m * ggtd * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + *(ckt->CKTfvk+here->BSIM3gNode) -= m * ggts * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + + *(ckt->CKTfvk+here->BSIM3dNodePrime) += m * (dxpart * ggtd + T1 * ddxpart_dVd) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) += m * (dxpart * ggtg + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * (- dxpart * ggtb - T1 * ddxpart_dVb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * (- dxpart * ggts - T1 * ddxpart_dVs) * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + + *(ckt->CKTfvk+here->BSIM3sNodePrime) += m * (gcssb + sxpart * ggts + T1 * dsxpart_dVs) * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) += m * (gcsgb + sxpart * ggtg + T1 * dsxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (gcsgb + gcsdb + gcssb - sxpart * ggtb - T1 * dsxpart_dVb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (- gcsdb - sxpart * ggtd - T1 * dsxpart_dVd) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; #endif line1000: ; #ifndef USE_OMP From 30126ce7fd19227895cb302ac86ffa54998cdc12 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 4 Feb 2013 19:59:30 +0100 Subject: [PATCH 229/257] Added examples for the KCL verification --- examples/kirchhoff/2_gidlgisl_n.net | 22 ++++ examples/kirchhoff/2_gidlgisl_p.net | 22 ++++ examples/kirchhoff/2_gidlgisl_p_shift.net | 22 ++++ examples/kirchhoff/45nm_MGK_car2_gidlgisl.pm | 120 +++++++++++++++++++ 4 files changed, 186 insertions(+) create mode 100644 examples/kirchhoff/2_gidlgisl_n.net create mode 100644 examples/kirchhoff/2_gidlgisl_p.net create mode 100644 examples/kirchhoff/2_gidlgisl_p_shift.net create mode 100644 examples/kirchhoff/45nm_MGK_car2_gidlgisl.pm diff --git a/examples/kirchhoff/2_gidlgisl_n.net b/examples/kirchhoff/2_gidlgisl_n.net new file mode 100644 index 000000000..bd1dc2271 --- /dev/null +++ b/examples/kirchhoff/2_gidlgisl_n.net @@ -0,0 +1,22 @@ +DBj_gidl_n + +.INCLUDE 45nm_MGK_car2_gidlgisl.pm +.OPTIONS GMIN=1e-18 abstol=1e-19 + +*Definizione dei parametri +.PARAM Lmin=45n +.PARAM Wmin=45n +.PARAM Ldiff=90n + +*Descrizione della cella +Mp drain gate source body nmos W={Wmin} L={Lmin} AS={Wmin*Ldiff} AD={Wmin*Ldiff} PS={2*(Ldiff+Wmin)} PD={2*(Ldiff+Wmin)} +Vd drain alim 0V +Vg gate 0 0V +Vs source alim 0V +Vb body 0 0V +Vdd alim 0 0.05V + +*Definizione del tipo di analisi +.dc Vdd 0.0 1.2 0.1 +.print all +.END diff --git a/examples/kirchhoff/2_gidlgisl_p.net b/examples/kirchhoff/2_gidlgisl_p.net new file mode 100644 index 000000000..dd6019cfb --- /dev/null +++ b/examples/kirchhoff/2_gidlgisl_p.net @@ -0,0 +1,22 @@ +DBj_gidl_p + +.INCLUDE 45nm_MGK_car2_gidlgisl.pm +.OPTIONS GMIN=1e-18 abstol=1e-24 vntol=1e-24 + +*Definizione dei parametri +.PARAM Lmin=45n +.PARAM Wmin=45n +.PARAM Ldiff=90n + +*Descrizione della cella +Mp drain gate source body pmos W={Wmin} L={Lmin} AS={Wmin*Ldiff} AD={Wmin*Ldiff} PS={2*(Ldiff+Wmin)} PD={2*(Ldiff+Wmin)} +Vd drain 0 0V +Vg gate alim 0V +Vs source 0 0V +Vb body alim 0V +Vdd alim 0 0.05V + +*Definizione del tipo di analisi +.dc Vdd 0.0 1.2 0.1 +.print all +.END diff --git a/examples/kirchhoff/2_gidlgisl_p_shift.net b/examples/kirchhoff/2_gidlgisl_p_shift.net new file mode 100644 index 000000000..4d17ca53f --- /dev/null +++ b/examples/kirchhoff/2_gidlgisl_p_shift.net @@ -0,0 +1,22 @@ +DBj_gidl_p + +.INCLUDE 45nm_MGK_car2_gidlgisl.pm +.OPTIONS GMIN=1e-18 abstol=1e-19 + +*Definizione dei parametri +.PARAM Lmin=45n +.PARAM Wmin=45n +.PARAM Ldiff=90n + +*Descrizione della cella +Mp drain gate source body pmos W={Wmin} L={Lmin} AS={Wmin*Ldiff} AD={Wmin*Ldiff} PS={2*(Ldiff+Wmin)} PD={2*(Ldiff+Wmin)} +Vd drain 0 -1V +Vg gate alim 0V +Vs source 0 -1V +Vb body alim 0V +Vdd alim 0 -1.05V + +*Definizione del tipo di analisi +.dc Vdd 0.0 1.2 0.1 +.print all +.END diff --git a/examples/kirchhoff/45nm_MGK_car2_gidlgisl.pm b/examples/kirchhoff/45nm_MGK_car2_gidlgisl.pm new file mode 100644 index 000000000..2ed9cbcc8 --- /dev/null +++ b/examples/kirchhoff/45nm_MGK_car2_gidlgisl.pm @@ -0,0 +1,120 @@ +.model nmos nmos level=54 ++version = 4.7.0 binunit = 1 paramchk= 1 mobmod = 0 ++capmod = 2 igcmod = 0 igbmod = 0 geomod = 1 ++diomod = 1 rdsmod = 0 rbodymod= 1 rgatemod= 1 ++permod = 1 acnqsmod= 0 trnqsmod= 0 ++tnom = 27 toxe = 9e-010 toxp = 6.5e-010 toxm = 9e-010 ++dtox = 2.5e-010 epsrox = 3.9 wint = 5e-009 lint = 2.7e-009 ++ll = 0 wl = 0 lln = 1 wln = 1 ++lw = 0 ww = 0 lwn = 1 wwn = 1 ++lwl = 0 wwl = 0 xpart = 0 toxref = 9e-010 xl = -20e-9 ++dlcig = 2.7e-009 ++vth0 = 0.3423 k1 = 0.2 k2 = 0 k3 = 0 ++k3b = 0 w0 = 2.5e-006 dvt0 = 1 dvt1 = 2 ++dvt2 = 0 dvt0w = 0 dvt1w = 0 dvt2w = 0 ++dsub = 0.078 minv = 0.05 voffl = 0 dvtp0 = 1e-010 ++dvtp1 = 0.1 lpe0 = 0 lpeb = 0 xj = 1.4e-008 ++ngate = 1e+023 ndep = 6.5e+018 nsd = 2e+020 phin = 0 ++cdsc = 0 cdscb = 0 cdscd = 0 cit = 0 ++voff = -0.13 nfactor = 1.9 eta0 = 0.0055 etab = 0 ++vfb = -1.058 u0 = 0.02947 ua = -5e-010 ub = 1.7e-018 ++uc = 0 vsat = 159550 a0 = 1 ags = 0 ++a1 = 0 a2 = 1 b0 = 0 b1 = 0 ++keta = 0.04 dwg = 0 dwb = 0 pclm = 0.06 ++pdiblc1 = 0.001 pdiblc2 = 0.001 pdiblcb = -0.005 drout = 0.5 ++pvag = 1e-020 delta = 0.01 pscbe1 = 2.0e+009 pscbe2 = 1e-007 ++fprout = 0.2 pdits = 0.01 pditsd = 0.23 pditsl = 2300000 ++rsh = 5 rdsw = 105 rsw = 52.5 rdw = 52.5 ++rdswmin = 0 rdwmin = 0 rswmin = 0 prwg = 0 ++prwb = 0 wr = 1 alpha0 = 0.0 alpha1 = 0.00 ++beta0 = 30 agidl = 0.0002 bgidl = 2.1e+009 cgidl = 0.0002 ++egidl = 0.8 aigbacc = 0.012 bigbacc = 0.0028 cigbacc = 0.002 ++nigbacc = 1 aigbinv = 0.014 bigbinv = 0.004 cigbinv = 0.004 ++eigbinv = 1.1 nigbinv = 3 aigc = 0.018029 bigc = 0.0029 ++cigc = 0.002 aigsd = 0.018029 bigsd = 0.0029 cigsd = 0.002 ++nigc = 1 poxedge = 1 pigcd = 1 ntox = 1 ++xrcrg1 = 12 xrcrg2 = 5 ++cgso = 1e-010 cgdo = 1e-010 cgbo = 0 cgdl = 7.5e-013 ++cgsl = 7.5e-013 clc = 1e-007 cle = 0.6 cf = 1.1e-010 ++ckappas = 0.6 ckappad = 0.6 vfbcv = -1 acde = 1 ++moin = 15 noff = 1 voffcv = 0 ++kt1 = -0.154 kt1l = 0 kt2 = 0.022 ute = -1.1 ++ua1 = 1e-009 ub1 = -1e-018 uc1 = -5.6e-011 prt = 0 ++at = 33000 ++fnoimod = 1 tnoimod = 0 noia = 6.25e+041 noib = 3.125e+026 ++noic = 8.75e+009 em = 41000000 af = 1 ef = 1 ++kf = 0 tnoia = 1.5 tnoib = 3.5 ntnoi = 1 ++jss = 0.0 jsws = 0.0 jswgs = 0.0 njs = 1 ++ijthsfwd= 0.1 ijthsrev= 0.1 bvs = 10 xjbvs = 1 ++jsd = 0.0 jswd = 0.0 jswgd = 0.0 xjbvd = 1 ++pbs = 1 cjs = 0.0018 mjs = 0.5 pbsws = 1 ++cjsws = 1.2e-010 mjsws = 0.33 cjswgs = 2.1e-010 cjd = 0.0018 ++cjswd = 1.2e-010 mjswd = 0.33 pbswgd = 1 cjswgd = 2.1e-010 ++mjswgd = 0.33 tpb = 0 tcj = 0 tpbsw = 0 ++tcjsw = 0 tpbswg = 0 tcjswg = 0 xtis = 3 ++dmcg = 0 dmci = 0 dmdg = 0 dmcgt = 0 ++dwj = 0 xgw = 0 xgl = 0 ++rshg = 0.4 gbmin = 1e-010 rbpb = 5 rbpd = 15 ++rbps = 15 rbdb = 15 rbsb = 15 ngcon = 1 + + + +.model pmos pmos level = 54 ++version = 4.7.0 binunit = 1 paramchk= 1 mobmod = 0 ++capmod = 2 igcmod = 0 igbmod = 0 geomod = 1 ++diomod = 1 rdsmod = 0 rbodymod= 1 rgatemod= 1 ++permod = 1 acnqsmod= 0 trnqsmod= 0 ++tnom = 27 toxe = 9.2e-010 toxp = 6.5e-010 toxm = 9.2e-010 ++dtox = 2.7e-010 epsrox = 3.9 wint = 5e-009 lint = 2.7e-009 ++ll = 0 wl = 0 lln = 1 wln = 1 ++lw = 0 ww = 0 lwn = 1 wwn = 1 ++lwl = 0 wwl = 0 xpart = 0 toxref = 9.2e-010 xl = -20e-9 ++dlcig = 2.7e-009 ++vth0 = -0.23122 k1 = 0.2 k2 = -0.01 k3 = 0 ++k3b = 0 w0 = 2.5e-006 dvt0 = 1 dvt1 = 2 ++dvt2 = -0.032 dvt0w = 0 dvt1w = 0 dvt2w = 0 ++dsub = 0.1 minv = 0.05 voffl = 0 dvtp0 = 1e-011 ++dvtp1 = 0.05 lpe0 = 0 lpeb = 0 xj = 1.4e-008 ++ngate = 1e+023 ndep = 2.8e+018 nsd = 2e+020 phin = 0 ++cdsc = 0 cdscb = 0 cdscd = 0 cit = 0 ++voff = -0.13 nfactor = 1.9 eta0 = 0.0049 etab = 0 ++vfb = -1.058 u0 = 0.00391 ua = -5e-010 ub = 1.6e-018 ++uc = 0 vsat = 78000 a0 = 1 ags = 1e-020 ++a1 = 0 a2 = 1 b0 = 0 b1 = 0 ++keta = -0.047 dwg = 0 dwb = 0 pclm = 0.1 ++pdiblc1 = 0.001 pdiblc2 = 0.001 pdiblcb = 3.4e-008 drout = 0.6 ++pvag = 1e-020 delta = 0.01 pscbe1 = 2e+009 pscbe2 = 9.58e-007 ++fprout = 0.2 pdits = 0.08 pditsd = 0.23 pditsl = 2300000 ++rsh = 5 rdsw = 105 rsw = 52.5 rdw = 52.5 ++rdswmin = 0 rdwmin = 0 rswmin = 0 prwg = 0 ++prwb = 0 wr = 1 alpha0 = 0.0 alpha1 = 0.00 ++beta0 = 30 agidl = 0.0002 bgidl = 2.1e+009 cgidl = 0.0002 ++egidl = 0.8 aigbacc = 0.012 bigbacc = 0.0028 cigbacc = 0.002 ++nigbacc = 1 aigbinv = 0.014 bigbinv = 0.004 cigbinv = 0.004 ++eigbinv = 1.1 nigbinv = 3 aigc = 0.010687 bigc = 0.0012607 ++cigc = 0.0008 aigsd = 0.010687 bigsd = 0.0012607 cigsd = 0.0008 ++nigc = 1 poxedge = 1 pigcd = 1 ntox = 1 ++xrcrg1 = 12 xrcrg2 = 5 ++cgso = 1e-010 cgdo = 1e-010 cgbo = 0 cgdl = 3e-011 ++cgsl = 3e-011 clc = 1e-007 cle = 0.6 cf = 1.1e-010 ++ckappas = 0.6 ckappad = 0.6 vfbcv = -1 acde = 1 ++moin = 15 noff = 1 voffcv = 0 ++kt1 = -0.14 kt1l = 0 kt2 = 0.022 ute = -1.1 ++ua1 = 1e-009 ub1 = -1e-018 uc1 = -5.6e-011 prt = 0 ++at = 33000 ++fnoimod = 1 tnoimod = 0 noia = 6.25e+041 noib = 3.125e+026 ++noic = 8.75e+009 em = 41000000 af = 1 ef = 1 ++kf = 0 tnoia = 1.5 tnoib = 3.5 ntnoi = 1 ++jss = 0.0 jsws = 0.0 jswgs = 0.0 njs = 1 ++ijthsfwd= 0.1 ijthsrev= 0.1 bvs = 10 xjbvs = 1 ++jsd = 0.0 jswd = 0.0 jswgd = 0.0 xjbvd = 1 ++pbs = 1 cjs = 0.0015 mjs = 0.5 pbsws = 1 ++cjsws = 9.4e-011 mjsws = 0.33 cjswgs = 2e-010 cjd = 0.0015 ++cjswd = 9.4e-011 mjswd = 0.33 pbswgd = 1 cjswgd = 2e-010 ++mjswgd = 0.33 tpb = 0 tcj = 0 tpbsw = 0 ++tcjsw = 0 tpbswg = 0 tcjswg = 0 xtis = 3 ++dmcg = 0 dmdg = 0 dmcgt = 0 xgw = 0 ++xgl = 0 ++rshg = 0.1 gbmin = 1e-012 rbpb = 50 rbpd = 50 ++rbps = 50 rbdb = 50 rbsb = 50 ngcon = 1 + From c74e0d703a57da69e0779516ab8dbff54e1647e9 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Fri, 8 Feb 2013 19:42:53 +0100 Subject: [PATCH 230/257] Added a preliminary version of the BSIM4v7 model for the KCL verification --- src/spicelib/devices/bsim4/b4ld.c | 408 ++++++++++++++++++++++++++---- 1 file changed, 352 insertions(+), 56 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index 73b1a6909..69e7dfad8 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -114,7 +114,7 @@ double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; double delvges, delvgms, vgmb; double gcgmgmb=0.0, gcgmdb=0.0, gcgmsb=0.0, gcdgmb, gcsgmb; -double gcgmbb=0.0, gcbgmb, qgmb, qgmid=0.0, ceqqgmid; +double gcgmbb=0.0, gcbgmb, qgmb, qgmid=0.0, ceqqgmid, ceqqgmid_fvk ; double vbd, vbs, vds, vgb, vgd, vgs, vgdo; #ifndef PREDICTOR @@ -126,8 +126,9 @@ double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct; double SourceSatCurrent, DrainSatCurrent; double ag0, qgb, von, cbhat, VgstNVt, ExpVgst; -double ceqqb, ceqqd, ceqqg, ceqqjd=0.0, ceqqjs=0.0, ceq, geq; -double cdrain, cdhat, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs; +double ceqqb, ceqqb_fvk, ceqqd, ceqqd_fvk, ceqqg, ceqqg_fvk, ceqqjd=0.0, ceqqjd_fvk = 0.0, ceqqjs=0.0, ceqqjs_fvk = 0.0, ceq, geq; +double ceqqb_SnodePrime_fvk = 0.0, ceqqd_SnodePrime_fvk = 0.0, ceqqg_SnodePrime_fvk = 0.0, ceqqjd_SnodePrime_fvk = 0.0, ceqqjs_SnodePrime_fvk = 0.0 ; +double cdrain, cdhat, ceqdrn, ceqdrn_fvk, ceqbd, ceqbd_fvk, ceqbs, ceqbs_fvk, ceqjd, ceqjd_fvk, ceqjs, ceqjs_fvk, gjbd, gjbs; double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; double delvbd, delvbs, delvds, delvgd, delvgs; double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; @@ -148,10 +149,10 @@ double Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; double Igbacc, dIgbacc_dVg, dIgbacc_dVb; double Igbinv, dIgbinv_dVg, dIgbinv_dVd, dIgbinv_dVb; double Pigcd, dPigcd_dVg, dPigcd_dVd, dPigcd_dVb; -double Istoteq, gIstotg, gIstotd, gIstots, gIstotb; -double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb; -double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb; -double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb; +double Istoteq, Istoteq_fvk, gIstotg, gIstotd, gIstots, gIstotb; +double Idtoteq, Idtoteq_fvk, gIdtotg, gIdtotd, gIdtots, gIdtotb; +double Ibtoteq, Ibtoteq_fvk, gIbtotg, gIbtotd, gIbtots, gIbtotb; +double Igtoteq, Igtoteq_fvk, gIgtotg, gIgtotd, gIgtots, gIgtotb; double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; double Vgs_eff, Vfb=0.0, Vth_NarrowW; /* double Vgd_eff, dVgd_eff_dVg; v4.7.0 */ @@ -216,7 +217,7 @@ double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; double Vgst2Vtm, VdsatCV; double Leff, Weff, dWeff_dVg, dWeff_dVb; double AbulkCV, dAbulkCV_dVb; -double qcheq, qdef, gqdef=0.0, cqdef=0.0, cqcheq=0.0; +double qcheq, qdef, gqdef=0.0, cqdef=0.0, cqdef_fvk = 0.0, cqcheq=0.0, cqcheq_fvk = 0.0 ; 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; @@ -4573,9 +4574,9 @@ line755: line850: /* Zero gcap and ceqcap if (!ChargeComputationNeeded) */ - ceqqg = ceqqb = ceqqd = 0.0; - ceqqjd = ceqqjs = 0.0; - cqcheq = cqdef = 0.0; + ceqqg = ceqqg_fvk = ceqqb = ceqqb_fvk = ceqqd = ceqqd_fvk = 0.0; + ceqqjd = ceqqjd_fvk = ceqqjs = ceqqjs_fvk = 0.0; + cqcheq = cqcheq_fvk = cqdef = cqdef_fvk = 0.0; gcdgb = gcddb = gcdsb = gcdbb = 0.0; gcsgb = gcsdb = gcssb = gcsbb = 0.0; @@ -4583,7 +4584,7 @@ line850: gcbdb = gcbgb = gcbsb = gcbbb = 0.0; gcgmgmb = gcgmdb = gcgmsb = gcgmbb = 0.0; - gcdgmb = gcsgmb = gcbgmb = ceqqgmid = 0.0; + gcdgmb = gcsgmb = gcbgmb = ceqqgmid = ceqqgmid_fvk = 0.0; gcdbdb = gcsbsb = 0.0; gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; @@ -4612,21 +4613,33 @@ line860: cqdrn = *(ckt->CKTstate0 + here->BSIM4cqd); ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; + ceqqg_fvk = cqgate ; + ceqqg_SnodePrime_fvk = ceqqg ; ceqqd = cqdrn - gcdgb * vgb - gcdgmb * vgmb + (gcddb + gcdbdb) * vbd - gcdbdb * vbd_jct + gcdsb * vbs; + ceqqd_fvk = cqdrn ; + ceqqd_SnodePrime_fvk = ceqqd ; ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb + gcbdb * vbd + gcbsb * vbs; - + ceqqb_fvk = cqbody - gcbgmb * vgmb ; + ceqqb_SnodePrime_fvk = ceqqb ; if (here->BSIM4rgateMod == 3) + { ceqqgmid = *(ckt->CKTstate0 + here->BSIM4cqgmid) + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb; - else - ceqqgmid = 0.0; + ceqqgmid_fvk = *(ckt->CKTstate0 + here->BSIM4cqgmid) ; + } else { + ceqqgmid = ceqqgmid_fvk = 0.0; + } if (here->BSIM4rbodyMod) { ceqqjs = *(ckt->CKTstate0 + here->BSIM4cqbs) + gcsbsb * vbs_jct; - ceqqjd = *(ckt->CKTstate0 + here->BSIM4cqbd) + gcdbdb * vbd_jct; + ceqqjs_fvk = *(ckt->CKTstate0 + here->BSIM4cqbs) ; + ceqqjs_SnodePrime_fvk = ceqqjs ; + ceqqjd = *(ckt->CKTstate0 + here->BSIM4cqbd) + gcdbdb * vbd_jct; + ceqqjd_fvk = *(ckt->CKTstate0 + here->BSIM4cqbd) ; + ceqqjd_SnodePrime_fvk = ceqqjd ; } if (here->BSIM4trnqsMod) @@ -4636,8 +4649,10 @@ line860: ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd * vbd - ddxpart_dVs * vbs); cqdef = *(ckt->CKTstate0 + here->BSIM4cqcdump) - gqdef * qdef; + cqdef_fvk = *(ckt->CKTstate0 + here->BSIM4cqcdump) ; cqcheq = *(ckt->CKTstate0 + here->BSIM4cqcheq) - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; + cqcheq_fvk = *(ckt->CKTstate0 + here->BSIM4cqcheq) ; } if (ckt->CKTmode & MODEINITTRAN) @@ -4674,13 +4689,15 @@ line900: ceqdrn = model->BSIM4type * (cdrain - here->BSIM4gds * vds - Gm * vgs - Gmbs * vbs); + ceqdrn_fvk = model->BSIM4type * cdrain ; ceqbd = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igidl - (here->BSIM4gbds + here->BSIM4ggidld) * vds - (here->BSIM4gbgs + here->BSIM4ggidlg) * vgs - (here->BSIM4gbbs + here->BSIM4ggidlb) * vbs); + ceqbd_fvk = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igidl) ; ceqbs = model->BSIM4type * (here->BSIM4Igisl + here->BSIM4ggisls * vds - here->BSIM4ggislg * vgd - here->BSIM4ggislb * vbd); - + ceqbs_fvk = model->BSIM4type * here->BSIM4Igisl ; gbbdp = -(here->BSIM4gbds); gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; @@ -4699,10 +4716,10 @@ line900: gIstotd = here->BSIM4gIgcsd; gIstots = here->BSIM4gIgss + here->BSIM4gIgcss; gIstotb = here->BSIM4gIgcsb; - Istoteq = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcs + Istoteq = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcs - gIstotg * vgs - here->BSIM4gIgcsd * vds - - here->BSIM4gIgcsb * vbs); - + - here->BSIM4gIgcsb * vbs); + Istoteq_fvk = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcs) ; gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcdg; gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcdd; gIdtots = here->BSIM4gIgcds; @@ -4710,10 +4727,11 @@ line900: Idtoteq = model->BSIM4type * (here->BSIM4Igd + here->BSIM4Igcd - here->BSIM4gIgdg * vgd - here->BSIM4gIgcdg * vgs - here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbs); + Idtoteq_fvk = model->BSIM4type * (here->BSIM4Igd + here->BSIM4Igcd) ; } else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; + { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = Istoteq_fvk = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = Idtoteq_fvk = 0.0; } if (model->BSIM4igbMod) @@ -4724,19 +4742,21 @@ line900: Ibtoteq = model->BSIM4type * (here->BSIM4Igb - here->BSIM4gIgbg * vgs - here->BSIM4gIgbd * vds - here->BSIM4gIgbb * vbs); + Ibtoteq_fvk = model->BSIM4type * here->BSIM4Igb ; } else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; + gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = Ibtoteq_fvk = 0.0; if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) { gIgtotg = gIstotg + gIdtotg + gIbtotg; gIgtotd = gIstotd + gIdtotd + gIbtotd ; gIgtots = gIstots + gIdtots + gIbtots; gIgtotb = gIstotb + gIdtotb + gIbtotb; - Igtoteq = Istoteq + Idtoteq + Ibtoteq; + Igtoteq = Istoteq + Idtoteq + Ibtoteq; + Igtoteq_fvk = Istoteq_fvk + Idtoteq_fvk + Ibtoteq_fvk ; } else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; + gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = Igtoteq_fvk = 0.0; if (here->BSIM4rgateMod == 2) @@ -4764,14 +4784,15 @@ line900: ceqdrn = -model->BSIM4type * (cdrain + here->BSIM4gds * vds + Gm * vgd + Gmbs * vbd); - + ceqdrn_fvk = -model->BSIM4type * cdrain ; ceqbs = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igisl + (here->BSIM4gbds + here->BSIM4ggisls) * vds - (here->BSIM4gbgs + here->BSIM4ggislg) * vgd - (here->BSIM4gbbs + here->BSIM4ggislb) * vbd); + ceqbs_fvk = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igisl) ; ceqbd = model->BSIM4type * (here->BSIM4Igidl - here->BSIM4ggidld * vds - here->BSIM4ggidlg * vgs - here->BSIM4ggidlb * vbs); - + ceqbd_fvk = model->BSIM4type * here->BSIM4Igidl ; gbbsp = -(here->BSIM4gbds); gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs; @@ -4791,20 +4812,21 @@ line900: gIstots = here->BSIM4gIgss + here->BSIM4gIgcdd; gIstotb = here->BSIM4gIgcdb; Istoteq = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcd - - here->BSIM4gIgsg * vgs - here->BSIM4gIgcdg * vgd - + here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbd); - + - here->BSIM4gIgsg * vgs - here->BSIM4gIgcdg * vgd + + here->BSIM4gIgcdd * vds - here->BSIM4gIgcdb * vbd); + Istoteq_fvk = model->BSIM4type * (here->BSIM4Igs + here->BSIM4Igcd) ; gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcsg; gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcss; gIdtots = here->BSIM4gIgcsd; gIdtotb = here->BSIM4gIgcsb; Idtoteq = model->BSIM4type * (here->BSIM4Igd + here->BSIM4Igcs - - (here->BSIM4gIgdg + here->BSIM4gIgcsg) * vgd - + here->BSIM4gIgcsd * vds - here->BSIM4gIgcsb * vbd); + - (here->BSIM4gIgdg + here->BSIM4gIgcsg) * vgd + + here->BSIM4gIgcsd * vds - here->BSIM4gIgcsb * vbd); + Idtoteq_fvk = model->BSIM4type * (here->BSIM4Igd + here->BSIM4Igcs) ; } else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; + { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = Istoteq_fvk = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = Idtoteq_fvk = 0.0; } if (model->BSIM4igbMod) @@ -4813,11 +4835,12 @@ line900: gIbtots = here->BSIM4gIgbd; gIbtotb = here->BSIM4gIgbb; Ibtoteq = model->BSIM4type * (here->BSIM4Igb - - here->BSIM4gIgbg * vgd + here->BSIM4gIgbd * vds - - here->BSIM4gIgbb * vbd); + - here->BSIM4gIgbg * vgd + here->BSIM4gIgbd * vds + - here->BSIM4gIgbb * vbd); + Ibtoteq_fvk = model->BSIM4type * here->BSIM4Igb ; } else - gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0; + gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = Ibtoteq_fvk = 0.0; if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0)) { gIgtotg = gIstotg + gIdtotg + gIbtotg; @@ -4825,9 +4848,10 @@ line900: gIgtots = gIstots + gIdtots + gIbtots; gIgtotb = gIstotb + gIdtotb + gIbtotb; Igtoteq = Istoteq + Idtoteq + Ibtoteq; + Igtoteq_fvk = Istoteq_fvk + Idtoteq_fvk + Ibtoteq_fvk ; } else - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; + gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = Igtoteq_fvk = 0.0; if (here->BSIM4rgateMod == 2) @@ -4874,28 +4898,42 @@ line900: if (model->BSIM4type > 0) { ceqjs = (here->BSIM4cbs - here->BSIM4gbs * vbs_jct); + ceqjs_fvk = here->BSIM4cbs ; ceqjd = (here->BSIM4cbd - here->BSIM4gbd * vbd_jct); + ceqjd_fvk = here->BSIM4cbd ; } else - { ceqjs = -(here->BSIM4cbs - here->BSIM4gbs * vbs_jct); + { ceqjs = -(here->BSIM4cbs - here->BSIM4gbs * vbs_jct); + ceqjs_fvk = -here->BSIM4cbs ; ceqjd = -(here->BSIM4cbd - here->BSIM4gbd * vbd_jct); + ceqjd_fvk = -here->BSIM4cbd ; ceqqg = -ceqqg; + ceqqg_fvk = -ceqqg_fvk ; ceqqd = -ceqqd; + ceqqd_fvk = -ceqqd_fvk ; ceqqb = -ceqqb; + ceqqb_fvk = -ceqqb_fvk ; ceqgcrg = -ceqgcrg; if (here->BSIM4trnqsMod) { cqdef = -cqdef; + cqdef_fvk = -cqdef_fvk ; cqcheq = -cqcheq; + cqcheq_fvk = -cqcheq_fvk ; } if (here->BSIM4rbodyMod) { ceqqjs = -ceqqjs; + ceqqjs_fvk = -ceqqjs_fvk ; ceqqjd = -ceqqjd; + ceqqjd_fvk = -ceqqjd_fvk ; } if (here->BSIM4rgateMod == 3) + { ceqqgmid = -ceqqgmid; + ceqqgmid_fvk = -ceqqgmid_fvk ; + } } @@ -4937,37 +4975,35 @@ line900: if (here->BSIM4trnqsMod) here->BSIM4rhsq = m * (cqcheq - cqdef); #else - (*(ckt->CKTrhs + here->BSIM4dNodePrime) += m * (ceqjd - ceqbd + ceqgdtot - - ceqdrn - ceqqd + Idtoteq)); - (*(ckt->CKTrhs + here->BSIM4gNodePrime) -= m * (ceqqg - ceqgcrg + Igtoteq)); + (*(ckt->CKTrhs + here->BSIM4dNodePrime) += m * (ceqjd - ceqbd + ceqgdtot - ceqdrn - ceqqd + Idtoteq)); /* NO ceqgdtot in FVK */ + + (*(ckt->CKTrhs + here->BSIM4gNodePrime) -= m * (ceqqg - ceqgcrg + Igtoteq)); /* NO ceqgcrg in FVK */ if (here->BSIM4rgateMod == 2) - (*(ckt->CKTrhs + here->BSIM4gNodeExt) -= m * ceqgcrg); + (*(ckt->CKTrhs + here->BSIM4gNodeExt) -= m * ceqgcrg); /* NO ceqgcrg in FVK */ else if (here->BSIM4rgateMod == 3) - (*(ckt->CKTrhs + here->BSIM4gNodeMid) -= m * (ceqqgmid + ceqgcrg)); + (*(ckt->CKTrhs + here->BSIM4gNodeMid) -= m * (ceqqgmid + ceqgcrg)); /* NO ceqgcrg in FVK */ if (!here->BSIM4rbodyMod) - { (*(ckt->CKTrhs + here->BSIM4bNodePrime) += m * (ceqbd + ceqbs - ceqjd - - ceqjs - ceqqb + Ibtoteq)); - (*(ckt->CKTrhs + here->BSIM4sNodePrime) += m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); + { (*(ckt->CKTrhs + here->BSIM4bNodePrime) += m * (ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq)); + (*(ckt->CKTrhs + here->BSIM4sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); /* NO ceqgstot in FVK */ } - else { (*(ckt->CKTrhs + here->BSIM4dbNode) -= m * (ceqjd + ceqqjd)); (*(ckt->CKTrhs + here->BSIM4bNodePrime) += m * (ceqbd + ceqbs - ceqqb + Ibtoteq)); (*(ckt->CKTrhs + here->BSIM4sbNode) -= m * (ceqjs + ceqqjs)); - (*(ckt->CKTrhs + here->BSIM4sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); + (*(ckt->CKTrhs + here->BSIM4sNodePrime) += m * (ceqdrn - ceqbs + ceqjs + ceqqd + + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); /* NO ceqgstot in FVK */ } if (model->BSIM4rdsMod) - { (*(ckt->CKTrhs + here->BSIM4dNode) -= m * ceqgdtot); - (*(ckt->CKTrhs + here->BSIM4sNode) += m * ceqgstot); + { (*(ckt->CKTrhs + here->BSIM4dNode) -= m * ceqgdtot); /* NO ceqgdtot in FVK */ + (*(ckt->CKTrhs + here->BSIM4sNode) += m * ceqgstot); /* NO ceqgstot in FVK */ } if (here->BSIM4trnqsMod) - *(ckt->CKTrhs + here->BSIM4qNode) += m * (cqcheq - cqdef); + (*(ckt->CKTrhs + here->BSIM4qNode) += m * (cqcheq - cqdef)); #endif /* @@ -5167,7 +5203,7 @@ line900: (*(here->BSIM4GEbpPtr) += m * gcrgb); (*(here->BSIM4GPgePtr) -= m * gcrg); - (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); + (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); @@ -5309,8 +5345,268 @@ line900: (*(here->BSIM4SPqPtr) += m * sxpart * here->BSIM4gtau); (*(here->BSIM4GPqPtr) -= m * here->BSIM4gtau); } -#endif +/////////////////////////////////////////// + + /* KCL verification - Linear and Dynamic Part */ + *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (T1 * ddxpart_dVd + dxpart * ggtd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode) ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (dxpart * ggtg + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (- dxpart * ggts - T1 * ddxpart_dVs) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (- T1 * ddxpart_dVb - dxpart * ggtb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; + + *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (- gcsdb - T1 * dsxpart_dVd - sxpart * ggtd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (gcsgb + sxpart * ggtg + T1 * dsxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (T1 * dsxpart_dVs + gstot + gcssb + sxpart * ggts) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * gstot * *(ckt->CKTrhsOld+here->BSIM4sNode) ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (gjbs - gcsbb - sxpart * ggtb - T1 * dsxpart_dVb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + + *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (- gjbd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; + *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (- gjbs) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; + *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gjbd + gjbs - gcbgmb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + + if (here->BSIM4rgateMod == 1) + { + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (- ggtg + gIgtotg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (- ggtd + gIgtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (- ggts + gIgtots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (- ggtb + gIgtotb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + } + + if (!here->BSIM4rbodyMod) + { + } else { + *(ckt->CKTfvk+here->BSIM4dbNode) += m * (ceqjd_fvk + ceqqjd_fvk) ; + + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; + + *(ckt->CKTfvk+here->BSIM4sbNode) += m * (ceqjs_fvk + ceqqjs_fvk) ; + + *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqd_SnodePrime_fvk + ceqqg_SnodePrime_fvk + ceqqb_SnodePrime_fvk + ceqqjd_SnodePrime_fvk + ceqqjs_SnodePrime_fvk + ceqqgmid_fvk + Istoteq_fvk) ; + } + + + /* KCL verification - Linear and Static Part */ + if (here->BSIM4rgateMod == 1) + { + *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ; + *(ckt->CKTfvk+here->BSIM4gNodeExt) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; + } + + *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * gdpr * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * gdpr * *(ckt->CKTrhsOld+here->BSIM4dNode) ; + + *(ckt->CKTfvk+here->BSIM4dNode) -= m * gdpr * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; + *(ckt->CKTfvk+here->BSIM4dNode) += m * gdpr * *(ckt->CKTrhsOld+here->BSIM4dNode) ; + + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * gspr * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * gspr * *(ckt->CKTrhsOld+here->BSIM4sNode) ; + + *(ckt->CKTfvk+here->BSIM4sNode) -= m * gspr * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; + *(ckt->CKTfvk+here->BSIM4sNode) += m * gspr * *(ckt->CKTrhsOld+here->BSIM4sNode) ; + + if (here->BSIM4rbodyMod) + { + *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (- gcsbsb) * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; + + *(ckt->CKTfvk+here->BSIM4dbNode) += m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; + *(ckt->CKTfvk+here->BSIM4dbNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4bNode) ; + *(ckt->CKTfvk+here->BSIM4dbNode) += m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; + *(ckt->CKTfvk+here->BSIM4dbNode) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld+here->BSIM4bNode) ; + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; + *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (here->BSIM4grbpd + here->BSIM4grbps + here->BSIM4grbpb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + + *(ckt->CKTfvk+here->BSIM4sbNode) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + *(ckt->CKTfvk+here->BSIM4sbNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4bNode) ; + *(ckt->CKTfvk+here->BSIM4sbNode) += m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; + *(ckt->CKTfvk+here->BSIM4sbNode) += m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; + + *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; + *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; + *(ckt->CKTfvk+here->BSIM4bNode) += m * (here->BSIM4grbsb + here->BSIM4grbdb + here->BSIM4grbpb) * *(ckt->CKTrhsOld+here->BSIM4bNode) ; + } + + +////////////////////////////////////////////// + + + //A*V-B +// if (here->BSIM4rgateMod == 1) +// { +// *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ; +// *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ;// +// *(ckt->CKTfvk+here->BSIM4gNodeExt) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; +// *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (gcggb - ggtg + gIgtotg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (gcgdb - ggtd + gIgtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (gcgsb - ggts + gIgtots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (gcgbb - ggtb + gIgtotb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// +// } +/* else if (here->BSIM4rgateMod == 2) + { (*(here->BSIM4GEgePtr) += m * gcrg); + (*(here->BSIM4GEgpPtr) += m * gcrgg); + (*(here->BSIM4GEdpPtr) += m * gcrgd); + (*(here->BSIM4GEspPtr) += m * gcrgs); + (*(here->BSIM4GEbpPtr) += m * gcrgb); + + (*(here->BSIM4GPgePtr) -= m * gcrg); + (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); + (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); + (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); + (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); + } + else if (here->BSIM4rgateMod == 3) + { (*(here->BSIM4GEgePtr) += m * geltd); + (*(here->BSIM4GEgmPtr) -= m * geltd); + (*(here->BSIM4GMgePtr) -= m * geltd); + (*(here->BSIM4GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); + + (*(here->BSIM4GMdpPtr) += m * (gcrgd + gcgmdb)); + (*(here->BSIM4GMgpPtr) += m * gcrgg); + (*(here->BSIM4GMspPtr) += m * (gcrgs + gcgmsb)); + (*(here->BSIM4GMbpPtr) += m * (gcrgb + gcgmbb)); + + (*(here->BSIM4DPgmPtr) += m * gcdgmb); + (*(here->BSIM4GPgmPtr) -= m * gcrg); + (*(here->BSIM4SPgmPtr) += m * gcsgmb); + (*(here->BSIM4BPgmPtr) += m * gcbgmb); + + (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); + (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); + (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); + (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); + } + else + { (*(here->BSIM4GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); + (*(here->BSIM4GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); + (*(here->BSIM4GPspPtr) += m * (gcgsb - ggts + gIgtots)); + (*(here->BSIM4GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); + } + + if (model->BSIM4rdsMod) + { (*(here->BSIM4DgpPtr) += m * gdtotg); + (*(here->BSIM4DspPtr) += m * gdtots); + (*(here->BSIM4DbpPtr) += m * gdtotb); + (*(here->BSIM4SdpPtr) += m * gstotd); + (*(here->BSIM4SgpPtr) += m * gstotg); + (*(here->BSIM4SbpPtr) += m * gstotb); + } +*/ +// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (here->BSIM4gds + here->BSIM4gbd + T1 * ddxpart_dVd - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode) ;// +// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg + dxpart * ggtg + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (here->BSIM4gds + gdtots - dxpart * ggts + gIdtots - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - T1 * ddxpart_dVb - dxpart * ggtb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// + +// *(ckt->CKTfvk+here->BSIM4dNode) -= m * (gdpr - gdtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; +// *(ckt->CKTfvk+here->BSIM4dNode) += m * (gdpr + gdtot) * *(ckt->CKTrhsOld+here->BSIM4dNode) ; + +// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (here->BSIM4gds + gstotd + RevSum - gcsdb - gbspdp - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg + T1 * dsxpart_dVg - gIstotg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (here->BSIM4gds + here->BSIM4gbs + T1 * dsxpart_dVs - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * gstot * *(ckt->CKTrhsOld+here->BSIM4sNode) ;// +// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - T1 * dsxpart_dVb + gIstotb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// + +// *(ckt->CKTfvk+here->BSIM4sNode) -= m * (gspr - gstots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; +// *(ckt->CKTfvk+here->BSIM4sNode) += m * (gspr + gstot) * *(ckt->CKTrhsOld+here->BSIM4sNode) ; + +// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gcbdb - gjbd + gbbdp - gIbtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gcbgb - here->BSIM4gbgs - gIbtotg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gcbsb - gjbs + gbbsp - gIbtots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gjbd + gjbs + gcbbb - here->BSIM4gbbs - gIbtotb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// + + + /* stamp gidl */ +// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * ggidld * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * ggidlg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ggidlg + ggidld + ggidlb) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * ggidlb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// + +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggidld * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggidlg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (ggidlg + ggidld + ggidlb) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggidlb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// + + /* stamp gisl */ +// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ggisls + ggislg + ggislb) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ggislg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ggisls * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ggislb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// + +// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (ggislg + ggisls + ggislb) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggislg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggisls * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggislb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// + + +// if (here->BSIM4rbodyMod) +// { +// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (gcdbdb - here->BSIM4gbd) * *(ckt->CKTrhsOld+here->BSIM4dbNode) ;// + +// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (here->BSIM4gbs - gcsbsb) * *(ckt->CKTrhsOld+here->BSIM4sbNode) ;// + +// *(ckt->CKTfvk+here->BSIM4dbNode) += m * (gcdbdb - here->BSIM4gbd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4dbNode) += m * (here->BSIM4gbd - gcdbdb + here->BSIM4grbpd) * *(ckt->CKTrhsOld+here->BSIM4dbNode) ;// +// *(ckt->CKTfvk+here->BSIM4dbNode) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4dbNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4bNode) ;// + +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4dbNode) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld+here->BSIM4bNode) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4sbNode) ;// +// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (here->BSIM4grbpd + here->BSIM4grbps) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// + +// *(ckt->CKTfvk+here->BSIM4sbNode) += m * (gcsbsb - here->BSIM4gbs) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4sbNode) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// +// *(ckt->CKTfvk+here->BSIM4sbNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4bNode) ;// +// *(ckt->CKTfvk+here->BSIM4sbNode) += m * (here->BSIM4gbs - gcsbsb) * *(ckt->CKTrhsOld+here->BSIM4sbNode) ;// + +// *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; +// *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; +// *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; +// *(ckt->CKTfvk+here->BSIM4bNode) += m * (here->BSIM4grbsb + here->BSIM4grbdb + here->BSIM4grbpb) * *(ckt->CKTrhsOld+here->BSIM4bNode) ; +// } + + +// *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (ceqjd - ceqbd + ceqgdtot - ceqdrn - ceqqd + Idtoteq) ;// + +// *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (ceqqg - ceqgcrg + Igtoteq) ;// + + if (here->BSIM4rgateMod == 2) + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * ceqgcrg ; + else if (here->BSIM4rgateMod == 3) + *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (ceqqgmid + ceqgcrg) ; + + if (!here->BSIM4rbodyMod) + { + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq) ; + } + else + { +// *(ckt->CKTfvk + here->BSIM4dbNode) += m * (ceqjd + ceqqjd) ;// +// *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqqb + Ibtoteq) ;// +// *(ckt->CKTfvk + here->BSIM4sbNode) += m * (ceqjs + ceqqjs) ;// +// *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + ceqqd + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq) ;// + } + + if (model->BSIM4rdsMod) + { + *(ckt->CKTfvk + here->BSIM4dNode) += m * ceqgdtot ; + *(ckt->CKTfvk + here->BSIM4sNode) -= m * ceqgstot ; + } + + if (here->BSIM4trnqsMod) + *(ckt->CKTfvk + here->BSIM4qNode) -= m * (cqcheq - cqdef) ; + +#endif line1000: ; #ifndef USE_OMP From a707256456d0cdd39b22f86041fe9a2fa53f07d3 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 19 Mar 2013 14:24:20 +0100 Subject: [PATCH 231/257] Speeded up the KCL Verification Method, performing the KCL Check only after that the Voltage Check result is good --- src/maths/ni/niconv.c | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index a51b89fce..2dbc9d0ca 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -25,21 +25,7 @@ NIconvTest(CKTcircuit *ckt) double new; double tol; - /* KCL_verification */ - double maximum = 0 ; - - node = ckt->CKTnodes; - size = SMPmatSize(ckt->CKTmatrix); - - for (i = 1 ; i <= size ; i++) - { - if (node->type == SP_CURRENT) - { - if (maximum < fabs (ckt->CKTrhsOld [i])) - maximum = fabs (ckt->CKTrhsOld [i]) ; - } - node = node->next ; - } + size = SMPmatSize (ckt->CKTmatrix) ; #ifdef STEPDEBUG for (i=1;i<=size;i++) { @@ -66,9 +52,30 @@ NIconvTest(CKTcircuit *ckt) ckt->CKTtroubleElt = NULL; return(1); } + } + } - /* KCL Verification */ -// printf ("Valore: %-.9g\tSoglia: %-.9g\n", fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]), (ckt->CKTreltol * maximum + ckt->CKTabstol)) ; + /* KCL Verification */ + double maximum = 0 ; + + node = ckt->CKTnodes ; + for (i = 1 ; i <= size ; i++) + { + node = node->next ; + if (node->type == SP_CURRENT) + { + if (maximum < fabs (ckt->CKTrhsOld [i])) + maximum = fabs (ckt->CKTrhsOld [i]) ; + } + } + + node = ckt->CKTnodes ; + for (i = 1 ; i <= size ; i++) + { + node = node->next ; + if (node->type == SP_VOLTAGE) + { +// printf ("Valore: %-.9g\tSoglia: %-.9g\n", fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]), (ckt->CKTreltol * maximum + ckt->CKTabstol)) ; // if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) if (fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) return 1 ; From 4ffa4c73c4c85bbc99c075f7c98b83145a96269a Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sat, 20 Apr 2013 00:25:12 +0200 Subject: [PATCH 232/257] Updated some bsim3 tests to run with the BSIM3 model instead of the BSIMv32 model --- tests/bsim3/dc_sim/modelcard.nmos | 8 +------- tests/bsim3/dc_sim/modelcard.pmos | 6 +----- tests/bsim3/tran_sim/comparator.cir | 5 ++--- tests/bsim3/tran_sim/one-shot.cir | 13 ++----------- 4 files changed, 6 insertions(+), 26 deletions(-) diff --git a/tests/bsim3/dc_sim/modelcard.nmos b/tests/bsim3/dc_sim/modelcard.nmos index e09340b3a..31d9349cb 100644 --- a/tests/bsim3/dc_sim/modelcard.nmos +++ b/tests/bsim3/dc_sim/modelcard.nmos @@ -2,7 +2,7 @@ *Berkeley Spice Compatibility * Lmin= .35 Lmax= 20 Wmin= .6 Wmax= 20 .model N1 NMOS -+Level= 8 version=3.2.2 ++Level= 8 version=3.3.0 +Tnom=27.0 +Nch= 2.498E+17 Tox=9E-09 Xj=1.00000E-07 +Lint=9.36e-8 Wint=1.47e-7 @@ -33,9 +33,3 @@ +Ute=-1.48 +Ua1= 3.31E-10 Ub1= 2.61E-19 Uc1= -3.42e-10 +Kt1l=0 Prt=764.3 - - - - - - diff --git a/tests/bsim3/dc_sim/modelcard.pmos b/tests/bsim3/dc_sim/modelcard.pmos index dfd8522d0..28dac9eea 100644 --- a/tests/bsim3/dc_sim/modelcard.pmos +++ b/tests/bsim3/dc_sim/modelcard.pmos @@ -1,5 +1,5 @@ .model P1 PMOS -+Level= 8 version=3.2.2 ++Level= 8 version=3.3.0 +Tnom=27.0 +Nch= 3.533024E+17 Tox=9E-09 Xj=1.00000E-07 +Lint=6.23e-8 Wint=1.22e-7 @@ -25,7 +25,3 @@ +Ute= -1.5 +Ua1= 4.312e-9 Ub1= 6.65e-19 Uc1= 0 +Kt1l=0 - - - - diff --git a/tests/bsim3/tran_sim/comparator.cir b/tests/bsim3/tran_sim/comparator.cir index 8e44a171b..d9c17228d 100644 --- a/tests/bsim3/tran_sim/comparator.cir +++ b/tests/bsim3/tran_sim/comparator.cir @@ -28,8 +28,8 @@ Vdd Vdd 0 5 Va A 0 pulse 0 5 10ns .1ns .1ns 15ns 30ns Vb B 0 0 -.model nmos nmos level=8 version=3.2.2 -.model pmos pmos level=8 version=3.2.2 +.model nmos nmos level=8 version=3.3.0 +.model pmos pmos level=8 version=3.3.0 * transient analysis .tran 1ns 60ns @@ -37,4 +37,3 @@ Vb B 0 0 .print tran a b v(9) v(8) .END - diff --git a/tests/bsim3/tran_sim/one-shot.cir b/tests/bsim3/tran_sim/one-shot.cir index 4e75736bb..c5ff697ca 100644 --- a/tests/bsim3/tran_sim/one-shot.cir +++ b/tests/bsim3/tran_sim/one-shot.cir @@ -34,20 +34,11 @@ M13 3 Lnot 0 0 NMOS w=1.8u l=1.2u Vcc vdd 0 5 vin in 0 pulse 0 5 1ns .1ns .1ns .8ns 5ns -.model nmos nmos level=8 version=3.2.2 -.model pmos pmos level=8 version=3.2.2 +.model nmos nmos level=8 version=3.3.0 +.model pmos pmos level=8 version=3.3.0 .tran 1ns 10ns .print tran in out .options noacct .END - - - - - - - - - From 1068d8889af620a0d7bc51f17fc0139a72d91ff3 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sat, 20 Apr 2013 00:26:02 +0200 Subject: [PATCH 233/257] Updated the BSIM3 model with a commented out Matrix-Vector multiplication as reference for the KCL Verification --- src/spicelib/devices/bsim3/b3ld.c | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index 3c510d191..9ba09c4d1 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -3142,6 +3142,45 @@ line900: *(here->BSIM3QbPtr) += m * (ggtb - gcqbb); } +/////////////////////////////////////////////////////////////////////////////////// +/* + *(ckt->CKTfvk + here->BSIM3gNode) += m * ceqqg ; + *(ckt->CKTfvk + here->BSIM3bNode) += m * (ceqbs + ceqbd + ceqqb) ; + *(ckt->CKTfvk + here->BSIM3dNodePrime) -= m * (ceqbd - cdreq - ceqqd) ; + *(ckt->CKTfvk + here->BSIM3sNodePrime) -= m * (cdreq + ceqbs + ceqqg + ceqqb + ceqqd) ; + + + *(ckt->CKTfvk+here->BSIM3dNode) += m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNode) ; + *(ckt->CKTfvk+here->BSIM3gNode) += m * (gcggb - ggtg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ; + *(ckt->CKTfvk+here->BSIM3sNode) += m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNode) ; + *(ckt->CKTfvk+here->BSIM3bNode) += m * (here->BSIM3gbd + here->BSIM3gbs + - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs) * *(ckt->CKTrhsOld+here->BSIM3bNode) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) += m * (here->BSIM3drainConductance + here->BSIM3gds + here->BSIM3gbd + RevSum + gcddb + + dxpart * ggtd + T1 * ddxpart_dVd + gbdpdp) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) += m * (here->BSIM3sourceConductance + here->BSIM3gds + here->BSIM3gbs + FwdSum + gcssb + + sxpart * ggts + T1 * dsxpart_dVs + gbspsp) * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + *(ckt->CKTfvk+here->BSIM3dNode) -= m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + *(ckt->CKTfvk+here->BSIM3gNode) -= m * (gcggb + gcgdb + gcgsb + ggtb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ; + *(ckt->CKTfvk+here->BSIM3gNode) += m * (gcgdb - ggtd) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + *(ckt->CKTfvk+here->BSIM3gNode) += m * (gcgsb - ggts) * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + *(ckt->CKTfvk+here->BSIM3sNode) -= m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + *(ckt->CKTfvk+here->BSIM3bNode) += m * (gcbgb - here->BSIM3gbgs) * *(ckt->CKTrhsOld+here->BSIM3gNode) ; + *(ckt->CKTfvk+here->BSIM3bNode) += m * (gcbdb - here->BSIM3gbd + gbbdp) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + *(ckt->CKTfvk+here->BSIM3bNode) += m * (gcbsb - here->BSIM3gbs + gbbsp) * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * here->BSIM3drainConductance * *(ckt->CKTrhsOld+here->BSIM3dNode) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) += m * (Gm + gcdgb + dxpart * ggtg + T1 * ddxpart_dVg + gbdpg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb + gcdsb - dxpart * ggtb + - T1 * ddxpart_dVb - gbdpb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ; + *(ckt->CKTfvk+here->BSIM3dNodePrime) -= m * (here->BSIM3gds + FwdSum - gcdsb - dxpart * ggts + - T1 * ddxpart_dVs - gbdpsp) * *(ckt->CKTrhsOld+here->BSIM3sNodePrime) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) += m * (gcsgb - Gm + sxpart * ggtg + T1 * dsxpart_dVg + gbspg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * here->BSIM3sourceConductance * *(ckt->CKTrhsOld+here->BSIM3sNode) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb + gcssb - sxpart * ggtb + - T1 * dsxpart_dVb - gbspb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ; + *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (here->BSIM3gds + RevSum - gcsdb - sxpart * ggtd + - T1 * dsxpart_dVd - gbspdp) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; +*/ + /* KCL verification - Dynamic Part */ *(ckt->CKTfvk+here->BSIM3gNode) += m * ceqqg_fvk ; @@ -3186,6 +3225,7 @@ line900: *(ckt->CKTfvk+here->BSIM3sNodePrime) += m * (gcsgb + sxpart * ggtg + T1 * dsxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ; *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (gcsgb + gcsdb + gcssb - sxpart * ggtb - T1 * dsxpart_dVb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ; *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (- gcsdb - sxpart * ggtd - T1 * dsxpart_dVd) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; + #endif line1000: ; #ifndef USE_OMP From b90adc11f145d9ecffa3047ae8d07df4a478484c Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 14 May 2013 20:52:15 +0200 Subject: [PATCH 234/257] KCL Formulation Reworked BSIM4 Fvk Reworked (this is not the final formulation) --- src/maths/ni/niconv.c | 8 +- src/spicelib/devices/bsim4/b4ld.c | 350 ++++++++++++++++-------------- 2 files changed, 196 insertions(+), 162 deletions(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 2dbc9d0ca..04b086693 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -64,8 +64,8 @@ NIconvTest(CKTcircuit *ckt) node = node->next ; if (node->type == SP_CURRENT) { - if (maximum < fabs (ckt->CKTrhsOld [i])) - maximum = fabs (ckt->CKTrhsOld [i]) ; + if (maximum < fabs (ckt->CKTrhs [i])) + maximum = fabs (ckt->CKTrhs [i]) ; } } @@ -75,9 +75,7 @@ NIconvTest(CKTcircuit *ckt) node = node->next ; if (node->type == SP_VOLTAGE) { -// printf ("Valore: %-.9g\tSoglia: %-.9g\n", fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]), (ckt->CKTreltol * maximum + ckt->CKTabstol)) ; -// if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) - if (fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + if (fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhs [i]) > maximum) return 1 ; } } diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index 69e7dfad8..3ad034160 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -5349,7 +5349,7 @@ line900: /////////////////////////////////////////// /* KCL verification - Linear and Dynamic Part */ - *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; +/* *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (T1 * ddxpart_dVd + dxpart * ggtd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode) ; *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (dxpart * ggtg + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; @@ -5388,9 +5388,9 @@ line900: *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqd_SnodePrime_fvk + ceqqg_SnodePrime_fvk + ceqqb_SnodePrime_fvk + ceqqjd_SnodePrime_fvk + ceqqjs_SnodePrime_fvk + ceqqgmid_fvk + Istoteq_fvk) ; } - +*/ /* KCL verification - Linear and Static Part */ - if (here->BSIM4rgateMod == 1) +/* if (here->BSIM4rgateMod == 1) { *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ; *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ; @@ -5434,177 +5434,213 @@ line900: *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; *(ckt->CKTfvk+here->BSIM4bNode) += m * (here->BSIM4grbsb + here->BSIM4grbdb + here->BSIM4grbpb) * *(ckt->CKTrhsOld+here->BSIM4bNode) ; } - +*/ ////////////////////////////////////////////// +// RHS + (*(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (ceqjd - ceqbd + ceqgdtot - ceqdrn - ceqqd + Idtoteq)); /* NO ceqgdtot in FVK */ - //A*V-B -// if (here->BSIM4rgateMod == 1) -// { -// *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ; -// *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ;// -// *(ckt->CKTfvk+here->BSIM4gNodeExt) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; -// *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (gcggb - ggtg + gIgtotg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (gcgdb - ggtd + gIgtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (gcgsb - ggts + gIgtots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (gcgbb - ggtb + gIgtotb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// -// } -/* else if (here->BSIM4rgateMod == 2) - { (*(here->BSIM4GEgePtr) += m * gcrg); - (*(here->BSIM4GEgpPtr) += m * gcrgg); - (*(here->BSIM4GEdpPtr) += m * gcrgd); - (*(here->BSIM4GEspPtr) += m * gcrgs); - (*(here->BSIM4GEbpPtr) += m * gcrgb); - - (*(here->BSIM4GPgePtr) -= m * gcrg); - (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else if (here->BSIM4rgateMod == 3) - { (*(here->BSIM4GEgePtr) += m * geltd); - (*(here->BSIM4GEgmPtr) -= m * geltd); - (*(here->BSIM4GMgePtr) -= m * geltd); - (*(here->BSIM4GMgmPtr) += m * (geltd + gcrg + gcgmgmb)); - - (*(here->BSIM4GMdpPtr) += m * (gcrgd + gcgmdb)); - (*(here->BSIM4GMgpPtr) += m * gcrgg); - (*(here->BSIM4GMspPtr) += m * (gcrgs + gcgmsb)); - (*(here->BSIM4GMbpPtr) += m * (gcrgb + gcgmbb)); - - (*(here->BSIM4DPgmPtr) += m * gcdgmb); - (*(here->BSIM4GPgmPtr) -= m * gcrg); - (*(here->BSIM4SPgmPtr) += m * gcsgmb); - (*(here->BSIM4BPgmPtr) += m * gcbgmb); - - (*(here->BSIM4GPgpPtr) += m * (gcggb - gcrgg - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - gcrgd - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - gcrgs - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - gcrgb - ggtb + gIgtotb)); - } - else - { (*(here->BSIM4GPgpPtr) += m * (gcggb - ggtg + gIgtotg)); - (*(here->BSIM4GPdpPtr) += m * (gcgdb - ggtd + gIgtotd)); - (*(here->BSIM4GPspPtr) += m * (gcgsb - ggts + gIgtots)); - (*(here->BSIM4GPbpPtr) += m * (gcgbb - ggtb + gIgtotb)); - } - - if (model->BSIM4rdsMod) - { (*(here->BSIM4DgpPtr) += m * gdtotg); - (*(here->BSIM4DspPtr) += m * gdtots); - (*(here->BSIM4DbpPtr) += m * gdtotb); - (*(here->BSIM4SdpPtr) += m * gstotd); - (*(here->BSIM4SgpPtr) += m * gstotg); - (*(here->BSIM4SbpPtr) += m * gstotb); - } -*/ -// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (here->BSIM4gds + here->BSIM4gbd + T1 * ddxpart_dVd - gdtotd + RevSum + gcddb + gbdpdp + dxpart * ggtd - gIdtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode) ;// -// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg + dxpart * ggtg + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (here->BSIM4gds + gdtots - dxpart * ggts + gIdtots - T1 * ddxpart_dVs + FwdSum - gcdsb - gbdpsp) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - T1 * ddxpart_dVb - dxpart * ggtb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// - -// *(ckt->CKTfvk+here->BSIM4dNode) -= m * (gdpr - gdtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; -// *(ckt->CKTfvk+here->BSIM4dNode) += m * (gdpr + gdtot) * *(ckt->CKTrhsOld+here->BSIM4dNode) ; - -// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (here->BSIM4gds + gstotd + RevSum - gcsdb - gbspdp - T1 * dsxpart_dVd - sxpart * ggtd + gIstotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg + T1 * dsxpart_dVg - gIstotg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (here->BSIM4gds + here->BSIM4gbs + T1 * dsxpart_dVs - gstots + FwdSum + gcssb + gbspsp + sxpart * ggts - gIstots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * gstot * *(ckt->CKTrhsOld+here->BSIM4sNode) ;// -// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - T1 * dsxpart_dVb + gIstotb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// - -// *(ckt->CKTfvk+here->BSIM4sNode) -= m * (gspr - gstots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; -// *(ckt->CKTfvk+here->BSIM4sNode) += m * (gspr + gstot) * *(ckt->CKTrhsOld+here->BSIM4sNode) ; - -// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gcbdb - gjbd + gbbdp - gIbtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gcbgb - here->BSIM4gbgs - gIbtotg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gcbsb - gjbs + gbbsp - gIbtots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gjbd + gjbs + gcbbb - here->BSIM4gbbs - gIbtotb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// - - - /* stamp gidl */ -// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * ggidld * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * ggidlg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ggidlg + ggidld + ggidlb) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * ggidlb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// - -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggidld * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggidlg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (ggidlg + ggidld + ggidlb) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggidlb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// - - /* stamp gisl */ -// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ggisls + ggislg + ggislb) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ggislg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ggisls * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ggislb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// - -// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (ggislg + ggisls + ggislb) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggislg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggisls * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * ggislb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// - - -// if (here->BSIM4rbodyMod) -// { -// *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (gcdbdb - here->BSIM4gbd) * *(ckt->CKTrhsOld+here->BSIM4dbNode) ;// - -// *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (here->BSIM4gbs - gcsbsb) * *(ckt->CKTrhsOld+here->BSIM4sbNode) ;// - -// *(ckt->CKTfvk+here->BSIM4dbNode) += m * (gcdbdb - here->BSIM4gbd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4dbNode) += m * (here->BSIM4gbd - gcdbdb + here->BSIM4grbpd) * *(ckt->CKTrhsOld+here->BSIM4dbNode) ;// -// *(ckt->CKTfvk+here->BSIM4dbNode) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4dbNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4bNode) ;// - -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4dbNode) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld+here->BSIM4bNode) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4sbNode) ;// -// *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (here->BSIM4grbpd + here->BSIM4grbps) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// - -// *(ckt->CKTfvk+here->BSIM4sbNode) += m * (gcsbsb - here->BSIM4gbs) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4sbNode) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ;// -// *(ckt->CKTfvk+here->BSIM4sbNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4bNode) ;// -// *(ckt->CKTfvk+here->BSIM4sbNode) += m * (here->BSIM4gbs - gcsbsb) * *(ckt->CKTrhsOld+here->BSIM4sbNode) ;// - -// *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; -// *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; -// *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; -// *(ckt->CKTfvk+here->BSIM4bNode) += m * (here->BSIM4grbsb + here->BSIM4grbdb + here->BSIM4grbpb) * *(ckt->CKTrhsOld+here->BSIM4bNode) ; -// } - - -// *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (ceqjd - ceqbd + ceqgdtot - ceqdrn - ceqqd + Idtoteq) ;// - -// *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (ceqqg - ceqgcrg + Igtoteq) ;// + (*(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (ceqqg - ceqgcrg + Igtoteq)); /* NO ceqgcrg in FVK */ if (here->BSIM4rgateMod == 2) - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * ceqgcrg ; + (*(ckt->CKTfvk + here->BSIM4gNodeExt) += m * ceqgcrg); /* NO ceqgcrg in FVK */ else if (here->BSIM4rgateMod == 3) - *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (ceqqgmid + ceqgcrg) ; + (*(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (ceqqgmid + ceqgcrg)); /* NO ceqgcrg in FVK */ if (!here->BSIM4rbodyMod) - { - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq) ; + { (*(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq)); + (*(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); /* NO ceqgstot in FVK */ } else - { -// *(ckt->CKTfvk + here->BSIM4dbNode) += m * (ceqjd + ceqqjd) ;// -// *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqqb + Ibtoteq) ;// -// *(ckt->CKTfvk + here->BSIM4sbNode) += m * (ceqjs + ceqqjs) ;// -// *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + ceqqd + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq) ;// + { (*(ckt->CKTfvk + here->BSIM4dbNode) += m * (ceqjd + ceqqjd)); + (*(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqqb + Ibtoteq)); + (*(ckt->CKTfvk + here->BSIM4sbNode) += m * (ceqjs + ceqqjs)); + (*(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + ceqqd + + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); /* NO ceqgstot in FVK */ } if (model->BSIM4rdsMod) - { - *(ckt->CKTfvk + here->BSIM4dNode) += m * ceqgdtot ; - *(ckt->CKTfvk + here->BSIM4sNode) -= m * ceqgstot ; + { (*(ckt->CKTfvk + here->BSIM4dNode) += m * ceqgdtot); /* NO ceqgdtot in FVK */ + (*(ckt->CKTfvk + here->BSIM4sNode) -= m * ceqgstot); /* NO ceqgstot in FVK */ } if (here->BSIM4trnqsMod) - *(ckt->CKTfvk + here->BSIM4qNode) -= m * (cqcheq - cqdef) ; + (*(ckt->CKTfvk + here->BSIM4qNode) -= m * (cqcheq - cqdef)); + + +// Matrice + if (here->BSIM4rgateMod == 1) + { + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; + *(ckt->CKTfvk + here->BSIM4gNodeExt) -= m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcggb + geltd - ggtg + gIgtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgdb - ggtd + gIgtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgsb - ggts + gIgtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgbb - ggtb + gIgtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + } /* WDLiu: gcrg already subtracted from all gcrgg below */ + else if (here->BSIM4rgateMod == 2) + { + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrg * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrgg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrgd * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrgs * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrgb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * gcrg * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcggb - gcrgg - ggtg + gIgtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgdb - gcrgd - ggtd + gIgtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgsb - gcrgs - ggts + gIgtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgbb - gcrgb - ggtb + gIgtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + } + else if (here->BSIM4rgateMod == 3) + { + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; + *(ckt->CKTfvk + here->BSIM4gNodeExt) -= m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; + *(ckt->CKTfvk + here->BSIM4gNodeMid) -= m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; + *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (geltd + gcrg + gcgmgmb) * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; + *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (gcrgd + gcgmdb) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * gcrgg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (gcrgs + gcgmsb) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (gcrgb + gcgmbb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * gcdgmb * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * gcrg * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * gcsgmb * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * gcbgmb * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcggb - gcrgg - ggtg + gIgtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgdb - gcrgd - ggtd + gIgtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgsb - gcrgs - ggts + gIgtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgbb - gcrgb - ggtb + gIgtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + } else { + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcggb - ggtg + gIgtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgdb - ggtd + gIgtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgsb - ggts + gIgtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgbb - ggtb + gIgtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + } + + if (model->BSIM4rdsMod) + { + *(ckt->CKTfvk + here->BSIM4dNode) += m * gdtotg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dNode) += m * gdtots * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dNode) += m * gdtotb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4sNode) += m * gstotd * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4sNode) += m * gstotg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4sNode) += m * gstotb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + } + + *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * (gdpr + here->BSIM4gds + here->BSIM4gbd + T1 * ddxpart_dVd - gdtotd + RevSum + + gcddb + gbdpdp + dxpart * ggtd - gIdtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (gdpr + gdtot) * *(ckt->CKTrhsOld + here->BSIM4dNode) ; + + *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg + dxpart * ggtg + + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (here->BSIM4gds + gdtots - dxpart * ggts + gIdtots - T1 * ddxpart_dVs + + FwdSum - gcdsb - gbdpsp) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - T1 * ddxpart_dVb + - dxpart * ggtb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4dNode) -= m * (gdpr - gdtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4dNode) += m * (gdpr + gdtot) * *(ckt->CKTrhsOld + here->BSIM4dNode) ; + + *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (here->BSIM4gds + gstotd + RevSum - gcsdb - gbspdp - T1 * dsxpart_dVd + - sxpart * ggtd + gIstotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg + T1 * dsxpart_dVg + - gIstotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * (gspr + here->BSIM4gds + here->BSIM4gbs + T1 * dsxpart_dVs - gstots + FwdSum + + gcssb + gbspsp + sxpart * ggts - gIstots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (gspr + gstot) * *(ckt->CKTrhsOld + here->BSIM4sNode) ; + + *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - T1 * dsxpart_dVb + + gIstotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4sNode) -= m * (gspr - gstots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4sNode) += m * (gspr + gstot) * *(ckt->CKTrhsOld + here->BSIM4sNode) ; + + *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (gcbdb - gjbd + gbbdp - gIbtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (gcbgb - here->BSIM4gbgs - gIbtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (gcbsb - gjbs + gbbsp - gIbtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + + *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (gjbd + gjbs + gcbbb - here->BSIM4gbbs + - gIbtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + + ggidld = here->BSIM4ggidld; + ggidlg = here->BSIM4ggidlg; + ggidlb = here->BSIM4ggidlb; + ggislg = here->BSIM4ggislg; + ggisls = here->BSIM4ggisls; + ggislb = here->BSIM4ggislb; + + /* stamp gidl */ + *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * ggidld * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * ggidlg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (ggidlg + ggidld + ggidlb) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * ggidlb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggidld * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggidlg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (ggidlg + ggidld + ggidlb) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggidlb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + + /* stamp gisl */ + *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ggisls + ggislg + ggislb) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * ggislg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * ggisls * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * ggislb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (ggislg + ggisls + ggislb) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggislg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggisls * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggislb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + + if (here->BSIM4rbodyMod) + { + *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * (gcdbdb - here->BSIM4gbd) * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (here->BSIM4gbs - gcsbsb) * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; + *(ckt->CKTfvk + here->BSIM4dbNode) += m * (gcdbdb - here->BSIM4gbd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dbNode) += m * (here->BSIM4gbd - gcdbdb + here->BSIM4grbpd + + here->BSIM4grbdb) * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; + *(ckt->CKTfvk + here->BSIM4dbNode) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dbNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld + here->BSIM4bNode) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (here->BSIM4grbpd + here->BSIM4grbps + + here->BSIM4grbpb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + + /* WDLiu: (gcbbb - here->BSIM4gbbs) already added to BPbpPtr */ + + *(ckt->CKTfvk + here->BSIM4sbNode) += m * (gcsbsb - here->BSIM4gbs) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4sbNode) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4sbNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld + here->BSIM4bNode) ; + *(ckt->CKTfvk + here->BSIM4sbNode) += m * (here->BSIM4gbs - gcsbsb + here->BSIM4grbps + + here->BSIM4grbsb) * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; + *(ckt->CKTfvk + here->BSIM4bNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; + *(ckt->CKTfvk + here->BSIM4bNode) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4bNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; + *(ckt->CKTfvk + here->BSIM4bNode) += m * (here->BSIM4grbsb + here->BSIM4grbdb + + here->BSIM4grbpb) * *(ckt->CKTrhsOld + here->BSIM4bNode) ; + } + + if (here->BSIM4trnqsMod) + { + *(ckt->CKTfvk + here->BSIM4qNode) += m * (gqdef + here->BSIM4gtau) * *(ckt->CKTrhsOld + here->BSIM4qNode) ; + *(ckt->CKTfvk + here->BSIM4qNode) += m * (ggtg - gcqgb) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; + *(ckt->CKTfvk + here->BSIM4qNode) += m * (ggtd - gcqdb) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; + *(ckt->CKTfvk + here->BSIM4qNode) += m * (ggts - gcqsb) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; + *(ckt->CKTfvk + here->BSIM4qNode) += m * (ggtb - gcqbb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; + *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * dxpart * here->BSIM4gtau * *(ckt->CKTrhsOld + here->BSIM4qNode) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * sxpart * here->BSIM4gtau * *(ckt->CKTrhsOld + here->BSIM4qNode) ; + *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * here->BSIM4gtau * *(ckt->CKTrhsOld + here->BSIM4qNode) ; + } #endif line1000: ; From 115aee5deba5e853fb047b3e56767540421631eb Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 21 May 2013 23:28:25 +0200 Subject: [PATCH 235/257] Corrected a bug in the KCL implementation of the BSIM4 model --- src/spicelib/devices/bsim4/b4ld.c | 37 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index 3ad034160..15c33ff55 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -5439,35 +5439,36 @@ line900: ////////////////////////////////////////////// // RHS - (*(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (ceqjd - ceqbd + ceqgdtot - ceqdrn - ceqqd + Idtoteq)); /* NO ceqgdtot in FVK */ + *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (ceqjd - ceqbd + ceqgdtot - ceqdrn - ceqqd + Idtoteq) ; /* NO ceqgdtot in FVK */ - (*(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (ceqqg - ceqgcrg + Igtoteq)); /* NO ceqgcrg in FVK */ + *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (ceqqg - ceqgcrg + Igtoteq) ; /* NO ceqgcrg in FVK */ if (here->BSIM4rgateMod == 2) - (*(ckt->CKTfvk + here->BSIM4gNodeExt) += m * ceqgcrg); /* NO ceqgcrg in FVK */ + *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * ceqgcrg ; /* NO ceqgcrg in FVK */ else if (here->BSIM4rgateMod == 3) - (*(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (ceqqgmid + ceqgcrg)); /* NO ceqgcrg in FVK */ + *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (ceqqgmid + ceqgcrg) ; /* NO ceqgcrg in FVK */ if (!here->BSIM4rbodyMod) - { (*(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq)); - (*(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq)); /* NO ceqgstot in FVK */ - } - else - { (*(ckt->CKTfvk + here->BSIM4dbNode) += m * (ceqjd + ceqqjd)); - (*(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqqb + Ibtoteq)); - (*(ckt->CKTfvk + here->BSIM4sbNode) += m * (ceqjs + ceqqjs)); - (*(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq)); /* NO ceqgstot in FVK */ + { + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq) ; /* NO ceqgstot in FVK */ + } else { + *(ckt->CKTfvk + here->BSIM4dbNode) += m * (ceqjd + ceqqjd) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqqb + Ibtoteq) ; + *(ckt->CKTfvk + here->BSIM4sbNode) += m * (ceqjs + ceqqjs) ; + *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + ceqqd + + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq) ; /* NO ceqgstot in FVK */ } if (model->BSIM4rdsMod) - { (*(ckt->CKTfvk + here->BSIM4dNode) += m * ceqgdtot); /* NO ceqgdtot in FVK */ - (*(ckt->CKTfvk + here->BSIM4sNode) -= m * ceqgstot); /* NO ceqgstot in FVK */ + { + *(ckt->CKTfvk + here->BSIM4dNode) += m * ceqgdtot ; /* NO ceqgdtot in FVK */ + *(ckt->CKTfvk + here->BSIM4sNode) -= m * ceqgstot ; /* NO ceqgstot in FVK */ } if (here->BSIM4trnqsMod) - (*(ckt->CKTfvk + here->BSIM4qNode) -= m * (cqcheq - cqdef)); + *(ckt->CKTfvk + here->BSIM4qNode) -= m * (cqcheq - cqdef) ; // Matrice @@ -5611,7 +5612,7 @@ line900: *(ckt->CKTfvk + here->BSIM4dbNode) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; *(ckt->CKTfvk + here->BSIM4dbNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld + here->BSIM4bNode) ; *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; + *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld + here->BSIM4bNode) ; *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (here->BSIM4grbpd + here->BSIM4grbps + here->BSIM4grbpb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; From 9aaa127643b484b71a645568f2feb066215982d4 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 21 May 2013 23:29:35 +0200 Subject: [PATCH 236/257] Fixed the KCL implementation. Now it really works! :) --- src/maths/ni/niconv.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 04b086693..3736b891b 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -75,7 +75,12 @@ NIconvTest(CKTcircuit *ckt) node = node->next ; if (node->type == SP_VOLTAGE) { - if (fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhs [i]) > maximum) + +#ifdef STEPDEBUG + fprintf (stderr, "Index: %d\tValue: %-.9g\tThreshold: %-.9g\n", i, fabs (ckt->CKTfvk [i]), ckt->CKTreltol * maximum + ckt->CKTabstol) ; +#endif + + if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) return 1 ; } } From 988cf25c246f34705dfb4f5a0b2ede2c61c735eb Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 21 May 2013 23:44:47 +0200 Subject: [PATCH 237/257] Created a New Infrastructure for the KCL Verification based on the Linear and Non-Linear Node Method --- src/include/ngspice/cktdefs.h | 1 + src/include/ngspice/devdefs.h | 4 + src/maths/ni/niconv.c | 2 +- src/maths/ni/nireinit.c | 8 +- src/spicelib/analysis/cktsetup.c | 14 ++++ src/spicelib/devices/asrc/Makefile.am | 1 + src/spicelib/devices/asrc/asrcext.h | 1 + src/spicelib/devices/asrc/asrcinit.c | 3 +- src/spicelib/devices/asrc/asrcnode.c | 28 +++++++ src/spicelib/devices/bjt/Makefile.am | 1 + src/spicelib/devices/bjt/bjtext.h | 1 + src/spicelib/devices/bjt/bjtinit.c | 3 +- src/spicelib/devices/bjt/bjtnode.c | 31 ++++++++ src/spicelib/devices/bsim1/Makefile.am | 1 + src/spicelib/devices/bsim1/b1node.c | 30 +++++++ src/spicelib/devices/bsim1/bsim1ext.h | 1 + src/spicelib/devices/bsim1/bsim1init.c | 3 +- src/spicelib/devices/bsim2/Makefile.am | 1 + src/spicelib/devices/bsim2/b2node.c | 30 +++++++ src/spicelib/devices/bsim2/bsim2ext.h | 1 + src/spicelib/devices/bsim2/bsim2init.c | 3 +- src/spicelib/devices/bsim3/Makefile.am | 1 + src/spicelib/devices/bsim3/b3node.c | 29 +++++++ src/spicelib/devices/bsim3/bsim3ext.h | 1 + src/spicelib/devices/bsim3/bsim3init.c | 3 +- src/spicelib/devices/bsim3soi_dd/Makefile.am | 47 +++++------ src/spicelib/devices/bsim3soi_dd/b3soiddext.h | 1 + .../devices/bsim3soi_dd/b3soiddinit.c | 3 +- .../devices/bsim3soi_dd/b3soiddnode.c | 79 +++++++++++++++++++ src/spicelib/devices/bsim3soi_fd/Makefile.am | 47 +++++------ src/spicelib/devices/bsim3soi_fd/b3soifdext.h | 2 +- .../devices/bsim3soi_fd/b3soifdinit.c | 3 +- .../devices/bsim3soi_fd/b3soifdnode.c | 79 +++++++++++++++++++ src/spicelib/devices/bsim3soi_pd/Makefile.am | 47 +++++------ src/spicelib/devices/bsim3soi_pd/b3soipdext.h | 1 + .../devices/bsim3soi_pd/b3soipdinit.c | 3 +- .../devices/bsim3soi_pd/b3soipdnode.c | 55 +++++++++++++ src/spicelib/devices/bsim3v0/Makefile.am | 1 + src/spicelib/devices/bsim3v0/b3v0node.c | 31 ++++++++ src/spicelib/devices/bsim3v0/bsim3v0ext.h | 4 +- src/spicelib/devices/bsim3v0/bsim3v0init.c | 3 +- src/spicelib/devices/bsim3v1/Makefile.am | 1 + src/spicelib/devices/bsim3v1/b3v1node.c | 31 ++++++++ src/spicelib/devices/bsim3v1/bsim3v1ext.h | 2 +- src/spicelib/devices/bsim3v1/bsim3v1init.c | 3 +- src/spicelib/devices/bsim3v32/Makefile.am | 1 + src/spicelib/devices/bsim3v32/b3v32node.c | 31 ++++++++ src/spicelib/devices/bsim3v32/bsim3v32ext.h | 1 + src/spicelib/devices/bsim3v32/bsim3v32init.c | 3 +- src/spicelib/devices/bsim4/Makefile.am | 1 + src/spicelib/devices/bsim4/b4node.c | 46 +++++++++++ src/spicelib/devices/bsim4/bsim4ext.h | 1 + src/spicelib/devices/bsim4/bsim4init.c | 3 +- src/spicelib/devices/bsim4v4/Makefile.am | 1 + src/spicelib/devices/bsim4v4/b4v4node.c | 34 ++++++++ src/spicelib/devices/bsim4v4/bsim4v4ext.h | 3 +- src/spicelib/devices/bsim4v4/bsim4v4init.c | 3 +- src/spicelib/devices/bsim4v5/Makefile.am | 1 + src/spicelib/devices/bsim4v5/b4v5node.c | 34 ++++++++ src/spicelib/devices/bsim4v5/bsim4v5ext.h | 1 + src/spicelib/devices/bsim4v5/bsim4v5init.c | 3 +- src/spicelib/devices/bsim4v6/Makefile.am | 15 ++-- src/spicelib/devices/bsim4v6/b4v6node.c | 34 ++++++++ src/spicelib/devices/bsim4v6/bsim4v6ext.h | 1 + src/spicelib/devices/bsim4v6/bsim4v6init.c | 3 +- src/spicelib/devices/bsimsoi/Makefile.am | 49 ++++++------ src/spicelib/devices/bsimsoi/b4soiext.h | 1 + src/spicelib/devices/bsimsoi/b4soiinit.c | 3 +- src/spicelib/devices/bsimsoi/b4soinode.c | 58 ++++++++++++++ src/spicelib/devices/cap/capinit.c | 3 +- src/spicelib/devices/cccs/cccsinit.c | 3 +- src/spicelib/devices/ccvs/ccvsinit.c | 3 +- src/spicelib/devices/cpl/cplinit.c | 3 +- src/spicelib/devices/csw/cswinit.c | 3 +- src/spicelib/devices/dio/Makefile.am | 1 + src/spicelib/devices/dio/dioext.h | 2 +- src/spicelib/devices/dio/dioinit.c | 3 +- src/spicelib/devices/dio/dionode.c | 28 +++++++ src/spicelib/devices/hfet1/Makefile.am | 1 + src/spicelib/devices/hfet1/hfetext.h | 1 + src/spicelib/devices/hfet1/hfetinit.c | 3 +- src/spicelib/devices/hfet1/hfetnode.c | 31 ++++++++ src/spicelib/devices/hfet2/Makefile.am | 1 + src/spicelib/devices/hfet2/hfet2ext.h | 1 + src/spicelib/devices/hfet2/hfet2init.c | 3 +- src/spicelib/devices/hfet2/hfet2node.c | 29 +++++++ src/spicelib/devices/hisim2/Makefile.am | 1 + src/spicelib/devices/hisim2/hsm2ext.h | 1 + src/spicelib/devices/hisim2/hsm2init.c | 3 +- src/spicelib/devices/hisim2/hsm2node.c | 32 ++++++++ src/spicelib/devices/hisimhv1/Makefile.am | 1 + src/spicelib/devices/hisimhv1/hsmhvext.h | 1 + src/spicelib/devices/hisimhv1/hsmhvinit.c | 3 +- src/spicelib/devices/hisimhv1/hsmhvnode.c | 35 ++++++++ src/spicelib/devices/ind/indinit.c | 8 +- src/spicelib/devices/isrc/isrcinit.c | 3 +- src/spicelib/devices/jfet/Makefile.am | 1 + src/spicelib/devices/jfet/jfetext.h | 1 + src/spicelib/devices/jfet/jfetinit.c | 3 +- src/spicelib/devices/jfet/jfetnode.c | 29 +++++++ src/spicelib/devices/jfet2/Makefile.am | 1 + src/spicelib/devices/jfet2/jfet2ext.h | 1 + src/spicelib/devices/jfet2/jfet2init.c | 3 +- src/spicelib/devices/jfet2/jfet2node.c | 29 +++++++ src/spicelib/devices/ltra/ltrainit.c | 3 +- src/spicelib/devices/mes/Makefile.am | 1 + src/spicelib/devices/mes/mesext.h | 2 +- src/spicelib/devices/mes/mesinit.c | 3 +- src/spicelib/devices/mes/mesnode.c | 29 +++++++ src/spicelib/devices/mesa/Makefile.am | 1 + src/spicelib/devices/mesa/mesaext.h | 1 + src/spicelib/devices/mesa/mesainit.c | 3 +- src/spicelib/devices/mesa/mesanode.c | 31 ++++++++ src/spicelib/devices/mos1/Makefile.am | 1 + src/spicelib/devices/mos1/mos1ext.h | 1 + src/spicelib/devices/mos1/mos1init.c | 3 +- src/spicelib/devices/mos1/mos1node.c | 30 +++++++ src/spicelib/devices/mos2/Makefile.am | 1 + src/spicelib/devices/mos2/mos2ext.h | 2 +- src/spicelib/devices/mos2/mos2init.c | 3 +- src/spicelib/devices/mos2/mos2node.c | 30 +++++++ src/spicelib/devices/mos3/Makefile.am | 1 + src/spicelib/devices/mos3/mos3ext.h | 1 + src/spicelib/devices/mos3/mos3init.c | 3 +- src/spicelib/devices/mos3/mos3node.c | 30 +++++++ src/spicelib/devices/mos6/Makefile.am | 1 + src/spicelib/devices/mos6/mos6ext.h | 1 + src/spicelib/devices/mos6/mos6init.c | 3 +- src/spicelib/devices/mos6/mos6node.c | 30 +++++++ src/spicelib/devices/mos9/Makefile.am | 1 + src/spicelib/devices/mos9/mos9ext.h | 1 + src/spicelib/devices/mos9/mos9init.c | 3 +- src/spicelib/devices/mos9/mos9node.c | 30 +++++++ src/spicelib/devices/res/resinit.c | 3 +- src/spicelib/devices/soi3/Makefile.am | 1 + src/spicelib/devices/soi3/soi3ext.h | 1 + src/spicelib/devices/soi3/soi3init.c | 3 +- src/spicelib/devices/soi3/soi3node.c | 36 +++++++++ src/spicelib/devices/sw/swinit.c | 3 +- src/spicelib/devices/tra/trainit.c | 3 +- src/spicelib/devices/txl/txlinit.c | 5 +- src/spicelib/devices/urc/urcinit.c | 3 +- src/spicelib/devices/vbic/Makefile.am | 1 + src/spicelib/devices/vbic/vbicext.h | 1 + src/spicelib/devices/vbic/vbicinit.c | 3 +- src/spicelib/devices/vbic/vbicnode.c | 33 ++++++++ src/spicelib/devices/vccs/vccsinit.c | 4 +- src/spicelib/devices/vcvs/vcvsinit.c | 3 +- src/spicelib/devices/vsrc/vsrcinit.c | 3 +- 149 files changed, 1441 insertions(+), 166 deletions(-) create mode 100644 src/spicelib/devices/asrc/asrcnode.c create mode 100644 src/spicelib/devices/bjt/bjtnode.c create mode 100644 src/spicelib/devices/bsim1/b1node.c create mode 100644 src/spicelib/devices/bsim2/b2node.c create mode 100644 src/spicelib/devices/bsim3/b3node.c create mode 100644 src/spicelib/devices/bsim3soi_dd/b3soiddnode.c create mode 100644 src/spicelib/devices/bsim3soi_fd/b3soifdnode.c create mode 100644 src/spicelib/devices/bsim3soi_pd/b3soipdnode.c create mode 100644 src/spicelib/devices/bsim3v0/b3v0node.c create mode 100644 src/spicelib/devices/bsim3v1/b3v1node.c create mode 100644 src/spicelib/devices/bsim3v32/b3v32node.c create mode 100644 src/spicelib/devices/bsim4/b4node.c create mode 100644 src/spicelib/devices/bsim4v4/b4v4node.c create mode 100644 src/spicelib/devices/bsim4v5/b4v5node.c create mode 100644 src/spicelib/devices/bsim4v6/b4v6node.c create mode 100644 src/spicelib/devices/bsimsoi/b4soinode.c create mode 100644 src/spicelib/devices/dio/dionode.c create mode 100644 src/spicelib/devices/hfet1/hfetnode.c create mode 100644 src/spicelib/devices/hfet2/hfet2node.c create mode 100644 src/spicelib/devices/hisim2/hsm2node.c create mode 100644 src/spicelib/devices/hisimhv1/hsmhvnode.c create mode 100644 src/spicelib/devices/jfet/jfetnode.c create mode 100644 src/spicelib/devices/jfet2/jfet2node.c create mode 100644 src/spicelib/devices/mes/mesnode.c create mode 100644 src/spicelib/devices/mesa/mesanode.c create mode 100644 src/spicelib/devices/mos1/mos1node.c create mode 100644 src/spicelib/devices/mos2/mos2node.c create mode 100644 src/spicelib/devices/mos3/mos3node.c create mode 100644 src/spicelib/devices/mos6/mos6node.c create mode 100644 src/spicelib/devices/mos9/mos9node.c create mode 100644 src/spicelib/devices/soi3/soi3node.c create mode 100644 src/spicelib/devices/vbic/vbicnode.c diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index c0a32582d..d2ed108da 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -111,6 +111,7 @@ struct CKTcircuit { double *CKTrhsOld; /* previous rhs value for convergence testing */ double *CKTfvk ; /* KCL Verification array */ + int *CKTnodeIsLinear ; /* Flag to indicate if a node is linear or non-linear */ double *CKTrhsSpare; /* spare rhs value for reordering */ double *CKTirhs; /* current rhs value - being loaded (imag) */ diff --git a/src/include/ngspice/devdefs.h b/src/include/ngspice/devdefs.h index f86390dbb..03c668367 100644 --- a/src/include/ngspice/devdefs.h +++ b/src/include/ngspice/devdefs.h @@ -112,6 +112,10 @@ typedef struct SPICEdev { int *DEVinstSize; /* size of an instance */ int *DEVmodSize; /* size of a model */ + /* Francesco Lannutti */ + int (*DEVnodeIsNonLinear)(GENmodel *, CKTcircuit *) ; + /* Routine to declare a node as NonLinear */ + } SPICEdev; /* instance of structure for each possible type of device */ diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 3736b891b..517b36e33 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -73,7 +73,7 @@ NIconvTest(CKTcircuit *ckt) for (i = 1 ; i <= size ; i++) { node = node->next ; - if (node->type == SP_VOLTAGE) + if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i])) { #ifdef STEPDEBUG diff --git a/src/maths/ni/nireinit.c b/src/maths/ni/nireinit.c index 3c2641fc4..bfb6b4e50 100644 --- a/src/maths/ni/nireinit.c +++ b/src/maths/ni/nireinit.c @@ -21,10 +21,7 @@ Author: 1985 Thomas L. Quarles int NIreinit( CKTcircuit *ckt) { - int size; -#ifdef PREDICTOR - int i; -#endif + int i, size; size = SMPmatSize(ckt->CKTmatrix); CKALLOC(CKTrhs,size+1,double); @@ -34,6 +31,9 @@ NIreinit( CKTcircuit *ckt) CKALLOC(CKTirhs,size+1,double); CKALLOC(CKTirhsOld,size+1,double); CKALLOC(CKTirhsSpare,size+1,double); + CKALLOC(CKTnodeIsLinear,size+1,int); + for (i = 0 ; i <= size ; i++) + ckt->CKTnodeIsLinear [i] = 1 ; #ifdef PREDICTOR CKALLOC(CKTpred,size+1,double); for( i=0;i<8;i++) { diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 446749094..2e6a05351 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -127,6 +127,20 @@ CKTsetup(CKTcircuit *ckt) /* gtri - end - Setup for adding rshunt option resistors */ #endif + + /** Marking node as Non-Linear when needed + * By default every node is Linear + */ + for (i = 0 ; i < DEVmaxnum ; i++) + { + if (DEVices[i] && DEVices[i]->DEVnodeIsNonLinear && ckt->CKThead[i]) + { + error = DEVices[i]->DEVnodeIsNonLinear (ckt->CKThead[i], ckt) ; + if (error) + return (error) ; + } + } + return(OK); } diff --git a/src/spicelib/devices/asrc/Makefile.am b/src/spicelib/devices/asrc/Makefile.am index 01f292d21..56895b0d7 100644 --- a/src/spicelib/devices/asrc/Makefile.am +++ b/src/spicelib/devices/asrc/Makefile.am @@ -17,6 +17,7 @@ libasrc_la_SOURCES = \ asrcinit.h \ asrcload.c \ asrcmdel.c \ + asrcnode.c \ asrcpar.c \ asrcpzld.c \ asrcset.c \ diff --git a/src/spicelib/devices/asrc/asrcext.h b/src/spicelib/devices/asrc/asrcext.h index a0a23f636..9b99b26d0 100644 --- a/src/spicelib/devices/asrc/asrcext.h +++ b/src/spicelib/devices/asrc/asrcext.h @@ -16,3 +16,4 @@ extern int ASRCacLoad(GENmodel*,CKTcircuit*); extern int ASRCsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int ASRCunsetup(GENmodel*,CKTcircuit*); extern int ASRCtemp(GENmodel*,CKTcircuit*); +extern int ASRCnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/asrc/asrcinit.c b/src/spicelib/devices/asrc/asrcinit.c index a9339deee..8d2c20281 100644 --- a/src/spicelib/devices/asrc/asrcinit.c +++ b/src/spicelib/devices/asrc/asrcinit.c @@ -73,7 +73,8 @@ SPICEdev ASRCinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &ASRCiSize, - /* DEVmodSize */ &ASRCmSize + /* DEVmodSize */ &ASRCmSize, + /* DEVnodeIsNonLinear */ ASRCnodeIsNonLinear }; diff --git a/src/spicelib/devices/asrc/asrcnode.c b/src/spicelib/devices/asrc/asrcnode.c new file mode 100644 index 000000000..d16066310 --- /dev/null +++ b/src/spicelib/devices/asrc/asrcnode.c @@ -0,0 +1,28 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "asrcdefs.h" +#include "ngspice/sperror.h" + +int +ASRCnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + ASRCmodel *model = (ASRCmodel *)inModel ; + ASRCinstance *here ; + + /* loop through all the ASRC models */ + for ( ; model != NULL ; model = model->ASRCnextModel) + { + /* loop through all the instances of the model */ + for (here = model->ASRCinstances ; here != NULL ; here = here->ASRCnextInstance) + { + ckt->CKTnodeIsLinear [here->ASRCposNode] = 0 ; + ckt->CKTnodeIsLinear [here->ASRCnegNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bjt/Makefile.am b/src/spicelib/devices/bjt/Makefile.am index 8b4ab3664..dd9f886ab 100644 --- a/src/spicelib/devices/bjt/Makefile.am +++ b/src/spicelib/devices/bjt/Makefile.am @@ -22,6 +22,7 @@ libbjt_la_SOURCES = \ bjtmask.c \ bjtmdel.c \ bjtmpar.c \ + bjtnode.c \ bjtnoise.c \ bjtparam.c \ bjtpzld.c \ diff --git a/src/spicelib/devices/bjt/bjtext.h b/src/spicelib/devices/bjt/bjtext.h index 69e5c3322..d4c6675a3 100644 --- a/src/spicelib/devices/bjt/bjtext.h +++ b/src/spicelib/devices/bjt/bjtext.h @@ -31,5 +31,6 @@ extern int BJTtrunc(GENmodel*,CKTcircuit*,double*); extern int BJTdisto(int,GENmodel*,CKTcircuit*); extern int BJTnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BJTdSetup(GENmodel*, register CKTcircuit*); +extern int BJTnodeIsNonLinear (GENmodel *, CKTcircuit *) ; #endif diff --git a/src/spicelib/devices/bjt/bjtinit.c b/src/spicelib/devices/bjt/bjtinit.c index c412225b9..47df76b69 100644 --- a/src/spicelib/devices/bjt/bjtinit.c +++ b/src/spicelib/devices/bjt/bjtinit.c @@ -72,7 +72,8 @@ SPICEdev BJTinfo = { /* description from struct IFdevice */ /* DEVacct */ NULL, #endif /* DEVinstSize */ &BJTiSize, - /* DEVmodSize */ &BJTmSize + /* DEVmodSize */ &BJTmSize, + /* DEVnodeIsNonLinear */ BJTnodeIsNonLinear }; diff --git a/src/spicelib/devices/bjt/bjtnode.c b/src/spicelib/devices/bjt/bjtnode.c new file mode 100644 index 000000000..69382e4cc --- /dev/null +++ b/src/spicelib/devices/bjt/bjtnode.c @@ -0,0 +1,31 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bjtdefs.h" +#include "ngspice/sperror.h" + +int +BJTnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BJTmodel *model = (BJTmodel *)inModel ; + BJTinstance *here ; + + /* loop through all the BJT models */ + for ( ; model != NULL ; model = model->BJTnextModel) + { + /* loop through all the instances of the model */ + for (here = model->BJTinstances ; here != NULL ; here = here->BJTnextInstance) + { + ckt->CKTnodeIsLinear [here->BJTcolPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->BJTbasePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->BJTemitPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->BJTsubstNode] = 0 ; + ckt->CKTnodeIsLinear [here->BJTsubstConNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim1/Makefile.am b/src/spicelib/devices/bsim1/Makefile.am index da088cf5b..64559702d 100644 --- a/src/spicelib/devices/bsim1/Makefile.am +++ b/src/spicelib/devices/bsim1/Makefile.am @@ -19,6 +19,7 @@ libbsim1_la_SOURCES = \ b1moscap.c \ b1mpar.c \ b1par.c \ + b1node.c \ b1noi.c \ b1pzld.c \ b1set.c \ diff --git a/src/spicelib/devices/bsim1/b1node.c b/src/spicelib/devices/bsim1/b1node.c new file mode 100644 index 000000000..8e871531b --- /dev/null +++ b/src/spicelib/devices/bsim1/b1node.c @@ -0,0 +1,30 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim1def.h" +#include "ngspice/sperror.h" + +int +B1nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + B1model *model = (B1model *)inModel ; + B1instance *here ; + + /* loop through all the BSIM1 models */ + for ( ; model != NULL ; model = model->B1nextModel) + { + /* loop through all the instances of the model */ + for (here = model->B1instances ; here != NULL ; here = here->B1nextInstance) + { + ckt->CKTnodeIsLinear [here->B1dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B1sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B1gNode] = 0 ; + ckt->CKTnodeIsLinear [here->B1bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim1/bsim1ext.h b/src/spicelib/devices/bsim1/bsim1ext.h index e859e3009..a21c5127b 100644 --- a/src/spicelib/devices/bsim1/bsim1ext.h +++ b/src/spicelib/devices/bsim1/bsim1ext.h @@ -29,3 +29,4 @@ extern int B1temp(GENmodel*,CKTcircuit*); extern int B1trunc(GENmodel*,CKTcircuit*,double*); extern int B1disto(int,GENmodel*,CKTcircuit*); extern int B1dSetup(GENmodel*, register CKTcircuit*); +extern int B1nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim1/bsim1init.c b/src/spicelib/devices/bsim1/bsim1init.c index 38cadef6e..fe123493c 100644 --- a/src/spicelib/devices/bsim1/bsim1init.c +++ b/src/spicelib/devices/bsim1/bsim1init.c @@ -72,7 +72,8 @@ SPICEdev B1info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &B1iSize, - /* DEVmodSize */ &B1mSize + /* DEVmodSize */ &B1mSize, + /* DEVnodeIsNonLinear */ B1nodeIsNonLinear }; diff --git a/src/spicelib/devices/bsim2/Makefile.am b/src/spicelib/devices/bsim2/Makefile.am index ea8ae9855..369eb1ecd 100644 --- a/src/spicelib/devices/bsim2/Makefile.am +++ b/src/spicelib/devices/bsim2/Makefile.am @@ -16,6 +16,7 @@ libbsim2_la_SOURCES = \ b2mdel.c \ b2moscap.c \ b2mpar.c \ + b2node.c \ b2noi.c \ b2par.c \ b2pzld.c \ diff --git a/src/spicelib/devices/bsim2/b2node.c b/src/spicelib/devices/bsim2/b2node.c new file mode 100644 index 000000000..51be6f94c --- /dev/null +++ b/src/spicelib/devices/bsim2/b2node.c @@ -0,0 +1,30 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim2def.h" +#include "ngspice/sperror.h" + +int +B2nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + B2model *model = (B2model *)inModel ; + B2instance *here ; + + /* loop through all the BSIM2 models */ + for ( ; model != NULL ; model = model->B2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->B2instances ; here != NULL ; here = here->B2nextInstance) + { + ckt->CKTnodeIsLinear [here->B2dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B2sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B2gNode] = 0 ; + ckt->CKTnodeIsLinear [here->B2bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim2/bsim2ext.h b/src/spicelib/devices/bsim2/bsim2ext.h index ab7b800da..d819d8a38 100644 --- a/src/spicelib/devices/bsim2/bsim2ext.h +++ b/src/spicelib/devices/bsim2/bsim2ext.h @@ -25,3 +25,4 @@ extern int B2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int B2unsetup(GENmodel*,CKTcircuit*); extern int B2temp(GENmodel*,CKTcircuit*); extern int B2trunc(GENmodel*,CKTcircuit*,double*); +extern int B2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim2/bsim2init.c b/src/spicelib/devices/bsim2/bsim2init.c index 9af87b53c..e452176a3 100644 --- a/src/spicelib/devices/bsim2/bsim2init.c +++ b/src/spicelib/devices/bsim2/bsim2init.c @@ -72,7 +72,8 @@ SPICEdev B2info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &B2iSize, - /* DEVmodSize */ &B2mSize + /* DEVmodSize */ &B2mSize, + /* DEVnodeIsNonLinear */ B2nodeIsNonLinear }; diff --git a/src/spicelib/devices/bsim3/Makefile.am b/src/spicelib/devices/bsim3/Makefile.am index 2871b0f2e..1317c4c76 100644 --- a/src/spicelib/devices/bsim3/Makefile.am +++ b/src/spicelib/devices/bsim3/Makefile.am @@ -15,6 +15,7 @@ libbsim3_la_SOURCES = \ b3mask.c \ b3mdel.c \ b3mpar.c \ + b3node.c \ b3noi.c \ b3par.c \ b3pzld.c \ diff --git a/src/spicelib/devices/bsim3/b3node.c b/src/spicelib/devices/bsim3/b3node.c new file mode 100644 index 000000000..85624d864 --- /dev/null +++ b/src/spicelib/devices/bsim3/b3node.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim3def.h" +#include "ngspice/sperror.h" + +int +BSIM3nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3model *model = (BSIM3model *)inModel ; + BSIM3instance *here ; + + /* loop through all the BSIM3 models */ + for ( ; model != NULL ; model = model->BSIM3nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM3instances ; here != NULL ; here = here->BSIM3nextInstance) + { + ckt->CKTnodeIsLinear [here->BSIM3dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3qNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim3/bsim3ext.h b/src/spicelib/devices/bsim3/bsim3ext.h index 71662ea8b..ef00e8538 100644 --- a/src/spicelib/devices/bsim3/bsim3ext.h +++ b/src/spicelib/devices/bsim3/bsim3ext.h @@ -28,3 +28,4 @@ extern int BSIM3temp(GENmodel*,CKTcircuit*); extern int BSIM3trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3unsetup(GENmodel*,CKTcircuit*); +extern int BSIM3nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim3/bsim3init.c b/src/spicelib/devices/bsim3/bsim3init.c index 48c2f08ae..99efa1d0e 100644 --- a/src/spicelib/devices/bsim3/bsim3init.c +++ b/src/spicelib/devices/bsim3/bsim3init.c @@ -71,7 +71,8 @@ SPICEdev BSIM3info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &BSIM3iSize, - /* DEVmodSize */ &BSIM3mSize + /* DEVmodSize */ &BSIM3mSize, + /* DEVnodeIsNonLinear */ BSIM3nodeIsNonLinear }; diff --git a/src/spicelib/devices/bsim3soi_dd/Makefile.am b/src/spicelib/devices/bsim3soi_dd/Makefile.am index 5187d67e3..bcc68edcf 100644 --- a/src/spicelib/devices/bsim3soi_dd/Makefile.am +++ b/src/spicelib/devices/bsim3soi_dd/Makefile.am @@ -2,29 +2,30 @@ noinst_LTLIBRARIES = libbsim3soidd.la -libbsim3soidd_la_SOURCES = \ - b3soidd.c \ - b3soiddacld.c \ - b3soiddask.c \ - b3soiddcheck.c \ - b3soiddcvtest.c \ - b3soidddel.c \ - b3soidddest.c \ - b3soiddgetic.c \ - b3soiddld.c \ - b3soiddmask.c \ - b3soiddmdel.c \ - b3soiddmpar.c \ - b3soiddnoi.c \ - b3soiddpar.c \ - b3soiddpzld.c \ - b3soiddset.c \ - b3soiddtemp.c \ - b3soiddtrunc.c \ - b3soidddef.h \ - b3soiddext.h \ - b3soiddinit.c \ - b3soiddinit.h \ +libbsim3soidd_la_SOURCES = \ + b3soidd.c \ + b3soiddacld.c \ + b3soiddask.c \ + b3soiddcheck.c \ + b3soiddcvtest.c \ + b3soidddel.c \ + b3soidddest.c \ + b3soiddgetic.c \ + b3soiddld.c \ + b3soiddmask.c \ + b3soiddmdel.c \ + b3soiddmpar.c \ + b3soiddnode.c \ + b3soiddnoi.c \ + b3soiddpar.c \ + b3soiddpzld.c \ + b3soiddset.c \ + b3soiddtemp.c \ + b3soiddtrunc.c \ + b3soidddef.h \ + b3soiddext.h \ + b3soiddinit.c \ + b3soiddinit.h \ b3soidditf.h diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h index 1d5d90695..9f0870708 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h @@ -28,3 +28,4 @@ extern int B3SOIDDtemp(GENmodel*,CKTcircuit*); extern int B3SOIDDtrunc(GENmodel*,CKTcircuit*,double*); extern int B3SOIDDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIDDunsetup(GENmodel*,CKTcircuit*); +extern int B3SOIDDnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c index d3b0fb490..9c3788ad0 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c @@ -69,7 +69,8 @@ SPICEdev B3SOIDDinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &B3SOIDDiSize, - /* DEVmodSize */ &B3SOIDDmSize + /* DEVmodSize */ &B3SOIDDmSize, + /* DEVnodeIsNonLinear */ B3SOIDDnodeIsNonLinear }; SPICEdev * diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddnode.c b/src/spicelib/devices/bsim3soi_dd/b3soiddnode.c new file mode 100644 index 000000000..f993ddc82 --- /dev/null +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddnode.c @@ -0,0 +1,79 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "b3soidddef.h" +#include "ngspice/sperror.h" + +int +B3SOIDDnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + B3SOIDDmodel *model = (B3SOIDDmodel *)inModel ; + B3SOIDDinstance *here ; + + /* loop through all the B3SOIDD models */ + for ( ; model != NULL ; model = model->B3SOIDDnextModel) + { + /* loop through all the instances of the model */ + for (here = model->B3SOIDDinstances ; here != NULL ; here = here->B3SOIDDnextInstance) + { + ckt->CKTnodeIsLinear [here->B3SOIDDdNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDsNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDtempNode] = 0 ; + if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1)) + { + ckt->CKTnodeIsLinear [here->B3SOIDDvbsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDidsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDicNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDibsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDibdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDiiiNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDigidlNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDitunNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDibpNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDabeffNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDvbs0effNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDvbseffNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDxcNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDcbbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDcbdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDcbgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqbfNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqjsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqjdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDgmNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDgmbsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDgdsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDgmeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDvbs0teffNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDvthNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDvgsteffNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDxcsatNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqaccNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqsub0Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqsubs1Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqsubs2Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDqgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDvdscvNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDvcscvNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDcbeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDdum1Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDdum2Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDdum3Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDdum4Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDdum5Node] = 0 ; + } + ckt->CKTnodeIsLinear [here->B3SOIDDgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIDDpNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim3soi_fd/Makefile.am b/src/spicelib/devices/bsim3soi_fd/Makefile.am index aac0e863a..16fcf03c0 100644 --- a/src/spicelib/devices/bsim3soi_fd/Makefile.am +++ b/src/spicelib/devices/bsim3soi_fd/Makefile.am @@ -2,29 +2,30 @@ noinst_LTLIBRARIES = libbsim3soifd.la -libbsim3soifd_la_SOURCES = \ - b3soifd.c \ - b3soifdacld.c \ - b3soifdask.c \ - b3soifdcheck.c \ - b3soifdcvtest.c \ - b3soifddel.c \ - b3soifddest.c \ - b3soifdgetic.c \ - b3soifdld.c \ - b3soifdmask.c \ - b3soifdmdel.c \ - b3soifdmpar.c \ - b3soifdnoi.c \ - b3soifdpar.c \ - b3soifdpzld.c \ - b3soifdset.c \ - b3soifdtemp.c \ - b3soifdtrunc.c \ - b3soifddef.h \ - b3soifdext.h \ - b3soifdinit.c \ - b3soifdinit.h \ +libbsim3soifd_la_SOURCES = \ + b3soifd.c \ + b3soifdacld.c \ + b3soifdask.c \ + b3soifdcheck.c \ + b3soifdcvtest.c \ + b3soifddel.c \ + b3soifddest.c \ + b3soifdgetic.c \ + b3soifdld.c \ + b3soifdmask.c \ + b3soifdmdel.c \ + b3soifdmpar.c \ + b3soifdnode.c \ + b3soifdnoi.c \ + b3soifdpar.c \ + b3soifdpzld.c \ + b3soifdset.c \ + b3soifdtemp.c \ + b3soifdtrunc.c \ + b3soifddef.h \ + b3soifdext.h \ + b3soifdinit.c \ + b3soifdinit.h \ b3soifditf.h diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h index 1c6ed33dd..acdf39dc3 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h @@ -28,4 +28,4 @@ extern int B3SOIFDtemp(GENmodel*,CKTcircuit*); extern int B3SOIFDtrunc(GENmodel*,CKTcircuit*,double*); extern int B3SOIFDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIFDunsetup(GENmodel*,CKTcircuit*); - +extern int B3SOIFDnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c index 27b3a6d43..1667c8462 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c @@ -70,7 +70,8 @@ SPICEdev B3SOIFDinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize*/ &B3SOIFDiSize, - /* DEVmodSize*/ &B3SOIFDmSize + /* DEVmodSize*/ &B3SOIFDmSize, + /* DEVnodeIsNonLinear */ B3SOIFDnodeIsNonLinear }; diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdnode.c b/src/spicelib/devices/bsim3soi_fd/b3soifdnode.c new file mode 100644 index 000000000..cd4280763 --- /dev/null +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdnode.c @@ -0,0 +1,79 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "b3soifddef.h" +#include "ngspice/sperror.h" + +int +B3SOIFDnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + B3SOIFDmodel *model = (B3SOIFDmodel *)inModel ; + B3SOIFDinstance *here ; + + /* loop through all the B3SOIFD models */ + for ( ; model != NULL ; model = model->B3SOIFDnextModel) + { + /* loop through all the instances of the model */ + for (here = model->B3SOIFDinstances ; here != NULL ; here = here->B3SOIFDnextInstance) + { + ckt->CKTnodeIsLinear [here->B3SOIFDdNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDsNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDtempNode] = 0 ; + if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1)) + { + ckt->CKTnodeIsLinear [here->B3SOIFDvbsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDidsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDicNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDibsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDibdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDiiiNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDigidlNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDitunNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDibpNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDabeffNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDvbs0effNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDvbseffNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDxcNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDcbbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDcbdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDcbgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqbfNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqjsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqjdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDgmNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDgmbsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDgdsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDgmeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDvbs0teffNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDvthNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDvgsteffNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDxcsatNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqaccNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqsub0Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqsubs1Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqsubs2Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDqgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDvdscvNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDvcscvNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDcbeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDdum1Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDdum2Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDdum3Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDdum4Node] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDdum5Node] = 0 ; + } + ckt->CKTnodeIsLinear [here->B3SOIFDgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIFDpNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim3soi_pd/Makefile.am b/src/spicelib/devices/bsim3soi_pd/Makefile.am index f363b1d0e..877b09218 100644 --- a/src/spicelib/devices/bsim3soi_pd/Makefile.am +++ b/src/spicelib/devices/bsim3soi_pd/Makefile.am @@ -2,29 +2,30 @@ noinst_LTLIBRARIES = libbsim3soipd.la -libbsim3soipd_la_SOURCES = \ - b3soipd.c \ - b3soipdacld.c \ - b3soipdask.c \ - b3soipdcheck.c \ - b3soipdcvtest.c \ - b3soipddel.c \ - b3soipddest.c \ - b3soipdgetic.c \ - b3soipdld.c \ - b3soipdmask.c \ - b3soipdmdel.c \ - b3soipdmpar.c \ - b3soipdnoi.c \ - b3soipdpar.c \ - b3soipdpzld.c \ - b3soipdset.c \ - b3soipdtemp.c \ - b3soipdtrunc.c \ - b3soipddef.h \ - b3soipdext.h \ - b3soipdinit.c \ - b3soipdinit.h \ +libbsim3soipd_la_SOURCES = \ + b3soipd.c \ + b3soipdacld.c \ + b3soipdask.c \ + b3soipdcheck.c \ + b3soipdcvtest.c \ + b3soipddel.c \ + b3soipddest.c \ + b3soipdgetic.c \ + b3soipdld.c \ + b3soipdmask.c \ + b3soipdmdel.c \ + b3soipdmpar.c \ + b3soipdnode.c \ + b3soipdnoi.c \ + b3soipdpar.c \ + b3soipdpzld.c \ + b3soipdset.c \ + b3soipdtemp.c \ + b3soipdtrunc.c \ + b3soipddef.h \ + b3soipdext.h \ + b3soipdinit.c \ + b3soipdinit.h \ b3soipditf.h diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h index ea2951794..8f94ec599 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h @@ -28,3 +28,4 @@ extern int B3SOIPDtemp(GENmodel*,CKTcircuit*); extern int B3SOIPDtrunc(GENmodel*,CKTcircuit*,double*); extern int B3SOIPDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIPDunsetup(GENmodel*,CKTcircuit*); +extern int B3SOIPDnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c index 1fdab9690..18c8c2918 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c @@ -71,7 +71,8 @@ SPICEdev B3SOIPDinfo = { /* DEVacct*/ NULL, #endif /* DEVinstSize*/ &B3SOIPDiSize, - /* DEVmodSize*/ &B3SOIPDmSize + /* DEVmodSize*/ &B3SOIPDmSize, + /* DEVnodeIsNonLinear */ B3SOIPDnodeIsNonLinear }; SPICEdev * diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdnode.c b/src/spicelib/devices/bsim3soi_pd/b3soipdnode.c new file mode 100644 index 000000000..3c448e0b3 --- /dev/null +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdnode.c @@ -0,0 +1,55 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "b3soipddef.h" +#include "ngspice/sperror.h" + +int +B3SOIPDnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + B3SOIPDmodel *model = (B3SOIPDmodel *)inModel ; + B3SOIPDinstance *here ; + + /* loop through all the B3SOIPD models */ + for ( ; model != NULL ; model = model->B3SOIPDnextModel) + { + /* loop through all the instances of the model */ + for (here = model->B3SOIPDinstances ; here != NULL ; here = here->B3SOIPDnextInstance) + { + ckt->CKTnodeIsLinear [here->B3SOIPDdNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDsNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDtempNode] = 0 ; + if (here->B3SOIPDdebugMod != 0) + { + ckt->CKTnodeIsLinear [here->B3SOIPDvbsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDidsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDicNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDibsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDibdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDiiiNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDigNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDgiggNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDgigdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDgigbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDigidlNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDitunNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDibpNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDcbbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDcbdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDcbgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDqbfNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDqjsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDqjdNode] = 0 ; + } + ckt->CKTnodeIsLinear [here->B3SOIPDgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B3SOIPDpNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim3v0/Makefile.am b/src/spicelib/devices/bsim3v0/Makefile.am index 4db27a86d..c5d136942 100644 --- a/src/spicelib/devices/bsim3v0/Makefile.am +++ b/src/spicelib/devices/bsim3v0/Makefile.am @@ -14,6 +14,7 @@ libbsim3v0_la_SOURCES = \ b3v0mask.c \ b3v0mdel.c \ b3v0mpar.c \ + b3v0node.c \ b3v0noi.c \ b3v0par.c \ b3v0pzld.c \ diff --git a/src/spicelib/devices/bsim3v0/b3v0node.c b/src/spicelib/devices/bsim3v0/b3v0node.c new file mode 100644 index 000000000..6feab17db --- /dev/null +++ b/src/spicelib/devices/bsim3v0/b3v0node.c @@ -0,0 +1,31 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim3v0def.h" +#include "ngspice/sperror.h" + +int +BSIM3v0nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3v0model *model = (BSIM3v0model *)inModel ; + BSIM3v0instance *here ; + + /* loop through all the BSIM3v0 models */ + for ( ; model != NULL ; model = model->BSIM3v0nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM3v0instances ; here != NULL ; here = here->BSIM3v0nextInstance) + { + ckt->CKTnodeIsLinear [here->BSIM3v0dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v0sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v0qNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v0gNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v0bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim3v0/bsim3v0ext.h b/src/spicelib/devices/bsim3v0/bsim3v0ext.h index 02ad75173..efbeea27e 100644 --- a/src/spicelib/devices/bsim3v0/bsim3v0ext.h +++ b/src/spicelib/devices/bsim3v0/bsim3v0ext.h @@ -26,5 +26,5 @@ extern int BSIM3v0setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int BSIM3v0temp(GENmodel*,CKTcircuit*); extern int BSIM3v0trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3v0noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int BSIM3v0unsetup(GENmodel *, CKTcircuit *); - +extern int BSIM3v0unsetup(GENmodel *, CKTcircuit *); +extern int BSIM3v0nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim3v0/bsim3v0init.c b/src/spicelib/devices/bsim3v0/bsim3v0init.c index 43a8e1575..3b7588b42 100644 --- a/src/spicelib/devices/bsim3v0/bsim3v0init.c +++ b/src/spicelib/devices/bsim3v0/bsim3v0init.c @@ -70,7 +70,8 @@ SPICEdev B3v0info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &BSIM3v0iSize, - /* DEVmodSize */ &BSIM3v0mSize + /* DEVmodSize */ &BSIM3v0mSize, + /* DEVnodeIsNonLinear */ BSIM3v0nodeIsNonLinear }; diff --git a/src/spicelib/devices/bsim3v1/Makefile.am b/src/spicelib/devices/bsim3v1/Makefile.am index 9ede60cb9..0a6708b07 100644 --- a/src/spicelib/devices/bsim3v1/Makefile.am +++ b/src/spicelib/devices/bsim3v1/Makefile.am @@ -15,6 +15,7 @@ libbsim3v1_la_SOURCES = \ b3v1mask.c \ b3v1mdel.c \ b3v1mpar.c \ + b3v1node.c \ b3v1noi.c \ b3v1par.c \ b3v1pzld.c \ diff --git a/src/spicelib/devices/bsim3v1/b3v1node.c b/src/spicelib/devices/bsim3v1/b3v1node.c new file mode 100644 index 000000000..2349d7e11 --- /dev/null +++ b/src/spicelib/devices/bsim3v1/b3v1node.c @@ -0,0 +1,31 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim3v1def.h" +#include "ngspice/sperror.h" + +int +BSIM3v1nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3v1model *model = (BSIM3v1model *)inModel ; + BSIM3v1instance *here ; + + /* loop through all the BSIM3v1 models */ + for ( ; model != NULL ; model = model->BSIM3v1nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM3v1instances ; here != NULL ; here = here->BSIM3v1nextInstance) + { + ckt->CKTnodeIsLinear [here->BSIM3v1dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v1sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v1qNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v1gNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v1bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim3v1/bsim3v1ext.h b/src/spicelib/devices/bsim3v1/bsim3v1ext.h index 67c96c37e..a3c9c304d 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1ext.h +++ b/src/spicelib/devices/bsim3v1/bsim3v1ext.h @@ -28,4 +28,4 @@ extern int BSIM3v1temp(GENmodel *, CKTcircuit *); extern int BSIM3v1trunc(GENmodel *, CKTcircuit *, double *); extern int BSIM3v1noise(int, int, GENmodel *, CKTcircuit *, Ndata *, double *); extern int BSIM3v1unsetup(GENmodel *, CKTcircuit *); - +extern int BSIM3v1nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim3v1/bsim3v1init.c b/src/spicelib/devices/bsim3v1/bsim3v1init.c index 170807bdb..19c7ad160 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1init.c +++ b/src/spicelib/devices/bsim3v1/bsim3v1init.c @@ -70,7 +70,8 @@ SPICEdev BSIM3v1info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &BSIM3v1iSize, - /* DEVmodSize */ &BSIM3v1mSize + /* DEVmodSize */ &BSIM3v1mSize, + /* DEVnodeIsNonLinear */ BSIM3v1nodeIsNonLinear }; diff --git a/src/spicelib/devices/bsim3v32/Makefile.am b/src/spicelib/devices/bsim3v32/Makefile.am index 37674d382..9a67b1d40 100644 --- a/src/spicelib/devices/bsim3v32/Makefile.am +++ b/src/spicelib/devices/bsim3v32/Makefile.am @@ -15,6 +15,7 @@ libbsim3v32_la_SOURCES = \ b3v32mask.c \ b3v32mdel.c \ b3v32mpar.c \ + b3v32node.c \ b3v32noi.c \ b3v32par.c \ b3v32pzld.c \ diff --git a/src/spicelib/devices/bsim3v32/b3v32node.c b/src/spicelib/devices/bsim3v32/b3v32node.c new file mode 100644 index 000000000..8cdba132d --- /dev/null +++ b/src/spicelib/devices/bsim3v32/b3v32node.c @@ -0,0 +1,31 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim3v32def.h" +#include "ngspice/sperror.h" + +int +BSIM3v32nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3v32model *model = (BSIM3v32model *)inModel ; + BSIM3v32instance *here ; + + /* loop through all the BSIM3v32 models */ + for ( ; model != NULL ; model = model->BSIM3v32nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM3v32instances ; here != NULL ; here = here->BSIM3v32nextInstance) + { + ckt->CKTnodeIsLinear [here->BSIM3v32dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v32sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v32qNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v32gNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM3v32bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim3v32/bsim3v32ext.h b/src/spicelib/devices/bsim3v32/bsim3v32ext.h index b64496f6d..ce6d0cd1b 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32ext.h +++ b/src/spicelib/devices/bsim3v32/bsim3v32ext.h @@ -29,3 +29,4 @@ extern int BSIM3v32temp(GENmodel*,CKTcircuit*); extern int BSIM3v32trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3v32noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3v32unsetup(GENmodel*,CKTcircuit*); +extern int BSIM3v32nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim3v32/bsim3v32init.c b/src/spicelib/devices/bsim3v32/bsim3v32init.c index 544a189d6..0bdd10f04 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32init.c +++ b/src/spicelib/devices/bsim3v32/bsim3v32init.c @@ -71,7 +71,8 @@ SPICEdev BSIM3v32info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &BSIM3v32iSize, - /* DEVmodSize */ &BSIM3v32mSize + /* DEVmodSize */ &BSIM3v32mSize, + /* DEVnodeIsNonLinear */ BSIM3v32nodeIsNonLinear }; diff --git a/src/spicelib/devices/bsim4/Makefile.am b/src/spicelib/devices/bsim4/Makefile.am index 9403a4129..862f52ae7 100644 --- a/src/spicelib/devices/bsim4/Makefile.am +++ b/src/spicelib/devices/bsim4/Makefile.am @@ -16,6 +16,7 @@ libbsim4_la_SOURCES = \ b4mask.c \ b4mdel.c \ b4mpar.c \ + b4node.c \ b4noi.c \ b4par.c \ b4pzld.c \ diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c new file mode 100644 index 000000000..dfb6b7cda --- /dev/null +++ b/src/spicelib/devices/bsim4/b4node.c @@ -0,0 +1,46 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim4def.h" +#include "ngspice/sperror.h" + +int +BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4model *model = (BSIM4model *)inModel ; + BSIM4instance *here ; + + /* loop through all the BSIM4 models */ + for ( ; model != NULL ; model = model->BSIM4nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4instances ; here != NULL ; here = here->BSIM4nextInstance) + { + +#ifdef STEPDEBUG + fprintf (stderr, "here->BSIM4dNodePrime: %d\n", here->BSIM4dNodePrime) ; + fprintf (stderr, "here->BSIM4sNodePrime: %d\n", here->BSIM4sNodePrime) ; + fprintf (stderr, "here->BSIM4gNodePrime: %d\n", here->BSIM4gNodePrime) ; + fprintf (stderr, "here->BSIM4gNodeMid: %d\n", here->BSIM4gNodeMid) ; + fprintf (stderr, "here->BSIM4dbNode: %d\n", here->BSIM4dbNode) ; + fprintf (stderr, "here->BSIM4bNodePrime: %d\n", here->BSIM4bNodePrime) ; + fprintf (stderr, "here->BSIM4sbNode: %d\n", here->BSIM4sbNode) ; + fprintf (stderr, "here->BSIM4qNode: %d\n", here->BSIM4qNode) ; +#endif + + ckt->CKTnodeIsLinear [here->BSIM4dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4sNodePrime] = 0 ; +// ckt->CKTnodeIsLinear [here->BSIM4gNodePrime] = 0 ; +// ckt->CKTnodeIsLinear [here->BSIM4gNodeMid] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4dbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4bNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4sbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4qNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim4/bsim4ext.h b/src/spicelib/devices/bsim4/bsim4ext.h index 171406ae5..965951f03 100644 --- a/src/spicelib/devices/bsim4/bsim4ext.h +++ b/src/spicelib/devices/bsim4/bsim4ext.h @@ -28,3 +28,4 @@ extern int BSIM4temp(GENmodel*,CKTcircuit*); extern int BSIM4trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4unsetup(GENmodel*,CKTcircuit*); +extern int BSIM4nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim4/bsim4init.c b/src/spicelib/devices/bsim4/bsim4init.c index 88b4fd97c..b447a927a 100644 --- a/src/spicelib/devices/bsim4/bsim4init.c +++ b/src/spicelib/devices/bsim4/bsim4init.c @@ -72,7 +72,8 @@ SPICEdev BSIM4info = { NULL, /* DEVacct */ #endif &BSIM4iSize, /* DEVinstSize */ - &BSIM4mSize /* DEVmodSize */ + &BSIM4mSize, /* DEVmodSize */ + BSIM4nodeIsNonLinear /* DEVnodeIsNonLinear */ }; diff --git a/src/spicelib/devices/bsim4v4/Makefile.am b/src/spicelib/devices/bsim4v4/Makefile.am index a4f55eb42..c92a2a6e3 100644 --- a/src/spicelib/devices/bsim4v4/Makefile.am +++ b/src/spicelib/devices/bsim4v4/Makefile.am @@ -16,6 +16,7 @@ libbsim4v4_la_SOURCES = \ b4v4mask.c \ b4v4mdel.c \ b4v4mpar.c \ + b4v4node.c \ b4v4noi.c \ b4v4par.c \ b4v4pzld.c \ diff --git a/src/spicelib/devices/bsim4v4/b4v4node.c b/src/spicelib/devices/bsim4v4/b4v4node.c new file mode 100644 index 000000000..a033750a0 --- /dev/null +++ b/src/spicelib/devices/bsim4v4/b4v4node.c @@ -0,0 +1,34 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim4v4def.h" +#include "ngspice/sperror.h" + +int +BSIM4v4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v4model *model = (BSIM4v4model *)inModel ; + BSIM4v4instance *here ; + + /* loop through all the BSIM4v4 models */ + for ( ; model != NULL ; model = model->BSIM4v4nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4v4instances ; here != NULL ; here = here->BSIM4v4nextInstance) + { + ckt->CKTnodeIsLinear [here->BSIM4v4dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v4sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v4gNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v4gNodeMid] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v4dbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v4bNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v4sbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v4qNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim4v4/bsim4v4ext.h b/src/spicelib/devices/bsim4v4/bsim4v4ext.h index fd5fce099..70bf7fb40 100644 --- a/src/spicelib/devices/bsim4v4/bsim4v4ext.h +++ b/src/spicelib/devices/bsim4v4/bsim4v4ext.h @@ -29,5 +29,4 @@ extern int BSIM4v4temp(GENmodel*,CKTcircuit*); extern int BSIM4v4trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4v4noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v4unsetup(GENmodel*,CKTcircuit*); - - +extern int BSIM4v4nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim4v4/bsim4v4init.c b/src/spicelib/devices/bsim4v4/bsim4v4init.c index b50bd92fa..e72a4a9e0 100644 --- a/src/spicelib/devices/bsim4v4/bsim4v4init.c +++ b/src/spicelib/devices/bsim4v4/bsim4v4init.c @@ -72,7 +72,8 @@ SPICEdev BSIM4v4info = { NULL, /* DEVacct */ #endif &BSIM4v4iSize, /* DEVinstSize */ - &BSIM4v4mSize /* DEVmodSize */ + &BSIM4v4mSize, /* DEVmodSize */ + BSIM4v4nodeIsNonLinear /* DEVnodeIsNonLinear */ }; diff --git a/src/spicelib/devices/bsim4v5/Makefile.am b/src/spicelib/devices/bsim4v5/Makefile.am index a7ab65505..ec5a80d91 100644 --- a/src/spicelib/devices/bsim4v5/Makefile.am +++ b/src/spicelib/devices/bsim4v5/Makefile.am @@ -16,6 +16,7 @@ libbsim4v5_la_SOURCES = \ b4v5mask.c \ b4v5mdel.c \ b4v5mpar.c \ + b4v5node.c \ b4v5noi.c \ b4v5par.c \ b4v5pzld.c \ diff --git a/src/spicelib/devices/bsim4v5/b4v5node.c b/src/spicelib/devices/bsim4v5/b4v5node.c new file mode 100644 index 000000000..c344a6167 --- /dev/null +++ b/src/spicelib/devices/bsim4v5/b4v5node.c @@ -0,0 +1,34 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim4v5def.h" +#include "ngspice/sperror.h" + +int +BSIM4v5nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v5model *model = (BSIM4v5model *)inModel ; + BSIM4v5instance *here ; + + /* loop through all the BSIM4v5 models */ + for ( ; model != NULL ; model = model->BSIM4v5nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4v5instances ; here != NULL ; here = here->BSIM4v5nextInstance) + { + ckt->CKTnodeIsLinear [here->BSIM4v5dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v5sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v5gNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v5gNodeMid] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v5dbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v5bNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v5sbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v5qNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim4v5/bsim4v5ext.h b/src/spicelib/devices/bsim4v5/bsim4v5ext.h index 511969bfb..35f5989d3 100644 --- a/src/spicelib/devices/bsim4v5/bsim4v5ext.h +++ b/src/spicelib/devices/bsim4v5/bsim4v5ext.h @@ -28,3 +28,4 @@ extern int BSIM4v5temp(GENmodel*,CKTcircuit*); extern int BSIM4v5trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4v5noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v5unsetup(GENmodel*,CKTcircuit*); +extern int BSIM4v5nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim4v5/bsim4v5init.c b/src/spicelib/devices/bsim4v5/bsim4v5init.c index 5289072a7..3bc4fb9c9 100644 --- a/src/spicelib/devices/bsim4v5/bsim4v5init.c +++ b/src/spicelib/devices/bsim4v5/bsim4v5init.c @@ -72,7 +72,8 @@ SPICEdev BSIM4v5info = { NULL, /* DEVacct */ #endif &BSIM4v5iSize, /* DEVinstSize */ - &BSIM4v5mSize /* DEVmodSize */ + &BSIM4v5mSize, /* DEVmodSize */ + BSIM4v5nodeIsNonLinear /* DEVnodeIsNonLinear */ }; diff --git a/src/spicelib/devices/bsim4v6/Makefile.am b/src/spicelib/devices/bsim4v6/Makefile.am index 0815d57eb..4e4b9644a 100644 --- a/src/spicelib/devices/bsim4v6/Makefile.am +++ b/src/spicelib/devices/bsim4v6/Makefile.am @@ -5,21 +5,22 @@ noinst_LTLIBRARIES = libbsim4v6.la libbsim4v6_la_SOURCES = \ b4v6.c \ b4v6acld.c \ - b4v6ask.c \ + b4v6ask.c \ b4v6check.c \ b4v6cvtest.c \ - b4v6del.c \ + b4v6del.c \ b4v6dest.c \ - b4v6geo.c \ + b4v6geo.c \ b4v6getic.c \ - b4v6ld.c \ + b4v6ld.c \ b4v6mask.c \ b4v6mdel.c \ b4v6mpar.c \ - b4v6noi.c \ - b4v6par.c \ + b4v6node.c \ + b4v6noi.c \ + b4v6par.c \ b4v6pzld.c \ - b4v6set.c \ + b4v6set.c \ b4v6temp.c \ b4v6trunc.c \ bsim4v6def.h \ diff --git a/src/spicelib/devices/bsim4v6/b4v6node.c b/src/spicelib/devices/bsim4v6/b4v6node.c new file mode 100644 index 000000000..f63e4cf38 --- /dev/null +++ b/src/spicelib/devices/bsim4v6/b4v6node.c @@ -0,0 +1,34 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim4v6def.h" +#include "ngspice/sperror.h" + +int +BSIM4v6nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v6model *model = (BSIM4v6model *)inModel ; + BSIM4v6instance *here ; + + /* loop through all the BSIM4v6 models */ + for ( ; model != NULL ; model = model->BSIM4v6nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4v6instances ; here != NULL ; here = here->BSIM4v6nextInstance) + { + ckt->CKTnodeIsLinear [here->BSIM4v6dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v6sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v6gNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v6gNodeMid] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v6dbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v6bNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v6sbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4v6qNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim4v6/bsim4v6ext.h b/src/spicelib/devices/bsim4v6/bsim4v6ext.h index c78426430..7bb9f6b12 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6ext.h +++ b/src/spicelib/devices/bsim4v6/bsim4v6ext.h @@ -28,3 +28,4 @@ extern int BSIM4v6temp(GENmodel*,CKTcircuit*); extern int BSIM4v6trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4v6noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v6unsetup(GENmodel*,CKTcircuit*); +extern int BSIM4v6nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsim4v6/bsim4v6init.c b/src/spicelib/devices/bsim4v6/bsim4v6init.c index 96b027d7e..519d0ff1d 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6init.c +++ b/src/spicelib/devices/bsim4v6/bsim4v6init.c @@ -72,7 +72,8 @@ SPICEdev BSIM4v6info = { NULL, /* DEVacct */ #endif &BSIM4v6iSize, /* DEVinstSize */ - &BSIM4v6mSize /* DEVmodSize */ + &BSIM4v6mSize, /* DEVmodSize */ + BSIM4v6nodeIsNonLinear /* DEVnodeIsNonLinear */ }; diff --git a/src/spicelib/devices/bsimsoi/Makefile.am b/src/spicelib/devices/bsimsoi/Makefile.am index 7a7ed8ea0..ece831287 100644 --- a/src/spicelib/devices/bsimsoi/Makefile.am +++ b/src/spicelib/devices/bsimsoi/Makefile.am @@ -2,30 +2,31 @@ noinst_LTLIBRARIES = libbsim4soi.la -libbsim4soi_la_SOURCES = \ - b4soi.c \ - b4soiacld.c \ - b4soiask.c \ - b4soicheck.c \ - b4soicvtest.c \ - b4soidel.c \ - b4soidest.c \ - b4soigetic.c \ - b4soild.c \ - b4soimask.c \ - b4soimdel.c \ - b4soimpar.c \ - b4soinoi.c \ - b4soipar.c \ - b4soipzld.c \ - b4soiset.c \ - b4soitemp.c \ - b4soitrunc.c \ - b4soidef.h \ - b4soiext.h \ - b4soiinit.c \ - b4soiinit.h \ - b4soiitf.h +libbsim4soi_la_SOURCES = \ + b4soi.c \ + b4soiacld.c \ + b4soiask.c \ + b4soicheck.c \ + b4soicvtest.c \ + b4soidel.c \ + b4soidest.c \ + b4soigetic.c \ + b4soild.c \ + b4soimask.c \ + b4soimdel.c \ + b4soimpar.c \ + b4soinode.c \ + b4soinoi.c \ + b4soipar.c \ + b4soipzld.c \ + b4soiset.c \ + b4soitemp.c \ + b4soitrunc.c \ + b4soidef.h \ + b4soiext.h \ + b4soiinit.c \ + b4soiinit.h \ + b4soiitf.h diff --git a/src/spicelib/devices/bsimsoi/b4soiext.h b/src/spicelib/devices/bsimsoi/b4soiext.h index a3c663f6f..0ec40e28a 100644 --- a/src/spicelib/devices/bsimsoi/b4soiext.h +++ b/src/spicelib/devices/bsimsoi/b4soiext.h @@ -30,3 +30,4 @@ extern int B4SOItemp(GENmodel*,CKTcircuit*); extern int B4SOItrunc(GENmodel*,CKTcircuit*,double*); extern int B4SOInoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B4SOIunsetup(GENmodel*,CKTcircuit*); +extern int B4SOInodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/bsimsoi/b4soiinit.c b/src/spicelib/devices/bsimsoi/b4soiinit.c index fa88a6740..25835aa24 100644 --- a/src/spicelib/devices/bsimsoi/b4soiinit.c +++ b/src/spicelib/devices/bsimsoi/b4soiinit.c @@ -70,7 +70,8 @@ SPICEdev B4SOIinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &B4SOIiSize, - /* DEVmodSize */ &B4SOImSize + /* DEVmodSize */ &B4SOImSize, + /* DEVnodeIsNonLinear */ B4SOInodeIsNonLinear }; SPICEdev * diff --git a/src/spicelib/devices/bsimsoi/b4soinode.c b/src/spicelib/devices/bsimsoi/b4soinode.c new file mode 100644 index 000000000..7b6b8c9b1 --- /dev/null +++ b/src/spicelib/devices/bsimsoi/b4soinode.c @@ -0,0 +1,58 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "b4soidef.h" +#include "ngspice/sperror.h" + +int +B4SOInodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + B4SOImodel *model = (B4SOImodel *)inModel ; + B4SOIinstance *here ; + + /* loop through all the BSIMSOI models */ + for ( ; model != NULL ; model = model->B4SOInextModel) + { + /* loop through all the instances of the model */ + for (here = model->B4SOIinstances ; here != NULL ; here = here->B4SOInextInstance) + { + ckt->CKTnodeIsLinear [here->B4SOIdNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIsNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOItempNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIgNodeMid] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIdbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIsbNode] = 0 ; + if (here->B4SOIdebugMod != 0) + { + ckt->CKTnodeIsLinear [here->B4SOIvbsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIidsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIicNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIibsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIibdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIiiiNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIigNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIgiggNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIgigdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIgigbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIigidlNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIitunNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIibpNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIcbbNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIcbdNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIcbgNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIqbfNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIqjsNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIqjdNode] = 0 ; + } + ckt->CKTnodeIsLinear [here->B4SOIeNode] = 0 ; + ckt->CKTnodeIsLinear [here->B4SOIpNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/cap/capinit.c b/src/spicelib/devices/cap/capinit.c index 5e0b14fc5..fe5f37122 100644 --- a/src/spicelib/devices/cap/capinit.c +++ b/src/spicelib/devices/cap/capinit.c @@ -71,7 +71,8 @@ SPICEdev CAPinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &CAPiSize, - /* DEVmodSize */ &CAPmSize + /* DEVmodSize */ &CAPmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/cccs/cccsinit.c b/src/spicelib/devices/cccs/cccsinit.c index 1a86cb79c..15fb3f063 100644 --- a/src/spicelib/devices/cccs/cccsinit.c +++ b/src/spicelib/devices/cccs/cccsinit.c @@ -71,7 +71,8 @@ SPICEdev CCCSinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &CCCSiSize, - /* DEVmodSize */ &CCCSmSize + /* DEVmodSize */ &CCCSmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/ccvs/ccvsinit.c b/src/spicelib/devices/ccvs/ccvsinit.c index 24ad03d9f..a52895f19 100644 --- a/src/spicelib/devices/ccvs/ccvsinit.c +++ b/src/spicelib/devices/ccvs/ccvsinit.c @@ -72,7 +72,8 @@ SPICEdev CCVSinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &CCVSiSize, - /* DEVmodSize */ &CCVSmSize + /* DEVmodSize */ &CCVSmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/cpl/cplinit.c b/src/spicelib/devices/cpl/cplinit.c index a2a987c54..51575227d 100644 --- a/src/spicelib/devices/cpl/cplinit.c +++ b/src/spicelib/devices/cpl/cplinit.c @@ -72,7 +72,8 @@ SPICEdev CPLinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &CPLiSize, -/* DEVmodSize */ &CPLmSize +/* DEVmodSize */ &CPLmSize, +/* DEVnodeIsLinear */ NULL }; diff --git a/src/spicelib/devices/csw/cswinit.c b/src/spicelib/devices/csw/cswinit.c index 2ad8fd87a..a536ef7a1 100644 --- a/src/spicelib/devices/csw/cswinit.c +++ b/src/spicelib/devices/csw/cswinit.c @@ -74,7 +74,8 @@ SPICEdev CSWinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &CSWiSize, - /* DEVmodSize */ &CSWmSize + /* DEVmodSize */ &CSWmSize, + /* DEVnodeIsLinear */ NULL }; diff --git a/src/spicelib/devices/dio/Makefile.am b/src/spicelib/devices/dio/Makefile.am index 7218d39b0..9b9f9cba5 100644 --- a/src/spicelib/devices/dio/Makefile.am +++ b/src/spicelib/devices/dio/Makefile.am @@ -21,6 +21,7 @@ libdio_la_SOURCES = \ diomask.c \ diomdel.c \ diompar.c \ + dionode.c \ dionoise.c \ dioparam.c \ diopzld.c \ diff --git a/src/spicelib/devices/dio/dioext.h b/src/spicelib/devices/dio/dioext.h index bb0a132d0..4583195cb 100644 --- a/src/spicelib/devices/dio/dioext.h +++ b/src/spicelib/devices/dio/dioext.h @@ -28,4 +28,4 @@ extern int DIOtrunc(GENmodel*,CKTcircuit*,double*); extern int DIOdisto(int,GENmodel*,CKTcircuit*); extern int DIOnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int DIOdSetup(DIOmodel*,CKTcircuit*); - +extern int DIOnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/dio/dioinit.c b/src/spicelib/devices/dio/dioinit.c index 9ccece87e..68075152f 100644 --- a/src/spicelib/devices/dio/dioinit.c +++ b/src/spicelib/devices/dio/dioinit.c @@ -73,7 +73,8 @@ SPICEdev DIOinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &DIOiSize, - /* DEVmodSize */ &DIOmSize + /* DEVmodSize */ &DIOmSize, + /* DEVnodeIsNonLinear */ DIOnodeIsNonLinear }; diff --git a/src/spicelib/devices/dio/dionode.c b/src/spicelib/devices/dio/dionode.c new file mode 100644 index 000000000..0f19a8795 --- /dev/null +++ b/src/spicelib/devices/dio/dionode.c @@ -0,0 +1,28 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "diodefs.h" +#include "ngspice/sperror.h" + +int +DIOnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + DIOmodel *model = (DIOmodel *)inModel ; + DIOinstance *here ; + + /* loop through all the DIO models */ + for ( ; model != NULL ; model = model->DIOnextModel) + { + /* loop through all the instances of the model */ + for (here = model->DIOinstances ; here != NULL ; here = here->DIOnextInstance) + { + ckt->CKTnodeIsLinear [here->DIOposPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->DIOnegNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/hfet1/Makefile.am b/src/spicelib/devices/hfet1/Makefile.am index 5d9ef9eee..d2d1a21b7 100644 --- a/src/spicelib/devices/hfet1/Makefile.am +++ b/src/spicelib/devices/hfet1/Makefile.am @@ -18,6 +18,7 @@ libhfet_la_SOURCES = \ hfetmask.c \ hfetmdel.c \ hfetmpar.c \ + hfetnode.c \ hfetparam.c \ hfetpzl.c \ hfetsetup.c \ diff --git a/src/spicelib/devices/hfet1/hfetext.h b/src/spicelib/devices/hfet1/hfetext.h index 36d866f2d..caa55afe7 100644 --- a/src/spicelib/devices/hfet1/hfetext.h +++ b/src/spicelib/devices/hfet1/hfetext.h @@ -18,3 +18,4 @@ extern int HFETAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int HFETAtemp(GENmodel*,CKTcircuit*); extern int HFETAtrunc(GENmodel*,CKTcircuit*,double*); extern int HFETAunsetup(GENmodel*,CKTcircuit*); +extern int HFETAnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/hfet1/hfetinit.c b/src/spicelib/devices/hfet1/hfetinit.c index 9affd0801..8cff12d4e 100644 --- a/src/spicelib/devices/hfet1/hfetinit.c +++ b/src/spicelib/devices/hfet1/hfetinit.c @@ -72,7 +72,8 @@ SPICEdev HFETAinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &HFETAiSize, - /* DEVmodSize */ &HFETAmSize + /* DEVmodSize */ &HFETAmSize, + /* DEVnodeIsNonLinear */ HFETAnodeIsNonLinear }; diff --git a/src/spicelib/devices/hfet1/hfetnode.c b/src/spicelib/devices/hfet1/hfetnode.c new file mode 100644 index 000000000..90c5612ab --- /dev/null +++ b/src/spicelib/devices/hfet1/hfetnode.c @@ -0,0 +1,31 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "hfetdefs.h" +#include "ngspice/sperror.h" + +int +HFETAnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + HFETAmodel *model = (HFETAmodel *)inModel ; + HFETAinstance *here ; + + /* loop through all the HFETA models */ + for ( ; model != NULL ; model = model->HFETAnextModel) + { + /* loop through all the instances of the model */ + for (here = model->HFETAinstances ; here != NULL ; here = here->HFETAnextInstance) + { + ckt->CKTnodeIsLinear [here->HFETAsourcePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->HFETAdrainPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->HFETAgatePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->HFETAdrainPrmPrmNode] = 0 ; + ckt->CKTnodeIsLinear [here->HFETAsourcePrmPrmNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/hfet2/Makefile.am b/src/spicelib/devices/hfet2/Makefile.am index 743fae0a2..b0a8c5b0f 100644 --- a/src/spicelib/devices/hfet2/Makefile.am +++ b/src/spicelib/devices/hfet2/Makefile.am @@ -18,6 +18,7 @@ libhfet2_la_SOURCES = \ hfet2mask.c \ hfet2mdel.c \ hfet2mpar.c \ + hfet2node.c \ hfet2param.c \ hfet2pzl.c \ hfet2setup.c \ diff --git a/src/spicelib/devices/hfet2/hfet2ext.h b/src/spicelib/devices/hfet2/hfet2ext.h index 243861744..75369a790 100644 --- a/src/spicelib/devices/hfet2/hfet2ext.h +++ b/src/spicelib/devices/hfet2/hfet2ext.h @@ -18,3 +18,4 @@ extern int HFET2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int HFET2temp(GENmodel*,CKTcircuit*); extern int HFET2trunc(GENmodel*,CKTcircuit*,double*); extern int HFET2unsetup( GENmodel*,CKTcircuit*); +extern int HFET2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/hfet2/hfet2init.c b/src/spicelib/devices/hfet2/hfet2init.c index 10de5b4d5..f66633a86 100644 --- a/src/spicelib/devices/hfet2/hfet2init.c +++ b/src/spicelib/devices/hfet2/hfet2init.c @@ -72,7 +72,8 @@ SPICEdev HFET2info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &HFET2iSize, - /* DEVmodSize */ &HFET2mSize + /* DEVmodSize */ &HFET2mSize, + /* DEVnodeIsNonLinear */ HFET2nodeIsNonLinear }; diff --git a/src/spicelib/devices/hfet2/hfet2node.c b/src/spicelib/devices/hfet2/hfet2node.c new file mode 100644 index 000000000..30bcaeec4 --- /dev/null +++ b/src/spicelib/devices/hfet2/hfet2node.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "hfet2defs.h" +#include "ngspice/sperror.h" + +int +HFET2nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + HFET2model *model = (HFET2model *)inModel ; + HFET2instance *here ; + + /* loop through all the HFET2 models */ + for ( ; model != NULL ; model = model->HFET2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->HFET2instances ; here != NULL ; here = here->HFET2nextInstance) + { + ckt->CKTnodeIsLinear [here->HFET2sourcePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->HFET2drainPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->HFET2gateNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/hisim2/Makefile.am b/src/spicelib/devices/hisim2/Makefile.am index 33fff2074..ef0c313be 100644 --- a/src/spicelib/devices/hisim2/Makefile.am +++ b/src/spicelib/devices/hisim2/Makefile.am @@ -23,6 +23,7 @@ libhisim2_la_SOURCES = hisim2.h \ hsm2mask.c \ hsm2mdel.c \ hsm2mpar.c \ + hsm2node.c \ hsm2noi.c \ hsm2par.c \ hsm2pzld.c \ diff --git a/src/spicelib/devices/hisim2/hsm2ext.h b/src/spicelib/devices/hisim2/hsm2ext.h index 0d7225cd2..6eda4563c 100644 --- a/src/spicelib/devices/hisim2/hsm2ext.h +++ b/src/spicelib/devices/hisim2/hsm2ext.h @@ -37,3 +37,4 @@ extern int HSM2unsetup(GENmodel*,CKTcircuit*); extern int HSM2temp(GENmodel*,CKTcircuit*); extern int HSM2trunc(GENmodel*,CKTcircuit*,double*); extern int HSM2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int HSM2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/hisim2/hsm2init.c b/src/spicelib/devices/hisim2/hsm2init.c index 28c526e2f..337ef7ebf 100644 --- a/src/spicelib/devices/hisim2/hsm2init.c +++ b/src/spicelib/devices/hisim2/hsm2init.c @@ -70,7 +70,8 @@ SPICEdev HSM2info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &HSM2iSize, - /* DEVmodSize */ &HSM2mSize + /* DEVmodSize */ &HSM2mSize, + /* DEVnodeIsNonLinear */ HSM2nodeIsNonLinear }; diff --git a/src/spicelib/devices/hisim2/hsm2node.c b/src/spicelib/devices/hisim2/hsm2node.c new file mode 100644 index 000000000..9dd8c8ca1 --- /dev/null +++ b/src/spicelib/devices/hisim2/hsm2node.c @@ -0,0 +1,32 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "hsm2def.h" +#include "ngspice/sperror.h" + +int +HSM2nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + HSM2model *model = (HSM2model *)inModel ; + HSM2instance *here ; + + /* loop through all the HSM2 models */ + for ( ; model != NULL ; model = model->HSM2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->HSM2instances ; here != NULL ; here = here->HSM2nextInstance) + { + ckt->CKTnodeIsLinear [here->HSM2dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->HSM2sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->HSM2gNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->HSM2dbNode] = 0 ; + ckt->CKTnodeIsLinear [here->HSM2bNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->HSM2sbNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/hisimhv1/Makefile.am b/src/spicelib/devices/hisimhv1/Makefile.am index ea6d9e6fe..3f6d13019 100644 --- a/src/spicelib/devices/hisimhv1/Makefile.am +++ b/src/spicelib/devices/hisimhv1/Makefile.am @@ -23,6 +23,7 @@ libhisimhv1_la_SOURCES = hisimhv.h \ hsmhvmask.c \ hsmhvmdel.c \ hsmhvmpar.c \ + hsmhvnode.c \ hsmhvnoi.c \ hsmhvpar.c \ hsmhvpzld.c \ diff --git a/src/spicelib/devices/hisimhv1/hsmhvext.h b/src/spicelib/devices/hisimhv1/hsmhvext.h index ec4f306bf..16ffdf799 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvext.h +++ b/src/spicelib/devices/hisimhv1/hsmhvext.h @@ -37,3 +37,4 @@ extern int HSMHVunsetup(GENmodel*,CKTcircuit*); extern int HSMHVtemp(GENmodel*,CKTcircuit*); extern int HSMHVtrunc(GENmodel*,CKTcircuit*,double*); extern int HSMHVnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int HSMHVnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/hisimhv1/hsmhvinit.c b/src/spicelib/devices/hisimhv1/hsmhvinit.c index 53d7759a0..d11f72b6a 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvinit.c +++ b/src/spicelib/devices/hisimhv1/hsmhvinit.c @@ -70,7 +70,8 @@ SPICEdev HSMHVinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &HSMHViSize, - /* DEVmodSize */ &HSMHVmSize + /* DEVmodSize */ &HSMHVmSize, + /* DEVnodeIsNonLinear */ HSMHVnodeIsNonLinear }; diff --git a/src/spicelib/devices/hisimhv1/hsmhvnode.c b/src/spicelib/devices/hisimhv1/hsmhvnode.c new file mode 100644 index 000000000..ded982f1c --- /dev/null +++ b/src/spicelib/devices/hisimhv1/hsmhvnode.c @@ -0,0 +1,35 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "hsmhvdef.h" +#include "ngspice/sperror.h" + +int +HSMHVnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + HSMHVmodel *model = (HSMHVmodel *)inModel ; + HSMHVinstance *here ; + + /* loop through all the HSMHV models */ + for ( ; model != NULL ; model = model->HSMHVnextModel) + { + /* loop through all the instances of the model */ + for (here = model->HSMHVinstances ; here != NULL ; here = here->HSMHVnextInstance) + { + ckt->CKTnodeIsLinear [here->HSMHVdNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->HSMHVsNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->HSMHVgNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->HSMHVdbNode] = 0 ; + ckt->CKTnodeIsLinear [here->HSMHVbNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->HSMHVsbNode] = 0 ; + ckt->CKTnodeIsLinear [here->HSMHVtempNode] = 0 ; + ckt->CKTnodeIsLinear [here->HSMHVqiNode] = 0 ; + ckt->CKTnodeIsLinear [here->HSMHVqbNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/ind/indinit.c b/src/spicelib/devices/ind/indinit.c index 7eea1fcd2..8e50bacad 100644 --- a/src/spicelib/devices/ind/indinit.c +++ b/src/spicelib/devices/ind/indinit.c @@ -71,7 +71,8 @@ SPICEdev INDinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &INDiSize, - /* DEVmodSize */ &INDmSize + /* DEVmodSize */ &INDmSize, + /* DEVnodeIsNonLinear */ NULL }; @@ -139,8 +140,9 @@ SPICEdev MUTinfo = { /* DEVdump */ NULL, /* DEVacct */ NULL, #endif - &MUTiSize, - &MUTmSize + /* DEVinstSize */ &MUTiSize, + /* DEVmodSize */ &MUTmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/isrc/isrcinit.c b/src/spicelib/devices/isrc/isrcinit.c index da4301fe7..3cfb594b3 100644 --- a/src/spicelib/devices/isrc/isrcinit.c +++ b/src/spicelib/devices/isrc/isrcinit.c @@ -72,7 +72,8 @@ SPICEdev ISRCinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &ISRCiSize, - /* DEVmodSize */ &ISRCmSize + /* DEVmodSize */ &ISRCmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/jfet/Makefile.am b/src/spicelib/devices/jfet/Makefile.am index fc4907373..638e5d4ba 100644 --- a/src/spicelib/devices/jfet/Makefile.am +++ b/src/spicelib/devices/jfet/Makefile.am @@ -20,6 +20,7 @@ libjfet_la_SOURCES = \ jfetmask.c \ jfetmdel.c \ jfetmpar.c \ + jfetnode.c \ jfetnoi.c \ jfetpar.c \ jfetpzld.c \ diff --git a/src/spicelib/devices/jfet/jfetext.h b/src/spicelib/devices/jfet/jfetext.h index 475bdbe1a..8d1bf7ab6 100644 --- a/src/spicelib/devices/jfet/jfetext.h +++ b/src/spicelib/devices/jfet/jfetext.h @@ -22,3 +22,4 @@ extern int JFETtrunc(GENmodel*,CKTcircuit*,double*); extern int JFETdisto(int,GENmodel*,CKTcircuit*); extern int JFETnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int JFETdSetup(GENmodel*,CKTcircuit*); +extern int JFETnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/jfet/jfetinit.c b/src/spicelib/devices/jfet/jfetinit.c index d2a67d1cf..04edab98c 100644 --- a/src/spicelib/devices/jfet/jfetinit.c +++ b/src/spicelib/devices/jfet/jfetinit.c @@ -72,7 +72,8 @@ SPICEdev JFETinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &JFETiSize, - /* DEVmodSize */ &JFETmSize + /* DEVmodSize */ &JFETmSize, + /* DEVnodeIsNonLinear */ JFETnodeIsNonLinear }; diff --git a/src/spicelib/devices/jfet/jfetnode.c b/src/spicelib/devices/jfet/jfetnode.c new file mode 100644 index 000000000..5a88f79ae --- /dev/null +++ b/src/spicelib/devices/jfet/jfetnode.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "jfetdefs.h" +#include "ngspice/sperror.h" + +int +JFETnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + JFETmodel *model = (JFETmodel *)inModel ; + JFETinstance *here ; + + /* loop through all the JFET models */ + for ( ; model != NULL ; model = model->JFETnextModel) + { + /* loop through all the instances of the model */ + for (here = model->JFETinstances ; here != NULL ; here = here->JFETnextInstance) + { + ckt->CKTnodeIsLinear [here->JFETsourcePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->JFETdrainPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->JFETgateNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/jfet2/Makefile.am b/src/spicelib/devices/jfet2/Makefile.am index f8789cd9b..2a4199507 100644 --- a/src/spicelib/devices/jfet2/Makefile.am +++ b/src/spicelib/devices/jfet2/Makefile.am @@ -18,6 +18,7 @@ libjfet2_la_SOURCES = \ jfet2mask.c \ jfet2mdel.c \ jfet2mpar.c \ + jfet2node.c \ jfet2noi.c \ jfet2par.c \ jfet2parm.h \ diff --git a/src/spicelib/devices/jfet2/jfet2ext.h b/src/spicelib/devices/jfet2/jfet2ext.h index fc330fe59..4ba82fdd8 100644 --- a/src/spicelib/devices/jfet2/jfet2ext.h +++ b/src/spicelib/devices/jfet2/jfet2ext.h @@ -22,3 +22,4 @@ extern int JFET2unsetup(GENmodel*,CKTcircuit*); extern int JFET2temp(GENmodel*,CKTcircuit*); extern int JFET2trunc(GENmodel*,CKTcircuit*,double*); extern int JFET2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int JFET2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/jfet2/jfet2init.c b/src/spicelib/devices/jfet2/jfet2init.c index 5f1ee084e..d152fbab2 100644 --- a/src/spicelib/devices/jfet2/jfet2init.c +++ b/src/spicelib/devices/jfet2/jfet2init.c @@ -72,7 +72,8 @@ SPICEdev JFET2info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &JFET2iSize, - /* DEVmodSize */ &JFET2mSize + /* DEVmodSize */ &JFET2mSize, + /* DEVnodeIsNonLinear */ JFET2nodeIsNonLinear }; diff --git a/src/spicelib/devices/jfet2/jfet2node.c b/src/spicelib/devices/jfet2/jfet2node.c new file mode 100644 index 000000000..0b41bc3ac --- /dev/null +++ b/src/spicelib/devices/jfet2/jfet2node.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "jfet2defs.h" +#include "ngspice/sperror.h" + +int +JFET2nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + JFET2model *model = (JFET2model *)inModel ; + JFET2instance *here ; + + /* loop through all the JFET2 models */ + for ( ; model != NULL ; model = model->JFET2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->JFET2instances ; here != NULL ; here = here->JFET2nextInstance) + { + ckt->CKTnodeIsLinear [here->JFET2sourcePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->JFET2drainPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->JFET2gateNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/ltra/ltrainit.c b/src/spicelib/devices/ltra/ltrainit.c index 5cb81e1bf..2bb17cc78 100644 --- a/src/spicelib/devices/ltra/ltrainit.c +++ b/src/spicelib/devices/ltra/ltrainit.c @@ -72,7 +72,8 @@ SPICEdev LTRAinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ <RAiSize, - /* DEVmodSize */ <RAmSize + /* DEVmodSize */ <RAmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/mes/Makefile.am b/src/spicelib/devices/mes/Makefile.am index 3d0c3b3d5..26abe963c 100644 --- a/src/spicelib/devices/mes/Makefile.am +++ b/src/spicelib/devices/mes/Makefile.am @@ -20,6 +20,7 @@ libmes_la_SOURCES = \ mesmask.c \ mesmdel.c \ mesmpar.c \ + mesnode.c \ mesnoise.c \ mesparam.c \ mespzld.c \ diff --git a/src/spicelib/devices/mes/mesext.h b/src/spicelib/devices/mes/mesext.h index 7ff419573..b9ccbbb78 100644 --- a/src/spicelib/devices/mes/mesext.h +++ b/src/spicelib/devices/mes/mesext.h @@ -22,4 +22,4 @@ extern int MEStrunc(GENmodel*,CKTcircuit*,double*); extern int MESdisto(int,GENmodel*,CKTcircuit*); extern int MESnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MESdSetup(GENmodel*,CKTcircuit*); - +extern int MESnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/mes/mesinit.c b/src/spicelib/devices/mes/mesinit.c index 81db8ac17..d39f2c89a 100644 --- a/src/spicelib/devices/mes/mesinit.c +++ b/src/spicelib/devices/mes/mesinit.c @@ -72,7 +72,8 @@ SPICEdev MESinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &MESiSize, - /* DEVmodSize */ &MESmSize + /* DEVmodSize */ &MESmSize, + /* DEVnodeIsNonLinear */ MESnodeIsNonLinear }; diff --git a/src/spicelib/devices/mes/mesnode.c b/src/spicelib/devices/mes/mesnode.c new file mode 100644 index 000000000..4e546167d --- /dev/null +++ b/src/spicelib/devices/mes/mesnode.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "mesdefs.h" +#include "ngspice/sperror.h" + +int +MESnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + MESmodel *model = (MESmodel *)inModel ; + MESinstance *here ; + + /* loop through all the MES models */ + for ( ; model != NULL ; model = model->MESnextModel) + { + /* loop through all the instances of the model */ + for (here = model->MESinstances ; here != NULL ; here = here->MESnextInstance) + { + ckt->CKTnodeIsLinear [here->MESsourcePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->MESdrainPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->MESgateNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/mesa/Makefile.am b/src/spicelib/devices/mesa/Makefile.am index 79e6f7555..119d4b60b 100644 --- a/src/spicelib/devices/mesa/Makefile.am +++ b/src/spicelib/devices/mesa/Makefile.am @@ -18,6 +18,7 @@ libmesa_la_SOURCES = \ mesamask.c \ mesamdel.c \ mesamparam.c \ + mesanode.c \ mesaparam.c \ mesapzl.c \ mesasetup.c \ diff --git a/src/spicelib/devices/mesa/mesaext.h b/src/spicelib/devices/mesa/mesaext.h index a1967cf44..6f6c1334d 100644 --- a/src/spicelib/devices/mesa/mesaext.h +++ b/src/spicelib/devices/mesa/mesaext.h @@ -18,3 +18,4 @@ extern int MESAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int MESAtemp(GENmodel*,CKTcircuit*); extern int MESAtrunc(GENmodel*,CKTcircuit*,double*); extern int MESAunsetup(GENmodel*,CKTcircuit*); +extern int MESAnodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/mesa/mesainit.c b/src/spicelib/devices/mesa/mesainit.c index fac27cc1e..2c9f42578 100644 --- a/src/spicelib/devices/mesa/mesainit.c +++ b/src/spicelib/devices/mesa/mesainit.c @@ -72,7 +72,8 @@ SPICEdev MESAinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &MESAiSize, - /* DEVmodSize */ &MESAmSize + /* DEVmodSize */ &MESAmSize, + /* DEVnodeIsNonLinear */ MESAnodeIsNonLinear }; diff --git a/src/spicelib/devices/mesa/mesanode.c b/src/spicelib/devices/mesa/mesanode.c new file mode 100644 index 000000000..857282738 --- /dev/null +++ b/src/spicelib/devices/mesa/mesanode.c @@ -0,0 +1,31 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "mesadefs.h" +#include "ngspice/sperror.h" + +int +MESAnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + MESAmodel *model = (MESAmodel *)inModel ; + MESAinstance *here ; + + /* loop through all the MESA models */ + for ( ; model != NULL ; model = model->MESAnextModel) + { + /* loop through all the instances of the model */ + for (here = model->MESAinstances ; here != NULL ; here = here->MESAnextInstance) + { + ckt->CKTnodeIsLinear [here->MESAsourcePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->MESAdrainPrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->MESAgatePrimeNode] = 0 ; + ckt->CKTnodeIsLinear [here->MESAsourcePrmPrmNode] = 0 ; + ckt->CKTnodeIsLinear [here->MESAdrainPrmPrmNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/mos1/Makefile.am b/src/spicelib/devices/mos1/Makefile.am index e523c113c..7b0f728c7 100644 --- a/src/spicelib/devices/mos1/Makefile.am +++ b/src/spicelib/devices/mos1/Makefile.am @@ -21,6 +21,7 @@ libmos1_la_SOURCES = \ mos1mask.c \ mos1mdel.c \ mos1mpar.c \ + mos1node.c \ mos1noi.c \ mos1par.c \ mos1pzld.c \ diff --git a/src/spicelib/devices/mos1/mos1ext.h b/src/spicelib/devices/mos1/mos1ext.h index b1ed69d52..d198c1d86 100644 --- a/src/spicelib/devices/mos1/mos1ext.h +++ b/src/spicelib/devices/mos1/mos1ext.h @@ -28,3 +28,4 @@ extern int MOS1convTest(GENmodel*,CKTcircuit*); extern int MOS1disto(int,GENmodel*,CKTcircuit*); extern int MOS1noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS1dSetup(GENmodel*,CKTcircuit*); +extern int MOS1nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/mos1/mos1init.c b/src/spicelib/devices/mos1/mos1init.c index 85f30088d..c66987378 100644 --- a/src/spicelib/devices/mos1/mos1init.c +++ b/src/spicelib/devices/mos1/mos1init.c @@ -72,7 +72,8 @@ SPICEdev MOS1info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &MOS1iSize, - /* DEVmodSize */ &MOS1mSize + /* DEVmodSize */ &MOS1mSize, + /* DEVnodeIsNonLinear */ MOS1nodeIsNonLinear }; diff --git a/src/spicelib/devices/mos1/mos1node.c b/src/spicelib/devices/mos1/mos1node.c new file mode 100644 index 000000000..787e09ee5 --- /dev/null +++ b/src/spicelib/devices/mos1/mos1node.c @@ -0,0 +1,30 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "mos1defs.h" +#include "ngspice/sperror.h" + +int +MOS1nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS1model *model = (MOS1model *)inModel ; + MOS1instance *here ; + + /* loop through all the MOS1 models */ + for ( ; model != NULL ; model = model->MOS1nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS1instances ; here != NULL ; here = here->MOS1nextInstance) + { + ckt->CKTnodeIsLinear [here->MOS1dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS1sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS1gNode] = 0 ; + ckt->CKTnodeIsLinear [here->MOS1bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/mos2/Makefile.am b/src/spicelib/devices/mos2/Makefile.am index a27ddc9d2..8f9cb0bd1 100644 --- a/src/spicelib/devices/mos2/Makefile.am +++ b/src/spicelib/devices/mos2/Makefile.am @@ -21,6 +21,7 @@ libmos2_la_SOURCES = \ mos2mask.c \ mos2mdel.c \ mos2mpar.c \ + mos2node.c \ mos2noi.c \ mos2par.c \ mos2pzld.c \ diff --git a/src/spicelib/devices/mos2/mos2ext.h b/src/spicelib/devices/mos2/mos2ext.h index 46a8a3e38..6364ae5ad 100644 --- a/src/spicelib/devices/mos2/mos2ext.h +++ b/src/spicelib/devices/mos2/mos2ext.h @@ -27,5 +27,5 @@ extern int MOS2temp(GENmodel*,CKTcircuit*); extern int MOS2trunc(GENmodel*,CKTcircuit*,double*); extern int MOS2disto(int,GENmodel*,CKTcircuit*); extern int MOS2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); - extern int MOS2dSetup(GENmodel*,CKTcircuit*); +extern int MOS2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/mos2/mos2init.c b/src/spicelib/devices/mos2/mos2init.c index e7e47fd9b..647128be3 100644 --- a/src/spicelib/devices/mos2/mos2init.c +++ b/src/spicelib/devices/mos2/mos2init.c @@ -72,7 +72,8 @@ SPICEdev MOS2info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &MOS2iSize, - /* DEVmodSize */ &MOS2mSize + /* DEVmodSize */ &MOS2mSize, + /* DEVnodeIsNonLinear */ MOS2nodeIsNonLinear }; diff --git a/src/spicelib/devices/mos2/mos2node.c b/src/spicelib/devices/mos2/mos2node.c new file mode 100644 index 000000000..287ab8156 --- /dev/null +++ b/src/spicelib/devices/mos2/mos2node.c @@ -0,0 +1,30 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "mos2defs.h" +#include "ngspice/sperror.h" + +int +MOS2nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS2model *model = (MOS2model *)inModel ; + MOS2instance *here ; + + /* loop through all the MOS2 models */ + for ( ; model != NULL ; model = model->MOS2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS2instances ; here != NULL ; here = here->MOS2nextInstance) + { + ckt->CKTnodeIsLinear [here->MOS2dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS2sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS2gNode] = 0 ; + ckt->CKTnodeIsLinear [here->MOS2bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/mos3/Makefile.am b/src/spicelib/devices/mos3/Makefile.am index 7419051a9..fe0f1eac6 100644 --- a/src/spicelib/devices/mos3/Makefile.am +++ b/src/spicelib/devices/mos3/Makefile.am @@ -21,6 +21,7 @@ libmos3_la_SOURCES = \ mos3mask.c \ mos3mdel.c \ mos3mpar.c \ + mos3node.c \ mos3noi.c \ mos3par.c \ mos3pzld.c \ diff --git a/src/spicelib/devices/mos3/mos3ext.h b/src/spicelib/devices/mos3/mos3ext.h index 843d68329..9777be02d 100644 --- a/src/spicelib/devices/mos3/mos3ext.h +++ b/src/spicelib/devices/mos3/mos3ext.h @@ -28,3 +28,4 @@ extern int MOS3trunc(GENmodel*,CKTcircuit*,double*); extern int MOS3disto(int,GENmodel*,CKTcircuit*); extern int MOS3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS3dSetup(GENmodel*,CKTcircuit*); +extern int MOS3nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/mos3/mos3init.c b/src/spicelib/devices/mos3/mos3init.c index a096977ba..93f81face 100644 --- a/src/spicelib/devices/mos3/mos3init.c +++ b/src/spicelib/devices/mos3/mos3init.c @@ -72,7 +72,8 @@ SPICEdev MOS3info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &MOS3iSize, - /* DEVmodSize */ &MOS3mSize + /* DEVmodSize */ &MOS3mSize, + /* DEVnodeIsNonLinear */ MOS3nodeIsNonLinear }; diff --git a/src/spicelib/devices/mos3/mos3node.c b/src/spicelib/devices/mos3/mos3node.c new file mode 100644 index 000000000..09a7c2efa --- /dev/null +++ b/src/spicelib/devices/mos3/mos3node.c @@ -0,0 +1,30 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "mos3defs.h" +#include "ngspice/sperror.h" + +int +MOS3nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS3model *model = (MOS3model *)inModel ; + MOS3instance *here ; + + /* loop through all the MOS3 models */ + for ( ; model != NULL ; model = model->MOS3nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS3instances ; here != NULL ; here = here->MOS3nextInstance) + { + ckt->CKTnodeIsLinear [here->MOS3dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS3sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS3gNode] = 0 ; + ckt->CKTnodeIsLinear [here->MOS3bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/mos6/Makefile.am b/src/spicelib/devices/mos6/Makefile.am index 5161dbac3..876c8c5c5 100644 --- a/src/spicelib/devices/mos6/Makefile.am +++ b/src/spicelib/devices/mos6/Makefile.am @@ -16,6 +16,7 @@ libmos6_la_SOURCES = \ mos6load.c \ mos6mask.c \ mos6mpar.c \ + mos6node.c \ mos6par.c \ mos6set.c \ mos6temp.c \ diff --git a/src/spicelib/devices/mos6/mos6ext.h b/src/spicelib/devices/mos6/mos6ext.h index e5d203145..297974142 100644 --- a/src/spicelib/devices/mos6/mos6ext.h +++ b/src/spicelib/devices/mos6/mos6ext.h @@ -19,3 +19,4 @@ extern int MOS6unsetup(GENmodel*,CKTcircuit*); extern int MOS6temp(GENmodel*,CKTcircuit*); extern int MOS6trunc(GENmodel*,CKTcircuit*,double*); extern int MOS6convTest(GENmodel*,CKTcircuit*); +extern int MOS6nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/mos6/mos6init.c b/src/spicelib/devices/mos6/mos6init.c index febf8f691..8cde3a3de 100644 --- a/src/spicelib/devices/mos6/mos6init.c +++ b/src/spicelib/devices/mos6/mos6init.c @@ -72,7 +72,8 @@ SPICEdev MOS6info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &MOS6iSize, - /* DEVmodSize */ &MOS6mSize + /* DEVmodSize */ &MOS6mSize, + /* DEVnodeIsNonLinear */ MOS6nodeIsNonLinear }; diff --git a/src/spicelib/devices/mos6/mos6node.c b/src/spicelib/devices/mos6/mos6node.c new file mode 100644 index 000000000..a9bc47f09 --- /dev/null +++ b/src/spicelib/devices/mos6/mos6node.c @@ -0,0 +1,30 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "mos6defs.h" +#include "ngspice/sperror.h" + +int +MOS6nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS6model *model = (MOS6model *)inModel ; + MOS6instance *here ; + + /* loop through all the MOS6 models */ + for ( ; model != NULL ; model = model->MOS6nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS6instances ; here != NULL ; here = here->MOS6nextInstance) + { + ckt->CKTnodeIsLinear [here->MOS6dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS6sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS6gNode] = 0 ; + ckt->CKTnodeIsLinear [here->MOS6bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/mos9/Makefile.am b/src/spicelib/devices/mos9/Makefile.am index 5db83e4c0..6c557b4ce 100644 --- a/src/spicelib/devices/mos9/Makefile.am +++ b/src/spicelib/devices/mos9/Makefile.am @@ -21,6 +21,7 @@ libmos9_la_SOURCES = \ mos9mask.c \ mos9mdel.c \ mos9mpar.c \ + mos9node.c \ mos9noi.c \ mos9par.c \ mos9pzld.c \ diff --git a/src/spicelib/devices/mos9/mos9ext.h b/src/spicelib/devices/mos9/mos9ext.h index c2af0a136..4497953c7 100644 --- a/src/spicelib/devices/mos9/mos9ext.h +++ b/src/spicelib/devices/mos9/mos9ext.h @@ -28,3 +28,4 @@ extern int MOS9trunc(GENmodel*,CKTcircuit*,double*); extern int MOS9disto(int,GENmodel*,CKTcircuit*); extern int MOS9noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS9dSetup(GENmodel*,CKTcircuit*); +extern int MOS9nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/mos9/mos9init.c b/src/spicelib/devices/mos9/mos9init.c index 10a3e82d9..cf1d9b7c8 100644 --- a/src/spicelib/devices/mos9/mos9init.c +++ b/src/spicelib/devices/mos9/mos9init.c @@ -72,7 +72,8 @@ SPICEdev MOS9info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &MOS9iSize, - /* DEVmodSize */ &MOS9mSize + /* DEVmodSize */ &MOS9mSize, + /* DEVnodeIsNonLinear */ MOS9nodeIsNonLinear }; diff --git a/src/spicelib/devices/mos9/mos9node.c b/src/spicelib/devices/mos9/mos9node.c new file mode 100644 index 000000000..b03096a70 --- /dev/null +++ b/src/spicelib/devices/mos9/mos9node.c @@ -0,0 +1,30 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "mos9defs.h" +#include "ngspice/sperror.h" + +int +MOS9nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS9model *model = (MOS9model *)inModel ; + MOS9instance *here ; + + /* loop through all the MOS9 models */ + for ( ; model != NULL ; model = model->MOS9nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS9instances ; here != NULL ; here = here->MOS9nextInstance) + { + ckt->CKTnodeIsLinear [here->MOS9dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS9sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->MOS9gNode] = 0 ; + ckt->CKTnodeIsLinear [here->MOS9bNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index e713e603b..1b92472e1 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -72,7 +72,8 @@ SPICEdev RESinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &RESiSize, - /* DEVmodSize */ &RESmSize + /* DEVmodSize */ &RESmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/soi3/Makefile.am b/src/spicelib/devices/soi3/Makefile.am index 09b1591dd..4d7060ded 100644 --- a/src/spicelib/devices/soi3/Makefile.am +++ b/src/spicelib/devices/soi3/Makefile.am @@ -20,6 +20,7 @@ libsoi3_la_SOURCES = \ soi3mask.c \ soi3mdel.c \ soi3mpar.c \ + soi3node.c \ soi3nois.c \ soi3par.c \ soi3set.c \ diff --git a/src/spicelib/devices/soi3/soi3ext.h b/src/spicelib/devices/soi3/soi3ext.h index c7e194acd..38ea2805f 100644 --- a/src/spicelib/devices/soi3/soi3ext.h +++ b/src/spicelib/devices/soi3/soi3ext.h @@ -65,3 +65,4 @@ extern int SOI3convTest(GENmodel*,CKTcircuit*); /* extern int SOI3disto(int,GENmodel*,CKTcircuit*); */ extern int SOI3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int SOI3nodeIsNonLinear (GENmodel *, CKTcircuit *) ; diff --git a/src/spicelib/devices/soi3/soi3init.c b/src/spicelib/devices/soi3/soi3init.c index 9a4a8f676..29e3589e1 100644 --- a/src/spicelib/devices/soi3/soi3init.c +++ b/src/spicelib/devices/soi3/soi3init.c @@ -72,7 +72,8 @@ SPICEdev SOI3info = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &SOI3iSize, - /* DEVmodSize */ &SOI3mSize + /* DEVmodSize */ &SOI3mSize, + /* DEVnodeIsNonLinear */ SOI3nodeIsNonLinear }; diff --git a/src/spicelib/devices/soi3/soi3node.c b/src/spicelib/devices/soi3/soi3node.c new file mode 100644 index 000000000..5f15572e5 --- /dev/null +++ b/src/spicelib/devices/soi3/soi3node.c @@ -0,0 +1,36 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "soi3defs.h" +#include "ngspice/sperror.h" + +int +SOI3nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + SOI3model *model = (SOI3model *)inModel ; + SOI3instance *here ; + + /* loop through all the SOI3 models */ + for ( ; model != NULL ; model = model->SOI3nextModel) + { + /* loop through all the instances of the model */ + for (here = model->SOI3instances ; here != NULL ; here = here->SOI3nextInstance) + { + ckt->CKTnodeIsLinear [here->SOI3dNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3sNodePrime] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3tout1Node] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3tout2Node] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3tout3Node] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3tout4Node] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3gfNode] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3gbNode] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3bNode] = 0 ; + ckt->CKTnodeIsLinear [here->SOI3toutNode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/sw/swinit.c b/src/spicelib/devices/sw/swinit.c index 4daf3f41e..cf8049300 100644 --- a/src/spicelib/devices/sw/swinit.c +++ b/src/spicelib/devices/sw/swinit.c @@ -73,7 +73,8 @@ SPICEdev SWinfo = { /* DEVacct */ NULL, #endif /* CIDER */ /* DEVinstSize */ &SWiSize, - /* DEVmodSize */ &SWmSize + /* DEVmodSize */ &SWmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/tra/trainit.c b/src/spicelib/devices/tra/trainit.c index c6c0883b8..38601b2ed 100644 --- a/src/spicelib/devices/tra/trainit.c +++ b/src/spicelib/devices/tra/trainit.c @@ -72,7 +72,8 @@ SPICEdev TRAinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &TRAiSize, - /* DEVmodSize */ &TRAmSize + /* DEVmodSize */ &TRAmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/txl/txlinit.c b/src/spicelib/devices/txl/txlinit.c index 1e8a72d37..2437ed414 100644 --- a/src/spicelib/devices/txl/txlinit.c +++ b/src/spicelib/devices/txl/txlinit.c @@ -76,8 +76,9 @@ SPICEdev TXLinfo = { /* DEVdump */ NULL, /* DEVacct */ NULL, #endif - &TXLiSize, - &TXLmSize + /* DEVinstSize */ &TXLiSize, + /* DEVmodSize */ &TXLmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/urc/urcinit.c b/src/spicelib/devices/urc/urcinit.c index 31c2eb8a1..d415f9774 100644 --- a/src/spicelib/devices/urc/urcinit.c +++ b/src/spicelib/devices/urc/urcinit.c @@ -72,7 +72,8 @@ SPICEdev URCinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &URCiSize, - /* DEVmodSize */ &URCmSize + /* DEVmodSize */ &URCmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/vbic/Makefile.am b/src/spicelib/devices/vbic/Makefile.am index 0ea84de4f..ccbb722c0 100644 --- a/src/spicelib/devices/vbic/Makefile.am +++ b/src/spicelib/devices/vbic/Makefile.am @@ -19,6 +19,7 @@ libvbic_la_SOURCES = \ vbicmask.c \ vbicmdel.c \ vbicmpar.c \ + vbicnode.c \ vbicnoise.c \ vbicparam.c \ vbicpzld.c \ diff --git a/src/spicelib/devices/vbic/vbicext.h b/src/spicelib/devices/vbic/vbicext.h index 96e0d11bc..8e97121e5 100644 --- a/src/spicelib/devices/vbic/vbicext.h +++ b/src/spicelib/devices/vbic/vbicext.h @@ -25,5 +25,6 @@ extern int VBICunsetup(GENmodel*,CKTcircuit*); extern int VBICtemp(GENmodel*,CKTcircuit*); extern int VBICtrunc(GENmodel*,CKTcircuit*,double*); extern int VBICnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int VBICnodeIsNonLinear (GENmodel *, CKTcircuit *) ; #endif diff --git a/src/spicelib/devices/vbic/vbicinit.c b/src/spicelib/devices/vbic/vbicinit.c index 1ddfabb15..6cb4f1796 100644 --- a/src/spicelib/devices/vbic/vbicinit.c +++ b/src/spicelib/devices/vbic/vbicinit.c @@ -77,7 +77,8 @@ SPICEdev VBICinfo = { NULL, /* DEVacct */ #endif &VBICiSize, /* DEVinstSize */ - &VBICmSize /* DEVmodSize */ + &VBICmSize, /* DEVmodSize */ + VBICnodeIsNonLinear /* DEVnodeIsNonLinear */ }; diff --git a/src/spicelib/devices/vbic/vbicnode.c b/src/spicelib/devices/vbic/vbicnode.c new file mode 100644 index 000000000..447ae8a66 --- /dev/null +++ b/src/spicelib/devices/vbic/vbicnode.c @@ -0,0 +1,33 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "vbicdefs.h" +#include "ngspice/sperror.h" + +int +VBICnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + VBICmodel *model = (VBICmodel *)inModel ; + VBICinstance *here ; + + /* loop through all the VBIC models */ + for ( ; model != NULL ; model = model->VBICnextModel) + { + /* loop through all the instances of the model */ + for (here = model->VBICinstances ; here != NULL ; here = here->VBICnextInstance) + { + ckt->CKTnodeIsLinear [here->VBICcollCXNode] = 0 ; + ckt->CKTnodeIsLinear [here->VBICbaseBXNode] = 0 ; + ckt->CKTnodeIsLinear [here->VBICemitEINode] = 0 ; + ckt->CKTnodeIsLinear [here->VBICsubsSINode] = 0 ; + ckt->CKTnodeIsLinear [here->VBICcollCINode] = 0 ; + ckt->CKTnodeIsLinear [here->VBICbaseBPNode] = 0 ; + ckt->CKTnodeIsLinear [here->VBICbaseBINode] = 0 ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/vccs/vccsinit.c b/src/spicelib/devices/vccs/vccsinit.c index bf633a526..4c7c02dca 100644 --- a/src/spicelib/devices/vccs/vccsinit.c +++ b/src/spicelib/devices/vccs/vccsinit.c @@ -72,8 +72,8 @@ SPICEdev VCCSinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &VCCSiSize, - /* DEVmodSize */ &VCCSmSize - + /* DEVmodSize */ &VCCSmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/vcvs/vcvsinit.c b/src/spicelib/devices/vcvs/vcvsinit.c index b48f3cbf0..8b87288e4 100644 --- a/src/spicelib/devices/vcvs/vcvsinit.c +++ b/src/spicelib/devices/vcvs/vcvsinit.c @@ -72,7 +72,8 @@ SPICEdev VCVSinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &VCVSiSize, - /* DEVmodSize */ &VCVSmSize + /* DEVmodSize */ &VCVSmSize, + /* DEVnodeIsNonLinear */ NULL }; diff --git a/src/spicelib/devices/vsrc/vsrcinit.c b/src/spicelib/devices/vsrc/vsrcinit.c index f33d93e43..6e6f02e88 100644 --- a/src/spicelib/devices/vsrc/vsrcinit.c +++ b/src/spicelib/devices/vsrc/vsrcinit.c @@ -72,7 +72,8 @@ SPICEdev VSRCinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &VSRCiSize, - /* DEVmodSize */ &VSRCmSize + /* DEVmodSize */ &VSRCmSize, + /* DEVnodeIsNonLinear */ NULL }; From e1cd74d3a35ff7d537258b3c2d9ae47f2987e1c7 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 27 May 2013 08:43:04 +0200 Subject: [PATCH 238/257] new_kirchhoff-2 branch rebased on master in new_kirchhoff-3 branch --- src/spicelib/devices/res/resload.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index 84d39e404..725edc253 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -29,6 +29,7 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) here->REScurrent = (*(ckt->CKTrhsOld+here->RESposNode) - *(ckt->CKTrhsOld+here->RESnegNode)) * here->RESconduct; + m = (here->RESm); *(here->RESposPosptr) += m * here->RESconduct; *(here->RESnegNegptr) += m * here->RESconduct; *(here->RESposNegptr) -= m * here->RESconduct; From a93d51a074209a39d2a42eed5e2a461b44e3db6b Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 27 May 2013 10:23:04 +0200 Subject: [PATCH 239/257] Added a conditional compilation switch for the KCL Verification --- configure.ac | 10 +++ src/include/ngspice/cktdefs.h | 4 ++ src/include/ngspice/devdefs.h | 2 + src/maths/ni/niconv.c | 7 +++ src/maths/ni/nireinit.c | 12 +++- src/spicelib/analysis/cktload.c | 4 ++ src/spicelib/analysis/cktsetup.c | 2 + src/spicelib/devices/asrc/Makefile.am | 7 ++- src/spicelib/devices/asrc/asrcinit.c | 4 ++ src/spicelib/devices/bjt/Makefile.am | 4 +- src/spicelib/devices/bjt/bjtinit.c | 3 + src/spicelib/devices/bsim1/Makefile.am | 4 +- src/spicelib/devices/bsim1/bsim1init.c | 3 + src/spicelib/devices/bsim2/Makefile.am | 4 +- src/spicelib/devices/bsim2/b2ld.c | 3 +- src/spicelib/devices/bsim2/bsim2init.c | 3 + src/spicelib/devices/bsim3/Makefile.am | 4 +- src/spicelib/devices/bsim3/b3ld.c | 2 + src/spicelib/devices/bsim3/bsim3init.c | 3 + src/spicelib/devices/bsim3soi_dd/Makefile.am | 4 +- .../devices/bsim3soi_dd/b3soiddinit.c | 4 ++ src/spicelib/devices/bsim3soi_fd/Makefile.am | 4 +- .../devices/bsim3soi_fd/b3soifdinit.c | 4 ++ src/spicelib/devices/bsim3soi_pd/Makefile.am | 4 +- .../devices/bsim3soi_pd/b3soipdinit.c | 4 ++ src/spicelib/devices/bsim3v0/Makefile.am | 4 +- src/spicelib/devices/bsim3v0/bsim3v0init.c | 3 + src/spicelib/devices/bsim3v1/Makefile.am | 4 +- src/spicelib/devices/bsim3v1/bsim3v1init.c | 3 + src/spicelib/devices/bsim3v32/Makefile.am | 4 +- src/spicelib/devices/bsim3v32/bsim3v32init.c | 3 + src/spicelib/devices/bsim4/Makefile.am | 4 +- src/spicelib/devices/bsim4/b4ld.c | 2 + src/spicelib/devices/bsim4/bsim4init.c | 6 +- src/spicelib/devices/bsim4v4/Makefile.am | 4 +- src/spicelib/devices/bsim4v4/bsim4v4init.c | 6 +- src/spicelib/devices/bsim4v5/Makefile.am | 4 +- src/spicelib/devices/bsim4v5/bsim4v5init.c | 6 +- src/spicelib/devices/bsim4v6/Makefile.am | 4 +- src/spicelib/devices/bsim4v6/bsim4v6init.c | 6 +- src/spicelib/devices/bsimsoi/Makefile.am | 4 +- src/spicelib/devices/bsimsoi/b4soiinit.c | 4 ++ src/spicelib/devices/cap/capinit.c | 4 ++ src/spicelib/devices/cap/capload.c | 3 + src/spicelib/devices/cccs/cccsinit.c | 3 + src/spicelib/devices/cccs/cccsload.c | 3 + src/spicelib/devices/ccvs/ccvsinit.c | 3 + src/spicelib/devices/ccvs/ccvsload.c | 3 + src/spicelib/devices/cpl/cplinit.c | 3 + src/spicelib/devices/csw/cswinit.c | 3 + src/spicelib/devices/dio/Makefile.am | 5 +- src/spicelib/devices/dio/dioinit.c | 4 ++ src/spicelib/devices/hfet1/Makefile.am | 4 +- src/spicelib/devices/hfet1/hfetinit.c | 3 + src/spicelib/devices/hfet2/Makefile.am | 4 +- src/spicelib/devices/hfet2/hfet2init.c | 3 + src/spicelib/devices/hisim2/Makefile.am | 56 +++++++++-------- src/spicelib/devices/hisim2/hsm2init.c | 3 + src/spicelib/devices/hisimhv1/Makefile.am | 63 ++++++++++--------- src/spicelib/devices/hisimhv1/hsmhvinit.c | 3 + src/spicelib/devices/ind/indinit.c | 6 ++ src/spicelib/devices/ind/indload.c | 3 + src/spicelib/devices/isrc/isrcinit.c | 4 ++ src/spicelib/devices/isrc/isrcload.c | 2 + src/spicelib/devices/jfet/Makefile.am | 4 +- src/spicelib/devices/jfet/jfetinit.c | 3 + src/spicelib/devices/jfet2/Makefile.am | 5 +- src/spicelib/devices/jfet2/jfet2init.c | 3 + src/spicelib/devices/ltra/ltrainit.c | 3 + src/spicelib/devices/mes/Makefile.am | 4 +- src/spicelib/devices/mes/mesinit.c | 3 + src/spicelib/devices/mesa/Makefile.am | 4 +- src/spicelib/devices/mesa/mesainit.c | 3 + src/spicelib/devices/mos1/Makefile.am | 4 +- src/spicelib/devices/mos1/mos1init.c | 4 ++ src/spicelib/devices/mos1/mos1load.c | 4 +- src/spicelib/devices/mos2/Makefile.am | 5 +- src/spicelib/devices/mos2/mos2init.c | 4 ++ src/spicelib/devices/mos3/Makefile.am | 5 +- src/spicelib/devices/mos3/mos3init.c | 3 + src/spicelib/devices/mos6/Makefile.am | 4 +- src/spicelib/devices/mos6/mos6init.c | 4 ++ src/spicelib/devices/mos6/mos6load.c | 4 +- src/spicelib/devices/mos9/Makefile.am | 4 +- src/spicelib/devices/mos9/mos9init.c | 3 + src/spicelib/devices/res/resinit.c | 3 + src/spicelib/devices/res/resload.c | 2 + src/spicelib/devices/soi3/Makefile.am | 4 +- src/spicelib/devices/soi3/soi3init.c | 3 + src/spicelib/devices/sw/swinit.c | 3 + src/spicelib/devices/tra/trainit.c | 3 + src/spicelib/devices/txl/txlinit.c | 3 + src/spicelib/devices/urc/urcinit.c | 3 + src/spicelib/devices/vbic/Makefile.am | 4 +- src/spicelib/devices/vbic/vbicinit.c | 3 + src/spicelib/devices/vccs/vccsinit.c | 3 + src/spicelib/devices/vccs/vccsload.c | 3 + src/spicelib/devices/vcvs/vcvsinit.c | 3 + src/spicelib/devices/vcvs/vcvsload.c | 3 + src/spicelib/devices/vsrc/vsrcinit.c | 4 ++ src/spicelib/devices/vsrc/vsrcload.c | 2 + 101 files changed, 401 insertions(+), 96 deletions(-) diff --git a/configure.ac b/configure.ac index e1163084f..943e376b7 100644 --- a/configure.ac +++ b/configure.ac @@ -182,6 +182,10 @@ AC_ARG_WITH([tcl], AC_ARG_WITH([ngshared], [AS_HELP_STRING([--with-ngshared], [Compiles ngspice as shared library (dll)])]) +# --enable-kirchhoff: enable KCL +AC_ARG_ENABLE([kirchhoff], + [AS_HELP_STRING([--enable-kirchhoff], [Enables the Kirchhoff Current Law Verification])]) + # readline and editline cannot both be enabled if test "x$with_editline" = xyes; then if test "x$with_readline" = xyes; then @@ -880,6 +884,12 @@ fi AC_SUBST([XGRAPHDIR]) AC_SUBST([NOTXGRAPH]) +if test "x$enable_kirchhoff" = xyes; then + AC_DEFINE([KIRCHHOFF], [], [Define if we want to enable the Kirchhoff Current Law Verification]) + AC_MSG_RESULT([WARNING: Kirchhoff Current Law Verification Enabled (experimental)]) +fi +AM_CONDITIONAL([KIRCHHOFF_WANTED], [test "x$enable_kirchhoff" = xyes]) + AC_CHECK_PROGS([YACC], ['bison -y' byacc yacc]) ################# XSPICE ################################################## diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index d2ed108da..32e209d07 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -110,8 +110,12 @@ struct CKTcircuit { double *CKTrhs; /* current rhs value - being loaded */ double *CKTrhsOld; /* previous rhs value for convergence testing */ + +#ifdef KIRCHHOFF double *CKTfvk ; /* KCL Verification array */ int *CKTnodeIsLinear ; /* Flag to indicate if a node is linear or non-linear */ +#endif + double *CKTrhsSpare; /* spare rhs value for reordering */ double *CKTirhs; /* current rhs value - being loaded (imag) */ diff --git a/src/include/ngspice/devdefs.h b/src/include/ngspice/devdefs.h index 03c668367..874533f97 100644 --- a/src/include/ngspice/devdefs.h +++ b/src/include/ngspice/devdefs.h @@ -112,9 +112,11 @@ typedef struct SPICEdev { int *DEVinstSize; /* size of an instance */ int *DEVmodSize; /* size of a model */ +#ifdef KIRCHHOFF /* Francesco Lannutti */ int (*DEVnodeIsNonLinear)(GENmodel *, CKTcircuit *) ; /* Routine to declare a node as NonLinear */ +#endif } SPICEdev; /* instance of structure for each possible type of device */ diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 517b36e33..b43c68fcf 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -21,12 +21,16 @@ NIconvTest(CKTcircuit *ckt) int i; /* generic loop variable */ int size; /* size of the matrix */ CKTnode *node; /* current matrix entry */ + +//#ifndef KIRCHHOFF double old; double new; double tol; +//#endif size = SMPmatSize (ckt->CKTmatrix) ; +//#ifndef KIRCHHOFF #ifdef STEPDEBUG for (i=1;i<=size;i++) { new = ckt->CKTrhs [i] ; @@ -55,6 +59,8 @@ NIconvTest(CKTcircuit *ckt) } } +//#else +#ifdef KIRCHHOFF /* KCL Verification */ double maximum = 0 ; @@ -84,6 +90,7 @@ NIconvTest(CKTcircuit *ckt) return 1 ; } } +#endif #ifdef NEWCONV i = CKTconvTest(ckt); diff --git a/src/maths/ni/nireinit.c b/src/maths/ni/nireinit.c index bfb6b4e50..30dce7b1f 100644 --- a/src/maths/ni/nireinit.c +++ b/src/maths/ni/nireinit.c @@ -21,19 +21,27 @@ Author: 1985 Thomas L. Quarles int NIreinit( CKTcircuit *ckt) { - int i, size; + int size; + +#if defined(PREDICTOR) || defined(KIRCHHOFF) + int i; +#endif size = SMPmatSize(ckt->CKTmatrix); CKALLOC(CKTrhs,size+1,double); CKALLOC(CKTrhsOld,size+1,double); - CKALLOC(CKTfvk,size+1,double); CKALLOC(CKTrhsSpare,size+1,double); CKALLOC(CKTirhs,size+1,double); CKALLOC(CKTirhsOld,size+1,double); CKALLOC(CKTirhsSpare,size+1,double); + +#ifdef KIRCHHOFF + CKALLOC(CKTfvk,size+1,double); CKALLOC(CKTnodeIsLinear,size+1,int); for (i = 0 ; i <= size ; i++) ckt->CKTnodeIsLinear [i] = 1 ; +#endif + #ifdef PREDICTOR CKALLOC(CKTpred,size+1,double); for( i=0;i<8;i++) { diff --git a/src/spicelib/analysis/cktload.c b/src/spicelib/analysis/cktload.c index ca5a7cadc..c8ec1a666 100644 --- a/src/spicelib/analysis/cktload.c +++ b/src/spicelib/analysis/cktload.c @@ -52,7 +52,11 @@ CKTload(CKTcircuit *ckt) size = SMPmatSize(ckt->CKTmatrix); for (i = 0; i <= size; i++) { ckt->CKTrhs[i] = 0; + +#ifdef KIRCHHOFF ckt->CKTfvk[i] = 0; +#endif + } SMPclear(ckt->CKTmatrix); #ifdef STEPDEBUG diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 2e6a05351..4c55ef678 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -128,6 +128,7 @@ CKTsetup(CKTcircuit *ckt) /* gtri - end - Setup for adding rshunt option resistors */ #endif +#ifdef KIRCHHOFF /** Marking node as Non-Linear when needed * By default every node is Linear */ @@ -140,6 +141,7 @@ CKTsetup(CKTcircuit *ckt) return (error) ; } } +#endif return(OK); } diff --git a/src/spicelib/devices/asrc/Makefile.am b/src/spicelib/devices/asrc/Makefile.am index 56895b0d7..473ddf39c 100644 --- a/src/spicelib/devices/asrc/Makefile.am +++ b/src/spicelib/devices/asrc/Makefile.am @@ -17,13 +17,16 @@ libasrc_la_SOURCES = \ asrcinit.h \ asrcload.c \ asrcmdel.c \ - asrcnode.c \ asrcpar.c \ asrcpzld.c \ - asrcset.c \ + asrcset.c \ asrctemp.c +if KIRCHHOFF_WANTED +libasrc_la_SOURCES += asrcnode.c +endif + AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/asrc/asrcinit.c b/src/spicelib/devices/asrc/asrcinit.c index 8d2c20281..088f5df93 100644 --- a/src/spicelib/devices/asrc/asrcinit.c +++ b/src/spicelib/devices/asrc/asrcinit.c @@ -74,7 +74,11 @@ SPICEdev ASRCinfo = { #endif /* DEVinstSize */ &ASRCiSize, /* DEVmodSize */ &ASRCmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ ASRCnodeIsNonLinear +#endif + }; diff --git a/src/spicelib/devices/bjt/Makefile.am b/src/spicelib/devices/bjt/Makefile.am index dd9f886ab..1babadbb7 100644 --- a/src/spicelib/devices/bjt/Makefile.am +++ b/src/spicelib/devices/bjt/Makefile.am @@ -22,7 +22,6 @@ libbjt_la_SOURCES = \ bjtmask.c \ bjtmdel.c \ bjtmpar.c \ - bjtnode.c \ bjtnoise.c \ bjtparam.c \ bjtpzld.c \ @@ -36,6 +35,9 @@ libbjt_la_SOURCES = \ bjttrunc.c +if KIRCHHOFF_WANTED +libbjt_la_SOURCES += bjtnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bjt/bjtinit.c b/src/spicelib/devices/bjt/bjtinit.c index 47df76b69..f3684ceea 100644 --- a/src/spicelib/devices/bjt/bjtinit.c +++ b/src/spicelib/devices/bjt/bjtinit.c @@ -73,7 +73,10 @@ SPICEdev BJTinfo = { /* description from struct IFdevice */ #endif /* DEVinstSize */ &BJTiSize, /* DEVmodSize */ &BJTmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ BJTnodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/bsim1/Makefile.am b/src/spicelib/devices/bsim1/Makefile.am index 64559702d..9face8fa5 100644 --- a/src/spicelib/devices/bsim1/Makefile.am +++ b/src/spicelib/devices/bsim1/Makefile.am @@ -19,7 +19,6 @@ libbsim1_la_SOURCES = \ b1moscap.c \ b1mpar.c \ b1par.c \ - b1node.c \ b1noi.c \ b1pzld.c \ b1set.c \ @@ -32,6 +31,9 @@ libbsim1_la_SOURCES = \ bsim1itf.h +if KIRCHHOFF_WANTED +libbsim1_la_SOURCES += b1node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim1/bsim1init.c b/src/spicelib/devices/bsim1/bsim1init.c index fe123493c..f66e128de 100644 --- a/src/spicelib/devices/bsim1/bsim1init.c +++ b/src/spicelib/devices/bsim1/bsim1init.c @@ -73,7 +73,10 @@ SPICEdev B1info = { #endif /* DEVinstSize */ &B1iSize, /* DEVmodSize */ &B1mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ B1nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/bsim2/Makefile.am b/src/spicelib/devices/bsim2/Makefile.am index 369eb1ecd..9c776fe1f 100644 --- a/src/spicelib/devices/bsim2/Makefile.am +++ b/src/spicelib/devices/bsim2/Makefile.am @@ -16,7 +16,6 @@ libbsim2_la_SOURCES = \ b2mdel.c \ b2moscap.c \ b2mpar.c \ - b2node.c \ b2noi.c \ b2par.c \ b2pzld.c \ @@ -30,6 +29,9 @@ libbsim2_la_SOURCES = \ bsim2itf.h +if KIRCHHOFF_WANTED +libbsim2_la_SOURCES += b2node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim2/b2ld.c b/src/spicelib/devices/bsim2/b2ld.c index 75ca9f5b0..17b84d0bd 100644 --- a/src/spicelib/devices/bsim2/b2ld.c +++ b/src/spicelib/devices/bsim2/b2ld.c @@ -721,7 +721,7 @@ line900: *(here->B2SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs-gcsgb-gcsdb-gcssb); *(here->B2SPdpPtr) += m * (-gds-xrev*(gm+gmbs)+gcsdb); - +#ifdef KIRCHHOFF /* KCL verification - Dynamic Part */ *(ckt->CKTfvk + here->B2gNode) += m * ceqqg_fvk ; *(ckt->CKTfvk + here->B2bNode) += m * (ceqbs_fvk + ceqbd_fvk + ceqqb_fvk) ; @@ -738,6 +738,7 @@ line900: *(ckt->CKTfvk + here->B2sNode) += m * (-here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNodePrime) ; *(ckt->CKTfvk + here->B2dNodePrime) += m * (-here->B2drainConductance) * *(ckt->CKTrhsOld + here->B2dNode) ; *(ckt->CKTfvk + here->B2sNodePrime) += m * (-here->B2sourceConductance) * *(ckt->CKTrhsOld + here->B2sNode) ; +#endif line1000: ; diff --git a/src/spicelib/devices/bsim2/bsim2init.c b/src/spicelib/devices/bsim2/bsim2init.c index e452176a3..a800f50f5 100644 --- a/src/spicelib/devices/bsim2/bsim2init.c +++ b/src/spicelib/devices/bsim2/bsim2init.c @@ -73,7 +73,10 @@ SPICEdev B2info = { #endif /* DEVinstSize */ &B2iSize, /* DEVmodSize */ &B2mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ B2nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/bsim3/Makefile.am b/src/spicelib/devices/bsim3/Makefile.am index 1317c4c76..abcbb3715 100644 --- a/src/spicelib/devices/bsim3/Makefile.am +++ b/src/spicelib/devices/bsim3/Makefile.am @@ -15,7 +15,6 @@ libbsim3_la_SOURCES = \ b3mask.c \ b3mdel.c \ b3mpar.c \ - b3node.c \ b3noi.c \ b3par.c \ b3pzld.c \ @@ -29,6 +28,9 @@ libbsim3_la_SOURCES = \ bsim3itf.h +if KIRCHHOFF_WANTED +libbsim3_la_SOURCES += b3node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index 9ba09c4d1..532658981 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -3142,6 +3142,7 @@ line900: *(here->BSIM3QbPtr) += m * (ggtb - gcqbb); } +#ifdef KIRCHHOFF /////////////////////////////////////////////////////////////////////////////////// /* *(ckt->CKTfvk + here->BSIM3gNode) += m * ceqqg ; @@ -3225,6 +3226,7 @@ line900: *(ckt->CKTfvk+here->BSIM3sNodePrime) += m * (gcsgb + sxpart * ggtg + T1 * dsxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM3gNode) ; *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (gcsgb + gcsdb + gcssb - sxpart * ggtb - T1 * dsxpart_dVb) * *(ckt->CKTrhsOld+here->BSIM3bNode) ; *(ckt->CKTfvk+here->BSIM3sNodePrime) -= m * (- gcsdb - sxpart * ggtd - T1 * dsxpart_dVd) * *(ckt->CKTrhsOld+here->BSIM3dNodePrime) ; +#endif #endif line1000: ; diff --git a/src/spicelib/devices/bsim3/bsim3init.c b/src/spicelib/devices/bsim3/bsim3init.c index 99efa1d0e..c1c881f57 100644 --- a/src/spicelib/devices/bsim3/bsim3init.c +++ b/src/spicelib/devices/bsim3/bsim3init.c @@ -72,7 +72,10 @@ SPICEdev BSIM3info = { #endif /* DEVinstSize */ &BSIM3iSize, /* DEVmodSize */ &BSIM3mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ BSIM3nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/bsim3soi_dd/Makefile.am b/src/spicelib/devices/bsim3soi_dd/Makefile.am index bcc68edcf..2b3e5e26d 100644 --- a/src/spicelib/devices/bsim3soi_dd/Makefile.am +++ b/src/spicelib/devices/bsim3soi_dd/Makefile.am @@ -15,7 +15,6 @@ libbsim3soidd_la_SOURCES = \ b3soiddmask.c \ b3soiddmdel.c \ b3soiddmpar.c \ - b3soiddnode.c \ b3soiddnoi.c \ b3soiddpar.c \ b3soiddpzld.c \ @@ -29,6 +28,9 @@ libbsim3soidd_la_SOURCES = \ b3soidditf.h +if KIRCHHOFF_WANTED +libbsim3soidd_la_SOURCES += b3soiddnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c index 9c3788ad0..6d6faa501 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c @@ -70,7 +70,11 @@ SPICEdev B3SOIDDinfo = { #endif /* DEVinstSize */ &B3SOIDDiSize, /* DEVmodSize */ &B3SOIDDmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ B3SOIDDnodeIsNonLinear +#endif + }; SPICEdev * diff --git a/src/spicelib/devices/bsim3soi_fd/Makefile.am b/src/spicelib/devices/bsim3soi_fd/Makefile.am index 16fcf03c0..effeab57b 100644 --- a/src/spicelib/devices/bsim3soi_fd/Makefile.am +++ b/src/spicelib/devices/bsim3soi_fd/Makefile.am @@ -15,7 +15,6 @@ libbsim3soifd_la_SOURCES = \ b3soifdmask.c \ b3soifdmdel.c \ b3soifdmpar.c \ - b3soifdnode.c \ b3soifdnoi.c \ b3soifdpar.c \ b3soifdpzld.c \ @@ -29,6 +28,9 @@ libbsim3soifd_la_SOURCES = \ b3soifditf.h +if KIRCHHOFF_WANTED +libbsim3soifd_la_SOURCES += b3soifdnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c index 1667c8462..5c3a12d8f 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c @@ -71,7 +71,11 @@ SPICEdev B3SOIFDinfo = { #endif /* DEVinstSize*/ &B3SOIFDiSize, /* DEVmodSize*/ &B3SOIFDmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ B3SOIFDnodeIsNonLinear +#endif + }; diff --git a/src/spicelib/devices/bsim3soi_pd/Makefile.am b/src/spicelib/devices/bsim3soi_pd/Makefile.am index 877b09218..f379baa9f 100644 --- a/src/spicelib/devices/bsim3soi_pd/Makefile.am +++ b/src/spicelib/devices/bsim3soi_pd/Makefile.am @@ -15,7 +15,6 @@ libbsim3soipd_la_SOURCES = \ b3soipdmask.c \ b3soipdmdel.c \ b3soipdmpar.c \ - b3soipdnode.c \ b3soipdnoi.c \ b3soipdpar.c \ b3soipdpzld.c \ @@ -29,6 +28,9 @@ libbsim3soipd_la_SOURCES = \ b3soipditf.h +if KIRCHHOFF_WANTED +libbsim3soipd_la_SOURCES += b3soipdnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c index 18c8c2918..e82c80a32 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c @@ -72,7 +72,11 @@ SPICEdev B3SOIPDinfo = { #endif /* DEVinstSize*/ &B3SOIPDiSize, /* DEVmodSize*/ &B3SOIPDmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ B3SOIPDnodeIsNonLinear +#endif + }; SPICEdev * diff --git a/src/spicelib/devices/bsim3v0/Makefile.am b/src/spicelib/devices/bsim3v0/Makefile.am index c5d136942..ad72cc5b9 100644 --- a/src/spicelib/devices/bsim3v0/Makefile.am +++ b/src/spicelib/devices/bsim3v0/Makefile.am @@ -14,7 +14,6 @@ libbsim3v0_la_SOURCES = \ b3v0mask.c \ b3v0mdel.c \ b3v0mpar.c \ - b3v0node.c \ b3v0noi.c \ b3v0par.c \ b3v0pzld.c \ @@ -28,6 +27,9 @@ libbsim3v0_la_SOURCES = \ bsim3v0itf.h +if KIRCHHOFF_WANTED +libbsim3v0_la_SOURCES += b3v0node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim3v0/bsim3v0init.c b/src/spicelib/devices/bsim3v0/bsim3v0init.c index 3b7588b42..ebf584667 100644 --- a/src/spicelib/devices/bsim3v0/bsim3v0init.c +++ b/src/spicelib/devices/bsim3v0/bsim3v0init.c @@ -71,7 +71,10 @@ SPICEdev B3v0info = { #endif /* DEVinstSize */ &BSIM3v0iSize, /* DEVmodSize */ &BSIM3v0mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ BSIM3v0nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/bsim3v1/Makefile.am b/src/spicelib/devices/bsim3v1/Makefile.am index 0a6708b07..afc495345 100644 --- a/src/spicelib/devices/bsim3v1/Makefile.am +++ b/src/spicelib/devices/bsim3v1/Makefile.am @@ -15,7 +15,6 @@ libbsim3v1_la_SOURCES = \ b3v1mask.c \ b3v1mdel.c \ b3v1mpar.c \ - b3v1node.c \ b3v1noi.c \ b3v1par.c \ b3v1pzld.c \ @@ -29,6 +28,9 @@ libbsim3v1_la_SOURCES = \ bsim3v1itf.h +if KIRCHHOFF_WANTED +libbsim3v1_la_SOURCES += b3v1node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim3v1/bsim3v1init.c b/src/spicelib/devices/bsim3v1/bsim3v1init.c index 19c7ad160..a3399423c 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1init.c +++ b/src/spicelib/devices/bsim3v1/bsim3v1init.c @@ -71,7 +71,10 @@ SPICEdev BSIM3v1info = { #endif /* DEVinstSize */ &BSIM3v1iSize, /* DEVmodSize */ &BSIM3v1mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ BSIM3v1nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/bsim3v32/Makefile.am b/src/spicelib/devices/bsim3v32/Makefile.am index 9a67b1d40..3c45d5d13 100644 --- a/src/spicelib/devices/bsim3v32/Makefile.am +++ b/src/spicelib/devices/bsim3v32/Makefile.am @@ -15,7 +15,6 @@ libbsim3v32_la_SOURCES = \ b3v32mask.c \ b3v32mdel.c \ b3v32mpar.c \ - b3v32node.c \ b3v32noi.c \ b3v32par.c \ b3v32pzld.c \ @@ -29,6 +28,9 @@ libbsim3v32_la_SOURCES = \ bsim3v32itf.h +if KIRCHHOFF_WANTED +libbsim3v32_la_SOURCES += b3v32node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim3v32/bsim3v32init.c b/src/spicelib/devices/bsim3v32/bsim3v32init.c index 0bdd10f04..da864dbf2 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32init.c +++ b/src/spicelib/devices/bsim3v32/bsim3v32init.c @@ -72,7 +72,10 @@ SPICEdev BSIM3v32info = { #endif /* DEVinstSize */ &BSIM3v32iSize, /* DEVmodSize */ &BSIM3v32mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ BSIM3v32nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/bsim4/Makefile.am b/src/spicelib/devices/bsim4/Makefile.am index 862f52ae7..41fa243cc 100644 --- a/src/spicelib/devices/bsim4/Makefile.am +++ b/src/spicelib/devices/bsim4/Makefile.am @@ -16,7 +16,6 @@ libbsim4_la_SOURCES = \ b4mask.c \ b4mdel.c \ b4mpar.c \ - b4node.c \ b4noi.c \ b4par.c \ b4pzld.c \ @@ -30,6 +29,9 @@ libbsim4_la_SOURCES = \ bsim4itf.h +if KIRCHHOFF_WANTED +libbsim4_la_SOURCES += b4node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index 15c33ff55..b4a25d3e7 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -5346,6 +5346,7 @@ line900: (*(here->BSIM4GPqPtr) -= m * here->BSIM4gtau); } +#ifdef KIRCHHOFF /////////////////////////////////////////// /* KCL verification - Linear and Dynamic Part */ @@ -5642,6 +5643,7 @@ line900: *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * sxpart * here->BSIM4gtau * *(ckt->CKTrhsOld + here->BSIM4qNode) ; *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * here->BSIM4gtau * *(ckt->CKTrhsOld + here->BSIM4qNode) ; } +#endif #endif line1000: ; diff --git a/src/spicelib/devices/bsim4/bsim4init.c b/src/spicelib/devices/bsim4/bsim4init.c index b447a927a..2231590da 100644 --- a/src/spicelib/devices/bsim4/bsim4init.c +++ b/src/spicelib/devices/bsim4/bsim4init.c @@ -72,8 +72,12 @@ SPICEdev BSIM4info = { NULL, /* DEVacct */ #endif &BSIM4iSize, /* DEVinstSize */ - &BSIM4mSize, /* DEVmodSize */ + &BSIM4mSize, /* DEVmodSize */ + +#ifdef KIRCHHOFF BSIM4nodeIsNonLinear /* DEVnodeIsNonLinear */ +#endif + }; diff --git a/src/spicelib/devices/bsim4v4/Makefile.am b/src/spicelib/devices/bsim4v4/Makefile.am index c92a2a6e3..4ec2b2f15 100644 --- a/src/spicelib/devices/bsim4v4/Makefile.am +++ b/src/spicelib/devices/bsim4v4/Makefile.am @@ -16,7 +16,6 @@ libbsim4v4_la_SOURCES = \ b4v4mask.c \ b4v4mdel.c \ b4v4mpar.c \ - b4v4node.c \ b4v4noi.c \ b4v4par.c \ b4v4pzld.c \ @@ -30,6 +29,9 @@ libbsim4v4_la_SOURCES = \ bsim4v4itf.h +if KIRCHHOFF_WANTED +libbsim4v4_la_SOURCES += b4v4node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim4v4/bsim4v4init.c b/src/spicelib/devices/bsim4v4/bsim4v4init.c index e72a4a9e0..142710c4a 100644 --- a/src/spicelib/devices/bsim4v4/bsim4v4init.c +++ b/src/spicelib/devices/bsim4v4/bsim4v4init.c @@ -72,8 +72,12 @@ SPICEdev BSIM4v4info = { NULL, /* DEVacct */ #endif &BSIM4v4iSize, /* DEVinstSize */ - &BSIM4v4mSize, /* DEVmodSize */ + &BSIM4v4mSize, /* DEVmodSize */ + +#ifdef KIRCHHOFF BSIM4v4nodeIsNonLinear /* DEVnodeIsNonLinear */ +#endif + }; diff --git a/src/spicelib/devices/bsim4v5/Makefile.am b/src/spicelib/devices/bsim4v5/Makefile.am index ec5a80d91..570a133e6 100644 --- a/src/spicelib/devices/bsim4v5/Makefile.am +++ b/src/spicelib/devices/bsim4v5/Makefile.am @@ -16,7 +16,6 @@ libbsim4v5_la_SOURCES = \ b4v5mask.c \ b4v5mdel.c \ b4v5mpar.c \ - b4v5node.c \ b4v5noi.c \ b4v5par.c \ b4v5pzld.c \ @@ -30,6 +29,9 @@ libbsim4v5_la_SOURCES = \ bsim4v5itf.h +if KIRCHHOFF_WANTED +libbsim4v5_la_SOURCES += b4v5node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim4v5/bsim4v5init.c b/src/spicelib/devices/bsim4v5/bsim4v5init.c index 3bc4fb9c9..5b381e1fa 100644 --- a/src/spicelib/devices/bsim4v5/bsim4v5init.c +++ b/src/spicelib/devices/bsim4v5/bsim4v5init.c @@ -72,8 +72,12 @@ SPICEdev BSIM4v5info = { NULL, /* DEVacct */ #endif &BSIM4v5iSize, /* DEVinstSize */ - &BSIM4v5mSize, /* DEVmodSize */ + &BSIM4v5mSize, /* DEVmodSize */ + +#ifdef KIRCHHOFF BSIM4v5nodeIsNonLinear /* DEVnodeIsNonLinear */ +#endif + }; diff --git a/src/spicelib/devices/bsim4v6/Makefile.am b/src/spicelib/devices/bsim4v6/Makefile.am index 4e4b9644a..d9ef4bf3b 100644 --- a/src/spicelib/devices/bsim4v6/Makefile.am +++ b/src/spicelib/devices/bsim4v6/Makefile.am @@ -16,7 +16,6 @@ libbsim4v6_la_SOURCES = \ b4v6mask.c \ b4v6mdel.c \ b4v6mpar.c \ - b4v6node.c \ b4v6noi.c \ b4v6par.c \ b4v6pzld.c \ @@ -30,6 +29,9 @@ libbsim4v6_la_SOURCES = \ bsim4v6itf.h +if KIRCHHOFF_WANTED +libbsim4v6_la_SOURCES += b4v6node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim4v6/bsim4v6init.c b/src/spicelib/devices/bsim4v6/bsim4v6init.c index 519d0ff1d..71709ce36 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6init.c +++ b/src/spicelib/devices/bsim4v6/bsim4v6init.c @@ -72,8 +72,12 @@ SPICEdev BSIM4v6info = { NULL, /* DEVacct */ #endif &BSIM4v6iSize, /* DEVinstSize */ - &BSIM4v6mSize, /* DEVmodSize */ + &BSIM4v6mSize, /* DEVmodSize */ + +#ifdef KIRCHHOFF BSIM4v6nodeIsNonLinear /* DEVnodeIsNonLinear */ +#endif + }; diff --git a/src/spicelib/devices/bsimsoi/Makefile.am b/src/spicelib/devices/bsimsoi/Makefile.am index ece831287..55fc07680 100644 --- a/src/spicelib/devices/bsimsoi/Makefile.am +++ b/src/spicelib/devices/bsimsoi/Makefile.am @@ -15,7 +15,6 @@ libbsim4soi_la_SOURCES = \ b4soimask.c \ b4soimdel.c \ b4soimpar.c \ - b4soinode.c \ b4soinoi.c \ b4soipar.c \ b4soipzld.c \ @@ -29,6 +28,9 @@ libbsim4soi_la_SOURCES = \ b4soiitf.h +if KIRCHHOFF_WANTED +libbsim4soi_la_SOURCES += b4soinode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsimsoi/b4soiinit.c b/src/spicelib/devices/bsimsoi/b4soiinit.c index 25835aa24..e6eac027e 100644 --- a/src/spicelib/devices/bsimsoi/b4soiinit.c +++ b/src/spicelib/devices/bsimsoi/b4soiinit.c @@ -71,7 +71,11 @@ SPICEdev B4SOIinfo = { #endif /* DEVinstSize */ &B4SOIiSize, /* DEVmodSize */ &B4SOImSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ B4SOInodeIsNonLinear +#endif + }; SPICEdev * diff --git a/src/spicelib/devices/cap/capinit.c b/src/spicelib/devices/cap/capinit.c index fe5f37122..f3cc19208 100644 --- a/src/spicelib/devices/cap/capinit.c +++ b/src/spicelib/devices/cap/capinit.c @@ -72,7 +72,11 @@ SPICEdev CAPinfo = { #endif /* DEVinstSize */ &CAPiSize, /* DEVmodSize */ &CAPmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif + }; diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index 2f5277647..13e166e30 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -78,8 +78,11 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTrhs+here->CAPposNode) -= m * ceq; *(ckt->CKTrhs+here->CAPnegNode) += m * ceq; +#ifdef KIRCHHOFF *(ckt->CKTfvk+here->CAPposNode) += m * *(ckt->CKTstate0+here->CAPqcap+1) ; *(ckt->CKTfvk+here->CAPnegNode) -= m * *(ckt->CKTstate0+here->CAPqcap+1) ; +#endif + } else *(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap; } diff --git a/src/spicelib/devices/cccs/cccsinit.c b/src/spicelib/devices/cccs/cccsinit.c index 15fb3f063..a36c67843 100644 --- a/src/spicelib/devices/cccs/cccsinit.c +++ b/src/spicelib/devices/cccs/cccsinit.c @@ -72,7 +72,10 @@ SPICEdev CCCSinfo = { #endif /* DEVinstSize */ &CCCSiSize, /* DEVmodSize */ &CCCSmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/cccs/cccsload.c b/src/spicelib/devices/cccs/cccsload.c index e019ee816..39bfec9d0 100644 --- a/src/spicelib/devices/cccs/cccsload.c +++ b/src/spicelib/devices/cccs/cccsload.c @@ -35,8 +35,11 @@ CCCSload(GENmodel *inModel, CKTcircuit *ckt) *(here->CCCSposContBrptr) += here->CCCScoeff ; *(here->CCCSnegContBrptr) -= here->CCCScoeff ; +#ifdef KIRCHHOFF *(ckt->CKTfvk+here->CCCSposNode) += here->CCCScoeff * *(ckt->CKTrhsOld+here->CCCScontBranch) ; *(ckt->CKTfvk+here->CCCSnegNode) -= here->CCCScoeff * *(ckt->CKTrhsOld+here->CCCScontBranch) ; +#endif + } } return(OK); diff --git a/src/spicelib/devices/ccvs/ccvsinit.c b/src/spicelib/devices/ccvs/ccvsinit.c index a52895f19..3f1330863 100644 --- a/src/spicelib/devices/ccvs/ccvsinit.c +++ b/src/spicelib/devices/ccvs/ccvsinit.c @@ -73,7 +73,10 @@ SPICEdev CCVSinfo = { #endif /* DEVinstSize */ &CCVSiSize, /* DEVmodSize */ &CCVSmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/ccvs/ccvsload.c b/src/spicelib/devices/ccvs/ccvsload.c index ec36ea789..53d2b280e 100644 --- a/src/spicelib/devices/ccvs/ccvsload.c +++ b/src/spicelib/devices/ccvs/ccvsload.c @@ -38,8 +38,11 @@ CCVSload(GENmodel *inModel, CKTcircuit *ckt) *(here->CCVSibrNegptr) -= 1.0 ; *(here->CCVSibrContBrptr) -= here->CCVScoeff ; +#ifdef KIRCHHOFF *(ckt->CKTfvk+here->CCVSposNode) += *(ckt->CKTrhsOld+here->CCVSbranch) ; *(ckt->CKTfvk+here->CCVSnegNode) -= *(ckt->CKTrhsOld+here->CCVSbranch) ; +#endif + } } return(OK); diff --git a/src/spicelib/devices/cpl/cplinit.c b/src/spicelib/devices/cpl/cplinit.c index 51575227d..576972a45 100644 --- a/src/spicelib/devices/cpl/cplinit.c +++ b/src/spicelib/devices/cpl/cplinit.c @@ -73,7 +73,10 @@ SPICEdev CPLinfo = { #endif /* DEVinstSize */ &CPLiSize, /* DEVmodSize */ &CPLmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/csw/cswinit.c b/src/spicelib/devices/csw/cswinit.c index a536ef7a1..89d61bc48 100644 --- a/src/spicelib/devices/csw/cswinit.c +++ b/src/spicelib/devices/csw/cswinit.c @@ -75,7 +75,10 @@ SPICEdev CSWinfo = { #endif /* DEVinstSize */ &CSWiSize, /* DEVmodSize */ &CSWmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/dio/Makefile.am b/src/spicelib/devices/dio/Makefile.am index 9b9f9cba5..285d1c27e 100644 --- a/src/spicelib/devices/dio/Makefile.am +++ b/src/spicelib/devices/dio/Makefile.am @@ -21,7 +21,6 @@ libdio_la_SOURCES = \ diomask.c \ diomdel.c \ diompar.c \ - dionode.c \ dionoise.c \ dioparam.c \ diopzld.c \ @@ -35,6 +34,10 @@ libdio_la_SOURCES = \ diotrunc.c +if KIRCHHOFF_WANTED +libdio_la_SOURCES += dionode.c +endif + AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/dio/dioinit.c b/src/spicelib/devices/dio/dioinit.c index 68075152f..3caea6415 100644 --- a/src/spicelib/devices/dio/dioinit.c +++ b/src/spicelib/devices/dio/dioinit.c @@ -74,7 +74,11 @@ SPICEdev DIOinfo = { #endif /* DEVinstSize */ &DIOiSize, /* DEVmodSize */ &DIOmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ DIOnodeIsNonLinear +#endif + }; diff --git a/src/spicelib/devices/hfet1/Makefile.am b/src/spicelib/devices/hfet1/Makefile.am index d2d1a21b7..a8a6e347d 100644 --- a/src/spicelib/devices/hfet1/Makefile.am +++ b/src/spicelib/devices/hfet1/Makefile.am @@ -18,7 +18,6 @@ libhfet_la_SOURCES = \ hfetmask.c \ hfetmdel.c \ hfetmpar.c \ - hfetnode.c \ hfetparam.c \ hfetpzl.c \ hfetsetup.c \ @@ -26,6 +25,9 @@ libhfet_la_SOURCES = \ hfettrunc.c +if KIRCHHOFF_WANTED +libhfet_la_SOURCES += hfetnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/hfet1/hfetinit.c b/src/spicelib/devices/hfet1/hfetinit.c index 8cff12d4e..2a348e688 100644 --- a/src/spicelib/devices/hfet1/hfetinit.c +++ b/src/spicelib/devices/hfet1/hfetinit.c @@ -73,7 +73,10 @@ SPICEdev HFETAinfo = { #endif /* DEVinstSize */ &HFETAiSize, /* DEVmodSize */ &HFETAmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ HFETAnodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/hfet2/Makefile.am b/src/spicelib/devices/hfet2/Makefile.am index b0a8c5b0f..d8e3cf67d 100644 --- a/src/spicelib/devices/hfet2/Makefile.am +++ b/src/spicelib/devices/hfet2/Makefile.am @@ -18,7 +18,6 @@ libhfet2_la_SOURCES = \ hfet2mask.c \ hfet2mdel.c \ hfet2mpar.c \ - hfet2node.c \ hfet2param.c \ hfet2pzl.c \ hfet2setup.c \ @@ -26,6 +25,9 @@ libhfet2_la_SOURCES = \ hfet2trunc.c +if KIRCHHOFF_WANTED +libhfet2_la_SOURCES += hfet2node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/hfet2/hfet2init.c b/src/spicelib/devices/hfet2/hfet2init.c index f66633a86..97a1b5a4e 100644 --- a/src/spicelib/devices/hfet2/hfet2init.c +++ b/src/spicelib/devices/hfet2/hfet2init.c @@ -73,7 +73,10 @@ SPICEdev HFET2info = { #endif /* DEVinstSize */ &HFET2iSize, /* DEVmodSize */ &HFET2mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ HFET2nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/hisim2/Makefile.am b/src/spicelib/devices/hisim2/Makefile.am index ef0c313be..b23039c22 100644 --- a/src/spicelib/devices/hisim2/Makefile.am +++ b/src/spicelib/devices/hisim2/Makefile.am @@ -4,34 +4,38 @@ EXTRA_DIST = noinst_LTLIBRARIES = libhisim2.la -libhisim2_la_SOURCES = hisim2.h \ - hsm2.c \ - hsm2acld.c \ - hsm2ask.c \ - hsm2cvtest.c \ - hsm2def.h \ - hsm2del.c \ - hsm2dest.c \ - hsm2eval.c \ - hsm2evalenv.h \ - hsm2ext.h \ - hsm2getic.c \ - hsm2init.c \ - hsm2init.h \ - hsm2itf.h \ - hsm2ld.c \ - hsm2mask.c \ - hsm2mdel.c \ - hsm2mpar.c \ - hsm2node.c \ - hsm2noi.c \ - hsm2par.c \ - hsm2pzld.c \ - hsm2set.c \ - hsm2temp.c \ - hsm2trunc.c +libhisim2_la_SOURCES = \ + hisim2.h \ + hsm2.c \ + hsm2acld.c \ + hsm2ask.c \ + hsm2cvtest.c \ + hsm2def.h \ + hsm2del.c \ + hsm2dest.c \ + hsm2eval.c \ + hsm2evalenv.h \ + hsm2ext.h \ + hsm2getic.c \ + hsm2init.c \ + hsm2init.h \ + hsm2itf.h \ + hsm2ld.c \ + hsm2mask.c \ + hsm2mdel.c \ + hsm2mpar.c \ + hsm2noi.c \ + hsm2par.c \ + hsm2pzld.c \ + hsm2set.c \ + hsm2temp.c \ + hsm2trunc.c +if KIRCHHOFF_WANTED +libhisim2_la_SOURCES += hsm2node.c +endif + AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/hisim2/hsm2init.c b/src/spicelib/devices/hisim2/hsm2init.c index 337ef7ebf..dbbb0aff7 100644 --- a/src/spicelib/devices/hisim2/hsm2init.c +++ b/src/spicelib/devices/hisim2/hsm2init.c @@ -71,7 +71,10 @@ SPICEdev HSM2info = { #endif /* DEVinstSize */ &HSM2iSize, /* DEVmodSize */ &HSM2mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ HSM2nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/hisimhv1/Makefile.am b/src/spicelib/devices/hisimhv1/Makefile.am index 3f6d13019..360260808 100644 --- a/src/spicelib/devices/hisimhv1/Makefile.am +++ b/src/spicelib/devices/hisimhv1/Makefile.am @@ -2,35 +2,40 @@ noinst_LTLIBRARIES = libhisimhv1.la -libhisimhv1_la_SOURCES = hisimhv.h \ - hsmhv.c \ - hsmhvacld.c \ - hsmhvask.c \ - hsmhvcvtest.c \ - hsmhvdef.h \ - hsmhvdel.c \ - hsmhvdest.c \ - hsmhveval.c \ - hsmhveval_qover.h \ - hsmhvevalenv.h \ - hsmhvext.h \ - hsmhvgetic.c \ - hsmhvinit.c \ - hsmhvinit.h \ - hsmhvitf.h \ - hsmhvld.c \ - hsmhvld_info_eval.h \ - hsmhvmask.c \ - hsmhvmdel.c \ - hsmhvmpar.c \ - hsmhvnode.c \ - hsmhvnoi.c \ - hsmhvpar.c \ - hsmhvpzld.c \ - hsmhvset.c \ - hsmhvtemp.c \ - hsmhvtemp_eval.h \ - hsmhvtrunc.c +libhisimhv1_la_SOURCES = \ + hisimhv.h \ + hsmhv.c \ + hsmhvacld.c \ + hsmhvask.c \ + hsmhvcvtest.c \ + hsmhvdef.h \ + hsmhvdel.c \ + hsmhvdest.c \ + hsmhveval.c \ + hsmhveval_qover.h \ + hsmhvevalenv.h \ + hsmhvext.h \ + hsmhvgetic.c \ + hsmhvinit.c \ + hsmhvinit.h \ + hsmhvitf.h \ + hsmhvld.c \ + hsmhvld_info_eval.h \ + hsmhvmask.c \ + hsmhvmdel.c \ + hsmhvmpar.c \ + hsmhvnoi.c \ + hsmhvpar.c \ + hsmhvpzld.c \ + hsmhvset.c \ + hsmhvtemp.c \ + hsmhvtemp_eval.h \ + hsmhvtrunc.c + + +if KIRCHHOFF_WANTED +libhisimhv1_la_SOURCES += hsmhvnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/hisimhv1/hsmhvinit.c b/src/spicelib/devices/hisimhv1/hsmhvinit.c index d11f72b6a..e025c6aa2 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvinit.c +++ b/src/spicelib/devices/hisimhv1/hsmhvinit.c @@ -71,7 +71,10 @@ SPICEdev HSMHVinfo = { #endif /* DEVinstSize */ &HSMHViSize, /* DEVmodSize */ &HSMHVmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ HSMHVnodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/ind/indinit.c b/src/spicelib/devices/ind/indinit.c index 8e50bacad..fb8cfa296 100644 --- a/src/spicelib/devices/ind/indinit.c +++ b/src/spicelib/devices/ind/indinit.c @@ -72,7 +72,10 @@ SPICEdev INDinfo = { #endif /* DEVinstSize */ &INDiSize, /* DEVmodSize */ &INDmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; @@ -142,7 +145,10 @@ SPICEdev MUTinfo = { #endif /* DEVinstSize */ &MUTiSize, /* DEVmodSize */ &MUTmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/ind/indload.c b/src/spicelib/devices/ind/indload.c index 878e68463..7eed3a9dc 100644 --- a/src/spicelib/devices/ind/indload.c +++ b/src/spicelib/devices/ind/indload.c @@ -122,8 +122,11 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) *(here->INDibrNegptr) -= 1; *(here->INDibrIbrptr) -= req; +#ifdef KIRCHHOFF *(ckt->CKTfvk+here->INDposNode) += *(ckt->CKTrhsOld+here->INDbrEq) ; *(ckt->CKTfvk+here->INDnegNode) -= *(ckt->CKTrhsOld+here->INDbrEq) ; +#endif + } } return(OK); diff --git a/src/spicelib/devices/isrc/isrcinit.c b/src/spicelib/devices/isrc/isrcinit.c index 3cfb594b3..c8260709a 100644 --- a/src/spicelib/devices/isrc/isrcinit.c +++ b/src/spicelib/devices/isrc/isrcinit.c @@ -73,7 +73,11 @@ SPICEdev ISRCinfo = { #endif /* DEVinstSize */ &ISRCiSize, /* DEVmodSize */ &ISRCmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif + }; diff --git a/src/spicelib/devices/isrc/isrcload.c b/src/spicelib/devices/isrc/isrcload.c index 5c1f2e257..a2c15b65c 100644 --- a/src/spicelib/devices/isrc/isrcload.c +++ b/src/spicelib/devices/isrc/isrcload.c @@ -386,8 +386,10 @@ loadDone: *(ckt->CKTrhs + (here->ISRCposNode)) += m * value; *(ckt->CKTrhs + (here->ISRCnegNode)) -= m * value; +#ifdef KIRCHHOFF *(ckt->CKTfvk + (here->ISRCposNode)) -= value; *(ckt->CKTfvk + (here->ISRCnegNode)) += value; +#endif /* gtri - end - wbk - modify to process srcFact, etc. for all sources */ diff --git a/src/spicelib/devices/jfet/Makefile.am b/src/spicelib/devices/jfet/Makefile.am index 638e5d4ba..d714f92aa 100644 --- a/src/spicelib/devices/jfet/Makefile.am +++ b/src/spicelib/devices/jfet/Makefile.am @@ -20,7 +20,6 @@ libjfet_la_SOURCES = \ jfetmask.c \ jfetmdel.c \ jfetmpar.c \ - jfetnode.c \ jfetnoi.c \ jfetpar.c \ jfetpzld.c \ @@ -29,6 +28,9 @@ libjfet_la_SOURCES = \ jfettrun.c +if KIRCHHOFF_WANTED +libjfet_la_SOURCES += jfetnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/jfet/jfetinit.c b/src/spicelib/devices/jfet/jfetinit.c index 04edab98c..ad58f7a3b 100644 --- a/src/spicelib/devices/jfet/jfetinit.c +++ b/src/spicelib/devices/jfet/jfetinit.c @@ -73,7 +73,10 @@ SPICEdev JFETinfo = { #endif /* DEVinstSize */ &JFETiSize, /* DEVmodSize */ &JFETmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ JFETnodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/jfet2/Makefile.am b/src/spicelib/devices/jfet2/Makefile.am index 2a4199507..2bcfbdfeb 100644 --- a/src/spicelib/devices/jfet2/Makefile.am +++ b/src/spicelib/devices/jfet2/Makefile.am @@ -18,7 +18,6 @@ libjfet2_la_SOURCES = \ jfet2mask.c \ jfet2mdel.c \ jfet2mpar.c \ - jfet2node.c \ jfet2noi.c \ jfet2par.c \ jfet2parm.h \ @@ -29,7 +28,9 @@ libjfet2_la_SOURCES = \ psmodel.h - +if KIRCHHOFF_WANTED +libjfet2_la_SOURCES += jfet2node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/jfet2/jfet2init.c b/src/spicelib/devices/jfet2/jfet2init.c index d152fbab2..7b90d19f6 100644 --- a/src/spicelib/devices/jfet2/jfet2init.c +++ b/src/spicelib/devices/jfet2/jfet2init.c @@ -73,7 +73,10 @@ SPICEdev JFET2info = { #endif /* DEVinstSize */ &JFET2iSize, /* DEVmodSize */ &JFET2mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ JFET2nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/ltra/ltrainit.c b/src/spicelib/devices/ltra/ltrainit.c index 2bb17cc78..c68a4eac0 100644 --- a/src/spicelib/devices/ltra/ltrainit.c +++ b/src/spicelib/devices/ltra/ltrainit.c @@ -73,7 +73,10 @@ SPICEdev LTRAinfo = { #endif /* DEVinstSize */ <RAiSize, /* DEVmodSize */ <RAmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/mes/Makefile.am b/src/spicelib/devices/mes/Makefile.am index 26abe963c..e55ad0a08 100644 --- a/src/spicelib/devices/mes/Makefile.am +++ b/src/spicelib/devices/mes/Makefile.am @@ -20,7 +20,6 @@ libmes_la_SOURCES = \ mesmask.c \ mesmdel.c \ mesmpar.c \ - mesnode.c \ mesnoise.c \ mesparam.c \ mespzld.c \ @@ -29,6 +28,9 @@ libmes_la_SOURCES = \ mestrunc.c +if KIRCHHOFF_WANTED +libmes_la_SOURCES += mesnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/mes/mesinit.c b/src/spicelib/devices/mes/mesinit.c index d39f2c89a..4bac1ef51 100644 --- a/src/spicelib/devices/mes/mesinit.c +++ b/src/spicelib/devices/mes/mesinit.c @@ -73,7 +73,10 @@ SPICEdev MESinfo = { #endif /* DEVinstSize */ &MESiSize, /* DEVmodSize */ &MESmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ MESnodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/mesa/Makefile.am b/src/spicelib/devices/mesa/Makefile.am index 119d4b60b..3ff59e79a 100644 --- a/src/spicelib/devices/mesa/Makefile.am +++ b/src/spicelib/devices/mesa/Makefile.am @@ -18,7 +18,6 @@ libmesa_la_SOURCES = \ mesamask.c \ mesamdel.c \ mesamparam.c \ - mesanode.c \ mesaparam.c \ mesapzl.c \ mesasetup.c \ @@ -26,6 +25,9 @@ libmesa_la_SOURCES = \ mesatrunc.c +if KIRCHHOFF_WANTED +libmesa_la_SOURCES += mesanode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/mesa/mesainit.c b/src/spicelib/devices/mesa/mesainit.c index 2c9f42578..0c2a69ea8 100644 --- a/src/spicelib/devices/mesa/mesainit.c +++ b/src/spicelib/devices/mesa/mesainit.c @@ -73,7 +73,10 @@ SPICEdev MESAinfo = { #endif /* DEVinstSize */ &MESAiSize, /* DEVmodSize */ &MESAmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ MESAnodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/mos1/Makefile.am b/src/spicelib/devices/mos1/Makefile.am index 7b0f728c7..42b2b7ce8 100644 --- a/src/spicelib/devices/mos1/Makefile.am +++ b/src/spicelib/devices/mos1/Makefile.am @@ -21,7 +21,6 @@ libmos1_la_SOURCES = \ mos1mask.c \ mos1mdel.c \ mos1mpar.c \ - mos1node.c \ mos1noi.c \ mos1par.c \ mos1pzld.c \ @@ -35,6 +34,9 @@ libmos1_la_SOURCES = \ mos1trun.c +if KIRCHHOFF_WANTED +libmos1_la_SOURCES += mos1node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/mos1/mos1init.c b/src/spicelib/devices/mos1/mos1init.c index c66987378..008871d06 100644 --- a/src/spicelib/devices/mos1/mos1init.c +++ b/src/spicelib/devices/mos1/mos1init.c @@ -73,7 +73,11 @@ SPICEdev MOS1info = { #endif /* DEVinstSize */ &MOS1iSize, /* DEVmodSize */ &MOS1mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ MOS1nodeIsNonLinear +#endif + }; diff --git a/src/spicelib/devices/mos1/mos1load.c b/src/spicelib/devices/mos1/mos1load.c index a4f949e87..fbec07e76 100644 --- a/src/spicelib/devices/mos1/mos1load.c +++ b/src/spicelib/devices/mos1/mos1load.c @@ -945,7 +945,7 @@ next1: if(vbs <= -3*vt) { *(here->MOS1SPdpPtr) += (-here->MOS1gds-xrev* (here->MOS1gm+here->MOS1gmbs)); - +#ifdef KIRCHHOFF /* KCL verification - Linear-Dynamic Part */ *(ckt->CKTfvk+here->MOS1gNode) += model->MOS1type * (ceqgs_fvk + ceqgb_fvk + ceqgd_fvk) ; *(ckt->CKTfvk+here->MOS1bNode) += ceqbs_fvk + ceqbd_fvk - model->MOS1type * ceqgb_fvk ; @@ -962,6 +962,8 @@ next1: if(vbs <= -3*vt) { *(ckt->CKTfvk+here->MOS1sNode) -= here->MOS1sourceConductance * *(ckt->CKTrhsOld+here->MOS1sNodePrime) ; *(ckt->CKTfvk+here->MOS1dNodePrime) -= here->MOS1drainConductance * *(ckt->CKTrhsOld+here->MOS1dNode) ; *(ckt->CKTfvk+here->MOS1sNodePrime) -= here->MOS1sourceConductance * *(ckt->CKTrhsOld+here->MOS1sNode) ; +#endif + } } return(OK); diff --git a/src/spicelib/devices/mos2/Makefile.am b/src/spicelib/devices/mos2/Makefile.am index 8f9cb0bd1..dd24b0bd5 100644 --- a/src/spicelib/devices/mos2/Makefile.am +++ b/src/spicelib/devices/mos2/Makefile.am @@ -21,7 +21,6 @@ libmos2_la_SOURCES = \ mos2mask.c \ mos2mdel.c \ mos2mpar.c \ - mos2node.c \ mos2noi.c \ mos2par.c \ mos2pzld.c \ @@ -35,6 +34,10 @@ libmos2_la_SOURCES = \ mos2trun.c +if KIRCHHOFF_WANTED +libmos2_la_SOURCES += mos2node.c +endif + AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/mos2/mos2init.c b/src/spicelib/devices/mos2/mos2init.c index 647128be3..3b5bc7a6b 100644 --- a/src/spicelib/devices/mos2/mos2init.c +++ b/src/spicelib/devices/mos2/mos2init.c @@ -73,7 +73,11 @@ SPICEdev MOS2info = { #endif /* DEVinstSize */ &MOS2iSize, /* DEVmodSize */ &MOS2mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ MOS2nodeIsNonLinear +#endif + }; diff --git a/src/spicelib/devices/mos3/Makefile.am b/src/spicelib/devices/mos3/Makefile.am index fe0f1eac6..7c288e47f 100644 --- a/src/spicelib/devices/mos3/Makefile.am +++ b/src/spicelib/devices/mos3/Makefile.am @@ -21,7 +21,6 @@ libmos3_la_SOURCES = \ mos3mask.c \ mos3mdel.c \ mos3mpar.c \ - mos3node.c \ mos3noi.c \ mos3par.c \ mos3pzld.c \ @@ -35,6 +34,10 @@ libmos3_la_SOURCES = \ mos3trun.c +if KIRCHHOFF_WANTED +libmos3_la_SOURCES += mos3node.c +endif + AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/mos3/mos3init.c b/src/spicelib/devices/mos3/mos3init.c index 93f81face..1e194265f 100644 --- a/src/spicelib/devices/mos3/mos3init.c +++ b/src/spicelib/devices/mos3/mos3init.c @@ -73,7 +73,10 @@ SPICEdev MOS3info = { #endif /* DEVinstSize */ &MOS3iSize, /* DEVmodSize */ &MOS3mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ MOS3nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/mos6/Makefile.am b/src/spicelib/devices/mos6/Makefile.am index 876c8c5c5..c0b6c51a8 100644 --- a/src/spicelib/devices/mos6/Makefile.am +++ b/src/spicelib/devices/mos6/Makefile.am @@ -16,13 +16,15 @@ libmos6_la_SOURCES = \ mos6load.c \ mos6mask.c \ mos6mpar.c \ - mos6node.c \ mos6par.c \ mos6set.c \ mos6temp.c \ mos6trun.c +if KIRCHHOFF_WANTED +libmos6_la_SOURCES += mos6node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/mos6/mos6init.c b/src/spicelib/devices/mos6/mos6init.c index 8cde3a3de..a22c42ee8 100644 --- a/src/spicelib/devices/mos6/mos6init.c +++ b/src/spicelib/devices/mos6/mos6init.c @@ -73,7 +73,11 @@ SPICEdev MOS6info = { #endif /* DEVinstSize */ &MOS6iSize, /* DEVmodSize */ &MOS6mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ MOS6nodeIsNonLinear +#endif + }; diff --git a/src/spicelib/devices/mos6/mos6load.c b/src/spicelib/devices/mos6/mos6load.c index ebbab1115..d07e6c56e 100644 --- a/src/spicelib/devices/mos6/mos6load.c +++ b/src/spicelib/devices/mos6/mos6load.c @@ -961,7 +961,7 @@ bypass: *(here->MOS6SPdpPtr) += m * (-here->MOS6gds-xrev* (here->MOS6gm+here->MOS6gmbs)); - +#ifdef KIRCHHOFF /* KCL verification - Dynamic Part */ *(ckt->CKTfvk+here->MOS6gNode) += model->MOS6type * (ceqgs_fvk + ceqgb_fvk + ceqgd_fvk) ; *(ckt->CKTfvk+here->MOS6bNode) += ceqbs_fvk + ceqbd_fvk - model->MOS6type * ceqgb_fvk ; @@ -978,6 +978,8 @@ bypass: *(ckt->CKTfvk+here->MOS6sNode) -= here->MOS6sourceConductance * *(ckt->CKTrhsOld+here->MOS6sNodePrime) ; *(ckt->CKTfvk+here->MOS6dNodePrime) -= here->MOS6drainConductance * *(ckt->CKTrhsOld+here->MOS6dNode) ; *(ckt->CKTfvk+here->MOS6sNodePrime) -= here->MOS6sourceConductance * *(ckt->CKTrhsOld+here->MOS6sNode) ; +#endif + } } return(OK); diff --git a/src/spicelib/devices/mos9/Makefile.am b/src/spicelib/devices/mos9/Makefile.am index 6c557b4ce..93337596f 100644 --- a/src/spicelib/devices/mos9/Makefile.am +++ b/src/spicelib/devices/mos9/Makefile.am @@ -21,7 +21,6 @@ libmos9_la_SOURCES = \ mos9mask.c \ mos9mdel.c \ mos9mpar.c \ - mos9node.c \ mos9noi.c \ mos9par.c \ mos9pzld.c \ @@ -35,6 +34,9 @@ libmos9_la_SOURCES = \ mos9trun.c +if KIRCHHOFF_WANTED +libmos9_la_SOURCES += mos9node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/mos9/mos9init.c b/src/spicelib/devices/mos9/mos9init.c index cf1d9b7c8..46edf84d5 100644 --- a/src/spicelib/devices/mos9/mos9init.c +++ b/src/spicelib/devices/mos9/mos9init.c @@ -73,7 +73,10 @@ SPICEdev MOS9info = { #endif /* DEVinstSize */ &MOS9iSize, /* DEVmodSize */ &MOS9mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ MOS9nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index 1b92472e1..49150c08c 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -73,7 +73,10 @@ SPICEdev RESinfo = { #endif /* DEVinstSize */ &RESiSize, /* DEVmodSize */ &RESmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index 725edc253..07d3673e3 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -35,8 +35,10 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) *(here->RESposNegptr) -= m * here->RESconduct; *(here->RESnegPosptr) -= m * here->RESconduct; +#ifdef KIRCHHOFF *(ckt->CKTfvk+here->RESposNode) += here->REScurrent ; *(ckt->CKTfvk+here->RESnegNode) -= here->REScurrent ; +#endif } } diff --git a/src/spicelib/devices/soi3/Makefile.am b/src/spicelib/devices/soi3/Makefile.am index 4d7060ded..c12cbd813 100644 --- a/src/spicelib/devices/soi3/Makefile.am +++ b/src/spicelib/devices/soi3/Makefile.am @@ -20,7 +20,6 @@ libsoi3_la_SOURCES = \ soi3mask.c \ soi3mdel.c \ soi3mpar.c \ - soi3node.c \ soi3nois.c \ soi3par.c \ soi3set.c \ @@ -28,6 +27,9 @@ libsoi3_la_SOURCES = \ soi3trun.c +if KIRCHHOFF_WANTED +libsoi3_la_SOURCES += soi3node.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/soi3/soi3init.c b/src/spicelib/devices/soi3/soi3init.c index 29e3589e1..c6cda673c 100644 --- a/src/spicelib/devices/soi3/soi3init.c +++ b/src/spicelib/devices/soi3/soi3init.c @@ -73,7 +73,10 @@ SPICEdev SOI3info = { #endif /* DEVinstSize */ &SOI3iSize, /* DEVmodSize */ &SOI3mSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ SOI3nodeIsNonLinear +#endif }; diff --git a/src/spicelib/devices/sw/swinit.c b/src/spicelib/devices/sw/swinit.c index cf8049300..fa570a222 100644 --- a/src/spicelib/devices/sw/swinit.c +++ b/src/spicelib/devices/sw/swinit.c @@ -74,7 +74,10 @@ SPICEdev SWinfo = { #endif /* CIDER */ /* DEVinstSize */ &SWiSize, /* DEVmodSize */ &SWmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/tra/trainit.c b/src/spicelib/devices/tra/trainit.c index 38601b2ed..b94626ca0 100644 --- a/src/spicelib/devices/tra/trainit.c +++ b/src/spicelib/devices/tra/trainit.c @@ -73,7 +73,10 @@ SPICEdev TRAinfo = { #endif /* DEVinstSize */ &TRAiSize, /* DEVmodSize */ &TRAmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/txl/txlinit.c b/src/spicelib/devices/txl/txlinit.c index 2437ed414..0c13db6f2 100644 --- a/src/spicelib/devices/txl/txlinit.c +++ b/src/spicelib/devices/txl/txlinit.c @@ -78,7 +78,10 @@ SPICEdev TXLinfo = { #endif /* DEVinstSize */ &TXLiSize, /* DEVmodSize */ &TXLmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/urc/urcinit.c b/src/spicelib/devices/urc/urcinit.c index d415f9774..2a7b20f70 100644 --- a/src/spicelib/devices/urc/urcinit.c +++ b/src/spicelib/devices/urc/urcinit.c @@ -73,7 +73,10 @@ SPICEdev URCinfo = { #endif /* DEVinstSize */ &URCiSize, /* DEVmodSize */ &URCmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/vbic/Makefile.am b/src/spicelib/devices/vbic/Makefile.am index ccbb722c0..71d628d30 100644 --- a/src/spicelib/devices/vbic/Makefile.am +++ b/src/spicelib/devices/vbic/Makefile.am @@ -19,7 +19,6 @@ libvbic_la_SOURCES = \ vbicmask.c \ vbicmdel.c \ vbicmpar.c \ - vbicnode.c \ vbicnoise.c \ vbicparam.c \ vbicpzld.c \ @@ -28,6 +27,9 @@ libvbic_la_SOURCES = \ vbictrunc.c +if KIRCHHOFF_WANTED +libvbic_la_SOURCES += vbicnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/vbic/vbicinit.c b/src/spicelib/devices/vbic/vbicinit.c index 6cb4f1796..172df0536 100644 --- a/src/spicelib/devices/vbic/vbicinit.c +++ b/src/spicelib/devices/vbic/vbicinit.c @@ -78,7 +78,10 @@ SPICEdev VBICinfo = { #endif &VBICiSize, /* DEVinstSize */ &VBICmSize, /* DEVmodSize */ + +#ifdef KIRCHHOFF VBICnodeIsNonLinear /* DEVnodeIsNonLinear */ +#endif }; diff --git a/src/spicelib/devices/vccs/vccsinit.c b/src/spicelib/devices/vccs/vccsinit.c index 4c7c02dca..d6ec790ee 100644 --- a/src/spicelib/devices/vccs/vccsinit.c +++ b/src/spicelib/devices/vccs/vccsinit.c @@ -73,7 +73,10 @@ SPICEdev VCCSinfo = { #endif /* DEVinstSize */ &VCCSiSize, /* DEVmodSize */ &VCCSmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/vccs/vccsload.c b/src/spicelib/devices/vccs/vccsload.c index 6c45fd96c..6be9fce00 100644 --- a/src/spicelib/devices/vccs/vccsload.c +++ b/src/spicelib/devices/vccs/vccsload.c @@ -36,10 +36,13 @@ VCCSload(GENmodel *inModel, CKTcircuit *ckt) *(here->VCCSnegContPosptr) -= here->VCCScoeff ; *(here->VCCSnegContNegptr) += here->VCCScoeff ; +#ifdef KIRCHHOFF *(ckt->CKTfvk+here->VCCSposNode) += here->VCCScoeff * *(ckt->CKTrhsOld+here->VCCScontPosNode) ; *(ckt->CKTfvk+here->VCCSposNode) -= here->VCCScoeff * *(ckt->CKTrhsOld+here->VCCScontNegNode) ; *(ckt->CKTfvk+here->VCCSnegNode) -= here->VCCScoeff * *(ckt->CKTrhsOld+here->VCCScontPosNode) ; *(ckt->CKTfvk+here->VCCSnegNode) += here->VCCScoeff * *(ckt->CKTrhsOld+here->VCCScontNegNode) ; +#endif + } } return(OK); diff --git a/src/spicelib/devices/vcvs/vcvsinit.c b/src/spicelib/devices/vcvs/vcvsinit.c index 8b87288e4..7c6d311b3 100644 --- a/src/spicelib/devices/vcvs/vcvsinit.c +++ b/src/spicelib/devices/vcvs/vcvsinit.c @@ -73,7 +73,10 @@ SPICEdev VCVSinfo = { #endif /* DEVinstSize */ &VCVSiSize, /* DEVmodSize */ &VCVSmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif }; diff --git a/src/spicelib/devices/vcvs/vcvsload.c b/src/spicelib/devices/vcvs/vcvsload.c index da5a1ec1b..b2e345912 100644 --- a/src/spicelib/devices/vcvs/vcvsload.c +++ b/src/spicelib/devices/vcvs/vcvsload.c @@ -38,8 +38,11 @@ VCVSload(GENmodel *inModel, CKTcircuit *ckt) *(here->VCVSibrContPosptr) -= here->VCVScoeff ; *(here->VCVSibrContNegptr) += here->VCVScoeff ; +#ifdef KIRCHHOFF *(ckt->CKTfvk+here->VCVSposNode) += *(ckt->CKTrhsOld+here->VCVSbranch) ; *(ckt->CKTfvk+here->VCVSnegNode) -= *(ckt->CKTrhsOld+here->VCVSbranch) ; +#endif + } } return(OK); diff --git a/src/spicelib/devices/vsrc/vsrcinit.c b/src/spicelib/devices/vsrc/vsrcinit.c index 6e6f02e88..a2e973efb 100644 --- a/src/spicelib/devices/vsrc/vsrcinit.c +++ b/src/spicelib/devices/vsrc/vsrcinit.c @@ -73,7 +73,11 @@ SPICEdev VSRCinfo = { #endif /* DEVinstSize */ &VSRCiSize, /* DEVmodSize */ &VSRCmSize, + +#ifdef KIRCHHOFF /* DEVnodeIsNonLinear */ NULL +#endif + }; diff --git a/src/spicelib/devices/vsrc/vsrcload.c b/src/spicelib/devices/vsrc/vsrcload.c index a3b7b6869..c71f11c00 100644 --- a/src/spicelib/devices/vsrc/vsrcload.c +++ b/src/spicelib/devices/vsrc/vsrcload.c @@ -45,8 +45,10 @@ VSRCload(GENmodel *inModel, CKTcircuit *ckt) *(here->VSRCibrPosptr) += 1.0 ; *(here->VSRCibrNegptr) -= 1.0 ; +#ifdef KIRCHHOFF *(ckt->CKTfvk+here->VSRCposNode) += *(ckt->CKTrhsOld+here->VSRCbranch) ; *(ckt->CKTfvk+here->VSRCnegNode) -= *(ckt->CKTrhsOld+here->VSRCbranch) ; +#endif if( (ckt->CKTmode & (MODEDCOP | MODEDCTRANCURVE)) && here->VSRCdcGiven ) { From 0e59399e2a0ce64caef7d9eababdb944f89f3e01 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 27 May 2013 10:27:08 +0200 Subject: [PATCH 240/257] Avoid to verify Delta-V, since it's included in the KCL Verification --- src/maths/ni/niconv.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index b43c68fcf..836594abd 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -22,15 +22,15 @@ NIconvTest(CKTcircuit *ckt) int size; /* size of the matrix */ CKTnode *node; /* current matrix entry */ -//#ifndef KIRCHHOFF +#ifndef KIRCHHOFF double old; double new; double tol; -//#endif +#endif size = SMPmatSize (ckt->CKTmatrix) ; -//#ifndef KIRCHHOFF +#ifndef KIRCHHOFF #ifdef STEPDEBUG for (i=1;i<=size;i++) { new = ckt->CKTrhs [i] ; @@ -59,8 +59,8 @@ NIconvTest(CKTcircuit *ckt) } } -//#else -#ifdef KIRCHHOFF +#else + /* KCL Verification */ double maximum = 0 ; From d75fe9e10c36c0e8f984e7f294e8f4eb1d8f2db8 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 2 Jun 2013 12:30:00 +0200 Subject: [PATCH 241/257] Fixed the case in which the KCL is not enabled --- src/maths/ni/niconv.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 836594abd..48ed9a577 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -28,9 +28,10 @@ NIconvTest(CKTcircuit *ckt) double tol; #endif - size = SMPmatSize (ckt->CKTmatrix) ; + size = SMPmatSize(ckt->CKTmatrix); #ifndef KIRCHHOFF + node = ckt->CKTnodes; #ifdef STEPDEBUG for (i=1;i<=size;i++) { new = ckt->CKTrhs [i] ; @@ -38,8 +39,6 @@ NIconvTest(CKTcircuit *ckt) printf("chk for convergence: %s new: %g old: %g\n",CKTnodName(ckt,i),new,old); } #endif /* STEPDEBUG */ - - node = ckt->CKTnodes ; for (i=1;i<=size;i++) { node = node->next; new = ckt->CKTrhs [i] ; @@ -51,6 +50,18 @@ NIconvTest(CKTcircuit *ckt) #ifdef STEPDEBUG printf(" non-convergence at node (type=3) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",CKTnodName(ckt,i),new,old,tol); printf(" reltol: %g voltTol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + voltTol)\n",ckt->CKTreltol,ckt->CKTvoltTol); +#endif /* STEPDEBUG */ + ckt->CKTtroubleNode = i; + ckt->CKTtroubleElt = NULL; + return(1); + } + } else { + tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + + ckt->CKTabstol; + if (fabs(new-old) >tol ) { +#ifdef STEPDEBUG + printf(" non-convergence at node (type=%d) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",node->type,CKTnodName(ckt,i),new,old,tol); + printf(" reltol: %g abstol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + abstol)\n",ckt->CKTreltol,ckt->CKTabstol); #endif /* STEPDEBUG */ ckt->CKTtroubleNode = i; ckt->CKTtroubleElt = NULL; From 8d166ebcc9ec1f4a5be68d575c7a0375317c595a Mon Sep 17 00:00:00 2001 From: h_vogt Date: Tue, 4 Jun 2013 22:59:08 +0200 Subject: [PATCH 242/257] enable compilation with MS Visual Studio 2008 --- src/maths/ni/niconv.c | 3 +- visualc/vngspice.vcproj | 140 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 136 insertions(+), 7 deletions(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 48ed9a577..53e1b5e08 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -26,6 +26,8 @@ NIconvTest(CKTcircuit *ckt) double old; double new; double tol; +#else + double maximum = 0 ; #endif size = SMPmatSize(ckt->CKTmatrix); @@ -73,7 +75,6 @@ NIconvTest(CKTcircuit *ckt) #else /* KCL Verification */ - double maximum = 0 ; node = ckt->CKTnodes ; for (i = 1 ; i <= size ; i++) diff --git a/visualc/vngspice.vcproj b/visualc/vngspice.vcproj index 92e1638e6..9fa1d5d5d 100644 --- a/visualc/vngspice.vcproj +++ b/visualc/vngspice.vcproj @@ -49,7 +49,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories=""$(ProjectDir)..\src\maths\poly";"$(ProjectDir)..\src\frontend";"$(ProjectDir)..\src\spicelib\devices";"$(ProjectDir)include";"$(ProjectDir)..\src\include";"C:\Program Files (x86)\Visual Leak Detector\include"" - PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;NGDEBUG;XSPICE" + PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;NGDEBUG;XSPICE;KIRCHHOFF" MinimalRebuild="true" ExceptionHandling="0" BasicRuntimeChecks="0" @@ -790,7 +790,7 @@ FavorSizeOrSpeed="1" WholeProgramOptimization="true" AdditionalIncludeDirectories=""$(ProjectDir)..\src\maths\poly";"$(ProjectDir)..\src\frontend";"$(ProjectDir)..\src\spicelib\devices";"$(ProjectDir)..\src\include";"$(ProjectDir)include"" - PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;USE_OMP" + PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;USE_OMP;KIRCHHOFF" MinimalRebuild="false" ExceptionHandling="1" BasicRuntimeChecks="0" @@ -2144,10 +2144,6 @@ RelativePath="..\src\frontend\init.h" > - - @@ -2188,6 +2184,10 @@ RelativePath="..\src\frontend\parser\input.h" > + + @@ -3216,6 +3216,10 @@ RelativePath="..\src\spicelib\devices\asrc\asrcmdel.c" > + + @@ -3296,6 +3300,10 @@ RelativePath="..\src\spicelib\devices\bsim1\b1mpar.c" > + + @@ -3372,6 +3380,10 @@ RelativePath="..\src\spicelib\devices\bsim2\b2mpar.c" > + + @@ -3444,6 +3456,10 @@ RelativePath="..\src\spicelib\devices\bsim3\b3mpar.c" > + + @@ -3512,6 +3528,10 @@ RelativePath="..\src\spicelib\devices\bsim3soi_dd\b3soiddmpar.c" > + + @@ -3588,6 +3608,10 @@ RelativePath="..\src\spicelib\devices\bsim3soi_fd\b3soifdmpar.c" > + + @@ -3664,6 +3688,10 @@ RelativePath="..\src\spicelib\devices\bsim3soi_pd\b3soipdmpar.c" > + + @@ -3740,6 +3768,10 @@ RelativePath="..\src\spicelib\devices\bsim3v0\b3v0mpar.c" > + + @@ -3812,6 +3844,10 @@ RelativePath="..\src\spicelib\devices\bsim3v1\b3v1mpar.c" > + + @@ -3884,6 +3920,10 @@ RelativePath="..\src\spicelib\devices\bsim3v32\b3v32mpar.c" > + + @@ -3960,6 +4000,10 @@ RelativePath="..\src\spicelib\devices\bsim4\b4mpar.c" > + + @@ -4028,6 +4072,10 @@ RelativePath="..\src\spicelib\devices\bsimsoi\b4soimpar.c" > + + @@ -4112,6 +4160,10 @@ RelativePath="..\src\spicelib\devices\bsim4v4\b4v4mpar.c" > + + @@ -4188,6 +4240,10 @@ RelativePath="..\src\spicelib\devices\bsim4v5\b4v5mpar.c" > + + @@ -4264,6 +4320,10 @@ RelativePath="..\src\spicelib\devices\bsim4v6\b4v6mpar.c" > + + @@ -4356,6 +4416,10 @@ RelativePath="..\src\spicelib\devices\bjt\bjtmpar.c" > + + @@ -5352,6 +5416,10 @@ RelativePath="..\src\spicelib\devices\dio\diompar.c" > + + @@ -5668,6 +5736,10 @@ RelativePath="..\src\spicelib\devices\hfet2\hfet2mpar.c" > + + @@ -5728,6 +5800,10 @@ RelativePath="..\src\spicelib\devices\hfet1\hfetmpar.c" > + + @@ -5804,6 +5880,10 @@ RelativePath="..\src\spicelib\devices\hisim2\hsm2mpar.c" > + + @@ -5880,6 +5960,10 @@ RelativePath="..\src\spicelib\devices\hisimhv1\hsmhvmpar.c" > + + @@ -6364,6 +6448,10 @@ RelativePath="..\src\spicelib\devices\jfet2\jfet2mpar.c" > + + @@ -6432,6 +6520,10 @@ RelativePath="..\src\spicelib\devices\jfet\jfetmpar.c" > + + @@ -6616,6 +6708,10 @@ RelativePath="..\src\spicelib\devices\mesa\mesamparam.c" > + + @@ -6688,6 +6784,10 @@ RelativePath="..\src\spicelib\devices\mes\mesmpar.c" > + + @@ -6872,6 +6972,10 @@ RelativePath="..\src\spicelib\devices\mos1\mos1mpar.c" > + + @@ -6972,6 +7076,10 @@ RelativePath="..\src\spicelib\devices\mos2\mos2mpar.c" > + + @@ -7072,6 +7180,10 @@ RelativePath="..\src\spicelib\devices\mos3\mos3mpar.c" > + + @@ -7152,6 +7264,10 @@ RelativePath="..\src\spicelib\devices\mos6\mos6mpar.c" > + + @@ -7224,6 +7340,10 @@ RelativePath="..\src\spicelib\devices\mos9\mos9mpar.c" > + + @@ -8068,6 +8188,10 @@ RelativePath="..\src\spicelib\devices\soi3\soi3mpar.c" > + + @@ -8564,6 +8688,10 @@ RelativePath="..\src\spicelib\devices\vbic\vbicmpar.c" > + + From e102ebebe3d28856a8cb35392136dea920f33696 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Thu, 6 Jun 2013 08:05:27 +0200 Subject: [PATCH 243/257] Implemented a new check for the KCL Verification, based on the maximum of the unknown current branches at each voltage node. Please note that this check introduces the theoretically correct check, but, since achieving this target involves the perfect knowledge of every model, we can use this suboptimal and practical check (to be extended with the other possible unknown current branches) --- src/spicelib/analysis/cktmkcurKCL.c | 21 ++++++++++++++++++++ src/spicelib/devices/ind/indnode.c | 29 ++++++++++++++++++++++++++++ src/spicelib/devices/vsrc/vsrcnode.c | 29 ++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 src/spicelib/analysis/cktmkcurKCL.c create mode 100644 src/spicelib/devices/ind/indnode.c create mode 100644 src/spicelib/devices/vsrc/vsrcnode.c diff --git a/src/spicelib/analysis/cktmkcurKCL.c b/src/spicelib/analysis/cktmkcurKCL.c new file mode 100644 index 000000000..4506af60c --- /dev/null +++ b/src/spicelib/analysis/cktmkcurKCL.c @@ -0,0 +1,21 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/sperror.h" +#include "ngspice/cktdefs.h" + +int +CKTmkCurKCL (CKTcircuit *ckt, int i, double **node) +{ + CKTmkCurKCLnode *tempNode ; + + tempNode = TMALLOC (CKTmkCurKCLnode, 1) ; + tempNode->KCLcurrent = 0.0 ; + tempNode->next = ckt->CKTmkCurKCLarray [i] ; + ckt->CKTmkCurKCLarray [i] = tempNode ; + *node = &(tempNode->KCLcurrent) ; + + return (OK) ; +} diff --git a/src/spicelib/devices/ind/indnode.c b/src/spicelib/devices/ind/indnode.c new file mode 100644 index 000000000..bb1203981 --- /dev/null +++ b/src/spicelib/devices/ind/indnode.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "inddefs.h" +#include "ngspice/sperror.h" + +int +INDnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + INDmodel *model = (INDmodel *)inModel ; + INDinstance *here ; + int error ; + + /* loop through all the IND models */ + for ( ; model != NULL ; model = model->INDnextModel) + { + /* loop through all the instances of the model */ + for (here = model->INDinstances ; here != NULL ; here = here->INDnextInstance) + { + error = CKTmkCurKCL (ckt, here->INDposNode, &(here->KCLcurrentPos)) ; + error = CKTmkCurKCL (ckt, here->INDnegNode, &(here->KCLcurrentNeg)) ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/vsrc/vsrcnode.c b/src/spicelib/devices/vsrc/vsrcnode.c new file mode 100644 index 000000000..fe733593c --- /dev/null +++ b/src/spicelib/devices/vsrc/vsrcnode.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "vsrcdefs.h" +#include "ngspice/sperror.h" + +int +VSRCnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + VSRCmodel *model = (VSRCmodel *)inModel ; + VSRCinstance *here ; + int error ; + + /* loop through all the VSRC models */ + for ( ; model != NULL ; model = model->VSRCnextModel) + { + /* loop through all the instances of the model */ + for (here = model->VSRCinstances ; here != NULL ; here = here->VSRCnextInstance) + { + error = CKTmkCurKCL (ckt, here->VSRCposNode, &(here->KCLcurrentPos)) ; + error = CKTmkCurKCL (ckt, here->VSRCnegNode, &(here->KCLcurrentNeg)) ; + } + } + + return (OK) ; +} From 2b27524b5141c14bda43a6a76ad237cc50ae3b4f Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Thu, 6 Jun 2013 08:16:43 +0200 Subject: [PATCH 244/257] Implemented a new check for the KCL Verification, based on the maximum of the unknown current branches at each voltage node. Please note that this check introduces the theoretically correct check, but, since achieving this target involves the perfect knowledge of every model, we can use this suboptimal and practical check (to be extended with the other possible unknown current branches) --- src/include/ngspice/cktdefs.h | 14 +++++- src/maths/ni/niconv.c | 64 ++++++++++++++++++--------- src/maths/ni/nireinit.c | 6 +++ src/spicelib/analysis/Makefile.am | 4 ++ src/spicelib/devices/cpl/cplinit.c | 2 +- src/spicelib/devices/csw/cswinit.c | 2 +- src/spicelib/devices/ind/Makefile.am | 3 ++ src/spicelib/devices/ind/inddefs.h | 5 +++ src/spicelib/devices/ind/indext.h | 4 ++ src/spicelib/devices/ind/indinit.c | 2 +- src/spicelib/devices/ind/indload.c | 6 +++ src/spicelib/devices/vsrc/Makefile.am | 3 ++ src/spicelib/devices/vsrc/vsrcdefs.h | 6 +++ src/spicelib/devices/vsrc/vsrcext.h | 4 ++ src/spicelib/devices/vsrc/vsrcinit.c | 2 +- src/spicelib/devices/vsrc/vsrcload.c | 6 +++ 16 files changed, 107 insertions(+), 26 deletions(-) diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 32e209d07..e6a3361d0 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -56,6 +56,12 @@ struct CKTnode { #define PARM_IC 2 #define PARM_NODETYPE 3 +#ifdef KIRCHHOFF +typedef struct sCKTmkCurKCLnode { + double KCLcurrent ; + struct sCKTmkCurKCLnode *next ; +} CKTmkCurKCLnode ; +#endif struct CKTcircuit { @@ -114,6 +120,8 @@ struct CKTcircuit { #ifdef KIRCHHOFF double *CKTfvk ; /* KCL Verification array */ int *CKTnodeIsLinear ; /* Flag to indicate if a node is linear or non-linear */ + int *CKTvoltCurNode ; /* Flag to indicate if a node contains some direct unknown currents */ + CKTmkCurKCLnode **CKTmkCurKCLarray ; /* Array of KCL Currents */ #endif double *CKTrhsSpare; /* spare rhs value for reordering */ @@ -290,7 +298,11 @@ struct CKTcircuit { }; -/* Now function prottypes */ +/* Now function prototypes */ + +#ifdef KIRCHHOFF +extern int CKTmkCurKCL (CKTcircuit *, int, double **) ; +#endif extern int ACan(CKTcircuit *, int); extern int ACaskQuest(CKTcircuit *, JOB *, int , IFvalue *); diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 53e1b5e08..cf1097999 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -21,19 +21,23 @@ NIconvTest(CKTcircuit *ckt) int i; /* generic loop variable */ int size; /* size of the matrix */ CKTnode *node; /* current matrix entry */ - -#ifndef KIRCHHOFF double old; double new; double tol; -#else - double maximum = 0 ; + +#ifdef KIRCHHOFF +#ifdef STEPDEBUG + int j ; +#endif + + double maximum ; + CKTmkCurKCLnode *ptr ; + #endif size = SMPmatSize(ckt->CKTmatrix); - -#ifndef KIRCHHOFF node = ckt->CKTnodes; + #ifdef STEPDEBUG for (i=1;i<=size;i++) { new = ckt->CKTrhs [i] ; @@ -41,6 +45,7 @@ NIconvTest(CKTcircuit *ckt) printf("chk for convergence: %s new: %g old: %g\n",CKTnodName(ckt,i),new,old); } #endif /* STEPDEBUG */ + for (i=1;i<=size;i++) { node = node->next; new = ckt->CKTrhs [i] ; @@ -49,53 +54,70 @@ NIconvTest(CKTcircuit *ckt) tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + ckt->CKTvoltTol; if (fabs(new-old) >tol ) { + #ifdef STEPDEBUG printf(" non-convergence at node (type=3) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",CKTnodName(ckt,i),new,old,tol); printf(" reltol: %g voltTol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + voltTol)\n",ckt->CKTreltol,ckt->CKTvoltTol); #endif /* STEPDEBUG */ + ckt->CKTtroubleNode = i; ckt->CKTtroubleElt = NULL; return(1); } + +#ifndef KIRCHHOFF } else { tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + ckt->CKTabstol; if (fabs(new-old) >tol ) { + #ifdef STEPDEBUG printf(" non-convergence at node (type=%d) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",node->type,CKTnodName(ckt,i),new,old,tol); printf(" reltol: %g abstol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + abstol)\n",ckt->CKTreltol,ckt->CKTabstol); #endif /* STEPDEBUG */ + ckt->CKTtroubleNode = i; ckt->CKTtroubleElt = NULL; return(1); } +#endif + } } -#else +#ifdef KIRCHHOFF + node = ckt->CKTnodes; /* KCL Verification */ - node = ckt->CKTnodes ; for (i = 1 ; i <= size ; i++) { node = node->next ; - if (node->type == SP_CURRENT) - { - if (maximum < fabs (ckt->CKTrhs [i])) - maximum = fabs (ckt->CKTrhs [i]) ; - } - } - - node = ckt->CKTnodes ; - for (i = 1 ; i <= size ; i++) - { - node = node->next ; - if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i])) + if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i]) && (ckt->CKTvoltCurNode [i])) { + maximum = 0 ; + ptr = ckt->CKTmkCurKCLarray [i] ; #ifdef STEPDEBUG - fprintf (stderr, "Index: %d\tValue: %-.9g\tThreshold: %-.9g\n", i, fabs (ckt->CKTfvk [i]), ckt->CKTreltol * maximum + ckt->CKTabstol) ; + j = 0 ; +#endif + + while (ptr != NULL) + { + if (maximum < fabs (ptr->KCLcurrent)) + maximum = fabs (ptr->KCLcurrent) ; + +#ifdef STEPDEBUG + fprintf (stderr, "Index KCL Array: %d\tValue: %-.9g\tMaximum: %-.9g\n", j, fabs(ptr->KCLcurrent), maximum) ; + j++ ; +#endif + + ptr = ptr->next ; + } + +#ifdef STEPDEBUG + fprintf (stderr, "Index: %d\tValue: %-.9g\tThreshold: %-.9g\tMaximum: %-.9g\n", i, fabs (ckt->CKTfvk [i]), + ckt->CKTreltol * maximum + ckt->CKTabstol, maximum) ; #endif if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) diff --git a/src/maths/ni/nireinit.c b/src/maths/ni/nireinit.c index 30dce7b1f..805e2ea5f 100644 --- a/src/maths/ni/nireinit.c +++ b/src/maths/ni/nireinit.c @@ -40,6 +40,12 @@ NIreinit( CKTcircuit *ckt) CKALLOC(CKTnodeIsLinear,size+1,int); for (i = 0 ; i <= size ; i++) ckt->CKTnodeIsLinear [i] = 1 ; + CKALLOC(CKTvoltCurNode,size+1,int); + for (i = 0 ; i <= size ; i++) + ckt->CKTvoltCurNode [i] = 0 ; + CKALLOC(CKTmkCurKCLarray,size+1,CKTmkCurKCLnode*); + for (i = 0 ; i <= size ; i++) + ckt->CKTmkCurKCLarray [i] = NULL ; #endif #ifdef PREDICTOR diff --git a/src/spicelib/analysis/Makefile.am b/src/spicelib/analysis/Makefile.am index 86d6b7371..03d8f1ab0 100644 --- a/src/spicelib/analysis/Makefile.am +++ b/src/spicelib/analysis/Makefile.am @@ -107,6 +107,10 @@ libckt_la_SOURCES += \ endif +if KIRCHHOFF_WANTED +libckt_la_SOURCES += cktmkcurKCL.c +endif + AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include -I$(top_srcdir)/src/spicelib/devices AM_CFLAGS = $(STATIC) MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/cpl/cplinit.c b/src/spicelib/devices/cpl/cplinit.c index 576972a45..be0bd922c 100644 --- a/src/spicelib/devices/cpl/cplinit.c +++ b/src/spicelib/devices/cpl/cplinit.c @@ -75,7 +75,7 @@ SPICEdev CPLinfo = { /* DEVmodSize */ &CPLmSize, #ifdef KIRCHHOFF -/* DEVnodeIsLinear */ NULL +/* DEVnodeIsNonLinear */ NULL #endif }; diff --git a/src/spicelib/devices/csw/cswinit.c b/src/spicelib/devices/csw/cswinit.c index 89d61bc48..b2fbe4dc4 100644 --- a/src/spicelib/devices/csw/cswinit.c +++ b/src/spicelib/devices/csw/cswinit.c @@ -77,7 +77,7 @@ SPICEdev CSWinfo = { /* DEVmodSize */ &CSWmSize, #ifdef KIRCHHOFF - /* DEVnodeIsLinear */ NULL + /* DEVnodeIsNonLinear */ NULL #endif }; diff --git a/src/spicelib/devices/ind/Makefile.am b/src/spicelib/devices/ind/Makefile.am index 5a05ee97b..5bf3c7871 100644 --- a/src/spicelib/devices/ind/Makefile.am +++ b/src/spicelib/devices/ind/Makefile.am @@ -40,6 +40,9 @@ libind_la_SOURCES = \ muttemp.c +if KIRCHHOFF_WANTED +libind_la_SOURCES += indnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/ind/inddefs.h b/src/spicelib/devices/ind/inddefs.h index f024d1490..b91d3fb1f 100644 --- a/src/spicelib/devices/ind/inddefs.h +++ b/src/spicelib/devices/ind/inddefs.h @@ -63,6 +63,11 @@ typedef struct sINDinstance { int INDsenParmNo; /* parameter # for sensitivity use; set equal to 0 if not a design parameter*/ +#ifdef KIRCHHOFF + double *KCLcurrentPos ; + double *KCLcurrentNeg ; +#endif + } INDinstance ; #define INDflux INDstate /* flux in the inductor */ diff --git a/src/spicelib/devices/ind/indext.h b/src/spicelib/devices/ind/indext.h index 8d2fa035c..56bfe0e7a 100644 --- a/src/spicelib/devices/ind/indext.h +++ b/src/spicelib/devices/ind/indext.h @@ -25,6 +25,10 @@ extern int INDunsetup(GENmodel*,CKTcircuit*); extern int INDtemp(GENmodel*, CKTcircuit*); extern int INDtrunc(GENmodel*,CKTcircuit*,double*); +#ifdef KIRCHHOFF +extern int INDnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif + extern int MUTacLoad(GENmodel*,CKTcircuit*); extern int MUTask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); extern int MUTdelete(GENmodel*,IFuid,GENinstance**); diff --git a/src/spicelib/devices/ind/indinit.c b/src/spicelib/devices/ind/indinit.c index fb8cfa296..0513f2750 100644 --- a/src/spicelib/devices/ind/indinit.c +++ b/src/spicelib/devices/ind/indinit.c @@ -74,7 +74,7 @@ SPICEdev INDinfo = { /* DEVmodSize */ &INDmSize, #ifdef KIRCHHOFF - /* DEVnodeIsNonLinear */ NULL + /* DEVnodeIsNonLinear */ INDnodeIsNonLinear #endif }; diff --git a/src/spicelib/devices/ind/indload.c b/src/spicelib/devices/ind/indload.c index 7eed3a9dc..e763cf4a7 100644 --- a/src/spicelib/devices/ind/indload.c +++ b/src/spicelib/devices/ind/indload.c @@ -125,6 +125,12 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) #ifdef KIRCHHOFF *(ckt->CKTfvk+here->INDposNode) += *(ckt->CKTrhsOld+here->INDbrEq) ; *(ckt->CKTfvk+here->INDnegNode) -= *(ckt->CKTrhsOld+here->INDbrEq) ; + + *(ckt->CKTvoltCurNode+here->INDposNode) = 1 ; + *(ckt->CKTvoltCurNode+here->INDnegNode) = 1 ; + + *(here->KCLcurrentPos) = *(ckt->CKTrhsOld+here->INDbrEq) ; + *(here->KCLcurrentNeg) = -(*(ckt->CKTrhsOld+here->INDbrEq)) ; #endif } diff --git a/src/spicelib/devices/vsrc/Makefile.am b/src/spicelib/devices/vsrc/Makefile.am index 28d5fb38b..5d6495b03 100644 --- a/src/spicelib/devices/vsrc/Makefile.am +++ b/src/spicelib/devices/vsrc/Makefile.am @@ -24,6 +24,9 @@ libvsrc_la_SOURCES = \ vsrctemp.c +if KIRCHHOFF_WANTED +libvsrc_la_SOURCES += vsrcnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/vsrc/vsrcdefs.h b/src/spicelib/devices/vsrc/vsrcdefs.h index 1e60e3db3..ed534fb3c 100644 --- a/src/spicelib/devices/vsrc/vsrcdefs.h +++ b/src/spicelib/devices/vsrc/vsrcdefs.h @@ -75,6 +75,12 @@ typedef struct sVSRCinstance { unsigned VSRCdF1given :1 ; /* flag to indicate source is an f1 distortion input */ unsigned VSRCdF2given :1 ; /* flag to indicate source is an f2 distortion input */ unsigned VSRCrGiven :1 ; /* flag to indicate repeating pwl */ + +#ifdef KIRCHHOFF + double *KCLcurrentPos ; + double *KCLcurrentNeg ; +#endif + } VSRCinstance ; diff --git a/src/spicelib/devices/vsrc/vsrcext.h b/src/spicelib/devices/vsrc/vsrcext.h index 980efbf8e..a0eca1408 100644 --- a/src/spicelib/devices/vsrc/vsrcext.h +++ b/src/spicelib/devices/vsrc/vsrcext.h @@ -18,3 +18,7 @@ extern int VSRCsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int VSRCunsetup(GENmodel*,CKTcircuit*); extern int VSRCpzSetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int VSRCtemp(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF +extern int VSRCnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/vsrc/vsrcinit.c b/src/spicelib/devices/vsrc/vsrcinit.c index a2e973efb..7e75c7b4d 100644 --- a/src/spicelib/devices/vsrc/vsrcinit.c +++ b/src/spicelib/devices/vsrc/vsrcinit.c @@ -75,7 +75,7 @@ SPICEdev VSRCinfo = { /* DEVmodSize */ &VSRCmSize, #ifdef KIRCHHOFF - /* DEVnodeIsNonLinear */ NULL + /* DEVnodeIsNonLinear */ VSRCnodeIsNonLinear #endif }; diff --git a/src/spicelib/devices/vsrc/vsrcload.c b/src/spicelib/devices/vsrc/vsrcload.c index c71f11c00..429f91118 100644 --- a/src/spicelib/devices/vsrc/vsrcload.c +++ b/src/spicelib/devices/vsrc/vsrcload.c @@ -48,6 +48,12 @@ VSRCload(GENmodel *inModel, CKTcircuit *ckt) #ifdef KIRCHHOFF *(ckt->CKTfvk+here->VSRCposNode) += *(ckt->CKTrhsOld+here->VSRCbranch) ; *(ckt->CKTfvk+here->VSRCnegNode) -= *(ckt->CKTrhsOld+here->VSRCbranch) ; + + *(ckt->CKTvoltCurNode+here->VSRCposNode) = 1 ; + *(ckt->CKTvoltCurNode+here->VSRCnegNode) = 1 ; + + *(here->KCLcurrentPos) = *(ckt->CKTrhsOld+here->VSRCbranch) ; + *(here->KCLcurrentNeg) = -(*(ckt->CKTrhsOld+here->VSRCbranch)) ; #endif if( (ckt->CKTmode & (MODEDCOP | MODEDCTRANCURVE)) && From 8d015a5a6fd39067295be69fb680965bef8649fe Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 23 Jun 2013 11:57:08 +0200 Subject: [PATCH 245/257] Implemented the FINAL infrastructure for the KCL Verification. BSIM4v7 is still under development --- src/maths/ni/niconv.c | 22 +- src/spicelib/devices/bsim4/b4ld.c | 352 +++++--------------------- src/spicelib/devices/bsim4/b4node.c | 54 ++++ src/spicelib/devices/bsim4/bsim4def.h | 33 +++ src/spicelib/devices/cap/Makefile.am | 3 + src/spicelib/devices/cap/capdefs.h | 5 + src/spicelib/devices/cap/capext.h | 3 + src/spicelib/devices/cap/capinit.c | 2 +- src/spicelib/devices/cap/capload.c | 7 +- src/spicelib/devices/cap/capnode.c | 29 +++ src/spicelib/devices/dio/diodefs.h | 6 + src/spicelib/devices/dio/dioext.h | 3 + src/spicelib/devices/dio/dioload.c | 11 + src/spicelib/devices/dio/dionode.c | 5 + src/spicelib/devices/res/Makefile.am | 3 + src/spicelib/devices/res/resdefs.h | 5 + src/spicelib/devices/res/resext.h | 4 + src/spicelib/devices/res/resload.c | 3 + src/spicelib/devices/res/resnode.c | 29 +++ 19 files changed, 276 insertions(+), 303 deletions(-) create mode 100644 src/spicelib/devices/cap/capnode.c create mode 100644 src/spicelib/devices/res/resnode.c diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index cf1097999..570ceff09 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -15,6 +15,7 @@ Author: 1985 Thomas L. Quarles #include "ngspice/smpdefs.h" + int NIconvTest(CKTcircuit *ckt) { @@ -80,20 +81,10 @@ NIconvTest(CKTcircuit *ckt) ckt->CKTtroubleElt = NULL; return(1); } -#endif - +#else + /* KCL Verification */ } - } - -#ifdef KIRCHHOFF - node = ckt->CKTnodes; - - /* KCL Verification */ - node = ckt->CKTnodes ; - for (i = 1 ; i <= size ; i++) - { - node = node->next ; - if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i]) && (ckt->CKTvoltCurNode [i])) + else if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i]) && (ckt->CKTvoltCurNode [i])) { maximum = 0 ; ptr = ckt->CKTmkCurKCLarray [i] ; @@ -108,7 +99,7 @@ NIconvTest(CKTcircuit *ckt) maximum = fabs (ptr->KCLcurrent) ; #ifdef STEPDEBUG - fprintf (stderr, "Index KCL Array: %d\tValue: %-.9g\tMaximum: %-.9g\n", j, fabs(ptr->KCLcurrent), maximum) ; + fprintf (stderr, "Index KCL Array: %d\tValue: %-.9g\tMaximum: %-.9g\n", j, fabs (ptr->KCLcurrent), maximum) ; j++ ; #endif @@ -122,9 +113,10 @@ NIconvTest(CKTcircuit *ckt) if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) return 1 ; +#endif + } } -#endif #ifdef NEWCONV i = CKTconvTest(ckt); diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index b4a25d3e7..88c4077dd 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -4621,7 +4621,7 @@ line860: ceqqd_SnodePrime_fvk = ceqqd ; ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb + gcbdb * vbd + gcbsb * vbs; - ceqqb_fvk = cqbody - gcbgmb * vgmb ; + ceqqb_fvk = cqbody ; ceqqb_SnodePrime_fvk = ceqqb ; if (here->BSIM4rgateMod == 3) @@ -5349,300 +5349,82 @@ line900: #ifdef KIRCHHOFF /////////////////////////////////////////// - /* KCL verification - Linear and Dynamic Part */ -/* *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; - *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (T1 * ddxpart_dVd + dxpart * ggtd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; - *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode) ; - *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (dxpart * ggtg + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; - *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (- dxpart * ggts - T1 * ddxpart_dVs) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; - *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (- T1 * ddxpart_dVb - dxpart * ggtb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; /* NO ceqgdtot in FVK */ + *(here->KCLcurrentdNodePrime_1) = -(m * ceqjd_fvk) ; + *(here->KCLcurrentdNodePrime_2) = m * ceqbd_fvk ; + *(here->KCLcurrentdNodePrime_3) = m * ceqdrn_fvk ; + *(here->KCLcurrentdNodePrime_4) = m * ceqqd_fvk ; + *(here->KCLcurrentdNodePrime_5) = -(m * Idtoteq_fvk) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; /* NO ceqgcrg in FVK */ + *(here->KCLcurrentgNodePrime_1) = m * ceqqg_fvk ; + *(here->KCLcurrentgNodePrime_2) = m * Igtoteq_fvk ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (- gcsdb - T1 * dsxpart_dVd - sxpart * ggtd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (gcsgb + sxpart * ggtg + T1 * dsxpart_dVg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (T1 * dsxpart_dVs + gstot + gcssb + sxpart * ggts) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * gstot * *(ckt->CKTrhsOld+here->BSIM4sNode) ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (gjbs - gcsbb - sxpart * ggtb - T1 * dsxpart_dVb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; - - *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (- gjbd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; - *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (- gjbs) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; - *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (gjbd + gjbs - gcbgmb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; - - if (here->BSIM4rgateMod == 1) - { - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (- ggtg + gIgtotg) * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (- ggtd + gIgtotd) * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (- ggts + gIgtots) * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (- ggtb + gIgtotb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; - } - - if (!here->BSIM4rbodyMod) - { - } else { - *(ckt->CKTfvk+here->BSIM4dbNode) += m * (ceqjd_fvk + ceqqjd_fvk) ; - - *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; - - *(ckt->CKTfvk+here->BSIM4sbNode) += m * (ceqjs_fvk + ceqqjs_fvk) ; - - *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqd_SnodePrime_fvk + ceqqg_SnodePrime_fvk + ceqqb_SnodePrime_fvk + ceqqjd_SnodePrime_fvk + ceqqjs_SnodePrime_fvk + ceqqgmid_fvk + Istoteq_fvk) ; - } - -*/ - /* KCL verification - Linear and Static Part */ -/* if (here->BSIM4rgateMod == 1) - { - *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodeExt) ; - *(ckt->CKTfvk+here->BSIM4gNodeExt) -= m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * geltd * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) ; - } - - *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * gdpr * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; - *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * gdpr * *(ckt->CKTrhsOld+here->BSIM4dNode) ; - - *(ckt->CKTfvk+here->BSIM4dNode) -= m * gdpr * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) ; - *(ckt->CKTfvk+here->BSIM4dNode) += m * gdpr * *(ckt->CKTrhsOld+here->BSIM4dNode) ; - - *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * gspr * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * gspr * *(ckt->CKTrhsOld+here->BSIM4sNode) ; - - *(ckt->CKTfvk+here->BSIM4sNode) -= m * gspr * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) ; - *(ckt->CKTfvk+here->BSIM4sNode) += m * gspr * *(ckt->CKTrhsOld+here->BSIM4sNode) ; - - if (here->BSIM4rbodyMod) - { - *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (- gcsbsb) * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; - - *(ckt->CKTfvk+here->BSIM4dbNode) += m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; - *(ckt->CKTfvk+here->BSIM4dbNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4bNode) ; - *(ckt->CKTfvk+here->BSIM4dbNode) += m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; - *(ckt->CKTfvk+here->BSIM4dbNode) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; - - *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; - *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld+here->BSIM4bNode) ; - *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; - *(ckt->CKTfvk+here->BSIM4bNodePrime) += m * (here->BSIM4grbpd + here->BSIM4grbps + here->BSIM4grbpb) * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; - - *(ckt->CKTfvk+here->BSIM4sbNode) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; - *(ckt->CKTfvk+here->BSIM4sbNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4bNode) ; - *(ckt->CKTfvk+here->BSIM4sbNode) += m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; - *(ckt->CKTfvk+here->BSIM4sbNode) += m * here->BSIM4grbps * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; - - *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld+here->BSIM4dbNode) ; - *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) ; - *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld+here->BSIM4sbNode) ; - *(ckt->CKTfvk+here->BSIM4bNode) += m * (here->BSIM4grbsb + here->BSIM4grbdb + here->BSIM4grbpb) * *(ckt->CKTrhsOld+here->BSIM4bNode) ; - } -*/ - -////////////////////////////////////////////// - -// RHS - *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (ceqjd - ceqbd + ceqgdtot - ceqdrn - ceqqd + Idtoteq) ; /* NO ceqgdtot in FVK */ - - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (ceqqg - ceqgcrg + Igtoteq) ; /* NO ceqgcrg in FVK */ - - if (here->BSIM4rgateMod == 2) - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * ceqgcrg ; /* NO ceqgcrg in FVK */ - else if (here->BSIM4rgateMod == 3) - *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (ceqqgmid + ceqgcrg) ; /* NO ceqgcrg in FVK */ + if (here->BSIM4rgateMod == 3) + { + *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * ceqqgmid_fvk ; /* NO ceqgcrg in FVK */ + *(here->KCLcurrentgNodeMid) = m * ceqqgmid_fvk ; + } if (!here->BSIM4rbodyMod) { - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqjd - ceqjs - ceqqb + Ibtoteq) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs - + ceqqg + ceqqb + ceqqd + ceqqgmid - ceqgstot + Istoteq) ; /* NO ceqgstot in FVK */ - } else { - *(ckt->CKTfvk + here->BSIM4dbNode) += m * (ceqjd + ceqqjd) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * (ceqbd + ceqbs - ceqqb + Ibtoteq) ; - *(ckt->CKTfvk + here->BSIM4sbNode) += m * (ceqjs + ceqqjs) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ceqdrn - ceqbs + ceqjs + ceqqd - + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid - ceqgstot + Istoteq) ; /* NO ceqgstot in FVK */ - } + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqjd_fvk - ceqjs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; + *(here->KCLcurrentbNodePrime_1) = -(m * ceqbd_fvk) ; + *(here->KCLcurrentbNodePrime_2) = -(m * ceqbs_fvk) ; + *(here->KCLcurrentbNodePrime_3) = m * ceqjd_fvk ; + *(here->KCLcurrentbNodePrime_4) = m * ceqjs_fvk ; + *(here->KCLcurrentbNodePrime_5) = m * ceqqb_fvk ; + *(here->KCLcurrentbNodePrime_6) = -(m * Ibtoteq_fvk) ; - if (model->BSIM4rdsMod) - { - *(ckt->CKTfvk + here->BSIM4dNode) += m * ceqgdtot ; /* NO ceqgdtot in FVK */ - *(ckt->CKTfvk + here->BSIM4sNode) -= m * ceqgstot ; /* NO ceqgstot in FVK */ + *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + + ceqqg_fvk + ceqqb_fvk + ceqqd_fvk + + ceqqgmid_fvk + Istoteq_fvk) ; /* NO ceqgstot in FVK */ + *(here->KCLcurrentsNodePrime_1) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrime_2) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrime_3) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrime_4) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrime_5) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrime_6) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrime_7) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrime_8) = -(m * Istoteq_fvk) ; + } else { + *(ckt->CKTfvk+here->BSIM4dbNode) += m * (ceqjd_fvk + ceqqjd_fvk) ; + *(here->KCLcurrentdbNode_1) = m * ceqjd_fvk ; + *(here->KCLcurrentdbNode_2) = m * ceqqjd_fvk ; + + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; + *(here->KCLcurrentbNodePrime_1) = -(m * ceqbd_fvk) ; + *(here->KCLcurrentbNodePrime_2) = -(m * ceqbs_fvk) ; + *(here->KCLcurrentbNodePrime_3) = m * ceqqb_fvk ; + *(here->KCLcurrentbNodePrime_4) = -(m * Ibtoteq_fvk) ; + + *(ckt->CKTfvk+here->BSIM4sbNode) += m * (ceqjs_fvk + ceqqjs_fvk) ; + *(here->KCLcurrentsbNode_1) = m * ceqjs_fvk ; + *(here->KCLcurrentsbNode_2) = m * ceqqjs_fvk ; + + *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqd_fvk + + ceqqg_fvk + ceqqb_fvk + ceqqjd_fvk + ceqqjs_fvk + + ceqqgmid_fvk + Istoteq_fvk) ; /* NO ceqgstot in FVK */ + *(here->KCLcurrentsNodePrime_1) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrime_2) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrime_3) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrime_4) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrime_5) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrime_6) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrime_7) = -(m * ceqqjd_fvk) ; + *(here->KCLcurrentsNodePrime_8) = -(m * ceqqjs_fvk) ; + *(here->KCLcurrentsNodePrime_9) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrime_10) = -(m * Istoteq_fvk) ; } if (here->BSIM4trnqsMod) - *(ckt->CKTfvk + here->BSIM4qNode) -= m * (cqcheq - cqdef) ; + { + *(ckt->CKTfvk+here->BSIM4qNode) -= m * (cqcheq_fvk - cqdef_fvk) ; + *(here->KCLcurrentqNode_1) = -(m * cqcheq_fvk) ; + *(here->KCLcurrentqNode_2) = m * cqdef_fvk ; + } - -// Matrice - if (here->BSIM4rgateMod == 1) - { - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; - *(ckt->CKTfvk + here->BSIM4gNodeExt) -= m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcggb + geltd - ggtg + gIgtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgdb - ggtd + gIgtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgsb - ggts + gIgtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgbb - ggtb + gIgtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - } /* WDLiu: gcrg already subtracted from all gcrgg below */ - else if (here->BSIM4rgateMod == 2) - { - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrg * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrgg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrgd * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrgs * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * gcrgb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * gcrg * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcggb - gcrgg - ggtg + gIgtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgdb - gcrgd - ggtd + gIgtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgsb - gcrgs - ggts + gIgtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgbb - gcrgb - ggtb + gIgtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - } - else if (here->BSIM4rgateMod == 3) - { - *(ckt->CKTfvk + here->BSIM4gNodeExt) += m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; - *(ckt->CKTfvk + here->BSIM4gNodeExt) -= m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; - *(ckt->CKTfvk + here->BSIM4gNodeMid) -= m * geltd * *(ckt->CKTrhsOld + here->BSIM4gNodeExt) ; - *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (geltd + gcrg + gcgmgmb) * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; - *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (gcrgd + gcgmdb) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * gcrgg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (gcrgs + gcgmsb) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodeMid) += m * (gcrgb + gcgmbb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * gcdgmb * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * gcrg * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * gcsgmb * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * gcbgmb * *(ckt->CKTrhsOld + here->BSIM4gNodeMid) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcggb - gcrgg - ggtg + gIgtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgdb - gcrgd - ggtd + gIgtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgsb - gcrgs - ggts + gIgtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgbb - gcrgb - ggtb + gIgtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - } else { - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcggb - ggtg + gIgtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgdb - ggtd + gIgtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgsb - ggts + gIgtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) += m * (gcgbb - ggtb + gIgtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - } - - if (model->BSIM4rdsMod) - { - *(ckt->CKTfvk + here->BSIM4dNode) += m * gdtotg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dNode) += m * gdtots * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dNode) += m * gdtotb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4sNode) += m * gstotd * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4sNode) += m * gstotg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4sNode) += m * gstotb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - } - - *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * (gdpr + here->BSIM4gds + here->BSIM4gbd + T1 * ddxpart_dVd - gdtotd + RevSum - + gcddb + gbdpdp + dxpart * ggtd - gIdtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (gdpr + gdtot) * *(ckt->CKTrhsOld + here->BSIM4dNode) ; - - *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * (Gm + gcdgb - gdtotg + gbdpg - gIdtotg + dxpart * ggtg - + T1 * ddxpart_dVg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (here->BSIM4gds + gdtots - dxpart * ggts + gIdtots - T1 * ddxpart_dVs - + FwdSum - gcdsb - gbdpsp) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (gjbd + gdtotb - Gmbs - gcdbb - gbdpb + gIdtotb - T1 * ddxpart_dVb - - dxpart * ggtb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4dNode) -= m * (gdpr - gdtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4dNode) += m * (gdpr + gdtot) * *(ckt->CKTrhsOld + here->BSIM4dNode) ; - - *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (here->BSIM4gds + gstotd + RevSum - gcsdb - gbspdp - T1 * dsxpart_dVd - - sxpart * ggtd + gIstotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * (gcsgb - Gm - gstotg + gbspg + sxpart * ggtg + T1 * dsxpart_dVg - - gIstotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * (gspr + here->BSIM4gds + here->BSIM4gbs + T1 * dsxpart_dVs - gstots + FwdSum - + gcssb + gbspsp + sxpart * ggts - gIstots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (gspr + gstot) * *(ckt->CKTrhsOld + here->BSIM4sNode) ; - - *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (gjbs + gstotb + Gmbs - gcsbb - gbspb - sxpart * ggtb - T1 * dsxpart_dVb - + gIstotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4sNode) -= m * (gspr - gstots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4sNode) += m * (gspr + gstot) * *(ckt->CKTrhsOld + here->BSIM4sNode) ; - - *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (gcbdb - gjbd + gbbdp - gIbtotd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (gcbgb - here->BSIM4gbgs - gIbtotg) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (gcbsb - gjbs + gbbsp - gIbtots) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - - *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (gjbd + gjbs + gcbbb - here->BSIM4gbbs - - gIbtotb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - - ggidld = here->BSIM4ggidld; - ggidlg = here->BSIM4ggidlg; - ggidlb = here->BSIM4ggidlb; - ggislg = here->BSIM4ggislg; - ggisls = here->BSIM4ggisls; - ggislb = here->BSIM4ggislb; - - /* stamp gidl */ - *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * ggidld * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * ggidlg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dNodePrime) -= m * (ggidlg + ggidld + ggidlb) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * ggidlb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggidld * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggidlg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (ggidlg + ggidld + ggidlb) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggidlb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - - /* stamp gisl */ - *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (ggisls + ggislg + ggislb) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * ggislg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * ggisls * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * ggislb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (ggislg + ggisls + ggislb) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggislg * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggisls * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * ggislb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - - if (here->BSIM4rbodyMod) - { - *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * (gcdbdb - here->BSIM4gbd) * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) -= m * (here->BSIM4gbs - gcsbsb) * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; - *(ckt->CKTfvk + here->BSIM4dbNode) += m * (gcdbdb - here->BSIM4gbd) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dbNode) += m * (here->BSIM4gbd - gcdbdb + here->BSIM4grbpd - + here->BSIM4grbdb) * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; - *(ckt->CKTfvk + here->BSIM4dbNode) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dbNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld + here->BSIM4bNode) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbpd * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld + here->BSIM4bNode) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; - *(ckt->CKTfvk + here->BSIM4bNodePrime) += m * (here->BSIM4grbpd + here->BSIM4grbps - + here->BSIM4grbpb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - - /* WDLiu: (gcbbb - here->BSIM4gbbs) already added to BPbpPtr */ - - *(ckt->CKTfvk + here->BSIM4sbNode) += m * (gcsbsb - here->BSIM4gbs) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4sbNode) -= m * here->BSIM4grbps * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4sbNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld + here->BSIM4bNode) ; - *(ckt->CKTfvk + here->BSIM4sbNode) += m * (here->BSIM4gbs - gcsbsb + here->BSIM4grbps - + here->BSIM4grbsb) * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; - *(ckt->CKTfvk + here->BSIM4bNode) -= m * here->BSIM4grbdb * *(ckt->CKTrhsOld + here->BSIM4dbNode) ; - *(ckt->CKTfvk + here->BSIM4bNode) -= m * here->BSIM4grbpb * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4bNode) -= m * here->BSIM4grbsb * *(ckt->CKTrhsOld + here->BSIM4sbNode) ; - *(ckt->CKTfvk + here->BSIM4bNode) += m * (here->BSIM4grbsb + here->BSIM4grbdb - + here->BSIM4grbpb) * *(ckt->CKTrhsOld + here->BSIM4bNode) ; - } - - if (here->BSIM4trnqsMod) - { - *(ckt->CKTfvk + here->BSIM4qNode) += m * (gqdef + here->BSIM4gtau) * *(ckt->CKTrhsOld + here->BSIM4qNode) ; - *(ckt->CKTfvk + here->BSIM4qNode) += m * (ggtg - gcqgb) * *(ckt->CKTrhsOld + here->BSIM4gNodePrime) ; - *(ckt->CKTfvk + here->BSIM4qNode) += m * (ggtd - gcqdb) * *(ckt->CKTrhsOld + here->BSIM4dNodePrime) ; - *(ckt->CKTfvk + here->BSIM4qNode) += m * (ggts - gcqsb) * *(ckt->CKTrhsOld + here->BSIM4sNodePrime) ; - *(ckt->CKTfvk + here->BSIM4qNode) += m * (ggtb - gcqbb) * *(ckt->CKTrhsOld + here->BSIM4bNodePrime) ; - *(ckt->CKTfvk + here->BSIM4dNodePrime) += m * dxpart * here->BSIM4gtau * *(ckt->CKTrhsOld + here->BSIM4qNode) ; - *(ckt->CKTfvk + here->BSIM4sNodePrime) += m * sxpart * here->BSIM4gtau * *(ckt->CKTrhsOld + here->BSIM4qNode) ; - *(ckt->CKTfvk + here->BSIM4gNodePrime) -= m * here->BSIM4gtau * *(ckt->CKTrhsOld + here->BSIM4qNode) ; - } +/////////////////////////////////////////// #endif #endif diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c index dfb6b7cda..e5511085a 100644 --- a/src/spicelib/devices/bsim4/b4node.c +++ b/src/spicelib/devices/bsim4/b4node.c @@ -12,6 +12,7 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) { BSIM4model *model = (BSIM4model *)inModel ; BSIM4instance *here ; + int error ; /* loop through all the BSIM4 models */ for ( ; model != NULL ; model = model->BSIM4nextModel) @@ -39,6 +40,59 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) ckt->CKTnodeIsLinear [here->BSIM4bNodePrime] = 0 ; ckt->CKTnodeIsLinear [here->BSIM4sbNode] = 0 ; ckt->CKTnodeIsLinear [here->BSIM4qNode] = 0 ; + + + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime_2)) ; + + if (here->BSIM4rgateMod == 3) + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid)) ; + + if (!here->BSIM4rbodyMod) + { + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_7)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_8)) ; + } else { + error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNode_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNode_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNode_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNode_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_7)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_8)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_9)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_10)) ; + } + + if (here->BSIM4trnqsMod) + error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNode_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNode_2)) ; } } diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index 3505fc347..bd0a7860a 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -569,6 +569,39 @@ typedef struct sBSIM4instance double **BSIM4nVar; #endif /* NONOISE */ +#ifdef KIRCHHOFF + double *KCLcurrentdNodePrime_1 ; + double *KCLcurrentdNodePrime_2 ; + double *KCLcurrentdNodePrime_3 ; + double *KCLcurrentdNodePrime_4 ; + double *KCLcurrentdNodePrime_5 ; + double *KCLcurrentgNodePrime_1 ; + double *KCLcurrentgNodePrime_2 ; + double *KCLcurrentgNodeMid ; + double *KCLcurrentbNodePrime_1 ; + double *KCLcurrentbNodePrime_2 ; + double *KCLcurrentbNodePrime_3 ; + double *KCLcurrentbNodePrime_4 ; + double *KCLcurrentbNodePrime_5 ; + double *KCLcurrentbNodePrime_6 ; + double *KCLcurrentsNodePrime_1 ; + double *KCLcurrentsNodePrime_2 ; + double *KCLcurrentsNodePrime_3 ; + double *KCLcurrentsNodePrime_4 ; + double *KCLcurrentsNodePrime_5 ; + double *KCLcurrentsNodePrime_6 ; + double *KCLcurrentsNodePrime_7 ; + double *KCLcurrentsNodePrime_8 ; + double *KCLcurrentsNodePrime_9 ; + double *KCLcurrentsNodePrime_10 ; + double *KCLcurrentdbNode_1 ; + double *KCLcurrentdbNode_2 ; + double *KCLcurrentsbNode_1 ; + double *KCLcurrentsbNode_2 ; + double *KCLcurrentqNode_1 ; + double *KCLcurrentqNode_2 ; +#endif + } BSIM4instance ; struct bsim4SizeDependParam diff --git a/src/spicelib/devices/cap/Makefile.am b/src/spicelib/devices/cap/Makefile.am index 78d8daaff..ae995c303 100644 --- a/src/spicelib/devices/cap/Makefile.am +++ b/src/spicelib/devices/cap/Makefile.am @@ -30,6 +30,9 @@ libcap_la_SOURCES = \ captrunc.c +if KIRCHHOFF_WANTED +libcap_la_SOURCES += capnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/cap/capdefs.h b/src/spicelib/devices/cap/capdefs.h index 09ebf9fa9..c241b4d91 100644 --- a/src/spicelib/devices/cap/capdefs.h +++ b/src/spicelib/devices/cap/capdefs.h @@ -59,6 +59,11 @@ typedef struct sCAPinstance { int CAPsenParmNo; /* parameter # for sensitivity use; set equal to 0 if not a design parameter*/ +#ifdef KIRCHHOFF + double *KCLcurrentPos ; + double *KCLcurrentNeg ; +#endif + } CAPinstance ; #define CAPqcap CAPstate /* charge on the capacitor */ diff --git a/src/spicelib/devices/cap/capext.h b/src/spicelib/devices/cap/capext.h index 4fd5c6d0d..bde63d8fa 100644 --- a/src/spicelib/devices/cap/capext.h +++ b/src/spicelib/devices/cap/capext.h @@ -23,3 +23,6 @@ extern int CAPsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int CAPtemp(GENmodel*,CKTcircuit*); extern int CAPtrunc(GENmodel*,CKTcircuit*,double*); +#ifdef KIRCHHOFF +extern int CAPnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/cap/capinit.c b/src/spicelib/devices/cap/capinit.c index f3cc19208..fc11998a4 100644 --- a/src/spicelib/devices/cap/capinit.c +++ b/src/spicelib/devices/cap/capinit.c @@ -74,7 +74,7 @@ SPICEdev CAPinfo = { /* DEVmodSize */ &CAPmSize, #ifdef KIRCHHOFF - /* DEVnodeIsNonLinear */ NULL + /* DEVnodeIsNonLinear */ CAPnodeIsNonLinear #endif }; diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index 13e166e30..8789aa321 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -79,8 +79,11 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTrhs+here->CAPnegNode) += m * ceq; #ifdef KIRCHHOFF - *(ckt->CKTfvk+here->CAPposNode) += m * *(ckt->CKTstate0+here->CAPqcap+1) ; - *(ckt->CKTfvk+here->CAPnegNode) -= m * *(ckt->CKTstate0+here->CAPqcap+1) ; + *(ckt->CKTfvk+here->CAPposNode) += m * *(ckt->CKTstate0+here->CAPccap) ; + *(ckt->CKTfvk+here->CAPnegNode) -= m * *(ckt->CKTstate0+here->CAPccap) ; + + *(here->KCLcurrentPos) = m * *(ckt->CKTstate0+here->CAPccap) ; + *(here->KCLcurrentNeg) = -(m * *(ckt->CKTstate0+here->CAPccap)) ; #endif } else diff --git a/src/spicelib/devices/cap/capnode.c b/src/spicelib/devices/cap/capnode.c new file mode 100644 index 000000000..2b37003eb --- /dev/null +++ b/src/spicelib/devices/cap/capnode.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "capdefs.h" +#include "ngspice/sperror.h" + +int +CAPnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + CAPmodel *model = (CAPmodel *)inModel ; + CAPinstance *here ; + int error ; + + /* loop through all the CAP models */ + for ( ; model != NULL ; model = model->CAPnextModel) + { + /* loop through all the instances of the model */ + for (here = model->CAPinstances ; here != NULL ; here = here->CAPnextInstance) + { + error = CKTmkCurKCL (ckt, here->CAPposNode, &(here->KCLcurrentPos)) ; + error = CKTmkCurKCL (ckt, here->CAPnegNode, &(here->KCLcurrentNeg)) ; + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/dio/diodefs.h b/src/spicelib/devices/dio/diodefs.h index 2ea4cd4ac..e25ccbf28 100644 --- a/src/spicelib/devices/dio/diodefs.h +++ b/src/spicelib/devices/dio/diodefs.h @@ -142,6 +142,12 @@ typedef struct sDIOinstance { double **DIOnVar; #endif /* NONOISE */ +#ifdef KIRCHHOFF + double *KCLcurrentPos ; + double *KCLcurrentNeg ; + double *KCLcurrentPosPrime ; +#endif + } DIOinstance ; #define DIOsenGeq DIOsens /* stores the perturbed values of geq */ diff --git a/src/spicelib/devices/dio/dioext.h b/src/spicelib/devices/dio/dioext.h index 4583195cb..349f379bd 100644 --- a/src/spicelib/devices/dio/dioext.h +++ b/src/spicelib/devices/dio/dioext.h @@ -28,4 +28,7 @@ extern int DIOtrunc(GENmodel*,CKTcircuit*,double*); extern int DIOdisto(int,GENmodel*,CKTcircuit*); extern int DIOnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int DIOdSetup(DIOmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int DIOnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index a06ea41e5..b6d69eb35 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -408,6 +408,17 @@ next2: *(ckt->CKTstate0 + here->DIOvoltage) = vd; *(here->DIOnegPosPrimePtr) -= gd; *(here->DIOposPrimePosPtr) -= gspr; *(here->DIOposPrimeNegPtr) -= gd; + +#ifdef KIRCHHOFF + *(ckt->CKTfvk+here->DIOposNode) += gspr * (*(ckt->CKTrhsOld+here->DIOposNode) - *(ckt->CKTrhsOld+here->DIOposPrimeNode)) ; + *(ckt->CKTfvk+here->DIOnegNode) -= cd ; + *(ckt->CKTfvk+here->DIOposPrimeNode) += (cd - gspr * (*(ckt->CKTrhsOld+here->DIOposNode) - *(ckt->CKTrhsOld+here->DIOposPrimeNode))) ; + + *(here->KCLcurrentPos) = gspr * (*(ckt->CKTrhsOld+here->DIOposNode) - *(ckt->CKTrhsOld+here->DIOposPrimeNode)) ; + *(here->KCLcurrentNeg) = -cd ; + *(here->KCLcurrentPosPrime) = cd - gspr * (*(ckt->CKTrhsOld+here->DIOposNode) - *(ckt->CKTrhsOld+here->DIOposPrimeNode)) ; +#endif + } } return(OK); diff --git a/src/spicelib/devices/dio/dionode.c b/src/spicelib/devices/dio/dionode.c index 0f19a8795..5c5aef3fc 100644 --- a/src/spicelib/devices/dio/dionode.c +++ b/src/spicelib/devices/dio/dionode.c @@ -12,6 +12,7 @@ DIOnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) { DIOmodel *model = (DIOmodel *)inModel ; DIOinstance *here ; + int error ; /* loop through all the DIO models */ for ( ; model != NULL ; model = model->DIOnextModel) @@ -21,6 +22,10 @@ DIOnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) { ckt->CKTnodeIsLinear [here->DIOposPrimeNode] = 0 ; ckt->CKTnodeIsLinear [here->DIOnegNode] = 0 ; + + error = CKTmkCurKCL (ckt, here->DIOposNode, &(here->KCLcurrentPos)) ; + error = CKTmkCurKCL (ckt, here->DIOnegNode, &(here->KCLcurrentNeg)) ; + error = CKTmkCurKCL (ckt, here->DIOposPrimeNode, &(here->KCLcurrentPosPrime)) ; } } diff --git a/src/spicelib/devices/res/Makefile.am b/src/spicelib/devices/res/Makefile.am index c3d8f33ae..6a1c398d0 100644 --- a/src/spicelib/devices/res/Makefile.am +++ b/src/spicelib/devices/res/Makefile.am @@ -27,6 +27,9 @@ libres_la_SOURCES = \ restemp.c +if KIRCHHOFF_WANTED +libres_la_SOURCES += resnode.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/res/resdefs.h b/src/spicelib/devices/res/resdefs.h index ed8581e71..c9ff7b6d3 100644 --- a/src/spicelib/devices/res/resdefs.h +++ b/src/spicelib/devices/res/resdefs.h @@ -81,6 +81,11 @@ typedef struct sRESinstance { double **RESnVar; #endif /* NONOISE */ +#ifdef KIRCHHOFF + double *KCLcurrentPos ; + double *KCLcurrentNeg ; +#endif + } RESinstance ; diff --git a/src/spicelib/devices/res/resext.h b/src/spicelib/devices/res/resext.h index ee4be5516..4d5f87b66 100644 --- a/src/spicelib/devices/res/resext.h +++ b/src/spicelib/devices/res/resext.h @@ -20,3 +20,7 @@ extern void RESsPrint(GENmodel*,CKTcircuit*); extern int RESsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int REStemp(GENmodel*,CKTcircuit*); extern int RESnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); + +#ifdef KIRCHHOFF +extern int RESnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index 07d3673e3..8356c4472 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -38,6 +38,9 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) #ifdef KIRCHHOFF *(ckt->CKTfvk+here->RESposNode) += here->REScurrent ; *(ckt->CKTfvk+here->RESnegNode) -= here->REScurrent ; + + *(here->KCLcurrentPos) = here->REScurrent ; + *(here->KCLcurrentNeg) = -(here->REScurrent) ; #endif } diff --git a/src/spicelib/devices/res/resnode.c b/src/spicelib/devices/res/resnode.c new file mode 100644 index 000000000..9e6cbbf60 --- /dev/null +++ b/src/spicelib/devices/res/resnode.c @@ -0,0 +1,29 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "resdefs.h" +#include "ngspice/sperror.h" + +int +RESnodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) +{ + RESmodel *model = (RESmodel *)inModel ; + RESinstance *here ; + int error ; + + /* loop through all the RES models */ + for ( ; model != NULL ; model = model->RESnextModel) + { + /* loop through all the instances of the model */ + for (here = model->RESinstances ; here != NULL ; here = here->RESnextInstance) + { + error = CKTmkCurKCL (ckt, here->RESposNode, &(here->KCLcurrentPos)) ; + error = CKTmkCurKCL (ckt, here->RESnegNode, &(here->KCLcurrentNeg)) ; + } + } + + return (OK) ; +} From 2b3caacc2144bbdab043c279cab7dedeb044a597 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 24 Jun 2013 10:00:23 +0200 Subject: [PATCH 246/257] Fixed the KCL Resistor Model. Added the Source and Drain Resistances to the KCL BSIM4 Model --- src/spicelib/devices/bsim4/b4ld.c | 98 +++++++++++++++------------ src/spicelib/devices/bsim4/b4node.c | 92 +++++++++++++------------ src/spicelib/devices/bsim4/bsim4def.h | 65 ++++++++++-------- src/spicelib/devices/res/resinit.c | 2 +- 4 files changed, 142 insertions(+), 115 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index 88c4077dd..c849d6393 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -5349,81 +5349,95 @@ line900: #ifdef KIRCHHOFF /////////////////////////////////////////// + /* KCL - Non-Linear and Dynamic Linear Parts */ *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; /* NO ceqgdtot in FVK */ - *(here->KCLcurrentdNodePrime_1) = -(m * ceqjd_fvk) ; - *(here->KCLcurrentdNodePrime_2) = m * ceqbd_fvk ; - *(here->KCLcurrentdNodePrime_3) = m * ceqdrn_fvk ; - *(here->KCLcurrentdNodePrime_4) = m * ceqqd_fvk ; - *(here->KCLcurrentdNodePrime_5) = -(m * Idtoteq_fvk) ; + *(here->KCLcurrentdNodePrimeRHS_1) = -(m * ceqjd_fvk) ; + *(here->KCLcurrentdNodePrimeRHS_2) = m * ceqbd_fvk ; + *(here->KCLcurrentdNodePrimeRHS_3) = m * ceqdrn_fvk ; + *(here->KCLcurrentdNodePrimeRHS_4) = m * ceqqd_fvk ; + *(here->KCLcurrentdNodePrimeRHS_5) = -(m * Idtoteq_fvk) ; *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; /* NO ceqgcrg in FVK */ - *(here->KCLcurrentgNodePrime_1) = m * ceqqg_fvk ; - *(here->KCLcurrentgNodePrime_2) = m * Igtoteq_fvk ; + *(here->KCLcurrentgNodePrimeRHS_1) = m * ceqqg_fvk ; + *(here->KCLcurrentgNodePrimeRHS_2) = m * Igtoteq_fvk ; if (here->BSIM4rgateMod == 3) { *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * ceqqgmid_fvk ; /* NO ceqgcrg in FVK */ - *(here->KCLcurrentgNodeMid) = m * ceqqgmid_fvk ; + *(here->KCLcurrentgNodeMidRHS) = m * ceqqgmid_fvk ; } if (!here->BSIM4rbodyMod) { *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqjd_fvk - ceqjs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; - *(here->KCLcurrentbNodePrime_1) = -(m * ceqbd_fvk) ; - *(here->KCLcurrentbNodePrime_2) = -(m * ceqbs_fvk) ; - *(here->KCLcurrentbNodePrime_3) = m * ceqjd_fvk ; - *(here->KCLcurrentbNodePrime_4) = m * ceqjs_fvk ; - *(here->KCLcurrentbNodePrime_5) = m * ceqqb_fvk ; - *(here->KCLcurrentbNodePrime_6) = -(m * Ibtoteq_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_1) = -(m * ceqbd_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_2) = -(m * ceqbs_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_3) = m * ceqjd_fvk ; + *(here->KCLcurrentbNodePrimeRHS_4) = m * ceqjs_fvk ; + *(here->KCLcurrentbNodePrimeRHS_5) = m * ceqqb_fvk ; + *(here->KCLcurrentbNodePrimeRHS_6) = -(m * Ibtoteq_fvk) ; *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqg_fvk + ceqqb_fvk + ceqqd_fvk + ceqqgmid_fvk + Istoteq_fvk) ; /* NO ceqgstot in FVK */ - *(here->KCLcurrentsNodePrime_1) = -(m * ceqdrn_fvk) ; - *(here->KCLcurrentsNodePrime_2) = m * ceqbs_fvk ; - *(here->KCLcurrentsNodePrime_3) = -(m * ceqjs_fvk) ; - *(here->KCLcurrentsNodePrime_4) = -(m * ceqqg_fvk) ; - *(here->KCLcurrentsNodePrime_5) = -(m * ceqqb_fvk) ; - *(here->KCLcurrentsNodePrime_6) = -(m * ceqqd_fvk) ; - *(here->KCLcurrentsNodePrime_7) = -(m * ceqqgmid_fvk) ; - *(here->KCLcurrentsNodePrime_8) = -(m * Istoteq_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_1) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_2) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrimeRHS_3) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_8) = -(m * Istoteq_fvk) ; } else { *(ckt->CKTfvk+here->BSIM4dbNode) += m * (ceqjd_fvk + ceqqjd_fvk) ; - *(here->KCLcurrentdbNode_1) = m * ceqjd_fvk ; - *(here->KCLcurrentdbNode_2) = m * ceqqjd_fvk ; + *(here->KCLcurrentdbNodeRHS_1) = m * ceqjd_fvk ; + *(here->KCLcurrentdbNodeRHS_2) = m * ceqqjd_fvk ; *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; - *(here->KCLcurrentbNodePrime_1) = -(m * ceqbd_fvk) ; - *(here->KCLcurrentbNodePrime_2) = -(m * ceqbs_fvk) ; - *(here->KCLcurrentbNodePrime_3) = m * ceqqb_fvk ; - *(here->KCLcurrentbNodePrime_4) = -(m * Ibtoteq_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_1) = -(m * ceqbd_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_2) = -(m * ceqbs_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_3) = m * ceqqb_fvk ; + *(here->KCLcurrentbNodePrimeRHS_4) = -(m * Ibtoteq_fvk) ; *(ckt->CKTfvk+here->BSIM4sbNode) += m * (ceqjs_fvk + ceqqjs_fvk) ; - *(here->KCLcurrentsbNode_1) = m * ceqjs_fvk ; - *(here->KCLcurrentsbNode_2) = m * ceqqjs_fvk ; + *(here->KCLcurrentsbNodeRHS_1) = m * ceqjs_fvk ; + *(here->KCLcurrentsbNodeRHS_2) = m * ceqqjs_fvk ; *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqd_fvk + ceqqg_fvk + ceqqb_fvk + ceqqjd_fvk + ceqqjs_fvk + ceqqgmid_fvk + Istoteq_fvk) ; /* NO ceqgstot in FVK */ - *(here->KCLcurrentsNodePrime_1) = -(m * ceqdrn_fvk) ; - *(here->KCLcurrentsNodePrime_2) = m * ceqbs_fvk ; - *(here->KCLcurrentsNodePrime_3) = -(m * ceqjs_fvk) ; - *(here->KCLcurrentsNodePrime_4) = -(m * ceqqd_fvk) ; - *(here->KCLcurrentsNodePrime_5) = -(m * ceqqg_fvk) ; - *(here->KCLcurrentsNodePrime_6) = -(m * ceqqb_fvk) ; - *(here->KCLcurrentsNodePrime_7) = -(m * ceqqjd_fvk) ; - *(here->KCLcurrentsNodePrime_8) = -(m * ceqqjs_fvk) ; - *(here->KCLcurrentsNodePrime_9) = -(m * ceqqgmid_fvk) ; - *(here->KCLcurrentsNodePrime_10) = -(m * Istoteq_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_1) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_2) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrimeRHS_3) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqjd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_8) = -(m * ceqqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_9) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_10) = -(m * Istoteq_fvk) ; } if (here->BSIM4trnqsMod) { *(ckt->CKTfvk+here->BSIM4qNode) -= m * (cqcheq_fvk - cqdef_fvk) ; - *(here->KCLcurrentqNode_1) = -(m * cqcheq_fvk) ; - *(here->KCLcurrentqNode_2) = m * cqdef_fvk ; + *(here->KCLcurrentqNodeRHS_1) = -(m * cqcheq_fvk) ; + *(here->KCLcurrentqNodeRHS_2) = m * cqdef_fvk ; } + + /* KCL - Static Linear Part */ + *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNodePrime) = m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + + *(ckt->CKTfvk+here->BSIM4dNode) -= m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNode) = -(m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode))) ; + + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNodePrime) = m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + + *(ckt->CKTfvk+here->BSIM4sNode) -= m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNode) = -(m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode))) ; /////////////////////////////////////////// #endif diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c index e5511085a..1f4f9355e 100644 --- a/src/spicelib/devices/bsim4/b4node.c +++ b/src/spicelib/devices/bsim4/b4node.c @@ -42,57 +42,65 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) ckt->CKTnodeIsLinear [here->BSIM4qNode] = 0 ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime_2)) ; + /* KCL - Non-Linear and Dynamic Linear Parts */ + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_2)) ; if (here->BSIM4rgateMod == 3) - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS)) ; if (!here->BSIM4rbodyMod) { - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_6)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_6)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_7)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_8)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_7)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_8)) ; } else { - error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNode_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNode_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNode_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNode_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_6)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_7)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_8)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_9)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_10)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNodeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNodeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNodeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNodeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_7)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_8)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_9)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_10)) ; } if (here->BSIM4trnqsMod) - error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNode_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNode_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNodeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNodeRHS_2)) ; + + + /* KCL - Static Linear Part */ + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode)) ; } } diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index bd0a7860a..b76064b59 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -570,36 +570,41 @@ typedef struct sBSIM4instance #endif /* NONOISE */ #ifdef KIRCHHOFF - double *KCLcurrentdNodePrime_1 ; - double *KCLcurrentdNodePrime_2 ; - double *KCLcurrentdNodePrime_3 ; - double *KCLcurrentdNodePrime_4 ; - double *KCLcurrentdNodePrime_5 ; - double *KCLcurrentgNodePrime_1 ; - double *KCLcurrentgNodePrime_2 ; - double *KCLcurrentgNodeMid ; - double *KCLcurrentbNodePrime_1 ; - double *KCLcurrentbNodePrime_2 ; - double *KCLcurrentbNodePrime_3 ; - double *KCLcurrentbNodePrime_4 ; - double *KCLcurrentbNodePrime_5 ; - double *KCLcurrentbNodePrime_6 ; - double *KCLcurrentsNodePrime_1 ; - double *KCLcurrentsNodePrime_2 ; - double *KCLcurrentsNodePrime_3 ; - double *KCLcurrentsNodePrime_4 ; - double *KCLcurrentsNodePrime_5 ; - double *KCLcurrentsNodePrime_6 ; - double *KCLcurrentsNodePrime_7 ; - double *KCLcurrentsNodePrime_8 ; - double *KCLcurrentsNodePrime_9 ; - double *KCLcurrentsNodePrime_10 ; - double *KCLcurrentdbNode_1 ; - double *KCLcurrentdbNode_2 ; - double *KCLcurrentsbNode_1 ; - double *KCLcurrentsbNode_2 ; - double *KCLcurrentqNode_1 ; - double *KCLcurrentqNode_2 ; + double *KCLcurrentdNodePrimeRHS_1 ; + double *KCLcurrentdNodePrimeRHS_2 ; + double *KCLcurrentdNodePrimeRHS_3 ; + double *KCLcurrentdNodePrimeRHS_4 ; + double *KCLcurrentdNodePrimeRHS_5 ; + double *KCLcurrentgNodePrimeRHS_1 ; + double *KCLcurrentgNodePrimeRHS_2 ; + double *KCLcurrentgNodeMidRHS ; + double *KCLcurrentbNodePrimeRHS_1 ; + double *KCLcurrentbNodePrimeRHS_2 ; + double *KCLcurrentbNodePrimeRHS_3 ; + double *KCLcurrentbNodePrimeRHS_4 ; + double *KCLcurrentbNodePrimeRHS_5 ; + double *KCLcurrentbNodePrimeRHS_6 ; + double *KCLcurrentsNodePrimeRHS_1 ; + double *KCLcurrentsNodePrimeRHS_2 ; + double *KCLcurrentsNodePrimeRHS_3 ; + double *KCLcurrentsNodePrimeRHS_4 ; + double *KCLcurrentsNodePrimeRHS_5 ; + double *KCLcurrentsNodePrimeRHS_6 ; + double *KCLcurrentsNodePrimeRHS_7 ; + double *KCLcurrentsNodePrimeRHS_8 ; + double *KCLcurrentsNodePrimeRHS_9 ; + double *KCLcurrentsNodePrimeRHS_10 ; + double *KCLcurrentdbNodeRHS_1 ; + double *KCLcurrentdbNodeRHS_2 ; + double *KCLcurrentsbNodeRHS_1 ; + double *KCLcurrentsbNodeRHS_2 ; + double *KCLcurrentqNodeRHS_1 ; + double *KCLcurrentqNodeRHS_2 ; + + double *KCLcurrentdNodePrime ; + double *KCLcurrentdNode ; + double *KCLcurrentsNodePrime ; + double *KCLcurrentsNode ; #endif } BSIM4instance ; diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index 49150c08c..42859077d 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -75,7 +75,7 @@ SPICEdev RESinfo = { /* DEVmodSize */ &RESmSize, #ifdef KIRCHHOFF - /* DEVnodeIsNonLinear */ NULL + /* DEVnodeIsNonLinear */ RESnodeIsNonLinear #endif }; From 23b1480d9b9046388836c1854b296ff7309228d4 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 30 Jun 2013 16:26:21 +0200 Subject: [PATCH 247/257] Almost the FINAL version of the KCL Verification for the BSIM4 model (only Rg(V), Rd(V) and Rs(V) are missing yet) --- src/spicelib/devices/bsim4/b4ld.c | 184 +++++++++++++++++++------- src/spicelib/devices/bsim4/b4node.c | 83 ++++++++++-- src/spicelib/devices/bsim4/bsim4def.h | 34 ++++- 3 files changed, 242 insertions(+), 59 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index c849d6393..ef08bc422 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -97,8 +97,8 @@ BSIM4model *model; BSIM4model *model = (BSIM4model*)inModel; BSIM4instance *here; #endif -double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; -double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; +double ceqgstot, ceqgstot_fvk_sNodePrime, ceqgstot_fvk_sNode, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; +double ceqgdtot, ceqgdtot_fvk_dNodePrime, ceqgdtot_fvk_dNode, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; double gstot, gstotd, gstotg, gstots, gstotb, gspr, Rs, Rd; double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg; @@ -127,7 +127,6 @@ double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct; double SourceSatCurrent, DrainSatCurrent; double ag0, qgb, von, cbhat, VgstNVt, ExpVgst; double ceqqb, ceqqb_fvk, ceqqd, ceqqd_fvk, ceqqg, ceqqg_fvk, ceqqjd=0.0, ceqqjd_fvk = 0.0, ceqqjs=0.0, ceqqjs_fvk = 0.0, ceq, geq; -double ceqqb_SnodePrime_fvk = 0.0, ceqqd_SnodePrime_fvk = 0.0, ceqqg_SnodePrime_fvk = 0.0, ceqqjd_SnodePrime_fvk = 0.0, ceqqjs_SnodePrime_fvk = 0.0 ; double cdrain, cdhat, ceqdrn, ceqdrn_fvk, ceqbd, ceqbd_fvk, ceqbs, ceqbs_fvk, ceqjd, ceqjd_fvk, ceqjs, ceqjs_fvk, gjbd, gjbs; double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; double delvbd, delvbs, delvds, delvgd, delvgs; @@ -4614,15 +4613,12 @@ line860: ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; ceqqg_fvk = cqgate ; - ceqqg_SnodePrime_fvk = ceqqg ; ceqqd = cqdrn - gcdgb * vgb - gcdgmb * vgmb + (gcddb + gcdbdb) * vbd - gcdbdb * vbd_jct + gcdsb * vbs; ceqqd_fvk = cqdrn ; - ceqqd_SnodePrime_fvk = ceqqd ; ceqqb = cqbody - gcbgb * vgb - gcbgmb * vgmb + gcbdb * vbd + gcbsb * vbs; ceqqb_fvk = cqbody ; - ceqqb_SnodePrime_fvk = ceqqb ; if (here->BSIM4rgateMod == 3) { @@ -4636,10 +4632,8 @@ line860: if (here->BSIM4rbodyMod) { ceqqjs = *(ckt->CKTstate0 + here->BSIM4cqbs) + gcsbsb * vbs_jct; ceqqjs_fvk = *(ckt->CKTstate0 + here->BSIM4cqbs) ; - ceqqjs_SnodePrime_fvk = ceqqjs ; ceqqjd = *(ckt->CKTstate0 + here->BSIM4cqbd) + gcdbdb * vbd_jct; ceqqjd_fvk = *(ckt->CKTstate0 + here->BSIM4cqbd) ; - ceqqjd_SnodePrime_fvk = ceqqjd ; } if (here->BSIM4trnqsMod) @@ -5350,23 +5344,42 @@ line900: /////////////////////////////////////////// /* KCL - Non-Linear and Dynamic Linear Parts */ - *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; /* NO ceqgdtot in FVK */ - *(here->KCLcurrentdNodePrimeRHS_1) = -(m * ceqjd_fvk) ; - *(here->KCLcurrentdNodePrimeRHS_2) = m * ceqbd_fvk ; - *(here->KCLcurrentdNodePrimeRHS_3) = m * ceqdrn_fvk ; - *(here->KCLcurrentdNodePrimeRHS_4) = m * ceqqd_fvk ; - *(here->KCLcurrentdNodePrimeRHS_5) = -(m * Idtoteq_fvk) ; + ceqgdtot_fvk_dNodePrime = (- gdtotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) + - gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode) + - gdtotg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) + - gdtots * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) + - gdtotb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) + - ceqgdtot ; //A*V-b + *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * ceqgdtot_fvk_dNodePrime ; + *(here->KCLcurrentdNodePrimeRHS_1) = m * ceqgdtot_fvk_dNodePrime ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; + *(here->KCLcurrentdNodePrimeRHS_2) = -(m * ceqjd_fvk) ; + *(here->KCLcurrentdNodePrimeRHS_3) = m * ceqbd_fvk ; + *(here->KCLcurrentdNodePrimeRHS_4) = m * ceqdrn_fvk ; + *(here->KCLcurrentdNodePrimeRHS_5) = m * ceqqd_fvk ; + *(here->KCLcurrentdNodePrimeRHS_6) = -(m * Idtoteq_fvk) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; /* NO ceqgcrg in FVK */ + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk - ceqgcrg + Igtoteq_fvk) ; *(here->KCLcurrentgNodePrimeRHS_1) = m * ceqqg_fvk ; - *(here->KCLcurrentgNodePrimeRHS_2) = m * Igtoteq_fvk ; + *(here->KCLcurrentgNodePrimeRHS_2) = -(m * ceqgcrg) ; + *(here->KCLcurrentgNodePrimeRHS_3) = m * Igtoteq_fvk ; - if (here->BSIM4rgateMod == 3) + if (here->BSIM4rgateMod == 2) { - *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * ceqqgmid_fvk ; /* NO ceqgcrg in FVK */ - *(here->KCLcurrentgNodeMidRHS) = m * ceqqgmid_fvk ; + *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * ceqgcrg ; + *(here->KCLcurrentgNodeExtRHS) = m * ceqgcrg ; + } else if (here->BSIM4rgateMod == 3) { + *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * (ceqqgmid_fvk + ceqgcrg) ; + *(here->KCLcurrentgNodeMidRHS_1) = m * ceqqgmid_fvk ; + *(here->KCLcurrentgNodeMidRHS_2) = m * ceqgcrg ; } + ceqgstot_fvk_sNodePrime = (- gstotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) + - gstotg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) + - gstots * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) + - gstot * *(ckt->CKTrhsOld+here->BSIM4sNode) + - gstotb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) + - ceqgstot ; //A*V-b if (!here->BSIM4rbodyMod) { *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqjd_fvk - ceqjs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; @@ -5377,17 +5390,19 @@ line900: *(here->KCLcurrentbNodePrimeRHS_5) = m * ceqqb_fvk ; *(here->KCLcurrentbNodePrimeRHS_6) = -(m * Ibtoteq_fvk) ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ceqgstot_fvk_sNodePrime ; + *(here->KCLcurrentsNodePrimeRHS_1) = m * ceqgstot_fvk_sNodePrime ; *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqg_fvk + ceqqb_fvk + ceqqd_fvk - + ceqqgmid_fvk + Istoteq_fvk) ; /* NO ceqgstot in FVK */ - *(here->KCLcurrentsNodePrimeRHS_1) = -(m * ceqdrn_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_2) = m * ceqbs_fvk ; - *(here->KCLcurrentsNodePrimeRHS_3) = -(m * ceqjs_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqqg_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqb_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqd_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqgmid_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_8) = -(m * Istoteq_fvk) ; + + ceqqgmid_fvk + Istoteq_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_2) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_3) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_8) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_9) = -(m * Istoteq_fvk) ; } else { *(ckt->CKTfvk+here->BSIM4dbNode) += m * (ceqjd_fvk + ceqqjd_fvk) ; *(here->KCLcurrentdbNodeRHS_1) = m * ceqjd_fvk ; @@ -5403,19 +5418,42 @@ line900: *(here->KCLcurrentsbNodeRHS_1) = m * ceqjs_fvk ; *(here->KCLcurrentsbNodeRHS_2) = m * ceqqjs_fvk ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ceqgstot_fvk_sNodePrime ; + *(here->KCLcurrentsNodePrimeRHS_1) = m * ceqgstot_fvk_sNodePrime ; *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqd_fvk + ceqqg_fvk + ceqqb_fvk + ceqqjd_fvk + ceqqjs_fvk - + ceqqgmid_fvk + Istoteq_fvk) ; /* NO ceqgstot in FVK */ - *(here->KCLcurrentsNodePrimeRHS_1) = -(m * ceqdrn_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_2) = m * ceqbs_fvk ; - *(here->KCLcurrentsNodePrimeRHS_3) = -(m * ceqjs_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqqd_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqg_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqb_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqjd_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_8) = -(m * ceqqjs_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_9) = -(m * ceqqgmid_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_10) = -(m * Istoteq_fvk) ; + + ceqqgmid_fvk + Istoteq_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_2) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_3) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_8) = -(m * ceqqjd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_9) = -(m * ceqqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_10) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_11) = -(m * Istoteq_fvk) ; + } + + if (model->BSIM4rdsMod) + { + ceqgdtot_fvk_dNode = (+ gdtotg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) + + gdtots * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) + + gdtotb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) + + gdtotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) + + gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode)) + - ceqgdtot ; //A*V-b + *(ckt->CKTfvk+here->BSIM4dNode) += m * ceqgdtot_fvk_dNode ; + *(here->KCLcurrentdNodeRHS) = m * ceqgdtot_fvk_dNode ; + + ceqgstot_fvk_sNode = (+ gstotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) + + gstotg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) + + gstotb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) + + gstots * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) + + gstot * *(ckt->CKTrhsOld+here->BSIM4sNode)) + - ceqgstot ; //A*V-b + *(ckt->CKTfvk+here->BSIM4sNode) += m * ceqgstot_fvk_sNode ; + *(here->KCLcurrentsNodeRHS) = m * ceqgstot_fvk_sNode ; } if (here->BSIM4trnqsMod) @@ -5427,17 +5465,69 @@ line900: /* KCL - Static Linear Part */ - *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; - *(here->KCLcurrentdNodePrime) = m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + if (!model->BSIM4rdsMod) + { + *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNodePrime) = m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; - *(ckt->CKTfvk+here->BSIM4dNode) -= m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; - *(here->KCLcurrentdNode) = -(m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode))) ; + *(ckt->CKTfvk+here->BSIM4dNode) -= m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNode) = -(m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode))) ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; - *(here->KCLcurrentsNodePrime) = m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNodePrime) = m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + + *(ckt->CKTfvk+here->BSIM4sNode) -= m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNode) = -(m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode))) ; + } + + if (here->BSIM4rgateMod == 1) + { + *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodeExt) = m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + + *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodePrime) = -(m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; + } else if (here->BSIM4rgateMod == 3) { + *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; + *(here->KCLcurrentgNodeExt) = m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; + + *(ckt->CKTfvk+here->BSIM4gNodeMid) -= m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; + *(here->KCLcurrentgNodeMid) = -(m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid))) ; + } + + if (here->BSIM4rbodyMod) + { + *(ckt->CKTfvk+here->BSIM4dbNode) += m * here->BSIM4grbpd * (*(ckt->CKTrhsOld+here->BSIM4dbNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + *(here->KCLcurrentdbNode_1) = m * here->BSIM4grbpd * (*(ckt->CKTrhsOld+here->BSIM4dbNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpd * (*(ckt->CKTrhsOld+here->BSIM4dbNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + *(here->KCLcurrentbNodePrime_1) = -(m * here->BSIM4grbpd * (*(ckt->CKTrhsOld+here->BSIM4dbNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime))) ; + + *(ckt->CKTfvk+here->BSIM4dbNode) += m * here->BSIM4grbdb * (*(ckt->CKTrhsOld+here->BSIM4dbNode) - *(ckt->CKTrhsOld+here->BSIM4bNode)) ; + *(here->KCLcurrentdbNode_2) = m * here->BSIM4grbdb * (*(ckt->CKTrhsOld+here->BSIM4dbNode) - *(ckt->CKTrhsOld+here->BSIM4bNode)) ; + + *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbdb * (*(ckt->CKTrhsOld+here->BSIM4dbNode) - *(ckt->CKTrhsOld+here->BSIM4bNode)) ; + *(here->KCLcurrentbNode_1) = -(m * here->BSIM4grbdb * (*(ckt->CKTrhsOld+here->BSIM4dbNode) - *(ckt->CKTrhsOld+here->BSIM4bNode))) ; + + *(ckt->CKTfvk+here->BSIM4bNode) += m * here->BSIM4grbpb * (*(ckt->CKTrhsOld+here->BSIM4bNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + *(here->KCLcurrentbNode_2) = m * here->BSIM4grbpb * (*(ckt->CKTrhsOld+here->BSIM4bNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbpb * (*(ckt->CKTrhsOld+here->BSIM4bNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + *(here->KCLcurrentbNodePrime_2) = -(m * here->BSIM4grbpb * (*(ckt->CKTrhsOld+here->BSIM4bNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime))) ; + + *(ckt->CKTfvk+here->BSIM4sbNode) += m * here->BSIM4grbps * (*(ckt->CKTrhsOld+here->BSIM4sbNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + *(here->KCLcurrentsbNode_1) = m * here->BSIM4grbps * (*(ckt->CKTrhsOld+here->BSIM4sbNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + + *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * here->BSIM4grbps * (*(ckt->CKTrhsOld+here->BSIM4sbNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) ; + *(here->KCLcurrentbNodePrime_3) = -(m * here->BSIM4grbps * (*(ckt->CKTrhsOld+here->BSIM4sbNode) - *(ckt->CKTrhsOld+here->BSIM4bNodePrime))) ; + + *(ckt->CKTfvk+here->BSIM4sbNode) += m * here->BSIM4grbsb * (*(ckt->CKTrhsOld+here->BSIM4sbNode) - *(ckt->CKTrhsOld+here->BSIM4bNode)) ; + *(here->KCLcurrentsbNode_2) = m * here->BSIM4grbsb * (*(ckt->CKTrhsOld+here->BSIM4sbNode) - *(ckt->CKTrhsOld+here->BSIM4bNode)) ; + + *(ckt->CKTfvk+here->BSIM4bNode) -= m * here->BSIM4grbsb * (*(ckt->CKTrhsOld+here->BSIM4sbNode) - *(ckt->CKTrhsOld+here->BSIM4bNode)) ; + *(here->KCLcurrentbNode_3) = -(m * here->BSIM4grbsb * (*(ckt->CKTrhsOld+here->BSIM4sbNode) - *(ckt->CKTrhsOld+here->BSIM4bNode))) ; + } - *(ckt->CKTfvk+here->BSIM4sNode) -= m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; - *(here->KCLcurrentsNode) = -(m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode))) ; /////////////////////////////////////////// #endif diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c index 1f4f9355e..2b87aacd3 100644 --- a/src/spicelib/devices/bsim4/b4node.c +++ b/src/spicelib/devices/bsim4/b4node.c @@ -34,12 +34,25 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) ckt->CKTnodeIsLinear [here->BSIM4dNodePrime] = 0 ; ckt->CKTnodeIsLinear [here->BSIM4sNodePrime] = 0 ; -// ckt->CKTnodeIsLinear [here->BSIM4gNodePrime] = 0 ; -// ckt->CKTnodeIsLinear [here->BSIM4gNodeMid] = 0 ; - ckt->CKTnodeIsLinear [here->BSIM4dbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4gNodePrime] = 0 ; ckt->CKTnodeIsLinear [here->BSIM4bNodePrime] = 0 ; - ckt->CKTnodeIsLinear [here->BSIM4sbNode] = 0 ; - ckt->CKTnodeIsLinear [here->BSIM4qNode] = 0 ; + + if (!here->BSIM4rbodyMod) + { + ckt->CKTnodeIsLinear [here->BSIM4dbNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4sbNode] = 0 ; + } + + if (model->BSIM4rdsMod) + { + ckt->CKTnodeIsLinear [here->BSIM4dNode] = 0 ; + ckt->CKTnodeIsLinear [here->BSIM4sNode] = 0 ; + } + + if (here->BSIM4trnqsMod) + { + ckt->CKTnodeIsLinear [here->BSIM4qNode] = 0 ; + } /* KCL - Non-Linear and Dynamic Linear Parts */ @@ -48,11 +61,19 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_3)) ; error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_4)) ; error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_3)) ; - if (here->BSIM4rgateMod == 3) - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS)) ; + if (here->BSIM4rgateMod == 2) + { + error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExtRHS)) ; + } else if (here->BSIM4rgateMod == 3) { + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS_2)) ; + } if (!here->BSIM4rbodyMod) { @@ -62,6 +83,7 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_4)) ; error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_5)) ; error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_2)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_3)) ; @@ -73,12 +95,15 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) } else { error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNodeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNodeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_2)) ; error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_3)) ; error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNodeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNodeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_2)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_3)) ; @@ -89,18 +114,54 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_8)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_9)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_10)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_11)) ; + } + + if (model->BSIM4rdsMod) + { + error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNodeRHS)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNodeRHS)) ; } if (here->BSIM4trnqsMod) + { error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNodeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNodeRHS_2)) ; + } /* KCL - Static Linear Part */ - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode)) ; + if (!model->BSIM4rdsMod) + { + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode)) ; + } else { + } + + if (here->BSIM4rgateMod == 1) + { + error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExt)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime)) ; + } else if (here->BSIM4rgateMod == 3) { + error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExt)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid)) ; + } + + if (here->BSIM4rbodyMod) + { + error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNode_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNode_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNode, &(here->KCLcurrentbNode_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNode, &(here->KCLcurrentbNode_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNode, &(here->KCLcurrentbNode_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNode_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNode_2)) ; + } } } diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index b76064b59..c0d071aee 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -570,20 +570,30 @@ typedef struct sBSIM4instance #endif /* NONOISE */ #ifdef KIRCHHOFF +//RHS double *KCLcurrentdNodePrimeRHS_1 ; double *KCLcurrentdNodePrimeRHS_2 ; double *KCLcurrentdNodePrimeRHS_3 ; double *KCLcurrentdNodePrimeRHS_4 ; double *KCLcurrentdNodePrimeRHS_5 ; + double *KCLcurrentdNodePrimeRHS_6 ; + double *KCLcurrentgNodePrimeRHS_1 ; double *KCLcurrentgNodePrimeRHS_2 ; - double *KCLcurrentgNodeMidRHS ; + double *KCLcurrentgNodePrimeRHS_3 ; + + double *KCLcurrentgNodeExtRHS ; + + double *KCLcurrentgNodeMidRHS_1 ; + double *KCLcurrentgNodeMidRHS_2 ; + double *KCLcurrentbNodePrimeRHS_1 ; double *KCLcurrentbNodePrimeRHS_2 ; double *KCLcurrentbNodePrimeRHS_3 ; double *KCLcurrentbNodePrimeRHS_4 ; double *KCLcurrentbNodePrimeRHS_5 ; double *KCLcurrentbNodePrimeRHS_6 ; + double *KCLcurrentsNodePrimeRHS_1 ; double *KCLcurrentsNodePrimeRHS_2 ; double *KCLcurrentsNodePrimeRHS_3 ; @@ -594,17 +604,39 @@ typedef struct sBSIM4instance double *KCLcurrentsNodePrimeRHS_8 ; double *KCLcurrentsNodePrimeRHS_9 ; double *KCLcurrentsNodePrimeRHS_10 ; + double *KCLcurrentsNodePrimeRHS_11 ; + double *KCLcurrentdbNodeRHS_1 ; double *KCLcurrentdbNodeRHS_2 ; + double *KCLcurrentsbNodeRHS_1 ; double *KCLcurrentsbNodeRHS_2 ; + + double *KCLcurrentdNodeRHS ; + + double *KCLcurrentsNodeRHS ; + double *KCLcurrentqNodeRHS_1 ; double *KCLcurrentqNodeRHS_2 ; +//Matrix double *KCLcurrentdNodePrime ; double *KCLcurrentdNode ; double *KCLcurrentsNodePrime ; double *KCLcurrentsNode ; + double *KCLcurrentgNodePrime ; + double *KCLcurrentgNodeMid ; + double *KCLcurrentgNodeExt ; + double *KCLcurrentdbNode_1 ; + double *KCLcurrentdbNode_2 ; + double *KCLcurrentbNodePrime_1 ; + double *KCLcurrentbNodePrime_2 ; + double *KCLcurrentbNodePrime_3 ; + double *KCLcurrentbNode_1 ; + double *KCLcurrentbNode_2 ; + double *KCLcurrentbNode_3 ; + double *KCLcurrentsbNode_1 ; + double *KCLcurrentsbNode_2 ; #endif } BSIM4instance ; From c05cb7a437ebf17567cb5915756b7f9caccdefac Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 2 Jul 2013 15:21:30 +0200 Subject: [PATCH 248/257] Fixed Rg(V) for the KCL Verification --- src/spicelib/devices/bsim4/b4ld.c | 30 ++++++++++++++++----------- src/spicelib/devices/bsim4/b4node.c | 16 +++++++------- src/spicelib/devices/bsim4/bsim4def.h | 15 +++++++------- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index ef08bc422..6ccf7d857 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -5341,7 +5341,6 @@ line900: } #ifdef KIRCHHOFF -/////////////////////////////////////////// /* KCL - Non-Linear and Dynamic Linear Parts */ ceqgdtot_fvk_dNodePrime = (- gdtotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) @@ -5359,19 +5358,14 @@ line900: *(here->KCLcurrentdNodePrimeRHS_5) = m * ceqqd_fvk ; *(here->KCLcurrentdNodePrimeRHS_6) = -(m * Idtoteq_fvk) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk - ceqgcrg + Igtoteq_fvk) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; *(here->KCLcurrentgNodePrimeRHS_1) = m * ceqqg_fvk ; - *(here->KCLcurrentgNodePrimeRHS_2) = -(m * ceqgcrg) ; - *(here->KCLcurrentgNodePrimeRHS_3) = m * Igtoteq_fvk ; + *(here->KCLcurrentgNodePrimeRHS_2) = m * Igtoteq_fvk ; - if (here->BSIM4rgateMod == 2) + if (here->BSIM4rgateMod == 3) { - *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * ceqgcrg ; - *(here->KCLcurrentgNodeExtRHS) = m * ceqgcrg ; - } else if (here->BSIM4rgateMod == 3) { - *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * (ceqqgmid_fvk + ceqgcrg) ; - *(here->KCLcurrentgNodeMidRHS_1) = m * ceqqgmid_fvk ; - *(here->KCLcurrentgNodeMidRHS_2) = m * ceqgcrg ; + *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * ceqqgmid_fvk ; + *(here->KCLcurrentgNodeMidRHS) = m * ceqqgmid_fvk ; } ceqgstot_fvk_sNodePrime = (- gstotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) @@ -5487,12 +5481,24 @@ line900: *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; *(here->KCLcurrentgNodePrime) = -(m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; + } else if (here->BSIM4rgateMod == 2) { + *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodeExt) = m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + + *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodePrime) = -(m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; } else if (here->BSIM4rgateMod == 3) { *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; *(here->KCLcurrentgNodeExt) = m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; *(ckt->CKTfvk+here->BSIM4gNodeMid) -= m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; - *(here->KCLcurrentgNodeMid) = -(m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid))) ; + *(here->KCLcurrentgNodeMid_1) = -(m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid))) ; + + *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeMid) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodeMid_2) = m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeMid) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + + *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodePrime) = -(m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; } if (here->BSIM4rbodyMod) diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c index 2b87aacd3..07fec5948 100644 --- a/src/spicelib/devices/bsim4/b4node.c +++ b/src/spicelib/devices/bsim4/b4node.c @@ -65,14 +65,10 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_3)) ; - if (here->BSIM4rgateMod == 2) + if (here->BSIM4rgateMod == 3) { - error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExtRHS)) ; - } else if (here->BSIM4rgateMod == 3) { - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS)) ; } if (!here->BSIM4rbodyMod) @@ -137,16 +133,20 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode)) ; - } else { } if (here->BSIM4rgateMod == 1) { error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExt)) ; error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime)) ; + } else if (here->BSIM4rgateMod == 2) { + error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExt)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime)) ; } else if (here->BSIM4rgateMod == 3) { error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExt)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime)) ; } if (here->BSIM4rbodyMod) diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index c0d071aee..0ec5b5b98 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -580,12 +580,8 @@ typedef struct sBSIM4instance double *KCLcurrentgNodePrimeRHS_1 ; double *KCLcurrentgNodePrimeRHS_2 ; - double *KCLcurrentgNodePrimeRHS_3 ; - double *KCLcurrentgNodeExtRHS ; - - double *KCLcurrentgNodeMidRHS_1 ; - double *KCLcurrentgNodeMidRHS_2 ; + double *KCLcurrentgNodeMidRHS ; double *KCLcurrentbNodePrimeRHS_1 ; double *KCLcurrentbNodePrimeRHS_2 ; @@ -624,9 +620,14 @@ typedef struct sBSIM4instance double *KCLcurrentdNode ; double *KCLcurrentsNodePrime ; double *KCLcurrentsNode ; - double *KCLcurrentgNodePrime ; - double *KCLcurrentgNodeMid ; + double *KCLcurrentgNodeExt ; + + double *KCLcurrentgNodePrime ; + + double *KCLcurrentgNodeMid_1 ; + double *KCLcurrentgNodeMid_2 ; + double *KCLcurrentdbNode_1 ; double *KCLcurrentdbNode_2 ; double *KCLcurrentbNodePrime_1 ; From 50f27ecd2ca009b50bb537f97562e0425d93ad1c Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 2 Jul 2013 22:14:30 +0200 Subject: [PATCH 249/257] Fixed Rs(V) and Rd(V) for the KCL Verification. The BSIM4 model is now complete for the KCL Verification --- src/spicelib/devices/bsim4/b4ld.c | 116 +++++++++----------------- src/spicelib/devices/bsim4/b4node.c | 23 ++--- src/spicelib/devices/bsim4/bsim4def.h | 22 +++-- 3 files changed, 63 insertions(+), 98 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index 6ccf7d857..c5f513e3c 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -97,8 +97,8 @@ BSIM4model *model; BSIM4model *model = (BSIM4model*)inModel; BSIM4instance *here; #endif -double ceqgstot, ceqgstot_fvk_sNodePrime, ceqgstot_fvk_sNode, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; -double ceqgdtot, ceqgdtot_fvk_dNodePrime, ceqgdtot_fvk_dNode, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; +double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb; +double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb; double gstot, gstotd, gstotg, gstots, gstotb, gspr, Rs, Rd; double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr; double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg; @@ -5343,20 +5343,12 @@ line900: #ifdef KIRCHHOFF /* KCL - Non-Linear and Dynamic Linear Parts */ - ceqgdtot_fvk_dNodePrime = (- gdtotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) - - gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode) - - gdtotg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) - - gdtots * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) - - gdtotb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) - - ceqgdtot ; //A*V-b - *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * ceqgdtot_fvk_dNodePrime ; - *(here->KCLcurrentdNodePrimeRHS_1) = m * ceqgdtot_fvk_dNodePrime ; *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; - *(here->KCLcurrentdNodePrimeRHS_2) = -(m * ceqjd_fvk) ; - *(here->KCLcurrentdNodePrimeRHS_3) = m * ceqbd_fvk ; - *(here->KCLcurrentdNodePrimeRHS_4) = m * ceqdrn_fvk ; - *(here->KCLcurrentdNodePrimeRHS_5) = m * ceqqd_fvk ; - *(here->KCLcurrentdNodePrimeRHS_6) = -(m * Idtoteq_fvk) ; + *(here->KCLcurrentdNodePrimeRHS_1) = -(m * ceqjd_fvk) ; + *(here->KCLcurrentdNodePrimeRHS_2) = m * ceqbd_fvk ; + *(here->KCLcurrentdNodePrimeRHS_3) = m * ceqdrn_fvk ; + *(here->KCLcurrentdNodePrimeRHS_4) = m * ceqqd_fvk ; + *(here->KCLcurrentdNodePrimeRHS_5) = -(m * Idtoteq_fvk) ; *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; *(here->KCLcurrentgNodePrimeRHS_1) = m * ceqqg_fvk ; @@ -5368,12 +5360,6 @@ line900: *(here->KCLcurrentgNodeMidRHS) = m * ceqqgmid_fvk ; } - ceqgstot_fvk_sNodePrime = (- gstotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) - - gstotg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) - - gstots * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) - - gstot * *(ckt->CKTrhsOld+here->BSIM4sNode) - - gstotb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime)) - - ceqgstot ; //A*V-b if (!here->BSIM4rbodyMod) { *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqjd_fvk - ceqjs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; @@ -5384,19 +5370,17 @@ line900: *(here->KCLcurrentbNodePrimeRHS_5) = m * ceqqb_fvk ; *(here->KCLcurrentbNodePrimeRHS_6) = -(m * Ibtoteq_fvk) ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ceqgstot_fvk_sNodePrime ; - *(here->KCLcurrentsNodePrimeRHS_1) = m * ceqgstot_fvk_sNodePrime ; *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqg_fvk + ceqqb_fvk + ceqqd_fvk + ceqqgmid_fvk + Istoteq_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_2) = -(m * ceqdrn_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_3) = m * ceqbs_fvk ; - *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqjs_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqg_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqb_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqd_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_8) = -(m * ceqqgmid_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_9) = -(m * Istoteq_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_1) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_2) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrimeRHS_3) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_8) = -(m * Istoteq_fvk) ; } else { *(ckt->CKTfvk+here->BSIM4dbNode) += m * (ceqjd_fvk + ceqqjd_fvk) ; *(here->KCLcurrentdbNodeRHS_1) = m * ceqjd_fvk ; @@ -5412,42 +5396,19 @@ line900: *(here->KCLcurrentsbNodeRHS_1) = m * ceqjs_fvk ; *(here->KCLcurrentsbNodeRHS_2) = m * ceqqjs_fvk ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * ceqgstot_fvk_sNodePrime ; - *(here->KCLcurrentsNodePrimeRHS_1) = m * ceqgstot_fvk_sNodePrime ; *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqd_fvk + ceqqg_fvk + ceqqb_fvk + ceqqjd_fvk + ceqqjs_fvk + ceqqgmid_fvk + Istoteq_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_2) = -(m * ceqdrn_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_3) = m * ceqbs_fvk ; - *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqjs_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqd_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqg_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqb_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_8) = -(m * ceqqjd_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_9) = -(m * ceqqjs_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_10) = -(m * ceqqgmid_fvk) ; - *(here->KCLcurrentsNodePrimeRHS_11) = -(m * Istoteq_fvk) ; - } - - if (model->BSIM4rdsMod) - { - ceqgdtot_fvk_dNode = (+ gdtotg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) - + gdtots * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) - + gdtotb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) - + gdtotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) - + gdtot * *(ckt->CKTrhsOld+here->BSIM4dNode)) - - ceqgdtot ; //A*V-b - *(ckt->CKTfvk+here->BSIM4dNode) += m * ceqgdtot_fvk_dNode ; - *(here->KCLcurrentdNodeRHS) = m * ceqgdtot_fvk_dNode ; - - ceqgstot_fvk_sNode = (+ gstotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) - + gstotg * *(ckt->CKTrhsOld+here->BSIM4gNodePrime) - + gstotb * *(ckt->CKTrhsOld+here->BSIM4bNodePrime) - + gstots * *(ckt->CKTrhsOld+here->BSIM4sNodePrime) - + gstot * *(ckt->CKTrhsOld+here->BSIM4sNode)) - - ceqgstot ; //A*V-b - *(ckt->CKTfvk+here->BSIM4sNode) += m * ceqgstot_fvk_sNode ; - *(here->KCLcurrentsNodeRHS) = m * ceqgstot_fvk_sNode ; + *(here->KCLcurrentsNodePrimeRHS_1) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_2) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrimeRHS_3) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqjd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_8) = -(m * ceqqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_9) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_10) = -(m * Istoteq_fvk) ; } if (here->BSIM4trnqsMod) @@ -5459,20 +5420,21 @@ line900: /* KCL - Static Linear Part */ - if (!model->BSIM4rdsMod) - { - *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; - *(here->KCLcurrentdNodePrime) = m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * (gdpr + gdtot) * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNodePrime_1) = m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNodePrime_2) = m * gdtot * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; - *(ckt->CKTfvk+here->BSIM4dNode) -= m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; - *(here->KCLcurrentdNode) = -(m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode))) ; + *(ckt->CKTfvk+here->BSIM4dNode) -= m * (gdpr + gdtot) * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNode_1) = -(m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode))) ; + *(here->KCLcurrentdNode_2) = -(m * gdtot * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode))) ; - *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; - *(here->KCLcurrentsNodePrime) = m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * (gspr + gstot) * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNodePrime_1) = m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNodePrime_2) = m * gstot * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; - *(ckt->CKTfvk+here->BSIM4sNode) -= m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; - *(here->KCLcurrentsNode) = -(m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode))) ; - } + *(ckt->CKTfvk+here->BSIM4sNode) -= m * (gspr + gstot) * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNode_1) = -(m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode))) ; + *(here->KCLcurrentsNode_2) = -(m * gstot * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode))) ; if (here->BSIM4rgateMod == 1) { @@ -5497,8 +5459,8 @@ line900: *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeMid) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; *(here->KCLcurrentgNodeMid_2) = m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeMid) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; - *(here->KCLcurrentgNodePrime) = -(m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeMid) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodePrime) = -(m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeMid) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; } if (here->BSIM4rbodyMod) diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c index 07fec5948..27f90f3ab 100644 --- a/src/spicelib/devices/bsim4/b4node.c +++ b/src/spicelib/devices/bsim4/b4node.c @@ -61,7 +61,6 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_3)) ; error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_4)) ; error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_6)) ; error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_2)) ; @@ -110,13 +109,6 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_8)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_9)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_10)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_11)) ; - } - - if (model->BSIM4rdsMod) - { - error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNodeRHS)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNodeRHS)) ; } if (here->BSIM4trnqsMod) @@ -127,13 +119,14 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) /* KCL - Static Linear Part */ - if (!model->BSIM4rdsMod) - { - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode)) ; - } + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode_2)) ; if (here->BSIM4rgateMod == 1) { diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index 0ec5b5b98..03045f7e8 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -616,26 +616,36 @@ typedef struct sBSIM4instance double *KCLcurrentqNodeRHS_2 ; //Matrix - double *KCLcurrentdNodePrime ; - double *KCLcurrentdNode ; - double *KCLcurrentsNodePrime ; - double *KCLcurrentsNode ; + double *KCLcurrentdNodePrime_1 ; + double *KCLcurrentdNodePrime_2 ; + + double *KCLcurrentdNode_1 ; + double *KCLcurrentdNode_2 ; + + double *KCLcurrentsNodePrime_1 ; + double *KCLcurrentsNodePrime_2 ; + + double *KCLcurrentsNode_1 ; + double *KCLcurrentsNode_2 ; double *KCLcurrentgNodeExt ; - double *KCLcurrentgNodePrime ; - double *KCLcurrentgNodeMid_1 ; double *KCLcurrentgNodeMid_2 ; + double *KCLcurrentgNodePrime ; + double *KCLcurrentdbNode_1 ; double *KCLcurrentdbNode_2 ; + double *KCLcurrentbNodePrime_1 ; double *KCLcurrentbNodePrime_2 ; double *KCLcurrentbNodePrime_3 ; + double *KCLcurrentbNode_1 ; double *KCLcurrentbNode_2 ; double *KCLcurrentbNode_3 ; + double *KCLcurrentsbNode_1 ; double *KCLcurrentsbNode_2 ; #endif From ea24e1b052d76f73bacae4488acc60642f60ed14 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Wed, 3 Jul 2013 14:25:30 +0200 Subject: [PATCH 250/257] Fixed the Non-Linear Nodes properties in the BSIM4v7 model --- src/spicelib/devices/bsim4/b4node.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c index 27f90f3ab..b131d22e1 100644 --- a/src/spicelib/devices/bsim4/b4node.c +++ b/src/spicelib/devices/bsim4/b4node.c @@ -25,10 +25,14 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) fprintf (stderr, "here->BSIM4dNodePrime: %d\n", here->BSIM4dNodePrime) ; fprintf (stderr, "here->BSIM4sNodePrime: %d\n", here->BSIM4sNodePrime) ; fprintf (stderr, "here->BSIM4gNodePrime: %d\n", here->BSIM4gNodePrime) ; - fprintf (stderr, "here->BSIM4gNodeMid: %d\n", here->BSIM4gNodeMid) ; - fprintf (stderr, "here->BSIM4dbNode: %d\n", here->BSIM4dbNode) ; fprintf (stderr, "here->BSIM4bNodePrime: %d\n", here->BSIM4bNodePrime) ; + fprintf (stderr, "here->BSIM4dNode: %d\n", here->BSIM4dNode) ; + fprintf (stderr, "here->BSIM4sNode: %d\n", here->BSIM4sNode) ; + fprintf (stderr, "here->BSIM4gNodeExt: %d\n", here->BSIM4gNodeExt) ; + fprintf (stderr, "here->BSIM4bNode: %d\n", here->BSIM4bNode) ; + fprintf (stderr, "here->BSIM4dbNode: %d\n", here->BSIM4dbNode) ; fprintf (stderr, "here->BSIM4sbNode: %d\n", here->BSIM4sbNode) ; + fprintf (stderr, "here->BSIM4gNodeMid: %d\n", here->BSIM4gNodeMid) ; fprintf (stderr, "here->BSIM4qNode: %d\n", here->BSIM4qNode) ; #endif @@ -37,7 +41,14 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) ckt->CKTnodeIsLinear [here->BSIM4gNodePrime] = 0 ; ckt->CKTnodeIsLinear [here->BSIM4bNodePrime] = 0 ; - if (!here->BSIM4rbodyMod) + if (here->BSIM4rgateMod == 2) + { + ckt->CKTnodeIsLinear [here->BSIM4gNodeExt] = 0 ; + } else if (here->BSIM4rgateMod == 3) { + ckt->CKTnodeIsLinear [here->BSIM4gNodeMid] = 0 ; + } + + if (here->BSIM4rbodyMod) { ckt->CKTnodeIsLinear [here->BSIM4dbNode] = 0 ; ckt->CKTnodeIsLinear [here->BSIM4sbNode] = 0 ; From fb592a07f5a91b0f58f2a96dcdc0358490c0e534 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 14 Jul 2013 11:10:52 +0200 Subject: [PATCH 251/257] Fixed a bug in the Convergence Test Routine --- src/maths/ni/niconv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 570ceff09..87174ae72 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -84,7 +84,7 @@ NIconvTest(CKTcircuit *ckt) #else /* KCL Verification */ } - else if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i]) && (ckt->CKTvoltCurNode [i])) + if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i]) && (ckt->CKTvoltCurNode [i])) { maximum = 0 ; ptr = ckt->CKTmkCurKCLarray [i] ; From 3494e423fa9fe93be0e5ca46c182f11b2ee8ea24 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sat, 27 Jul 2013 18:37:32 +0200 Subject: [PATCH 252/257] Implemented the KCL for every node, avoiding Delta-V and Delta-I convergence tests. The f(V) convergence test performed by every model isn't needed anymore. --- src/maths/ni/niconv.c | 126 ++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 60 deletions(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 87174ae72..0de9332e3 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -17,74 +17,44 @@ Author: 1985 Thomas L. Quarles int -NIconvTest(CKTcircuit *ckt) +NIconvTest (CKTcircuit *ckt) { - int i; /* generic loop variable */ - int size; /* size of the matrix */ - CKTnode *node; /* current matrix entry */ - double old; - double new; - double tol; + int i ; /* generic loop variable */ + int size ; /* size of the matrix */ + CKTnode *node ; /* current matrix entry */ #ifdef KIRCHHOFF -#ifdef STEPDEBUG - int j ; -#endif - double maximum ; CKTmkCurKCLnode *ptr ; +#ifdef STEPDEBUG + int j ; +#endif +#else + double old, new, tol ; #endif - size = SMPmatSize(ckt->CKTmatrix); - node = ckt->CKTnodes; - -#ifdef STEPDEBUG - for (i=1;i<=size;i++) { - new = ckt->CKTrhs [i] ; - old = ckt->CKTrhsOld [i] ; - printf("chk for convergence: %s new: %g old: %g\n",CKTnodName(ckt,i),new,old); - } -#endif /* STEPDEBUG */ - - for (i=1;i<=size;i++) { - node = node->next; - new = ckt->CKTrhs [i] ; - old = ckt->CKTrhsOld [i] ; - if(node->type == SP_VOLTAGE) { - tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + - ckt->CKTvoltTol; - if (fabs(new-old) >tol ) { - -#ifdef STEPDEBUG - printf(" non-convergence at node (type=3) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",CKTnodName(ckt,i),new,old,tol); - printf(" reltol: %g voltTol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + voltTol)\n",ckt->CKTreltol,ckt->CKTvoltTol); -#endif /* STEPDEBUG */ - - ckt->CKTtroubleNode = i; - ckt->CKTtroubleElt = NULL; - return(1); - } + size = SMPmatSize (ckt->CKTmatrix) ; + node = ckt->CKTnodes ; #ifndef KIRCHHOFF - } else { - tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + - ckt->CKTabstol; - if (fabs(new-old) >tol ) { - #ifdef STEPDEBUG - printf(" non-convergence at node (type=%d) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n",node->type,CKTnodName(ckt,i),new,old,tol); - printf(" reltol: %g abstol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + abstol)\n",ckt->CKTreltol,ckt->CKTabstol); + for (i = 1 ; i <= size ; i++) + { + new = ckt->CKTrhs [i] ; + old = ckt->CKTrhsOld [i] ; + fprintf (err, "chk for convergence: %s new: %g old: %g\n", CKTnodName (ckt, i), new, old) ; + } #endif /* STEPDEBUG */ +#endif - ckt->CKTtroubleNode = i; - ckt->CKTtroubleElt = NULL; - return(1); - } -#else + for (i = 1 ; i <= size ; i++) + { + node = node->next ; + +#ifdef KIRCHHOFF /* KCL Verification */ - } - if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i]) && (ckt->CKTvoltCurNode [i])) + if ((node->type == SP_VOLTAGE) && (!ckt->CKTnodeIsLinear [i])) { maximum = 0 ; ptr = ckt->CKTmkCurKCLarray [i] ; @@ -111,19 +81,55 @@ NIconvTest(CKTcircuit *ckt) ckt->CKTreltol * maximum + ckt->CKTabstol, maximum) ; #endif - if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + } +#else + new = ckt->CKTrhs [i] ; + old = ckt->CKTrhsOld [i] ; + if (node->type == SP_VOLTAGE) + { + tol = ckt->CKTreltol * (MAX (fabs (old), fabs (new))) + ckt->CKTvoltTol ; + if (fabs (new - old) > tol) + { + +#ifdef STEPDEBUG + fprintf (err, " non-convergence at node (type=3) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n", CKTnodName (ckt, i), new, old, tol) ; + fprintf (err, " reltol: %g voltTol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + voltTol)\n", ckt->CKTreltol, ckt->CKTvoltTol) ; +#endif /* STEPDEBUG */ + + ckt->CKTtroubleNode = i ; + ckt->CKTtroubleElt = NULL ; return 1 ; + } + } else { + tol = ckt->CKTreltol * (MAX (fabs (old), fabs (new))) + ckt->CKTabstol ; + if (fabs (new - old) > tol) + { + +#ifdef STEPDEBUG + fprintf (err, " non-convergence at node (type=%d) %s (fabs(new-old)>tol --> fabs(%g-%g)>%g)\n", node->type, + CKTnodName (ckt, i), new, old, tol) ; + fprintf (err, " reltol: %g abstol: %g (tol=reltol*(MAX(fabs(old),fabs(new))) + abstol)\n", ckt->CKTreltol, ckt->CKTabstol) ; +#endif /* STEPDEBUG */ + + ckt->CKTtroubleNode = i ; + ckt->CKTtroubleElt = NULL ; + return 1 ; + } + } #endif - } } +#ifdef KIRCHHOFF + return 0 ; +#else #ifdef NEWCONV - i = CKTconvTest(ckt); + i = CKTconvTest (ckt) ; if (i) - ckt->CKTtroubleNode = 0; - return(i); + ckt->CKTtroubleNode = 0 ; + return i ; #else /* NEWCONV */ - return(0); + return 0 ; #endif /* NEWCONV */ +#endif /* KIRCHHOFF */ } From 8ad6791a6f68dd090121e66352c0eaa6bfa183fd Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 28 Jul 2013 13:37:33 +0200 Subject: [PATCH 253/257] allow compilation with MS Visual Studio --- visualc/vngspice.vcproj | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/visualc/vngspice.vcproj b/visualc/vngspice.vcproj index 9fa1d5d5d..cbc7da30d 100644 --- a/visualc/vngspice.vcproj +++ b/visualc/vngspice.vcproj @@ -4560,6 +4560,10 @@ RelativePath="..\src\spicelib\devices\cap\capmpar.c" > + + @@ -4860,6 +4864,10 @@ RelativePath="..\src\spicelib\analysis\cktmkcur.c" > + + @@ -6040,6 +6048,10 @@ RelativePath="..\src\spicelib\devices\ind\indmpar.c" > + + @@ -8068,6 +8080,10 @@ RelativePath="..\src\spicelib\devices\res\resmpar.c" > + + @@ -8876,6 +8892,10 @@ RelativePath="..\src\spicelib\devices\vsrc\vsrcmdel.c" > + + From 4ab07c713629e0a0bcf96d365bf2d5c4116120b1 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 13 Aug 2013 19:28:36 +0200 Subject: [PATCH 254/257] Removed the CKTvoltCurNode flag, since in this branch the KCL Verification methodology is applied to every node --- src/include/ngspice/cktdefs.h | 1 - src/maths/ni/nireinit.c | 3 --- src/spicelib/devices/ind/indload.c | 3 --- src/spicelib/devices/vsrc/vsrcload.c | 3 --- 4 files changed, 10 deletions(-) diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index e6a3361d0..2101d78f4 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -120,7 +120,6 @@ struct CKTcircuit { #ifdef KIRCHHOFF double *CKTfvk ; /* KCL Verification array */ int *CKTnodeIsLinear ; /* Flag to indicate if a node is linear or non-linear */ - int *CKTvoltCurNode ; /* Flag to indicate if a node contains some direct unknown currents */ CKTmkCurKCLnode **CKTmkCurKCLarray ; /* Array of KCL Currents */ #endif diff --git a/src/maths/ni/nireinit.c b/src/maths/ni/nireinit.c index 805e2ea5f..17a114f90 100644 --- a/src/maths/ni/nireinit.c +++ b/src/maths/ni/nireinit.c @@ -40,9 +40,6 @@ NIreinit( CKTcircuit *ckt) CKALLOC(CKTnodeIsLinear,size+1,int); for (i = 0 ; i <= size ; i++) ckt->CKTnodeIsLinear [i] = 1 ; - CKALLOC(CKTvoltCurNode,size+1,int); - for (i = 0 ; i <= size ; i++) - ckt->CKTvoltCurNode [i] = 0 ; CKALLOC(CKTmkCurKCLarray,size+1,CKTmkCurKCLnode*); for (i = 0 ; i <= size ; i++) ckt->CKTmkCurKCLarray [i] = NULL ; diff --git a/src/spicelib/devices/ind/indload.c b/src/spicelib/devices/ind/indload.c index e763cf4a7..eb0433d16 100644 --- a/src/spicelib/devices/ind/indload.c +++ b/src/spicelib/devices/ind/indload.c @@ -126,9 +126,6 @@ INDload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTfvk+here->INDposNode) += *(ckt->CKTrhsOld+here->INDbrEq) ; *(ckt->CKTfvk+here->INDnegNode) -= *(ckt->CKTrhsOld+here->INDbrEq) ; - *(ckt->CKTvoltCurNode+here->INDposNode) = 1 ; - *(ckt->CKTvoltCurNode+here->INDnegNode) = 1 ; - *(here->KCLcurrentPos) = *(ckt->CKTrhsOld+here->INDbrEq) ; *(here->KCLcurrentNeg) = -(*(ckt->CKTrhsOld+here->INDbrEq)) ; #endif diff --git a/src/spicelib/devices/vsrc/vsrcload.c b/src/spicelib/devices/vsrc/vsrcload.c index 429f91118..40c5d1d3f 100644 --- a/src/spicelib/devices/vsrc/vsrcload.c +++ b/src/spicelib/devices/vsrc/vsrcload.c @@ -49,9 +49,6 @@ VSRCload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTfvk+here->VSRCposNode) += *(ckt->CKTrhsOld+here->VSRCbranch) ; *(ckt->CKTfvk+here->VSRCnegNode) -= *(ckt->CKTrhsOld+here->VSRCbranch) ; - *(ckt->CKTvoltCurNode+here->VSRCposNode) = 1 ; - *(ckt->CKTvoltCurNode+here->VSRCnegNode) = 1 ; - *(here->KCLcurrentPos) = *(ckt->CKTrhsOld+here->VSRCbranch) ; *(here->KCLcurrentNeg) = -(*(ckt->CKTrhsOld+here->VSRCbranch)) ; #endif From a54ac67561ecaae89a2584b68961b51349776378 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Fri, 16 Aug 2013 14:11:15 +0200 Subject: [PATCH 255/257] Fixed a very dangerous bug in the KCL Verification, which was inserted in a previous commit --- src/maths/ni/niconv.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 0de9332e3..e3300f71e 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -81,6 +81,8 @@ NIconvTest (CKTcircuit *ckt) ckt->CKTreltol * maximum + ckt->CKTabstol, maximum) ; #endif + if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + return 1 ; } #else new = ckt->CKTrhs [i] ; From 6f339d3443d89ca9a703be4c8503cd370a6c9b92 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Fri, 16 Aug 2013 14:40:51 +0200 Subject: [PATCH 256/257] Added a string to signal that KCL Verifcation is enabled in the NGSPICE header --- src/frontend/misccoms.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/frontend/misccoms.c b/src/frontend/misccoms.c index 585d3d7fb..64d866e31 100644 --- a/src/frontend/misccoms.c +++ b/src/frontend/misccoms.c @@ -175,6 +175,11 @@ com_version(wordlist *wl) fprintf(cp_out, "** %s\n", Spice_Notice); if (Spice_Build_Date != NULL && *Spice_Build_Date != 0) fprintf(cp_out, "** Creation Date: %s\n", Spice_Build_Date); + +#ifdef KIRCHHOFF + fprintf(cp_out, "** KCL Verification enabled.\n"); +#endif + fprintf(cp_out, "******\n"); } else { @@ -251,6 +256,9 @@ com_version(wordlist *wl) #endif #ifdef EXP_DEV fprintf(cp_out, "** Experimental devices enabled.\n"); +#endif +#ifdef KIRCHHOFF + fprintf(cp_out, "** KCL Verification enabled.\n"); #endif fprintf(cp_out, "******\n"); From 8ec23a720baf01594f3bff1f1dd227f32d26619a Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 15 Sep 2013 15:50:33 +0200 Subject: [PATCH 257/257] Inserted conditional compilation in every *ext.h file --- src/maths/ni/niconv.c | 1 + src/spicelib/devices/asrc/asrcext.h | 3 ++ src/spicelib/devices/bjt/bjtext.h | 4 ++- src/spicelib/devices/bsim1/bsim1ext.h | 3 ++ src/spicelib/devices/bsim2/bsim2ext.h | 3 ++ src/spicelib/devices/bsim3/bsim3ext.h | 3 ++ src/spicelib/devices/bsim3soi_dd/b3soiddext.h | 3 ++ src/spicelib/devices/bsim3soi_fd/b3soifdext.h | 3 ++ src/spicelib/devices/bsim3soi_pd/b3soipdext.h | 3 ++ src/spicelib/devices/bsim3v0/bsim3v0ext.h | 3 ++ src/spicelib/devices/bsim3v1/bsim3v1ext.h | 3 ++ src/spicelib/devices/bsim3v32/bsim3v32ext.h | 3 ++ src/spicelib/devices/bsim4/bsim4ext.h | 3 ++ src/spicelib/devices/bsim4v4/bsim4v4ext.h | 3 ++ src/spicelib/devices/bsim4v5/bsim4v5ext.h | 3 ++ src/spicelib/devices/bsim4v6/bsim4v6ext.h | 3 ++ src/spicelib/devices/bsimsoi/b4soiext.h | 3 ++ src/spicelib/devices/cccs/cccsext.h | 1 - src/spicelib/devices/hfet1/hfetext.h | 3 ++ src/spicelib/devices/hfet2/hfet2ext.h | 33 ++++++++++--------- src/spicelib/devices/hisim2/hsm2ext.h | 3 ++ src/spicelib/devices/hisimhv1/hsmhvext.h | 3 ++ src/spicelib/devices/jfet/jfetext.h | 3 ++ src/spicelib/devices/jfet2/jfet2ext.h | 3 ++ src/spicelib/devices/mes/mesext.h | 3 ++ src/spicelib/devices/mesa/mesaext.h | 3 ++ src/spicelib/devices/mos1/mos1ext.h | 3 ++ src/spicelib/devices/mos2/mos2ext.h | 3 ++ src/spicelib/devices/mos3/mos3ext.h | 3 ++ src/spicelib/devices/mos6/mos6ext.h | 3 ++ src/spicelib/devices/mos9/mos9ext.h | 3 ++ src/spicelib/devices/soi3/soi3ext.h | 3 ++ src/spicelib/devices/vbic/vbicext.h | 4 ++- src/spicelib/devices/vcvs/vcvsext.h | 1 - 34 files changed, 109 insertions(+), 19 deletions(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index e3300f71e..8c4c8c6a9 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -81,6 +81,7 @@ NIconvTest (CKTcircuit *ckt) ckt->CKTreltol * maximum + ckt->CKTabstol, maximum) ; #endif + /* Check Convergence */ if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) return 1 ; } diff --git a/src/spicelib/devices/asrc/asrcext.h b/src/spicelib/devices/asrc/asrcext.h index 9b99b26d0..f9ad10052 100644 --- a/src/spicelib/devices/asrc/asrcext.h +++ b/src/spicelib/devices/asrc/asrcext.h @@ -16,4 +16,7 @@ extern int ASRCacLoad(GENmodel*,CKTcircuit*); extern int ASRCsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int ASRCunsetup(GENmodel*,CKTcircuit*); extern int ASRCtemp(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int ASRCnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bjt/bjtext.h b/src/spicelib/devices/bjt/bjtext.h index d4c6675a3..0eed2a2cf 100644 --- a/src/spicelib/devices/bjt/bjtext.h +++ b/src/spicelib/devices/bjt/bjtext.h @@ -31,6 +31,8 @@ extern int BJTtrunc(GENmodel*,CKTcircuit*,double*); extern int BJTdisto(int,GENmodel*,CKTcircuit*); extern int BJTnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BJTdSetup(GENmodel*, register CKTcircuit*); -extern int BJTnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#ifdef KIRCHHOFF +extern int BJTnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif #endif diff --git a/src/spicelib/devices/bsim1/bsim1ext.h b/src/spicelib/devices/bsim1/bsim1ext.h index a21c5127b..7d9c21119 100644 --- a/src/spicelib/devices/bsim1/bsim1ext.h +++ b/src/spicelib/devices/bsim1/bsim1ext.h @@ -29,4 +29,7 @@ extern int B1temp(GENmodel*,CKTcircuit*); extern int B1trunc(GENmodel*,CKTcircuit*,double*); extern int B1disto(int,GENmodel*,CKTcircuit*); extern int B1dSetup(GENmodel*, register CKTcircuit*); + +#ifdef KIRCHHOFF extern int B1nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim2/bsim2ext.h b/src/spicelib/devices/bsim2/bsim2ext.h index d819d8a38..51f03816b 100644 --- a/src/spicelib/devices/bsim2/bsim2ext.h +++ b/src/spicelib/devices/bsim2/bsim2ext.h @@ -25,4 +25,7 @@ extern int B2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int B2unsetup(GENmodel*,CKTcircuit*); extern int B2temp(GENmodel*,CKTcircuit*); extern int B2trunc(GENmodel*,CKTcircuit*,double*); + +#ifdef KIRCHHOFF extern int B2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim3/bsim3ext.h b/src/spicelib/devices/bsim3/bsim3ext.h index ef00e8538..8bca8ff49 100644 --- a/src/spicelib/devices/bsim3/bsim3ext.h +++ b/src/spicelib/devices/bsim3/bsim3ext.h @@ -28,4 +28,7 @@ extern int BSIM3temp(GENmodel*,CKTcircuit*); extern int BSIM3trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3unsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int BSIM3nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h index 9f0870708..467835c11 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h @@ -28,4 +28,7 @@ extern int B3SOIDDtemp(GENmodel*,CKTcircuit*); extern int B3SOIDDtrunc(GENmodel*,CKTcircuit*,double*); extern int B3SOIDDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIDDunsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int B3SOIDDnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h index acdf39dc3..f2b1eb896 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h @@ -28,4 +28,7 @@ extern int B3SOIFDtemp(GENmodel*,CKTcircuit*); extern int B3SOIFDtrunc(GENmodel*,CKTcircuit*,double*); extern int B3SOIFDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIFDunsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int B3SOIFDnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h index 8f94ec599..a890475f4 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h @@ -28,4 +28,7 @@ extern int B3SOIPDtemp(GENmodel*,CKTcircuit*); extern int B3SOIPDtrunc(GENmodel*,CKTcircuit*,double*); extern int B3SOIPDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIPDunsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int B3SOIPDnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim3v0/bsim3v0ext.h b/src/spicelib/devices/bsim3v0/bsim3v0ext.h index efbeea27e..7c3d3f42d 100644 --- a/src/spicelib/devices/bsim3v0/bsim3v0ext.h +++ b/src/spicelib/devices/bsim3v0/bsim3v0ext.h @@ -27,4 +27,7 @@ extern int BSIM3v0temp(GENmodel*,CKTcircuit*); extern int BSIM3v0trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3v0noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3v0unsetup(GENmodel *, CKTcircuit *); + +#ifdef KIRCHHOFF extern int BSIM3v0nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim3v1/bsim3v1ext.h b/src/spicelib/devices/bsim3v1/bsim3v1ext.h index a3c9c304d..5daa4562a 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1ext.h +++ b/src/spicelib/devices/bsim3v1/bsim3v1ext.h @@ -28,4 +28,7 @@ extern int BSIM3v1temp(GENmodel *, CKTcircuit *); extern int BSIM3v1trunc(GENmodel *, CKTcircuit *, double *); extern int BSIM3v1noise(int, int, GENmodel *, CKTcircuit *, Ndata *, double *); extern int BSIM3v1unsetup(GENmodel *, CKTcircuit *); + +#ifdef KIRCHHOFF extern int BSIM3v1nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim3v32/bsim3v32ext.h b/src/spicelib/devices/bsim3v32/bsim3v32ext.h index ce6d0cd1b..ea33e0114 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32ext.h +++ b/src/spicelib/devices/bsim3v32/bsim3v32ext.h @@ -29,4 +29,7 @@ extern int BSIM3v32temp(GENmodel*,CKTcircuit*); extern int BSIM3v32trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3v32noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3v32unsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int BSIM3v32nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim4/bsim4ext.h b/src/spicelib/devices/bsim4/bsim4ext.h index 965951f03..099d703cf 100644 --- a/src/spicelib/devices/bsim4/bsim4ext.h +++ b/src/spicelib/devices/bsim4/bsim4ext.h @@ -28,4 +28,7 @@ extern int BSIM4temp(GENmodel*,CKTcircuit*); extern int BSIM4trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4unsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int BSIM4nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim4v4/bsim4v4ext.h b/src/spicelib/devices/bsim4v4/bsim4v4ext.h index 70bf7fb40..6b50403cc 100644 --- a/src/spicelib/devices/bsim4v4/bsim4v4ext.h +++ b/src/spicelib/devices/bsim4v4/bsim4v4ext.h @@ -29,4 +29,7 @@ extern int BSIM4v4temp(GENmodel*,CKTcircuit*); extern int BSIM4v4trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4v4noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v4unsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int BSIM4v4nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim4v5/bsim4v5ext.h b/src/spicelib/devices/bsim4v5/bsim4v5ext.h index 35f5989d3..ce677f86f 100644 --- a/src/spicelib/devices/bsim4v5/bsim4v5ext.h +++ b/src/spicelib/devices/bsim4v5/bsim4v5ext.h @@ -28,4 +28,7 @@ extern int BSIM4v5temp(GENmodel*,CKTcircuit*); extern int BSIM4v5trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4v5noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v5unsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int BSIM4v5nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsim4v6/bsim4v6ext.h b/src/spicelib/devices/bsim4v6/bsim4v6ext.h index 7bb9f6b12..95e2e2c69 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6ext.h +++ b/src/spicelib/devices/bsim4v6/bsim4v6ext.h @@ -28,4 +28,7 @@ extern int BSIM4v6temp(GENmodel*,CKTcircuit*); extern int BSIM4v6trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4v6noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v6unsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int BSIM4v6nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/bsimsoi/b4soiext.h b/src/spicelib/devices/bsimsoi/b4soiext.h index 0ec40e28a..b80f07e6f 100644 --- a/src/spicelib/devices/bsimsoi/b4soiext.h +++ b/src/spicelib/devices/bsimsoi/b4soiext.h @@ -30,4 +30,7 @@ extern int B4SOItemp(GENmodel*,CKTcircuit*); extern int B4SOItrunc(GENmodel*,CKTcircuit*,double*); extern int B4SOInoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B4SOIunsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int B4SOInodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/cccs/cccsext.h b/src/spicelib/devices/cccs/cccsext.h index 5a8934518..42c8b5801 100644 --- a/src/spicelib/devices/cccs/cccsext.h +++ b/src/spicelib/devices/cccs/cccsext.h @@ -16,4 +16,3 @@ extern int CCCSsLoad(GENmodel*,CKTcircuit*); extern void CCCSsPrint(GENmodel*,CKTcircuit*); extern int CCCSsSetup(SENstruct*,GENmodel*); extern int CCCSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); - diff --git a/src/spicelib/devices/hfet1/hfetext.h b/src/spicelib/devices/hfet1/hfetext.h index caa55afe7..3f789450d 100644 --- a/src/spicelib/devices/hfet1/hfetext.h +++ b/src/spicelib/devices/hfet1/hfetext.h @@ -18,4 +18,7 @@ extern int HFETAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int HFETAtemp(GENmodel*,CKTcircuit*); extern int HFETAtrunc(GENmodel*,CKTcircuit*,double*); extern int HFETAunsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int HFETAnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/hfet2/hfet2ext.h b/src/spicelib/devices/hfet2/hfet2ext.h index 75369a790..130d13ec9 100644 --- a/src/spicelib/devices/hfet2/hfet2ext.h +++ b/src/spicelib/devices/hfet2/hfet2ext.h @@ -3,19 +3,22 @@ Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reser Author: Trond Ytterdal **********/ -extern int HFET2acLoad(GENmodel*,CKTcircuit*); -extern int HFET2ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); -extern int HFET2delete(GENmodel*,IFuid,GENinstance**); +extern int HFET2acLoad(GENmodel*,CKTcircuit*); +extern int HFET2ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); +extern int HFET2delete(GENmodel*,IFuid,GENinstance**); extern void HFET2destroy(GENmodel**); -extern int HFET2getic(GENmodel*,CKTcircuit*); -extern int HFET2load(GENmodel*,CKTcircuit*); -extern int HFET2mAsk(CKTcircuit*,GENmodel*,int,IFvalue*); -extern int HFET2mDelete(GENmodel**,IFuid,GENmodel*); -extern int HFET2mParam(int,IFvalue*,GENmodel*); -extern int HFET2param(int,IFvalue*,GENinstance*,IFvalue*); -extern int HFET2pzLoad(GENmodel*, CKTcircuit*, SPcomplex*); -extern int HFET2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int HFET2temp(GENmodel*,CKTcircuit*); -extern int HFET2trunc(GENmodel*,CKTcircuit*,double*); -extern int HFET2unsetup( GENmodel*,CKTcircuit*); -extern int HFET2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +extern int HFET2getic(GENmodel*,CKTcircuit*); +extern int HFET2load(GENmodel*,CKTcircuit*); +extern int HFET2mAsk(CKTcircuit*,GENmodel*,int,IFvalue*); +extern int HFET2mDelete(GENmodel**,IFuid,GENmodel*); +extern int HFET2mParam(int,IFvalue*,GENmodel*); +extern int HFET2param(int,IFvalue*,GENinstance*,IFvalue*); +extern int HFET2pzLoad(GENmodel*, CKTcircuit*, SPcomplex*); +extern int HFET2setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); +extern int HFET2temp(GENmodel*,CKTcircuit*); +extern int HFET2trunc(GENmodel*,CKTcircuit*,double*); +extern int HFET2unsetup( GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF +extern int HFET2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/hisim2/hsm2ext.h b/src/spicelib/devices/hisim2/hsm2ext.h index 6eda4563c..863e42b04 100644 --- a/src/spicelib/devices/hisim2/hsm2ext.h +++ b/src/spicelib/devices/hisim2/hsm2ext.h @@ -37,4 +37,7 @@ extern int HSM2unsetup(GENmodel*,CKTcircuit*); extern int HSM2temp(GENmodel*,CKTcircuit*); extern int HSM2trunc(GENmodel*,CKTcircuit*,double*); extern int HSM2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); + +#ifdef KIRCHHOFF extern int HSM2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/hisimhv1/hsmhvext.h b/src/spicelib/devices/hisimhv1/hsmhvext.h index 16ffdf799..cee662721 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvext.h +++ b/src/spicelib/devices/hisimhv1/hsmhvext.h @@ -37,4 +37,7 @@ extern int HSMHVunsetup(GENmodel*,CKTcircuit*); extern int HSMHVtemp(GENmodel*,CKTcircuit*); extern int HSMHVtrunc(GENmodel*,CKTcircuit*,double*); extern int HSMHVnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); + +#ifdef KIRCHHOFF extern int HSMHVnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/jfet/jfetext.h b/src/spicelib/devices/jfet/jfetext.h index 8d1bf7ab6..f029f52ed 100644 --- a/src/spicelib/devices/jfet/jfetext.h +++ b/src/spicelib/devices/jfet/jfetext.h @@ -22,4 +22,7 @@ extern int JFETtrunc(GENmodel*,CKTcircuit*,double*); extern int JFETdisto(int,GENmodel*,CKTcircuit*); extern int JFETnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int JFETdSetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int JFETnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/jfet2/jfet2ext.h b/src/spicelib/devices/jfet2/jfet2ext.h index 4ba82fdd8..205de095f 100644 --- a/src/spicelib/devices/jfet2/jfet2ext.h +++ b/src/spicelib/devices/jfet2/jfet2ext.h @@ -22,4 +22,7 @@ extern int JFET2unsetup(GENmodel*,CKTcircuit*); extern int JFET2temp(GENmodel*,CKTcircuit*); extern int JFET2trunc(GENmodel*,CKTcircuit*,double*); extern int JFET2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); + +#ifdef KIRCHHOFF extern int JFET2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/mes/mesext.h b/src/spicelib/devices/mes/mesext.h index b9ccbbb78..2450153ab 100644 --- a/src/spicelib/devices/mes/mesext.h +++ b/src/spicelib/devices/mes/mesext.h @@ -22,4 +22,7 @@ extern int MEStrunc(GENmodel*,CKTcircuit*,double*); extern int MESdisto(int,GENmodel*,CKTcircuit*); extern int MESnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MESdSetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int MESnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/mesa/mesaext.h b/src/spicelib/devices/mesa/mesaext.h index 6f6c1334d..640a57fa4 100644 --- a/src/spicelib/devices/mesa/mesaext.h +++ b/src/spicelib/devices/mesa/mesaext.h @@ -18,4 +18,7 @@ extern int MESAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int MESAtemp(GENmodel*,CKTcircuit*); extern int MESAtrunc(GENmodel*,CKTcircuit*,double*); extern int MESAunsetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int MESAnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/mos1/mos1ext.h b/src/spicelib/devices/mos1/mos1ext.h index d198c1d86..46488086c 100644 --- a/src/spicelib/devices/mos1/mos1ext.h +++ b/src/spicelib/devices/mos1/mos1ext.h @@ -28,4 +28,7 @@ extern int MOS1convTest(GENmodel*,CKTcircuit*); extern int MOS1disto(int,GENmodel*,CKTcircuit*); extern int MOS1noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS1dSetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int MOS1nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/mos2/mos2ext.h b/src/spicelib/devices/mos2/mos2ext.h index 6364ae5ad..ccc0659be 100644 --- a/src/spicelib/devices/mos2/mos2ext.h +++ b/src/spicelib/devices/mos2/mos2ext.h @@ -28,4 +28,7 @@ extern int MOS2trunc(GENmodel*,CKTcircuit*,double*); extern int MOS2disto(int,GENmodel*,CKTcircuit*); extern int MOS2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS2dSetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int MOS2nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/mos3/mos3ext.h b/src/spicelib/devices/mos3/mos3ext.h index 9777be02d..731a0b432 100644 --- a/src/spicelib/devices/mos3/mos3ext.h +++ b/src/spicelib/devices/mos3/mos3ext.h @@ -28,4 +28,7 @@ extern int MOS3trunc(GENmodel*,CKTcircuit*,double*); extern int MOS3disto(int,GENmodel*,CKTcircuit*); extern int MOS3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS3dSetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int MOS3nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/mos6/mos6ext.h b/src/spicelib/devices/mos6/mos6ext.h index 297974142..ca9c43d33 100644 --- a/src/spicelib/devices/mos6/mos6ext.h +++ b/src/spicelib/devices/mos6/mos6ext.h @@ -19,4 +19,7 @@ extern int MOS6unsetup(GENmodel*,CKTcircuit*); extern int MOS6temp(GENmodel*,CKTcircuit*); extern int MOS6trunc(GENmodel*,CKTcircuit*,double*); extern int MOS6convTest(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int MOS6nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/mos9/mos9ext.h b/src/spicelib/devices/mos9/mos9ext.h index 4497953c7..543f4ae18 100644 --- a/src/spicelib/devices/mos9/mos9ext.h +++ b/src/spicelib/devices/mos9/mos9ext.h @@ -28,4 +28,7 @@ extern int MOS9trunc(GENmodel*,CKTcircuit*,double*); extern int MOS9disto(int,GENmodel*,CKTcircuit*); extern int MOS9noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS9dSetup(GENmodel*,CKTcircuit*); + +#ifdef KIRCHHOFF extern int MOS9nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/soi3/soi3ext.h b/src/spicelib/devices/soi3/soi3ext.h index 38ea2805f..ec2cef936 100644 --- a/src/spicelib/devices/soi3/soi3ext.h +++ b/src/spicelib/devices/soi3/soi3ext.h @@ -65,4 +65,7 @@ extern int SOI3convTest(GENmodel*,CKTcircuit*); /* extern int SOI3disto(int,GENmodel*,CKTcircuit*); */ extern int SOI3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); + +#ifdef KIRCHHOFF extern int SOI3nodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif diff --git a/src/spicelib/devices/vbic/vbicext.h b/src/spicelib/devices/vbic/vbicext.h index 8e97121e5..43958eeb3 100644 --- a/src/spicelib/devices/vbic/vbicext.h +++ b/src/spicelib/devices/vbic/vbicext.h @@ -25,6 +25,8 @@ extern int VBICunsetup(GENmodel*,CKTcircuit*); extern int VBICtemp(GENmodel*,CKTcircuit*); extern int VBICtrunc(GENmodel*,CKTcircuit*,double*); extern int VBICnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); -extern int VBICnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#ifdef KIRCHHOFF +extern int VBICnodeIsNonLinear (GENmodel *, CKTcircuit *) ; +#endif #endif diff --git a/src/spicelib/devices/vcvs/vcvsext.h b/src/spicelib/devices/vcvs/vcvsext.h index 3d3858273..5a1c2855a 100644 --- a/src/spicelib/devices/vcvs/vcvsext.h +++ b/src/spicelib/devices/vcvs/vcvsext.h @@ -17,4 +17,3 @@ extern int VCVSsSetup(SENstruct*,GENmodel*); extern void VCVSsPrint(GENmodel*,CKTcircuit*); extern int VCVSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int VCVSunsetup(GENmodel*,CKTcircuit*); -