/* ******************************************************************************
   *  BSIM4 4.8.3 released on 05/19/2025                                        *
   *  BSIM4 Model Equations                                                     *
   ******************************************************************************

   ******************************************************************************
   *  Copyright (c) 2025 University of California                               *
   *                                                                            *
   *  Project Directors: Prof. Sayeef Salahuddin and Prof. Chenming Hu          *
   *  Developers list: https://www.bsim.berkeley.edu/models/bsim4/auth_bsim4/   *
   ******************************************************************************/

/*
Licensed under Educational Community License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain a copy of the license at
http://opensource.org/licenses/ECL-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
under the License.

BSIM4 model is supported by the members of Silicon Integration Initiative's Compact Model Coalition. A link to the most recent version of this
standard can be found at: http://www.si2.org/cmc
*/

#include "ngspice/ngspice.h"
#include "ngspice/jobdefs.h"
#include "ngspice/ftedefs.h"
#include "ngspice/smpdefs.h"
#include "ngspice/cktdefs.h"
#include "bsim4def.h"
#include "ngspice/const.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"

#ifdef USE_OMP
#include "ngspice/cpextern.h"
#endif

#define MAX_EXP 5.834617425e14
#define MIN_EXP 1.713908431e-15
#define EXP_THRESHOLD 34.0
#define EPS0 8.85418e-12
#define EPSSI 1.03594e-10
#define PI 3.141592654
#define Charge_q 1.60219e-19

int
BSIM4setup(
SMPmatrix *matrix,
GENmodel *inModel,
CKTcircuit *ckt,
int *states)
{
BSIM4model *model = (BSIM4model*)inModel;
BSIM4instance *here;
int error;
CKTnode *tmp;
int    noiseAnalGiven = 0, createNode;  /* Criteria for new node creation */
double Rtot, DMCGeff, DMCIeff, DMDGeff;
JOB   *job;

#ifdef USE_OMP
int idx, InstCount;
BSIM4instance **InstArray;
#endif

    /* Search for a noise analysis request */
    for (job = ((TSKtask *)ft_curckt->ci_curTask)->jobs;job;job = job->JOBnextJob) {
        if(strcmp(job->JOBname,"Noise Analysis")==0) {
            noiseAnalGiven = 1;
            break;
        }
    }

    /*  loop through all the BSIM4 device models */
    for( ; model != NULL; model = BSIM4nextModel(model))
    {   /* process defaults of model parameters */
        if (!model->BSIM4typeGiven)
            model->BSIM4type = NMOS;

        if (!model->BSIM4mobModGiven)
            model->BSIM4mobMod = 0;
        else if ((model->BSIM4mobMod != 0) && (model->BSIM4mobMod != 1)&& (model->BSIM4mobMod != 2)&& (model->BSIM4mobMod != 3)
                 && (model->BSIM4mobMod != 4) && (model->BSIM4mobMod != 5) && (model->BSIM4mobMod != 6)) /* Synopsys 08/30/2013 modify */
        {   model->BSIM4mobMod = 0;
            printf("Warning: mobMod has been set to its default value: 0.\n");
        }

        if (!model->BSIM4binUnitGiven)
            model->BSIM4binUnit = 1;
        if (!model->BSIM4paramChkGiven)
            model->BSIM4paramChk = 1;

        if (!model->BSIM4dioModGiven)
            model->BSIM4dioMod = 1;
        else if ((model->BSIM4dioMod != 0) && (model->BSIM4dioMod != 1)
            && (model->BSIM4dioMod != 2))
        {   model->BSIM4dioMod = 1;
            printf("Warning: dioMod has been set to its default value: 1.\n");
        }

        if (!model->BSIM4cvchargeModGiven)
            model->BSIM4cvchargeMod = 0;
        if (!model->BSIM4capModGiven)
            model->BSIM4capMod = 2;
        else if ((model->BSIM4capMod != 0) && (model->BSIM4capMod != 1)
            && (model->BSIM4capMod != 2))
        {   model->BSIM4capMod = 2;
            printf("Warning: capMod has been set to its default value: 2.\n");
        }

        if (!model->BSIM4rdsModGiven)
            model->BSIM4rdsMod = 0;
        else if ((model->BSIM4rdsMod != 0) && (model->BSIM4rdsMod != 1))
        {   model->BSIM4rdsMod = 0;
            printf("Warning: rdsMod has been set to its default value: 0.\n");
        }
        if (!model->BSIM4rbodyModGiven)
            model->BSIM4rbodyMod = 0;
        else if ((model->BSIM4rbodyMod != 0) && (model->BSIM4rbodyMod != 1) && (model->BSIM4rbodyMod != 2))
        {   model->BSIM4rbodyMod = 0;
            printf("Warning: rbodyMod has been set to its default value: 0.\n");
        }

        if (!model->BSIM4rgateModGiven)
            model->BSIM4rgateMod = 0;
        else if ((model->BSIM4rgateMod != 0) && (model->BSIM4rgateMod != 1)
            && (model->BSIM4rgateMod != 2) && (model->BSIM4rgateMod != 3))
        {   model->BSIM4rgateMod = 0;
            printf("Warning: rgateMod has been set to its default value: 0.\n");
        }

        if (!model->BSIM4perModGiven)
            model->BSIM4perMod = 1;
        else if ((model->BSIM4perMod != 0) && (model->BSIM4perMod != 1))
        {   model->BSIM4perMod = 1;
            printf("Warning: perMod has been set to its default value: 1.\n");
        }

        if (!model->BSIM4geoModGiven)
            model->BSIM4geoMod = 0;

        if (!model->BSIM4fnoiModGiven)
            model->BSIM4fnoiMod = 1;
        else if ((model->BSIM4fnoiMod != 0) && (model->BSIM4fnoiMod != 1))
        {   model->BSIM4fnoiMod = 1;
            printf("Warning: fnoiMod has been set to its default value: 1.\n");
        }
        if (!model->BSIM4tnoiModGiven)
            model->BSIM4tnoiMod = 0; /* WDLiu: tnoiMod=1 needs to set internal S/D nodes */
        else if ((model->BSIM4tnoiMod != 0) && (model->BSIM4tnoiMod != 1) && (model->BSIM4tnoiMod != 2))  /* v4.7 */
        {   model->BSIM4tnoiMod = 0;
            printf("Warning: tnoiMod has been set to its default value: 0.\n");
        }

        if (!model->BSIM4trnqsModGiven)
            model->BSIM4trnqsMod = 0;
        else if ((model->BSIM4trnqsMod != 0) && (model->BSIM4trnqsMod != 1))
        {   model->BSIM4trnqsMod = 0;
            printf("Warning: trnqsMod has been set to its default value: 0.\n");
        }
        if (!model->BSIM4acnqsModGiven)
            model->BSIM4acnqsMod = 0;
        else if ((model->BSIM4acnqsMod != 0) && (model->BSIM4acnqsMod != 1))
        {   model->BSIM4acnqsMod = 0;
            printf("Warning: acnqsMod has been set to its default value: 0.\n");
        }

        if (!model->BSIM4mtrlModGiven)
            model->BSIM4mtrlMod = 0;
        else if((model->BSIM4mtrlMod != 0) && (model->BSIM4mtrlMod != 1))
        {
            model->BSIM4mtrlMod = 0;
            printf("Warning: mtrlMod has been set to its default value: 0.\n");
        }
        if (!model->BSIM4mtrlCompatModGiven)
            model->BSIM4mtrlCompatMod = 0;
        else if((model->BSIM4mtrlCompatMod != 0) && (model->BSIM4mtrlCompatMod != 1))
        {
            model->BSIM4mtrlCompatMod = 0;
            printf("Warning: mtrlCompatMod has been set to its default value: 0.\n");
        }

        if (!model->BSIM4igcModGiven)
            model->BSIM4igcMod = 0;
        else if ((model->BSIM4igcMod != 0) && (model->BSIM4igcMod != 1)
          && (model->BSIM4igcMod != 2))
        {   model->BSIM4igcMod = 0;
            printf("Warning: igcMod has been set to its default value: 0.\n");
        }
        if (!model->BSIM4igbModGiven)
            model->BSIM4igbMod = 0;
        else if ((model->BSIM4igbMod != 0) && (model->BSIM4igbMod != 1))
        {   model->BSIM4igbMod = 0;
            printf("Warning: igbMod has been set to its default value: 0.\n");
        }
        if (!model->BSIM4tempModGiven)
            model->BSIM4tempMod = 0;
        else if ((model->BSIM4tempMod != 0) && (model->BSIM4tempMod != 1)
          && (model->BSIM4tempMod != 2) && (model->BSIM4tempMod != 3))
        {   model->BSIM4tempMod = 0;
            printf("Warning: tempMod has been set to its default value: 0.\n");
        }
        if (!model->BSIM4versionGiven)
           model->BSIM4version = copy("4.8.3");
        /* Speed up version checking via integer version number */
        if ((!strcmp(model->BSIM4version, "4.8.3"))||(!strncmp(model->BSIM4version, "4.83", 4))||(!strncmp(model->BSIM4version, "4.8", 3))) {
            model->BSIM4v48intVersion = BSIM4v48V483;
        } else if ((!strcmp(model->BSIM4version, "4.8.2"))||(!strncmp(model->BSIM4version, "4.82", 4))) {
            model->BSIM4v48intVersion = BSIM4v48V482;
        } else if ((!strcmp(model->BSIM4version, "4.8.1"))||(!strncmp(model->BSIM4version, "4.81", 4))) {
            model->BSIM4v48intVersion = BSIM4v48V481;
        } else if ((!strcmp(model->BSIM4version, "4.8.0"))||(!strncmp(model->BSIM4version, "4.80", 4))) {
            model->BSIM4v48intVersion = BSIM4v48V480;
        } else {
            printf("Warning: unknown BSIM4 version. Working now with BSIM4.8.3.\n");
            model->BSIM4v48intVersion = BSIM4v48V483;
        }
        if (!model->BSIM4toxrefGiven)
            model->BSIM4toxref = 30.0e-10;
        if (!model->BSIM4eotGiven)
            model->BSIM4eot = 15.0e-10;
        if (!model->BSIM4vddeotGiven)
            model->BSIM4vddeot = (model->BSIM4type == NMOS) ? 1.5 : -1.5;
        if (!model->BSIM4tempeotGiven)
            model->BSIM4tempeot = 300.15;
        if (!model->BSIM4leffeotGiven)
            model->BSIM4leffeot = 1;
        if (!model->BSIM4weffeotGiven)
            model->BSIM4weffeot = 10;
        if (!model->BSIM4adosGiven)
            model->BSIM4ados = 1.0;
        if (!model->BSIM4bdosGiven)
            model->BSIM4bdos = 1.0;
        if (!model->BSIM4toxeGiven)
            model->BSIM4toxe = 30.0e-10;
        if (!model->BSIM4toxpGiven)
            model->BSIM4toxp = model->BSIM4toxe;
        if (!model->BSIM4toxmGiven)
            model->BSIM4toxm = model->BSIM4toxe;
        if (!model->BSIM4dtoxGiven)
            model->BSIM4dtox = 0.0;
        if (!model->BSIM4epsroxGiven)
            model->BSIM4epsrox = 3.9;
        if (!model->BSIM4cdscGiven)
            model->BSIM4cdsc = 2.4e-4;   /* unit Q/V/m^2  */
        if (!model->BSIM4cdscbGiven)
            model->BSIM4cdscb = 0.0;   /* unit Q/V/m^2  */
        if (!model->BSIM4cdscdGiven)
            model->BSIM4cdscd = 0.0;   /* unit Q/V/m^2  */
        if (!model->BSIM4citGiven)
            model->BSIM4cit = 0.0;   /* unit Q/V/m^2  */
        if (!model->BSIM4nfactorGiven)
            model->BSIM4nfactor = 1.0;
        if (!model->BSIM4xjGiven)
            model->BSIM4xj = .15e-6;
        if (!model->BSIM4vsatGiven)
            model->BSIM4vsat = 8.0e4;    /* unit m/s */
        if (!model->BSIM4atGiven)
            model->BSIM4at = 3.3e4;    /* unit m/s */
        if (!model->BSIM4a0Given)
            model->BSIM4a0 = 1.0;
        if (!model->BSIM4agsGiven)
            model->BSIM4ags = 0.0;
        if (!model->BSIM4a1Given)
            model->BSIM4a1 = 0.0;
        if (!model->BSIM4a2Given)
            model->BSIM4a2 = 1.0;
        if (!model->BSIM4ketaGiven)
            model->BSIM4keta = -0.047;    /* unit  / V */
        if (!model->BSIM4ketacGiven)
            model->BSIM4ketac = model->BSIM4keta;    /* unit  / V */
        if (!model->BSIM4nsubGiven)
            model->BSIM4nsub = 6.0e16;   /* unit 1/cm3 */
        if (!model->BSIM4phigGiven)
            model->BSIM4phig = 4.05;
        if (!model->BSIM4epsrgateGiven)
            model->BSIM4epsrgate = 11.7;
        if (!model->BSIM4easubGiven)
            model->BSIM4easub = 4.05;
        if (!model->BSIM4epsrsubGiven)
            model->BSIM4epsrsub = 11.7;
        if (!model->BSIM4ni0subGiven)
            model->BSIM4ni0sub = 1.45e10;   /* unit 1/cm3 */
        if (!model->BSIM4bg0subGiven)
            model->BSIM4bg0sub =  1.16;     /* unit eV */
        if (!model->BSIM4tbgasubGiven)
            model->BSIM4tbgasub = 7.02e-4;
        if (!model->BSIM4tbgbsubGiven)
            model->BSIM4tbgbsub = 1108.0;
        if (!model->BSIM4ndepGiven)
            model->BSIM4ndep = 1.7e17;   /* unit 1/cm3 */
        if (!model->BSIM4nsdGiven)
            model->BSIM4nsd = 1.0e20;   /* unit 1/cm3 */
        if (!model->BSIM4phinGiven)
            model->BSIM4phin = 0.0; /* unit V */
        if (!model->BSIM4ngateGiven)
            model->BSIM4ngate = 0;   /* unit 1/cm3 */
        if (!model->BSIM4vbmGiven)
            model->BSIM4vbm = -3.0;
        if (!model->BSIM4xtGiven)
            model->BSIM4xt = 1.55e-7;
        if (!model->BSIM4kt1Given)
            model->BSIM4kt1 = -0.11;      /* unit V */
        if (!model->BSIM4kt1lGiven)
            model->BSIM4kt1l = 0.0;      /* unit V*m */
        if (!model->BSIM4kt2Given)
            model->BSIM4kt2 = 0.022;      /* No unit */
        if (!model->BSIM4k3Given)
            model->BSIM4k3 = 80.0;
        if (!model->BSIM4k3bGiven)
            model->BSIM4k3b = 0.0;
        if (!model->BSIM4w0Given)
            model->BSIM4w0 = 2.5e-6;
        if (!model->BSIM4lpe0Given)
            model->BSIM4lpe0 = 1.74e-7;
        if (!model->BSIM4lpebGiven)
            model->BSIM4lpeb = 0.0;
        if (!model->BSIM4dvtp0Given)
            model->BSIM4dvtp0 = 0.0;
        if (!model->BSIM4dvtp1Given)
            model->BSIM4dvtp1 = 0.0;
        if (!model->BSIM4dvtp2Given)    /* New DIBL/Rout */
            model->BSIM4dvtp2 = 0.0;
        if (!model->BSIM4dvtp3Given)
            model->BSIM4dvtp3 = 0.0;
        if (!model->BSIM4dvtp4Given)
            model->BSIM4dvtp4 = 0.0;
        if (!model->BSIM4dvtp5Given)
            model->BSIM4dvtp5 = 0.0;
        if (!model->BSIM4dvt0Given)
            model->BSIM4dvt0 = 2.2;
        if (!model->BSIM4dvt1Given)
            model->BSIM4dvt1 = 0.53;
        if (!model->BSIM4dvt2Given)
            model->BSIM4dvt2 = -0.032;   /* unit 1 / V */

        if (!model->BSIM4dvt0wGiven)
            model->BSIM4dvt0w = 0.0;
        if (!model->BSIM4dvt1wGiven)
            model->BSIM4dvt1w = 5.3e6;
        if (!model->BSIM4dvt2wGiven)
            model->BSIM4dvt2w = -0.032;

        if (!model->BSIM4droutGiven)
            model->BSIM4drout = 0.56;
        if (!model->BSIM4dsubGiven)
            model->BSIM4dsub = model->BSIM4drout;
        if (!model->BSIM4vth0Given)
            model->BSIM4vth0 = (model->BSIM4type == NMOS) ? 0.7 : -0.7;
        if (!model->BSIM4vfbGiven)
            model->BSIM4vfb = -1.0;
        if (!model->BSIM4euGiven)
            model->BSIM4eu = (model->BSIM4type == NMOS) ? 1.67 : 1.0;
        if (!model->BSIM4ucsGiven)
            model->BSIM4ucs = (model->BSIM4type == NMOS) ? 1.67 : 1.0;

        if (model->BSIM4v48intVersion<=BSIM4v48V480)
        {
                if (!model->BSIM4uaGiven)
                model->BSIM4ua = ((model->BSIM4mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */
                if (!model->BSIM4ucGiven)
                model->BSIM4uc = (model->BSIM4mobMod == 1) ? -0.0465 : -0.0465e-9;
                if (!model->BSIM4uc1Given)
                model->BSIM4uc1 = (model->BSIM4mobMod == 1) ? -0.056 : -0.056e-9;
        }
        else
        {
                if (!model->BSIM4uaGiven)
                model->BSIM4ua = ((model->BSIM4mobMod == 2 || model->BSIM4mobMod == 6)) ? 1.0e-15 : 1.0e-9; /* unit m/V */
                if (!model->BSIM4ucGiven)
                model->BSIM4uc = (model->BSIM4mobMod == 1 || model->BSIM4mobMod == 5) ? -0.0465 : -0.0465e-9;
                if (!model->BSIM4uc1Given)
                model->BSIM4uc1 = (model->BSIM4mobMod == 1 || model->BSIM4mobMod == 5) ? -0.056 : -0.056e-9;
        }

        if (!model->BSIM4ua1Given)
            model->BSIM4ua1 = 1.0e-9;      /* unit m/V */
        if (!model->BSIM4ubGiven)
            model->BSIM4ub = 1.0e-19;     /* unit (m/V)**2 */
        if (!model->BSIM4ub1Given)
            model->BSIM4ub1 = -1.0e-18;     /* unit (m/V)**2 */
        if (!model->BSIM4udGiven)
            model->BSIM4ud = 0.0;     /* unit m**(-2) */
        if (!model->BSIM4ud1Given)
            model->BSIM4ud1 = 0.0;
        if (!model->BSIM4upGiven)
            model->BSIM4up = 0.0;
        if (!model->BSIM4lpGiven)
            model->BSIM4lp = 1.0e-8;
        if (!model->BSIM4u0Given)
            model->BSIM4u0 = (model->BSIM4type == NMOS) ? 0.067 : 0.025;
        if (!model->BSIM4uteGiven)
            model->BSIM4ute = -1.5;
        if (!model->BSIM4ucsteGiven)
            model->BSIM4ucste = -4.775e-3;
        if (!model->BSIM4voffGiven)
            model->BSIM4voff = -0.08;
        if (!model->BSIM4vofflGiven)
            model->BSIM4voffl = 0.0;
        if (!model->BSIM4voffcvlGiven)
            model->BSIM4voffcvl = 0.0;
        if (!model->BSIM4minvGiven)
            model->BSIM4minv = 0.0;
        if (!model->BSIM4minvcvGiven)
            model->BSIM4minvcv = 0.0;
        if (!model->BSIM4fproutGiven)
            model->BSIM4fprout = 0.0;
        if (!model->BSIM4pditsGiven)
            model->BSIM4pdits = 0.0;
        if (!model->BSIM4pditsdGiven)
            model->BSIM4pditsd = 0.0;
        if (!model->BSIM4pditslGiven)
            model->BSIM4pditsl = 0.0;
        if (!model->BSIM4deltaGiven)
           model->BSIM4delta = 0.01;
        if (!model->BSIM4rdswminGiven)
            model->BSIM4rdswmin = 0.0;
        if (!model->BSIM4rdwminGiven)
            model->BSIM4rdwmin = 0.0;
        if (!model->BSIM4rswminGiven)
            model->BSIM4rswmin = 0.0;
        if (!model->BSIM4rdswGiven)
            model->BSIM4rdsw = 200.0; /* in ohm*um */
        if (!model->BSIM4rdwGiven)
            model->BSIM4rdw = 100.0;
        if (!model->BSIM4rswGiven)
            model->BSIM4rsw = 100.0;
        if (!model->BSIM4prwgGiven)
            model->BSIM4prwg = 1.0; /* in 1/V */
        if (!model->BSIM4prwbGiven)
            model->BSIM4prwb = 0.0;
        if (!model->BSIM4prtGiven)
            model->BSIM4prt = 0.0;
        if (!model->BSIM4eta0Given)
            model->BSIM4eta0 = 0.08;      /* no unit  */
        if (!model->BSIM4etabGiven)
            model->BSIM4etab = -0.07;      /* unit  1/V */
        if (!model->BSIM4pclmGiven)
            model->BSIM4pclm = 1.3;      /* no unit  */
        if (!model->BSIM4pdibl1Given)
            model->BSIM4pdibl1 = 0.39;    /* no unit  */
        if (!model->BSIM4pdibl2Given)
            model->BSIM4pdibl2 = 0.0086;    /* no unit  */
        if (!model->BSIM4pdiblbGiven)
            model->BSIM4pdiblb = 0.0;    /* 1/V  */
        if (!model->BSIM4pscbe1Given)
            model->BSIM4pscbe1 = 4.24e8;
        if (!model->BSIM4pscbe2Given)
            model->BSIM4pscbe2 = 1.0e-5;
        if (!model->BSIM4pvagGiven)
            model->BSIM4pvag = 0.0;
        if (!model->BSIM4wrGiven)
            model->BSIM4wr = 1.0;
        if (!model->BSIM4dwgGiven)
            model->BSIM4dwg = 0.0;
        if (!model->BSIM4dwbGiven)
            model->BSIM4dwb = 0.0;
        if (!model->BSIM4b0Given)
            model->BSIM4b0 = 0.0;
        if (!model->BSIM4b1Given)
            model->BSIM4b1 = 0.0;
        if (!model->BSIM4alpha0Given)
            model->BSIM4alpha0 = 0.0;
        if (!model->BSIM4alpha1Given)
            model->BSIM4alpha1 = 0.0;
        if (!model->BSIM4beta0Given)
            model->BSIM4beta0 = 0.0;
        if (!model->BSIM4gidlModGiven)
            model->BSIM4gidlMod = 0;    /* v4.7 New GIDL/GISL */
        if (!model->BSIM4agidlGiven)
            model->BSIM4agidl = 0.0;
        if (!model->BSIM4bgidlGiven)
            model->BSIM4bgidl = 2.3e9; /* V/m */
        if (!model->BSIM4cgidlGiven)
            model->BSIM4cgidl = 0.5; /* V^3 */
        if (!model->BSIM4egidlGiven)
            model->BSIM4egidl = 0.8; /* V */
        if (!model->BSIM4rgidlGiven)    /* v4.7 New GIDL/GISL */
            model->BSIM4rgidl = 1.0;
        if (!model->BSIM4kgidlGiven)    /* v4.7 New GIDL/GISL */
            model->BSIM4kgidl = 0.0;
        if (!model->BSIM4fgidlGiven)    /* v4.7 New GIDL/GISL */
        /*model->BSIM4fgidl = 0.0;*/
        /* Default value of fgdil set to 1 in BSIM4.8.0*/
            model->BSIM4fgidl = 1.0;

        /*if (!model->BSIM4agislGiven)
        {
            if (model->BSIM4agidlGiven)
                model->BSIM4agisl = model->BSIM4agidl;
            else
                model->BSIM4agisl = 0.0;
        }*/

        /*Default value of agidl being 0, agisl set as follows */

        /*if (!model->BSIM4bgislGiven)
        {
            if (model->BSIM4bgidlGiven)
                model->BSIM4bgisl = model->BSIM4bgidl;
            else
                model->BSIM4bgisl = 2.3e9;
        }*/

        /*Default value of bgidl being 2.3e9, bgisl set as follows */

        /*if (!model->BSIM4cgislGiven)
        {
            if (model->BSIM4cgidlGiven)
                model->BSIM4cgisl = model->BSIM4cgidl;
            else
                model->BSIM4cgisl = 0.5;
        }*/

        /*Default value of cgidl being 0.5, cgisl set as follows */

        /*if (!model->BSIM4egislGiven)
        {
            if (model->BSIM4egidlGiven)
                model->BSIM4egisl = model->BSIM4egidl;
            else
                model->BSIM4egisl = 0.8;
        }*/

        /*Default value of agisl, bgisl, cgisl, egisl, rgisl, kgisl, and fgisl are set as follows */
        if (!model->BSIM4agislGiven)
           model->BSIM4agisl = model->BSIM4agidl;
        if (!model->BSIM4bgislGiven)
           model->BSIM4bgisl = model->BSIM4bgidl;
        if (!model->BSIM4cgislGiven)
           model->BSIM4cgisl = model->BSIM4cgidl;
        if (!model->BSIM4egislGiven)
           model->BSIM4egisl = model->BSIM4egidl;
        if (!model->BSIM4rgislGiven)    /* v4.7 New GIDL/GISL */
            model->BSIM4rgisl = model->BSIM4rgidl;
        if (!model->BSIM4kgislGiven)    /* v4.7 New GIDL/GISL */
            model->BSIM4kgisl = model->BSIM4kgidl;
        if (!model->BSIM4fgislGiven)    /* v4.7 New GIDL/GISL */
            model->BSIM4fgisl = model->BSIM4fgidl;

        if (!model->BSIM4aigcGiven)
            model->BSIM4aigc = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3;
        if (!model->BSIM4bigcGiven)
            model->BSIM4bigc = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4;
        if (!model->BSIM4cigcGiven)
            model->BSIM4cigc = (model->BSIM4type == NMOS) ? 0.075 : 0.03;
        if (model->BSIM4aigsdGiven)
        {
            model->BSIM4aigs = model->BSIM4aigd = model->BSIM4aigsd;
        }
        else
        {
            model->BSIM4aigsd = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3;
            if (!model->BSIM4aigsGiven)
                model->BSIM4aigs = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3;
            if (!model->BSIM4aigdGiven)
                model->BSIM4aigd = (model->BSIM4type == NMOS) ? 1.36e-2 : 9.80e-3;
        }
        if (model->BSIM4bigsdGiven)
        {
            model->BSIM4bigs = model->BSIM4bigd = model->BSIM4bigsd;
        }
        else
        {
            model->BSIM4bigsd = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4;
            if (!model->BSIM4bigsGiven)
                model->BSIM4bigs = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4;
            if (!model->BSIM4bigdGiven)
                model->BSIM4bigd = (model->BSIM4type == NMOS) ? 1.71e-3 : 7.59e-4;
        }
        if (model->BSIM4cigsdGiven)
        {
            model->BSIM4cigs = model->BSIM4cigd = model->BSIM4cigsd;
        }
        else
        {
             model->BSIM4cigsd = (model->BSIM4type == NMOS) ? 0.075 : 0.03;
           if (!model->BSIM4cigsGiven)
                model->BSIM4cigs = (model->BSIM4type == NMOS) ? 0.075 : 0.03;
            if (!model->BSIM4cigdGiven)
                model->BSIM4cigd = (model->BSIM4type == NMOS) ? 0.075 : 0.03;
        }
        if (!model->BSIM4aigbaccGiven)
            model->BSIM4aigbacc = 1.36e-2;
        if (!model->BSIM4bigbaccGiven)
            model->BSIM4bigbacc = 1.71e-3;
        if (!model->BSIM4cigbaccGiven)
            model->BSIM4cigbacc = 0.075;
        if (!model->BSIM4aigbinvGiven)
            model->BSIM4aigbinv = 1.11e-2;
        if (!model->BSIM4bigbinvGiven)
            model->BSIM4bigbinv = 9.49e-4;
        if (!model->BSIM4cigbinvGiven)
            model->BSIM4cigbinv = 0.006;
        if (!model->BSIM4nigcGiven)
            model->BSIM4nigc = 1.0;
        if (!model->BSIM4nigbinvGiven)
            model->BSIM4nigbinv = 3.0;
        if (!model->BSIM4nigbaccGiven)
            model->BSIM4nigbacc = 1.0;
        if (!model->BSIM4ntoxGiven)
            model->BSIM4ntox = 1.0;
        if (!model->BSIM4eigbinvGiven)
            model->BSIM4eigbinv = 1.1;
        if (!model->BSIM4pigcdGiven)
            model->BSIM4pigcd = 1.0;
        if (!model->BSIM4poxedgeGiven)
            model->BSIM4poxedge = 1.0;
        if (!model->BSIM4xrcrg1Given)
            model->BSIM4xrcrg1 = 12.0;
        if (!model->BSIM4xrcrg2Given)
            model->BSIM4xrcrg2 = 1.0;
        if (!model->BSIM4ijthsfwdGiven)
            model->BSIM4ijthsfwd = 0.1; /* unit A */
        if (!model->BSIM4ijthdfwdGiven)
            model->BSIM4ijthdfwd = model->BSIM4ijthsfwd;
        if (!model->BSIM4ijthsrevGiven)
            model->BSIM4ijthsrev = 0.1; /* unit A */
        if (!model->BSIM4ijthdrevGiven)
            model->BSIM4ijthdrev = model->BSIM4ijthsrev;
        if (!model->BSIM4tnoiaGiven)
            model->BSIM4tnoia = 1.5;
        if (!model->BSIM4tnoibGiven)
            model->BSIM4tnoib = 3.5;
        if (!model->BSIM4tnoicGiven)
            model->BSIM4tnoic = 0.0;
        if (!model->BSIM4rnoiaGiven)
            model->BSIM4rnoia = 0.577;
        if (!model->BSIM4rnoibGiven)
            model->BSIM4rnoib = 0.5164;
    if (!model->BSIM4gidlclampGiven)
            model->BSIM4gidlclamp = -1e-5;
    if (!model->BSIM4idovvdscGiven)
            model->BSIM4idovvdsc = 1e-9;
        if (!model->BSIM4rnoicGiven)
            model->BSIM4rnoic = 0.395;
        if (!model->BSIM4ntnoiGiven)
            model->BSIM4ntnoi = 1.0;
        if (!model->BSIM4lambdaGiven)
            model->BSIM4lambda = 0.0;
        if (!model->BSIM4vtlGiven)
            model->BSIM4vtl = 2.0e5;    /* unit m/s */
        if (!model->BSIM4xnGiven)
            model->BSIM4xn = 3.0;
        if (!model->BSIM4lcGiven)
            model->BSIM4lc = 5.0e-9;
        if (!model->BSIM4vfbsdoffGiven)
            model->BSIM4vfbsdoff = 0.0;  /* unit v */
        if (!model->BSIM4tvfbsdoffGiven)
            model->BSIM4tvfbsdoff = 0.0;
        if (!model->BSIM4tvoffGiven)
            model->BSIM4tvoff = 0.0;
        if (!model->BSIM4tnfactorGiven)     /* v4.7 temp dep of leakage current  */
            model->BSIM4tnfactor = 0.0;
        if (!model->BSIM4teta0Given)        /* v4.7 temp dep of leakage current  */
            model->BSIM4teta0 = 0.0;
        if (!model->BSIM4tvoffcvGiven)      /* v4.7 temp dep of leakage current  */
            model->BSIM4tvoffcv = 0.0;

        if (!model->BSIM4lintnoiGiven)
            model->BSIM4lintnoi = 0.0;  /* unit m */

        if (!model->BSIM4xjbvsGiven)
            model->BSIM4xjbvs = 1.0; /* no unit */
        if (!model->BSIM4xjbvdGiven)
            model->BSIM4xjbvd = model->BSIM4xjbvs;
        if (!model->BSIM4bvsGiven)
            model->BSIM4bvs = 10.0; /* V */
        if (!model->BSIM4bvdGiven)
            model->BSIM4bvd = model->BSIM4bvs;

        if (!model->BSIM4gbminGiven)
            model->BSIM4gbmin = 1.0e-12; /* in mho */
        if (!model->BSIM4rbdbGiven)
            model->BSIM4rbdb = 50.0; /* in ohm */
        if (!model->BSIM4rbpbGiven)
            model->BSIM4rbpb = 50.0;
        if (!model->BSIM4rbsbGiven)
            model->BSIM4rbsb = 50.0;
        if (!model->BSIM4rbpsGiven)
            model->BSIM4rbps = 50.0;
        if (!model->BSIM4rbpdGiven)
            model->BSIM4rbpd = 50.0;

        if (!model->BSIM4rbps0Given)
            model->BSIM4rbps0 = 50.0;
        if (!model->BSIM4rbpslGiven)
            model->BSIM4rbpsl = 0.0;
        if (!model->BSIM4rbpswGiven)
            model->BSIM4rbpsw = 0.0;
        if (!model->BSIM4rbpsnfGiven)
            model->BSIM4rbpsnf = 0.0;

        if (!model->BSIM4rbpd0Given)
            model->BSIM4rbpd0 = 50.0;
        if (!model->BSIM4rbpdlGiven)
            model->BSIM4rbpdl = 0.0;
        if (!model->BSIM4rbpdwGiven)
            model->BSIM4rbpdw = 0.0;
        if (!model->BSIM4rbpdnfGiven)
            model->BSIM4rbpdnf = 0.0;

        if (!model->BSIM4rbpbx0Given)
            model->BSIM4rbpbx0 = 100.0;
        if (!model->BSIM4rbpbxlGiven)
            model->BSIM4rbpbxl = 0.0;
        if (!model->BSIM4rbpbxwGiven)
            model->BSIM4rbpbxw = 0.0;
        if (!model->BSIM4rbpbxnfGiven)
            model->BSIM4rbpbxnf = 0.0;
        if (!model->BSIM4rbpby0Given)
            model->BSIM4rbpby0 = 100.0;
        if (!model->BSIM4rbpbylGiven)
            model->BSIM4rbpbyl = 0.0;
        if (!model->BSIM4rbpbywGiven)
            model->BSIM4rbpbyw = 0.0;
        if (!model->BSIM4rbpbynfGiven)
            model->BSIM4rbpbynf = 0.0;


        if (!model->BSIM4rbsbx0Given)
            model->BSIM4rbsbx0 = 100.0;
        if (!model->BSIM4rbsby0Given)
            model->BSIM4rbsby0 = 100.0;
        if (!model->BSIM4rbdbx0Given)
            model->BSIM4rbdbx0 = 100.0;
        if (!model->BSIM4rbdby0Given)
            model->BSIM4rbdby0 = 100.0;


        if (!model->BSIM4rbsdbxlGiven)
            model->BSIM4rbsdbxl = 0.0;
        if (!model->BSIM4rbsdbxwGiven)
            model->BSIM4rbsdbxw = 0.0;
        if (!model->BSIM4rbsdbxnfGiven)
            model->BSIM4rbsdbxnf = 0.0;
        if (!model->BSIM4rbsdbylGiven)
            model->BSIM4rbsdbyl = 0.0;
        if (!model->BSIM4rbsdbywGiven)
            model->BSIM4rbsdbyw = 0.0;
        if (!model->BSIM4rbsdbynfGiven)
            model->BSIM4rbsdbynf = 0.0;

        if (!model->BSIM4cgslGiven)
            model->BSIM4cgsl = 0.0;
        if (!model->BSIM4cgdlGiven)
            model->BSIM4cgdl = 0.0;
        if (!model->BSIM4ckappasGiven)
            model->BSIM4ckappas = 0.6;
        if (!model->BSIM4ckappadGiven)
            model->BSIM4ckappad = model->BSIM4ckappas;
        if (!model->BSIM4clcGiven)
            model->BSIM4clc = 0.1e-6;
        if (!model->BSIM4cleGiven)
            model->BSIM4cle = 0.6;
        if (!model->BSIM4vfbcvGiven)
            model->BSIM4vfbcv = -1.0;
        if (!model->BSIM4acdeGiven)
            model->BSIM4acde = 1.0;
        if (!model->BSIM4moinGiven)
            model->BSIM4moin = 15.0;
        if (!model->BSIM4noffGiven)
            model->BSIM4noff = 1.0;
        if (!model->BSIM4voffcvGiven)
            model->BSIM4voffcv = 0.0;
        if (!model->BSIM4dmcgGiven)
            model->BSIM4dmcg = 0.0;
        if (!model->BSIM4dmciGiven)
            model->BSIM4dmci = model->BSIM4dmcg;
        if (!model->BSIM4dmdgGiven)
            model->BSIM4dmdg = 0.0;
        if (!model->BSIM4dmcgtGiven)
            model->BSIM4dmcgt = 0.0;
        if (!model->BSIM4xgwGiven)
            model->BSIM4xgw = 0.0;
        if (!model->BSIM4xglGiven)
            model->BSIM4xgl = 0.0;
        if (!model->BSIM4rshgGiven)
            model->BSIM4rshg = 0.1;
        if (!model->BSIM4ngconGiven)
            model->BSIM4ngcon = 1.0;
        if (!model->BSIM4tcjGiven)
            model->BSIM4tcj = 0.0;
        if (!model->BSIM4tpbGiven)
            model->BSIM4tpb = 0.0;
        if (!model->BSIM4tcjswGiven)
            model->BSIM4tcjsw = 0.0;
        if (!model->BSIM4tpbswGiven)
            model->BSIM4tpbsw = 0.0;
        if (!model->BSIM4tcjswgGiven)
            model->BSIM4tcjswg = 0.0;
        if (!model->BSIM4tpbswgGiven)
            model->BSIM4tpbswg = 0.0;

    /* Length dependence */
        if (!model->BSIM4lcdscGiven)
            model->BSIM4lcdsc = 0.0;
        if (!model->BSIM4lcdscbGiven)
            model->BSIM4lcdscb = 0.0;
        if (!model->BSIM4lcdscdGiven)
            model->BSIM4lcdscd = 0.0;
        if (!model->BSIM4lcitGiven)
            model->BSIM4lcit = 0.0;
        if (!model->BSIM4lnfactorGiven)
            model->BSIM4lnfactor = 0.0;
        if (!model->BSIM4lxjGiven)
            model->BSIM4lxj = 0.0;
        if (!model->BSIM4lvsatGiven)
            model->BSIM4lvsat = 0.0;
        if (!model->BSIM4latGiven)
            model->BSIM4lat = 0.0;
        if (!model->BSIM4la0Given)
            model->BSIM4la0 = 0.0;
        if (!model->BSIM4lagsGiven)
            model->BSIM4lags = 0.0;
        if (!model->BSIM4la1Given)
            model->BSIM4la1 = 0.0;
        if (!model->BSIM4la2Given)
            model->BSIM4la2 = 0.0;
        if (!model->BSIM4lketaGiven)
            model->BSIM4lketa = 0.0;
        if (!model->BSIM4lketacGiven)
            model->BSIM4lketac = model->BSIM4lketa;
        if (!model->BSIM4lnsubGiven)
            model->BSIM4lnsub = 0.0;
        if (!model->BSIM4lndepGiven)
            model->BSIM4lndep = 0.0;
        if (!model->BSIM4lnsdGiven)
            model->BSIM4lnsd = 0.0;
        if (!model->BSIM4lphinGiven)
            model->BSIM4lphin = 0.0;
        if (!model->BSIM4lngateGiven)
            model->BSIM4lngate = 0.0;
        if (!model->BSIM4lvbmGiven)
        model->BSIM4lvbm = 0.0;
        if (!model->BSIM4lxtGiven)
        model->BSIM4lxt = 0.0;
        if (!model->BSIM4lk1Given)
            model->BSIM4lk1 = 0.0;
        if (!model->BSIM4lkt1Given)
            model->BSIM4lkt1 = 0.0;
        if (!model->BSIM4lkt1lGiven)
            model->BSIM4lkt1l = 0.0;
        if (!model->BSIM4lkt2Given)
            model->BSIM4lkt2 = 0.0;
        if (!model->BSIM4lk2Given)
            model->BSIM4lk2 = 0.0;
        if (!model->BSIM4lk3Given)
            model->BSIM4lk3 = 0.0;
        if (!model->BSIM4lk3bGiven)
            model->BSIM4lk3b = 0.0;
        if (!model->BSIM4lw0Given)
            model->BSIM4lw0 = 0.0;
        if (!model->BSIM4llpe0Given)
            model->BSIM4llpe0 = 0.0;
        if (!model->BSIM4llpebGiven)
            model->BSIM4llpeb = 0.0;
        if (!model->BSIM4ldvtp0Given)
            model->BSIM4ldvtp0 = 0.0;
        if (!model->BSIM4ldvtp1Given)
            model->BSIM4ldvtp1 = 0.0;
        if (!model->BSIM4ldvtp2Given)   /* New DIBL/Rout */
            model->BSIM4ldvtp2 = 0.0;
        if (!model->BSIM4ldvtp3Given)
            model->BSIM4ldvtp3 = 0.0;
        if (!model->BSIM4ldvtp4Given)
            model->BSIM4ldvtp4 = 0.0;
        if (!model->BSIM4ldvtp5Given)
            model->BSIM4ldvtp5 = 0.0;
        if (!model->BSIM4ldvt0Given)
            model->BSIM4ldvt0 = 0.0;
        if (!model->BSIM4ldvt1Given)
            model->BSIM4ldvt1 = 0.0;
        if (!model->BSIM4ldvt2Given)
            model->BSIM4ldvt2 = 0.0;
        if (!model->BSIM4ldvt0wGiven)
            model->BSIM4ldvt0w = 0.0;
        if (!model->BSIM4ldvt1wGiven)
            model->BSIM4ldvt1w = 0.0;
        if (!model->BSIM4ldvt2wGiven)
            model->BSIM4ldvt2w = 0.0;
        if (!model->BSIM4ldroutGiven)
            model->BSIM4ldrout = 0.0;
        if (!model->BSIM4ldsubGiven)
            model->BSIM4ldsub = 0.0;
        if (!model->BSIM4lvth0Given)
           model->BSIM4lvth0 = 0.0;
        if (!model->BSIM4luaGiven)
            model->BSIM4lua = 0.0;
        if (!model->BSIM4lua1Given)
            model->BSIM4lua1 = 0.0;
        if (!model->BSIM4lubGiven)
            model->BSIM4lub = 0.0;
        if (!model->BSIM4lub1Given)
            model->BSIM4lub1 = 0.0;
        if (!model->BSIM4lucGiven)
            model->BSIM4luc = 0.0;
        if (!model->BSIM4luc1Given)
            model->BSIM4luc1 = 0.0;
        if (!model->BSIM4ludGiven)
            model->BSIM4lud = 0.0;
        if (!model->BSIM4lud1Given)
            model->BSIM4lud1 = 0.0;
        if (!model->BSIM4lupGiven)
            model->BSIM4lup = 0.0;
        if (!model->BSIM4llpGiven)
            model->BSIM4llp = 0.0;
        if (!model->BSIM4lu0Given)
            model->BSIM4lu0 = 0.0;
        if (!model->BSIM4luteGiven)
            model->BSIM4lute = 0.0;
        if (!model->BSIM4lucsteGiven)
            model->BSIM4lucste = 0.0;
        if (!model->BSIM4lvoffGiven)
            model->BSIM4lvoff = 0.0;
        if (!model->BSIM4lminvGiven)
            model->BSIM4lminv = 0.0;
        if (!model->BSIM4lminvcvGiven)
            model->BSIM4lminvcv = 0.0;
        if (!model->BSIM4lfproutGiven)
            model->BSIM4lfprout = 0.0;
        if (!model->BSIM4lpditsGiven)
            model->BSIM4lpdits = 0.0;
        if (!model->BSIM4lpditsdGiven)
            model->BSIM4lpditsd = 0.0;
        if (!model->BSIM4ldeltaGiven)
            model->BSIM4ldelta = 0.0;
        if (!model->BSIM4lrdswGiven)
            model->BSIM4lrdsw = 0.0;
        if (!model->BSIM4lrdwGiven)
            model->BSIM4lrdw = 0.0;
        if (!model->BSIM4lrswGiven)
            model->BSIM4lrsw = 0.0;
        if (!model->BSIM4lprwbGiven)
            model->BSIM4lprwb = 0.0;
        if (!model->BSIM4lprwgGiven)
            model->BSIM4lprwg = 0.0;
        if (!model->BSIM4lprtGiven)
            model->BSIM4lprt = 0.0;
        if (!model->BSIM4leta0Given)
            model->BSIM4leta0 = 0.0;
        if (!model->BSIM4letabGiven)
            model->BSIM4letab = -0.0;
        if (!model->BSIM4lpclmGiven)
            model->BSIM4lpclm = 0.0;
        if (!model->BSIM4lpdibl1Given)
            model->BSIM4lpdibl1 = 0.0;
        if (!model->BSIM4lpdibl2Given)
            model->BSIM4lpdibl2 = 0.0;
        if (!model->BSIM4lpdiblbGiven)
            model->BSIM4lpdiblb = 0.0;
        if (!model->BSIM4lpscbe1Given)
            model->BSIM4lpscbe1 = 0.0;
        if (!model->BSIM4lpscbe2Given)
            model->BSIM4lpscbe2 = 0.0;
        if (!model->BSIM4lpvagGiven)
            model->BSIM4lpvag = 0.0;
        if (!model->BSIM4lwrGiven)
            model->BSIM4lwr = 0.0;
        if (!model->BSIM4ldwgGiven)
            model->BSIM4ldwg = 0.0;
        if (!model->BSIM4ldwbGiven)
            model->BSIM4ldwb = 0.0;
        if (!model->BSIM4lb0Given)
            model->BSIM4lb0 = 0.0;
        if (!model->BSIM4lb1Given)
            model->BSIM4lb1 = 0.0;
        if (!model->BSIM4lalpha0Given)
            model->BSIM4lalpha0 = 0.0;
        if (!model->BSIM4lalpha1Given)
            model->BSIM4lalpha1 = 0.0;
        if (!model->BSIM4lbeta0Given)
            model->BSIM4lbeta0 = 0.0;
        if (!model->BSIM4lagidlGiven)
            model->BSIM4lagidl = 0.0;
        if (!model->BSIM4lbgidlGiven)
            model->BSIM4lbgidl = 0.0;
        if (!model->BSIM4lcgidlGiven)
            model->BSIM4lcgidl = 0.0;
        if (!model->BSIM4legidlGiven)
            model->BSIM4legidl = 0.0;
        if (!model->BSIM4lrgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4lrgidl = 0.0;
        if (!model->BSIM4lkgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4lkgidl = 0.0;
        if (!model->BSIM4lfgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4lfgidl = 0.0;
        /*if (!model->BSIM4lagislGiven)
        {
            if (model->BSIM4lagidlGiven)
                model->BSIM4lagisl = model->BSIM4lagidl;
            else
                model->BSIM4lagisl = 0.0;
        }
        if (!model->BSIM4lbgislGiven)
        {
            if (model->BSIM4lbgidlGiven)
                model->BSIM4lbgisl = model->BSIM4lbgidl;
            else
                model->BSIM4lbgisl = 0.0;
        }
        if (!model->BSIM4lcgislGiven)
        {
            if (model->BSIM4lcgidlGiven)
                model->BSIM4lcgisl = model->BSIM4lcgidl;
            else
                model->BSIM4lcgisl = 0.0;
        }
        if (!model->BSIM4legislGiven)
        {
            if (model->BSIM4legidlGiven)
                model->BSIM4legisl = model->BSIM4legidl;
            else
                model->BSIM4legisl = 0.0;
        }*/
        /*if (!model->BSIM4lrgislGiven)
        {
            if (model->BSIM4lrgidlGiven)
                model->BSIM4lrgisl = model->BSIM4lrgidl;
        }
        if (!model->BSIM4lkgislGiven)
        {
            if (model->BSIM4lkgidlGiven)
                model->BSIM4lkgisl = model->BSIM4lkgidl;
        }
        if (!model->BSIM4lfgislGiven)
        {
            if (model->BSIM4lfgidlGiven)
                model->BSIM4lfgisl = model->BSIM4lfgidl;
        }*/

        /*Default value of lagisl, lbgisl, lcgisl, legisl, lrgisl, lkgisl, and lfgisl are set as follows */
        if (!model->BSIM4lagislGiven)
           model->BSIM4lagisl = model->BSIM4lagidl;
        if (!model->BSIM4lbgislGiven)
           model->BSIM4lbgisl = model->BSIM4lbgidl;
        if (!model->BSIM4lcgislGiven)
           model->BSIM4lcgisl = model->BSIM4lcgidl;
        if (!model->BSIM4legislGiven)
           model->BSIM4legisl = model->BSIM4legidl;
        if (!model->BSIM4lrgislGiven)   /* v4.7 New GIDL/GISL */
           model->BSIM4lrgisl = model->BSIM4lrgidl;
        if (!model->BSIM4lkgislGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4lkgisl = model->BSIM4lkgidl;
        if (!model->BSIM4lfgislGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4lfgisl = model->BSIM4lfgidl;

        if (!model->BSIM4laigcGiven)
            model->BSIM4laigc = 0.0;
        if (!model->BSIM4lbigcGiven)
            model->BSIM4lbigc = 0.0;
        if (!model->BSIM4lcigcGiven)
            model->BSIM4lcigc = 0.0;
        if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven))
        {
            if (!model->BSIM4laigsGiven)
                model->BSIM4laigs = 0.0;
            if (!model->BSIM4laigdGiven)
                model->BSIM4laigd = 0.0;
        }
        else
        {
            if (!model->BSIM4laigsdGiven)
                model->BSIM4laigsd = 0.0;
            model->BSIM4laigs = model->BSIM4laigd = model->BSIM4laigsd;
        }
        if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven))
        {
            if (!model->BSIM4lbigsGiven)
                model->BSIM4lbigs = 0.0;
            if (!model->BSIM4lbigdGiven)
                model->BSIM4lbigd = 0.0;
        }
        else
        {
            if (!model->BSIM4lbigsdGiven)
                model->BSIM4lbigsd = 0.0;
            model->BSIM4lbigs = model->BSIM4lbigd = model->BSIM4lbigsd;
        }
        if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven))
        {
            if (!model->BSIM4lcigsGiven)
                model->BSIM4lcigs = 0.0;
            if (!model->BSIM4lcigdGiven)
                model->BSIM4lcigd = 0.0;
        }
        else
        {
            if (!model->BSIM4lcigsdGiven)
                model->BSIM4lcigsd = 0.0;
            model->BSIM4lcigs = model->BSIM4lcigd = model->BSIM4lcigsd;
        }
        if (!model->BSIM4laigbaccGiven)
            model->BSIM4laigbacc = 0.0;
        if (!model->BSIM4lbigbaccGiven)
            model->BSIM4lbigbacc = 0.0;
        if (!model->BSIM4lcigbaccGiven)
            model->BSIM4lcigbacc = 0.0;
        if (!model->BSIM4laigbinvGiven)
            model->BSIM4laigbinv = 0.0;
        if (!model->BSIM4lbigbinvGiven)
            model->BSIM4lbigbinv = 0.0;
        if (!model->BSIM4lcigbinvGiven)
            model->BSIM4lcigbinv = 0.0;
        if (!model->BSIM4lnigcGiven)
            model->BSIM4lnigc = 0.0;
        if (!model->BSIM4lnigbinvGiven)
            model->BSIM4lnigbinv = 0.0;
        if (!model->BSIM4lnigbaccGiven)
            model->BSIM4lnigbacc = 0.0;
        if (!model->BSIM4lntoxGiven)
            model->BSIM4lntox = 0.0;
        if (!model->BSIM4leigbinvGiven)
            model->BSIM4leigbinv = 0.0;
        if (!model->BSIM4lpigcdGiven)
            model->BSIM4lpigcd = 0.0;
        if (!model->BSIM4lpoxedgeGiven)
            model->BSIM4lpoxedge = 0.0;
        if (!model->BSIM4lxrcrg1Given)
            model->BSIM4lxrcrg1 = 0.0;
        if (!model->BSIM4lxrcrg2Given)
            model->BSIM4lxrcrg2 = 0.0;
        if (!model->BSIM4leuGiven)
            model->BSIM4leu = 0.0;
        if (!model->BSIM4lucsGiven)
            model->BSIM4lucs = 0.0;
        if (!model->BSIM4lvfbGiven)
            model->BSIM4lvfb = 0.0;
        if (!model->BSIM4llambdaGiven)
            model->BSIM4llambda = 0.0;
        if (!model->BSIM4lvtlGiven)
            model->BSIM4lvtl = 0.0;
        if (!model->BSIM4lxnGiven)
            model->BSIM4lxn = 0.0;
        if (!model->BSIM4lvfbsdoffGiven)
            model->BSIM4lvfbsdoff = 0.0;
        if (!model->BSIM4ltvfbsdoffGiven)
            model->BSIM4ltvfbsdoff = 0.0;
        if (!model->BSIM4ltvoffGiven)
            model->BSIM4ltvoff = 0.0;
        if (!model->BSIM4ltnfactorGiven)    /* v4.7 temp dep of leakage current  */
            model->BSIM4ltnfactor = 0.0;
        if (!model->BSIM4lteta0Given)       /* v4.7 temp dep of leakage current  */
            model->BSIM4lteta0 = 0.0;
        if (!model->BSIM4ltvoffcvGiven)     /* v4.7 temp dep of leakage current  */
            model->BSIM4ltvoffcv = 0.0;


        if (!model->BSIM4lcgslGiven)
            model->BSIM4lcgsl = 0.0;
        if (!model->BSIM4lcgdlGiven)
            model->BSIM4lcgdl = 0.0;
        if (!model->BSIM4lckappasGiven)
            model->BSIM4lckappas = 0.0;
        if (!model->BSIM4lckappadGiven)
            model->BSIM4lckappad = 0.0;
        if (!model->BSIM4lclcGiven)
            model->BSIM4lclc = 0.0;
        if (!model->BSIM4lcleGiven)
            model->BSIM4lcle = 0.0;
        if (!model->BSIM4lcfGiven)
            model->BSIM4lcf = 0.0;
        if (!model->BSIM4lvfbcvGiven)
            model->BSIM4lvfbcv = 0.0;
        if (!model->BSIM4lacdeGiven)
            model->BSIM4lacde = 0.0;
        if (!model->BSIM4lmoinGiven)
            model->BSIM4lmoin = 0.0;
        if (!model->BSIM4lnoffGiven)
            model->BSIM4lnoff = 0.0;
        if (!model->BSIM4lvoffcvGiven)
            model->BSIM4lvoffcv = 0.0;

    /* Width dependence */
        if (!model->BSIM4wcdscGiven)
            model->BSIM4wcdsc = 0.0;
        if (!model->BSIM4wcdscbGiven)
            model->BSIM4wcdscb = 0.0;
        if (!model->BSIM4wcdscdGiven)
            model->BSIM4wcdscd = 0.0;
        if (!model->BSIM4wcitGiven)
            model->BSIM4wcit = 0.0;
        if (!model->BSIM4wnfactorGiven)
            model->BSIM4wnfactor = 0.0;
        if (!model->BSIM4wxjGiven)
            model->BSIM4wxj = 0.0;
        if (!model->BSIM4wvsatGiven)
            model->BSIM4wvsat = 0.0;
        if (!model->BSIM4watGiven)
            model->BSIM4wat = 0.0;
        if (!model->BSIM4wa0Given)
            model->BSIM4wa0 = 0.0;
        if (!model->BSIM4wagsGiven)
            model->BSIM4wags = 0.0;
        if (!model->BSIM4wa1Given)
            model->BSIM4wa1 = 0.0;
        if (!model->BSIM4wa2Given)
            model->BSIM4wa2 = 0.0;
        if (!model->BSIM4wketaGiven)
            model->BSIM4wketa = 0.0;
        if (!model->BSIM4wketacGiven)
            model->BSIM4wketac = model->BSIM4wketa;
        if (!model->BSIM4wnsubGiven)
            model->BSIM4wnsub = 0.0;
        if (!model->BSIM4wndepGiven)
            model->BSIM4wndep = 0.0;
        if (!model->BSIM4wnsdGiven)
            model->BSIM4wnsd = 0.0;
        if (!model->BSIM4wphinGiven)
            model->BSIM4wphin = 0.0;
        if (!model->BSIM4wngateGiven)
            model->BSIM4wngate = 0.0;
        if (!model->BSIM4wvbmGiven)
            model->BSIM4wvbm = 0.0;
        if (!model->BSIM4wxtGiven)
            model->BSIM4wxt = 0.0;
        if (!model->BSIM4wk1Given)
            model->BSIM4wk1 = 0.0;
        if (!model->BSIM4wkt1Given)
            model->BSIM4wkt1 = 0.0;
        if (!model->BSIM4wkt1lGiven)
            model->BSIM4wkt1l = 0.0;
        if (!model->BSIM4wkt2Given)
            model->BSIM4wkt2 = 0.0;
        if (!model->BSIM4wk2Given)
            model->BSIM4wk2 = 0.0;
        if (!model->BSIM4wk3Given)
            model->BSIM4wk3 = 0.0;
        if (!model->BSIM4wk3bGiven)
            model->BSIM4wk3b = 0.0;
        if (!model->BSIM4ww0Given)
            model->BSIM4ww0 = 0.0;
        if (!model->BSIM4wlpe0Given)
            model->BSIM4wlpe0 = 0.0;
        if (!model->BSIM4wlpebGiven)
            model->BSIM4wlpeb = 0.0;
        if (!model->BSIM4wdvtp0Given)
            model->BSIM4wdvtp0 = 0.0;
        if (!model->BSIM4wdvtp1Given)
            model->BSIM4wdvtp1 = 0.0;
        if (!model->BSIM4wdvtp2Given)   /* New DIBL/Rout */
            model->BSIM4wdvtp2 = 0.0;
        if (!model->BSIM4wdvtp3Given)
            model->BSIM4wdvtp3 = 0.0;
        if (!model->BSIM4wdvtp4Given)
            model->BSIM4wdvtp4 = 0.0;
        if (!model->BSIM4wdvtp5Given)
            model->BSIM4wdvtp5 = 0.0;
        if (!model->BSIM4wdvt0Given)
            model->BSIM4wdvt0 = 0.0;
        if (!model->BSIM4wdvt1Given)
            model->BSIM4wdvt1 = 0.0;
        if (!model->BSIM4wdvt2Given)
            model->BSIM4wdvt2 = 0.0;
        if (!model->BSIM4wdvt0wGiven)
            model->BSIM4wdvt0w = 0.0;
        if (!model->BSIM4wdvt1wGiven)
            model->BSIM4wdvt1w = 0.0;
        if (!model->BSIM4wdvt2wGiven)
            model->BSIM4wdvt2w = 0.0;
        if (!model->BSIM4wdroutGiven)
            model->BSIM4wdrout = 0.0;
        if (!model->BSIM4wdsubGiven)
            model->BSIM4wdsub = 0.0;
        if (!model->BSIM4wvth0Given)
            model->BSIM4wvth0 = 0.0;
        if (!model->BSIM4wuaGiven)
            model->BSIM4wua = 0.0;
        if (!model->BSIM4wua1Given)
            model->BSIM4wua1 = 0.0;
        if (!model->BSIM4wubGiven)
            model->BSIM4wub = 0.0;
        if (!model->BSIM4wub1Given)
            model->BSIM4wub1 = 0.0;
        if (!model->BSIM4wucGiven)
            model->BSIM4wuc = 0.0;
        if (!model->BSIM4wuc1Given)
            model->BSIM4wuc1 = 0.0;
        if (!model->BSIM4wudGiven)
            model->BSIM4wud = 0.0;
        if (!model->BSIM4wud1Given)
            model->BSIM4wud1 = 0.0;
        if (!model->BSIM4wupGiven)
            model->BSIM4wup = 0.0;
        if (!model->BSIM4wlpGiven)
            model->BSIM4wlp = 0.0;
        if (!model->BSIM4wu0Given)
            model->BSIM4wu0 = 0.0;
        if (!model->BSIM4wuteGiven)
            model->BSIM4wute = 0.0;
        if (!model->BSIM4wucsteGiven)
            model->BSIM4wucste = 0.0;
        if (!model->BSIM4wvoffGiven)
            model->BSIM4wvoff = 0.0;
        if (!model->BSIM4wminvGiven)
            model->BSIM4wminv = 0.0;
        if (!model->BSIM4wminvcvGiven)
            model->BSIM4wminvcv = 0.0;
        if (!model->BSIM4wfproutGiven)
            model->BSIM4wfprout = 0.0;
        if (!model->BSIM4wpditsGiven)
            model->BSIM4wpdits = 0.0;
        if (!model->BSIM4wpditsdGiven)
            model->BSIM4wpditsd = 0.0;
        if (!model->BSIM4wdeltaGiven)
            model->BSIM4wdelta = 0.0;
        if (!model->BSIM4wrdswGiven)
            model->BSIM4wrdsw = 0.0;
        if (!model->BSIM4wrdwGiven)
            model->BSIM4wrdw = 0.0;
        if (!model->BSIM4wrswGiven)
            model->BSIM4wrsw = 0.0;
        if (!model->BSIM4wprwbGiven)
            model->BSIM4wprwb = 0.0;
        if (!model->BSIM4wprwgGiven)
            model->BSIM4wprwg = 0.0;
        if (!model->BSIM4wprtGiven)
            model->BSIM4wprt = 0.0;
        if (!model->BSIM4weta0Given)
            model->BSIM4weta0 = 0.0;
        if (!model->BSIM4wetabGiven)
            model->BSIM4wetab = 0.0;
        if (!model->BSIM4wpclmGiven)
            model->BSIM4wpclm = 0.0;
        if (!model->BSIM4wpdibl1Given)
            model->BSIM4wpdibl1 = 0.0;
        if (!model->BSIM4wpdibl2Given)
            model->BSIM4wpdibl2 = 0.0;
        if (!model->BSIM4wpdiblbGiven)
            model->BSIM4wpdiblb = 0.0;
        if (!model->BSIM4wpscbe1Given)
            model->BSIM4wpscbe1 = 0.0;
        if (!model->BSIM4wpscbe2Given)
            model->BSIM4wpscbe2 = 0.0;
        if (!model->BSIM4wpvagGiven)
            model->BSIM4wpvag = 0.0;
        if (!model->BSIM4wwrGiven)
            model->BSIM4wwr = 0.0;
        if (!model->BSIM4wdwgGiven)
            model->BSIM4wdwg = 0.0;
        if (!model->BSIM4wdwbGiven)
            model->BSIM4wdwb = 0.0;
        if (!model->BSIM4wb0Given)
            model->BSIM4wb0 = 0.0;
        if (!model->BSIM4wb1Given)
            model->BSIM4wb1 = 0.0;
        if (!model->BSIM4walpha0Given)
            model->BSIM4walpha0 = 0.0;
        if (!model->BSIM4walpha1Given)
            model->BSIM4walpha1 = 0.0;
        if (!model->BSIM4wbeta0Given)
            model->BSIM4wbeta0 = 0.0;
        if (!model->BSIM4wagidlGiven)
            model->BSIM4wagidl = 0.0;
        if (!model->BSIM4wbgidlGiven)
            model->BSIM4wbgidl = 0.0;
        if (!model->BSIM4wcgidlGiven)
            model->BSIM4wcgidl = 0.0;
        if (!model->BSIM4wegidlGiven)
            model->BSIM4wegidl = 0.0;
        if (!model->BSIM4wrgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4wrgidl = 0.0;
        if (!model->BSIM4wkgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4wkgidl = 0.0;
        if (!model->BSIM4wfgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4wfgidl = 0.0;
        /*if (!model->BSIM4wagislGiven)
        {
            if (model->BSIM4wagidlGiven)
                model->BSIM4wagisl = model->BSIM4wagidl;
            else
                model->BSIM4wagisl = 0.0;
        }
        if (!model->BSIM4wbgislGiven)
        {
            if (model->BSIM4wbgidlGiven)
                model->BSIM4wbgisl = model->BSIM4wbgidl;
            else
                model->BSIM4wbgisl = 0.0;
        }
        if (!model->BSIM4wcgislGiven)
        {
            if (model->BSIM4wcgidlGiven)
                model->BSIM4wcgisl = model->BSIM4wcgidl;
            else
                model->BSIM4wcgisl = 0.0;
        }
        if (!model->BSIM4wegislGiven)
        {
            if (model->BSIM4wegidlGiven)
                model->BSIM4wegisl = model->BSIM4wegidl;
            else
                model->BSIM4wegisl = 0.0;
        }*/
        /*if (!model->BSIM4wrgislGiven)
        {
            if (model->BSIM4wrgidlGiven)
                model->BSIM4wrgisl = model->BSIM4wrgidl;
        }
        if (!model->BSIM4wkgislGiven)
        {
            if (model->BSIM4wkgidlGiven)
                model->BSIM4wkgisl = model->BSIM4wkgidl;
        }
        if (!model->BSIM4wfgislGiven)
        {
            if (model->BSIM4wfgidlGiven)
                model->BSIM4wfgisl = model->BSIM4wfgidl;
        }*/

        /*Default value of wagisl, wbgisl, wcgisl, wegisl, wrgisl, wkgisl, and wfgisl are set as follows */
        if (!model->BSIM4wagislGiven)
            model->BSIM4wagisl = model->BSIM4wagidl;
        if (!model->BSIM4wbgislGiven)
           model->BSIM4wbgisl = model->BSIM4wbgidl;
        if (!model->BSIM4wcgislGiven)
           model->BSIM4wcgisl = model->BSIM4wcgidl;
        if (!model->BSIM4wegislGiven)
           model->BSIM4wegisl = model->BSIM4wegidl;
        if (!model->BSIM4wrgislGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4wrgisl = model->BSIM4wrgidl;
        if (!model->BSIM4wkgislGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4wkgisl = model->BSIM4wkgidl;
        if (!model->BSIM4wfgislGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4wfgisl = model->BSIM4wfgidl;

        if (!model->BSIM4waigcGiven)
            model->BSIM4waigc = 0.0;
        if (!model->BSIM4wbigcGiven)
            model->BSIM4wbigc = 0.0;
        if (!model->BSIM4wcigcGiven)
            model->BSIM4wcigc = 0.0;
        if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven))
        {
            if (!model->BSIM4waigsGiven)
                model->BSIM4waigs = 0.0;
            if (!model->BSIM4waigdGiven)
                model->BSIM4waigd = 0.0;
        }
        else
        {
            if (!model->BSIM4waigsdGiven)
                model->BSIM4waigsd = 0.0;
            model->BSIM4waigs = model->BSIM4waigd = model->BSIM4waigsd;
        }
        if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven))
        {
            if (!model->BSIM4wbigsGiven)
                model->BSIM4wbigs = 0.0;
            if (!model->BSIM4wbigdGiven)
                model->BSIM4wbigd = 0.0;
        }
        else
        {
            if (!model->BSIM4wbigsdGiven)
                model->BSIM4wbigsd = 0.0;
            model->BSIM4wbigs = model->BSIM4wbigd = model->BSIM4wbigsd;
        }
        if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven))
        {
            if (!model->BSIM4wcigsGiven)
                model->BSIM4wcigs = 0.0;
            if (!model->BSIM4wcigdGiven)
                model->BSIM4wcigd = 0.0;
        }
        else
        {
            if (!model->BSIM4wcigsdGiven)
                model->BSIM4wcigsd = 0.0;
            model->BSIM4wcigs = model->BSIM4wcigd = model->BSIM4wcigsd;
        }
        if (!model->BSIM4waigbaccGiven)
            model->BSIM4waigbacc = 0.0;
        if (!model->BSIM4wbigbaccGiven)
            model->BSIM4wbigbacc = 0.0;
        if (!model->BSIM4wcigbaccGiven)
            model->BSIM4wcigbacc = 0.0;
        if (!model->BSIM4waigbinvGiven)
            model->BSIM4waigbinv = 0.0;
        if (!model->BSIM4wbigbinvGiven)
            model->BSIM4wbigbinv = 0.0;
        if (!model->BSIM4wcigbinvGiven)
            model->BSIM4wcigbinv = 0.0;
        if (!model->BSIM4wnigcGiven)
            model->BSIM4wnigc = 0.0;
        if (!model->BSIM4wnigbinvGiven)
            model->BSIM4wnigbinv = 0.0;
        if (!model->BSIM4wnigbaccGiven)
            model->BSIM4wnigbacc = 0.0;
        if (!model->BSIM4wntoxGiven)
            model->BSIM4wntox = 0.0;
        if (!model->BSIM4weigbinvGiven)
            model->BSIM4weigbinv = 0.0;
        if (!model->BSIM4wpigcdGiven)
            model->BSIM4wpigcd = 0.0;
        if (!model->BSIM4wpoxedgeGiven)
            model->BSIM4wpoxedge = 0.0;
        if (!model->BSIM4wxrcrg1Given)
            model->BSIM4wxrcrg1 = 0.0;
        if (!model->BSIM4wxrcrg2Given)
            model->BSIM4wxrcrg2 = 0.0;
        if (!model->BSIM4weuGiven)
            model->BSIM4weu = 0.0;
        if (!model->BSIM4wucsGiven)
            model->BSIM4wucs = 0.0;
        if (!model->BSIM4wvfbGiven)
            model->BSIM4wvfb = 0.0;
        if (!model->BSIM4wlambdaGiven)
            model->BSIM4wlambda = 0.0;
        if (!model->BSIM4wvtlGiven)
            model->BSIM4wvtl = 0.0;
        if (!model->BSIM4wxnGiven)
            model->BSIM4wxn = 0.0;
        if (!model->BSIM4wvfbsdoffGiven)
            model->BSIM4wvfbsdoff = 0.0;
        if (!model->BSIM4wtvfbsdoffGiven)
            model->BSIM4wtvfbsdoff = 0.0;
        if (!model->BSIM4wtvoffGiven)
            model->BSIM4wtvoff = 0.0;
        if (!model->BSIM4wtnfactorGiven)    /* v4.7 temp dep of leakage current  */
            model->BSIM4wtnfactor = 0.0;
        if (!model->BSIM4wteta0Given)       /* v4.7 temp dep of leakage current  */
            model->BSIM4wteta0 = 0.0;
        if (!model->BSIM4wtvoffcvGiven)     /* v4.7 temp dep of leakage current  */
            model->BSIM4wtvoffcv = 0.0;

        if (!model->BSIM4wcgslGiven)
            model->BSIM4wcgsl = 0.0;
        if (!model->BSIM4wcgdlGiven)
            model->BSIM4wcgdl = 0.0;
        if (!model->BSIM4wckappasGiven)
            model->BSIM4wckappas = 0.0;
        if (!model->BSIM4wckappadGiven)
            model->BSIM4wckappad = 0.0;
        if (!model->BSIM4wcfGiven)
            model->BSIM4wcf = 0.0;
        if (!model->BSIM4wclcGiven)
            model->BSIM4wclc = 0.0;
        if (!model->BSIM4wcleGiven)
            model->BSIM4wcle = 0.0;
        if (!model->BSIM4wvfbcvGiven)
            model->BSIM4wvfbcv = 0.0;
        if (!model->BSIM4wacdeGiven)
            model->BSIM4wacde = 0.0;
        if (!model->BSIM4wmoinGiven)
            model->BSIM4wmoin = 0.0;
        if (!model->BSIM4wnoffGiven)
            model->BSIM4wnoff = 0.0;
        if (!model->BSIM4wvoffcvGiven)
            model->BSIM4wvoffcv = 0.0;

    /* Cross-term dependence */
        if (!model->BSIM4pcdscGiven)
            model->BSIM4pcdsc = 0.0;
        if (!model->BSIM4pcdscbGiven)
            model->BSIM4pcdscb = 0.0;
        if (!model->BSIM4pcdscdGiven)
            model->BSIM4pcdscd = 0.0;
        if (!model->BSIM4pcitGiven)
            model->BSIM4pcit = 0.0;
        if (!model->BSIM4pnfactorGiven)
            model->BSIM4pnfactor = 0.0;
        if (!model->BSIM4pxjGiven)
            model->BSIM4pxj = 0.0;
        if (!model->BSIM4pvsatGiven)
            model->BSIM4pvsat = 0.0;
        if (!model->BSIM4patGiven)
            model->BSIM4pat = 0.0;
        if (!model->BSIM4pa0Given)
            model->BSIM4pa0 = 0.0;
        if (!model->BSIM4pagsGiven)
            model->BSIM4pags = 0.0;
        if (!model->BSIM4pa1Given)
            model->BSIM4pa1 = 0.0;
        if (!model->BSIM4pa2Given)
            model->BSIM4pa2 = 0.0;
        if (!model->BSIM4pketaGiven)
            model->BSIM4pketa = 0.0;
        if (!model->BSIM4pketacGiven)
            model->BSIM4pketac = model->BSIM4pketa;
        if (!model->BSIM4pnsubGiven)
            model->BSIM4pnsub = 0.0;
        if (!model->BSIM4pndepGiven)
            model->BSIM4pndep = 0.0;
        if (!model->BSIM4pnsdGiven)
            model->BSIM4pnsd = 0.0;
        if (!model->BSIM4pphinGiven)
            model->BSIM4pphin = 0.0;
        if (!model->BSIM4pngateGiven)
            model->BSIM4pngate = 0.0;
        if (!model->BSIM4pvbmGiven)
            model->BSIM4pvbm = 0.0;
        if (!model->BSIM4pxtGiven)
            model->BSIM4pxt = 0.0;
        if (!model->BSIM4pk1Given)
            model->BSIM4pk1 = 0.0;
        if (!model->BSIM4pkt1Given)
            model->BSIM4pkt1 = 0.0;
        if (!model->BSIM4pkt1lGiven)
            model->BSIM4pkt1l = 0.0;
        if (!model->BSIM4pk2Given)
            model->BSIM4pk2 = 0.0;
        if (!model->BSIM4pkt2Given)
            model->BSIM4pkt2 = 0.0;
        if (!model->BSIM4pk3Given)
            model->BSIM4pk3 = 0.0;
        if (!model->BSIM4pk3bGiven)
            model->BSIM4pk3b = 0.0;
        if (!model->BSIM4pw0Given)
            model->BSIM4pw0 = 0.0;
        if (!model->BSIM4plpe0Given)
            model->BSIM4plpe0 = 0.0;
        if (!model->BSIM4plpebGiven)
            model->BSIM4plpeb = 0.0;
        if (!model->BSIM4pdvtp0Given)
            model->BSIM4pdvtp0 = 0.0;
        if (!model->BSIM4pdvtp1Given)
            model->BSIM4pdvtp1 = 0.0;
        if (!model->BSIM4pdvtp2Given)   /* New DIBL/Rout */
            model->BSIM4pdvtp2 = 0.0;
        if (!model->BSIM4pdvtp3Given)
            model->BSIM4pdvtp3 = 0.0;
        if (!model->BSIM4pdvtp4Given)
            model->BSIM4pdvtp4 = 0.0;
        if (!model->BSIM4pdvtp5Given)
            model->BSIM4pdvtp5 = 0.0;
        if (!model->BSIM4pdvt0Given)
            model->BSIM4pdvt0 = 0.0;
        if (!model->BSIM4pdvt1Given)
            model->BSIM4pdvt1 = 0.0;
        if (!model->BSIM4pdvt2Given)
            model->BSIM4pdvt2 = 0.0;
        if (!model->BSIM4pdvt0wGiven)
            model->BSIM4pdvt0w = 0.0;
        if (!model->BSIM4pdvt1wGiven)
            model->BSIM4pdvt1w = 0.0;
        if (!model->BSIM4pdvt2wGiven)
            model->BSIM4pdvt2w = 0.0;
        if (!model->BSIM4pdroutGiven)
            model->BSIM4pdrout = 0.0;
        if (!model->BSIM4pdsubGiven)
            model->BSIM4pdsub = 0.0;
        if (!model->BSIM4pvth0Given)
           model->BSIM4pvth0 = 0.0;
        if (!model->BSIM4puaGiven)
            model->BSIM4pua = 0.0;
        if (!model->BSIM4pua1Given)
            model->BSIM4pua1 = 0.0;
        if (!model->BSIM4pubGiven)
            model->BSIM4pub = 0.0;
        if (!model->BSIM4pub1Given)
            model->BSIM4pub1 = 0.0;
        if (!model->BSIM4pucGiven)
            model->BSIM4puc = 0.0;
        if (!model->BSIM4puc1Given)
            model->BSIM4puc1 = 0.0;
        if (!model->BSIM4pudGiven)
            model->BSIM4pud = 0.0;
        if (!model->BSIM4pud1Given)
            model->BSIM4pud1 = 0.0;
        if (!model->BSIM4pupGiven)
            model->BSIM4pup = 0.0;
        if (!model->BSIM4plpGiven)
            model->BSIM4plp = 0.0;
        if (!model->BSIM4pu0Given)
            model->BSIM4pu0 = 0.0;
        if (!model->BSIM4puteGiven)
            model->BSIM4pute = 0.0;
        if (!model->BSIM4pucsteGiven)
            model->BSIM4pucste = 0.0;
        if (!model->BSIM4pvoffGiven)
            model->BSIM4pvoff = 0.0;
        if (!model->BSIM4pminvGiven)
            model->BSIM4pminv = 0.0;
        if (!model->BSIM4pminvcvGiven)
            model->BSIM4pminvcv = 0.0;
        if (!model->BSIM4pfproutGiven)
            model->BSIM4pfprout = 0.0;
        if (!model->BSIM4ppditsGiven)
            model->BSIM4ppdits = 0.0;
        if (!model->BSIM4ppditsdGiven)
            model->BSIM4ppditsd = 0.0;
        if (!model->BSIM4pdeltaGiven)
            model->BSIM4pdelta = 0.0;
        if (!model->BSIM4prdswGiven)
            model->BSIM4prdsw = 0.0;
        if (!model->BSIM4prdwGiven)
            model->BSIM4prdw = 0.0;
        if (!model->BSIM4prswGiven)
            model->BSIM4prsw = 0.0;
        if (!model->BSIM4pprwbGiven)
            model->BSIM4pprwb = 0.0;
        if (!model->BSIM4pprwgGiven)
            model->BSIM4pprwg = 0.0;
        if (!model->BSIM4pprtGiven)
            model->BSIM4pprt = 0.0;
        if (!model->BSIM4peta0Given)
            model->BSIM4peta0 = 0.0;
        if (!model->BSIM4petabGiven)
            model->BSIM4petab = 0.0;
        if (!model->BSIM4ppclmGiven)
            model->BSIM4ppclm = 0.0;
        if (!model->BSIM4ppdibl1Given)
            model->BSIM4ppdibl1 = 0.0;
        if (!model->BSIM4ppdibl2Given)
            model->BSIM4ppdibl2 = 0.0;
        if (!model->BSIM4ppdiblbGiven)
            model->BSIM4ppdiblb = 0.0;
        if (!model->BSIM4ppscbe1Given)
            model->BSIM4ppscbe1 = 0.0;
        if (!model->BSIM4ppscbe2Given)
            model->BSIM4ppscbe2 = 0.0;
        if (!model->BSIM4ppvagGiven)
            model->BSIM4ppvag = 0.0;
        if (!model->BSIM4pwrGiven)
            model->BSIM4pwr = 0.0;
        if (!model->BSIM4pdwgGiven)
            model->BSIM4pdwg = 0.0;
        if (!model->BSIM4pdwbGiven)
            model->BSIM4pdwb = 0.0;
        if (!model->BSIM4pb0Given)
            model->BSIM4pb0 = 0.0;
        if (!model->BSIM4pb1Given)
            model->BSIM4pb1 = 0.0;
        if (!model->BSIM4palpha0Given)
            model->BSIM4palpha0 = 0.0;
        if (!model->BSIM4palpha1Given)
            model->BSIM4palpha1 = 0.0;
        if (!model->BSIM4pbeta0Given)
            model->BSIM4pbeta0 = 0.0;
        if (!model->BSIM4pagidlGiven)
            model->BSIM4pagidl = 0.0;
        if (!model->BSIM4pbgidlGiven)
            model->BSIM4pbgidl = 0.0;
        if (!model->BSIM4pcgidlGiven)
            model->BSIM4pcgidl = 0.0;
        if (!model->BSIM4pegidlGiven)
            model->BSIM4pegidl = 0.0;
        if (!model->BSIM4prgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4prgidl = 0.0;
        if (!model->BSIM4pkgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4pkgidl = 0.0;
        if (!model->BSIM4pfgidlGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4pfgidl = 0.0;

        /*if (!model->BSIM4pagislGiven)
        {
            if (model->BSIM4pagidlGiven)
                model->BSIM4pagisl = model->BSIM4pagidl;
            else
                model->BSIM4pagisl = 0.0;
        }
        if (!model->BSIM4pbgislGiven)
        {
            if (model->BSIM4pbgidlGiven)
                model->BSIM4pbgisl = model->BSIM4pbgidl;
            else
                model->BSIM4pbgisl = 0.0;
        }
        if (!model->BSIM4pcgislGiven)
        {
            if (model->BSIM4pcgidlGiven)
                model->BSIM4pcgisl = model->BSIM4pcgidl;
            else
                model->BSIM4pcgisl = 0.0;
        }
        if (!model->BSIM4pegislGiven)
        {
            if (model->BSIM4pegidlGiven)
                model->BSIM4pegisl = model->BSIM4pegidl;
            else
                model->BSIM4pegisl = 0.0;
        }*/

        /*if (!model->BSIM4prgislGiven)
        {
            if (model->BSIM4prgidlGiven)
                model->BSIM4prgisl = model->BSIM4prgidl;
        }
        if (!model->BSIM4pkgislGiven)
        {
            if (model->BSIM4pkgidlGiven)
                model->BSIM4pkgisl = model->BSIM4pkgidl;
        }
        if (!model->BSIM4pfgislGiven)
        {
            if (model->BSIM4pfgidlGiven)
                model->BSIM4pfgisl = model->BSIM4pfgidl;
        }*/

        /*Default value of pagisl, pbgisl, pcgisl, pegisl, prgisl, pkgisl, and pfgisl are set as follows */
        if (!model->BSIM4pagislGiven)
            model->BSIM4pagisl = model->BSIM4pagidl;
        if (!model->BSIM4pbgislGiven)
            model->BSIM4pbgisl = model->BSIM4pbgidl;
        if (!model->BSIM4pcgislGiven)
            model->BSIM4pcgisl = model->BSIM4pcgidl;
        if (!model->BSIM4pegislGiven)
            model->BSIM4pegisl = model->BSIM4pegidl;
        if (!model->BSIM4prgislGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4prgisl = model->BSIM4prgidl;
        if (!model->BSIM4pkgislGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4pkgisl = model->BSIM4pkgidl;
        if (!model->BSIM4pfgislGiven)   /* v4.7 New GIDL/GISL */
            model->BSIM4pfgisl = model->BSIM4pfgidl;

        if (!model->BSIM4paigcGiven)
            model->BSIM4paigc = 0.0;
        if (!model->BSIM4pbigcGiven)
            model->BSIM4pbigc = 0.0;
        if (!model->BSIM4pcigcGiven)
            model->BSIM4pcigc = 0.0;
        if (!model->BSIM4aigsdGiven && (model->BSIM4aigsGiven || model->BSIM4aigdGiven))
        {
            if (!model->BSIM4paigsGiven)
                model->BSIM4paigs = 0.0;
            if (!model->BSIM4paigdGiven)
                model->BSIM4paigd = 0.0;
        }
        else
        {
            if (!model->BSIM4paigsdGiven)
                model->BSIM4paigsd = 0.0;
            model->BSIM4paigs = model->BSIM4paigd = model->BSIM4paigsd;
        }
        if (!model->BSIM4bigsdGiven && (model->BSIM4bigsGiven || model->BSIM4bigdGiven))
        {
            if (!model->BSIM4pbigsGiven)
                model->BSIM4pbigs = 0.0;
            if (!model->BSIM4pbigdGiven)
                model->BSIM4pbigd = 0.0;
        }
        else
        {
            if (!model->BSIM4pbigsdGiven)
                model->BSIM4pbigsd = 0.0;
            model->BSIM4pbigs = model->BSIM4pbigd = model->BSIM4pbigsd;
        }
        if (!model->BSIM4cigsdGiven && (model->BSIM4cigsGiven || model->BSIM4cigdGiven))
        {
            if (!model->BSIM4pcigsGiven)
                model->BSIM4pcigs = 0.0;
            if (!model->BSIM4pcigdGiven)
                model->BSIM4pcigd = 0.0;
        }
        else
        {
            if (!model->BSIM4pcigsdGiven)
                model->BSIM4pcigsd = 0.0;
            model->BSIM4pcigs = model->BSIM4pcigd = model->BSIM4pcigsd;
        }
        if (!model->BSIM4paigbaccGiven)
            model->BSIM4paigbacc = 0.0;
        if (!model->BSIM4pbigbaccGiven)
            model->BSIM4pbigbacc = 0.0;
        if (!model->BSIM4pcigbaccGiven)
            model->BSIM4pcigbacc = 0.0;
        if (!model->BSIM4paigbinvGiven)
            model->BSIM4paigbinv = 0.0;
        if (!model->BSIM4pbigbinvGiven)
            model->BSIM4pbigbinv = 0.0;
        if (!model->BSIM4pcigbinvGiven)
            model->BSIM4pcigbinv = 0.0;
        if (!model->BSIM4pnigcGiven)
            model->BSIM4pnigc = 0.0;
        if (!model->BSIM4pnigbinvGiven)
            model->BSIM4pnigbinv = 0.0;
        if (!model->BSIM4pnigbaccGiven)
            model->BSIM4pnigbacc = 0.0;
        if (!model->BSIM4pntoxGiven)
            model->BSIM4pntox = 0.0;
        if (!model->BSIM4peigbinvGiven)
            model->BSIM4peigbinv = 0.0;
        if (!model->BSIM4ppigcdGiven)
            model->BSIM4ppigcd = 0.0;
        if (!model->BSIM4ppoxedgeGiven)
            model->BSIM4ppoxedge = 0.0;
        if (!model->BSIM4pxrcrg1Given)
            model->BSIM4pxrcrg1 = 0.0;
        if (!model->BSIM4pxrcrg2Given)
            model->BSIM4pxrcrg2 = 0.0;
        if (!model->BSIM4peuGiven)
            model->BSIM4peu = 0.0;
        if (!model->BSIM4pucsGiven)
            model->BSIM4pucs = 0.0;
        if (!model->BSIM4pvfbGiven)
            model->BSIM4pvfb = 0.0;
        if (!model->BSIM4plambdaGiven)
            model->BSIM4plambda = 0.0;
        if (!model->BSIM4pvtlGiven)
            model->BSIM4pvtl = 0.0;
        if (!model->BSIM4pxnGiven)
            model->BSIM4pxn = 0.0;
        if (!model->BSIM4pvfbsdoffGiven)
            model->BSIM4pvfbsdoff = 0.0;
        if (!model->BSIM4ptvfbsdoffGiven)
            model->BSIM4ptvfbsdoff = 0.0;
        if (!model->BSIM4ptvoffGiven)
            model->BSIM4ptvoff = 0.0;
        if (!model->BSIM4ptnfactorGiven)    /* v4.7 temp dep of leakage current  */
            model->BSIM4ptnfactor = 0.0;
        if (!model->BSIM4pteta0Given)       /* v4.7 temp dep of leakage current  */
            model->BSIM4pteta0 = 0.0;
        if (!model->BSIM4ptvoffcvGiven)     /* v4.7 temp dep of leakage current  */
            model->BSIM4ptvoffcv = 0.0;
        if (!model->BSIM4pcgslGiven)
            model->BSIM4pcgsl = 0.0;
        if (!model->BSIM4pcgdlGiven)
            model->BSIM4pcgdl = 0.0;
        if (!model->BSIM4pckappasGiven)
            model->BSIM4pckappas = 0.0;
        if (!model->BSIM4pckappadGiven)
            model->BSIM4pckappad = 0.0;
        if (!model->BSIM4pcfGiven)
            model->BSIM4pcf = 0.0;
        if (!model->BSIM4pclcGiven)
            model->BSIM4pclc = 0.0;
        if (!model->BSIM4pcleGiven)
            model->BSIM4pcle = 0.0;
        if (!model->BSIM4pvfbcvGiven)
            model->BSIM4pvfbcv = 0.0;
        if (!model->BSIM4pacdeGiven)
            model->BSIM4pacde = 0.0;
        if (!model->BSIM4pmoinGiven)
            model->BSIM4pmoin = 0.0;
        if (!model->BSIM4pnoffGiven)
            model->BSIM4pnoff = 0.0;
        if (!model->BSIM4pvoffcvGiven)
            model->BSIM4pvoffcv = 0.0;
        if (!model->BSIM4gamma1Given)
            model->BSIM4gamma1 = 0.0;
        if (!model->BSIM4lgamma1Given)
            model->BSIM4lgamma1 = 0.0;
        if (!model->BSIM4wgamma1Given)
            model->BSIM4wgamma1 = 0.0;
        if (!model->BSIM4pgamma1Given)
            model->BSIM4pgamma1 = 0.0;
        if (!model->BSIM4gamma2Given)
            model->BSIM4gamma2 = 0.0;
        if (!model->BSIM4lgamma2Given)
            model->BSIM4lgamma2 = 0.0;
        if (!model->BSIM4wgamma2Given)
            model->BSIM4wgamma2 = 0.0;
        if (!model->BSIM4pgamma2Given)
            model->BSIM4pgamma2 = 0.0;
        if (!model->BSIM4vbxGiven)
            model->BSIM4vbx = 0.0;
        if (!model->BSIM4lvbxGiven)
            model->BSIM4lvbx = 0.0;
        if (!model->BSIM4wvbxGiven)
            model->BSIM4wvbx = 0.0;
        if (!model->BSIM4pvbxGiven)
            model->BSIM4pvbx = 0.0;

        /* unit degree celcius */
        if (!model->BSIM4tnomGiven)
        model->BSIM4tnom = ckt->CKTnomTemp;
        if (!model->BSIM4LintGiven)
           model->BSIM4Lint = 0.0;
        if (!model->BSIM4LlGiven)
           model->BSIM4Ll = 0.0;
        if (!model->BSIM4LlcGiven)
           model->BSIM4Llc = model->BSIM4Ll;
        if (!model->BSIM4LlnGiven)
           model->BSIM4Lln = 1.0;
        if (!model->BSIM4LwGiven)
           model->BSIM4Lw = 0.0;
        if (!model->BSIM4LwcGiven)
           model->BSIM4Lwc = model->BSIM4Lw;
        if (!model->BSIM4LwnGiven)
           model->BSIM4Lwn = 1.0;
        if (!model->BSIM4LwlGiven)
           model->BSIM4Lwl = 0.0;
        if (!model->BSIM4LwlcGiven)
           model->BSIM4Lwlc = model->BSIM4Lwl;
        if (!model->BSIM4LminGiven)
           model->BSIM4Lmin = 0.0;
        if (!model->BSIM4LmaxGiven)
           model->BSIM4Lmax = 1.0;
        if (!model->BSIM4WintGiven)
           model->BSIM4Wint = 0.0;
        if (!model->BSIM4WlGiven)
           model->BSIM4Wl = 0.0;
        if (!model->BSIM4WlcGiven)
           model->BSIM4Wlc = model->BSIM4Wl;
        if (!model->BSIM4WlnGiven)
           model->BSIM4Wln = 1.0;
        if (!model->BSIM4WwGiven)
           model->BSIM4Ww = 0.0;
        if (!model->BSIM4WwcGiven)
           model->BSIM4Wwc = model->BSIM4Ww;
        if (!model->BSIM4WwnGiven)
           model->BSIM4Wwn = 1.0;
        if (!model->BSIM4WwlGiven)
           model->BSIM4Wwl = 0.0;
        if (!model->BSIM4WwlcGiven)
           model->BSIM4Wwlc = model->BSIM4Wwl;
        if (!model->BSIM4WminGiven)
           model->BSIM4Wmin = 0.0;
        if (!model->BSIM4WmaxGiven)
           model->BSIM4Wmax = 1.0;
        if (!model->BSIM4dwcGiven)
           model->BSIM4dwc = model->BSIM4Wint;
        if (!model->BSIM4dlcGiven)
           model->BSIM4dlc = model->BSIM4Lint;
        if (!model->BSIM4xlGiven)
           model->BSIM4xl = 0.0;
        if (!model->BSIM4xwGiven)
           model->BSIM4xw = 0.0;
        if (!model->BSIM4dlcigGiven)
           model->BSIM4dlcig = model->BSIM4Lint;
        if (!model->BSIM4dlcigdGiven)
        {
           if (model->BSIM4dlcigGiven)
               model->BSIM4dlcigd = model->BSIM4dlcig;
            else
               model->BSIM4dlcigd = model->BSIM4Lint;
        }
        if (!model->BSIM4dwjGiven)
           model->BSIM4dwj = model->BSIM4dwc;
        if (!model->BSIM4xpartGiven)
            model->BSIM4xpart = 0.0;
        if (!model->BSIM4sheetResistanceGiven)
            model->BSIM4sheetResistance = 0.0;
        if (!model->BSIM4SunitAreaJctCapGiven)
            model->BSIM4SunitAreaJctCap = 5.0E-4;
        if (!model->BSIM4DunitAreaJctCapGiven)
            model->BSIM4DunitAreaJctCap = model->BSIM4SunitAreaJctCap;
        if (!model->BSIM4SunitLengthSidewallJctCapGiven)
            model->BSIM4SunitLengthSidewallJctCap = 5.0E-10;
        if (!model->BSIM4DunitLengthSidewallJctCapGiven)
            model->BSIM4DunitLengthSidewallJctCap = model->BSIM4SunitLengthSidewallJctCap;
        if (!model->BSIM4SunitLengthGateSidewallJctCapGiven)
            model->BSIM4SunitLengthGateSidewallJctCap = model->BSIM4SunitLengthSidewallJctCap ;
        if (!model->BSIM4DunitLengthGateSidewallJctCapGiven)
            model->BSIM4DunitLengthGateSidewallJctCap = model->BSIM4SunitLengthGateSidewallJctCap;
        if (!model->BSIM4SjctSatCurDensityGiven)
            model->BSIM4SjctSatCurDensity = 1.0E-4;
        if (!model->BSIM4DjctSatCurDensityGiven)
            model->BSIM4DjctSatCurDensity = model->BSIM4SjctSatCurDensity;
        if (!model->BSIM4SjctSidewallSatCurDensityGiven)
            model->BSIM4SjctSidewallSatCurDensity = 0.0;
        if (!model->BSIM4DjctSidewallSatCurDensityGiven)
            model->BSIM4DjctSidewallSatCurDensity = model->BSIM4SjctSidewallSatCurDensity;
        if (!model->BSIM4SjctGateSidewallSatCurDensityGiven)
            model->BSIM4SjctGateSidewallSatCurDensity = 0.0;
        if (!model->BSIM4DjctGateSidewallSatCurDensityGiven)
            model->BSIM4DjctGateSidewallSatCurDensity = model->BSIM4SjctGateSidewallSatCurDensity;
        if (!model->BSIM4SbulkJctPotentialGiven)
            model->BSIM4SbulkJctPotential = 1.0;
        if (!model->BSIM4DbulkJctPotentialGiven)
            model->BSIM4DbulkJctPotential = model->BSIM4SbulkJctPotential;
        if (!model->BSIM4SsidewallJctPotentialGiven)
            model->BSIM4SsidewallJctPotential = 1.0;
        if (!model->BSIM4DsidewallJctPotentialGiven)
            model->BSIM4DsidewallJctPotential = model->BSIM4SsidewallJctPotential;
        if (!model->BSIM4SGatesidewallJctPotentialGiven)
            model->BSIM4SGatesidewallJctPotential = model->BSIM4SsidewallJctPotential;
        if (!model->BSIM4DGatesidewallJctPotentialGiven)
            model->BSIM4DGatesidewallJctPotential = model->BSIM4SGatesidewallJctPotential;
        if (!model->BSIM4SbulkJctBotGradingCoeffGiven)
            model->BSIM4SbulkJctBotGradingCoeff = 0.5;
        if (!model->BSIM4DbulkJctBotGradingCoeffGiven)
            model->BSIM4DbulkJctBotGradingCoeff = model->BSIM4SbulkJctBotGradingCoeff;
        if (!model->BSIM4SbulkJctSideGradingCoeffGiven)
            model->BSIM4SbulkJctSideGradingCoeff = 0.33;
        if (!model->BSIM4DbulkJctSideGradingCoeffGiven)
            model->BSIM4DbulkJctSideGradingCoeff = model->BSIM4SbulkJctSideGradingCoeff;
        if (!model->BSIM4SbulkJctGateSideGradingCoeffGiven)
            model->BSIM4SbulkJctGateSideGradingCoeff = model->BSIM4SbulkJctSideGradingCoeff;
        if (!model->BSIM4DbulkJctGateSideGradingCoeffGiven)
            model->BSIM4DbulkJctGateSideGradingCoeff = model->BSIM4SbulkJctGateSideGradingCoeff;
        if (!model->BSIM4SjctEmissionCoeffGiven)
            model->BSIM4SjctEmissionCoeff = 1.0;
        if (!model->BSIM4DjctEmissionCoeffGiven)
            model->BSIM4DjctEmissionCoeff = model->BSIM4SjctEmissionCoeff;
        if (!model->BSIM4SjctTempExponentGiven)
            model->BSIM4SjctTempExponent = 3.0;
        if (!model->BSIM4DjctTempExponentGiven)
            model->BSIM4DjctTempExponent = model->BSIM4SjctTempExponent;

        if (!model->BSIM4jtssGiven)
            model->BSIM4jtss = 0.0;
        if (!model->BSIM4jtsdGiven)
            model->BSIM4jtsd = model->BSIM4jtss;
        if (!model->BSIM4jtsswsGiven)
            model->BSIM4jtssws = 0.0;
        if (!model->BSIM4jtsswdGiven)
            model->BSIM4jtsswd = model->BSIM4jtssws;
        if (!model->BSIM4jtsswgsGiven)
            model->BSIM4jtsswgs = 0.0;
        if (!model->BSIM4jtsswgdGiven)
            model->BSIM4jtsswgd = model->BSIM4jtsswgs;
        if (!model->BSIM4jtweffGiven)
            model->BSIM4jtweff = 0.0;
        if (!model->BSIM4njtsGiven)
            model->BSIM4njts = 20.0;
        if (!model->BSIM4njtsswGiven)
            model->BSIM4njtssw = 20.0;
        if (!model->BSIM4njtsswgGiven)
            model->BSIM4njtsswg = 20.0;
        if (!model->BSIM4njtsdGiven)
        {
            if (model->BSIM4njtsGiven)
                model->BSIM4njtsd =  model->BSIM4njts;
            else
                model->BSIM4njtsd = 20.0;
        }
        if (!model->BSIM4njtsswdGiven)
        {
            if (model->BSIM4njtsswGiven)
                model->BSIM4njtsswd =  model->BSIM4njtssw;
            else
                model->BSIM4njtsswd = 20.0;
        }
        if (!model->BSIM4njtsswgdGiven)
        {
            if (model->BSIM4njtsswgGiven)
                model->BSIM4njtsswgd =  model->BSIM4njtsswg;
            else
                model->BSIM4njtsswgd = 20.0;
        }
        if (!model->BSIM4xtssGiven)
            model->BSIM4xtss = 0.02;
        if (!model->BSIM4xtsdGiven)
            model->BSIM4xtsd = model->BSIM4xtss;
        if (!model->BSIM4xtsswsGiven)
            model->BSIM4xtssws = 0.02;
        if (!model->BSIM4xtsswdGiven)
            model->BSIM4xtsswd = model->BSIM4xtssws;
        if (!model->BSIM4xtsswgsGiven)
            model->BSIM4xtsswgs = 0.02;
        if (!model->BSIM4xtsswgdGiven)
            model->BSIM4xtsswgd = model->BSIM4xtsswgs;
        if (!model->BSIM4tnjtsGiven)
            model->BSIM4tnjts = 0.0;
        if (!model->BSIM4tnjtsswGiven)
            model->BSIM4tnjtssw = 0.0;
        if (!model->BSIM4tnjtsswgGiven)
            model->BSIM4tnjtsswg = 0.0;
        if (!model->BSIM4tnjtsdGiven)
        {
            if (model->BSIM4tnjtsGiven)
                model->BSIM4tnjtsd =  model->BSIM4tnjts;
            else
                model->BSIM4tnjtsd = 0.0;
        }
        if (!model->BSIM4tnjtsswdGiven)
        {
            if (model->BSIM4tnjtsswGiven)
                model->BSIM4tnjtsswd =  model->BSIM4tnjtssw;
            else
                model->BSIM4tnjtsswd = 0.0;
        }
        if (!model->BSIM4tnjtsswgdGiven)
        {
            if (model->BSIM4tnjtsswgGiven)
                model->BSIM4tnjtsswgd =  model->BSIM4tnjtsswg;
        else
                model->BSIM4tnjtsswgd = 0.0;
        }
        if (!model->BSIM4vtssGiven)
            model->BSIM4vtss = 10.0;
        if (!model->BSIM4vtsdGiven)
            model->BSIM4vtsd = model->BSIM4vtss;
        if (!model->BSIM4vtsswsGiven)
            model->BSIM4vtssws = 10.0;
        if (!model->BSIM4vtsswdGiven)
            model->BSIM4vtsswd = model->BSIM4vtssws;
        if (!model->BSIM4vtsswgsGiven)
            model->BSIM4vtsswgs = 10.0;
        if (!model->BSIM4vtsswgdGiven)
            model->BSIM4vtsswgd = model->BSIM4vtsswgs;

        if (!model->BSIM4oxideTrapDensityAGiven)
        {
            if (model->BSIM4type == NMOS)
                model->BSIM4oxideTrapDensityA = 6.25e41;
            else
                model->BSIM4oxideTrapDensityA= 6.188e40;
        }
        if (!model->BSIM4oxideTrapDensityBGiven)
        {
            if (model->BSIM4type == NMOS)
                model->BSIM4oxideTrapDensityB = 3.125e26;
            else
                model->BSIM4oxideTrapDensityB = 1.5e25;
        }
        if (!model->BSIM4oxideTrapDensityCGiven)
            model->BSIM4oxideTrapDensityC = 8.75e9;
        if (!model->BSIM4emGiven)
            model->BSIM4em = 4.1e7; /* V/m */
        if (!model->BSIM4efGiven)
            model->BSIM4ef = 1.0;
        if (!model->BSIM4afGiven)
            model->BSIM4af = 1.0;
        if (!model->BSIM4kfGiven)
            model->BSIM4kf = 0.0;

        if (!model->BSIM4vgsMaxGiven)
            model->BSIM4vgsMax = 1e99;
        if (!model->BSIM4vgdMaxGiven)
            model->BSIM4vgdMax = 1e99;
        if (!model->BSIM4vgbMaxGiven)
            model->BSIM4vgbMax = 1e99;
        if (!model->BSIM4vdsMaxGiven)
            model->BSIM4vdsMax = 1e99;
        if (!model->BSIM4vbsMaxGiven)
            model->BSIM4vbsMax = 1e99;
        if (!model->BSIM4vbdMaxGiven)
            model->BSIM4vbdMax = 1e99;
        if (!model->BSIM4vgsrMaxGiven)
            model->BSIM4vgsrMax = 1e99;
        if (!model->BSIM4vgdrMaxGiven)
            model->BSIM4vgdrMax = 1e99;
        if (!model->BSIM4vgbrMaxGiven)
            model->BSIM4vgbrMax = 1e99;
        if (!model->BSIM4vbsrMaxGiven)
            model->BSIM4vbsrMax = 1e99;
        if (!model->BSIM4vbdrMaxGiven)
            model->BSIM4vbdrMax = 1e99;

        /* stress effect */
        if (!model->BSIM4sarefGiven)
            model->BSIM4saref = 1e-6; /* m */
        if (!model->BSIM4sbrefGiven)
            model->BSIM4sbref = 1e-6;  /* m */
        if (!model->BSIM4wlodGiven)
            model->BSIM4wlod = 0;  /* m */
        if (!model->BSIM4ku0Given)
            model->BSIM4ku0 = 0; /* 1/m */
        if (!model->BSIM4kvsatGiven)
            model->BSIM4kvsat = 0;
        if (!model->BSIM4kvth0Given) /* m */
            model->BSIM4kvth0 = 0;
        if (!model->BSIM4tku0Given)
            model->BSIM4tku0 = 0;
        if (!model->BSIM4llodku0Given)
            model->BSIM4llodku0 = 0;
        if (!model->BSIM4wlodku0Given)
            model->BSIM4wlodku0 = 0;
        if (!model->BSIM4llodvthGiven)
            model->BSIM4llodvth = 0;
        if (!model->BSIM4wlodvthGiven)
            model->BSIM4wlodvth = 0;
        if (!model->BSIM4lku0Given)
            model->BSIM4lku0 = 0;
        if (!model->BSIM4wku0Given)
            model->BSIM4wku0 = 0;
        if (!model->BSIM4pku0Given)
            model->BSIM4pku0 = 0;
        if (!model->BSIM4lkvth0Given)
            model->BSIM4lkvth0 = 0;
        if (!model->BSIM4wkvth0Given)
            model->BSIM4wkvth0 = 0;
        if (!model->BSIM4pkvth0Given)
            model->BSIM4pkvth0 = 0;
        if (!model->BSIM4stk2Given)
            model->BSIM4stk2 = 0;
        if (!model->BSIM4lodk2Given)
            model->BSIM4lodk2 = 1.0;
        if (!model->BSIM4steta0Given)
            model->BSIM4steta0 = 0;
        if (!model->BSIM4lodeta0Given)
            model->BSIM4lodeta0 = 1.0;

    /* Well Proximity Effect  */
        if (!model->BSIM4webGiven)
            model->BSIM4web = 0.0;
        if (!model->BSIM4wecGiven)
            model->BSIM4wec = 0.0;
        if (!model->BSIM4kvth0weGiven)
            model->BSIM4kvth0we = 0.0;
        if (!model->BSIM4k2weGiven)
            model->BSIM4k2we = 0.0;
        if (!model->BSIM4ku0weGiven)
            model->BSIM4ku0we = 0.0;
        if (!model->BSIM4screfGiven)
            model->BSIM4scref = 1.0E-6; /* m */
        if (!model->BSIM4wpemodGiven)
            model->BSIM4wpemod = 0;
        else if ((model->BSIM4wpemod != 0) && (model->BSIM4wpemod != 1))
        {   model->BSIM4wpemod = 0;
            printf("Warning: wpemod has been set to its default value: 0.\n");
        }
        if (!model->BSIM4lkvth0weGiven)
            model->BSIM4lkvth0we = 0;
        if (!model->BSIM4lk2weGiven)
            model->BSIM4lk2we = 0;
        if (!model->BSIM4lku0weGiven)
            model->BSIM4lku0we = 0;
        if (!model->BSIM4wkvth0weGiven)
            model->BSIM4wkvth0we = 0;
        if (!model->BSIM4wk2weGiven)
            model->BSIM4wk2we = 0;
        if (!model->BSIM4wku0weGiven)
            model->BSIM4wku0we = 0;
        if (!model->BSIM4pkvth0weGiven)
            model->BSIM4pkvth0we = 0;
        if (!model->BSIM4pk2weGiven)
            model->BSIM4pk2we = 0;
        if (!model->BSIM4pku0weGiven)
            model->BSIM4pku0we = 0;

        DMCGeff = model->BSIM4dmcg - model->BSIM4dmcgt;
        DMCIeff = model->BSIM4dmci;
        DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt;

        /*
         * End processing models and begin to loop
         * through all the instances of the model
         */

        for (here = BSIM4instances(model); here != NULL ;
             here=BSIM4nextInstance(here)) 
        {   /* allocate a chunk of the state vector */
            here->BSIM4states = *states;
            *states += BSIM4numStates;
            /* perform the parameter defaulting */
            if (!here->BSIM4lGiven)
                here->BSIM4l = 5.0e-6;
            if (!here->BSIM4wGiven)
                here->BSIM4w = 5.0e-6;
            if (!here->BSIM4mGiven)
                here->BSIM4m = 1.0;
            if (!here->BSIM4mult_iGiven)
                here->BSIM4mult_i = 1.0;
            if (!here->BSIM4mult_qGiven)
                here->BSIM4mult_q = 1.0;
            if (!here->BSIM4mult_fnGiven)
                here->BSIM4mult_fn = here->BSIM4mult_i;
            if (!here->BSIM4nfGiven)
                here->BSIM4nf = 1.0;
            if (!here->BSIM4minGiven)
                here->BSIM4min = 0; /* integer */
            if (!here->BSIM4icVDSGiven)
                here->BSIM4icVDS = 0.0;
            if (!here->BSIM4icVGSGiven)
                here->BSIM4icVGS = 0.0;
            if (!here->BSIM4icVBSGiven)
                here->BSIM4icVBS = 0.0;
            if (!here->BSIM4drainAreaGiven)
                here->BSIM4drainArea = 0.0;
            if (!here->BSIM4drainPerimeterGiven)
                here->BSIM4drainPerimeter = 0.0;
            if (!here->BSIM4drainSquaresGiven)
                here->BSIM4drainSquares = 1.0;
            if (!here->BSIM4sourceAreaGiven)
                here->BSIM4sourceArea = 0.0;
            if (!here->BSIM4sourcePerimeterGiven)
                here->BSIM4sourcePerimeter = 0.0;
            if (!here->BSIM4sourceSquaresGiven)
                here->BSIM4sourceSquares = 1.0;

            if (!here->BSIM4rbdbGiven)
                here->BSIM4rbdb = model->BSIM4rbdb; /* in ohm */
            if (!here->BSIM4rbsbGiven)
                here->BSIM4rbsb = model->BSIM4rbsb;
            if (!here->BSIM4rbpbGiven)
                here->BSIM4rbpb = model->BSIM4rbpb;
            if (!here->BSIM4rbpsGiven)
                here->BSIM4rbps = model->BSIM4rbps;
            if (!here->BSIM4rbpdGiven)
                here->BSIM4rbpd = model->BSIM4rbpd;
            if (!here->BSIM4delvtoGiven)
                here->BSIM4delvto = 0.0;
            if (!here->BSIM4mulu0Given)
                here->BSIM4mulu0 = 1.0;
            if (!here->BSIM4xgwGiven)
                here->BSIM4xgw = model->BSIM4xgw;
            if (!here->BSIM4ngconGiven)
                here->BSIM4ngcon = model->BSIM4ngcon;
            if (!here->BSIM4dtempGiven)
                here->BSIM4dtemp = 0;

            /* Process instance model selectors, some
             * may override their global counterparts
            */
            if (!here->BSIM4rbodyModGiven)
                here->BSIM4rbodyMod = model->BSIM4rbodyMod;
            else if ((here->BSIM4rbodyMod != 0) && (here->BSIM4rbodyMod != 1) && (here->BSIM4rbodyMod != 2))
            {   here->BSIM4rbodyMod = model->BSIM4rbodyMod;
                printf("Warning: rbodyMod has been set to its global value %d.\n",
            model->BSIM4rbodyMod);
            }

            if (!here->BSIM4rgateModGiven)
                here->BSIM4rgateMod = model->BSIM4rgateMod;
            else if ((here->BSIM4rgateMod != 0) && (here->BSIM4rgateMod != 1)
            && (here->BSIM4rgateMod != 2) && (here->BSIM4rgateMod != 3))
            {   here->BSIM4rgateMod = model->BSIM4rgateMod;
                printf("Warning: rgateMod has been set to its global value %d.\n",
                model->BSIM4rgateMod);
            }

            if (!here->BSIM4geoModGiven)
                here->BSIM4geoMod = model->BSIM4geoMod;
            if (!here->BSIM4rgeoModGiven)
                here->BSIM4rgeoMod = 0;
            if (!here->BSIM4trnqsModGiven)
                here->BSIM4trnqsMod = model->BSIM4trnqsMod;
            else if ((here->BSIM4trnqsMod != 0) && (here->BSIM4trnqsMod != 1))
            {   here->BSIM4trnqsMod = model->BSIM4trnqsMod;
                printf("Warning: trnqsMod has been set to its global value %d.\n",
                model->BSIM4trnqsMod);
            }

            if (!here->BSIM4acnqsModGiven)
                here->BSIM4acnqsMod = model->BSIM4acnqsMod;
            else if ((here->BSIM4acnqsMod != 0) && (here->BSIM4acnqsMod != 1))
            {   here->BSIM4acnqsMod = model->BSIM4acnqsMod;
                printf("Warning: acnqsMod has been set to its global value %d.\n",
                model->BSIM4acnqsMod);
            }

            /* stress effect */
            if (!here->BSIM4saGiven)
                here->BSIM4sa = 0.0;
            if (!here->BSIM4sbGiven)
                here->BSIM4sb = 0.0;
            if (!here->BSIM4sdGiven)
                here->BSIM4sd = 2 * model->BSIM4dmcg;
            /* Well Proximity Effect  */
            if (!here->BSIM4scaGiven)
                here->BSIM4sca = 0.0;
            if (!here->BSIM4scbGiven)
                here->BSIM4scb = 0.0;
            if (!here->BSIM4sccGiven)
                here->BSIM4scc = 0.0;
            if (!here->BSIM4scGiven)
                here->BSIM4sc = 0.0; /* m */

            /* process drain series resistance */
            createNode = 0;
            if ( (model->BSIM4rdsMod != 0)
                            || (model->BSIM4tnoiMod == 1 && noiseAnalGiven))
            {
               createNode = 1;
            } else if (model->BSIM4sheetResistance > 0)
            {
                     if (here->BSIM4drainSquaresGiven
                                       && here->BSIM4drainSquares > 0)
                     {
                          createNode = 1;
                     } else if (!here->BSIM4drainSquaresGiven
                                       && (here->BSIM4rgeoMod != 0))
                     {
                          BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod,
                                  here->BSIM4rgeoMod, here->BSIM4min,
                                  here->BSIM4w, model->BSIM4sheetResistance,
                                  DMCGeff, DMCIeff, DMDGeff, 0, &Rtot);
                          if(Rtot > 0)
                             createNode = 1;
                     }
            }
            if ( createNode != 0  && (here->BSIM4dNodePrime == 0))
            {   error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"drain");
                if(error) return(error);
                here->BSIM4dNodePrime = tmp->number;
                if (ckt->CKTcopyNodesets) {
                  CKTnode *tmpNode;
                  IFuid tmpName;    
                  if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
                     if (tmpNode->nsGiven) {
                       tmp->nodeset=tmpNode->nodeset; 
                       tmp->nsGiven=tmpNode->nsGiven; 
                     }
                  }
                }
            }
            else
            {   here->BSIM4dNodePrime = here->BSIM4dNode;
            }

            /* process source series resistance */
            createNode = 0;
            if ( (model->BSIM4rdsMod != 0)
                            || (model->BSIM4tnoiMod == 1 && noiseAnalGiven))
            {
               createNode = 1;
            } else if (model->BSIM4sheetResistance > 0)
                {
                     if (here->BSIM4sourceSquaresGiven
                                        && here->BSIM4sourceSquares > 0)
                     {
                          createNode = 1;
                     } else if (!here->BSIM4sourceSquaresGiven
                                        && (here->BSIM4rgeoMod != 0))
                     {
                          BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod,
                                  here->BSIM4rgeoMod, here->BSIM4min,
                                  here->BSIM4w, model->BSIM4sheetResistance,
                                  DMCGeff, DMCIeff, DMDGeff, 1, &Rtot);
                          if(Rtot > 0)
                             createNode = 1;
                     }
                }
            if ( createNode != 0  && here->BSIM4sNodePrime == 0)
            {   error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"source");
                if(error) return(error);
                here->BSIM4sNodePrime = tmp->number;
                if (ckt->CKTcopyNodesets) {
                  CKTnode *tmpNode;
                  IFuid tmpName;
                  if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
                     if (tmpNode->nsGiven) {
                       tmp->nodeset=tmpNode->nodeset; 
                       tmp->nsGiven=tmpNode->nsGiven; 
                     }
                  }
                }
            }
            else
                here->BSIM4sNodePrime = here->BSIM4sNode;

            if ((here->BSIM4rgateMod > 0) && (here->BSIM4gNodePrime == 0))
            {   error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"gate");
                if(error) return(error);
                   here->BSIM4gNodePrime = tmp->number;
                if (ckt->CKTcopyNodesets) {
                  CKTnode *tmpNode;
                  IFuid tmpName;
                  if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {
                    if (tmpNode->nsGiven) {
                      tmp->nodeset=tmpNode->nodeset; 
                      tmp->nsGiven=tmpNode->nsGiven; 
                    }
                  }
                }
            }
            else
                here->BSIM4gNodePrime = here->BSIM4gNodeExt;

            if ((here->BSIM4rgateMod == 3) && (here->BSIM4gNodeMid == 0))
            {   error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"midgate");
                if(error) return(error);
                   here->BSIM4gNodeMid = tmp->number;
            }
            else
                here->BSIM4gNodeMid = here->BSIM4gNodeExt;


            /* internal body nodes for body resistance model */
            if ((here->BSIM4rbodyMod ==1) || (here->BSIM4rbodyMod ==2))
            {   if (here->BSIM4dbNode == 0)
                {   error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"dbody");
                    if(error) return(error);
                    here->BSIM4dbNode = tmp->number;
                }
                if (here->BSIM4bNodePrime == 0)
                {   error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"body");
                    if(error) return(error);
                    here->BSIM4bNodePrime = tmp->number;
                    if (ckt->CKTcopyNodesets) {
                      CKTnode *tmpNode;
                      IFuid tmpName;
                      if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) {
                        if (tmpNode->nsGiven) {
                          tmp->nodeset=tmpNode->nodeset; 
                          tmp->nsGiven=tmpNode->nsGiven; 
                        }
                      }
                    }
                }
                if (here->BSIM4sbNode == 0)
                {   error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"sbody");
                    if(error) return(error);
                    here->BSIM4sbNode = tmp->number;
                }
            }
            else
            here->BSIM4dbNode = here->BSIM4bNodePrime = here->BSIM4sbNode
                  = here->BSIM4bNode;

            /* NQS node */
            if ((here->BSIM4trnqsMod) && (here->BSIM4qNode == 0))
            {   error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"charge");
                if(error) return(error);
                here->BSIM4qNode = tmp->number;
            }
            else
                here->BSIM4qNode = 0;

/* set Sparse Matrix Pointers
* macro to make elements with built-in out-of-memory test */
#define TSTALLOC(ptr,first,second) \
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(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(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(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(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(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);
            }

            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);
            }
        }
    }

#ifdef USE_OMP
    InstCount = 0;
    model = (BSIM4model*)inModel;
    /* loop through all the BSIM4 device models 
       to count the number of instances */
    
    for( ; model != NULL; model = BSIM4nextModel(model))
    {
        /* loop through all the instances of the model */
        for (here = BSIM4instances(model); here != NULL ;
             here=BSIM4nextInstance(here)) 
        { 
            InstCount++;
        }
        model->BSIM4InstCount = 0;
        model->BSIM4InstanceArray = NULL;
    }
    InstArray = TMALLOC(BSIM4instance*, InstCount);
    model = (BSIM4model*)inModel;
    /* store this in the first model only */
    model->BSIM4InstCount = InstCount;
    model->BSIM4InstanceArray = InstArray;
    idx = 0;
    for( ; model != NULL; model = BSIM4nextModel(model))
    {
        /* loop through all the instances of the model */
        for (here = BSIM4instances(model); here != NULL ;
             here=BSIM4nextInstance(here)) 
        { 
            InstArray[idx] = here;
            idx++;
        }
    }
#endif

    return(OK);
}

int
BSIM4unsetup(
    GENmodel *inModel,
    CKTcircuit *ckt)
{
    BSIM4model *model;
    BSIM4instance *here;

#ifdef USE_OMP
    model = (BSIM4model*)inModel;
    tfree(model->BSIM4InstanceArray);
#endif

    for (model = (BSIM4model *)inModel; model != NULL;
            model = BSIM4nextModel(model))
    {
        for (here = BSIM4instances(model); here != NULL;
                here=BSIM4nextInstance(here))
        {
            if (here->BSIM4qNode > 0)
                CKTdltNNum(ckt, here->BSIM4qNode);
            here->BSIM4qNode = 0;

            if (here->BSIM4sbNode > 0 &&
                here->BSIM4sbNode != here->BSIM4bNode)
                CKTdltNNum(ckt, here->BSIM4sbNode);
            here->BSIM4sbNode = 0;

            if (here->BSIM4bNodePrime > 0 &&
                here->BSIM4bNodePrime != here->BSIM4bNode)
                CKTdltNNum(ckt, here->BSIM4bNodePrime);
            here->BSIM4bNodePrime = 0;

            if (here->BSIM4dbNode > 0 &&
                here->BSIM4dbNode != here->BSIM4bNode)
                CKTdltNNum(ckt, here->BSIM4dbNode);
            here->BSIM4dbNode = 0;

            if (here->BSIM4gNodeMid > 0 &&
                here->BSIM4gNodeMid != here->BSIM4gNodeExt)
                CKTdltNNum(ckt, here->BSIM4gNodeMid);
            here->BSIM4gNodeMid = 0;

            if (here->BSIM4gNodePrime > 0 &&
                here->BSIM4gNodePrime != here->BSIM4gNodeExt)
                CKTdltNNum(ckt, here->BSIM4gNodePrime);
            here->BSIM4gNodePrime = 0;

            if (here->BSIM4sNodePrime > 0
                    && here->BSIM4sNodePrime != here->BSIM4sNode)
                CKTdltNNum(ckt, here->BSIM4sNodePrime);
            here->BSIM4sNodePrime = 0;

            if (here->BSIM4dNodePrime > 0
                    && here->BSIM4dNodePrime != here->BSIM4dNode)
                CKTdltNNum(ckt, here->BSIM4dNodePrime);
            here->BSIM4dNodePrime = 0;
        }
    }
    return OK;
}
