From 921aca9d7ec35c4340be87d1b06ac964e152e530 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sat, 14 Sep 2013 14:03:49 +0200 Subject: [PATCH] allow geometry scaling by option `scale' --- src/spicelib/devices/bsim4/b4par.c | 18 ++++++++++++------ src/spicelib/devices/bsimsoi/b4soipar.c | 18 ++++++++++++------ src/spicelib/devices/hisim2/hsm2par.c | 18 ++++++++++++------ src/spicelib/devices/hisimhv1/hsmhvpar.c | 18 ++++++++++++------ src/spicelib/devices/mos1/mos1par.c | 18 ++++++++++++------ src/spicelib/devices/mos2/mos2par.c | 18 ++++++++++++------ src/spicelib/devices/mos3/mos3par.c | 18 ++++++++++++------ 7 files changed, 84 insertions(+), 42 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4par.c b/src/spicelib/devices/bsim4/b4par.c index a8a91d948..4812242f6 100644 --- a/src/spicelib/devices/bsim4/b4par.c +++ b/src/spicelib/devices/bsim4/b4par.c @@ -19,6 +19,7 @@ #include "bsim4def.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" +#include "ngspice/fteext.h" int BSIM4param( @@ -27,17 +28,22 @@ IFvalue *value, GENinstance *inst, IFvalue *select) { + double scale; + BSIM4instance *here = (BSIM4instance*)inst; NG_IGNORE(select); + if (!cp_getvar("scale", CP_REAL, &scale)) + scale = 1; + switch(param) { case BSIM4_W: - here->BSIM4w = value->rValue; + here->BSIM4w = value->rValue * scale; here->BSIM4wGiven = TRUE; break; case BSIM4_L: - here->BSIM4l = value->rValue; + here->BSIM4l = value->rValue * scale; here->BSIM4lGiven = TRUE; break; case BSIM4_M: @@ -53,19 +59,19 @@ IFvalue *select) here->BSIM4minGiven = TRUE; break; case BSIM4_AS: - here->BSIM4sourceArea = value->rValue; + here->BSIM4sourceArea = value->rValue * scale * scale; here->BSIM4sourceAreaGiven = TRUE; break; case BSIM4_AD: - here->BSIM4drainArea = value->rValue; + here->BSIM4drainArea = value->rValue * scale * scale; here->BSIM4drainAreaGiven = TRUE; break; case BSIM4_PS: - here->BSIM4sourcePerimeter = value->rValue; + here->BSIM4sourcePerimeter = value->rValue * scale; here->BSIM4sourcePerimeterGiven = TRUE; break; case BSIM4_PD: - here->BSIM4drainPerimeter = value->rValue; + here->BSIM4drainPerimeter = value->rValue * scale; here->BSIM4drainPerimeterGiven = TRUE; break; case BSIM4_NRS: diff --git a/src/spicelib/devices/bsimsoi/b4soipar.c b/src/spicelib/devices/bsimsoi/b4soipar.c index 49fc3b800..6f027524b 100644 --- a/src/spicelib/devices/bsimsoi/b4soipar.c +++ b/src/spicelib/devices/bsimsoi/b4soipar.c @@ -19,6 +19,7 @@ #include "b4soidef.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" +#include "ngspice/fteext.h" int B4SOIparam( @@ -27,17 +28,22 @@ IFvalue *value, GENinstance *inst, IFvalue *select) { + double scale; + B4SOIinstance *here = (B4SOIinstance*)inst; NG_IGNORE(select); + if (!cp_getvar("scale", CP_REAL, &scale)) + scale = 1; + switch(param) { case B4SOI_W: - here->B4SOIw = value->rValue; + here->B4SOIw = value->rValue * scale; here->B4SOIwGiven = TRUE; break; case B4SOI_L: - here->B4SOIl = value->rValue; + here->B4SOIl = value->rValue * scale; here->B4SOIlGiven = TRUE; break; case B4SOI_M: @@ -45,19 +51,19 @@ IFvalue *select) here->B4SOImGiven = TRUE; break; case B4SOI_AS: - here->B4SOIsourceArea = value->rValue; + here->B4SOIsourceArea = value->rValue * scale * scale; here->B4SOIsourceAreaGiven = TRUE; break; case B4SOI_AD: - here->B4SOIdrainArea = value->rValue; + here->B4SOIdrainArea = value->rValue * scale * scale; here->B4SOIdrainAreaGiven = TRUE; break; case B4SOI_PS: - here->B4SOIsourcePerimeter = value->rValue; + here->B4SOIsourcePerimeter = value->rValue * scale; here->B4SOIsourcePerimeterGiven = TRUE; break; case B4SOI_PD: - here->B4SOIdrainPerimeter = value->rValue; + here->B4SOIdrainPerimeter = value->rValue * scale; here->B4SOIdrainPerimeterGiven = TRUE; break; case B4SOI_NRS: diff --git a/src/spicelib/devices/hisim2/hsm2par.c b/src/spicelib/devices/hisim2/hsm2par.c index 2936f9f6f..02910e852 100644 --- a/src/spicelib/devices/hisim2/hsm2par.c +++ b/src/spicelib/devices/hisim2/hsm2par.c @@ -20,6 +20,7 @@ #include "hsm2def.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" +#include "ngspice/fteext.h" int HSM2param( int param, @@ -27,33 +28,38 @@ int HSM2param( GENinstance *inst, IFvalue *select) { + double scale; + HSM2instance *here = (HSM2instance*)inst; NG_IGNORE(select); + if (!cp_getvar("scale", CP_REAL, &scale)) + scale = 1; + switch (param) { case HSM2_W: - here->HSM2_w = value->rValue; + here->HSM2_w = value->rValue * scale; here->HSM2_w_Given = TRUE; break; case HSM2_L: - here->HSM2_l = value->rValue; + here->HSM2_l = value->rValue * scale; here->HSM2_l_Given = TRUE; break; case HSM2_AS: - here->HSM2_as = value->rValue; + here->HSM2_as = value->rValue * scale * scale; here->HSM2_as_Given = TRUE; break; case HSM2_AD: - here->HSM2_ad = value->rValue; + here->HSM2_ad = value->rValue * scale * scale; here->HSM2_ad_Given = TRUE; break; case HSM2_PS: - here->HSM2_ps = value->rValue; + here->HSM2_ps = value->rValue * scale; here->HSM2_ps_Given = TRUE; break; case HSM2_PD: - here->HSM2_pd = value->rValue; + here->HSM2_pd = value->rValue * scale; here->HSM2_pd_Given = TRUE; break; case HSM2_NRS: diff --git a/src/spicelib/devices/hisimhv1/hsmhvpar.c b/src/spicelib/devices/hisimhv1/hsmhvpar.c index f55c79e74..5ad59ebcb 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvpar.c +++ b/src/spicelib/devices/hisimhv1/hsmhvpar.c @@ -20,6 +20,7 @@ #include "hsmhvdef.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" +#include "ngspice/fteext.h" int HSMHVparam( int param, @@ -27,10 +28,15 @@ int HSMHVparam( GENinstance *inst, IFvalue *select) { + double scale; + HSMHVinstance *here = (HSMHVinstance*)inst; NG_IGNORE(select); + if (!cp_getvar("scale", CP_REAL, &scale)) + scale = 1; + switch (param) { case HSMHV_COSELFHEAT: here->HSMHV_coselfheat = value->iValue; @@ -41,27 +47,27 @@ int HSMHVparam( here->HSMHV_cosubnode_Given = TRUE; break; case HSMHV_W: - here->HSMHV_w = value->rValue; + here->HSMHV_w = value->rValue * scale; here->HSMHV_w_Given = TRUE; break; case HSMHV_L: - here->HSMHV_l = value->rValue; + here->HSMHV_l = value->rValue * scale; here->HSMHV_l_Given = TRUE; break; case HSMHV_AS: - here->HSMHV_as = value->rValue; + here->HSMHV_as = value->rValue * scale * scale; here->HSMHV_as_Given = TRUE; break; case HSMHV_AD: - here->HSMHV_ad = value->rValue; + here->HSMHV_ad = value->rValue * scale * scale; here->HSMHV_ad_Given = TRUE; break; case HSMHV_PS: - here->HSMHV_ps = value->rValue; + here->HSMHV_ps = value->rValue * scale; here->HSMHV_ps_Given = TRUE; break; case HSMHV_PD: - here->HSMHV_pd = value->rValue; + here->HSMHV_pd = value->rValue * scale; here->HSMHV_pd_Given = TRUE; break; case HSMHV_NRS: diff --git a/src/spicelib/devices/mos1/mos1par.c b/src/spicelib/devices/mos1/mos1par.c index 829563764..ecd400918 100644 --- a/src/spicelib/devices/mos1/mos1par.c +++ b/src/spicelib/devices/mos1/mos1par.c @@ -12,16 +12,22 @@ Modified: 2000 AlansFixes #include "mos1defs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" +#include "ngspice/fteext.h" /* ARGSUSED */ int MOS1param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { + double scale; + MOS1instance *here = (MOS1instance *)inst; NG_IGNORE(select); + if (!cp_getvar("scale", CP_REAL, &scale)) + scale = 1; + switch(param) { case MOS1_TEMP: here->MOS1temp = value->rValue+CONSTCtoK; @@ -36,27 +42,27 @@ MOS1param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->MOS1mGiven = TRUE; break; case MOS1_W: - here->MOS1w = value->rValue; + here->MOS1w = value->rValue * scale; here->MOS1wGiven = TRUE; break; case MOS1_L: - here->MOS1l = value->rValue; + here->MOS1l = value->rValue * scale; here->MOS1lGiven = TRUE; break; case MOS1_AS: - here->MOS1sourceArea = value->rValue; + here->MOS1sourceArea = value->rValue * scale * scale; here->MOS1sourceAreaGiven = TRUE; break; case MOS1_AD: - here->MOS1drainArea = value->rValue; + here->MOS1drainArea = value->rValue * scale * scale; here->MOS1drainAreaGiven = TRUE; break; case MOS1_PS: - here->MOS1sourcePerimiter = value->rValue; + here->MOS1sourcePerimiter = value->rValue * scale; here->MOS1sourcePerimiterGiven = TRUE; break; case MOS1_PD: - here->MOS1drainPerimiter = value->rValue; + here->MOS1drainPerimiter = value->rValue * scale; here->MOS1drainPerimiterGiven = TRUE; break; case MOS1_NRS: diff --git a/src/spicelib/devices/mos2/mos2par.c b/src/spicelib/devices/mos2/mos2par.c index ac7ef7b42..f09259747 100644 --- a/src/spicelib/devices/mos2/mos2par.c +++ b/src/spicelib/devices/mos2/mos2par.c @@ -12,6 +12,7 @@ Modified: 2000 AlansFixes #include "mos2defs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" +#include "ngspice/fteext.h" /* ARGSUSED */ @@ -19,10 +20,15 @@ int MOS2param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { + double scale; + MOS2instance *here = (MOS2instance *)inst; NG_IGNORE(select); + if (!cp_getvar("scale", CP_REAL, &scale)) + scale = 1; + switch(param) { case MOS2_TEMP: here->MOS2temp = value->rValue+CONSTCtoK; @@ -37,27 +43,27 @@ MOS2param(int param, IFvalue *value, GENinstance *inst, here->MOS2mGiven = TRUE; break; case MOS2_W: - here->MOS2w = value->rValue; + here->MOS2w = value->rValue * scale; here->MOS2wGiven = TRUE; break; case MOS2_L: - here->MOS2l = value->rValue; + here->MOS2l = value->rValue * scale; here->MOS2lGiven = TRUE; break; case MOS2_AS: - here->MOS2sourceArea = value->rValue; + here->MOS2sourceArea = value->rValue * scale * scale; here->MOS2sourceAreaGiven = TRUE; break; case MOS2_AD: - here->MOS2drainArea = value->rValue; + here->MOS2drainArea = value->rValue * scale * scale; here->MOS2drainAreaGiven = TRUE; break; case MOS2_PS: - here->MOS2sourcePerimiter = value->rValue; + here->MOS2sourcePerimiter = value->rValue * scale; here->MOS2sourcePerimiterGiven = TRUE; break; case MOS2_PD: - here->MOS2drainPerimiter = value->rValue; + here->MOS2drainPerimiter = value->rValue * scale; here->MOS2drainPerimiterGiven = TRUE; break; case MOS2_NRS: diff --git a/src/spicelib/devices/mos3/mos3par.c b/src/spicelib/devices/mos3/mos3par.c index 0e0227f7a..6a5320430 100644 --- a/src/spicelib/devices/mos3/mos3par.c +++ b/src/spicelib/devices/mos3/mos3par.c @@ -12,16 +12,22 @@ Modified: 2000 AlansFixes #include "mos3defs.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" +#include "ngspice/fteext.h" /* ARGSUSED */ int MOS3param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { + double scale; + MOS3instance *here = (MOS3instance *)inst; NG_IGNORE(select); + if (!cp_getvar("scale", CP_REAL, &scale)) + scale = 1; + switch(param) { case MOS3_M: @@ -29,27 +35,27 @@ MOS3param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->MOS3mGiven = TRUE; break; case MOS3_W: - here->MOS3w = value->rValue; + here->MOS3w = value->rValue * scale; here->MOS3wGiven = TRUE; break; case MOS3_L: - here->MOS3l = value->rValue; + here->MOS3l = value->rValue * scale; here->MOS3lGiven = TRUE; break; case MOS3_AS: - here->MOS3sourceArea = value->rValue; + here->MOS3sourceArea = value->rValue * scale * scale; here->MOS3sourceAreaGiven = TRUE; break; case MOS3_AD: - here->MOS3drainArea = value->rValue; + here->MOS3drainArea = value->rValue * scale * scale; here->MOS3drainAreaGiven = TRUE; break; case MOS3_PS: - here->MOS3sourcePerimiter = value->rValue; + here->MOS3sourcePerimiter = value->rValue * scale; here->MOS3sourcePerimiterGiven = TRUE; break; case MOS3_PD: - here->MOS3drainPerimiter = value->rValue; + here->MOS3drainPerimiter = value->rValue * scale; here->MOS3drainPerimiterGiven = TRUE; break; case MOS3_NRS: