1 /********** 2 Copyright 1990 Regents of the University of California. All rights reserved. 3 Author: 1985 Thomas L. Quarles 4 **********/ 5 /* 6 */ 7 8 /* 9 * This routine sets model parameters for 10 * BJTs in the circuit. 11 */ 12 13 #include "ngspice/ngspice.h" 14 #include "ngspice/const.h" 15 #include "ngspice/ifsim.h" 16 #include "bjtdefs.h" 17 #include "ngspice/sperror.h" 18 #include "ngspice/suffix.h" 19 20 21 int BJTmParam(int param,IFvalue * value,GENmodel * inModel)22BJTmParam(int param, IFvalue *value, GENmodel *inModel) 23 { 24 BJTmodel *mods = (BJTmodel*)inModel; 25 26 switch(param) { 27 case BJT_MOD_NPN: 28 if(value->iValue) { 29 mods->BJTtype = NPN; 30 } 31 break; 32 case BJT_MOD_PNP: 33 if(value->iValue) { 34 mods->BJTtype = PNP; 35 } 36 break; 37 case BJT_MOD_SUBS: 38 mods->BJTsubs = value->iValue; 39 mods->BJTsubsGiven = TRUE; 40 break; 41 case BJT_MOD_TNOM: 42 mods->BJTtnom = value->rValue+CONSTCtoK; 43 mods->BJTtnomGiven = TRUE; 44 break; 45 case BJT_MOD_IS: 46 mods->BJTsatCur = value->rValue; 47 mods->BJTsatCurGiven = TRUE; 48 break; 49 case BJT_MOD_BF: 50 mods->BJTbetaF = value->rValue; 51 mods->BJTbetaFGiven = TRUE; 52 break; 53 case BJT_MOD_NF: 54 mods->BJTemissionCoeffF = value->rValue; 55 mods->BJTemissionCoeffFGiven = TRUE; 56 break; 57 case BJT_MOD_VAF: 58 mods->BJTearlyVoltF = value->rValue; 59 mods->BJTearlyVoltFGiven = TRUE; 60 break; 61 case BJT_MOD_IKF: 62 mods->BJTrollOffF = value->rValue; 63 mods->BJTrollOffFGiven = TRUE; 64 break; 65 case BJT_MOD_ISE: 66 mods->BJTleakBEcurrent = value->rValue; 67 mods->BJTleakBEcurrentGiven = TRUE; 68 break; 69 case BJT_MOD_C2: 70 mods->BJTc2 = value->rValue; 71 mods->BJTc2Given=TRUE; 72 break; 73 case BJT_MOD_NE: 74 mods->BJTleakBEemissionCoeff = value->rValue; 75 mods->BJTleakBEemissionCoeffGiven = TRUE; 76 break; 77 case BJT_MOD_BR: 78 mods->BJTbetaR = value->rValue; 79 mods->BJTbetaRGiven = TRUE; 80 break; 81 case BJT_MOD_NR: 82 mods->BJTemissionCoeffR = value->rValue; 83 mods->BJTemissionCoeffRGiven = TRUE; 84 break; 85 case BJT_MOD_VAR: 86 mods->BJTearlyVoltR = value->rValue; 87 mods->BJTearlyVoltRGiven = TRUE; 88 break; 89 case BJT_MOD_IKR: 90 mods->BJTrollOffR = value->rValue; 91 mods->BJTrollOffRGiven = TRUE; 92 break; 93 case BJT_MOD_ISC: 94 mods->BJTleakBCcurrent = value->rValue; 95 mods->BJTleakBCcurrentGiven = TRUE; 96 break; 97 case BJT_MOD_C4: 98 mods->BJTc4 = value->rValue; 99 mods->BJTc4Given=TRUE; 100 break; 101 case BJT_MOD_NC: 102 mods->BJTleakBCemissionCoeff = value->rValue; 103 mods->BJTleakBCemissionCoeffGiven = TRUE; 104 break; 105 case BJT_MOD_RB: 106 mods->BJTbaseResist = value->rValue; 107 mods->BJTbaseResistGiven = TRUE; 108 break; 109 case BJT_MOD_IRB: 110 mods->BJTbaseCurrentHalfResist = value->rValue; 111 mods->BJTbaseCurrentHalfResistGiven = TRUE; 112 break; 113 case BJT_MOD_RBM: 114 mods->BJTminBaseResist = value->rValue; 115 mods->BJTminBaseResistGiven = TRUE; 116 break; 117 case BJT_MOD_RE: 118 mods->BJTemitterResist = value->rValue; 119 mods->BJTemitterResistGiven = TRUE; 120 break; 121 case BJT_MOD_RC: 122 mods->BJTcollectorResist = value->rValue; 123 mods->BJTcollectorResistGiven = TRUE; 124 break; 125 case BJT_MOD_CJE: 126 mods->BJTdepletionCapBE = value->rValue; 127 mods->BJTdepletionCapBEGiven = TRUE; 128 break; 129 case BJT_MOD_VJE: 130 mods->BJTpotentialBE = value->rValue; 131 mods->BJTpotentialBEGiven = TRUE; 132 break; 133 case BJT_MOD_MJE: 134 mods->BJTjunctionExpBE = value->rValue; 135 mods->BJTjunctionExpBEGiven = TRUE; 136 break; 137 case BJT_MOD_TF: 138 mods->BJTtransitTimeF = value->rValue; 139 mods->BJTtransitTimeFGiven = TRUE; 140 break; 141 case BJT_MOD_XTF: 142 mods->BJTtransitTimeBiasCoeffF = value->rValue; 143 mods->BJTtransitTimeBiasCoeffFGiven = TRUE; 144 break; 145 case BJT_MOD_VTF: 146 mods->BJTtransitTimeFVBC = value->rValue; 147 mods->BJTtransitTimeFVBCGiven = TRUE; 148 break; 149 case BJT_MOD_ITF: 150 mods->BJTtransitTimeHighCurrentF = value->rValue; 151 mods->BJTtransitTimeHighCurrentFGiven = TRUE; 152 break; 153 case BJT_MOD_PTF: 154 mods->BJTexcessPhase = value->rValue; 155 mods->BJTexcessPhaseGiven = TRUE; 156 break; 157 case BJT_MOD_CJC: 158 mods->BJTdepletionCapBC = value->rValue; 159 mods->BJTdepletionCapBCGiven = TRUE; 160 break; 161 case BJT_MOD_VJC: 162 mods->BJTpotentialBC = value->rValue; 163 mods->BJTpotentialBCGiven = TRUE; 164 break; 165 case BJT_MOD_MJC: 166 mods->BJTjunctionExpBC = value->rValue; 167 mods->BJTjunctionExpBCGiven = TRUE; 168 break; 169 case BJT_MOD_XCJC: 170 mods->BJTbaseFractionBCcap = value->rValue; 171 mods->BJTbaseFractionBCcapGiven = TRUE; 172 break; 173 case BJT_MOD_TR: 174 mods->BJTtransitTimeR = value->rValue; 175 mods->BJTtransitTimeRGiven = TRUE; 176 break; 177 case BJT_MOD_CJS: 178 mods->BJTcapSub = value->rValue; 179 mods->BJTcapSubGiven = TRUE; 180 break; 181 case BJT_MOD_VJS: 182 mods->BJTpotentialSubstrate = value->rValue; 183 mods->BJTpotentialSubstrateGiven = TRUE; 184 break; 185 case BJT_MOD_MJS: 186 mods->BJTexponentialSubstrate = value->rValue; 187 mods->BJTexponentialSubstrateGiven = TRUE; 188 break; 189 case BJT_MOD_XTB: 190 mods->BJTbetaExp = value->rValue; 191 mods->BJTbetaExpGiven = TRUE; 192 break; 193 case BJT_MOD_EG: 194 mods->BJTenergyGap = value->rValue; 195 mods->BJTenergyGapGiven = TRUE; 196 break; 197 case BJT_MOD_XTI: 198 mods->BJTtempExpIS = value->rValue; 199 mods->BJTtempExpISGiven = TRUE; 200 break; 201 case BJT_MOD_FC: 202 mods->BJTdepletionCapCoeff = value->rValue; 203 mods->BJTdepletionCapCoeffGiven = TRUE; 204 break; 205 case BJT_MOD_KF: 206 mods->BJTfNcoef = value->rValue; 207 mods->BJTfNcoefGiven = TRUE; 208 break; 209 case BJT_MOD_AF: 210 mods->BJTfNexp = value->rValue; 211 mods->BJTfNexpGiven = TRUE; 212 break; 213 case BJT_MOD_ISS: 214 mods->BJTsubSatCur = value->rValue; 215 mods->BJTsubSatCurGiven = TRUE; 216 break; 217 case BJT_MOD_NS: 218 mods->BJTemissionCoeffS = value->rValue; 219 mods->BJTemissionCoeffSGiven = TRUE; 220 break; 221 case BJT_MOD_RCO: 222 mods->BJTintCollResist = value->rValue; 223 mods->BJTintCollResistGiven = TRUE; 224 break; 225 case BJT_MOD_VO: 226 mods->BJTepiSatVoltage = value->rValue; 227 mods->BJTepiSatVoltageGiven = TRUE; 228 break; 229 case BJT_MOD_GAMMA: 230 mods->BJTepiDoping = value->rValue; 231 mods->BJTepiDopingGiven = TRUE; 232 break; 233 case BJT_MOD_QCO: 234 mods->BJTepiCharge = value->rValue; 235 mods->BJTepiChargeGiven = TRUE; 236 break; 237 case BJT_MOD_TLEV: 238 mods->BJTtlev = value->iValue; 239 mods->BJTtlevGiven = TRUE; 240 break; 241 case BJT_MOD_TLEVC: 242 mods->BJTtlevc = value->iValue; 243 mods->BJTtlevcGiven = TRUE; 244 break; 245 case BJT_MOD_TBF1: 246 mods->BJTtbf1 = value->rValue; 247 mods->BJTtbf1Given = TRUE; 248 break; 249 case BJT_MOD_TBF2: 250 mods->BJTtbf2 = value->rValue; 251 mods->BJTtbf2Given = TRUE; 252 break; 253 case BJT_MOD_TBR1: 254 mods->BJTtbr1 = value->rValue; 255 mods->BJTtbr1Given = TRUE; 256 break; 257 case BJT_MOD_TBR2: 258 mods->BJTtbr2 = value->rValue; 259 mods->BJTtbr2Given = TRUE; 260 break; 261 case BJT_MOD_TIKF1: 262 mods->BJTtikf1 = value->rValue; 263 mods->BJTtikf1Given = TRUE; 264 break; 265 case BJT_MOD_TIKF2: 266 mods->BJTtikf2 = value->rValue; 267 mods->BJTtikf2Given = TRUE; 268 break; 269 case BJT_MOD_TIKR1: 270 mods->BJTtikr1 = value->rValue; 271 mods->BJTtikr1Given = TRUE; 272 break; 273 case BJT_MOD_TIKR2: 274 mods->BJTtikr2 = value->rValue; 275 mods->BJTtikr2Given = TRUE; 276 break; 277 case BJT_MOD_TIRB1: 278 mods->BJTtirb1 = value->rValue; 279 mods->BJTtirb1Given = TRUE; 280 break; 281 case BJT_MOD_TIRB2: 282 mods->BJTtirb2 = value->rValue; 283 mods->BJTtirb2Given = TRUE; 284 break; 285 case BJT_MOD_TNC1: 286 mods->BJTtnc1 = value->rValue; 287 mods->BJTtnc1Given = TRUE; 288 break; 289 case BJT_MOD_TNC2: 290 mods->BJTtnc2 = value->rValue; 291 mods->BJTtnc2Given = TRUE; 292 break; 293 case BJT_MOD_TNE1: 294 mods->BJTtne1 = value->rValue; 295 mods->BJTtne1Given = TRUE; 296 break; 297 case BJT_MOD_TNE2: 298 mods->BJTtne2 = value->rValue; 299 mods->BJTtne2Given = TRUE; 300 break; 301 case BJT_MOD_TNF1: 302 mods->BJTtnf1 = value->rValue; 303 mods->BJTtnf1Given = TRUE; 304 break; 305 case BJT_MOD_TNF2: 306 mods->BJTtnf2 = value->rValue; 307 mods->BJTtnf2Given = TRUE; 308 break; 309 case BJT_MOD_TNR1: 310 mods->BJTtnr1 = value->rValue; 311 mods->BJTtnr1Given = TRUE; 312 break; 313 case BJT_MOD_TNR2: 314 mods->BJTtnr2 = value->rValue; 315 mods->BJTtnr2Given = TRUE; 316 break; 317 case BJT_MOD_TRB1: 318 mods->BJTtrb1 = value->rValue; 319 mods->BJTtrb1Given = TRUE; 320 break; 321 case BJT_MOD_TRB2: 322 mods->BJTtrb2 = value->rValue; 323 mods->BJTtrb2Given = TRUE; 324 break; 325 case BJT_MOD_TRC1: 326 mods->BJTtrc1 = value->rValue; 327 mods->BJTtrc1Given = TRUE; 328 break; 329 case BJT_MOD_TRC2: 330 mods->BJTtrc2 = value->rValue; 331 mods->BJTtrc2Given = TRUE; 332 break; 333 case BJT_MOD_TRE1: 334 mods->BJTtre1 = value->rValue; 335 mods->BJTtre1Given = TRUE; 336 break; 337 case BJT_MOD_TRE2: 338 mods->BJTtre2 = value->rValue; 339 mods->BJTtre2Given = TRUE; 340 break; 341 case BJT_MOD_TRM1: 342 mods->BJTtrm1 = value->rValue; 343 mods->BJTtrm1Given = TRUE; 344 break; 345 case BJT_MOD_TRM2: 346 mods->BJTtrm2 = value->rValue; 347 mods->BJTtrm2Given = TRUE; 348 break; 349 case BJT_MOD_TVAF1: 350 mods->BJTtvaf1 = value->rValue; 351 mods->BJTtvaf1Given = TRUE; 352 break; 353 case BJT_MOD_TVAF2: 354 mods->BJTtvaf2 = value->rValue; 355 mods->BJTtvaf2Given = TRUE; 356 break; 357 case BJT_MOD_TVAR1: 358 mods->BJTtvar1 = value->rValue; 359 mods->BJTtvar1Given = TRUE; 360 break; 361 case BJT_MOD_TVAR2: 362 mods->BJTtvar2 = value->rValue; 363 mods->BJTtvar2Given = TRUE; 364 break; 365 case BJT_MOD_CTC: 366 mods->BJTctc = value->rValue; 367 mods->BJTctcGiven = TRUE; 368 break; 369 case BJT_MOD_CTE: 370 mods->BJTcte = value->rValue; 371 mods->BJTcteGiven = TRUE; 372 break; 373 case BJT_MOD_CTS: 374 mods->BJTcts = value->rValue; 375 mods->BJTctsGiven = TRUE; 376 break; 377 case BJT_MOD_TVJE: 378 mods->BJTtvje = value->rValue; 379 mods->BJTtvjeGiven = TRUE; 380 break; 381 case BJT_MOD_TVJC: 382 mods->BJTtvjc = value->rValue; 383 mods->BJTtvjcGiven = TRUE; 384 break; 385 case BJT_MOD_TVJS: 386 mods->BJTtvjs = value->rValue; 387 mods->BJTtvjsGiven = TRUE; 388 break; 389 case BJT_MOD_TITF1: 390 mods->BJTtitf1 = value->rValue; 391 mods->BJTtitf1Given = TRUE; 392 break; 393 case BJT_MOD_TITF2: 394 mods->BJTtitf2 = value->rValue; 395 mods->BJTtitf2Given = TRUE; 396 break; 397 case BJT_MOD_TTF1: 398 mods->BJTttf1 = value->rValue; 399 mods->BJTttf1Given = TRUE; 400 break; 401 case BJT_MOD_TTF2: 402 mods->BJTttf2 = value->rValue; 403 mods->BJTttf2Given = TRUE; 404 break; 405 case BJT_MOD_TTR1: 406 mods->BJTttr1 = value->rValue; 407 mods->BJTttr1Given = TRUE; 408 break; 409 case BJT_MOD_TTR2: 410 mods->BJTttr2 = value->rValue; 411 mods->BJTttr2Given = TRUE; 412 break; 413 case BJT_MOD_TMJE1: 414 mods->BJTtmje1 = value->rValue; 415 mods->BJTtmje1Given = TRUE; 416 break; 417 case BJT_MOD_TMJE2: 418 mods->BJTtmje2 = value->rValue; 419 mods->BJTtmje2Given = TRUE; 420 break; 421 case BJT_MOD_TMJC1: 422 mods->BJTtmjc1 = value->rValue; 423 mods->BJTtmjc1Given = TRUE; 424 break; 425 case BJT_MOD_TMJC2: 426 mods->BJTtmjc2 = value->rValue; 427 mods->BJTtmjc2Given = TRUE; 428 break; 429 case BJT_MOD_TMJS1: 430 mods->BJTtmjs1 = value->rValue; 431 mods->BJTtmjs1Given = TRUE; 432 break; 433 case BJT_MOD_TMJS2: 434 mods->BJTtmjs2 = value->rValue; 435 mods->BJTtmjs2Given = TRUE; 436 break; 437 case BJT_MOD_TNS1: 438 mods->BJTtns1 = value->rValue; 439 mods->BJTtns1Given = TRUE; 440 break; 441 case BJT_MOD_TNS2: 442 mods->BJTtns2 = value->rValue; 443 mods->BJTtns2Given = TRUE; 444 break; 445 case BJT_MOD_NKF: 446 mods->BJTnkf = value->rValue; 447 mods->BJTnkfGiven = TRUE; 448 break; 449 case BJT_MOD_TIS1: 450 mods->BJTtis1 = value->rValue; 451 mods->BJTtis1Given = TRUE; 452 break; 453 case BJT_MOD_TIS2: 454 mods->BJTtis2 = value->rValue; 455 mods->BJTtis2Given = TRUE; 456 break; 457 case BJT_MOD_TISE1: 458 mods->BJTtise1 = value->rValue; 459 mods->BJTtise1Given = TRUE; 460 break; 461 case BJT_MOD_TISE2: 462 mods->BJTtise2 = value->rValue; 463 mods->BJTtise2Given = TRUE; 464 break; 465 case BJT_MOD_TISC1: 466 mods->BJTtisc1 = value->rValue; 467 mods->BJTtisc1Given = TRUE; 468 break; 469 case BJT_MOD_TISC2: 470 mods->BJTtisc2 = value->rValue; 471 mods->BJTtisc2Given = TRUE; 472 break; 473 case BJT_MOD_TISS1: 474 mods->BJTtiss1 = value->rValue; 475 mods->BJTtiss1Given = TRUE; 476 break; 477 case BJT_MOD_TISS2: 478 mods->BJTtiss2 = value->rValue; 479 mods->BJTtiss2Given = TRUE; 480 break; 481 case BJT_MOD_QUASIMOD: 482 mods->BJTquasimod = value->iValue; 483 mods->BJTquasimodGiven = TRUE; 484 break; 485 case BJT_MOD_EGQS: 486 mods->BJTenergyGapQS = value->rValue; 487 mods->BJTenergyGapQSGiven = TRUE; 488 break; 489 case BJT_MOD_XRCI: 490 mods->BJTtempExpRCI = value->rValue; 491 mods->BJTtempExpRCIGiven = TRUE; 492 break; 493 case BJT_MOD_XD: 494 mods->BJTtempExpVO = value->rValue; 495 mods->BJTtempExpVOGiven = TRUE; 496 break; 497 case BJT_MOD_VBE_MAX: 498 mods->BJTvbeMax = value->rValue; 499 mods->BJTvbeMaxGiven = TRUE; 500 break; 501 case BJT_MOD_VBC_MAX: 502 mods->BJTvbcMax = value->rValue; 503 mods->BJTvbcMaxGiven = TRUE; 504 break; 505 case BJT_MOD_VCE_MAX: 506 mods->BJTvceMax = value->rValue; 507 mods->BJTvceMaxGiven = TRUE; 508 break; 509 default: 510 return(E_BADPARM); 511 } 512 return(OK); 513 } 514