📄 b1disto.c
字号:
/**********Copyright 1990 Regents of the University of California. All rights reserved.Author: 1988 Jaijeet S Roychowdhury**********/#include "spice.h"#include <stdio.h>#include "cktdefs.h"#include "util.h"#include "bsim1def.h"#include "sperror.h"#include "distodef.h"#include "suffix.h"intB1disto(mode,genmodel,ckt) GENmodel *genmodel; register CKTcircuit *ckt; int mode;/* assuming here that ckt->CKTomega has been initialised to * the correct value */{ B1model *model = (B1model *) genmodel; DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; double td; DpassStr pass; double r1h1x,i1h1x; double r1h1y,i1h1y; double r1h1z, i1h1z; double r1h2x, i1h2x; double r1h2y, i1h2y; double r1h2z, i1h2z; double r1hm2x,i1hm2x; double r1hm2y,i1hm2y; double r1hm2z, i1hm2z; double r2h11x,i2h11x; double r2h11y,i2h11y; double r2h11z, i2h11z; double r2h1m2x,i2h1m2x; double r2h1m2y,i2h1m2y; double r2h1m2z, i2h1m2z; double temp, itemp; register B1instance *here;if (mode == D_SETUP) return(B1dSetup(model,ckt));if ((mode == D_TWOF1) || (mode == D_THRF1) || (mode == D_F1PF2) || (mode == D_F1MF2) || (mode == D_2F1MF2)) { /* loop through all the B1 models */for( ; model != NULL; model = model->B1nextModel ) { /* loop through all the instances of the model */ for (here = model->B1instances; here != NULL ; here=here->B1nextInstance) { if (here->B1owner != ARCHme) continue; /* loading starts here */ switch (mode) { case D_TWOF1: /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */ { /* draincurrent term */ r1h1x = *(job->r1H1ptr + here->B1gNode) - *(job->r1H1ptr + here->B1sNodePrime); i1h1x = *(job->i1H1ptr + here->B1gNode) - *(job->i1H1ptr + here->B1sNodePrime); r1h1y = *(job->r1H1ptr + here->B1bNode) - *(job->r1H1ptr + here->B1sNodePrime); i1h1y = *(job->i1H1ptr + here->B1bNode) - *(job->i1H1ptr + here->B1sNodePrime); r1h1z = *(job->r1H1ptr + here->B1dNodePrime) - *(job->r1H1ptr + here->B1sNodePrime); i1h1z = *(job->i1H1ptr + here->B1dNodePrime) - *(job->i1H1ptr + here->B1sNodePrime); /* draincurrent is a function of vgs,vbs,and vds; * have got their linear kernels; now to call * load functions */ temp = DFn2F1(here->DrC_x2, here->DrC_y2, here->DrC_z2, here->DrC_xy, here->DrC_yz, here->DrC_xz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z); itemp = DFi2F1(here->DrC_x2, here->DrC_y2, here->DrC_z2, here->DrC_xy, here->DrC_yz, here->DrC_xz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z); *(ckt->CKTrhs + here->B1dNodePrime) -= temp; *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; *(ckt->CKTrhs + here->B1sNodePrime) += temp; *(ckt->CKTirhs + here->B1sNodePrime) += itemp; /* draincurrent term loading over */ /* loading qg term */ /* kernels for vgs,vbs and vds already set up */ temp = -ckt->CKTomega * DFi2F1(here->qg_x2, here->qg_y2, here->qg_z2, here->qg_xy, here->qg_yz, here->qg_xz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z); itemp = ckt->CKTomega * DFn2F1(here->qg_x2, here->qg_y2, here->qg_z2, here->qg_xy, here->qg_yz, here->qg_xz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z); *(ckt->CKTrhs + here->B1gNode) -= temp; *(ckt->CKTirhs + here->B1gNode) -= itemp; *(ckt->CKTrhs + here->B1sNodePrime) += temp; *(ckt->CKTirhs + here->B1sNodePrime) += itemp; /* qg term over */ /* loading qb term */ /* kernels for vgs,vbs and vds already set up */ temp = -ckt->CKTomega * DFi2F1(here->qb_x2, here->qb_y2, here->qb_z2, here->qb_xy, here->qb_yz, here->qb_xz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z); itemp = ckt->CKTomega * DFn2F1(here->qb_x2, here->qb_y2, here->qb_z2, here->qb_xy, here->qb_yz, here->qb_xz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z); *(ckt->CKTrhs + here->B1bNode) -= temp; *(ckt->CKTirhs + here->B1bNode) -= itemp; *(ckt->CKTrhs + here->B1sNodePrime) += temp; *(ckt->CKTirhs + here->B1sNodePrime) += itemp; /* qb term over */ /* loading qd term */ /* kernels for vgs,vbs and vds already set up */ temp = -ckt->CKTomega * DFi2F1(here->qd_x2, here->qd_y2, here->qd_z2, here->qd_xy, here->qd_yz, here->qd_xz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z); itemp = ckt->CKTomega * DFn2F1(here->qd_x2, here->qd_y2, here->qd_z2, here->qd_xy, here->qd_yz, here->qd_xz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z); *(ckt->CKTrhs + here->B1dNodePrime) -= temp; *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; *(ckt->CKTrhs + here->B1sNodePrime) += temp; *(ckt->CKTirhs + here->B1sNodePrime) += itemp; /* qd term over */ /* loading here->B1gbs term */ r1h1x = *(job->r1H1ptr + here->B1bNode) - *(job->r1H1ptr + here->B1sNodePrime); i1h1x = *(job->i1H1ptr + here->B1bNode) - *(job->i1H1ptr + here->B1sNodePrime); /* now r1h1x = vbs */ temp = D1n2F1(here->gbs2, r1h1x, i1h1x); itemp = D1i2F1(here->gbs2, r1h1x, i1h1x); *(ckt->CKTrhs + here->B1bNode) -= temp; *(ckt->CKTirhs + here->B1bNode) -= itemp; *(ckt->CKTrhs + here->B1sNodePrime) += temp; *(ckt->CKTirhs + here->B1sNodePrime) += itemp; /* here->B1gbs term over */ /* loading here->B1gbd term */ r1h1x = *(job->r1H1ptr + here->B1bNode) - *(job->r1H1ptr + here->B1dNodePrime); i1h1x = *(job->i1H1ptr + here->B1bNode) - *(job->i1H1ptr + here->B1dNodePrime); /* now r1h1x = vbd */ temp = D1n2F1(here->gbd2, r1h1x, i1h1x); itemp = D1i2F1(here->gbd2, r1h1x, i1h1x); *(ckt->CKTrhs + here->B1gNode) -= temp; *(ckt->CKTirhs + here->B1gNode) -= itemp; *(ckt->CKTrhs + here->B1dNodePrime) += temp; *(ckt->CKTirhs + here->B1dNodePrime) += itemp; /* here->B1gbd term over */ /* all done */ } break; case D_THRF1: /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */ { /* draincurrent term */ r1h1x = *(job->r1H1ptr + here->B1gNode) - *(job->r1H1ptr + here->B1sNodePrime); i1h1x = *(job->i1H1ptr + here->B1gNode) - *(job->i1H1ptr + here->B1sNodePrime); r1h1y = *(job->r1H1ptr + here->B1bNode) - *(job->r1H1ptr + here->B1sNodePrime); i1h1y = *(job->i1H1ptr + here->B1bNode) - *(job->i1H1ptr + here->B1sNodePrime); r1h1z = *(job->r1H1ptr + here->B1dNodePrime) - *(job->r1H1ptr + here->B1sNodePrime); i1h1z = *(job->i1H1ptr + here->B1dNodePrime) - *(job->i1H1ptr + here->B1sNodePrime); r2h11x = *(job->r2H11ptr + here->B1gNode) - *(job->r2H11ptr + here->B1sNodePrime); i2h11x = *(job->i2H11ptr + here->B1gNode) - *(job->i2H11ptr + here->B1sNodePrime); r2h11y = *(job->r2H11ptr + here->B1bNode) - *(job->r2H11ptr + here->B1sNodePrime); i2h11y = *(job->i2H11ptr + here->B1bNode) - *(job->i2H11ptr + here->B1sNodePrime); r2h11z = *(job->r2H11ptr + here->B1dNodePrime) - *(job->r2H11ptr + here->B1sNodePrime); i2h11z = *(job->i2H11ptr + here->B1dNodePrime) - *(job->i2H11ptr + here->B1sNodePrime); /* draincurrent is a function of vgs,vbs,and vds; * have got their linear kernels; now to call * load functions */ temp = DFn3F1(here->DrC_x2, here->DrC_y2, here->DrC_z2, here->DrC_xy, here->DrC_yz, here->DrC_xz, here->DrC_x3, here->DrC_y3, here->DrC_z3, here->DrC_x2y, here->DrC_x2z, here->DrC_xy2, here->DrC_y2z, here->DrC_xz2, here->DrC_yz2, here->DrC_xyz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z, r2h11x, i2h11x, r2h11y, i2h11y, r2h11z, i2h11z); itemp = DFi3F1(here->DrC_x2, here->DrC_y2, here->DrC_z2, here->DrC_xy, here->DrC_yz, here->DrC_xz, here->DrC_x3, here->DrC_y3, here->DrC_z3, here->DrC_x2y, here->DrC_x2z, here->DrC_xy2, here->DrC_y2z, here->DrC_xz2, here->DrC_yz2, here->DrC_xyz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z, r2h11x, i2h11x, r2h11y, i2h11y, r2h11z, i2h11z); *(ckt->CKTrhs + here->B1dNodePrime) -= temp; *(ckt->CKTirhs + here->B1dNodePrime) -= itemp; *(ckt->CKTrhs + here->B1sNodePrime) += temp; *(ckt->CKTirhs + here->B1sNodePrime) += itemp; /* draincurrent term loading over */ /* loading qg term */ /* kernels for vgs,vbs and vds already set up */ temp = -ckt->CKTomega * DFi3F1(here->qg_x2, here->qg_y2, here->qg_z2, here->qg_xy, here->qg_yz, here->qg_xz, here->qg_x3, here->qg_y3, here->qg_z3, here->qg_x2y, here->qg_x2z, here->qg_xy2, here->qg_y2z, here->qg_xz2, here->qg_yz2, here->qg_xyz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z, r2h11x, i2h11x, r2h11y, i2h11y, r2h11z, i2h11z); itemp = ckt->CKTomega * DFn3F1(here->qg_x2, here->qg_y2, here->qg_z2, here->qg_xy, here->qg_yz, here->qg_xz, here->qg_x3, here->qg_y3, here->qg_z3, here->qg_x2y, here->qg_x2z, here->qg_xy2, here->qg_y2z, here->qg_xz2, here->qg_yz2, here->qg_xyz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z, r2h11x, i2h11x, r2h11y, i2h11y, r2h11z, i2h11z); *(ckt->CKTrhs + here->B1gNode) -= temp; *(ckt->CKTirhs + here->B1gNode) -= itemp; *(ckt->CKTrhs + here->B1sNodePrime) += temp; *(ckt->CKTirhs + here->B1sNodePrime) += itemp; /* qg term over */ /* loading qb term */ /* kernels for vgs,vbs and vds already set up */ temp = -ckt->CKTomega * DFi3F1(here->qb_x2, here->qb_y2, here->qb_z2, here->qb_xy, here->qb_yz, here->qb_xz, here->qb_x3, here->qb_y3, here->qb_z3, here->qb_x2y, here->qb_x2z, here->qb_xy2, here->qb_y2z, here->qb_xz2, here->qb_yz2, here->qb_xyz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z, r2h11x, i2h11x, r2h11y, i2h11y, r2h11z, i2h11z); itemp = ckt->CKTomega * DFn3F1(here->qb_x2, here->qb_y2, here->qb_z2, here->qb_xy, here->qb_yz, here->qb_xz, here->qb_x3, here->qb_y3, here->qb_z3, here->qb_x2y, here->qb_x2z, here->qb_xy2, here->qb_y2z, here->qb_xz2, here->qb_yz2, here->qb_xyz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z, r2h11x, i2h11x, r2h11y, i2h11y, r2h11z, i2h11z); *(ckt->CKTrhs + here->B1bNode) -= temp; *(ckt->CKTirhs + here->B1bNode) -= itemp; *(ckt->CKTrhs + here->B1sNodePrime) += temp; *(ckt->CKTirhs + here->B1sNodePrime) += itemp; /* qb term over */ /* loading qd term */ /* kernels for vgs,vbs and vds already set up */ temp = -ckt->CKTomega * DFi3F1(here->qd_x2, here->qd_y2, here->qd_z2, here->qd_xy, here->qd_yz, here->qd_xz, here->qd_x3, here->qd_y3, here->qd_z3, here->qd_x2y, here->qd_x2z, here->qd_xy2, here->qd_y2z, here->qd_xz2, here->qd_yz2, here->qd_xyz, r1h1x, i1h1x, r1h1y, i1h1y, r1h1z, i1h1z, r2h11x, i2h11x, r2h11y, i2h11y, r2h11z, i2h11z); itemp = ckt->CKTomega * DFn3F1(here->qd_x2, here->qd_y2,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -