You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

388 lines
12 KiB

/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
/**********
* Copyright 2010 Regents of the University of California. All rights reserved.
* Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiask.c
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
* File: b4soiask.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/
#include "ngspice/ngspice.h"
#include "ngspice/ifsim.h"
#include "ngspice/cktdefs.h"
#include "ngspice/devdefs.h"
#include "b4soidef.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
B4SOIask(
CKTcircuit *ckt,
GENinstance *inst,
int which,
IFvalue *value,
IFvalue *select)
{
B4SOIinstance *here = (B4SOIinstance*)inst;
NG_IGNORE(select);
switch(which)
{ case B4SOI_L:
value->rValue = here->B4SOIl;
return(OK);
case B4SOI_W:
value->rValue = here->B4SOIw;
return(OK);
case B4SOI_M:
value->rValue = here->B4SOIm;
return(OK);
case B4SOI_AS:
value->rValue = here->B4SOIsourceArea;
return(OK);
case B4SOI_AD:
value->rValue = here->B4SOIdrainArea;
return(OK);
case B4SOI_PS:
value->rValue = here->B4SOIsourcePerimeter;
return(OK);
case B4SOI_PD:
value->rValue = here->B4SOIdrainPerimeter;
return(OK);
case B4SOI_NRS:
value->rValue = here->B4SOIsourceSquares;
return(OK);
case B4SOI_NRD:
value->rValue = here->B4SOIdrainSquares;
return(OK);
case B4SOI_OFF:
value->iValue = here->B4SOIoff;
return(OK);
case B4SOI_BJTOFF:
value->iValue = here->B4SOIbjtoff;
return(OK);
case B4SOI_RTH0:
value->rValue = here->B4SOIrth0;
return(OK);
case B4SOI_CTH0:
value->rValue = here->B4SOIcth0;
return(OK);
case B4SOI_NRB:
value->rValue = here->B4SOIbodySquares;
return(OK);
case B4SOI_FRBODY:
value->rValue = here->B4SOIfrbody;
return(OK);
case B4SOI_QB:
value->rValue = here->B4SOIqbulk;
return(OK);
case B4SOI_QD:
value->rValue = here->B4SOIqdrn;
return(OK);
case B4SOI_QS:
value->rValue = here->B4SOIqsrc;
return(OK);
case B4SOI_CGG:
value->rValue = here->B4SOIcggb;
return(OK);
case B4SOI_CGD:
value->rValue = here->B4SOIcgdb;
return(OK);
case B4SOI_CGS:
value->rValue = here->B4SOIcgsb;
return(OK);
case B4SOI_CDG:
value->rValue = here->B4SOIcdgb;
return(OK);
case B4SOI_CDD:
value->rValue = here->B4SOIcddb;
return(OK);
case B4SOI_CDS:
value->rValue = here->B4SOIcdsb;
return(OK);
case B4SOI_CBG:
value->rValue = here->B4SOIcbgb;
return(OK);
case B4SOI_CBD:
value->rValue = here->B4SOIcbdb;
return(OK);
case B4SOI_CBS:
value->rValue = here->B4SOIcbsb;
return(OK);
case B4SOI_CAPBD:
value->rValue = here->B4SOIcapbd;
return(OK);
case B4SOI_CAPBS:
value->rValue = here->B4SOIcapbs;
return(OK);
/* v4.0 */
case B4SOI_RBSB:
value->rValue = here->B4SOIrbsb;
return(OK);
case B4SOI_RBDB:
value->rValue = here->B4SOIrbdb;
return(OK);
case B4SOI_CJSB:
value->rValue = here->B4SOIcjsb;
return(OK);
case B4SOI_CJDB:
value->rValue = here->B4SOIcjdb;
return(OK);
case B4SOI_SA:
value->rValue = here->B4SOIsa ;
return(OK);
case B4SOI_SB:
value->rValue = here->B4SOIsb ;
return(OK);
case B4SOI_SD:
value->rValue = here->B4SOIsd ;
return(OK);
case B4SOI_RBODYMOD:
value->iValue = here->B4SOIrbodyMod;
return(OK);
case B4SOI_NF:
value->rValue = here->B4SOInf;
return(OK);
case B4SOI_DELVTO:
value->rValue = here->B4SOIdelvto;
return(OK);
/* v4.0 end */
/* v3.2 */
case B4SOI_SOIMOD:
value->iValue = here->B4SOIsoiMod;
return(OK);
/* v3.1 added rgate */
case B4SOI_RGATEMOD:
value->iValue = here->B4SOIrgateMod;
return(OK);
/* v3.1 added rgate end */
/* v2.0 release */
case B4SOI_NBC:
value->rValue = here->B4SOInbc;
return(OK);
case B4SOI_NSEG:
value->rValue = here->B4SOInseg;
return(OK);
case B4SOI_PDBCP:
value->rValue = here->B4SOIpdbcp;
return(OK);
case B4SOI_PSBCP:
value->rValue = here->B4SOIpsbcp;
return(OK);
case B4SOI_AGBCP:
value->rValue = here->B4SOIagbcp;
return(OK);
case B4SOI_AGBCP2:
value->rValue = here->B4SOIagbcp2;
return(OK); /* v4.1 for BC improvement */
case B4SOI_AGBCPD: /* v4.0 */
value->rValue = here->B4SOIagbcpd;
return(OK);
case B4SOI_AEBCP:
value->rValue = here->B4SOIaebcp;
return(OK);
case B4SOI_VBSUSR:
value->rValue = here->B4SOIvbsusr;
return(OK);
case B4SOI_TNODEOUT:
value->iValue = here->B4SOItnodeout;
return(OK);
case B4SOI_IC_VBS:
value->rValue = here->B4SOIicVBS;
return(OK);
case B4SOI_IC_VDS:
value->rValue = here->B4SOIicVDS;
return(OK);
case B4SOI_IC_VGS:
value->rValue = here->B4SOIicVGS;
return(OK);
case B4SOI_IC_VES:
value->rValue = here->B4SOIicVES;
return(OK);
case B4SOI_IC_VPS:
value->rValue = here->B4SOIicVPS;
return(OK);
case B4SOI_DNODE:
value->iValue = here->B4SOIdNode;
return(OK);
case B4SOI_GNODE:
value->iValue = here->B4SOIgNode;
return(OK);
case B4SOI_SNODE:
value->iValue = here->B4SOIsNode;
return(OK);
case B4SOI_BNODE:
value->iValue = here->B4SOIbNode;
return(OK);
case B4SOI_ENODE:
value->iValue = here->B4SOIeNode;
return(OK);
case B4SOI_DNODEPRIME:
value->iValue = here->B4SOIdNodePrime;
return(OK);
case B4SOI_SNODEPRIME:
value->iValue = here->B4SOIsNodePrime;
return(OK);
/* v3.1 added for RF */
case B4SOI_GNODEEXT:
value->iValue = here->B4SOIgNodeExt;
return(OK);
case B4SOI_GNODEMID:
value->iValue = here->B4SOIgNodeMid;
return(OK);
/* added for RF end*/
case B4SOI_SOURCECONDUCT:
value->rValue = here->B4SOIsourceConductance;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_DRAINCONDUCT:
value->rValue = here->B4SOIdrainConductance;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_VBD:
value->rValue = *(ckt->CKTstate0 + here->B4SOIvbd);
return(OK);
case B4SOI_VBS:
value->rValue = *(ckt->CKTstate0 + here->B4SOIvbs);
return(OK);
case B4SOI_VGS:
value->rValue = *(ckt->CKTstate0 + here->B4SOIvgs);
return(OK);
case B4SOI_VES:
value->rValue = *(ckt->CKTstate0 + here->B4SOIves);
return(OK);
case B4SOI_VDS:
value->rValue = *(ckt->CKTstate0 + here->B4SOIvds);
return(OK);
case B4SOI_CD:
value->rValue = here->B4SOIcdrain;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_IBS:
value->rValue = here->B4SOIibs;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_IBD:
value->rValue = here->B4SOIibd;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_ISUB:
value->rValue = here->B4SOIiii;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_IGIDL:
value->rValue = here->B4SOIigidl;
return(OK);
case B4SOI_IGISL:
value->rValue = here->B4SOIigisl;
return(OK);
case B4SOI_IGS:
value->rValue = here->B4SOIIgs;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_IGD:
value->rValue = here->B4SOIIgd;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_IGB:
value->rValue = here->B4SOIIgb;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_IGCS:
value->rValue = here->B4SOIIgcs;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_IGCD:
value->rValue = here->B4SOIIgcd;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_GM:
value->rValue = here->B4SOIgm;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_GMID:
value->rValue = here->B4SOIgm/here->B4SOIcd;
return(OK);
case B4SOI_GDS:
value->rValue = here->B4SOIgds;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_GMBS:
value->rValue = here->B4SOIgmbs;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_GBD:
value->rValue = here->B4SOIgjdb;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_GBS:
value->rValue = here->B4SOIgjsb;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_CQB:
value->rValue = *(ckt->CKTstate0 + here->B4SOIcqb);
return(OK);
case B4SOI_CQG:
value->rValue = *(ckt->CKTstate0 + here->B4SOIcqg);
return(OK);
case B4SOI_CQD:
value->rValue = *(ckt->CKTstate0 + here->B4SOIcqd);
return(OK);
case B4SOI_CBDB:
value->rValue = here->B4SOIcbdb;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_CBSB:
value->rValue = here->B4SOIcbsb;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_VON:
value->rValue = here->B4SOIvon;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_VDSAT:
value->rValue = here->B4SOIvdsat;
value->rValue *= here->B4SOIm;
return(OK);
case B4SOI_QBS:
value->rValue = *(ckt->CKTstate0 + here->B4SOIqbs);
return(OK);
case B4SOI_QBD:
value->rValue = *(ckt->CKTstate0 + here->B4SOIqbd);
return(OK);
#ifdef B4SOI_DEBUG_OUT
case B4SOI_DEBUG1:
value->rValue = here->B4SOIdebug1;
return(OK);
case B4SOI_DEBUG2:
value->rValue = here->B4SOIdebug2;
return(OK);
case B4SOI_DEBUG3:
value->rValue = here->B4SOIdebug3;
return(OK);
#endif
default:
return(E_BADPARM);
}
/* NOTREACHED */
}