From 88ef8f71fbf386479f856cd6dd2a28c13d37a829 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 5 Aug 2012 06:23:43 -0700 Subject: [PATCH] Added a function called DEVbindCSCComplexToReal in order to switch back from a Complex Matrix to a Real Matrix. This is useful inside the AC Analysis. BE CAREFUL that all the files involved in this change are generated automatically by a script! Added a flag that indicates if the matrix is Real or Complex Revisited AC Analysis using KLU. Now it's possible to have any sort of analysis in queue and all the jobs will be executed successfully. No more Segmentation Faults :) Removed the CSC Conversion from CKTop and moved to CKTsetup Solved some bugs in the KLU-SMP interface --- ChangeLog | 264 +++++++ src/include/ngspice/devdefs.h | 8 +- src/include/ngspice/smpdefs.h | 16 +- src/maths/KLU/klusmp.c | 37 +- src/maths/ni/niinit.c | 3 +- src/spicelib/analysis/acan.c | 81 +- src/spicelib/analysis/cktop.c | 85 -- src/spicelib/analysis/cktsetup.c | 87 +++ src/spicelib/devices/asrc/asrcinit.c | 1 + src/spicelib/devices/bjt/bjtbindCSC.c | 179 +++++ src/spicelib/devices/bjt/bjtext.h | 5 +- src/spicelib/devices/bjt/bjtinit.c | 1 + src/spicelib/devices/bsim1/b1bindCSC.c | 172 ++++ src/spicelib/devices/bsim1/bsim1ext.h | 5 +- src/spicelib/devices/bsim1/bsim1init.c | 1 + src/spicelib/devices/bsim2/b2bindCSC.c | 172 ++++ src/spicelib/devices/bsim2/bsim2ext.h | 5 +- src/spicelib/devices/bsim2/bsim2init.c | 1 + src/spicelib/devices/bsim3/b3bindCSC.c | 235 ++++++ src/spicelib/devices/bsim3/bsim3ext.h | 5 +- src/spicelib/devices/bsim3/bsim3init.c | 1 + .../devices/bsim3soi_dd/b3soiddbindCSC.c | 676 ++++++++++++++++ src/spicelib/devices/bsim3soi_dd/b3soiddext.h | 5 +- .../devices/bsim3soi_dd/b3soiddinit.c | 1 + .../devices/bsim3soi_fd/b3soifdbindCSC.c | 613 +++++++++++++++ src/spicelib/devices/bsim3soi_fd/b3soifdext.h | 5 +- .../devices/bsim3soi_fd/b3soifdinit.c | 1 + .../devices/bsim3soi_pd/b3soipdbindCSC.c | 473 +++++++++++ src/spicelib/devices/bsim3soi_pd/b3soipdext.h | 5 +- .../devices/bsim3soi_pd/b3soipdinit.c | 1 + src/spicelib/devices/bsim3v0/b3v0bindCSC.c | 235 ++++++ src/spicelib/devices/bsim3v0/bsim3v0ext.h | 5 +- src/spicelib/devices/bsim3v0/bsim3v0init.c | 1 + src/spicelib/devices/bsim3v1/b3v1bindCSC.c | 235 ++++++ src/spicelib/devices/bsim3v1/bsim3v1ext.h | 5 +- src/spicelib/devices/bsim3v1/bsim3v1init.c | 1 + src/spicelib/devices/bsim3v32/b3v32bindCSC.c | 235 ++++++ src/spicelib/devices/bsim3v32/bsim3v32ext.h | 5 +- src/spicelib/devices/bsim3v32/bsim3v32init.c | 1 + src/spicelib/devices/bsim4/b4bindCSC.c | 508 ++++++++++++ src/spicelib/devices/bsim4/bsim4ext.h | 5 +- src/spicelib/devices/bsim4/bsim4init.c | 5 +- src/spicelib/devices/bsim4v4/b4v4bindCSC.c | 508 ++++++++++++ src/spicelib/devices/bsim4v4/bsim4v4ext.h | 5 +- src/spicelib/devices/bsim4v4/bsim4v4init.c | 5 +- src/spicelib/devices/bsim4v5/b4v5bindCSC.c | 508 ++++++++++++ src/spicelib/devices/bsim4v5/bsim4v5ext.h | 5 +- src/spicelib/devices/bsim4v5/bsim4v5init.c | 5 +- src/spicelib/devices/bsim4v6/b4v6bindCSC.c | 508 ++++++++++++ src/spicelib/devices/bsim4v6/bsim4v6ext.h | 5 +- src/spicelib/devices/bsim4v6/bsim4v6init.c | 5 +- src/spicelib/devices/bsimsoi/b4soibindCSC.c | 732 ++++++++++++++++++ src/spicelib/devices/bsimsoi/b4soiext.h | 5 +- src/spicelib/devices/bsimsoi/b4soiinit.c | 1 + src/spicelib/devices/cap/capbindCSC.c | 82 +- src/spicelib/devices/cap/capext.h | 5 +- src/spicelib/devices/cap/capinit.c | 5 +- src/spicelib/devices/cap/capload.c | 1 - src/spicelib/devices/cccs/cccsbindCSC.c | 32 + src/spicelib/devices/cccs/cccsext.h | 5 +- src/spicelib/devices/cccs/cccsinit.c | 1 + src/spicelib/devices/ccvs/ccvsbindCSC.c | 53 ++ src/spicelib/devices/ccvs/ccvsext.h | 5 +- src/spicelib/devices/ccvs/ccvsinit.c | 1 + src/spicelib/devices/cpl/cplinit.c | 1 + src/spicelib/devices/csw/cswbindCSC.c | 46 ++ src/spicelib/devices/csw/cswext.h | 5 +- src/spicelib/devices/csw/cswinit.c | 1 + src/spicelib/devices/dio/diobindCSC.c | 67 ++ src/spicelib/devices/dio/dioext.h | 5 +- src/spicelib/devices/dio/dioinit.c | 1 + src/spicelib/devices/hfet1/hfetbindCSC.c | 214 +++++ src/spicelib/devices/hfet1/hfetext.h | 5 +- src/spicelib/devices/hfet1/hfetinit.c | 1 + src/spicelib/devices/hfet2/hfet2bindCSC.c | 123 +++ src/spicelib/devices/hfet2/hfet2ext.h | 5 +- src/spicelib/devices/hfet2/hfet2init.c | 1 + src/spicelib/devices/hisim2/hsm2bindCSC.c | 333 ++++++++ src/spicelib/devices/hisim2/hsm2ext.h | 5 +- src/spicelib/devices/hisim2/hsm2init.c | 1 + src/spicelib/devices/hisimhv1/hsmhvbindCSC.c | 669 ++++++++++++++++ src/spicelib/devices/hisimhv1/hsmhvext.h | 5 +- src/spicelib/devices/hisimhv1/hsmhvinit.c | 1 + src/spicelib/devices/ind/indMUTbindCSC.c | 85 ++ src/spicelib/devices/ind/indext.h | 10 +- src/spicelib/devices/ind/indinit.c | 2 + src/spicelib/devices/isrc/isrcinit.c | 1 + src/spicelib/devices/jfet/jfetbindCSC.c | 82 ++ src/spicelib/devices/jfet/jfetext.h | 5 +- src/spicelib/devices/jfet/jfetinit.c | 1 + src/spicelib/devices/jfet2/jfet2bindCSC.c | 82 ++ src/spicelib/devices/jfet2/jfet2ext.h | 5 +- src/spicelib/devices/jfet2/jfet2init.c | 1 + src/spicelib/devices/ltra/ltrabindCSC.c | 158 ++++ src/spicelib/devices/ltra/ltraext.h | 5 +- src/spicelib/devices/ltra/ltrainit.c | 1 + src/spicelib/devices/mes/mesbindCSC.c | 82 ++ src/spicelib/devices/mes/mesext.h | 5 +- src/spicelib/devices/mes/mesinit.c | 1 + src/spicelib/devices/mesa/mesabindCSC.c | 214 +++++ src/spicelib/devices/mesa/mesaext.h | 5 +- src/spicelib/devices/mesa/mesainit.c | 1 + src/spicelib/devices/mos1/mos1bindCSC.c | 172 ++++ src/spicelib/devices/mos1/mos1ext.h | 5 +- src/spicelib/devices/mos1/mos1init.c | 1 + src/spicelib/devices/mos2/mos2bindCSC.c | 172 ++++ src/spicelib/devices/mos2/mos2ext.h | 5 +- src/spicelib/devices/mos2/mos2init.c | 1 + src/spicelib/devices/mos3/mos3bindCSC.c | 172 ++++ src/spicelib/devices/mos3/mos3ext.h | 5 +- src/spicelib/devices/mos3/mos3init.c | 1 + src/spicelib/devices/mos6/mos6bindCSC.c | 172 ++++ src/spicelib/devices/mos6/mos6ext.h | 5 +- src/spicelib/devices/mos6/mos6init.c | 1 + src/spicelib/devices/mos9/mos9bindCSC.c | 172 ++++ src/spicelib/devices/mos9/mos9ext.h | 5 +- src/spicelib/devices/mos9/mos9init.c | 1 + src/spicelib/devices/res/resbindCSC.c | 46 ++ src/spicelib/devices/res/resext.h | 5 +- src/spicelib/devices/res/resinit.c | 1 + src/spicelib/devices/soi3/soi3bindCSC.c | 417 ++++++++++ src/spicelib/devices/soi3/soi3ext.h | 5 +- src/spicelib/devices/soi3/soi3init.c | 1 + src/spicelib/devices/sw/swbindCSC.c | 46 ++ src/spicelib/devices/sw/swext.h | 5 +- src/spicelib/devices/sw/swinit.c | 1 + src/spicelib/devices/tra/trabindCSC.c | 172 ++++ src/spicelib/devices/tra/traext.h | 5 +- src/spicelib/devices/tra/trainit.c | 1 + src/spicelib/devices/txl/txlbindCSC.c | 116 +++ src/spicelib/devices/txl/txlext.h | 6 +- src/spicelib/devices/txl/txlinit.c | 1 + src/spicelib/devices/urc/urcinit.c | 1 + src/spicelib/devices/vbic/vbicbindCSC.c | 375 +++++++++ src/spicelib/devices/vbic/vbicext.h | 5 +- src/spicelib/devices/vbic/vbicinit.c | 1 + src/spicelib/devices/vccs/vccsbindCSC.c | 46 ++ src/spicelib/devices/vccs/vccsext.h | 5 +- src/spicelib/devices/vccs/vccsinit.c | 1 + src/spicelib/devices/vcvs/vcvsbindCSC.c | 60 ++ src/spicelib/devices/vcvs/vcvsext.h | 5 +- src/spicelib/devices/vcvs/vcvsinit.c | 1 + src/spicelib/devices/vsrc/vsrcbindCSC.c | 46 ++ src/spicelib/devices/vsrc/vsrcext.h | 5 +- src/spicelib/devices/vsrc/vsrcinit.c | 5 +- 145 files changed, 11128 insertions(+), 248 deletions(-) diff --git a/ChangeLog b/ChangeLog index 508b1dd5b..67827177f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5423,6 +5423,270 @@ Removed the PARALLEL_ARCH macro Removed the Combine algorithm from Sparse and Analyses +2012-08-11 Francesco Lannutti + * src/include/ngspice/devdefs.h + * src/include/ngspice/smpdefs.h + * src/spicelib/devices/asrc/asrcinit.c + * src/spicelib/devices/bjt/bjtbindCSC.c + * src/spicelib/devices/bjt/bjtext.h + * src/spicelib/devices/bjt/bjtinit.c + * src/spicelib/devices/bsim1/b1bindCSC.c + * src/spicelib/devices/bsim1/bsim1ext.h + * src/spicelib/devices/bsim1/bsim1init.c + * src/spicelib/devices/bsim2/b2bindCSC.c + * src/spicelib/devices/bsim2/bsim2ext.h + * src/spicelib/devices/bsim2/bsim2init.c + * src/spicelib/devices/bsim3/b3bindCSC.c + * src/spicelib/devices/bsim3/bsim3ext.h + * src/spicelib/devices/bsim3/bsim3init.c + * src/spicelib/devices/bsim3soi/b4soibindCSC.c + * src/spicelib/devices/bsim3soi/b4soiext.h + * src/spicelib/devices/bsim3soi/b4soiinit.c + * src/spicelib/devices/bsim3soi_dd/b3soiddbindCSC.c + * src/spicelib/devices/bsim3soi_dd/b3soiddext.h + * src/spicelib/devices/bsim3soi_dd/b3soiddinit.c + * src/spicelib/devices/bsim3soi_fd/b3soifdbindCSC.c + * src/spicelib/devices/bjt/bjtinit.c + * src/spicelib/devices/bsim1/b1bindCSC.c + * src/spicelib/devices/bsim1/bsim1ext.h + * src/spicelib/devices/bsim1/bsim1init.c + * src/spicelib/devices/bsim2/b2bindCSC.c + * src/spicelib/devices/bsim2/bsim2ext.h + * src/spicelib/devices/bsim2/bsim2init.c + * src/spicelib/devices/bsim3/b3bindCSC.c + * src/spicelib/devices/bsim3/bsim3ext.h + * src/spicelib/devices/bsim3/bsim3init.c + * src/spicelib/devices/bsim3soi/b4soibindCSC.c + * src/spicelib/devices/bsim3soi/b4soiext.h + * src/spicelib/devices/bsim3soi/b4soiinit.c + * src/spicelib/devices/bsim3soi_dd/b3soiddbindCSC.c + * src/spicelib/devices/bsim3soi_dd/b3soiddext.h + * src/spicelib/devices/bsim3soi_dd/b3soiddinit.c + * src/spicelib/devices/bsim3soi_fd/b3soifdbindCSC.c + * src/spicelib/devices/bsim3soi_fd/b3soifdext.h + * src/spicelib/devices/bsim3soi_fd/b3soifdinit.c + * src/spicelib/devices/bsim3soi_pd/b3soipdbindCSC.c + * src/spicelib/devices/bsim3soi_pd/b3soipdext.h + * src/spicelib/devices/bsim3soi_pd/b3soipdinit.c + * src/spicelib/devices/bsim3v0/b3v0bindCSC.c + * src/spicelib/devices/bsim3v0/bsim3v0ext.h + * src/spicelib/devices/bsim3v0/bsim3v0init.c + * src/spicelib/devices/bsim3v1/b3v1bindCSC.c + * src/spicelib/devices/bsim3v1/bsim3v1ext.h + * src/spicelib/devices/bsim3v1/bsim3v1init.c + * src/spicelib/devices/bsim3v32/b3v32bindCSC.c + * src/spicelib/devices/bsim3v32/bsim3v32ext.h + * src/spicelib/devices/bsim3v32/bsim3v32init.c + * src/spicelib/devices/bsim4/b4bindCSC.c + * src/spicelib/devices/bsim4/bsim4ext.h + * src/spicelib/devices/bsim4/bsim4init.c + * src/spicelib/devices/bsim4v4/b4v4bindCSC.c + * src/spicelib/devices/bsim3soi_fd/b3soifdinit.c + * src/spicelib/devices/bsim3soi_pd/b3soipdbindCSC.c + * src/spicelib/devices/bsim3soi_pd/b3soipdext.h + * src/spicelib/devices/bsim3soi_pd/b3soipdinit.c + * src/spicelib/devices/bsim3v0/b3v0bindCSC.c + * src/spicelib/devices/bsim3v0/bsim3v0ext.h + * src/spicelib/devices/bsim3v0/bsim3v0init.c + * src/spicelib/devices/bsim3v1/b3v1bindCSC.c + * src/spicelib/devices/bsim3v1/bsim3v1ext.h + * src/spicelib/devices/bsim3v1/bsim3v1init.c + * src/spicelib/devices/bsim3v32/b3v32bindCSC.c + * src/spicelib/devices/bsim3v32/bsim3v32ext.h + * src/spicelib/devices/bsim3v32/bsim3v32init.c + * src/spicelib/devices/bsim4/b4bindCSC.c + * src/spicelib/devices/bsim4/bsim4ext.h + * src/spicelib/devices/bsim4/bsim4init.c + * src/spicelib/devices/bsim4v4/b4v4bindCSC.c + * src/spicelib/devices/bsim4v4/bsim4v4ext.h + * src/spicelib/devices/bsim4v4/bsim4v4init.c + * src/spicelib/devices/bsim4v5/b4v5bindCSC.c + * src/spicelib/devices/bsim4v5/bsim4v5ext.h + * src/spicelib/devices/bsim4v5/bsim4v5init.c + * src/spicelib/devices/bsim4v6/b4v6bindCSC.c + * src/spicelib/devices/bsim4v6/bsim4v6ext.h + * src/spicelib/devices/bsim4v6/bsim4v6init.c + * src/spicelib/devices/cap/capbindCSC.c + * src/spicelib/devices/cap/capext.h + * src/spicelib/devices/cap/capinit.c + * src/spicelib/devices/cap/capload.c + * src/spicelib/devices/cccs/cccsbindCSC.c + * src/spicelib/devices/cccs/cccsext.h + * src/spicelib/devices/cccs/cccsinit.c + * src/spicelib/devices/ccvs/ccvsbindCSC.c + * src/spicelib/devices/ccvs/ccvsext.h + * src/spicelib/devices/ccvs/ccvsinit.c + * src/spicelib/devices/bsim4v4/bsim4v4init.c + * src/spicelib/devices/bsim4v5/b4v5bindCSC.c + * src/spicelib/devices/bsim4v5/bsim4v5ext.h + * src/spicelib/devices/bsim4v5/bsim4v5init.c + * src/spicelib/devices/bsim4v6/b4v6bindCSC.c + * src/spicelib/devices/bsim4v6/bsim4v6ext.h + * src/spicelib/devices/bsim4v6/bsim4v6init.c + * src/spicelib/devices/cap/capbindCSC.c + * src/spicelib/devices/cap/capext.h + * src/spicelib/devices/cap/capinit.c + * src/spicelib/devices/cap/capload.c + * src/spicelib/devices/cccs/cccsbindCSC.c + * src/spicelib/devices/cccs/cccsext.h + * src/spicelib/devices/cccs/cccsinit.c + * src/spicelib/devices/ccvs/ccvsbindCSC.c + * src/spicelib/devices/ccvs/ccvsext.h + * src/spicelib/devices/ccvs/ccvsinit.c + * src/spicelib/devices/cpl/cplinit.c + * src/spicelib/devices/csw/cswbindCSC.c + * src/spicelib/devices/csw/cswext.h + * src/spicelib/devices/csw/cswinit.c + * src/spicelib/devices/dio/diobindCSC.c + * src/spicelib/devices/dio/dioext.h + * src/spicelib/devices/dio/dioinit.c + * src/spicelib/devices/hfet1/hfetbindCSC.c + * src/spicelib/devices/hfet1/hfetext.h + * src/spicelib/devices/hfet1/hfetinit.c + * src/spicelib/devices/hfet2/hfet2bindCSC.c + * src/spicelib/devices/hfet2/hfet2ext.h + * src/spicelib/devices/hfet2/hfet2init.c + * src/spicelib/devices/hisim2/hsm2bindCSC.c + * src/spicelib/devices/hisim2/hsm2ext.h + * src/spicelib/devices/hisim2/hsm2init.c + * src/spicelib/devices/hisimhv/hsmhvbindCSC.c + * src/spicelib/devices/hisimhv/hsmhvext.h + * src/spicelib/devices/csw/cswbindCSC.c + * src/spicelib/devices/csw/cswext.h + * src/spicelib/devices/csw/cswinit.c + * src/spicelib/devices/dio/diobindCSC.c + * src/spicelib/devices/dio/dioext.h + * src/spicelib/devices/dio/dioinit.c + * src/spicelib/devices/hfet1/hfetbindCSC.c + * src/spicelib/devices/hfet1/hfetext.h + * src/spicelib/devices/hfet1/hfetinit.c + * src/spicelib/devices/hfet2/hfet2bindCSC.c + * src/spicelib/devices/hfet2/hfet2ext.h + * src/spicelib/devices/hfet2/hfet2init.c + * src/spicelib/devices/hisim2/hsm2bindCSC.c + * src/spicelib/devices/hisim2/hsm2ext.h + * src/spicelib/devices/hisim2/hsm2init.c + * src/spicelib/devices/hisimhv/hsmhvbindCSC.c + * src/spicelib/devices/hisimhv/hsmhvext.h + * src/spicelib/devices/hisimhv/hsmhvinit.c + * src/spicelib/devices/ind/indMUTbindCSC.c + * src/spicelib/devices/ind/indext.h + * src/spicelib/devices/ind/indinit.c + * src/spicelib/devices/isrc/isrcinit.c + * src/spicelib/devices/jfet/jfetbindCSC.c + * src/spicelib/devices/jfet/jfetext.h + * src/spicelib/devices/jfet/jfetinit.c + * src/spicelib/devices/jfet2/jfet2bindCSC.c + * src/spicelib/devices/jfet2/jfet2ext.h + * src/spicelib/devices/jfet2/jfet2init.c + * src/spicelib/devices/ltra/ltrabindCSC.c + * src/spicelib/devices/ltra/ltraext.h + * src/spicelib/devices/ltra/ltrainit.c + * src/spicelib/devices/mes/mesbindCSC.c + * src/spicelib/devices/mes/mesext.h + * src/spicelib/devices/mes/mesinit.c + * src/spicelib/devices/mesa/mesabindCSC.c + * src/spicelib/devices/ind/indMUTbindCSC.c + * src/spicelib/devices/ind/indext.h + * src/spicelib/devices/ind/indinit.c + * src/spicelib/devices/isrc/isrcinit.c + * src/spicelib/devices/jfet/jfetbindCSC.c + * src/spicelib/devices/jfet/jfetext.h + * src/spicelib/devices/jfet/jfetinit.c + * src/spicelib/devices/jfet2/jfet2bindCSC.c + * src/spicelib/devices/jfet2/jfet2ext.h + * src/spicelib/devices/jfet2/jfet2init.c + * src/spicelib/devices/ltra/ltrabindCSC.c + * src/spicelib/devices/ltra/ltraext.h + * src/spicelib/devices/ltra/ltrainit.c + * src/spicelib/devices/mes/mesbindCSC.c + * src/spicelib/devices/mes/mesext.h + * src/spicelib/devices/mes/mesinit.c + * src/spicelib/devices/mesa/mesabindCSC.c + * src/spicelib/devices/mesa/mesaext.h + * src/spicelib/devices/mesa/mesainit.c + * src/spicelib/devices/mos1/mos1bindCSC.c + * src/spicelib/devices/mos1/mos1ext.h + * src/spicelib/devices/mos1/mos1init.c + * src/spicelib/devices/mos2/mos2bindCSC.c + * src/spicelib/devices/mos2/mos2ext.h + * src/spicelib/devices/mos2/mos2init.c + * src/spicelib/devices/mos3/mos3bindCSC.c + * src/spicelib/devices/mos3/mos3ext.h + * src/spicelib/devices/mos3/mos3init.c + * src/spicelib/devices/mos6/mos6bindCSC.c + * src/spicelib/devices/mos6/mos6ext.h + * src/spicelib/devices/mos6/mos6init.c + * src/spicelib/devices/mos9/mos9bindCSC.c + * src/spicelib/devices/mos9/mos9ext.h + * src/spicelib/devices/mos9/mos9init.c + * src/spicelib/devices/res/resbindCSC.c + * src/spicelib/devices/mesa/mesainit.c + * src/spicelib/devices/mos1/mos1bindCSC.c + * src/spicelib/devices/mos1/mos1ext.h + * src/spicelib/devices/mos1/mos1init.c + * src/spicelib/devices/mos2/mos2bindCSC.c + * src/spicelib/devices/mos2/mos2ext.h + * src/spicelib/devices/mos2/mos2init.c + * src/spicelib/devices/mos3/mos3bindCSC.c + * src/spicelib/devices/mos3/mos3ext.h + * src/spicelib/devices/mos3/mos3init.c + * src/spicelib/devices/mos6/mos6bindCSC.c + * src/spicelib/devices/mos6/mos6ext.h + * src/spicelib/devices/mos6/mos6init.c + * src/spicelib/devices/mos9/mos9bindCSC.c + * src/spicelib/devices/mos9/mos9ext.h + * src/spicelib/devices/mos9/mos9init.c + * src/spicelib/devices/res/resbindCSC.c + * src/spicelib/devices/res/resext.h + * src/spicelib/devices/res/resinit.c + * src/spicelib/devices/soi3/soi3bindCSC.c + * src/spicelib/devices/soi3/soi3ext.h + * src/spicelib/devices/soi3/soi3init.c + * src/spicelib/devices/sw/swbindCSC.c + * src/spicelib/devices/sw/swext.h + * src/spicelib/devices/sw/swinit.c + * src/spicelib/devices/tra/trabindCSC.c + * src/spicelib/devices/tra/traext.h + * src/spicelib/devices/tra/trainit.c + * src/spicelib/devices/txl/txlbindCSC.c + * src/spicelib/devices/txl/txlext.h + * src/spicelib/devices/txl/txlinit.c + * src/spicelib/devices/urc/urcinit.c + * src/spicelib/devices/vbic/vbicbindCSC.c + * src/spicelib/devices/vbic/vbicext.h + * src/spicelib/devices/vbic/vbicinit.c + * src/spicelib/devices/vccs/vccsbindCSC.c + * src/spicelib/devices/vccs/vccsext.h + * src/spicelib/devices/vccs/vccsinit.c + * src/spicelib/devices/vcvs/vcvsbindCSC.c + * src/spicelib/devices/vcvs/vcvsext.h + * src/spicelib/devices/vcvs/vcvsinit.c + * src/spicelib/devices/vsrc/vsrcbindCSC.c + * src/spicelib/devices/vsrc/vsrcext.h + * src/spicelib/devices/vsrc/vsrcinit.c + Added a function called DEVbindCSCComplexToReal + in order to switch back from a Complex Matrix + to a Real Matrix. This is useful inside the + AC Analysis. BE CAREFUL that all the files + involved in this change are generated automatically + by a script! + Added a flag that indicates if the matrix is + Real or Complex + + * src/maths/KLU/klusmp.c + * src/maths/ni/niinit.c + * src/spicelib/analysis/acan.c + * src/spicelib/analysis/cktop.c + * src/spicelib/analysis/cktsetup.c + Revisited AC Analysis using KLU. Now it's possible + to have any sort of analysis in queue and all + the jobs will be executed successfully. No more + Segmentation Faults :) + Removed the CSC Conversion from CKTop and moved + to CKTsetup + Solved some bugs in the KLU-SMP interface + 2012-05-04 Francesco Lannutti * src/frontend/misccoms.c Added an hint about which solver has been compiled, diff --git a/src/include/ngspice/devdefs.h b/src/include/ngspice/devdefs.h index 3a0a7409f..be17f58e4 100644 --- a/src/include/ngspice/devdefs.h +++ b/src/include/ngspice/devdefs.h @@ -102,8 +102,12 @@ typedef struct SPICEdev { int *DEVmodSize; /* size of a model */ #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) - int (*DEVbindCSC)(GENmodel*, CKTcircuit*); - int (*DEVbindCSCComplex)(GENmodel*, CKTcircuit*); + int (*DEVbindCSC)(GENmodel *, CKTcircuit *) ; + /* routine to convert Sparse linked list to Real CSC array */ + int (*DEVbindCSCComplex)(GENmodel *, CKTcircuit *) ; + /* routine to convert Real CSC array to Complex CSC array */ + int (*DEVbindCSCComplexToReal)(GENmodel *, CKTcircuit *) ; + /* routine to convert Complex CSC array to Real CSC array */ #endif } SPICEdev; /* instance of structure for each possible type of device */ diff --git a/src/include/ngspice/smpdefs.h b/src/include/ngspice/smpdefs.h index 6f9de6934..efb8c345a 100644 --- a/src/include/ngspice/smpdefs.h +++ b/src/include/ngspice/smpdefs.h @@ -35,17 +35,21 @@ struct SMPmatrix { klu_numeric *CKTkluNumeric ; /* KLU numeric object */ int *CKTkluAp ; /* KLU column pointer */ int *CKTkluAi ; /* KLU row pointer */ - double *CKTkluAx ; /* KLU element */ + double *CKTkluAx ; /* KLU Real Elements */ + double *CKTkluAx_Complex ; /* KLU Complex Elements */ + int CKTkluMatrixIsComplex ; /* KLU Matrix Is Complex Flag */ + #define CKTkluMatrixReal 0 /* KLU Matrix Real definition */ + #define CKTkluMatrixComplex 1 /* KLU Matrix Complex definition */ double *CKTkluIntermediate ; /* KLU RHS Intermediate for Solve Real Step */ double *CKTkluIntermediate_Complex ; /* KLU iRHS Intermediate for Solve Complex Step */ - double **CKTbind_Sparse ; /* KLU - Sparse original element position */ - double **CKTbind_CSC ; /* KLU - KLU new element position */ - double **CKTbind_CSC_Complex ; /* KLU - KLU new element position in Complex analysis */ - double **CKTdiag_CSC ; /* KLU pointer to diagonal element to perform Gmin */ + double **CKTbind_Sparse ; /* KLU Sparse original element position */ + double **CKTbind_CSC ; /* KLU new element position */ + double **CKTbind_CSC_Complex ; /* KLU new element position in Complex analysis */ + double **CKTdiag_CSC ; /* KLU pointer to diagonal element to perform Gmin */ int CKTkluN ; /* KLU N, copied */ int CKTklunz ; /* KLU nz, copied for AC Analysis */ int CKTkluMODE ; /* KLU MODE parameter to enable KLU or not from the heuristic */ - #define CKTkluON 1 /* KLU MODE ON definition */ + #define CKTkluON 1 /* KLU MODE ON definition */ #define CKTkluOFF 0 /* KLU MODE OFF definition */ #elif defined(SuperLU) int *CKTsuperluAp ; diff --git a/src/maths/KLU/klusmp.c b/src/maths/KLU/klusmp.c index f59dcd3d1..b4bb94368 100644 --- a/src/maths/KLU/klusmp.c +++ b/src/maths/KLU/klusmp.c @@ -158,10 +158,10 @@ SMPcClear (SMPmatrix *Matrix) if (Matrix->CKTkluMODE) { spClear (Matrix->SPmatrix) ; - if (Matrix->CKTkluAx != NULL) + if (Matrix->CKTkluAx_Complex != NULL) { for (i = 0 ; i < 2 * Matrix->CKTklunz ; i++) - Matrix->CKTkluAx [i] = 0 ; + Matrix->CKTkluAx_Complex [i] = 0 ; } } else { spClear (Matrix->SPmatrix) ; @@ -206,7 +206,7 @@ SMPcLUfac (SMPmatrix *Matrix, double PivTol) if (Matrix->CKTkluMODE) { spSetComplex (Matrix->SPmatrix) ; - ret = klu_z_refactor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx, + ret = klu_z_refactor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx_Complex, Matrix->CKTkluSymbolic, Matrix->CKTkluNumeric, Matrix->CKTkluCommon) ; return (!ret) ; } else { @@ -252,8 +252,14 @@ SMPcReorder (SMPmatrix *Matrix, double PivTol, double PivRel, int *NumSwaps) { *NumSwaps = 1 ; spSetComplex (Matrix->SPmatrix) ; - klu_z_free_numeric (&(Matrix->CKTkluNumeric), Matrix->CKTkluCommon) ; - Matrix->CKTkluNumeric = klu_z_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; + + if (Matrix->CKTkluNumeric != NULL) + { + klu_z_free_numeric (&(Matrix->CKTkluNumeric), Matrix->CKTkluCommon) ; + Matrix->CKTkluNumeric = klu_z_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx_Complex, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; + } else + Matrix->CKTkluNumeric = klu_z_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx_Complex, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; + if (Matrix->CKTkluNumeric == NULL) return 1 ; else @@ -281,9 +287,8 @@ SMPreorder (SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin) { klu_free_numeric (&(Matrix->CKTkluNumeric), Matrix->CKTkluCommon) ; Matrix->CKTkluNumeric = klu_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; - } else { + } else Matrix->CKTkluNumeric = klu_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; - } if (Matrix->CKTkluNumeric == NULL) return 1 ; @@ -326,17 +331,17 @@ SMPcSolve (SMPmatrix *Matrix, double RHS[], double iRHS[], double Spare[], doubl pExtOrder = &Matrix->SPmatrix->IntToExtRowMap [Matrix->CKTkluN] ; for (i = 2 * Matrix->CKTkluN - 1 ; i > 0 ; i -= 2) { - Matrix->CKTkluIntermediate [i] = RHS [*(pExtOrder)] ; - Matrix->CKTkluIntermediate [i - 1] = iRHS [*(pExtOrder--)] ; + Matrix->CKTkluIntermediate_Complex [i] = RHS [*(pExtOrder)] ; + Matrix->CKTkluIntermediate_Complex [i - 1] = iRHS [*(pExtOrder--)] ; } - ret = klu_z_solve (Matrix->CKTkluSymbolic, Matrix->CKTkluNumeric, Matrix->CKTkluN, 1, Matrix->CKTkluIntermediate, Matrix->CKTkluCommon) ; + ret = klu_z_solve (Matrix->CKTkluSymbolic, Matrix->CKTkluNumeric, Matrix->CKTkluN, 1, Matrix->CKTkluIntermediate_Complex, Matrix->CKTkluCommon) ; pExtOrder = &Matrix->SPmatrix->IntToExtColMap [Matrix->CKTkluN] ; for (i = 2 * Matrix->CKTkluN - 1 ; i > 0 ; i -= 2) { - RHS [*(pExtOrder)] = Matrix->CKTkluIntermediate [i] ; - iRHS [*(pExtOrder--)] = Matrix->CKTkluIntermediate [i - 1] ; + RHS [*(pExtOrder)] = Matrix->CKTkluIntermediate_Complex [i] ; + iRHS [*(pExtOrder--)] = Matrix->CKTkluIntermediate_Complex [i - 1] ; } } else { @@ -455,7 +460,13 @@ SMPprint (SMPmatrix *Matrix, FILE *File) void SMPgetError (SMPmatrix *Matrix, int *Col, int *Row) { - spWhereSingular (Matrix->SPmatrix, Row, Col) ; + if (Matrix->CKTkluMODE) + { + *Row = Matrix->SPmatrix->IntToExtRowMap [Matrix->CKTkluCommon->singular_col] ; + *Col = Matrix->SPmatrix->IntToExtColMap [Matrix->CKTkluCommon->singular_col] ; + } else { + spWhereSingular (Matrix->SPmatrix, Row, Col) ; + } } /* diff --git a/src/maths/ni/niinit.c b/src/maths/ni/niinit.c index 0c60e89ff..f5dbbdc5d 100644 --- a/src/maths/ni/niinit.c +++ b/src/maths/ni/niinit.c @@ -28,7 +28,7 @@ NIinit(CKTcircuit *ckt) int Error; #endif /* SPARSE */ -/* Allocation of the new SMPmatrix structure - Francesco Lannuti (2012-02) */ +/* Allocation of the new SMPmatrix structure - Francesco Lannutti (2012-02) */ ckt->CKTmatrix = TMALLOC (SMPmatrix, 1) ; #if defined(KLU) @@ -38,6 +38,7 @@ NIinit(CKTcircuit *ckt) ckt->CKTmatrix->CKTkluAp = NULL ; ckt->CKTmatrix->CKTkluAi = NULL ; ckt->CKTmatrix->CKTkluAx = NULL ; + ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ; ckt->CKTmatrix->CKTkluIntermediate = NULL ; ckt->CKTmatrix->CKTkluIntermediate_Complex = NULL ; ckt->CKTmatrix->CKTbind_Sparse = NULL ; diff --git a/src/spicelib/analysis/acan.c b/src/spicelib/analysis/acan.c index 06437b4c8..5ecf7c30c 100644 --- a/src/spicelib/analysis/acan.c +++ b/src/spicelib/analysis/acan.c @@ -243,24 +243,29 @@ ACan(CKTcircuit *ckt, int restart) ckt->CKTcurrentAnalysis = DOING_AC; #ifdef KLU - if (ckt->CKTmatrix->CKTkluMODE) { - int i, m; - double *temp; - temp = TMALLOC (double, 2 * ckt->CKTmatrix->CKTklunz) ; - ckt->CKTmatrix->CKTbind_CSC_Complex = TMALLOC (double *, ckt->CKTmatrix->CKTklunz) ; - ckt->CKTmatrix->CKTkluIntermediate_Complex = TMALLOC (double, 2 * ckt->CKTmatrix->CKTkluN) ; - m = 0; - for (i = 0 ; i < ckt->CKTmatrix->CKTklunz ; i++) { - ckt->CKTmatrix->CKTbind_CSC_Complex [i] = &(temp [m]) ; - m += 2; + int i, m ; + + if (ckt->CKTmatrix->CKTkluMODE) + { + if (!ckt->CKTmatrix->CKTkluMatrixIsComplex) + { + ckt->CKTmatrix->CKTkluAx_Complex = TMALLOC (double, 2 * ckt->CKTmatrix->CKTklunz) ; + ckt->CKTmatrix->CKTbind_CSC_Complex = TMALLOC (double *, ckt->CKTmatrix->CKTklunz) ; + ckt->CKTmatrix->CKTkluIntermediate_Complex = TMALLOC (double, 2 * ckt->CKTmatrix->CKTkluN) ; + + m = 0 ; + for (i = 0 ; i < ckt->CKTmatrix->CKTklunz ; i++) + { + ckt->CKTmatrix->CKTbind_CSC_Complex [i] = &(ckt->CKTmatrix->CKTkluAx_Complex [m]) ; + m += 2 ; + } + + for (i = 0 ; i < DEVmaxnum ; i++) + if (DEVices [i] && DEVices [i]->DEVbindCSCComplex) + DEVices [i]->DEVbindCSCComplex (ckt->CKThead [i], ckt) ; + + ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixComplex ; } - - for (i = 0 ; i < DEVmaxnum ; i++) - if (DEVices [i] && DEVices [i]->DEVbindCSCComplex) - DEVices [i]->DEVbindCSCComplex (ckt->CKThead [i], ckt) ; - - free (ckt->CKTmatrix->CKTkluAx) ; - ckt->CKTmatrix->CKTkluAx = temp ; } #endif @@ -275,6 +280,19 @@ ACan(CKTcircuit *ckt, int restart) /* Update opertating point, if variable 'hertz' is given */ if (ckt->CKTvarHertz) { + +#ifdef KLU + if (ckt->CKTmatrix->CKTkluMODE) + { + /* Conversion from Complex Matrix to Real Matrix */ + for (i = 0 ; i < DEVmaxnum ; i++) + if (DEVices [i] && DEVices [i]->DEVbindCSCComplexToReal) + DEVices [i]->DEVbindCSCComplexToReal (ckt->CKThead [i], ckt) ; + + ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ; + } +#endif + #ifdef XSPICE /* Call EVTop if event-driven instances exist */ @@ -286,8 +304,7 @@ ACan(CKTcircuit *ckt, int restart) MIF_TRUE); EVTdump(ckt, IPC_ANAL_DCOP, 0.0); EVTop_save(ckt, MIF_TRUE, 0.0); - } - else + } else #endif // If no event-driven instances, do what SPICE normally does error = CKTop(ckt, @@ -303,6 +320,19 @@ ACan(CKTcircuit *ckt, int restart) ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITSMSIG; error = CKTload(ckt); if(error) return(error); + +#ifdef KLU + if (ckt->CKTmatrix->CKTkluMODE) + { + /* Conversion from Real Matrix to Complex Matrix */ + for (i = 0 ; i < DEVmaxnum ; i++) + if (DEVices [i] && DEVices [i]->DEVbindCSCComplex) + DEVices [i]->DEVbindCSCComplex (ckt->CKThead [i], ckt) ; + + ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixComplex ; + } +#endif + } ckt->CKTmode = (ckt->CKTmode&MODEUIC) | MODEAC; @@ -402,6 +432,19 @@ endsweep: SPfrontEnd->OUTendPlot (acPlot); acPlot = NULL; UPDATE_STATS(0); + +#ifdef KLU + if (ckt->CKTmatrix->CKTkluMODE) + { + /* Conversion from Complex Matrix to Real Matrix */ + for (i = 0 ; i < DEVmaxnum ; i++) + if (DEVices [i] && DEVices [i]->DEVbindCSCComplexToReal) + DEVices [i]->DEVbindCSCComplexToReal (ckt->CKThead [i], ckt) ; + + ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ; + } +#endif + return(0); } diff --git a/src/spicelib/analysis/cktop.c b/src/spicelib/analysis/cktop.c index 9bc57a6ea..403b2c389 100644 --- a/src/spicelib/analysis/cktop.c +++ b/src/spicelib/analysis/cktop.c @@ -27,91 +27,6 @@ CKTop (CKTcircuit * ckt, long int firstmode, long int continuemode, #endif ckt->CKTmode = firstmode; -#if defined(KLU) - if (ckt->CKTmatrix->CKTkluMODE) { - - int i ; - int n = ckt->CKTmatrix->CKTkluN ; - int nz = ckt->CKTmatrix->CKTklunz ; - - ckt->CKTmatrix->CKTkluAp = TMALLOC (int, n + 1) ; - ckt->CKTmatrix->CKTkluAi = TMALLOC (int, nz) ; - ckt->CKTmatrix->CKTkluAx = TMALLOC (double, nz) ; - ckt->CKTmatrix->CKTkluIntermediate = TMALLOC (double, n ) ; - - ckt->CKTmatrix->CKTbind_Sparse = TMALLOC (double *, nz) ; - ckt->CKTmatrix->CKTbind_CSC = TMALLOC (double *, nz) ; - - ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ; - - SMPmatrix_CSC (ckt->CKTmatrix) ; - - for (i = 0 ; i < DEVmaxnum ; i++) - if (DEVices [i] && DEVices [i]->DEVbindCSC) - DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ; - } -#elif defined(SuperLU) - if (ckt->CKTmatrix->CKTsuperluMODE) - { - int i ; - int n = ckt->CKTmatrix->CKTsuperluN ; - int nz = ckt->CKTmatrix->CKTsuperlunz ; - - ckt->CKTmatrix->CKTsuperluAp = TMALLOC (int, n + 1) ; - ckt->CKTmatrix->CKTsuperluAi = TMALLOC (int, nz) ; - ckt->CKTmatrix->CKTsuperluAx = TMALLOC (double, nz) ; - ckt->CKTmatrix->CKTsuperluPerm_c = TMALLOC (int, n) ; - ckt->CKTmatrix->CKTsuperluPerm_r = TMALLOC (int, n) ; - ckt->CKTmatrix->CKTsuperluEtree = TMALLOC (int, n) ; - - ckt->CKTmatrix->CKTsuperluIntermediate = TMALLOC (double, n) ; - - ckt->CKTmatrix->CKTbind_Sparse = TMALLOC (double *, nz) ; - ckt->CKTmatrix->CKTbind_CSC = TMALLOC (double *, nz) ; - - ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ; - - SMPmatrix_CSC (ckt->CKTmatrix) ; - - dCreate_CompCol_Matrix (&(ckt->CKTmatrix->CKTsuperluA), n, n, nz, ckt->CKTmatrix->CKTsuperluAx, - ckt->CKTmatrix->CKTsuperluAi, ckt->CKTmatrix->CKTsuperluAp, SLU_NC, SLU_D, SLU_GE) ; - dCreate_Dense_Matrix (&(ckt->CKTmatrix->CKTsuperluI), n, 1, ckt->CKTmatrix->CKTsuperluIntermediate, - n, SLU_DN, SLU_D, SLU_GE) ; - StatInit (&(ckt->CKTmatrix->CKTsuperluStat)) ; - - for (i = 0 ; i < DEVmaxnum ; i++) - if (DEVices [i] && DEVices [i]->DEVbindCSC) - DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ; - } -#elif defined(UMFPACK) - if (ckt->CKTmatrix->CKTumfpackMODE) - { - int i ; - int n = ckt->CKTmatrix->CKTumfpackN ; - int nz = ckt->CKTmatrix->CKTumfpacknz ; - ckt->CKTmatrix->CKTumfpackAp = TMALLOC (int, n + 1) ; - ckt->CKTmatrix->CKTumfpackAi = TMALLOC (int, nz) ; - ckt->CKTmatrix->CKTumfpackAx = TMALLOC (double, nz) ; - ckt->CKTmatrix->CKTumfpackControl = TMALLOC (double, UMFPACK_CONTROL) ; - ckt->CKTmatrix->CKTumfpackInfo = TMALLOC (double, UMFPACK_INFO) ; - - ckt->CKTmatrix->CKTumfpackIntermediate = TMALLOC (double, n) ; - - ckt->CKTmatrix->CKTumfpackX = TMALLOC (double, n) ; - - ckt->CKTmatrix->CKTbind_Sparse = TMALLOC (double *, nz) ; - ckt->CKTmatrix->CKTbind_CSC = TMALLOC (double *, nz) ; - - ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ; - - SMPmatrix_CSC (ckt->CKTmatrix) ; - - for (i = 0 ; i < DEVmaxnum ; i++) - if (DEVices [i] && DEVices [i]->DEVbindCSC) - DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ; - } -#endif - if (!ckt->CKTnoOpIter){ #ifdef XSPICE /* gtri - begin - wbk - add convergence problem reporting flags */ diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index f1a1c09f9..9f609db8c 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -89,6 +89,93 @@ CKTsetup(CKTcircuit *ckt) SMPnnz (ckt->CKTmatrix) ; #endif +#if defined(KLU) + if (ckt->CKTmatrix->CKTkluMODE) + { + int i ; + int n = ckt->CKTmatrix->CKTkluN ; + int nz = ckt->CKTmatrix->CKTklunz ; + + ckt->CKTmatrix->CKTkluAp = TMALLOC (int, n + 1) ; + ckt->CKTmatrix->CKTkluAi = TMALLOC (int, nz) ; + ckt->CKTmatrix->CKTkluAx = TMALLOC (double, nz) ; + ckt->CKTmatrix->CKTkluIntermediate = TMALLOC (double, n ) ; + + ckt->CKTmatrix->CKTbind_Sparse = TMALLOC (double *, nz) ; + ckt->CKTmatrix->CKTbind_CSC = TMALLOC (double *, nz) ; + + ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ; + + SMPmatrix_CSC (ckt->CKTmatrix) ; + + for (i = 0 ; i < DEVmaxnum ; i++) + if (DEVices [i] && DEVices [i]->DEVbindCSC) + DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ; + + ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ; + } +#elif defined(SuperLU) + if (ckt->CKTmatrix->CKTsuperluMODE) + { + int i ; + int n = ckt->CKTmatrix->CKTsuperluN ; + int nz = ckt->CKTmatrix->CKTsuperlunz ; + + ckt->CKTmatrix->CKTsuperluAp = TMALLOC (int, n + 1) ; + ckt->CKTmatrix->CKTsuperluAi = TMALLOC (int, nz) ; + ckt->CKTmatrix->CKTsuperluAx = TMALLOC (double, nz) ; + ckt->CKTmatrix->CKTsuperluPerm_c = TMALLOC (int, n) ; + ckt->CKTmatrix->CKTsuperluPerm_r = TMALLOC (int, n) ; + ckt->CKTmatrix->CKTsuperluEtree = TMALLOC (int, n) ; + + ckt->CKTmatrix->CKTsuperluIntermediate = TMALLOC (double, n) ; + + ckt->CKTmatrix->CKTbind_Sparse = TMALLOC (double *, nz) ; + ckt->CKTmatrix->CKTbind_CSC = TMALLOC (double *, nz) ; + + ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ; + + SMPmatrix_CSC (ckt->CKTmatrix) ; + + dCreate_CompCol_Matrix (&(ckt->CKTmatrix->CKTsuperluA), n, n, nz, ckt->CKTmatrix->CKTsuperluAx, + ckt->CKTmatrix->CKTsuperluAi, ckt->CKTmatrix->CKTsuperluAp, SLU_NC, SLU_D, SLU_GE) ; + dCreate_Dense_Matrix (&(ckt->CKTmatrix->CKTsuperluI), n, 1, ckt->CKTmatrix->CKTsuperluIntermediate, + n, SLU_DN, SLU_D, SLU_GE) ; + StatInit (&(ckt->CKTmatrix->CKTsuperluStat)) ; + + for (i = 0 ; i < DEVmaxnum ; i++) + if (DEVices [i] && DEVices [i]->DEVbindCSC) + DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ; + } +#elif defined(UMFPACK) + if (ckt->CKTmatrix->CKTumfpackMODE) + { + int i ; + int n = ckt->CKTmatrix->CKTumfpackN ; + int nz = ckt->CKTmatrix->CKTumfpacknz ; + ckt->CKTmatrix->CKTumfpackAp = TMALLOC (int, n + 1) ; + ckt->CKTmatrix->CKTumfpackAi = TMALLOC (int, nz) ; + ckt->CKTmatrix->CKTumfpackAx = TMALLOC (double, nz) ; + ckt->CKTmatrix->CKTumfpackControl = TMALLOC (double, UMFPACK_CONTROL) ; + ckt->CKTmatrix->CKTumfpackInfo = TMALLOC (double, UMFPACK_INFO) ; + + ckt->CKTmatrix->CKTumfpackIntermediate = TMALLOC (double, n) ; + + ckt->CKTmatrix->CKTumfpackX = TMALLOC (double, n) ; + + ckt->CKTmatrix->CKTbind_Sparse = TMALLOC (double *, nz) ; + ckt->CKTmatrix->CKTbind_CSC = TMALLOC (double *, nz) ; + + ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ; + + SMPmatrix_CSC (ckt->CKTmatrix) ; + + for (i = 0 ; i < DEVmaxnum ; i++) + if (DEVices [i] && DEVices [i]->DEVbindCSC) + DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ; + } +#endif + for(i=0;i<=MAX(2,ckt->CKTmaxOrder)+1;i++) { /* dctran needs 3 states as minimum */ CKALLOC(ckt->CKTstates[i],ckt->CKTnumStates,double); } diff --git a/src/spicelib/devices/asrc/asrcinit.c b/src/spicelib/devices/asrc/asrcinit.c index 430e54716..00701bb7b 100644 --- a/src/spicelib/devices/asrc/asrcinit.c +++ b/src/spicelib/devices/asrc/asrcinit.c @@ -77,6 +77,7 @@ SPICEdev ASRCinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ NULL, /* DEVbindCSCComplex */ NULL, + /* DEVbindCSCComplexToReal */ NULL, #endif }; diff --git a/src/spicelib/devices/bjt/bjtbindCSC.c b/src/spicelib/devices/bjt/bjtbindCSC.c index 1fdbe1679..0ebc06845 100644 --- a/src/spicelib/devices/bjt/bjtbindCSC.c +++ b/src/spicelib/devices/bjt/bjtbindCSC.c @@ -334,3 +334,182 @@ BJTbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BJTbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BJTmodel *model = (BJTmodel *)inModel ; + BJTinstance *here ; + int i ; + + /* loop through all the bjt models */ + for ( ; model != NULL ; model = model->BJTnextModel) + { + /* loop through all the instances of the model */ + for (here = model->BJTinstances ; here != NULL ; here = here->BJTnextInstance) + { + i = 0 ; + if ((here->BJTcolNode != 0) && (here->BJTcolPrimeNode != 0)) + { + while (here->BJTcolColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTcolColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTbaseNode != 0) && (here->BJTbasePrimeNode != 0)) + { + while (here->BJTbaseBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTbaseBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTemitNode != 0) && (here->BJTemitPrimeNode != 0)) + { + while (here->BJTemitEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTemitEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTcolPrimeNode != 0) && (here->BJTcolNode != 0)) + { + while (here->BJTcolPrimeColPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTcolPrimeColPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTcolPrimeNode != 0) && (here->BJTbasePrimeNode != 0)) + { + while (here->BJTcolPrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTcolPrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTcolPrimeNode != 0) && (here->BJTemitPrimeNode != 0)) + { + while (here->BJTcolPrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTcolPrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTbasePrimeNode != 0) && (here->BJTbaseNode != 0)) + { + while (here->BJTbasePrimeBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTbasePrimeBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTbasePrimeNode != 0) && (here->BJTcolPrimeNode != 0)) + { + while (here->BJTbasePrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTbasePrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTbasePrimeNode != 0) && (here->BJTemitPrimeNode != 0)) + { + while (here->BJTbasePrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTbasePrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTemitPrimeNode != 0) && (here->BJTemitNode != 0)) + { + while (here->BJTemitPrimeEmitPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTemitPrimeEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTemitPrimeNode != 0) && (here->BJTcolPrimeNode != 0)) + { + while (here->BJTemitPrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTemitPrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTemitPrimeNode != 0) && (here->BJTbasePrimeNode != 0)) + { + while (here->BJTemitPrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTemitPrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTcolNode != 0) && (here->BJTcolNode != 0)) + { + while (here->BJTcolColPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTcolColPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTbaseNode != 0) && (here->BJTbaseNode != 0)) + { + while (here->BJTbaseBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTbaseBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTemitNode != 0) && (here->BJTemitNode != 0)) + { + while (here->BJTemitEmitPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTemitEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTcolPrimeNode != 0) && (here->BJTcolPrimeNode != 0)) + { + while (here->BJTcolPrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTcolPrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTbasePrimeNode != 0) && (here->BJTbasePrimeNode != 0)) + { + while (here->BJTbasePrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTbasePrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTemitPrimeNode != 0) && (here->BJTemitPrimeNode != 0)) + { + while (here->BJTemitPrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTemitPrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTsubstNode != 0) && (here->BJTsubstNode != 0)) + { + while (here->BJTsubstSubstPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTsubstSubstPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTsubstConNode != 0) && (here->BJTsubstNode != 0)) + { + while (here->BJTsubstConSubstPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTsubstConSubstPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTsubstNode != 0) && (here->BJTsubstConNode != 0)) + { + while (here->BJTsubstSubstConPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTsubstSubstConPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTbaseNode != 0) && (here->BJTcolPrimeNode != 0)) + { + while (here->BJTbaseColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTbaseColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BJTcolPrimeNode != 0) && (here->BJTbaseNode != 0)) + { + while (here->BJTcolPrimeBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BJTcolPrimeBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bjt/bjtext.h b/src/spicelib/devices/bjt/bjtext.h index e4755154f..a02d2ad20 100644 --- a/src/spicelib/devices/bjt/bjtext.h +++ b/src/spicelib/devices/bjt/bjtext.h @@ -35,6 +35,7 @@ extern int BJTdSetup(GENmodel*, register CKTcircuit*); #endif #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BJTbindCSC(GENmodel*, CKTcircuit*); -extern int BJTbindCSCComplex(GENmodel*, CKTcircuit*); +extern int BJTbindCSC (GENmodel*, CKTcircuit*) ; +extern int BJTbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BJTbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bjt/bjtinit.c b/src/spicelib/devices/bjt/bjtinit.c index e6d8c5e13..e75680938 100644 --- a/src/spicelib/devices/bjt/bjtinit.c +++ b/src/spicelib/devices/bjt/bjtinit.c @@ -76,6 +76,7 @@ SPICEdev BJTinfo = { /* description from struct IFdevice */ #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ BJTbindCSC, /* DEVbindCSCComplex */ BJTbindCSCComplex, + /* DEVbindCSCComplexToReal */ BJTbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim1/b1bindCSC.c b/src/spicelib/devices/bsim1/b1bindCSC.c index 8ba297a7e..fc468d0e3 100644 --- a/src/spicelib/devices/bsim1/b1bindCSC.c +++ b/src/spicelib/devices/bsim1/b1bindCSC.c @@ -306,3 +306,175 @@ B1bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +B1bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + B1model *model = (B1model *)inModel ; + B1instance *here ; + int i ; + + /* loop through all the bsim1 models */ + for ( ; model != NULL ; model = model->B1nextModel) + { + /* loop through all the instances of the model */ + for (here = model->B1instances ; here != NULL ; here = here->B1nextInstance) + { + i = 0 ; + if ((here->B1dNode != 0) && (here->B1dNode != 0)) + { + while (here->B1DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1gNode != 0) && (here->B1gNode != 0)) + { + while (here->B1GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1sNode != 0) && (here->B1sNode != 0)) + { + while (here->B1SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1bNode != 0) && (here->B1bNode != 0)) + { + while (here->B1BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1dNodePrime != 0) && (here->B1dNodePrime != 0)) + { + while (here->B1DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1sNodePrime != 0) && (here->B1sNodePrime != 0)) + { + while (here->B1SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1dNode != 0) && (here->B1dNodePrime != 0)) + { + while (here->B1DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1gNode != 0) && (here->B1bNode != 0)) + { + while (here->B1GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1gNode != 0) && (here->B1dNodePrime != 0)) + { + while (here->B1GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1gNode != 0) && (here->B1sNodePrime != 0)) + { + while (here->B1GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1sNode != 0) && (here->B1sNodePrime != 0)) + { + while (here->B1SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1bNode != 0) && (here->B1dNodePrime != 0)) + { + while (here->B1BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1bNode != 0) && (here->B1sNodePrime != 0)) + { + while (here->B1BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1dNodePrime != 0) && (here->B1sNodePrime != 0)) + { + while (here->B1DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1dNodePrime != 0) && (here->B1dNode != 0)) + { + while (here->B1DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1bNode != 0) && (here->B1gNode != 0)) + { + while (here->B1BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1dNodePrime != 0) && (here->B1gNode != 0)) + { + while (here->B1DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1sNodePrime != 0) && (here->B1gNode != 0)) + { + while (here->B1SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1sNodePrime != 0) && (here->B1sNode != 0)) + { + while (here->B1SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1dNodePrime != 0) && (here->B1bNode != 0)) + { + while (here->B1DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1sNodePrime != 0) && (here->B1bNode != 0)) + { + while (here->B1SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B1sNodePrime != 0) && (here->B1dNodePrime != 0)) + { + while (here->B1SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B1SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim1/bsim1ext.h b/src/spicelib/devices/bsim1/bsim1ext.h index af26125df..ce3719a97 100644 --- a/src/spicelib/devices/bsim1/bsim1ext.h +++ b/src/spicelib/devices/bsim1/bsim1ext.h @@ -31,6 +31,7 @@ extern int B1disto(int,GENmodel*,CKTcircuit*); extern int B1dSetup(GENmodel*, register CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int B1bindCSC(GENmodel*, CKTcircuit*); -extern int B1bindCSCComplex(GENmodel*, CKTcircuit*); +extern int B1bindCSC (GENmodel*, CKTcircuit*) ; +extern int B1bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int B1bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim1/bsim1init.c b/src/spicelib/devices/bsim1/bsim1init.c index 4e65c8f77..dc4941f25 100644 --- a/src/spicelib/devices/bsim1/bsim1init.c +++ b/src/spicelib/devices/bsim1/bsim1init.c @@ -76,6 +76,7 @@ SPICEdev B1info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ B1bindCSC, /* DEVbindCSCComplex */ B1bindCSCComplex, + /* DEVbindCSCComplexToReal */ B1bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim2/b2bindCSC.c b/src/spicelib/devices/bsim2/b2bindCSC.c index abac104ee..d9eb14749 100644 --- a/src/spicelib/devices/bsim2/b2bindCSC.c +++ b/src/spicelib/devices/bsim2/b2bindCSC.c @@ -306,3 +306,175 @@ B2bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +B2bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + B2model *model = (B2model *)inModel ; + B2instance *here ; + int i ; + + /* loop through all the bsim2 models */ + for ( ; model != NULL ; model = model->B2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->B2instances ; here != NULL ; here = here->B2nextInstance) + { + i = 0 ; + if ((here->B2dNode != 0) && (here->B2dNode != 0)) + { + while (here->B2DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2gNode != 0) && (here->B2gNode != 0)) + { + while (here->B2GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2sNode != 0) && (here->B2sNode != 0)) + { + while (here->B2SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2bNode != 0) && (here->B2bNode != 0)) + { + while (here->B2BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2dNodePrime != 0) && (here->B2dNodePrime != 0)) + { + while (here->B2DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2sNodePrime != 0) && (here->B2sNodePrime != 0)) + { + while (here->B2SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2dNode != 0) && (here->B2dNodePrime != 0)) + { + while (here->B2DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2gNode != 0) && (here->B2bNode != 0)) + { + while (here->B2GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2gNode != 0) && (here->B2dNodePrime != 0)) + { + while (here->B2GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2gNode != 0) && (here->B2sNodePrime != 0)) + { + while (here->B2GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2sNode != 0) && (here->B2sNodePrime != 0)) + { + while (here->B2SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2bNode != 0) && (here->B2dNodePrime != 0)) + { + while (here->B2BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2bNode != 0) && (here->B2sNodePrime != 0)) + { + while (here->B2BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2dNodePrime != 0) && (here->B2sNodePrime != 0)) + { + while (here->B2DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2dNodePrime != 0) && (here->B2dNode != 0)) + { + while (here->B2DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2bNode != 0) && (here->B2gNode != 0)) + { + while (here->B2BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2dNodePrime != 0) && (here->B2gNode != 0)) + { + while (here->B2DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2sNodePrime != 0) && (here->B2gNode != 0)) + { + while (here->B2SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2sNodePrime != 0) && (here->B2sNode != 0)) + { + while (here->B2SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2dNodePrime != 0) && (here->B2bNode != 0)) + { + while (here->B2DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2sNodePrime != 0) && (here->B2bNode != 0)) + { + while (here->B2SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B2sNodePrime != 0) && (here->B2dNodePrime != 0)) + { + while (here->B2SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B2SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim2/bsim2ext.h b/src/spicelib/devices/bsim2/bsim2ext.h index 94fe03b45..00acb8d38 100644 --- a/src/spicelib/devices/bsim2/bsim2ext.h +++ b/src/spicelib/devices/bsim2/bsim2ext.h @@ -27,6 +27,7 @@ extern int B2temp(GENmodel*,CKTcircuit*); extern int B2trunc(GENmodel*,CKTcircuit*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int B2bindCSC(GENmodel*, CKTcircuit*); -extern int B2bindCSCComplex(GENmodel*, CKTcircuit*); +extern int B2bindCSC (GENmodel*, CKTcircuit*) ; +extern int B2bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int B2bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim2/bsim2init.c b/src/spicelib/devices/bsim2/bsim2init.c index 55b23232f..1468099c7 100644 --- a/src/spicelib/devices/bsim2/bsim2init.c +++ b/src/spicelib/devices/bsim2/bsim2init.c @@ -76,6 +76,7 @@ SPICEdev B2info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ B2bindCSC, /* DEVbindCSCComplex */ B2bindCSCComplex, + /* DEVbindCSCComplexToReal */ B2bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim3/b3bindCSC.c b/src/spicelib/devices/bsim3/b3bindCSC.c index 7168c3639..53ace7e0f 100644 --- a/src/spicelib/devices/bsim3/b3bindCSC.c +++ b/src/spicelib/devices/bsim3/b3bindCSC.c @@ -414,3 +414,238 @@ BSIM3bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BSIM3bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3model *model = (BSIM3model *)inModel ; + BSIM3instance *here ; + int i ; + + /* loop through all the bsim3 models */ + for ( ; model != NULL ; model = model->BSIM3nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM3instances ; here != NULL ; here = here->BSIM3nextInstance) + { + i = 0 ; + if ((here->BSIM3dNode != 0) && (here->BSIM3dNode != 0)) + { + while (here->BSIM3DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3gNode != 0) && (here->BSIM3gNode != 0)) + { + while (here->BSIM3GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3sNode != 0) && (here->BSIM3sNode != 0)) + { + while (here->BSIM3SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3bNode != 0) && (here->BSIM3bNode != 0)) + { + while (here->BSIM3BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3dNodePrime != 0) && (here->BSIM3dNodePrime != 0)) + { + while (here->BSIM3DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3sNodePrime != 0) && (here->BSIM3sNodePrime != 0)) + { + while (here->BSIM3SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3dNode != 0) && (here->BSIM3dNodePrime != 0)) + { + while (here->BSIM3DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3gNode != 0) && (here->BSIM3bNode != 0)) + { + while (here->BSIM3GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3gNode != 0) && (here->BSIM3dNodePrime != 0)) + { + while (here->BSIM3GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3gNode != 0) && (here->BSIM3sNodePrime != 0)) + { + while (here->BSIM3GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3sNode != 0) && (here->BSIM3sNodePrime != 0)) + { + while (here->BSIM3SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3bNode != 0) && (here->BSIM3dNodePrime != 0)) + { + while (here->BSIM3BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3bNode != 0) && (here->BSIM3sNodePrime != 0)) + { + while (here->BSIM3BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3dNodePrime != 0) && (here->BSIM3sNodePrime != 0)) + { + while (here->BSIM3DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3dNodePrime != 0) && (here->BSIM3dNode != 0)) + { + while (here->BSIM3DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3bNode != 0) && (here->BSIM3gNode != 0)) + { + while (here->BSIM3BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3dNodePrime != 0) && (here->BSIM3gNode != 0)) + { + while (here->BSIM3DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3sNodePrime != 0) && (here->BSIM3gNode != 0)) + { + while (here->BSIM3SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3sNodePrime != 0) && (here->BSIM3sNode != 0)) + { + while (here->BSIM3SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3dNodePrime != 0) && (here->BSIM3bNode != 0)) + { + while (here->BSIM3DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3sNodePrime != 0) && (here->BSIM3bNode != 0)) + { + while (here->BSIM3SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3sNodePrime != 0) && (here->BSIM3dNodePrime != 0)) + { + while (here->BSIM3SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3qNode != 0) && (here->BSIM3qNode != 0)) + { + while (here->BSIM3QqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3QqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3qNode != 0) && (here->BSIM3dNodePrime != 0)) + { + while (here->BSIM3QdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3QdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3qNode != 0) && (here->BSIM3sNodePrime != 0)) + { + while (here->BSIM3QspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3QspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3qNode != 0) && (here->BSIM3gNode != 0)) + { + while (here->BSIM3QgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3QgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3qNode != 0) && (here->BSIM3bNode != 0)) + { + while (here->BSIM3QbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3QbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3dNodePrime != 0) && (here->BSIM3qNode != 0)) + { + while (here->BSIM3DPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3DPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3sNodePrime != 0) && (here->BSIM3qNode != 0)) + { + while (here->BSIM3SPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3SPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3gNode != 0) && (here->BSIM3qNode != 0)) + { + while (here->BSIM3GqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3GqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3bNode != 0) && (here->BSIM3qNode != 0)) + { + while (here->BSIM3BqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3BqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim3/bsim3ext.h b/src/spicelib/devices/bsim3/bsim3ext.h index 18048f9a7..968a18a99 100644 --- a/src/spicelib/devices/bsim3/bsim3ext.h +++ b/src/spicelib/devices/bsim3/bsim3ext.h @@ -30,6 +30,7 @@ extern int BSIM3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3unsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BSIM3bindCSC(GENmodel*, CKTcircuit*); -extern int BSIM3bindCSCComplex(GENmodel*, CKTcircuit*); +extern int BSIM3bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM3bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM3bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim3/bsim3init.c b/src/spicelib/devices/bsim3/bsim3init.c index 10018ea78..82359c40a 100644 --- a/src/spicelib/devices/bsim3/bsim3init.c +++ b/src/spicelib/devices/bsim3/bsim3init.c @@ -75,6 +75,7 @@ SPICEdev BSIM3info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ BSIM3bindCSC, /* DEVbindCSCComplex */ BSIM3bindCSCComplex, + /* DEVbindCSCComplexToReal */ BSIM3bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddbindCSC.c b/src/spicelib/devices/bsim3soi_dd/b3soiddbindCSC.c index 47fbcfe55..e9fd3ef9c 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddbindCSC.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddbindCSC.c @@ -1198,3 +1198,679 @@ B3SOIDDbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +B3SOIDDbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + B3SOIDDmodel *model = (B3SOIDDmodel *)inModel ; + B3SOIDDinstance *here ; + int i ; + + /* loop through all the bsim3SiliconOnInsulatorDepleted models */ + for ( ; model != NULL ; model = model->B3SOIDDnextModel) + { + /* loop through all the instances of the model */ + for (here = model->B3SOIDDinstances ; here != NULL ; here = here->B3SOIDDnextInstance) + { + i = 0 ; + if ((here->B3SOIDDtempNode != 0) && (here->B3SOIDDtempNode != 0)) + { + while (here->B3SOIDDTemptempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDTemptempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDtempNode != 0) && (here->B3SOIDDdNodePrime != 0)) + { + while (here->B3SOIDDTempdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDTempdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDtempNode != 0) && (here->B3SOIDDsNodePrime != 0)) + { + while (here->B3SOIDDTempspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDTempspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDtempNode != 0) && (here->B3SOIDDgNode != 0)) + { + while (here->B3SOIDDTempgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDTempgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDtempNode != 0) && (here->B3SOIDDbNode != 0)) + { + while (here->B3SOIDDTempbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDTempbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDtempNode != 0) && (here->B3SOIDDeNode != 0)) + { + while (here->B3SOIDDTempePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDTempePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgNode != 0) && (here->B3SOIDDtempNode != 0)) + { + while (here->B3SOIDDGtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNodePrime != 0) && (here->B3SOIDDtempNode != 0)) + { + while (here->B3SOIDDDPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNodePrime != 0) && (here->B3SOIDDtempNode != 0)) + { + while (here->B3SOIDDSPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDeNode != 0) && (here->B3SOIDDtempNode != 0)) + { + while (here->B3SOIDDEtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDEtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDbNode != 0) && (here->B3SOIDDtempNode != 0)) + { + while (here->B3SOIDDBtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDBtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDpNode != 0) && (here->B3SOIDDtempNode != 0)) + { + while (here->B3SOIDDPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDbNode != 0) && (here->B3SOIDDpNode != 0)) + { + while (here->B3SOIDDBpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDBpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDpNode != 0) && (here->B3SOIDDbNode != 0)) + { + while (here->B3SOIDDPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDpNode != 0) && (here->B3SOIDDpNode != 0)) + { + while (here->B3SOIDDPpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDPpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDpNode != 0) && (here->B3SOIDDgNode != 0)) + { + while (here->B3SOIDDPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDpNode != 0) && (here->B3SOIDDdNodePrime != 0)) + { + while (here->B3SOIDDPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDpNode != 0) && (here->B3SOIDDsNodePrime != 0)) + { + while (here->B3SOIDDPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDpNode != 0) && (here->B3SOIDDeNode != 0)) + { + while (here->B3SOIDDPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDeNode != 0) && (here->B3SOIDDgNode != 0)) + { + while (here->B3SOIDDEgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDEgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDeNode != 0) && (here->B3SOIDDdNodePrime != 0)) + { + while (here->B3SOIDDEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDeNode != 0) && (here->B3SOIDDsNodePrime != 0)) + { + while (here->B3SOIDDEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgNode != 0) && (here->B3SOIDDeNode != 0)) + { + while (here->B3SOIDDGePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNodePrime != 0) && (here->B3SOIDDeNode != 0)) + { + while (here->B3SOIDDDPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNodePrime != 0) && (here->B3SOIDDeNode != 0)) + { + while (here->B3SOIDDSPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDeNode != 0) && (here->B3SOIDDbNode != 0)) + { + while (here->B3SOIDDEbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDEbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgNode != 0) && (here->B3SOIDDbNode != 0)) + { + while (here->B3SOIDDGbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNodePrime != 0) && (here->B3SOIDDbNode != 0)) + { + while (here->B3SOIDDDPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNodePrime != 0) && (here->B3SOIDDbNode != 0)) + { + while (here->B3SOIDDSPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDbNode != 0) && (here->B3SOIDDeNode != 0)) + { + while (here->B3SOIDDBePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDBePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDbNode != 0) && (here->B3SOIDDgNode != 0)) + { + while (here->B3SOIDDBgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDBgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDbNode != 0) && (here->B3SOIDDdNodePrime != 0)) + { + while (here->B3SOIDDBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDbNode != 0) && (here->B3SOIDDsNodePrime != 0)) + { + while (here->B3SOIDDBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDbNode != 0) && (here->B3SOIDDbNode != 0)) + { + while (here->B3SOIDDBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDeNode != 0) && (here->B3SOIDDbNode != 0)) + { + while (here->B3SOIDDEbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDEbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDeNode != 0) && (here->B3SOIDDeNode != 0)) + { + while (here->B3SOIDDEePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDEePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgNode != 0) && (here->B3SOIDDgNode != 0)) + { + while (here->B3SOIDDGgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgNode != 0) && (here->B3SOIDDdNodePrime != 0)) + { + while (here->B3SOIDDGdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgNode != 0) && (here->B3SOIDDsNodePrime != 0)) + { + while (here->B3SOIDDGspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNodePrime != 0) && (here->B3SOIDDgNode != 0)) + { + while (here->B3SOIDDDPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNodePrime != 0) && (here->B3SOIDDdNodePrime != 0)) + { + while (here->B3SOIDDDPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNodePrime != 0) && (here->B3SOIDDsNodePrime != 0)) + { + while (here->B3SOIDDDPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNodePrime != 0) && (here->B3SOIDDdNode != 0)) + { + while (here->B3SOIDDDPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNodePrime != 0) && (here->B3SOIDDgNode != 0)) + { + while (here->B3SOIDDSPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNodePrime != 0) && (here->B3SOIDDdNodePrime != 0)) + { + while (here->B3SOIDDSPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNodePrime != 0) && (here->B3SOIDDsNodePrime != 0)) + { + while (here->B3SOIDDSPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNodePrime != 0) && (here->B3SOIDDsNode != 0)) + { + while (here->B3SOIDDSPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNode != 0) && (here->B3SOIDDdNode != 0)) + { + while (here->B3SOIDDDdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdNode != 0) && (here->B3SOIDDdNodePrime != 0)) + { + while (here->B3SOIDDDdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNode != 0) && (here->B3SOIDDsNode != 0)) + { + while (here->B3SOIDDSsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDsNode != 0) && (here->B3SOIDDsNodePrime != 0)) + { + while (here->B3SOIDDSspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDSspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDvbsNode != 0) && (here->B3SOIDDvbsNode != 0)) + { + while (here->B3SOIDDVbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDVbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDidsNode != 0) && (here->B3SOIDDidsNode != 0)) + { + while (here->B3SOIDDIdsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDIdsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDicNode != 0) && (here->B3SOIDDicNode != 0)) + { + while (here->B3SOIDDIcPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDIcPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDibsNode != 0) && (here->B3SOIDDibsNode != 0)) + { + while (here->B3SOIDDIbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDIbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDibdNode != 0) && (here->B3SOIDDibdNode != 0)) + { + while (here->B3SOIDDIbdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDIbdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDiiiNode != 0) && (here->B3SOIDDiiiNode != 0)) + { + while (here->B3SOIDDIiiPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDIiiPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDigidlNode != 0) && (here->B3SOIDDigidlNode != 0)) + { + while (here->B3SOIDDIgidlPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDIgidlPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDitunNode != 0) && (here->B3SOIDDitunNode != 0)) + { + while (here->B3SOIDDItunPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDItunPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDibpNode != 0) && (here->B3SOIDDibpNode != 0)) + { + while (here->B3SOIDDIbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDIbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDabeffNode != 0) && (here->B3SOIDDabeffNode != 0)) + { + while (here->B3SOIDDAbeffPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDAbeffPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDvbs0effNode != 0) && (here->B3SOIDDvbs0effNode != 0)) + { + while (here->B3SOIDDVbs0effPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDVbs0effPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDvbseffNode != 0) && (here->B3SOIDDvbseffNode != 0)) + { + while (here->B3SOIDDVbseffPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDVbseffPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDxcNode != 0) && (here->B3SOIDDxcNode != 0)) + { + while (here->B3SOIDDXcPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDXcPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDcbbNode != 0) && (here->B3SOIDDcbbNode != 0)) + { + while (here->B3SOIDDCbbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDCbbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDcbdNode != 0) && (here->B3SOIDDcbdNode != 0)) + { + while (here->B3SOIDDCbdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDCbdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDcbgNode != 0) && (here->B3SOIDDcbgNode != 0)) + { + while (here->B3SOIDDCbgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDCbgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqbNode != 0) && (here->B3SOIDDqbNode != 0)) + { + while (here->B3SOIDDqbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDqbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqbfNode != 0) && (here->B3SOIDDqbfNode != 0)) + { + while (here->B3SOIDDQbfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDQbfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqjsNode != 0) && (here->B3SOIDDqjsNode != 0)) + { + while (here->B3SOIDDQjsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDQjsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqjdNode != 0) && (here->B3SOIDDqjdNode != 0)) + { + while (here->B3SOIDDQjdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDQjdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgmNode != 0) && (here->B3SOIDDgmNode != 0)) + { + while (here->B3SOIDDGmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgmbsNode != 0) && (here->B3SOIDDgmbsNode != 0)) + { + while (here->B3SOIDDGmbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGmbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgdsNode != 0) && (here->B3SOIDDgdsNode != 0)) + { + while (here->B3SOIDDGdsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGdsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDgmeNode != 0) && (here->B3SOIDDgmeNode != 0)) + { + while (here->B3SOIDDGmePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDGmePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDvbs0teffNode != 0) && (here->B3SOIDDvbs0teffNode != 0)) + { + while (here->B3SOIDDVbs0teffPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDVbs0teffPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDvthNode != 0) && (here->B3SOIDDvthNode != 0)) + { + while (here->B3SOIDDVthPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDVthPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDvgsteffNode != 0) && (here->B3SOIDDvgsteffNode != 0)) + { + while (here->B3SOIDDVgsteffPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDVgsteffPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDxcsatNode != 0) && (here->B3SOIDDxcsatNode != 0)) + { + while (here->B3SOIDDXcsatPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDXcsatPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDvcscvNode != 0) && (here->B3SOIDDvcscvNode != 0)) + { + while (here->B3SOIDDVcscvPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDVcscvPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDvdscvNode != 0) && (here->B3SOIDDvdscvNode != 0)) + { + while (here->B3SOIDDVdscvPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDVdscvPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDcbeNode != 0) && (here->B3SOIDDcbeNode != 0)) + { + while (here->B3SOIDDCbePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDCbePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdum1Node != 0) && (here->B3SOIDDdum1Node != 0)) + { + while (here->B3SOIDDDum1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDum1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdum2Node != 0) && (here->B3SOIDDdum2Node != 0)) + { + while (here->B3SOIDDDum2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDum2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdum3Node != 0) && (here->B3SOIDDdum3Node != 0)) + { + while (here->B3SOIDDDum3Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDum3Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdum4Node != 0) && (here->B3SOIDDdum4Node != 0)) + { + while (here->B3SOIDDDum4Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDum4Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDdum5Node != 0) && (here->B3SOIDDdum5Node != 0)) + { + while (here->B3SOIDDDum5Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDDum5Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqaccNode != 0) && (here->B3SOIDDqaccNode != 0)) + { + while (here->B3SOIDDQaccPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDQaccPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqsub0Node != 0) && (here->B3SOIDDqsub0Node != 0)) + { + while (here->B3SOIDDQsub0Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDQsub0Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqsubs1Node != 0) && (here->B3SOIDDqsubs1Node != 0)) + { + while (here->B3SOIDDQsubs1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDQsubs1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqsubs2Node != 0) && (here->B3SOIDDqsubs2Node != 0)) + { + while (here->B3SOIDDQsubs2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDQsubs2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqeNode != 0) && (here->B3SOIDDqeNode != 0)) + { + while (here->B3SOIDDqePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDqePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqdNode != 0) && (here->B3SOIDDqdNode != 0)) + { + while (here->B3SOIDDqdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDqdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIDDqgNode != 0) && (here->B3SOIDDqgNode != 0)) + { + while (here->B3SOIDDqgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIDDqgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h index c44ef830f..2fab26622 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h @@ -30,6 +30,7 @@ extern int B3SOIDDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIDDunsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int B3SOIDDbindCSC(GENmodel*, CKTcircuit*); -extern int B3SOIDDbindCSCComplex(GENmodel*, CKTcircuit*); +extern int B3SOIDDbindCSC (GENmodel*, CKTcircuit*) ; +extern int B3SOIDDbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int B3SOIDDbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c index c9896a5b3..3832bae04 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c @@ -73,6 +73,7 @@ SPICEdev B3SOIDDinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ B3SOIDDbindCSC, /* DEVbindCSCComplex */ B3SOIDDbindCSCComplex, + /* DEVbindCSCComplexToReal */ B3SOIDDbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdbindCSC.c b/src/spicelib/devices/bsim3soi_fd/b3soifdbindCSC.c index dcdc8e859..509592d0e 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdbindCSC.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdbindCSC.c @@ -1090,3 +1090,616 @@ B3SOIFDbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +B3SOIFDbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + B3SOIFDmodel *model = (B3SOIFDmodel *)inModel ; + B3SOIFDinstance *here ; + int i ; + + /* loop through all the bsim3SiliconOnInsulatorFullyDepleted models */ + for ( ; model != NULL ; model = model->B3SOIFDnextModel) + { + /* loop through all the instances of the model */ + for (here = model->B3SOIFDinstances ; here != NULL ; here = here->B3SOIFDnextInstance) + { + i = 0 ; + if ((here->B3SOIFDtempNode != 0) && (here->B3SOIFDtempNode != 0)) + { + while (here->B3SOIFDTemptempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDTemptempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDtempNode != 0) && (here->B3SOIFDdNodePrime != 0)) + { + while (here->B3SOIFDTempdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDTempdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDtempNode != 0) && (here->B3SOIFDsNodePrime != 0)) + { + while (here->B3SOIFDTempspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDTempspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDtempNode != 0) && (here->B3SOIFDgNode != 0)) + { + while (here->B3SOIFDTempgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDTempgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDtempNode != 0) && (here->B3SOIFDbNode != 0)) + { + while (here->B3SOIFDTempbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDTempbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDtempNode != 0) && (here->B3SOIFDeNode != 0)) + { + while (here->B3SOIFDTempePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDTempePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgNode != 0) && (here->B3SOIFDtempNode != 0)) + { + while (here->B3SOIFDGtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdNodePrime != 0) && (here->B3SOIFDtempNode != 0)) + { + while (here->B3SOIFDDPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDsNodePrime != 0) && (here->B3SOIFDtempNode != 0)) + { + while (here->B3SOIFDSPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDSPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDeNode != 0) && (here->B3SOIFDtempNode != 0)) + { + while (here->B3SOIFDEtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDEtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDbNode != 0) && (here->B3SOIFDtempNode != 0)) + { + while (here->B3SOIFDBtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDBtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDpNode != 0) && (here->B3SOIFDtempNode != 0)) + { + while (here->B3SOIFDPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDbNode != 0) && (here->B3SOIFDpNode != 0)) + { + while (here->B3SOIFDBpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDBpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDpNode != 0) && (here->B3SOIFDbNode != 0)) + { + while (here->B3SOIFDPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDpNode != 0) && (here->B3SOIFDpNode != 0)) + { + while (here->B3SOIFDPpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDPpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDpNode != 0) && (here->B3SOIFDgNode != 0)) + { + while (here->B3SOIFDPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDpNode != 0) && (here->B3SOIFDdNodePrime != 0)) + { + while (here->B3SOIFDPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDpNode != 0) && (here->B3SOIFDsNodePrime != 0)) + { + while (here->B3SOIFDPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDpNode != 0) && (here->B3SOIFDeNode != 0)) + { + while (here->B3SOIFDPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDeNode != 0) && (here->B3SOIFDgNode != 0)) + { + while (here->B3SOIFDEgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDEgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDeNode != 0) && (here->B3SOIFDdNodePrime != 0)) + { + while (here->B3SOIFDEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDeNode != 0) && (here->B3SOIFDsNodePrime != 0)) + { + while (here->B3SOIFDEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgNode != 0) && (here->B3SOIFDeNode != 0)) + { + while (here->B3SOIFDGePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdNodePrime != 0) && (here->B3SOIFDeNode != 0)) + { + while (here->B3SOIFDDPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDsNodePrime != 0) && (here->B3SOIFDeNode != 0)) + { + while (here->B3SOIFDSPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDSPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDeNode != 0) && (here->B3SOIFDbNode != 0)) + { + while (here->B3SOIFDEbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDEbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDeNode != 0) && (here->B3SOIFDeNode != 0)) + { + while (here->B3SOIFDEePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDEePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgNode != 0) && (here->B3SOIFDgNode != 0)) + { + while (here->B3SOIFDGgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgNode != 0) && (here->B3SOIFDdNodePrime != 0)) + { + while (here->B3SOIFDGdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgNode != 0) && (here->B3SOIFDsNodePrime != 0)) + { + while (here->B3SOIFDGspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdNodePrime != 0) && (here->B3SOIFDgNode != 0)) + { + while (here->B3SOIFDDPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdNodePrime != 0) && (here->B3SOIFDdNodePrime != 0)) + { + while (here->B3SOIFDDPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdNodePrime != 0) && (here->B3SOIFDsNodePrime != 0)) + { + while (here->B3SOIFDDPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdNodePrime != 0) && (here->B3SOIFDdNode != 0)) + { + while (here->B3SOIFDDPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDsNodePrime != 0) && (here->B3SOIFDgNode != 0)) + { + while (here->B3SOIFDSPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDSPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDsNodePrime != 0) && (here->B3SOIFDdNodePrime != 0)) + { + while (here->B3SOIFDSPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDSPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDsNodePrime != 0) && (here->B3SOIFDsNodePrime != 0)) + { + while (here->B3SOIFDSPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDSPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDsNodePrime != 0) && (here->B3SOIFDsNode != 0)) + { + while (here->B3SOIFDSPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDSPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdNode != 0) && (here->B3SOIFDdNode != 0)) + { + while (here->B3SOIFDDdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdNode != 0) && (here->B3SOIFDdNodePrime != 0)) + { + while (here->B3SOIFDDdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDsNode != 0) && (here->B3SOIFDsNode != 0)) + { + while (here->B3SOIFDSsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDSsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDsNode != 0) && (here->B3SOIFDsNodePrime != 0)) + { + while (here->B3SOIFDSspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDSspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDvbsNode != 0) && (here->B3SOIFDvbsNode != 0)) + { + while (here->B3SOIFDVbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDVbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDidsNode != 0) && (here->B3SOIFDidsNode != 0)) + { + while (here->B3SOIFDIdsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDIdsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDicNode != 0) && (here->B3SOIFDicNode != 0)) + { + while (here->B3SOIFDIcPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDIcPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDibsNode != 0) && (here->B3SOIFDibsNode != 0)) + { + while (here->B3SOIFDIbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDIbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDibdNode != 0) && (here->B3SOIFDibdNode != 0)) + { + while (here->B3SOIFDIbdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDIbdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDiiiNode != 0) && (here->B3SOIFDiiiNode != 0)) + { + while (here->B3SOIFDIiiPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDIiiPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDigidlNode != 0) && (here->B3SOIFDigidlNode != 0)) + { + while (here->B3SOIFDIgidlPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDIgidlPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDitunNode != 0) && (here->B3SOIFDitunNode != 0)) + { + while (here->B3SOIFDItunPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDItunPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDibpNode != 0) && (here->B3SOIFDibpNode != 0)) + { + while (here->B3SOIFDIbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDIbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDabeffNode != 0) && (here->B3SOIFDabeffNode != 0)) + { + while (here->B3SOIFDAbeffPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDAbeffPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDvbs0effNode != 0) && (here->B3SOIFDvbs0effNode != 0)) + { + while (here->B3SOIFDVbs0effPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDVbs0effPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDvbseffNode != 0) && (here->B3SOIFDvbseffNode != 0)) + { + while (here->B3SOIFDVbseffPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDVbseffPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDxcNode != 0) && (here->B3SOIFDxcNode != 0)) + { + while (here->B3SOIFDXcPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDXcPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDcbbNode != 0) && (here->B3SOIFDcbbNode != 0)) + { + while (here->B3SOIFDCbbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDCbbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDcbdNode != 0) && (here->B3SOIFDcbdNode != 0)) + { + while (here->B3SOIFDCbdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDCbdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDcbgNode != 0) && (here->B3SOIFDcbgNode != 0)) + { + while (here->B3SOIFDCbgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDCbgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqbNode != 0) && (here->B3SOIFDqbNode != 0)) + { + while (here->B3SOIFDqbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDqbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqbfNode != 0) && (here->B3SOIFDqbfNode != 0)) + { + while (here->B3SOIFDQbfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDQbfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqjsNode != 0) && (here->B3SOIFDqjsNode != 0)) + { + while (here->B3SOIFDQjsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDQjsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqjdNode != 0) && (here->B3SOIFDqjdNode != 0)) + { + while (here->B3SOIFDQjdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDQjdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgmNode != 0) && (here->B3SOIFDgmNode != 0)) + { + while (here->B3SOIFDGmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgmbsNode != 0) && (here->B3SOIFDgmbsNode != 0)) + { + while (here->B3SOIFDGmbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGmbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgdsNode != 0) && (here->B3SOIFDgdsNode != 0)) + { + while (here->B3SOIFDGdsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGdsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDgmeNode != 0) && (here->B3SOIFDgmeNode != 0)) + { + while (here->B3SOIFDGmePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDGmePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDvbs0teffNode != 0) && (here->B3SOIFDvbs0teffNode != 0)) + { + while (here->B3SOIFDVbs0teffPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDVbs0teffPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDvthNode != 0) && (here->B3SOIFDvthNode != 0)) + { + while (here->B3SOIFDVthPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDVthPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDvgsteffNode != 0) && (here->B3SOIFDvgsteffNode != 0)) + { + while (here->B3SOIFDVgsteffPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDVgsteffPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDxcsatNode != 0) && (here->B3SOIFDxcsatNode != 0)) + { + while (here->B3SOIFDXcsatPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDXcsatPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDvcscvNode != 0) && (here->B3SOIFDvcscvNode != 0)) + { + while (here->B3SOIFDVcscvPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDVcscvPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDvdscvNode != 0) && (here->B3SOIFDvdscvNode != 0)) + { + while (here->B3SOIFDVdscvPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDVdscvPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDcbeNode != 0) && (here->B3SOIFDcbeNode != 0)) + { + while (here->B3SOIFDCbePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDCbePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdum1Node != 0) && (here->B3SOIFDdum1Node != 0)) + { + while (here->B3SOIFDDum1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDum1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdum2Node != 0) && (here->B3SOIFDdum2Node != 0)) + { + while (here->B3SOIFDDum2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDum2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdum3Node != 0) && (here->B3SOIFDdum3Node != 0)) + { + while (here->B3SOIFDDum3Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDum3Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdum4Node != 0) && (here->B3SOIFDdum4Node != 0)) + { + while (here->B3SOIFDDum4Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDum4Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDdum5Node != 0) && (here->B3SOIFDdum5Node != 0)) + { + while (here->B3SOIFDDum5Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDDum5Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqaccNode != 0) && (here->B3SOIFDqaccNode != 0)) + { + while (here->B3SOIFDQaccPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDQaccPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqsub0Node != 0) && (here->B3SOIFDqsub0Node != 0)) + { + while (here->B3SOIFDQsub0Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDQsub0Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqsubs1Node != 0) && (here->B3SOIFDqsubs1Node != 0)) + { + while (here->B3SOIFDQsubs1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDQsubs1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqsubs2Node != 0) && (here->B3SOIFDqsubs2Node != 0)) + { + while (here->B3SOIFDQsubs2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDQsubs2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqeNode != 0) && (here->B3SOIFDqeNode != 0)) + { + while (here->B3SOIFDqePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDqePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqdNode != 0) && (here->B3SOIFDqdNode != 0)) + { + while (here->B3SOIFDqdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDqdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIFDqgNode != 0) && (here->B3SOIFDqgNode != 0)) + { + while (here->B3SOIFDqgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIFDqgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h index 29186ed9d..8be71ed72 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h @@ -31,6 +31,7 @@ extern int B3SOIFDunsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int B3SOIFDbindCSC(GENmodel*, CKTcircuit*); -extern int B3SOIFDbindCSCComplex(GENmodel*, CKTcircuit*); +extern int B3SOIFDbindCSC (GENmodel*, CKTcircuit*) ; +extern int B3SOIFDbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int B3SOIFDbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c index 21c69a62a..f23acd7f9 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c @@ -74,6 +74,7 @@ SPICEdev B3SOIFDinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ B3SOIFDbindCSC, /* DEVbindCSCComplex */ B3SOIFDbindCSCComplex, + /* DEVbindCSCComplexToReal */ B3SOIFDbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdbindCSC.c b/src/spicelib/devices/bsim3soi_pd/b3soipdbindCSC.c index 9786ccca6..5733adb1f 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdbindCSC.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdbindCSC.c @@ -850,3 +850,476 @@ B3SOIPDbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +B3SOIPDbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + B3SOIPDmodel *model = (B3SOIPDmodel *)inModel ; + B3SOIPDinstance *here ; + int i ; + + /* loop through all the bsim3SiliconOnInsulatorPartiallyDepleted models */ + for ( ; model != NULL ; model = model->B3SOIPDnextModel) + { + /* loop through all the instances of the model */ + for (here = model->B3SOIPDinstances ; here != NULL ; here = here->B3SOIPDnextInstance) + { + i = 0 ; + if ((here->B3SOIPDtempNode != 0) && (here->B3SOIPDtempNode != 0)) + { + while (here->B3SOIPDTemptempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDTemptempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDtempNode != 0) && (here->B3SOIPDdNodePrime != 0)) + { + while (here->B3SOIPDTempdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDTempdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDtempNode != 0) && (here->B3SOIPDsNodePrime != 0)) + { + while (here->B3SOIPDTempspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDTempspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDtempNode != 0) && (here->B3SOIPDgNode != 0)) + { + while (here->B3SOIPDTempgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDTempgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDtempNode != 0) && (here->B3SOIPDbNode != 0)) + { + while (here->B3SOIPDTempbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDTempbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgNode != 0) && (here->B3SOIPDtempNode != 0)) + { + while (here->B3SOIPDGtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNodePrime != 0) && (here->B3SOIPDtempNode != 0)) + { + while (here->B3SOIPDDPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNodePrime != 0) && (here->B3SOIPDtempNode != 0)) + { + while (here->B3SOIPDSPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDeNode != 0) && (here->B3SOIPDtempNode != 0)) + { + while (here->B3SOIPDEtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDEtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDbNode != 0) && (here->B3SOIPDtempNode != 0)) + { + while (here->B3SOIPDBtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDBtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDpNode != 0) && (here->B3SOIPDtempNode != 0)) + { + while (here->B3SOIPDPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDbNode != 0) && (here->B3SOIPDpNode != 0)) + { + while (here->B3SOIPDBpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDBpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDpNode != 0) && (here->B3SOIPDbNode != 0)) + { + while (here->B3SOIPDPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDpNode != 0) && (here->B3SOIPDpNode != 0)) + { + while (here->B3SOIPDPpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDPpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDeNode != 0) && (here->B3SOIPDbNode != 0)) + { + while (here->B3SOIPDEbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDEbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgNode != 0) && (here->B3SOIPDbNode != 0)) + { + while (here->B3SOIPDGbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNodePrime != 0) && (here->B3SOIPDbNode != 0)) + { + while (here->B3SOIPDDPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNodePrime != 0) && (here->B3SOIPDbNode != 0)) + { + while (here->B3SOIPDSPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDbNode != 0) && (here->B3SOIPDeNode != 0)) + { + while (here->B3SOIPDBePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDBePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDbNode != 0) && (here->B3SOIPDgNode != 0)) + { + while (here->B3SOIPDBgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDBgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDbNode != 0) && (here->B3SOIPDdNodePrime != 0)) + { + while (here->B3SOIPDBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDbNode != 0) && (here->B3SOIPDsNodePrime != 0)) + { + while (here->B3SOIPDBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDbNode != 0) && (here->B3SOIPDbNode != 0)) + { + while (here->B3SOIPDBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDeNode != 0) && (here->B3SOIPDgNode != 0)) + { + while (here->B3SOIPDEgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDEgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDeNode != 0) && (here->B3SOIPDdNodePrime != 0)) + { + while (here->B3SOIPDEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDeNode != 0) && (here->B3SOIPDsNodePrime != 0)) + { + while (here->B3SOIPDEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgNode != 0) && (here->B3SOIPDeNode != 0)) + { + while (here->B3SOIPDGePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNodePrime != 0) && (here->B3SOIPDeNode != 0)) + { + while (here->B3SOIPDDPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNodePrime != 0) && (here->B3SOIPDeNode != 0)) + { + while (here->B3SOIPDSPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDeNode != 0) && (here->B3SOIPDbNode != 0)) + { + while (here->B3SOIPDEbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDEbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDeNode != 0) && (here->B3SOIPDeNode != 0)) + { + while (here->B3SOIPDEePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDEePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgNode != 0) && (here->B3SOIPDgNode != 0)) + { + while (here->B3SOIPDGgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgNode != 0) && (here->B3SOIPDdNodePrime != 0)) + { + while (here->B3SOIPDGdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgNode != 0) && (here->B3SOIPDsNodePrime != 0)) + { + while (here->B3SOIPDGspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNodePrime != 0) && (here->B3SOIPDgNode != 0)) + { + while (here->B3SOIPDDPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNodePrime != 0) && (here->B3SOIPDdNodePrime != 0)) + { + while (here->B3SOIPDDPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNodePrime != 0) && (here->B3SOIPDsNodePrime != 0)) + { + while (here->B3SOIPDDPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNodePrime != 0) && (here->B3SOIPDdNode != 0)) + { + while (here->B3SOIPDDPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNodePrime != 0) && (here->B3SOIPDgNode != 0)) + { + while (here->B3SOIPDSPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNodePrime != 0) && (here->B3SOIPDdNodePrime != 0)) + { + while (here->B3SOIPDSPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNodePrime != 0) && (here->B3SOIPDsNodePrime != 0)) + { + while (here->B3SOIPDSPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNodePrime != 0) && (here->B3SOIPDsNode != 0)) + { + while (here->B3SOIPDSPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNode != 0) && (here->B3SOIPDdNode != 0)) + { + while (here->B3SOIPDDdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDdNode != 0) && (here->B3SOIPDdNodePrime != 0)) + { + while (here->B3SOIPDDdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDDdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNode != 0) && (here->B3SOIPDsNode != 0)) + { + while (here->B3SOIPDSsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDsNode != 0) && (here->B3SOIPDsNodePrime != 0)) + { + while (here->B3SOIPDSspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDSspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDvbsNode != 0) && (here->B3SOIPDvbsNode != 0)) + { + while (here->B3SOIPDVbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDVbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDidsNode != 0) && (here->B3SOIPDidsNode != 0)) + { + while (here->B3SOIPDIdsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDIdsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDicNode != 0) && (here->B3SOIPDicNode != 0)) + { + while (here->B3SOIPDIcPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDIcPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDibsNode != 0) && (here->B3SOIPDibsNode != 0)) + { + while (here->B3SOIPDIbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDIbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDibdNode != 0) && (here->B3SOIPDibdNode != 0)) + { + while (here->B3SOIPDIbdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDIbdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDiiiNode != 0) && (here->B3SOIPDiiiNode != 0)) + { + while (here->B3SOIPDIiiPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDIiiPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDigNode != 0) && (here->B3SOIPDigNode != 0)) + { + while (here->B3SOIPDIgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDIgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgiggNode != 0) && (here->B3SOIPDgiggNode != 0)) + { + while (here->B3SOIPDGiggPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGiggPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgigdNode != 0) && (here->B3SOIPDgigdNode != 0)) + { + while (here->B3SOIPDGigdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGigdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDgigbNode != 0) && (here->B3SOIPDgigbNode != 0)) + { + while (here->B3SOIPDGigbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDGigbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDigidlNode != 0) && (here->B3SOIPDigidlNode != 0)) + { + while (here->B3SOIPDIgidlPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDIgidlPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDitunNode != 0) && (here->B3SOIPDitunNode != 0)) + { + while (here->B3SOIPDItunPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDItunPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDibpNode != 0) && (here->B3SOIPDibpNode != 0)) + { + while (here->B3SOIPDIbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDIbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDcbbNode != 0) && (here->B3SOIPDcbbNode != 0)) + { + while (here->B3SOIPDCbbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDCbbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDcbdNode != 0) && (here->B3SOIPDcbdNode != 0)) + { + while (here->B3SOIPDCbdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDCbdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDcbgNode != 0) && (here->B3SOIPDcbgNode != 0)) + { + while (here->B3SOIPDCbgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDCbgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDqbfNode != 0) && (here->B3SOIPDqbfNode != 0)) + { + while (here->B3SOIPDQbfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDQbfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDqjsNode != 0) && (here->B3SOIPDqjsNode != 0)) + { + while (here->B3SOIPDQjsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDQjsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B3SOIPDqjdNode != 0) && (here->B3SOIPDqjdNode != 0)) + { + while (here->B3SOIPDQjdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B3SOIPDQjdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h index a82e95833..f8661c4f8 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h @@ -30,6 +30,7 @@ extern int B3SOIPDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIPDunsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int B3SOIPDbindCSC(GENmodel*, CKTcircuit*); -extern int B3SOIPDbindCSCComplex(GENmodel*, CKTcircuit*); +extern int B3SOIPDbindCSC (GENmodel*, CKTcircuit*) ; +extern int B3SOIPDbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int B3SOIPDbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c index 40570ab07..02f987ad1 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c @@ -75,6 +75,7 @@ SPICEdev B3SOIPDinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ B3SOIPDbindCSC, /* DEVbindCSCComplex */ B3SOIPDbindCSCComplex, + /* DEVbindCSCComplexToReal */ B3SOIPDbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim3v0/b3v0bindCSC.c b/src/spicelib/devices/bsim3v0/b3v0bindCSC.c index 71d8ce625..7c9bcfe65 100644 --- a/src/spicelib/devices/bsim3v0/b3v0bindCSC.c +++ b/src/spicelib/devices/bsim3v0/b3v0bindCSC.c @@ -414,3 +414,238 @@ BSIM3v0bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BSIM3v0bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3v0model *model = (BSIM3v0model *)inModel ; + BSIM3v0instance *here ; + int i ; + + /* loop through all the bsim3v0 models */ + for ( ; model != NULL ; model = model->BSIM3v0nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM3v0instances ; here != NULL ; here = here->BSIM3v0nextInstance) + { + i = 0 ; + if ((here->BSIM3v0dNode != 0) && (here->BSIM3v0dNode != 0)) + { + while (here->BSIM3v0DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0gNode != 0) && (here->BSIM3v0gNode != 0)) + { + while (here->BSIM3v0GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0sNode != 0) && (here->BSIM3v0sNode != 0)) + { + while (here->BSIM3v0SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0bNode != 0) && (here->BSIM3v0bNode != 0)) + { + while (here->BSIM3v0BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0dNodePrime != 0) && (here->BSIM3v0dNodePrime != 0)) + { + while (here->BSIM3v0DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0sNodePrime != 0) && (here->BSIM3v0sNodePrime != 0)) + { + while (here->BSIM3v0SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0dNode != 0) && (here->BSIM3v0dNodePrime != 0)) + { + while (here->BSIM3v0DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0gNode != 0) && (here->BSIM3v0bNode != 0)) + { + while (here->BSIM3v0GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0gNode != 0) && (here->BSIM3v0dNodePrime != 0)) + { + while (here->BSIM3v0GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0gNode != 0) && (here->BSIM3v0sNodePrime != 0)) + { + while (here->BSIM3v0GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0sNode != 0) && (here->BSIM3v0sNodePrime != 0)) + { + while (here->BSIM3v0SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0bNode != 0) && (here->BSIM3v0dNodePrime != 0)) + { + while (here->BSIM3v0BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0bNode != 0) && (here->BSIM3v0sNodePrime != 0)) + { + while (here->BSIM3v0BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0dNodePrime != 0) && (here->BSIM3v0sNodePrime != 0)) + { + while (here->BSIM3v0DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0dNodePrime != 0) && (here->BSIM3v0dNode != 0)) + { + while (here->BSIM3v0DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0bNode != 0) && (here->BSIM3v0gNode != 0)) + { + while (here->BSIM3v0BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0dNodePrime != 0) && (here->BSIM3v0gNode != 0)) + { + while (here->BSIM3v0DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0sNodePrime != 0) && (here->BSIM3v0gNode != 0)) + { + while (here->BSIM3v0SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0sNodePrime != 0) && (here->BSIM3v0sNode != 0)) + { + while (here->BSIM3v0SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0dNodePrime != 0) && (here->BSIM3v0bNode != 0)) + { + while (here->BSIM3v0DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0sNodePrime != 0) && (here->BSIM3v0bNode != 0)) + { + while (here->BSIM3v0SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0sNodePrime != 0) && (here->BSIM3v0dNodePrime != 0)) + { + while (here->BSIM3v0SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0qNode != 0) && (here->BSIM3v0qNode != 0)) + { + while (here->BSIM3v0QqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0QqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0qNode != 0) && (here->BSIM3v0dNodePrime != 0)) + { + while (here->BSIM3v0QdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0QdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0qNode != 0) && (here->BSIM3v0sNodePrime != 0)) + { + while (here->BSIM3v0QspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0QspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0qNode != 0) && (here->BSIM3v0gNode != 0)) + { + while (here->BSIM3v0QgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0QgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0qNode != 0) && (here->BSIM3v0bNode != 0)) + { + while (here->BSIM3v0QbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0QbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0dNodePrime != 0) && (here->BSIM3v0qNode != 0)) + { + while (here->BSIM3v0DPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0DPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0sNodePrime != 0) && (here->BSIM3v0qNode != 0)) + { + while (here->BSIM3v0SPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0SPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0gNode != 0) && (here->BSIM3v0qNode != 0)) + { + while (here->BSIM3v0GqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0GqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v0bNode != 0) && (here->BSIM3v0qNode != 0)) + { + while (here->BSIM3v0BqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v0BqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim3v0/bsim3v0ext.h b/src/spicelib/devices/bsim3v0/bsim3v0ext.h index ecb512bab..c49bcdaf6 100644 --- a/src/spicelib/devices/bsim3v0/bsim3v0ext.h +++ b/src/spicelib/devices/bsim3v0/bsim3v0ext.h @@ -30,6 +30,7 @@ extern int BSIM3v0unsetup(GENmodel *, CKTcircuit *); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BSIM3v0bindCSC(GENmodel*, CKTcircuit*); -extern int BSIM3v0bindCSCComplex(GENmodel*, CKTcircuit*); +extern int BSIM3v0bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM3v0bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM3v0bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim3v0/bsim3v0init.c b/src/spicelib/devices/bsim3v0/bsim3v0init.c index e35b69371..161ac2e20 100644 --- a/src/spicelib/devices/bsim3v0/bsim3v0init.c +++ b/src/spicelib/devices/bsim3v0/bsim3v0init.c @@ -74,6 +74,7 @@ SPICEdev B3v0info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ BSIM3v0bindCSC, /* DEVbindCSCComplex */ BSIM3v0bindCSCComplex, + /* DEVbindCSCComplexToReal */ BSIM3v0bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim3v1/b3v1bindCSC.c b/src/spicelib/devices/bsim3v1/b3v1bindCSC.c index 3eaf1ac84..dbec6f54a 100644 --- a/src/spicelib/devices/bsim3v1/b3v1bindCSC.c +++ b/src/spicelib/devices/bsim3v1/b3v1bindCSC.c @@ -414,3 +414,238 @@ BSIM3v1bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BSIM3v1bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3v1model *model = (BSIM3v1model *)inModel ; + BSIM3v1instance *here ; + int i ; + + /* loop through all the bsim3v1 models */ + for ( ; model != NULL ; model = model->BSIM3v1nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM3v1instances ; here != NULL ; here = here->BSIM3v1nextInstance) + { + i = 0 ; + if ((here->BSIM3v1dNode != 0) && (here->BSIM3v1dNode != 0)) + { + while (here->BSIM3v1DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1gNode != 0) && (here->BSIM3v1gNode != 0)) + { + while (here->BSIM3v1GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1sNode != 0) && (here->BSIM3v1sNode != 0)) + { + while (here->BSIM3v1SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1bNode != 0) && (here->BSIM3v1bNode != 0)) + { + while (here->BSIM3v1BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1dNodePrime != 0) && (here->BSIM3v1dNodePrime != 0)) + { + while (here->BSIM3v1DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1sNodePrime != 0) && (here->BSIM3v1sNodePrime != 0)) + { + while (here->BSIM3v1SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1dNode != 0) && (here->BSIM3v1dNodePrime != 0)) + { + while (here->BSIM3v1DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1gNode != 0) && (here->BSIM3v1bNode != 0)) + { + while (here->BSIM3v1GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1gNode != 0) && (here->BSIM3v1dNodePrime != 0)) + { + while (here->BSIM3v1GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1gNode != 0) && (here->BSIM3v1sNodePrime != 0)) + { + while (here->BSIM3v1GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1sNode != 0) && (here->BSIM3v1sNodePrime != 0)) + { + while (here->BSIM3v1SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1bNode != 0) && (here->BSIM3v1dNodePrime != 0)) + { + while (here->BSIM3v1BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1bNode != 0) && (here->BSIM3v1sNodePrime != 0)) + { + while (here->BSIM3v1BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1dNodePrime != 0) && (here->BSIM3v1sNodePrime != 0)) + { + while (here->BSIM3v1DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1dNodePrime != 0) && (here->BSIM3v1dNode != 0)) + { + while (here->BSIM3v1DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1bNode != 0) && (here->BSIM3v1gNode != 0)) + { + while (here->BSIM3v1BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1dNodePrime != 0) && (here->BSIM3v1gNode != 0)) + { + while (here->BSIM3v1DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1sNodePrime != 0) && (here->BSIM3v1gNode != 0)) + { + while (here->BSIM3v1SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1sNodePrime != 0) && (here->BSIM3v1sNode != 0)) + { + while (here->BSIM3v1SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1dNodePrime != 0) && (here->BSIM3v1bNode != 0)) + { + while (here->BSIM3v1DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1sNodePrime != 0) && (here->BSIM3v1bNode != 0)) + { + while (here->BSIM3v1SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1sNodePrime != 0) && (here->BSIM3v1dNodePrime != 0)) + { + while (here->BSIM3v1SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1qNode != 0) && (here->BSIM3v1qNode != 0)) + { + while (here->BSIM3v1QqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1QqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1qNode != 0) && (here->BSIM3v1dNodePrime != 0)) + { + while (here->BSIM3v1QdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1QdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1qNode != 0) && (here->BSIM3v1sNodePrime != 0)) + { + while (here->BSIM3v1QspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1QspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1qNode != 0) && (here->BSIM3v1gNode != 0)) + { + while (here->BSIM3v1QgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1QgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1qNode != 0) && (here->BSIM3v1bNode != 0)) + { + while (here->BSIM3v1QbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1QbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1dNodePrime != 0) && (here->BSIM3v1qNode != 0)) + { + while (here->BSIM3v1DPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1DPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1sNodePrime != 0) && (here->BSIM3v1qNode != 0)) + { + while (here->BSIM3v1SPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1SPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1gNode != 0) && (here->BSIM3v1qNode != 0)) + { + while (here->BSIM3v1GqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1GqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v1bNode != 0) && (here->BSIM3v1qNode != 0)) + { + while (here->BSIM3v1BqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v1BqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim3v1/bsim3v1ext.h b/src/spicelib/devices/bsim3v1/bsim3v1ext.h index e7fe707fc..7a4a911c7 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1ext.h +++ b/src/spicelib/devices/bsim3v1/bsim3v1ext.h @@ -31,6 +31,7 @@ extern int BSIM3v1unsetup(GENmodel *, CKTcircuit *); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BSIM3v1bindCSC(GENmodel*, CKTcircuit*); -extern int BSIM3v1bindCSCComplex(GENmodel*, CKTcircuit*); +extern int BSIM3v1bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM3v1bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM3v1bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim3v1/bsim3v1init.c b/src/spicelib/devices/bsim3v1/bsim3v1init.c index 8b8e67312..d60cb4fb4 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1init.c +++ b/src/spicelib/devices/bsim3v1/bsim3v1init.c @@ -74,6 +74,7 @@ SPICEdev BSIM3v1info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ BSIM3v1bindCSC, /* DEVbindCSCComplex */ BSIM3v1bindCSCComplex, + /* DEVbindCSCComplexToReal */ BSIM3v1bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim3v32/b3v32bindCSC.c b/src/spicelib/devices/bsim3v32/b3v32bindCSC.c index 6f8d7e08a..933d3968f 100644 --- a/src/spicelib/devices/bsim3v32/b3v32bindCSC.c +++ b/src/spicelib/devices/bsim3v32/b3v32bindCSC.c @@ -414,3 +414,238 @@ BSIM3v32bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BSIM3v32bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3v32model *model = (BSIM3v32model *)inModel ; + BSIM3v32instance *here ; + int i ; + + /* loop through all the bsim3v32 models */ + for ( ; model != NULL ; model = model->BSIM3v32nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM3v32instances ; here != NULL ; here = here->BSIM3v32nextInstance) + { + i = 0 ; + if ((here->BSIM3v32dNode != 0) && (here->BSIM3v32dNode != 0)) + { + while (here->BSIM3v32DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32gNode != 0) && (here->BSIM3v32gNode != 0)) + { + while (here->BSIM3v32GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32sNode != 0) && (here->BSIM3v32sNode != 0)) + { + while (here->BSIM3v32SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32bNode != 0) && (here->BSIM3v32bNode != 0)) + { + while (here->BSIM3v32BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32dNodePrime != 0) && (here->BSIM3v32dNodePrime != 0)) + { + while (here->BSIM3v32DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32sNodePrime != 0) && (here->BSIM3v32sNodePrime != 0)) + { + while (here->BSIM3v32SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32dNode != 0) && (here->BSIM3v32dNodePrime != 0)) + { + while (here->BSIM3v32DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32gNode != 0) && (here->BSIM3v32bNode != 0)) + { + while (here->BSIM3v32GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32gNode != 0) && (here->BSIM3v32dNodePrime != 0)) + { + while (here->BSIM3v32GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32gNode != 0) && (here->BSIM3v32sNodePrime != 0)) + { + while (here->BSIM3v32GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32sNode != 0) && (here->BSIM3v32sNodePrime != 0)) + { + while (here->BSIM3v32SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32bNode != 0) && (here->BSIM3v32dNodePrime != 0)) + { + while (here->BSIM3v32BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32bNode != 0) && (here->BSIM3v32sNodePrime != 0)) + { + while (here->BSIM3v32BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32dNodePrime != 0) && (here->BSIM3v32sNodePrime != 0)) + { + while (here->BSIM3v32DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32dNodePrime != 0) && (here->BSIM3v32dNode != 0)) + { + while (here->BSIM3v32DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32bNode != 0) && (here->BSIM3v32gNode != 0)) + { + while (here->BSIM3v32BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32dNodePrime != 0) && (here->BSIM3v32gNode != 0)) + { + while (here->BSIM3v32DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32sNodePrime != 0) && (here->BSIM3v32gNode != 0)) + { + while (here->BSIM3v32SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32sNodePrime != 0) && (here->BSIM3v32sNode != 0)) + { + while (here->BSIM3v32SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32dNodePrime != 0) && (here->BSIM3v32bNode != 0)) + { + while (here->BSIM3v32DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32sNodePrime != 0) && (here->BSIM3v32bNode != 0)) + { + while (here->BSIM3v32SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32sNodePrime != 0) && (here->BSIM3v32dNodePrime != 0)) + { + while (here->BSIM3v32SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32qNode != 0) && (here->BSIM3v32qNode != 0)) + { + while (here->BSIM3v32QqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32QqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32qNode != 0) && (here->BSIM3v32dNodePrime != 0)) + { + while (here->BSIM3v32QdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32QdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32qNode != 0) && (here->BSIM3v32sNodePrime != 0)) + { + while (here->BSIM3v32QspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32QspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32qNode != 0) && (here->BSIM3v32gNode != 0)) + { + while (here->BSIM3v32QgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32QgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32qNode != 0) && (here->BSIM3v32bNode != 0)) + { + while (here->BSIM3v32QbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32QbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32dNodePrime != 0) && (here->BSIM3v32qNode != 0)) + { + while (here->BSIM3v32DPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32DPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32sNodePrime != 0) && (here->BSIM3v32qNode != 0)) + { + while (here->BSIM3v32SPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32SPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32gNode != 0) && (here->BSIM3v32qNode != 0)) + { + while (here->BSIM3v32GqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32GqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM3v32bNode != 0) && (here->BSIM3v32qNode != 0)) + { + while (here->BSIM3v32BqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM3v32BqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim3v32/bsim3v32ext.h b/src/spicelib/devices/bsim3v32/bsim3v32ext.h index c8cb1e31c..f607ee6b9 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32ext.h +++ b/src/spicelib/devices/bsim3v32/bsim3v32ext.h @@ -31,6 +31,7 @@ extern int BSIM3v32noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3v32unsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BSIM3v32bindCSC(GENmodel*, CKTcircuit*); -extern int BSIM3v32bindCSCComplex(GENmodel*, CKTcircuit*); +extern int BSIM3v32bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM3v32bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM3v32bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim3v32/bsim3v32init.c b/src/spicelib/devices/bsim3v32/bsim3v32init.c index c453695b4..8fb9c48e7 100644 --- a/src/spicelib/devices/bsim3v32/bsim3v32init.c +++ b/src/spicelib/devices/bsim3v32/bsim3v32init.c @@ -75,6 +75,7 @@ SPICEdev BSIM3v32info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ BSIM3v32bindCSC, /* DEVbindCSCComplex */ BSIM3v32bindCSCComplex, + /* DEVbindCSCComplexToReal */ BSIM3v32bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/bsim4/b4bindCSC.c b/src/spicelib/devices/bsim4/b4bindCSC.c index 68a95a92d..39f69eb04 100644 --- a/src/spicelib/devices/bsim4/b4bindCSC.c +++ b/src/spicelib/devices/bsim4/b4bindCSC.c @@ -900,3 +900,511 @@ BSIM4bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BSIM4bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4model *model = (BSIM4model *)inModel ; + BSIM4instance *here ; + int i ; + + /* loop through all the bsim4 models */ + for ( ; model != NULL ; model = model->BSIM4nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4instances ; here != NULL ; here = here->BSIM4nextInstance) + { + i = 0 ; + if ((here->BSIM4dNodePrime != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4DPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodePrime != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4GPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNodePrime != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4SPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNodePrime != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4BPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNodePrime != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4BPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNodePrime != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4BPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNodePrime != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4BPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNode != 0) && (here->BSIM4dNode != 0)) + { + while (here->BSIM4DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodePrime != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4GPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNode != 0) && (here->BSIM4sNode != 0)) + { + while (here->BSIM4SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNodePrime != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNodePrime != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNode != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodePrime != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4GPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodePrime != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4GPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNode != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNodePrime != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNodePrime != 0) && (here->BSIM4dNode != 0)) + { + while (here->BSIM4DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNodePrime != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4DPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNodePrime != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4SPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNodePrime != 0) && (here->BSIM4sNode != 0)) + { + while (here->BSIM4SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNodePrime != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4qNode != 0) && (here->BSIM4qNode != 0)) + { + while (here->BSIM4QqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4QqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4qNode != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4QbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4QbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4qNode != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4QdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4QdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4qNode != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4QspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4QspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4qNode != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4QgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4QgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNodePrime != 0) && (here->BSIM4qNode != 0)) + { + while (here->BSIM4DPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNodePrime != 0) && (here->BSIM4qNode != 0)) + { + while (here->BSIM4SPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodePrime != 0) && (here->BSIM4qNode != 0)) + { + while (here->BSIM4GPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeExt != 0) && (here->BSIM4gNodeExt != 0)) + { + while (here->BSIM4GEgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GEgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeExt != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4GEgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GEgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodePrime != 0) && (here->BSIM4gNodeExt != 0)) + { + while (here->BSIM4GPgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GPgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeExt != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4GEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeExt != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4GEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeExt != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4GEbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GEbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeMid != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4GMdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GMdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeMid != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4GMgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GMgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeMid != 0) && (here->BSIM4gNodeMid != 0)) + { + while (here->BSIM4GMgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GMgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeMid != 0) && (here->BSIM4gNodeExt != 0)) + { + while (here->BSIM4GMgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GMgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeMid != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4GMspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GMspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeMid != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4GMbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GMbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNodePrime != 0) && (here->BSIM4gNodeMid != 0)) + { + while (here->BSIM4DPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodePrime != 0) && (here->BSIM4gNodeMid != 0)) + { + while (here->BSIM4GPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4gNodeExt != 0) && (here->BSIM4gNodeMid != 0)) + { + while (here->BSIM4GEgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4GEgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNodePrime != 0) && (here->BSIM4gNodeMid != 0)) + { + while (here->BSIM4SPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNodePrime != 0) && (here->BSIM4gNodeMid != 0)) + { + while (here->BSIM4BPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNodePrime != 0) && (here->BSIM4dbNode != 0)) + { + while (here->BSIM4DPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNodePrime != 0) && (here->BSIM4sbNode != 0)) + { + while (here->BSIM4SPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dbNode != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4DBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dbNode != 0) && (here->BSIM4dbNode != 0)) + { + while (here->BSIM4DBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dbNode != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4DBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dbNode != 0) && (here->BSIM4bNode != 0)) + { + while (here->BSIM4DBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNodePrime != 0) && (here->BSIM4dbNode != 0)) + { + while (here->BSIM4BPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNodePrime != 0) && (here->BSIM4bNode != 0)) + { + while (here->BSIM4BPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNodePrime != 0) && (here->BSIM4sbNode != 0)) + { + while (here->BSIM4BPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sbNode != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4SBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sbNode != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4SBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sbNode != 0) && (here->BSIM4bNode != 0)) + { + while (here->BSIM4SBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sbNode != 0) && (here->BSIM4sbNode != 0)) + { + while (here->BSIM4SBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNode != 0) && (here->BSIM4dbNode != 0)) + { + while (here->BSIM4BdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNode != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4BbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNode != 0) && (here->BSIM4sbNode != 0)) + { + while (here->BSIM4BsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4bNode != 0) && (here->BSIM4bNode != 0)) + { + while (here->BSIM4BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNode != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4DgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNode != 0) && (here->BSIM4sNodePrime != 0)) + { + while (here->BSIM4DspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4dNode != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4DbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4DbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNode != 0) && (here->BSIM4dNodePrime != 0)) + { + while (here->BSIM4SdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNode != 0) && (here->BSIM4gNodePrime != 0)) + { + while (here->BSIM4SgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4sNode != 0) && (here->BSIM4bNodePrime != 0)) + { + while (here->BSIM4SbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4SbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim4/bsim4ext.h b/src/spicelib/devices/bsim4/bsim4ext.h index 443b1ed6b..99bf6ffbf 100644 --- a/src/spicelib/devices/bsim4/bsim4ext.h +++ b/src/spicelib/devices/bsim4/bsim4ext.h @@ -30,6 +30,7 @@ extern int BSIM4noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4unsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BSIM4bindCSC(GENmodel*, CKTcircuit*); -extern int BSIM4bindCSCComplex(GENmodel*, CKTcircuit*); +extern int BSIM4bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM4bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM4bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim4/bsim4init.c b/src/spicelib/devices/bsim4/bsim4init.c index 5a1177317..eb2517171 100644 --- a/src/spicelib/devices/bsim4/bsim4init.c +++ b/src/spicelib/devices/bsim4/bsim4init.c @@ -74,8 +74,9 @@ SPICEdev BSIM4info = { &BSIM4iSize, /* DEVinstSize */ &BSIM4mSize, /* DEVmodSize */ #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) - /* DEVbindCSC */ BSIM4bindCSC, - /* DEVbindCSCComplex */ BSIM4bindCSCComplex, + BSIM4bindCSC, /* DEVbindCSC */ + BSIM4bindCSCComplex, /* DEVbindCSCComplex */ + BSIM4bindCSCComplexToReal, /* DEVbindCSCComplexToReal */ #endif }; diff --git a/src/spicelib/devices/bsim4v4/b4v4bindCSC.c b/src/spicelib/devices/bsim4v4/b4v4bindCSC.c index 8614133c9..8d7fb036d 100644 --- a/src/spicelib/devices/bsim4v4/b4v4bindCSC.c +++ b/src/spicelib/devices/bsim4v4/b4v4bindCSC.c @@ -900,3 +900,511 @@ BSIM4v4bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BSIM4v4bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v4model *model = (BSIM4v4model *)inModel ; + BSIM4v4instance *here ; + int i ; + + /* loop through all the bsim4v4 models */ + for ( ; model != NULL ; model = model->BSIM4v4nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4v4instances ; here != NULL ; here = here->BSIM4v4nextInstance) + { + i = 0 ; + if ((here->BSIM4v4dNodePrime != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4DPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodePrime != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4GPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNodePrime != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4SPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNodePrime != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4BPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNodePrime != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4BPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNodePrime != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4BPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNodePrime != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4BPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNode != 0) && (here->BSIM4v4dNode != 0)) + { + while (here->BSIM4v4DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodePrime != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4GPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNode != 0) && (here->BSIM4v4sNode != 0)) + { + while (here->BSIM4v4SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNodePrime != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNodePrime != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNode != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodePrime != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4GPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodePrime != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4GPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNode != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNodePrime != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNodePrime != 0) && (here->BSIM4v4dNode != 0)) + { + while (here->BSIM4v4DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNodePrime != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4DPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNodePrime != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4SPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNodePrime != 0) && (here->BSIM4v4sNode != 0)) + { + while (here->BSIM4v4SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNodePrime != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4qNode != 0) && (here->BSIM4v4qNode != 0)) + { + while (here->BSIM4v4QqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4QqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4qNode != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4QbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4QbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4qNode != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4QdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4QdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4qNode != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4QspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4QspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4qNode != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4QgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4QgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNodePrime != 0) && (here->BSIM4v4qNode != 0)) + { + while (here->BSIM4v4DPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNodePrime != 0) && (here->BSIM4v4qNode != 0)) + { + while (here->BSIM4v4SPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodePrime != 0) && (here->BSIM4v4qNode != 0)) + { + while (here->BSIM4v4GPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeExt != 0) && (here->BSIM4v4gNodeExt != 0)) + { + while (here->BSIM4v4GEgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GEgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeExt != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4GEgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GEgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodePrime != 0) && (here->BSIM4v4gNodeExt != 0)) + { + while (here->BSIM4v4GPgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GPgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeExt != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4GEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeExt != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4GEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeExt != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4GEbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GEbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeMid != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4GMdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GMdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeMid != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4GMgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GMgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeMid != 0) && (here->BSIM4v4gNodeMid != 0)) + { + while (here->BSIM4v4GMgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GMgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeMid != 0) && (here->BSIM4v4gNodeExt != 0)) + { + while (here->BSIM4v4GMgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GMgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeMid != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4GMspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GMspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeMid != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4GMbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GMbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNodePrime != 0) && (here->BSIM4v4gNodeMid != 0)) + { + while (here->BSIM4v4DPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodePrime != 0) && (here->BSIM4v4gNodeMid != 0)) + { + while (here->BSIM4v4GPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4gNodeExt != 0) && (here->BSIM4v4gNodeMid != 0)) + { + while (here->BSIM4v4GEgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4GEgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNodePrime != 0) && (here->BSIM4v4gNodeMid != 0)) + { + while (here->BSIM4v4SPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNodePrime != 0) && (here->BSIM4v4gNodeMid != 0)) + { + while (here->BSIM4v4BPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNodePrime != 0) && (here->BSIM4v4dbNode != 0)) + { + while (here->BSIM4v4DPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNodePrime != 0) && (here->BSIM4v4sbNode != 0)) + { + while (here->BSIM4v4SPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dbNode != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4DBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dbNode != 0) && (here->BSIM4v4dbNode != 0)) + { + while (here->BSIM4v4DBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dbNode != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4DBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dbNode != 0) && (here->BSIM4v4bNode != 0)) + { + while (here->BSIM4v4DBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNodePrime != 0) && (here->BSIM4v4dbNode != 0)) + { + while (here->BSIM4v4BPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNodePrime != 0) && (here->BSIM4v4bNode != 0)) + { + while (here->BSIM4v4BPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNodePrime != 0) && (here->BSIM4v4sbNode != 0)) + { + while (here->BSIM4v4BPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sbNode != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4SBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sbNode != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4SBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sbNode != 0) && (here->BSIM4v4bNode != 0)) + { + while (here->BSIM4v4SBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sbNode != 0) && (here->BSIM4v4sbNode != 0)) + { + while (here->BSIM4v4SBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNode != 0) && (here->BSIM4v4dbNode != 0)) + { + while (here->BSIM4v4BdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNode != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4BbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNode != 0) && (here->BSIM4v4sbNode != 0)) + { + while (here->BSIM4v4BsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4bNode != 0) && (here->BSIM4v4bNode != 0)) + { + while (here->BSIM4v4BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNode != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4DgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNode != 0) && (here->BSIM4v4sNodePrime != 0)) + { + while (here->BSIM4v4DspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4dNode != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4DbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4DbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNode != 0) && (here->BSIM4v4dNodePrime != 0)) + { + while (here->BSIM4v4SdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNode != 0) && (here->BSIM4v4gNodePrime != 0)) + { + while (here->BSIM4v4SgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v4sNode != 0) && (here->BSIM4v4bNodePrime != 0)) + { + while (here->BSIM4v4SbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v4SbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim4v4/bsim4v4ext.h b/src/spicelib/devices/bsim4v4/bsim4v4ext.h index d63f207dd..21223d096 100644 --- a/src/spicelib/devices/bsim4v4/bsim4v4ext.h +++ b/src/spicelib/devices/bsim4v4/bsim4v4ext.h @@ -33,6 +33,7 @@ extern int BSIM4v4unsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BSIM4v4bindCSC(GENmodel*, CKTcircuit*); -extern int BSIM4v4bindCSCComplex(GENmodel*, CKTcircuit*); +extern int BSIM4v4bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM4v4bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM4v4bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim4v4/bsim4v4init.c b/src/spicelib/devices/bsim4v4/bsim4v4init.c index f1321ef33..e9a53c6cb 100644 --- a/src/spicelib/devices/bsim4v4/bsim4v4init.c +++ b/src/spicelib/devices/bsim4v4/bsim4v4init.c @@ -74,8 +74,9 @@ SPICEdev BSIM4v4info = { &BSIM4v4iSize, /* DEVinstSize */ &BSIM4v4mSize, /* DEVmodSize */ #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) - /* DEVbindCSC */ BSIM4v4bindCSC, - /* DEVbindCSCComplex */ BSIM4v4bindCSCComplex, + BSIM4v4bindCSC, /* DEVbindCSC */ + BSIM4v4bindCSCComplex, /* DEVbindCSCComplex */ + BSIM4v4bindCSCComplexToReal, /* DEVbindCSCComplexToReal */ #endif }; diff --git a/src/spicelib/devices/bsim4v5/b4v5bindCSC.c b/src/spicelib/devices/bsim4v5/b4v5bindCSC.c index 7739956a4..60f4b0c04 100644 --- a/src/spicelib/devices/bsim4v5/b4v5bindCSC.c +++ b/src/spicelib/devices/bsim4v5/b4v5bindCSC.c @@ -900,3 +900,511 @@ BSIM4v5bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BSIM4v5bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v5model *model = (BSIM4v5model *)inModel ; + BSIM4v5instance *here ; + int i ; + + /* loop through all the bsim4v5 models */ + for ( ; model != NULL ; model = model->BSIM4v5nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4v5instances ; here != NULL ; here = here->BSIM4v5nextInstance) + { + i = 0 ; + if ((here->BSIM4v5dNodePrime != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5DPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodePrime != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5GPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNodePrime != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5SPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNodePrime != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5BPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNodePrime != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5BPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNodePrime != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5BPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNodePrime != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5BPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNode != 0) && (here->BSIM4v5dNode != 0)) + { + while (here->BSIM4v5DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodePrime != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5GPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNode != 0) && (here->BSIM4v5sNode != 0)) + { + while (here->BSIM4v5SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNodePrime != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNodePrime != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNode != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodePrime != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5GPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodePrime != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5GPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNode != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNodePrime != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNodePrime != 0) && (here->BSIM4v5dNode != 0)) + { + while (here->BSIM4v5DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNodePrime != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5DPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNodePrime != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5SPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNodePrime != 0) && (here->BSIM4v5sNode != 0)) + { + while (here->BSIM4v5SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNodePrime != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5qNode != 0) && (here->BSIM4v5qNode != 0)) + { + while (here->BSIM4v5QqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5QqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5qNode != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5QbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5QbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5qNode != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5QdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5QdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5qNode != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5QspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5QspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5qNode != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5QgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5QgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNodePrime != 0) && (here->BSIM4v5qNode != 0)) + { + while (here->BSIM4v5DPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNodePrime != 0) && (here->BSIM4v5qNode != 0)) + { + while (here->BSIM4v5SPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodePrime != 0) && (here->BSIM4v5qNode != 0)) + { + while (here->BSIM4v5GPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeExt != 0) && (here->BSIM4v5gNodeExt != 0)) + { + while (here->BSIM4v5GEgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GEgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeExt != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5GEgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GEgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodePrime != 0) && (here->BSIM4v5gNodeExt != 0)) + { + while (here->BSIM4v5GPgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GPgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeExt != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5GEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeExt != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5GEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeExt != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5GEbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GEbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeMid != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5GMdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GMdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeMid != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5GMgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GMgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeMid != 0) && (here->BSIM4v5gNodeMid != 0)) + { + while (here->BSIM4v5GMgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GMgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeMid != 0) && (here->BSIM4v5gNodeExt != 0)) + { + while (here->BSIM4v5GMgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GMgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeMid != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5GMspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GMspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeMid != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5GMbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GMbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNodePrime != 0) && (here->BSIM4v5gNodeMid != 0)) + { + while (here->BSIM4v5DPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodePrime != 0) && (here->BSIM4v5gNodeMid != 0)) + { + while (here->BSIM4v5GPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5gNodeExt != 0) && (here->BSIM4v5gNodeMid != 0)) + { + while (here->BSIM4v5GEgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5GEgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNodePrime != 0) && (here->BSIM4v5gNodeMid != 0)) + { + while (here->BSIM4v5SPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNodePrime != 0) && (here->BSIM4v5gNodeMid != 0)) + { + while (here->BSIM4v5BPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNodePrime != 0) && (here->BSIM4v5dbNode != 0)) + { + while (here->BSIM4v5DPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNodePrime != 0) && (here->BSIM4v5sbNode != 0)) + { + while (here->BSIM4v5SPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dbNode != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5DBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dbNode != 0) && (here->BSIM4v5dbNode != 0)) + { + while (here->BSIM4v5DBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dbNode != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5DBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dbNode != 0) && (here->BSIM4v5bNode != 0)) + { + while (here->BSIM4v5DBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNodePrime != 0) && (here->BSIM4v5dbNode != 0)) + { + while (here->BSIM4v5BPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNodePrime != 0) && (here->BSIM4v5bNode != 0)) + { + while (here->BSIM4v5BPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNodePrime != 0) && (here->BSIM4v5sbNode != 0)) + { + while (here->BSIM4v5BPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sbNode != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5SBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sbNode != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5SBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sbNode != 0) && (here->BSIM4v5bNode != 0)) + { + while (here->BSIM4v5SBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sbNode != 0) && (here->BSIM4v5sbNode != 0)) + { + while (here->BSIM4v5SBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNode != 0) && (here->BSIM4v5dbNode != 0)) + { + while (here->BSIM4v5BdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNode != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5BbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNode != 0) && (here->BSIM4v5sbNode != 0)) + { + while (here->BSIM4v5BsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5bNode != 0) && (here->BSIM4v5bNode != 0)) + { + while (here->BSIM4v5BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNode != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5DgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNode != 0) && (here->BSIM4v5sNodePrime != 0)) + { + while (here->BSIM4v5DspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5dNode != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5DbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5DbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNode != 0) && (here->BSIM4v5dNodePrime != 0)) + { + while (here->BSIM4v5SdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNode != 0) && (here->BSIM4v5gNodePrime != 0)) + { + while (here->BSIM4v5SgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v5sNode != 0) && (here->BSIM4v5bNodePrime != 0)) + { + while (here->BSIM4v5SbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v5SbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim4v5/bsim4v5ext.h b/src/spicelib/devices/bsim4v5/bsim4v5ext.h index d21f8ff6c..4d74624c4 100644 --- a/src/spicelib/devices/bsim4v5/bsim4v5ext.h +++ b/src/spicelib/devices/bsim4v5/bsim4v5ext.h @@ -30,6 +30,7 @@ extern int BSIM4v5noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v5unsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BSIM4v5bindCSC(GENmodel*, CKTcircuit*); -extern int BSIM4v5bindCSCComplex(GENmodel*, CKTcircuit*); +extern int BSIM4v5bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM4v5bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM4v5bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim4v5/bsim4v5init.c b/src/spicelib/devices/bsim4v5/bsim4v5init.c index 5947299a4..fcd3653bd 100644 --- a/src/spicelib/devices/bsim4v5/bsim4v5init.c +++ b/src/spicelib/devices/bsim4v5/bsim4v5init.c @@ -74,8 +74,9 @@ SPICEdev BSIM4v5info = { &BSIM4v5iSize, /* DEVinstSize */ &BSIM4v5mSize, /* DEVmodSize */ #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) - /* DEVbindCSC */ BSIM4v5bindCSC, - /* DEVbindCSCComplex */ BSIM4v5bindCSCComplex, + BSIM4v5bindCSC, /* DEVbindCSC */ + BSIM4v5bindCSCComplex, /* DEVbindCSCComplex */ + BSIM4v5bindCSCComplexToReal, /* DEVbindCSCComplexToReal */ #endif }; diff --git a/src/spicelib/devices/bsim4v6/b4v6bindCSC.c b/src/spicelib/devices/bsim4v6/b4v6bindCSC.c index e59816cee..39eae181b 100644 --- a/src/spicelib/devices/bsim4v6/b4v6bindCSC.c +++ b/src/spicelib/devices/bsim4v6/b4v6bindCSC.c @@ -906,3 +906,511 @@ BSIM4v6bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +BSIM4v6bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v6model *model = (BSIM4v6model *)inModel ; + BSIM4v6instance *here ; + int i ; + + /* loop through all the bsim4v6 models */ + for ( ; model != NULL ; model = model->BSIM4v6nextModel) + { + /* loop through all the instances of the model */ + for (here = model->BSIM4v6instances ; here != NULL ; here = here->BSIM4v6nextInstance) + { + i = 0 ; + if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6DPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6GPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6SPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6BPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6BPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6BPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6BPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6dNode != 0)) + { + while (here->BSIM4v6DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6GPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6sNode != 0)) + { + while (here->BSIM4v6SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6GPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6GPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dNode != 0)) + { + while (here->BSIM4v6DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6DPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6SPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sNode != 0)) + { + while (here->BSIM4v6SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6qNode != 0)) + { + while (here->BSIM4v6QqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6QqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6QbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6QbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6QdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6QdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6QspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6QspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6QgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6QgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6qNode != 0)) + { + while (here->BSIM4v6DPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6qNode != 0)) + { + while (here->BSIM4v6SPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6qNode != 0)) + { + while (here->BSIM4v6GPqPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GPqPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodeExt != 0)) + { + while (here->BSIM4v6GEgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GEgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6GEgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GEgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodeExt != 0)) + { + while (here->BSIM4v6GPgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GPgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6GEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6GEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6GEbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GEbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6GMdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GMdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6GMgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GMgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodeMid != 0)) + { + while (here->BSIM4v6GMgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GMgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodeExt != 0)) + { + while (here->BSIM4v6GMgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GMgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6GMspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GMspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6GMbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GMbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) + { + while (here->BSIM4v6DPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) + { + while (here->BSIM4v6GPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodeMid != 0)) + { + while (here->BSIM4v6GEgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6GEgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) + { + while (here->BSIM4v6SPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) + { + while (here->BSIM4v6BPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dbNode != 0)) + { + while (here->BSIM4v6DPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sbNode != 0)) + { + while (here->BSIM4v6SPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6DBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6dbNode != 0)) + { + while (here->BSIM4v6DBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6DBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6bNode != 0)) + { + while (here->BSIM4v6DBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6dbNode != 0)) + { + while (here->BSIM4v6BPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6bNode != 0)) + { + while (here->BSIM4v6BPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6sbNode != 0)) + { + while (here->BSIM4v6BPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6SBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6SBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6bNode != 0)) + { + while (here->BSIM4v6SBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6sbNode != 0)) + { + while (here->BSIM4v6SBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6dbNode != 0)) + { + while (here->BSIM4v6BdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6BbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6sbNode != 0)) + { + while (here->BSIM4v6BsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6bNode != 0)) + { + while (here->BSIM4v6BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6DgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6sNodePrime != 0)) + { + while (here->BSIM4v6DspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6DbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6DbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6dNodePrime != 0)) + { + while (here->BSIM4v6SdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6gNodePrime != 0)) + { + while (here->BSIM4v6SgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6bNodePrime != 0)) + { + while (here->BSIM4v6SbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->BSIM4v6SbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsim4v6/bsim4v6ext.h b/src/spicelib/devices/bsim4v6/bsim4v6ext.h index fe3e5e7a2..3d95f0990 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6ext.h +++ b/src/spicelib/devices/bsim4v6/bsim4v6ext.h @@ -30,6 +30,7 @@ extern int BSIM4v6noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v6unsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int BSIM4v6bindCSC(GENmodel*, CKTcircuit*); -extern int BSIM4v6bindCSCComplex(GENmodel*, CKTcircuit*); +extern int BSIM4v6bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM4v6bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM4v6bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsim4v6/bsim4v6init.c b/src/spicelib/devices/bsim4v6/bsim4v6init.c index 910b6894a..fce866659 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6init.c +++ b/src/spicelib/devices/bsim4v6/bsim4v6init.c @@ -74,8 +74,9 @@ SPICEdev BSIM4v6info = { &BSIM4v6iSize, /* DEVinstSize */ &BSIM4v6mSize, /* DEVmodSize */ #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) - BSIM4v6bindCSC, /* DEVbindklu */ - BSIM4v6bindCSCComplex, /* DEVbindkluComplex */ + BSIM4v6bindCSC, /* DEVbindCSC */ + BSIM4v6bindCSCComplex, /* DEVbindCSCComplex */ + BSIM4v6bindCSCComplexToReal, /* DEVbindCSCComplexToReal */ #endif }; diff --git a/src/spicelib/devices/bsimsoi/b4soibindCSC.c b/src/spicelib/devices/bsimsoi/b4soibindCSC.c index fa4d46156..7771796d2 100644 --- a/src/spicelib/devices/bsimsoi/b4soibindCSC.c +++ b/src/spicelib/devices/bsimsoi/b4soibindCSC.c @@ -1340,3 +1340,735 @@ B4SOIbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +B4SOIbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + B4SOImodel *model = (B4SOImodel *)inModel ; + B4SOIinstance *here ; + int i ; + + /* loop through all the bsim4SiliconOnInsulator models */ + for ( ; model != NULL ; model = model->B4SOInextModel) + { + /* loop through all the instances of the model */ + for (here = model->B4SOIinstances ; here != NULL ; here = here->B4SOInextInstance) + { + i = 0 ; + if ((here->B4SOItempNode != 0) && (here->B4SOItempNode != 0)) + { + while (here->B4SOITemptempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOITemptempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOItempNode != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOITempdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOITempdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOItempNode != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOITempspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOITempspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOItempNode != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOITempgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOITempgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOItempNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOITempbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOITempbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOItempNode != 0)) + { + while (here->B4SOIGtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOItempNode != 0)) + { + while (here->B4SOIDPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOItempNode != 0)) + { + while (here->B4SOISPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIeNode != 0) && (here->B4SOItempNode != 0)) + { + while (here->B4SOIEtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIEtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOItempNode != 0)) + { + while (here->B4SOIBtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIpNode != 0) && (here->B4SOItempNode != 0)) + { + while (here->B4SOIPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOItempNode != 0) && (here->B4SOIeNode != 0)) + { + while (here->B4SOITempePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOITempePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOIpNode != 0)) + { + while (here->B4SOIBpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIpNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIpNode != 0) && (here->B4SOIpNode != 0)) + { + while (here->B4SOIPpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIPpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIpNode != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOIPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOIpNode != 0)) + { + while (here->B4SOIGpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeExt != 0) && (here->B4SOIgNodeExt != 0)) + { + while (here->B4SOIGEgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGEgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeExt != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOIGEgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGEgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOIgNodeExt != 0)) + { + while (here->B4SOIGgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeExt != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOIGEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeExt != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOIGEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeExt != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIGEbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGEbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeMid != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOIGMdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGMdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeMid != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOIGMgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGMgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeMid != 0) && (here->B4SOIgNodeMid != 0)) + { + while (here->B4SOIGMgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGMgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeMid != 0) && (here->B4SOIgNodeExt != 0)) + { + while (here->B4SOIGMgePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGMgePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeMid != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOIGMspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGMspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeMid != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIGMbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGMbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeMid != 0) && (here->B4SOIeNode != 0)) + { + while (here->B4SOIGMePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGMePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOIgNodeMid != 0)) + { + while (here->B4SOIDPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOIgNodeMid != 0)) + { + while (here->B4SOIGgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNodeExt != 0) && (here->B4SOIgNodeMid != 0)) + { + while (here->B4SOIGEgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGEgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOIgNodeMid != 0)) + { + while (here->B4SOISPgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIeNode != 0) && (here->B4SOIgNodeMid != 0)) + { + while (here->B4SOIEgmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIEgmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIeNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIEbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIEbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIGbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIDPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOISPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOIeNode != 0)) + { + while (here->B4SOIBePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOIBgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOIBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOIBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIeNode != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOIEgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIEgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIeNode != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOIEdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIEdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIeNode != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOIEspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIEspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOIeNode != 0)) + { + while (here->B4SOIGePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOIeNode != 0)) + { + while (here->B4SOIDPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOIeNode != 0)) + { + while (here->B4SOISPePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIeNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIEbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIEbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIeNode != 0) && (here->B4SOIeNode != 0)) + { + while (here->B4SOIEePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIEePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOIGgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOIGdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgNode != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOIGspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOIDPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOIDPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOIDPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOIdNode != 0)) + { + while (here->B4SOIDPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOISPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOISPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOISPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOIsNode != 0)) + { + while (here->B4SOISPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNode != 0) && (here->B4SOIdNode != 0)) + { + while (here->B4SOIDdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNode != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOIDdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNode != 0) && (here->B4SOIsNode != 0)) + { + while (here->B4SOISsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNode != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOISspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNodePrime != 0) && (here->B4SOIdbNode != 0)) + { + while (here->B4SOIDPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNodePrime != 0) && (here->B4SOIsbNode != 0)) + { + while (here->B4SOISPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdbNode != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOIDBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdbNode != 0) && (here->B4SOIdbNode != 0)) + { + while (here->B4SOIDBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdbNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIDBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsbNode != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOISBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsbNode != 0) && (here->B4SOIsbNode != 0)) + { + while (here->B4SOISBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsbNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOISBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOIdbNode != 0)) + { + while (here->B4SOIBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIbNode != 0) && (here->B4SOIsbNode != 0)) + { + while (here->B4SOIBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNode != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOIDgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNode != 0) && (here->B4SOIsNodePrime != 0)) + { + while (here->B4SOIDspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNode != 0) && (here->B4SOIdNodePrime != 0)) + { + while (here->B4SOISdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNode != 0) && (here->B4SOIgNode != 0)) + { + while (here->B4SOISgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIdNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOIDbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIDbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIsNode != 0) && (here->B4SOIbNode != 0)) + { + while (here->B4SOISbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOISbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIvbsNode != 0) && (here->B4SOIvbsNode != 0)) + { + while (here->B4SOIVbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIVbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIidsNode != 0) && (here->B4SOIidsNode != 0)) + { + while (here->B4SOIIdsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIIdsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIicNode != 0) && (here->B4SOIicNode != 0)) + { + while (here->B4SOIIcPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIIcPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIibsNode != 0) && (here->B4SOIibsNode != 0)) + { + while (here->B4SOIIbsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIIbsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIibdNode != 0) && (here->B4SOIibdNode != 0)) + { + while (here->B4SOIIbdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIIbdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIiiiNode != 0) && (here->B4SOIiiiNode != 0)) + { + while (here->B4SOIIiiPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIIiiPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIigNode != 0) && (here->B4SOIigNode != 0)) + { + while (here->B4SOIIgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIIgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgiggNode != 0) && (here->B4SOIgiggNode != 0)) + { + while (here->B4SOIGiggPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGiggPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgigdNode != 0) && (here->B4SOIgigdNode != 0)) + { + while (here->B4SOIGigdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGigdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIgigbNode != 0) && (here->B4SOIgigbNode != 0)) + { + while (here->B4SOIGigbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIGigbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIigidlNode != 0) && (here->B4SOIigidlNode != 0)) + { + while (here->B4SOIIgidlPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIIgidlPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIitunNode != 0) && (here->B4SOIitunNode != 0)) + { + while (here->B4SOIItunPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIItunPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIibpNode != 0) && (here->B4SOIibpNode != 0)) + { + while (here->B4SOIIbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIIbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIcbbNode != 0) && (here->B4SOIcbbNode != 0)) + { + while (here->B4SOICbbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOICbbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIcbdNode != 0) && (here->B4SOIcbdNode != 0)) + { + while (here->B4SOICbdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOICbdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIcbgNode != 0) && (here->B4SOIcbgNode != 0)) + { + while (here->B4SOICbgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOICbgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIqbfNode != 0) && (here->B4SOIqbfNode != 0)) + { + while (here->B4SOIQbfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIQbfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIqjsNode != 0) && (here->B4SOIqjsNode != 0)) + { + while (here->B4SOIQjsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIQjsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->B4SOIqjdNode != 0) && (here->B4SOIqjdNode != 0)) + { + while (here->B4SOIQjdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->B4SOIQjdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/bsimsoi/b4soiext.h b/src/spicelib/devices/bsimsoi/b4soiext.h index cd2e3e052..d04e0514e 100644 --- a/src/spicelib/devices/bsimsoi/b4soiext.h +++ b/src/spicelib/devices/bsimsoi/b4soiext.h @@ -32,6 +32,7 @@ extern int B4SOInoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B4SOIunsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int B4SOIbindCSC(GENmodel*, CKTcircuit*); -extern int B4SOIbindCSCComplex(GENmodel*, CKTcircuit*); +extern int B4SOIbindCSC (GENmodel*, CKTcircuit*) ; +extern int B4SOIbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int B4SOIbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/bsimsoi/b4soiinit.c b/src/spicelib/devices/bsimsoi/b4soiinit.c index 959d04fb2..ee9c1e082 100644 --- a/src/spicelib/devices/bsimsoi/b4soiinit.c +++ b/src/spicelib/devices/bsimsoi/b4soiinit.c @@ -74,6 +74,7 @@ SPICEdev B4SOIinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ B4SOIbindCSC, /* DEVbindCSCComplex */ B4SOIbindCSCComplex, + /* DEVbindCSCComplexToReal */ B4SOIbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/cap/capbindCSC.c b/src/spicelib/devices/cap/capbindCSC.c index a63b64ea9..153f63181 100644 --- a/src/spicelib/devices/cap/capbindCSC.c +++ b/src/spicelib/devices/cap/capbindCSC.c @@ -8,19 +8,18 @@ Author: 2012 Francesco Lannutti #include "ngspice/sperror.h" int -CAPbindCSC(GENmodel *inModel, CKTcircuit *ckt) +CAPbindCSC (GENmodel *inModel, CKTcircuit *ckt) { - CAPmodel *model = (CAPmodel *)inModel; - CAPinstance *here; + CAPmodel *model = (CAPmodel *)inModel ; + CAPinstance *here ; int i ; /* loop through all the capacitor models */ - for( ; model != NULL; model = model->CAPnextModel ) { - + for ( ; model != NULL ; model = model->CAPnextModel) + { /* loop through all the instances of the model */ - for (here = model->CAPinstances; here != NULL ; - here=here->CAPnextInstance) { - + for (here = model->CAPinstances ; here != NULL ; here = here->CAPnextInstance) + { i = 0 ; if ((here->CAPposNode != 0) && (here->CAPposNode != 0)) { while (here->CAPposPosptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; @@ -46,23 +45,23 @@ CAPbindCSC(GENmodel *inModel, CKTcircuit *ckt) } } } - return(OK); + + return (OK) ; } int -CAPbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) +CAPbindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) { - CAPmodel *model = (CAPmodel *)inModel; - CAPinstance *here; + CAPmodel *model = (CAPmodel *)inModel ; + CAPinstance *here ; int i ; /* loop through all the capacitor models */ - for( ; model != NULL; model = model->CAPnextModel ) { - + for ( ; model != NULL ; model = model->CAPnextModel) + { /* loop through all the instances of the model */ - for (here = model->CAPinstances; here != NULL ; - here=here->CAPnextInstance) { - + for (here = model->CAPinstances ; here != NULL ; here = here->CAPnextInstance) + { i = 0 ; if ((here->CAPposNode != 0) && (here->CAPposNode != 0)) { while (here->CAPposPosptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; @@ -88,5 +87,52 @@ CAPbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } } } - return(OK); + + return (OK) ; } + +int +CAPbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + CAPmodel *model = (CAPmodel *)inModel ; + CAPinstance *here ; + int i ; + + /* loop through all the capacitor models */ + for ( ; model != NULL ; model = model->CAPnextModel) + { + /* loop through all the instances of the model */ + for (here = model->CAPinstances ; here != NULL ; here = here->CAPnextInstance) + { + i = 0 ; + if ((here->CAPposNode != 0) && (here->CAPposNode != 0)) + { + while (here->CAPposPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CAPposPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CAPnegNode != 0) && (here->CAPnegNode != 0)) + { + while (here->CAPnegNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CAPnegNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CAPposNode != 0) && (here->CAPnegNode != 0)) + { + while (here->CAPposNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CAPposNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CAPnegNode != 0) && (here->CAPposNode != 0)) + { + while (here->CAPnegPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CAPnegPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/cap/capext.h b/src/spicelib/devices/cap/capext.h index 3b0e6d76b..d06724161 100644 --- a/src/spicelib/devices/cap/capext.h +++ b/src/spicelib/devices/cap/capext.h @@ -24,6 +24,7 @@ extern int CAPtemp(GENmodel*,CKTcircuit*); extern int CAPtrunc(GENmodel*,CKTcircuit*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int CAPbindCSC(GENmodel*, CKTcircuit*); -extern int CAPbindCSCComplex(GENmodel*, CKTcircuit*); +extern int CAPbindCSC (GENmodel*, CKTcircuit*) ; +extern int CAPbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int CAPbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/cap/capinit.c b/src/spicelib/devices/cap/capinit.c index 65f233ce7..780c81a5a 100644 --- a/src/spicelib/devices/cap/capinit.c +++ b/src/spicelib/devices/cap/capinit.c @@ -73,8 +73,9 @@ SPICEdev CAPinfo = { /* DEVinstSize */ &CAPiSize, /* DEVmodSize */ &CAPmSize, #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) - /* DEVbindklu */ CAPbindCSC, - /* DEVbindkluComplex */ CAPbindCSCComplex, + /* DEVbindCSC */ CAPbindCSC, + /* DEVbindCSCComplex */ CAPbindCSCComplex, + /* DEVbindCSCComplexToReal */ CAPbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index e80b1179a..da61c7349 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -84,4 +84,3 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } - diff --git a/src/spicelib/devices/cccs/cccsbindCSC.c b/src/spicelib/devices/cccs/cccsbindCSC.c index 10cb022f7..fac748202 100644 --- a/src/spicelib/devices/cccs/cccsbindCSC.c +++ b/src/spicelib/devices/cccs/cccsbindCSC.c @@ -66,3 +66,35 @@ CCCSbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +CCCSbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + CCCSmodel *model = (CCCSmodel *)inModel ; + CCCSinstance *here ; + int i ; + + /* loop through all the CurrentControlledCurrentSource models */ + for ( ; model != NULL ; model = model->CCCSnextModel) + { + /* loop through all the instances of the model */ + for (here = model->CCCSinstances ; here != NULL ; here = here->CCCSnextInstance) + { + i = 0 ; + if ((here->CCCSposNode != 0) && (here->CCCScontBranch != 0)) + { + while (here->CCCSposContBrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CCCSposContBrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CCCSnegNode != 0) && (here->CCCScontBranch != 0)) + { + while (here->CCCSnegContBrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CCCSnegContBrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/cccs/cccsext.h b/src/spicelib/devices/cccs/cccsext.h index 9ed0396a6..0a9c32b8b 100644 --- a/src/spicelib/devices/cccs/cccsext.h +++ b/src/spicelib/devices/cccs/cccsext.h @@ -19,6 +19,7 @@ extern int CCCSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int CCCSbindCSC(GENmodel*, CKTcircuit*); -extern int CCCSbindCSCComplex(GENmodel*, CKTcircuit*); +extern int CCCSbindCSC (GENmodel*, CKTcircuit*) ; +extern int CCCSbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int CCCSbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/cccs/cccsinit.c b/src/spicelib/devices/cccs/cccsinit.c index e3af75017..ba9476245 100644 --- a/src/spicelib/devices/cccs/cccsinit.c +++ b/src/spicelib/devices/cccs/cccsinit.c @@ -75,6 +75,7 @@ SPICEdev CCCSinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ CCCSbindCSC, /* DEVbindCSCComplex */ CCCSbindCSCComplex, + /* DEVbindCSCComplexToReal */ CCCSbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/ccvs/ccvsbindCSC.c b/src/spicelib/devices/ccvs/ccvsbindCSC.c index adbf6b34c..2a42023e3 100644 --- a/src/spicelib/devices/ccvs/ccvsbindCSC.c +++ b/src/spicelib/devices/ccvs/ccvsbindCSC.c @@ -102,3 +102,56 @@ CCVSbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +CCVSbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + CCVSmodel *model = (CCVSmodel *)inModel ; + CCVSinstance *here ; + int i ; + + /* loop through all the CurrentControlledVoltageSource models */ + for ( ; model != NULL ; model = model->CCVSnextModel) + { + /* loop through all the instances of the model */ + for (here = model->CCVSinstances ; here != NULL ; here = here->CCVSnextInstance) + { + i = 0 ; + if ((here->CCVSposNode != 0) && (here->CCVSbranch != 0)) + { + while (here->CCVSposIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CCVSposIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CCVSnegNode != 0) && (here->CCVSbranch != 0)) + { + while (here->CCVSnegIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CCVSnegIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CCVSbranch != 0) && (here->CCVSnegNode != 0)) + { + while (here->CCVSibrNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CCVSibrNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CCVSbranch != 0) && (here->CCVSposNode != 0)) + { + while (here->CCVSibrPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CCVSibrPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CCVSbranch != 0) && (here->CCVScontBranch != 0)) + { + while (here->CCVSibrContBrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CCVSibrContBrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/ccvs/ccvsext.h b/src/spicelib/devices/ccvs/ccvsext.h index 1c95de781..b113b047f 100644 --- a/src/spicelib/devices/ccvs/ccvsext.h +++ b/src/spicelib/devices/ccvs/ccvsext.h @@ -19,6 +19,7 @@ extern int CCVSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int CCVSunsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int CCVSbindCSC(GENmodel*, CKTcircuit*); -extern int CCVSbindCSCComplex(GENmodel*, CKTcircuit*); +extern int CCVSbindCSC (GENmodel*, CKTcircuit*) ; +extern int CCVSbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int CCVSbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/ccvs/ccvsinit.c b/src/spicelib/devices/ccvs/ccvsinit.c index e1114b01b..a63f2d1dc 100644 --- a/src/spicelib/devices/ccvs/ccvsinit.c +++ b/src/spicelib/devices/ccvs/ccvsinit.c @@ -76,6 +76,7 @@ SPICEdev CCVSinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ CCVSbindCSC, /* DEVbindCSCComplex */ CCVSbindCSCComplex, + /* DEVbindCSCComplexToReal */ CCVSbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/cpl/cplinit.c b/src/spicelib/devices/cpl/cplinit.c index 4f4c0897d..bc59e4503 100644 --- a/src/spicelib/devices/cpl/cplinit.c +++ b/src/spicelib/devices/cpl/cplinit.c @@ -76,6 +76,7 @@ SPICEdev CPLinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ NULL, /* DEVbindCSCComplex */ NULL, + /* DEVbindCSCComplexToReal */ NULL, #endif }; diff --git a/src/spicelib/devices/csw/cswbindCSC.c b/src/spicelib/devices/csw/cswbindCSC.c index 5e9ca41a4..739999507 100644 --- a/src/spicelib/devices/csw/cswbindCSC.c +++ b/src/spicelib/devices/csw/cswbindCSC.c @@ -90,3 +90,49 @@ CSWbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +CSWbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + CSWmodel *model = (CSWmodel *)inModel ; + CSWinstance *here ; + int i ; + + /* loop through all the csw models */ + for ( ; model != NULL ; model = model->CSWnextModel) + { + /* loop through all the instances of the model */ + for (here = model->CSWinstances ; here != NULL ; here = here->CSWnextInstance) + { + i = 0 ; + if ((here->CSWposNode != 0) && (here->CSWposNode != 0)) + { + while (here->CSWposPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CSWposPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CSWposNode != 0) && (here->CSWnegNode != 0)) + { + while (here->CSWposNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CSWposNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CSWnegNode != 0) && (here->CSWposNode != 0)) + { + while (here->CSWnegPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CSWnegPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->CSWnegNode != 0) && (here->CSWnegNode != 0)) + { + while (here->CSWnegNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->CSWnegNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/csw/cswext.h b/src/spicelib/devices/csw/cswext.h index fe69218c9..0c1efc920 100644 --- a/src/spicelib/devices/csw/cswext.h +++ b/src/spicelib/devices/csw/cswext.h @@ -19,6 +19,7 @@ extern int CSWnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int CSWtrunc(GENmodel*,CKTcircuit*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int CSWbindCSC(GENmodel*, CKTcircuit*); -extern int CSWbindCSCComplex(GENmodel*, CKTcircuit*); +extern int CSWbindCSC (GENmodel*, CKTcircuit*) ; +extern int CSWbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int CSWbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/csw/cswinit.c b/src/spicelib/devices/csw/cswinit.c index 8418da8a2..c084af693 100644 --- a/src/spicelib/devices/csw/cswinit.c +++ b/src/spicelib/devices/csw/cswinit.c @@ -78,6 +78,7 @@ SPICEdev CSWinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ CSWbindCSC, /* DEVbindCSCComplex */ CSWbindCSCComplex, + /* DEVbindCSCComplexToReal */ CSWbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/dio/diobindCSC.c b/src/spicelib/devices/dio/diobindCSC.c index 69af288ea..742adb993 100644 --- a/src/spicelib/devices/dio/diobindCSC.c +++ b/src/spicelib/devices/dio/diobindCSC.c @@ -114,3 +114,70 @@ DIObindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +DIObindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + DIOmodel *model = (DIOmodel *)inModel ; + DIOinstance *here ; + int i ; + + /* loop through all the Diode models */ + for ( ; model != NULL ; model = model->DIOnextModel) + { + /* loop through all the instances of the model */ + for (here = model->DIOinstances ; here != NULL ; here = here->DIOnextInstance) + { + i = 0 ; + if ((here->DIOposNode != 0) && (here->DIOposPrimeNode != 0)) + { + while (here->DIOposPosPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->DIOposPosPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->DIOnegNode != 0) && (here->DIOposPrimeNode != 0)) + { + while (here->DIOnegPosPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->DIOnegPosPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->DIOposPrimeNode != 0) && (here->DIOposNode != 0)) + { + while (here->DIOposPrimePosPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->DIOposPrimePosPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->DIOposPrimeNode != 0) && (here->DIOnegNode != 0)) + { + while (here->DIOposPrimeNegPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->DIOposPrimeNegPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->DIOposNode != 0) && (here->DIOposNode != 0)) + { + while (here->DIOposPosPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->DIOposPosPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->DIOnegNode != 0) && (here->DIOnegNode != 0)) + { + while (here->DIOnegNegPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->DIOnegNegPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->DIOposPrimeNode != 0) && (here->DIOposPrimeNode != 0)) + { + while (here->DIOposPrimePosPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->DIOposPrimePosPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/dio/dioext.h b/src/spicelib/devices/dio/dioext.h index f6ff4baf9..4923c78a5 100644 --- a/src/spicelib/devices/dio/dioext.h +++ b/src/spicelib/devices/dio/dioext.h @@ -30,6 +30,7 @@ extern int DIOnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int DIOdSetup(DIOmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int DIObindCSC(GENmodel*, CKTcircuit*); -extern int DIObindCSCComplex(GENmodel*, CKTcircuit*); +extern int DIObindCSC (GENmodel*, CKTcircuit*) ; +extern int DIObindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int DIObindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/dio/dioinit.c b/src/spicelib/devices/dio/dioinit.c index 22e4a5f93..5dfaa573b 100644 --- a/src/spicelib/devices/dio/dioinit.c +++ b/src/spicelib/devices/dio/dioinit.c @@ -77,6 +77,7 @@ SPICEdev DIOinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ DIObindCSC, /* DEVbindCSCComplex */ DIObindCSCComplex, + /* DEVbindCSCComplexToReal */ DIObindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/hfet1/hfetbindCSC.c b/src/spicelib/devices/hfet1/hfetbindCSC.c index 6040f3d64..da4f20e0d 100644 --- a/src/spicelib/devices/hfet1/hfetbindCSC.c +++ b/src/spicelib/devices/hfet1/hfetbindCSC.c @@ -378,3 +378,217 @@ HFETAbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +HFETAbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + HFETAmodel *model = (HFETAmodel *)inModel ; + HFETAinstance *here ; + int i ; + + /* loop through all the HfetA models */ + for ( ; model != NULL ; model = model->HFETAnextModel) + { + /* loop through all the instances of the model */ + for (here = model->HFETAinstances ; here != NULL ; here = here->HFETAnextInstance) + { + i = 0 ; + if ((here->HFETAdrainNode != 0) && (here->HFETAdrainPrimeNode != 0)) + { + while (here->HFETAdrainDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAgatePrimeNode != 0) && (here->HFETAdrainPrimeNode != 0)) + { + while (here->HFETAgatePrimeDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAgatePrimeDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAgatePrimeNode != 0) && (here->HFETAsourcePrimeNode != 0)) + { + while (here->HFETAgatePrimeSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAgatePrimeSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourceNode != 0) && (here->HFETAsourcePrimeNode != 0)) + { + while (here->HFETAsourceSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourceSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainPrimeNode != 0) && (here->HFETAdrainNode != 0)) + { + while (here->HFETAdrainPrimeDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainPrimeDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainPrimeNode != 0) && (here->HFETAgatePrimeNode != 0)) + { + while (here->HFETAdrainPrimeGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainPrimeGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainPrimeNode != 0) && (here->HFETAsourcePrimeNode != 0)) + { + while (here->HFETAdrainPrimeSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainPrimeSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourcePrimeNode != 0) && (here->HFETAgatePrimeNode != 0)) + { + while (here->HFETAsourcePrimeGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourcePrimeGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourcePrimeNode != 0) && (here->HFETAsourceNode != 0)) + { + while (here->HFETAsourcePrimeSourcePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourcePrimeSourcePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourcePrimeNode != 0) && (here->HFETAdrainPrimeNode != 0)) + { + while (here->HFETAsourcePrimeDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourcePrimeDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainNode != 0) && (here->HFETAdrainNode != 0)) + { + while (here->HFETAdrainDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAgatePrimeNode != 0) && (here->HFETAgatePrimeNode != 0)) + { + while (here->HFETAgatePrimeGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAgatePrimeGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourceNode != 0) && (here->HFETAsourceNode != 0)) + { + while (here->HFETAsourceSourcePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourceSourcePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainPrimeNode != 0) && (here->HFETAdrainPrimeNode != 0)) + { + while (here->HFETAdrainPrimeDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainPrimeDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourcePrimeNode != 0) && (here->HFETAsourcePrimeNode != 0)) + { + while (here->HFETAsourcePrimeSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourcePrimeSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainPrimeNode != 0) && (here->HFETAdrainPrmPrmNode != 0)) + { + while (here->HFETAdrainPrimeDrainPrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainPrimeDrainPrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainPrmPrmNode != 0) && (here->HFETAdrainPrimeNode != 0)) + { + while (here->HFETAdrainPrmPrmDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainPrmPrmDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainPrmPrmNode != 0) && (here->HFETAgatePrimeNode != 0)) + { + while (here->HFETAdrainPrmPrmGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainPrmPrmGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAgatePrimeNode != 0) && (here->HFETAdrainPrmPrmNode != 0)) + { + while (here->HFETAgatePrimeDrainPrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAgatePrimeDrainPrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAdrainPrmPrmNode != 0) && (here->HFETAdrainPrmPrmNode != 0)) + { + while (here->HFETAdrainPrmPrmDrainPrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAdrainPrmPrmDrainPrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourcePrimeNode != 0) && (here->HFETAsourcePrmPrmNode != 0)) + { + while (here->HFETAsourcePrimeSourcePrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourcePrimeSourcePrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourcePrmPrmNode != 0) && (here->HFETAsourcePrimeNode != 0)) + { + while (here->HFETAsourcePrmPrmSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourcePrmPrmSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourcePrmPrmNode != 0) && (here->HFETAgatePrimeNode != 0)) + { + while (here->HFETAsourcePrmPrmGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourcePrmPrmGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAgatePrimeNode != 0) && (here->HFETAsourcePrmPrmNode != 0)) + { + while (here->HFETAgatePrimeSourcePrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAgatePrimeSourcePrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAsourcePrmPrmNode != 0) && (here->HFETAsourcePrmPrmNode != 0)) + { + while (here->HFETAsourcePrmPrmSourcePrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAsourcePrmPrmSourcePrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAgateNode != 0) && (here->HFETAgateNode != 0)) + { + while (here->HFETAgateGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAgateGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAgateNode != 0) && (here->HFETAgatePrimeNode != 0)) + { + while (here->HFETAgateGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAgateGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFETAgatePrimeNode != 0) && (here->HFETAgateNode != 0)) + { + while (here->HFETAgatePrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFETAgatePrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/hfet1/hfetext.h b/src/spicelib/devices/hfet1/hfetext.h index 653227948..221a092b8 100644 --- a/src/spicelib/devices/hfet1/hfetext.h +++ b/src/spicelib/devices/hfet1/hfetext.h @@ -20,6 +20,7 @@ extern int HFETAtrunc(GENmodel*,CKTcircuit*,double*); extern int HFETAunsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int HFETAbindCSC(GENmodel*, CKTcircuit*); -extern int HFETAbindCSCComplex(GENmodel*, CKTcircuit*); +extern int HFETAbindCSC (GENmodel*, CKTcircuit*) ; +extern int HFETAbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int HFETAbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/hfet1/hfetinit.c b/src/spicelib/devices/hfet1/hfetinit.c index ec9b381cb..c82a865d4 100644 --- a/src/spicelib/devices/hfet1/hfetinit.c +++ b/src/spicelib/devices/hfet1/hfetinit.c @@ -76,6 +76,7 @@ SPICEdev HFETAinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ HFETAbindCSC, /* DEVbindCSCComplex */ HFETAbindCSC, + /* DEVbindCSCComplexToReal */ HFETAbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/hfet2/hfet2bindCSC.c b/src/spicelib/devices/hfet2/hfet2bindCSC.c index 8a1420db2..0c4f184bb 100644 --- a/src/spicelib/devices/hfet2/hfet2bindCSC.c +++ b/src/spicelib/devices/hfet2/hfet2bindCSC.c @@ -222,3 +222,126 @@ HFET2bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +HFET2bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + HFET2model *model = (HFET2model *)inModel ; + HFET2instance *here ; + int i ; + + /* loop through all the HfetB models */ + for ( ; model != NULL ; model = model->HFET2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->HFET2instances ; here != NULL ; here = here->HFET2nextInstance) + { + i = 0 ; + if ((here->HFET2drainNode != 0) && (here->HFET2drainPrimeNode != 0)) + { + while (here->HFET2drainDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2drainDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2gateNode != 0) && (here->HFET2drainPrimeNode != 0)) + { + while (here->HFET2gateDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2gateDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2gateNode != 0) && (here->HFET2sourcePrimeNode != 0)) + { + while (here->HFET2gateSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2gateSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2sourceNode != 0) && (here->HFET2sourcePrimeNode != 0)) + { + while (here->HFET2sourceSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2sourceSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2drainPrimeNode != 0) && (here->HFET2drainNode != 0)) + { + while (here->HFET2drainPrimeDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2drainPrimeDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2drainPrimeNode != 0) && (here->HFET2gateNode != 0)) + { + while (here->HFET2drainPrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2drainPrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2drainPrimeNode != 0) && (here->HFET2sourcePrimeNode != 0)) + { + while (here->HFET2drainPriHFET2ourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2drainPriHFET2ourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2sourcePrimeNode != 0) && (here->HFET2gateNode != 0)) + { + while (here->HFET2sourcePrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2sourcePrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2sourcePrimeNode != 0) && (here->HFET2sourceNode != 0)) + { + while (here->HFET2sourcePriHFET2ourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2sourcePriHFET2ourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2sourcePrimeNode != 0) && (here->HFET2drainPrimeNode != 0)) + { + while (here->HFET2sourcePrimeDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2sourcePrimeDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2drainNode != 0) && (here->HFET2drainNode != 0)) + { + while (here->HFET2drainDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2drainDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2gateNode != 0) && (here->HFET2gateNode != 0)) + { + while (here->HFET2gateGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2gateGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2sourceNode != 0) && (here->HFET2sourceNode != 0)) + { + while (here->HFET2sourceSourcePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2sourceSourcePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2drainPrimeNode != 0) && (here->HFET2drainPrimeNode != 0)) + { + while (here->HFET2drainPrimeDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2drainPrimeDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HFET2sourcePrimeNode != 0) && (here->HFET2sourcePrimeNode != 0)) + { + while (here->HFET2sourcePriHFET2ourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HFET2sourcePriHFET2ourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/hfet2/hfet2ext.h b/src/spicelib/devices/hfet2/hfet2ext.h index 51b83107f..f2f8d98e7 100644 --- a/src/spicelib/devices/hfet2/hfet2ext.h +++ b/src/spicelib/devices/hfet2/hfet2ext.h @@ -20,6 +20,7 @@ extern int HFET2trunc(GENmodel*,CKTcircuit*,double*); extern int HFET2unsetup( GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int HFET2bindCSC(GENmodel*, CKTcircuit*); -extern int HFET2bindCSCComplex(GENmodel*, CKTcircuit*); +extern int HFET2bindCSC (GENmodel*, CKTcircuit*) ; +extern int HFET2bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int HFET2bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/hfet2/hfet2init.c b/src/spicelib/devices/hfet2/hfet2init.c index 725ddbcd0..04ad87d72 100644 --- a/src/spicelib/devices/hfet2/hfet2init.c +++ b/src/spicelib/devices/hfet2/hfet2init.c @@ -76,6 +76,7 @@ SPICEdev HFET2info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ HFET2bindCSC, /* DEVbindCSCComplex */ HFET2bindCSCComplex, + /* DEVbindCSCComplexToReal */ HFET2bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/hisim2/hsm2bindCSC.c b/src/spicelib/devices/hisim2/hsm2bindCSC.c index bf2ecd823..7f0afd5d0 100644 --- a/src/spicelib/devices/hisim2/hsm2bindCSC.c +++ b/src/spicelib/devices/hisim2/hsm2bindCSC.c @@ -594,3 +594,336 @@ HSM2bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +HSM2bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + HSM2model *model = (HSM2model *)inModel ; + HSM2instance *here ; + int i ; + + /* loop through all the hsm2 models */ + for ( ; model != NULL ; model = model->HSM2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->HSM2instances ; here != NULL ; here = here->HSM2nextInstance) + { + i = 0 ; + if ((here->HSM2dNodePrime != 0) && (here->HSM2bNodePrime != 0)) + { + while (here->HSM2DPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sNodePrime != 0) && (here->HSM2bNodePrime != 0)) + { + while (here->HSM2SPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNodePrime != 0) && (here->HSM2bNodePrime != 0)) + { + while (here->HSM2GPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNodePrime != 0) && (here->HSM2dNodePrime != 0)) + { + while (here->HSM2BPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNodePrime != 0) && (here->HSM2sNodePrime != 0)) + { + while (here->HSM2BPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNodePrime != 0) && (here->HSM2gNodePrime != 0)) + { + while (here->HSM2BPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNodePrime != 0) && (here->HSM2bNodePrime != 0)) + { + while (here->HSM2BPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dNode != 0) && (here->HSM2dNode != 0)) + { + while (here->HSM2DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNodePrime != 0) && (here->HSM2gNodePrime != 0)) + { + while (here->HSM2GPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sNode != 0) && (here->HSM2sNode != 0)) + { + while (here->HSM2SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dNodePrime != 0) && (here->HSM2dNodePrime != 0)) + { + while (here->HSM2DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sNodePrime != 0) && (here->HSM2sNodePrime != 0)) + { + while (here->HSM2SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dNode != 0) && (here->HSM2dNodePrime != 0)) + { + while (here->HSM2DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNodePrime != 0) && (here->HSM2dNodePrime != 0)) + { + while (here->HSM2GPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNodePrime != 0) && (here->HSM2sNodePrime != 0)) + { + while (here->HSM2GPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sNode != 0) && (here->HSM2sNodePrime != 0)) + { + while (here->HSM2SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dNodePrime != 0) && (here->HSM2sNodePrime != 0)) + { + while (here->HSM2DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dNodePrime != 0) && (here->HSM2dNode != 0)) + { + while (here->HSM2DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dNodePrime != 0) && (here->HSM2gNodePrime != 0)) + { + while (here->HSM2DPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sNodePrime != 0) && (here->HSM2gNodePrime != 0)) + { + while (here->HSM2SPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sNodePrime != 0) && (here->HSM2sNode != 0)) + { + while (here->HSM2SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sNodePrime != 0) && (here->HSM2dNodePrime != 0)) + { + while (here->HSM2SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNode != 0) && (here->HSM2gNode != 0)) + { + while (here->HSM2GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNode != 0) && (here->HSM2gNodePrime != 0)) + { + while (here->HSM2GgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNodePrime != 0) && (here->HSM2gNode != 0)) + { + while (here->HSM2GPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNode != 0) && (here->HSM2dNodePrime != 0)) + { + while (here->HSM2GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNode != 0) && (here->HSM2sNodePrime != 0)) + { + while (here->HSM2GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2gNode != 0) && (here->HSM2bNodePrime != 0)) + { + while (here->HSM2GbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2GbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dNodePrime != 0) && (here->HSM2dbNode != 0)) + { + while (here->HSM2DPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sNodePrime != 0) && (here->HSM2sbNode != 0)) + { + while (here->HSM2SPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dbNode != 0) && (here->HSM2dNodePrime != 0)) + { + while (here->HSM2DBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dbNode != 0) && (here->HSM2dbNode != 0)) + { + while (here->HSM2DBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dbNode != 0) && (here->HSM2bNodePrime != 0)) + { + while (here->HSM2DBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2dbNode != 0) && (here->HSM2bNode != 0)) + { + while (here->HSM2DBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2DBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNodePrime != 0) && (here->HSM2dbNode != 0)) + { + while (here->HSM2BPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNodePrime != 0) && (here->HSM2bNode != 0)) + { + while (here->HSM2BPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNodePrime != 0) && (here->HSM2sbNode != 0)) + { + while (here->HSM2BPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sbNode != 0) && (here->HSM2sNodePrime != 0)) + { + while (here->HSM2SBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sbNode != 0) && (here->HSM2bNodePrime != 0)) + { + while (here->HSM2SBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sbNode != 0) && (here->HSM2bNode != 0)) + { + while (here->HSM2SBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2sbNode != 0) && (here->HSM2sbNode != 0)) + { + while (here->HSM2SBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2SBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNode != 0) && (here->HSM2dbNode != 0)) + { + while (here->HSM2BdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNode != 0) && (here->HSM2bNodePrime != 0)) + { + while (here->HSM2BbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNode != 0) && (here->HSM2sbNode != 0)) + { + while (here->HSM2BsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSM2bNode != 0) && (here->HSM2bNode != 0)) + { + while (here->HSM2BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSM2BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/hisim2/hsm2ext.h b/src/spicelib/devices/hisim2/hsm2ext.h index 8b0540566..35bd423d5 100644 --- a/src/spicelib/devices/hisim2/hsm2ext.h +++ b/src/spicelib/devices/hisim2/hsm2ext.h @@ -39,6 +39,7 @@ extern int HSM2trunc(GENmodel*,CKTcircuit*,double*); extern int HSM2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int HSM2bindCSC(GENmodel*, CKTcircuit*); -extern int HSM2bindCSCComplex(GENmodel*, CKTcircuit*); +extern int HSM2bindCSC (GENmodel*, CKTcircuit*) ; +extern int HSM2bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int HSM2bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/hisim2/hsm2init.c b/src/spicelib/devices/hisim2/hsm2init.c index e34c05267..bb859e9c7 100644 --- a/src/spicelib/devices/hisim2/hsm2init.c +++ b/src/spicelib/devices/hisim2/hsm2init.c @@ -74,6 +74,7 @@ SPICEdev HSM2info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ HSM2bindCSC, /* DEVbindCSCComplex */ HSM2bindCSCComplex, + /* DEVbindCSCComplexToReal */ HSM2bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/hisimhv1/hsmhvbindCSC.c b/src/spicelib/devices/hisimhv1/hsmhvbindCSC.c index d07bcb281..7f55387dc 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvbindCSC.c +++ b/src/spicelib/devices/hisimhv1/hsmhvbindCSC.c @@ -1098,3 +1098,672 @@ HSMHVbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +HSMHVbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + HSMHVmodel *model = (HSMHVmodel *)inModel ; + HSMHVinstance *here ; + int i ; + + /* loop through all the hsmhv models */ + for ( ; model != NULL ; model = model->HSMHVnextModel) + { + /* loop through all the instances of the model */ + for (here = model->HSMHVinstances ; here != NULL ; here = here->HSMHVnextInstance) + { + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVDPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVSPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVGPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVdNode != 0)) + { + while (here->HSMHVBPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVBPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVsNode != 0)) + { + while (here->HSMHVBPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVBPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVBPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVBPbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNode != 0) && (here->HSMHVdNode != 0)) + { + while (here->HSMHVDdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVGPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNode != 0) && (here->HSMHVsNode != 0)) + { + while (here->HSMHVSsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVDPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVSPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNode != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVDdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVGPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVGPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNode != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVSspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVDPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVdNode != 0)) + { + while (here->HSMHVDPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVDPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVSPgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVsNode != 0)) + { + while (here->HSMHVSPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVSPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNode != 0) && (here->HSMHVgNode != 0)) + { + while (here->HSMHVGgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNode != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVGgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVgNode != 0)) + { + while (here->HSMHVGPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + +/* i = 0 ; + if ((here->HSMHVgNode != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVGdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNode != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVGspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVGbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } +*/ + i = 0 ; + if ((here->HSMHVdNode != 0) && (here->HSMHVdbNode != 0)) + { + while (here->HSMHVDdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNode != 0) && (here->HSMHVsbNode != 0)) + { + while (here->HSMHVSsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdbNode != 0) && (here->HSMHVdNode != 0)) + { + while (here->HSMHVDBdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDBdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdbNode != 0) && (here->HSMHVdbNode != 0)) + { + while (here->HSMHVDBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdbNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVDBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + +/* i = 0 ; + if ((here->HSMHVdbNode != 0) && (here->HSMHVbNode != 0)) + { + while (here->HSMHVDBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } +*/ + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVdbNode != 0)) + { + while (here->HSMHVBPdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVbNode != 0)) + { + while (here->HSMHVBPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVsbNode != 0)) + { + while (here->HSMHVBPsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsbNode != 0) && (here->HSMHVsNode != 0)) + { + while (here->HSMHVSBsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSBsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsbNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVSBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + +/* i = 0 ; + if ((here->HSMHVsbNode != 0) && (here->HSMHVbNode != 0)) + { + while (here->HSMHVSBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } +*/ + i = 0 ; + if ((here->HSMHVsbNode != 0) && (here->HSMHVsbNode != 0)) + { + while (here->HSMHVSBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + +/* i = 0 ; + if ((here->HSMHVbNode != 0) && (here->HSMHVdbNode != 0)) + { + while (here->HSMHVBdbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBdbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } +*/ + i = 0 ; + if ((here->HSMHVbNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + +/* i = 0 ; + if ((here->HSMHVbNode != 0) && (here->HSMHVsbNode != 0)) + { + while (here->HSMHVBsbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBsbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } +*/ + i = 0 ; + if ((here->HSMHVbNode != 0) && (here->HSMHVbNode != 0)) + { + while (here->HSMHVBbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNode != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVDgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNode != 0) && (here->HSMHVsNode != 0)) + { + while (here->HSMHVDsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVDbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVsNode != 0)) + { + while (here->HSMHVDPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNode != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVSgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNode != 0) && (here->HSMHVdNode != 0)) + { + while (here->HSMHVSdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVSbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVdNode != 0)) + { + while (here->HSMHVSPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVdNode != 0)) + { + while (here->HSMHVGPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVsNode != 0)) + { + while (here->HSMHVGPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNode != 0) && (here->HSMHVsubNode != 0)) + { + while (here->HSMHVDsubPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDsubPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVsubNode != 0)) + { + while (here->HSMHVDPsubPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPsubPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNode != 0) && (here->HSMHVsubNode != 0)) + { + while (here->HSMHVSsubPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSsubPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVsubNode != 0)) + { + while (here->HSMHVSPsubPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPsubPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVtempNode != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVTemptempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVTemptempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVtempNode != 0) && (here->HSMHVdNode != 0)) + { + while (here->HSMHVTempdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVTempdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVtempNode != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVTempdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVTempdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVtempNode != 0) && (here->HSMHVsNode != 0)) + { + while (here->HSMHVTempsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVTempsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVtempNode != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVTempspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVTempspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVDPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVSPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVtempNode != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVTempgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVTempgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVtempNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVTempbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVTempbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVGPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVBPtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdbNode != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVDBtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDBtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsbNode != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVSBtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSBtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNode != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVDtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNode != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVStempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVStempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVdNodePrime != 0) && (here->HSMHVqiNode != 0)) + { + while (here->HSMHVDPqiPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVDPqiPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVqiNode != 0)) + { + while (here->HSMHVGPqiPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPqiPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVgNodePrime != 0) && (here->HSMHVqbNode != 0)) + { + while (here->HSMHVGPqbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVGPqbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVsNodePrime != 0) && (here->HSMHVqiNode != 0)) + { + while (here->HSMHVSPqiPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVSPqiPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVbNodePrime != 0) && (here->HSMHVqbNode != 0)) + { + while (here->HSMHVBPqbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVBPqbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqiNode != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVQIdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQIdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqiNode != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVQIgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQIgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqiNode != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVQIspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQIspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqiNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVQIbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQIbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqiNode != 0) && (here->HSMHVqiNode != 0)) + { + while (here->HSMHVQIqiPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQIqiPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqbNode != 0) && (here->HSMHVdNodePrime != 0)) + { + while (here->HSMHVQBdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQBdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqbNode != 0) && (here->HSMHVgNodePrime != 0)) + { + while (here->HSMHVQBgpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQBgpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqbNode != 0) && (here->HSMHVsNodePrime != 0)) + { + while (here->HSMHVQBspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQBspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqbNode != 0) && (here->HSMHVbNodePrime != 0)) + { + while (here->HSMHVQBbpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQBbpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqbNode != 0) && (here->HSMHVqbNode != 0)) + { + while (here->HSMHVQBqbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQBqbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqiNode != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVQItempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQItempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->HSMHVqbNode != 0) && (here->HSMHVtempNode != 0)) + { + while (here->HSMHVQBtempPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->HSMHVQBtempPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/hisimhv1/hsmhvext.h b/src/spicelib/devices/hisimhv1/hsmhvext.h index 69d4ff561..f19a4a0ab 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvext.h +++ b/src/spicelib/devices/hisimhv1/hsmhvext.h @@ -39,6 +39,7 @@ extern int HSMHVtrunc(GENmodel*,CKTcircuit*,double*); extern int HSMHVnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int HSMHVbindCSC(GENmodel*, CKTcircuit*); -extern int HSMHVbindCSCComplex(GENmodel*, CKTcircuit*); +extern int HSMHVbindCSC (GENmodel*, CKTcircuit*); +extern int HSMHVbindCSCComplex (GENmodel*, CKTcircuit*); +extern int HSMHVbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/hisimhv1/hsmhvinit.c b/src/spicelib/devices/hisimhv1/hsmhvinit.c index 7374b0a67..5843f3f24 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvinit.c +++ b/src/spicelib/devices/hisimhv1/hsmhvinit.c @@ -74,6 +74,7 @@ SPICEdev HSMHVinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ HSMHVbindCSC, /* DEVbindCSCComplex */ HSMHVbindCSCComplex, + /* DEVbindCSCComplexToReal */ HSMHVbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/ind/indMUTbindCSC.c b/src/spicelib/devices/ind/indMUTbindCSC.c index 3ce208af7..dc63d63b2 100644 --- a/src/spicelib/devices/ind/indMUTbindCSC.c +++ b/src/spicelib/devices/ind/indMUTbindCSC.c @@ -103,6 +103,59 @@ INDbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) return(OK); } +int +INDbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + INDmodel *model = (INDmodel *)inModel ; + INDinstance *here ; + int i ; + + /* loop through all the Inductor models */ + for ( ; model != NULL ; model = model->INDnextModel) + { + /* loop through all the instances of the model */ + for (here = model->INDinstances ; here != NULL ; here = here->INDnextInstance) + { + i = 0 ; + if ((here->INDposNode != 0) && (here->INDbrEq != 0)) + { + while (here->INDposIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->INDposIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->INDnegNode != 0) && (here->INDbrEq != 0)) + { + while (here->INDnegIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->INDnegIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->INDbrEq != 0) && (here->INDnegNode != 0)) + { + while (here->INDibrNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->INDibrNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->INDbrEq != 0) && (here->INDposNode != 0)) + { + while (here->INDibrPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->INDibrPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->INDbrEq != 0) && (here->INDbrEq != 0)) + { + while (here->INDibrIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->INDibrIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} + #ifdef MUTUAL int MUTbindCSC(GENmodel *inModel, CKTcircuit *ckt) @@ -163,4 +216,36 @@ MUTbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +MUTbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + MUTmodel *model = (MUTmodel *)inModel ; + MUTinstance *here ; + int i ; + + /* loop through all the MutualInductor models */ + for ( ; model != NULL ; model = model->MUTnextModel) + { + /* loop through all the instances of the model */ + for (here = model->MUTinstances ; here != NULL ; here = here->MUTnextInstance) + { + i = 0 ; + if ((here->MUTind1->INDbrEq != 0) && (here->MUTind2->INDbrEq != 0)) + { + while (here->MUTbr1br2 != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MUTbr1br2 = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MUTind2->INDbrEq != 0) && (here->MUTind1->INDbrEq != 0)) + { + while (here->MUTbr2br1 != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MUTbr2br1 = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} #endif diff --git a/src/spicelib/devices/ind/indext.h b/src/spicelib/devices/ind/indext.h index a587fb50f..b386cd446 100644 --- a/src/spicelib/devices/ind/indext.h +++ b/src/spicelib/devices/ind/indext.h @@ -38,10 +38,12 @@ extern int MUTsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int MUTtemp(GENmodel *inModel, CKTcircuit *ckt); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int INDbindCSC(GENmodel*, CKTcircuit*); -extern int INDbindCSCComplex(GENmodel*, CKTcircuit*); -extern int MUTbindCSC(GENmodel*, CKTcircuit*); -extern int MUTbindCSCComplex(GENmodel*, CKTcircuit*); +extern int INDbindCSC (GENmodel*, CKTcircuit*) ; +extern int INDbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int INDbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; +extern int MUTbindCSC (GENmodel*, CKTcircuit*) ; +extern int MUTbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int MUTbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif #endif diff --git a/src/spicelib/devices/ind/indinit.c b/src/spicelib/devices/ind/indinit.c index 5b6775711..5fd375b2d 100644 --- a/src/spicelib/devices/ind/indinit.c +++ b/src/spicelib/devices/ind/indinit.c @@ -75,6 +75,7 @@ SPICEdev INDinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ INDbindCSC, /* DEVbindCSCComplex */ INDbindCSCComplex, + /* DEVbindCSCComplexToReal */ INDbindCSCComplexToReal, #endif }; @@ -148,6 +149,7 @@ SPICEdev MUTinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ MUTbindCSC, /* DEVbindCSCComplex */ MUTbindCSCComplex, + /* DEVbindCSCComplexToReal */ MUTbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/isrc/isrcinit.c b/src/spicelib/devices/isrc/isrcinit.c index 00888925e..4442b53ca 100644 --- a/src/spicelib/devices/isrc/isrcinit.c +++ b/src/spicelib/devices/isrc/isrcinit.c @@ -76,6 +76,7 @@ SPICEdev ISRCinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ NULL, /* DEVbindCSCComplex */ NULL, + /* DEVbindCSCComplexToReal */ NULL, #endif }; diff --git a/src/spicelib/devices/jfet/jfetbindCSC.c b/src/spicelib/devices/jfet/jfetbindCSC.c index 6779ed796..a53045467 100644 --- a/src/spicelib/devices/jfet/jfetbindCSC.c +++ b/src/spicelib/devices/jfet/jfetbindCSC.c @@ -222,3 +222,85 @@ JFETbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +JFETbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + JFETmodel *model = (JFETmodel *)inModel ; + JFETinstance *here ; + int i ; + + /* loop through all the Jfet models */ + for ( ; model != NULL ; model = model->JFETnextModel) + { + /* loop through all the instances of the model */ + for (here = model->JFETinstances ; here != NULL ; here = here->JFETnextInstance) + { + i = 0 ; + if ((here->JFETdrainNode != 0) && (here->JFETdrainPrimeNode != 0)) + { + while (here->JFETdrainDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETdrainDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFETgateNode != 0) && (here->JFETdrainPrimeNode != 0)) + { + while (here->JFETgateDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETgateDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFETgateNode != 0) && (here->JFETsourcePrimeNode != 0)) + { + while (here->JFETgateSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETgateSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFETdrainPrimeNode != 0) && (here->JFETdrainNode != 0)) + { + while (here->JFETdrainPrimeDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETdrainPrimeDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFETdrainPrimeNode != 0) && (here->JFETgateNode != 0)) + { + while (here->JFETdrainPrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETdrainPrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFETsourcePrimeNode != 0) && (here->JFETgateNode != 0)) + { + while (here->JFETsourcePrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETsourcePrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFETdrainNode != 0) && (here->JFETdrainNode != 0)) + { + while (here->JFETdrainDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETdrainDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFETgateNode != 0) && (here->JFETgateNode != 0)) + { + while (here->JFETgateGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETgateGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFETsourceNode != 0) && (here->JFETsourceNode != 0)) + { + while (here->JFETsourceSourcePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFETsourceSourcePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/jfet/jfetext.h b/src/spicelib/devices/jfet/jfetext.h index d3d558aa1..1b09a5e68 100644 --- a/src/spicelib/devices/jfet/jfetext.h +++ b/src/spicelib/devices/jfet/jfetext.h @@ -24,6 +24,7 @@ extern int JFETnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int JFETdSetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int JFETbindCSC(GENmodel*, CKTcircuit*); -extern int JFETbindCSCComplex(GENmodel*, CKTcircuit*); +extern int JFETbindCSC (GENmodel*, CKTcircuit*) ; +extern int JFETbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int JFETbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/jfet/jfetinit.c b/src/spicelib/devices/jfet/jfetinit.c index 91f98501b..01ddc256a 100644 --- a/src/spicelib/devices/jfet/jfetinit.c +++ b/src/spicelib/devices/jfet/jfetinit.c @@ -76,6 +76,7 @@ SPICEdev JFETinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ JFETbindCSC, /* DEVbindCSCComplex */ JFETbindCSCComplex, + /* DEVbindCSCComplexToReal */ JFETbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/jfet2/jfet2bindCSC.c b/src/spicelib/devices/jfet2/jfet2bindCSC.c index 338001176..7fe798800 100644 --- a/src/spicelib/devices/jfet2/jfet2bindCSC.c +++ b/src/spicelib/devices/jfet2/jfet2bindCSC.c @@ -222,3 +222,85 @@ JFET2bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +JFET2bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + JFET2model *model = (JFET2model *)inModel ; + JFET2instance *here ; + int i ; + + /* loop through all the Jfet2 models */ + for ( ; model != NULL ; model = model->JFET2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->JFET2instances ; here != NULL ; here = here->JFET2nextInstance) + { + i = 0 ; + if ((here->JFET2drainNode != 0) && (here->JFET2drainPrimeNode != 0)) + { + while (here->JFET2drainDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2drainDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFET2gateNode != 0) && (here->JFET2drainPrimeNode != 0)) + { + while (here->JFET2gateDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2gateDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFET2gateNode != 0) && (here->JFET2sourcePrimeNode != 0)) + { + while (here->JFET2gateSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2gateSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFET2drainPrimeNode != 0) && (here->JFET2drainNode != 0)) + { + while (here->JFET2drainPrimeDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2drainPrimeDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFET2drainPrimeNode != 0) && (here->JFET2gateNode != 0)) + { + while (here->JFET2drainPrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2drainPrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFET2sourcePrimeNode != 0) && (here->JFET2gateNode != 0)) + { + while (here->JFET2sourcePrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2sourcePrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFET2drainNode != 0) && (here->JFET2drainNode != 0)) + { + while (here->JFET2drainDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2drainDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFET2gateNode != 0) && (here->JFET2gateNode != 0)) + { + while (here->JFET2gateGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2gateGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->JFET2sourceNode != 0) && (here->JFET2sourceNode != 0)) + { + while (here->JFET2sourceSourcePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->JFET2sourceSourcePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/jfet2/jfet2ext.h b/src/spicelib/devices/jfet2/jfet2ext.h index d2b60b7c0..2379d9aa5 100644 --- a/src/spicelib/devices/jfet2/jfet2ext.h +++ b/src/spicelib/devices/jfet2/jfet2ext.h @@ -24,6 +24,7 @@ extern int JFET2trunc(GENmodel*,CKTcircuit*,double*); extern int JFET2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int JFET2bindCSC(GENmodel*, CKTcircuit*); -extern int JFET2bindCSCComplex(GENmodel*, CKTcircuit*); +extern int JFET2bindCSC (GENmodel*, CKTcircuit*) ; +extern int JFET2bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int JFET2bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/jfet2/jfet2init.c b/src/spicelib/devices/jfet2/jfet2init.c index ef005667c..261a60a51 100644 --- a/src/spicelib/devices/jfet2/jfet2init.c +++ b/src/spicelib/devices/jfet2/jfet2init.c @@ -76,6 +76,7 @@ SPICEdev JFET2info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ JFET2bindCSC, /* DEVbindCSCComplex */ JFET2bindCSCComplex, + /* DEVbindCSCComplexToReal */ JFET2bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/ltra/ltrabindCSC.c b/src/spicelib/devices/ltra/ltrabindCSC.c index 494960a22..d31a3b70e 100644 --- a/src/spicelib/devices/ltra/ltrabindCSC.c +++ b/src/spicelib/devices/ltra/ltrabindCSC.c @@ -282,3 +282,161 @@ LTRAbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +LTRAbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + LTRAmodel *model = (LTRAmodel *)inModel ; + LTRAinstance *here ; + int i ; + + /* loop through all the TransmissionLine models */ + for ( ; model != NULL ; model = model->LTRAnextModel) + { + /* loop through all the instances of the model */ + for (here = model->LTRAinstances ; here != NULL ; here = here->LTRAnextInstance) + { + i = 0 ; + if ((here->LTRAbrEq1 != 0) && (here->LTRAposNode1 != 0)) + { + while (here->LTRAibr1Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq1 != 0) && (here->LTRAnegNode1 != 0)) + { + while (here->LTRAibr1Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq1 != 0) && (here->LTRAposNode2 != 0)) + { + while (here->LTRAibr1Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr1Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq1 != 0) && (here->LTRAnegNode2 != 0)) + { + while (here->LTRAibr1Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr1Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq1 != 0) && (here->LTRAbrEq1 != 0)) + { + while (here->LTRAibr1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq1 != 0) && (here->LTRAbrEq2 != 0)) + { + while (here->LTRAibr1Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr1Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq2 != 0) && (here->LTRAposNode1 != 0)) + { + while (here->LTRAibr2Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr2Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq2 != 0) && (here->LTRAnegNode1 != 0)) + { + while (here->LTRAibr2Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr2Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq2 != 0) && (here->LTRAposNode2 != 0)) + { + while (here->LTRAibr2Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq2 != 0) && (here->LTRAnegNode2 != 0)) + { + while (here->LTRAibr2Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq2 != 0) && (here->LTRAbrEq1 != 0)) + { + while (here->LTRAibr2Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr2Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAbrEq2 != 0) && (here->LTRAbrEq2 != 0)) + { + while (here->LTRAibr2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAibr2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAposNode1 != 0) && (here->LTRAbrEq1 != 0)) + { + while (here->LTRApos1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRApos1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAnegNode1 != 0) && (here->LTRAbrEq1 != 0)) + { + while (here->LTRAneg1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAneg1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAposNode2 != 0) && (here->LTRAbrEq2 != 0)) + { + while (here->LTRApos2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRApos2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAnegNode2 != 0) && (here->LTRAbrEq2 != 0)) + { + while (here->LTRAneg2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAneg2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAposNode1 != 0) && (here->LTRAposNode1 != 0)) + { + while (here->LTRApos1Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRApos1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAnegNode1 != 0) && (here->LTRAnegNode1 != 0)) + { + while (here->LTRAneg1Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAneg1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAposNode2 != 0) && (here->LTRAposNode2 != 0)) + { + while (here->LTRApos2Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRApos2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->LTRAnegNode2 != 0) && (here->LTRAnegNode2 != 0)) + { + while (here->LTRAneg2Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->LTRAneg2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/ltra/ltraext.h b/src/spicelib/devices/ltra/ltraext.h index af6ad02c4..84e7220b1 100644 --- a/src/spicelib/devices/ltra/ltraext.h +++ b/src/spicelib/devices/ltra/ltraext.h @@ -46,6 +46,7 @@ extern void LTRArlcCoeffsSetup(double*,double*,double*,double*,double*,double*,i extern int LTRAstraightLineCheck(double,double,double,double,double,double,double,double); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int LTRAbindCSC(GENmodel*, CKTcircuit*); -extern int LTRAbindCSCComplex(GENmodel*, CKTcircuit*); +extern int LTRAbindCSC (GENmodel*, CKTcircuit*) ; +extern int LTRAbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int LTRAbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/ltra/ltrainit.c b/src/spicelib/devices/ltra/ltrainit.c index 214f3bf12..40a41955d 100644 --- a/src/spicelib/devices/ltra/ltrainit.c +++ b/src/spicelib/devices/ltra/ltrainit.c @@ -76,6 +76,7 @@ SPICEdev LTRAinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ LTRAbindCSC, /* DEVbindCSCComplex */ LTRAbindCSCComplex, + /* DEVbindCSCComplexToReal */ LTRAbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/mes/mesbindCSC.c b/src/spicelib/devices/mes/mesbindCSC.c index 1d40570a7..714b7e98b 100644 --- a/src/spicelib/devices/mes/mesbindCSC.c +++ b/src/spicelib/devices/mes/mesbindCSC.c @@ -222,3 +222,85 @@ MESbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +MESbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + MESmodel *model = (MESmodel *)inModel ; + MESinstance *here ; + int i ; + + /* loop through all the mes models */ + for ( ; model != NULL ; model = model->MESnextModel) + { + /* loop through all the instances of the model */ + for (here = model->MESinstances ; here != NULL ; here = here->MESnextInstance) + { + i = 0 ; + if ((here->MESdrainNode != 0) && (here->MESdrainPrimeNode != 0)) + { + while (here->MESdrainDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESdrainDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESgateNode != 0) && (here->MESdrainPrimeNode != 0)) + { + while (here->MESgateDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESgateDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESgateNode != 0) && (here->MESsourcePrimeNode != 0)) + { + while (here->MESgateSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESgateSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESdrainPrimeNode != 0) && (here->MESdrainNode != 0)) + { + while (here->MESdrainPrimeDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESdrainPrimeDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESdrainPrimeNode != 0) && (here->MESgateNode != 0)) + { + while (here->MESdrainPrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESdrainPrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESsourcePrimeNode != 0) && (here->MESgateNode != 0)) + { + while (here->MESsourcePrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESsourcePrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESdrainNode != 0) && (here->MESdrainNode != 0)) + { + while (here->MESdrainDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESdrainDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESgateNode != 0) && (here->MESgateNode != 0)) + { + while (here->MESgateGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESgateGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESsourceNode != 0) && (here->MESsourceNode != 0)) + { + while (here->MESsourceSourcePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESsourceSourcePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/mes/mesext.h b/src/spicelib/devices/mes/mesext.h index 9d02dce89..f2d0a9c3b 100644 --- a/src/spicelib/devices/mes/mesext.h +++ b/src/spicelib/devices/mes/mesext.h @@ -25,6 +25,7 @@ extern int MESdSetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int MESbindCSC(GENmodel*, CKTcircuit*); -extern int MESbindCSCComplex(GENmodel*, CKTcircuit*); +extern int MESbindCSC (GENmodel*, CKTcircuit*) ; +extern int MESbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int MESbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/mes/mesinit.c b/src/spicelib/devices/mes/mesinit.c index fb5b08afd..062dbe0e6 100644 --- a/src/spicelib/devices/mes/mesinit.c +++ b/src/spicelib/devices/mes/mesinit.c @@ -76,6 +76,7 @@ SPICEdev MESinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ MESbindCSC, /* DEVbindCSCComplex */ MESbindCSCComplex, + /* DEVbindCSCComplexToReal */ MESbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/mesa/mesabindCSC.c b/src/spicelib/devices/mesa/mesabindCSC.c index 5f51a8991..6a4a9f57a 100644 --- a/src/spicelib/devices/mesa/mesabindCSC.c +++ b/src/spicelib/devices/mesa/mesabindCSC.c @@ -378,3 +378,217 @@ MESAbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +MESAbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + MESAmodel *model = (MESAmodel *)inModel ; + MESAinstance *here ; + int i ; + + /* loop through all the mesa models */ + for ( ; model != NULL ; model = model->MESAnextModel) + { + /* loop through all the instances of the model */ + for (here = model->MESAinstances ; here != NULL ; here = here->MESAnextInstance) + { + i = 0 ; + if ((here->MESAdrainNode != 0) && (here->MESAdrainNode != 0)) + { + while (here->MESAdrainDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainPrimeNode != 0) && (here->MESAdrainPrimeNode != 0)) + { + while (here->MESAdrainPrimeDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainPrimeDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainPrmPrmNode != 0) && (here->MESAdrainPrmPrmNode != 0)) + { + while (here->MESAdrainPrmPrmDrainPrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainPrmPrmDrainPrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAgateNode != 0) && (here->MESAgateNode != 0)) + { + while (here->MESAgateGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAgateGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAgatePrimeNode != 0) && (here->MESAgatePrimeNode != 0)) + { + while (here->MESAgatePrimeGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAgatePrimeGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourceNode != 0) && (here->MESAsourceNode != 0)) + { + while (here->MESAsourceSourcePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourceSourcePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourcePrimeNode != 0) && (here->MESAsourcePrimeNode != 0)) + { + while (here->MESAsourcePrimeSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourcePrimeSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourcePrmPrmNode != 0) && (here->MESAsourcePrmPrmNode != 0)) + { + while (here->MESAsourcePrmPrmSourcePrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourcePrmPrmSourcePrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainNode != 0) && (here->MESAdrainPrimeNode != 0)) + { + while (here->MESAdrainDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainPrimeNode != 0) && (here->MESAdrainNode != 0)) + { + while (here->MESAdrainPrimeDrainPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainPrimeDrainPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAgatePrimeNode != 0) && (here->MESAdrainPrimeNode != 0)) + { + while (here->MESAgatePrimeDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAgatePrimeDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainPrimeNode != 0) && (here->MESAgatePrimeNode != 0)) + { + while (here->MESAdrainPrimeGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainPrimeGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAgatePrimeNode != 0) && (here->MESAsourcePrimeNode != 0)) + { + while (here->MESAgatePrimeSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAgatePrimeSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourcePrimeNode != 0) && (here->MESAgatePrimeNode != 0)) + { + while (here->MESAsourcePrimeGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourcePrimeGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourceNode != 0) && (here->MESAsourcePrimeNode != 0)) + { + while (here->MESAsourceSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourceSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourcePrimeNode != 0) && (here->MESAsourceNode != 0)) + { + while (here->MESAsourcePrimeSourcePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourcePrimeSourcePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainPrimeNode != 0) && (here->MESAsourcePrimeNode != 0)) + { + while (here->MESAdrainPrimeSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainPrimeSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourcePrimeNode != 0) && (here->MESAdrainPrimeNode != 0)) + { + while (here->MESAsourcePrimeDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourcePrimeDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAgatePrimeNode != 0) && (here->MESAgateNode != 0)) + { + while (here->MESAgatePrimeGatePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAgatePrimeGatePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAgateNode != 0) && (here->MESAgatePrimeNode != 0)) + { + while (here->MESAgateGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAgateGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourcePrmPrmNode != 0) && (here->MESAsourcePrimeNode != 0)) + { + while (here->MESAsourcePrmPrmSourcePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourcePrmPrmSourcePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourcePrimeNode != 0) && (here->MESAsourcePrmPrmNode != 0)) + { + while (here->MESAsourcePrimeSourcePrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourcePrimeSourcePrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAsourcePrmPrmNode != 0) && (here->MESAgatePrimeNode != 0)) + { + while (here->MESAsourcePrmPrmGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAsourcePrmPrmGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAgatePrimeNode != 0) && (here->MESAsourcePrmPrmNode != 0)) + { + while (here->MESAgatePrimeSourcePrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAgatePrimeSourcePrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainPrmPrmNode != 0) && (here->MESAdrainPrimeNode != 0)) + { + while (here->MESAdrainPrmPrmDrainPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainPrmPrmDrainPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainPrimeNode != 0) && (here->MESAdrainPrmPrmNode != 0)) + { + while (here->MESAdrainPrimeDrainPrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainPrimeDrainPrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAdrainPrmPrmNode != 0) && (here->MESAgatePrimeNode != 0)) + { + while (here->MESAdrainPrmPrmGatePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAdrainPrmPrmGatePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MESAgatePrimeNode != 0) && (here->MESAdrainPrmPrmNode != 0)) + { + while (here->MESAgatePrimeDrainPrmPrmPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MESAgatePrimeDrainPrmPrmPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/mesa/mesaext.h b/src/spicelib/devices/mesa/mesaext.h index 5441f29a7..fba7871bd 100644 --- a/src/spicelib/devices/mesa/mesaext.h +++ b/src/spicelib/devices/mesa/mesaext.h @@ -20,6 +20,7 @@ extern int MESAtrunc(GENmodel*,CKTcircuit*,double*); extern int MESAunsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int MESAbindCSC(GENmodel*, CKTcircuit*); -extern int MESAbindCSCComplex(GENmodel*, CKTcircuit*); +extern int MESAbindCSC (GENmodel*, CKTcircuit*) ; +extern int MESAbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int MESAbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/mesa/mesainit.c b/src/spicelib/devices/mesa/mesainit.c index 86c33bf17..d887e89d4 100644 --- a/src/spicelib/devices/mesa/mesainit.c +++ b/src/spicelib/devices/mesa/mesainit.c @@ -76,6 +76,7 @@ SPICEdev MESAinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ MESAbindCSC, /* DEVbindCSCComplex */ MESAbindCSCComplex, + /* DEVbindCSCComplexToReal */ MESAbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/mos1/mos1bindCSC.c b/src/spicelib/devices/mos1/mos1bindCSC.c index 4e83cf47b..7c98005df 100644 --- a/src/spicelib/devices/mos1/mos1bindCSC.c +++ b/src/spicelib/devices/mos1/mos1bindCSC.c @@ -306,3 +306,175 @@ MOS1bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +MOS1bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS1model *model = (MOS1model *)inModel ; + MOS1instance *here ; + int i ; + + /* loop through all the mos1 models */ + for ( ; model != NULL ; model = model->MOS1nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS1instances ; here != NULL ; here = here->MOS1nextInstance) + { + i = 0 ; + if ((here->MOS1dNode != 0) && (here->MOS1dNode != 0)) + { + while (here->MOS1DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1gNode != 0) && (here->MOS1gNode != 0)) + { + while (here->MOS1GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1sNode != 0) && (here->MOS1sNode != 0)) + { + while (here->MOS1SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1bNode != 0) && (here->MOS1bNode != 0)) + { + while (here->MOS1BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1dNodePrime != 0) && (here->MOS1dNodePrime != 0)) + { + while (here->MOS1DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1sNodePrime != 0) && (here->MOS1sNodePrime != 0)) + { + while (here->MOS1SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1dNode != 0) && (here->MOS1dNodePrime != 0)) + { + while (here->MOS1DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1gNode != 0) && (here->MOS1bNode != 0)) + { + while (here->MOS1GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1gNode != 0) && (here->MOS1dNodePrime != 0)) + { + while (here->MOS1GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1gNode != 0) && (here->MOS1sNodePrime != 0)) + { + while (here->MOS1GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1sNode != 0) && (here->MOS1sNodePrime != 0)) + { + while (here->MOS1SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1bNode != 0) && (here->MOS1dNodePrime != 0)) + { + while (here->MOS1BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1bNode != 0) && (here->MOS1sNodePrime != 0)) + { + while (here->MOS1BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1dNodePrime != 0) && (here->MOS1sNodePrime != 0)) + { + while (here->MOS1DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1dNodePrime != 0) && (here->MOS1dNode != 0)) + { + while (here->MOS1DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1bNode != 0) && (here->MOS1gNode != 0)) + { + while (here->MOS1BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1dNodePrime != 0) && (here->MOS1gNode != 0)) + { + while (here->MOS1DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1sNodePrime != 0) && (here->MOS1gNode != 0)) + { + while (here->MOS1SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1sNodePrime != 0) && (here->MOS1sNode != 0)) + { + while (here->MOS1SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1dNodePrime != 0) && (here->MOS1bNode != 0)) + { + while (here->MOS1DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1sNodePrime != 0) && (here->MOS1bNode != 0)) + { + while (here->MOS1SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS1sNodePrime != 0) && (here->MOS1dNodePrime != 0)) + { + while (here->MOS1SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS1SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/mos1/mos1ext.h b/src/spicelib/devices/mos1/mos1ext.h index 86f6c77a6..d2eeb7faf 100644 --- a/src/spicelib/devices/mos1/mos1ext.h +++ b/src/spicelib/devices/mos1/mos1ext.h @@ -30,6 +30,7 @@ extern int MOS1noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS1dSetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int MOS1bindCSC(GENmodel*, CKTcircuit*); -extern int MOS1bindCSCComplex(GENmodel*, CKTcircuit*); +extern int MOS1bindCSC (GENmodel*, CKTcircuit*) ; +extern int MOS1bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int MOS1bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/mos1/mos1init.c b/src/spicelib/devices/mos1/mos1init.c index c8b41444b..c88444c9c 100644 --- a/src/spicelib/devices/mos1/mos1init.c +++ b/src/spicelib/devices/mos1/mos1init.c @@ -76,6 +76,7 @@ SPICEdev MOS1info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ MOS1bindCSC, /* DEVbindCSCComplex */ MOS1bindCSCComplex, + /* DEVbindCSCComplexToReal */ MOS1bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/mos2/mos2bindCSC.c b/src/spicelib/devices/mos2/mos2bindCSC.c index 43d4cb513..70d62ccde 100644 --- a/src/spicelib/devices/mos2/mos2bindCSC.c +++ b/src/spicelib/devices/mos2/mos2bindCSC.c @@ -306,3 +306,175 @@ MOS2bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +MOS2bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS2model *model = (MOS2model *)inModel ; + MOS2instance *here ; + int i ; + + /* loop through all the mos2 models */ + for ( ; model != NULL ; model = model->MOS2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS2instances ; here != NULL ; here = here->MOS2nextInstance) + { + i = 0 ; + if ((here->MOS2dNode != 0) && (here->MOS2dNode != 0)) + { + while (here->MOS2DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2gNode != 0) && (here->MOS2gNode != 0)) + { + while (here->MOS2GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2sNode != 0) && (here->MOS2sNode != 0)) + { + while (here->MOS2SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2bNode != 0) && (here->MOS2bNode != 0)) + { + while (here->MOS2BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2dNodePrime != 0) && (here->MOS2dNodePrime != 0)) + { + while (here->MOS2DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2sNodePrime != 0) && (here->MOS2sNodePrime != 0)) + { + while (here->MOS2SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2dNode != 0) && (here->MOS2dNodePrime != 0)) + { + while (here->MOS2DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2gNode != 0) && (here->MOS2bNode != 0)) + { + while (here->MOS2GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2gNode != 0) && (here->MOS2dNodePrime != 0)) + { + while (here->MOS2GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2gNode != 0) && (here->MOS2sNodePrime != 0)) + { + while (here->MOS2GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2sNode != 0) && (here->MOS2sNodePrime != 0)) + { + while (here->MOS2SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2bNode != 0) && (here->MOS2dNodePrime != 0)) + { + while (here->MOS2BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2bNode != 0) && (here->MOS2sNodePrime != 0)) + { + while (here->MOS2BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2dNodePrime != 0) && (here->MOS2sNodePrime != 0)) + { + while (here->MOS2DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2dNodePrime != 0) && (here->MOS2dNode != 0)) + { + while (here->MOS2DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2bNode != 0) && (here->MOS2gNode != 0)) + { + while (here->MOS2BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2dNodePrime != 0) && (here->MOS2gNode != 0)) + { + while (here->MOS2DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2sNodePrime != 0) && (here->MOS2gNode != 0)) + { + while (here->MOS2SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2sNodePrime != 0) && (here->MOS2sNode != 0)) + { + while (here->MOS2SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2dNodePrime != 0) && (here->MOS2bNode != 0)) + { + while (here->MOS2DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2sNodePrime != 0) && (here->MOS2bNode != 0)) + { + while (here->MOS2SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS2sNodePrime != 0) && (here->MOS2dNodePrime != 0)) + { + while (here->MOS2SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS2SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/mos2/mos2ext.h b/src/spicelib/devices/mos2/mos2ext.h index 5a8a6fd6b..e9a52ee7e 100644 --- a/src/spicelib/devices/mos2/mos2ext.h +++ b/src/spicelib/devices/mos2/mos2ext.h @@ -31,6 +31,7 @@ extern int MOS2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS2dSetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int MOS2bindCSC(GENmodel*, CKTcircuit*); -extern int MOS2bindCSCComplex(GENmodel*, CKTcircuit*); +extern int MOS2bindCSC (GENmodel*, CKTcircuit*) ; +extern int MOS2bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int MOS2bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/mos2/mos2init.c b/src/spicelib/devices/mos2/mos2init.c index 5289e7280..df9cf04be 100644 --- a/src/spicelib/devices/mos2/mos2init.c +++ b/src/spicelib/devices/mos2/mos2init.c @@ -76,6 +76,7 @@ SPICEdev MOS2info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ MOS2bindCSC, /* DEVbindCSCComplex */ MOS2bindCSCComplex, + /* DEVbindCSCComplexToReal */ MOS2bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/mos3/mos3bindCSC.c b/src/spicelib/devices/mos3/mos3bindCSC.c index 103d121f1..17ac76157 100644 --- a/src/spicelib/devices/mos3/mos3bindCSC.c +++ b/src/spicelib/devices/mos3/mos3bindCSC.c @@ -306,3 +306,175 @@ MOS3bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +MOS3bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS3model *model = (MOS3model *)inModel ; + MOS3instance *here ; + int i ; + + /* loop through all the mos3 models */ + for ( ; model != NULL ; model = model->MOS3nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS3instances ; here != NULL ; here = here->MOS3nextInstance) + { + i = 0 ; + if ((here->MOS3dNode != 0) && (here->MOS3dNode != 0)) + { + while (here->MOS3DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3gNode != 0) && (here->MOS3gNode != 0)) + { + while (here->MOS3GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3sNode != 0) && (here->MOS3sNode != 0)) + { + while (here->MOS3SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3bNode != 0) && (here->MOS3bNode != 0)) + { + while (here->MOS3BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3dNodePrime != 0) && (here->MOS3dNodePrime != 0)) + { + while (here->MOS3DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3sNodePrime != 0) && (here->MOS3sNodePrime != 0)) + { + while (here->MOS3SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3dNode != 0) && (here->MOS3dNodePrime != 0)) + { + while (here->MOS3DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3gNode != 0) && (here->MOS3bNode != 0)) + { + while (here->MOS3GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3gNode != 0) && (here->MOS3dNodePrime != 0)) + { + while (here->MOS3GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3gNode != 0) && (here->MOS3sNodePrime != 0)) + { + while (here->MOS3GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3sNode != 0) && (here->MOS3sNodePrime != 0)) + { + while (here->MOS3SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3bNode != 0) && (here->MOS3dNodePrime != 0)) + { + while (here->MOS3BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3bNode != 0) && (here->MOS3sNodePrime != 0)) + { + while (here->MOS3BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3dNodePrime != 0) && (here->MOS3sNodePrime != 0)) + { + while (here->MOS3DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3dNodePrime != 0) && (here->MOS3dNode != 0)) + { + while (here->MOS3DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3bNode != 0) && (here->MOS3gNode != 0)) + { + while (here->MOS3BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3dNodePrime != 0) && (here->MOS3gNode != 0)) + { + while (here->MOS3DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3sNodePrime != 0) && (here->MOS3gNode != 0)) + { + while (here->MOS3SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3sNodePrime != 0) && (here->MOS3sNode != 0)) + { + while (here->MOS3SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3dNodePrime != 0) && (here->MOS3bNode != 0)) + { + while (here->MOS3DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3sNodePrime != 0) && (here->MOS3bNode != 0)) + { + while (here->MOS3SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS3sNodePrime != 0) && (here->MOS3dNodePrime != 0)) + { + while (here->MOS3SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS3SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/mos3/mos3ext.h b/src/spicelib/devices/mos3/mos3ext.h index 32288d0de..39063695d 100644 --- a/src/spicelib/devices/mos3/mos3ext.h +++ b/src/spicelib/devices/mos3/mos3ext.h @@ -30,6 +30,7 @@ extern int MOS3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS3dSetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int MOS3bindCSC(GENmodel*, CKTcircuit*); -extern int MOS3bindCSCComplex(GENmodel*, CKTcircuit*); +extern int MOS3bindCSC (GENmodel*, CKTcircuit*) ; +extern int MOS3bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int MOS3bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/mos3/mos3init.c b/src/spicelib/devices/mos3/mos3init.c index 68944bd9e..b9d7f83cc 100644 --- a/src/spicelib/devices/mos3/mos3init.c +++ b/src/spicelib/devices/mos3/mos3init.c @@ -76,6 +76,7 @@ SPICEdev MOS3info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ MOS3bindCSC, /* DEVbindCSCComplex */ MOS3bindCSCComplex, + /* DEVbindCSCComplexToReal */ MOS3bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/mos6/mos6bindCSC.c b/src/spicelib/devices/mos6/mos6bindCSC.c index 00da661ea..f53004eaf 100644 --- a/src/spicelib/devices/mos6/mos6bindCSC.c +++ b/src/spicelib/devices/mos6/mos6bindCSC.c @@ -306,3 +306,175 @@ MOS6bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +MOS6bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS6model *model = (MOS6model *)inModel ; + MOS6instance *here ; + int i ; + + /* loop through all the mos6 models */ + for ( ; model != NULL ; model = model->MOS6nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS6instances ; here != NULL ; here = here->MOS6nextInstance) + { + i = 0 ; + if ((here->MOS6dNode != 0) && (here->MOS6dNode != 0)) + { + while (here->MOS6DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6gNode != 0) && (here->MOS6gNode != 0)) + { + while (here->MOS6GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6sNode != 0) && (here->MOS6sNode != 0)) + { + while (here->MOS6SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6bNode != 0) && (here->MOS6bNode != 0)) + { + while (here->MOS6BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6dNodePrime != 0) && (here->MOS6dNodePrime != 0)) + { + while (here->MOS6DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6sNodePrime != 0) && (here->MOS6sNodePrime != 0)) + { + while (here->MOS6SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6dNode != 0) && (here->MOS6dNodePrime != 0)) + { + while (here->MOS6DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6gNode != 0) && (here->MOS6bNode != 0)) + { + while (here->MOS6GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6gNode != 0) && (here->MOS6dNodePrime != 0)) + { + while (here->MOS6GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6gNode != 0) && (here->MOS6sNodePrime != 0)) + { + while (here->MOS6GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6sNode != 0) && (here->MOS6sNodePrime != 0)) + { + while (here->MOS6SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6bNode != 0) && (here->MOS6dNodePrime != 0)) + { + while (here->MOS6BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6bNode != 0) && (here->MOS6sNodePrime != 0)) + { + while (here->MOS6BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6dNodePrime != 0) && (here->MOS6sNodePrime != 0)) + { + while (here->MOS6DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6dNodePrime != 0) && (here->MOS6dNode != 0)) + { + while (here->MOS6DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6bNode != 0) && (here->MOS6gNode != 0)) + { + while (here->MOS6BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6dNodePrime != 0) && (here->MOS6gNode != 0)) + { + while (here->MOS6DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6sNodePrime != 0) && (here->MOS6gNode != 0)) + { + while (here->MOS6SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6sNodePrime != 0) && (here->MOS6sNode != 0)) + { + while (here->MOS6SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6dNodePrime != 0) && (here->MOS6bNode != 0)) + { + while (here->MOS6DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6sNodePrime != 0) && (here->MOS6bNode != 0)) + { + while (here->MOS6SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS6sNodePrime != 0) && (here->MOS6dNodePrime != 0)) + { + while (here->MOS6SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS6SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/mos6/mos6ext.h b/src/spicelib/devices/mos6/mos6ext.h index 2834c4ad8..35e11d77e 100644 --- a/src/spicelib/devices/mos6/mos6ext.h +++ b/src/spicelib/devices/mos6/mos6ext.h @@ -21,6 +21,7 @@ extern int MOS6trunc(GENmodel*,CKTcircuit*,double*); extern int MOS6convTest(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int MOS6bindCSC(GENmodel*, CKTcircuit*); -extern int MOS6bindCSCComplex(GENmodel*, CKTcircuit*); +extern int MOS6bindCSC (GENmodel*, CKTcircuit*) ; +extern int MOS6bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int MOS6bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/mos6/mos6init.c b/src/spicelib/devices/mos6/mos6init.c index 873b89102..997915874 100644 --- a/src/spicelib/devices/mos6/mos6init.c +++ b/src/spicelib/devices/mos6/mos6init.c @@ -76,6 +76,7 @@ SPICEdev MOS6info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ MOS6bindCSC, /* DEVbindCSCComplex */ MOS6bindCSCComplex, + /* DEVbindCSCComplexToReal */ MOS6bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/mos9/mos9bindCSC.c b/src/spicelib/devices/mos9/mos9bindCSC.c index 350da42d4..e8f10d17e 100644 --- a/src/spicelib/devices/mos9/mos9bindCSC.c +++ b/src/spicelib/devices/mos9/mos9bindCSC.c @@ -306,3 +306,175 @@ MOS9bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +MOS9bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + MOS9model *model = (MOS9model *)inModel ; + MOS9instance *here ; + int i ; + + /* loop through all the mos9 models */ + for ( ; model != NULL ; model = model->MOS9nextModel) + { + /* loop through all the instances of the model */ + for (here = model->MOS9instances ; here != NULL ; here = here->MOS9nextInstance) + { + i = 0 ; + if ((here->MOS9dNode != 0) && (here->MOS9dNode != 0)) + { + while (here->MOS9DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9gNode != 0) && (here->MOS9gNode != 0)) + { + while (here->MOS9GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9sNode != 0) && (here->MOS9sNode != 0)) + { + while (here->MOS9SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9bNode != 0) && (here->MOS9bNode != 0)) + { + while (here->MOS9BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9dNodePrime != 0) && (here->MOS9dNodePrime != 0)) + { + while (here->MOS9DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9sNodePrime != 0) && (here->MOS9sNodePrime != 0)) + { + while (here->MOS9SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9dNode != 0) && (here->MOS9dNodePrime != 0)) + { + while (here->MOS9DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9gNode != 0) && (here->MOS9bNode != 0)) + { + while (here->MOS9GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9gNode != 0) && (here->MOS9dNodePrime != 0)) + { + while (here->MOS9GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9gNode != 0) && (here->MOS9sNodePrime != 0)) + { + while (here->MOS9GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9sNode != 0) && (here->MOS9sNodePrime != 0)) + { + while (here->MOS9SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9bNode != 0) && (here->MOS9dNodePrime != 0)) + { + while (here->MOS9BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9bNode != 0) && (here->MOS9sNodePrime != 0)) + { + while (here->MOS9BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9dNodePrime != 0) && (here->MOS9sNodePrime != 0)) + { + while (here->MOS9DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9dNodePrime != 0) && (here->MOS9dNode != 0)) + { + while (here->MOS9DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9bNode != 0) && (here->MOS9gNode != 0)) + { + while (here->MOS9BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9dNodePrime != 0) && (here->MOS9gNode != 0)) + { + while (here->MOS9DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9sNodePrime != 0) && (here->MOS9gNode != 0)) + { + while (here->MOS9SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9sNodePrime != 0) && (here->MOS9sNode != 0)) + { + while (here->MOS9SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9dNodePrime != 0) && (here->MOS9bNode != 0)) + { + while (here->MOS9DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9sNodePrime != 0) && (here->MOS9bNode != 0)) + { + while (here->MOS9SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->MOS9sNodePrime != 0) && (here->MOS9dNodePrime != 0)) + { + while (here->MOS9SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->MOS9SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/mos9/mos9ext.h b/src/spicelib/devices/mos9/mos9ext.h index b229e9b50..d94b8c7e0 100644 --- a/src/spicelib/devices/mos9/mos9ext.h +++ b/src/spicelib/devices/mos9/mos9ext.h @@ -30,6 +30,7 @@ extern int MOS9noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int MOS9dSetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int MOS9bindCSC(GENmodel*, CKTcircuit*); -extern int MOS9bindCSCComplex(GENmodel*, CKTcircuit*); +extern int MOS9bindCSC (GENmodel*, CKTcircuit*) ; +extern int MOS9bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int MOS9bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/mos9/mos9init.c b/src/spicelib/devices/mos9/mos9init.c index 490a5273d..0aca14499 100644 --- a/src/spicelib/devices/mos9/mos9init.c +++ b/src/spicelib/devices/mos9/mos9init.c @@ -76,6 +76,7 @@ SPICEdev MOS9info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ MOS9bindCSC, /* DEVbindCSCComplex */ MOS9bindCSCComplex, + /* DEVbindCSCComplexToReal */ MOS9bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/res/resbindCSC.c b/src/spicelib/devices/res/resbindCSC.c index aaeb674e1..2c720bfb7 100644 --- a/src/spicelib/devices/res/resbindCSC.c +++ b/src/spicelib/devices/res/resbindCSC.c @@ -90,3 +90,49 @@ RESbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +RESbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + RESmodel *model = (RESmodel *)inModel ; + RESinstance *here ; + int i ; + + /* loop through all the resistor models */ + for ( ; model != NULL ; model = model->RESnextModel) + { + /* loop through all the instances of the model */ + for (here = model->RESinstances ; here != NULL ; here = here->RESnextInstance) + { + i = 0 ; + if ((here->RESposNode != 0) && (here->RESposNode != 0)) + { + while (here->RESposPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->RESposPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->RESnegNode != 0) && (here->RESnegNode != 0)) + { + while (here->RESnegNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->RESnegNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->RESposNode != 0) && (here->RESnegNode != 0)) + { + while (here->RESposNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->RESposNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->RESnegNode != 0) && (here->RESposNode != 0)) + { + while (here->RESnegPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->RESnegPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/res/resext.h b/src/spicelib/devices/res/resext.h index 2521c74df..b96d7cd8e 100644 --- a/src/spicelib/devices/res/resext.h +++ b/src/spicelib/devices/res/resext.h @@ -22,6 +22,7 @@ extern int REStemp(GENmodel*,CKTcircuit*); extern int RESnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int RESbindCSC(GENmodel*, CKTcircuit*); -extern int RESbindCSCComplex(GENmodel*, CKTcircuit*); +extern int RESbindCSC (GENmodel*, CKTcircuit*) ; +extern int RESbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int RESbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index fbd940c94..03524119a 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -76,6 +76,7 @@ SPICEdev RESinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ RESbindCSC, /* DEVbindCSCComplex */ RESbindCSCComplex, + /* DEVbindCSCComplexToReal */ RESbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/soi3/soi3bindCSC.c b/src/spicelib/devices/soi3/soi3bindCSC.c index 9708e8003..35b04e17c 100644 --- a/src/spicelib/devices/soi3/soi3bindCSC.c +++ b/src/spicelib/devices/soi3/soi3bindCSC.c @@ -676,3 +676,420 @@ SOI3bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +SOI3bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + SOI3model *model = (SOI3model *)inModel ; + SOI3instance *here ; + int i ; + + /* loop through all the SiliconOnInsulator3 models */ + for ( ; model != NULL ; model = model->SOI3nextModel) + { + /* loop through all the instances of the model */ + for (here = model->SOI3instances ; here != NULL ; here = here->SOI3nextInstance) + { + i = 0 ; + if ((here->SOI3dNode != 0) && (here->SOI3dNode != 0)) + { + while (here->SOI3D_dPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3D_dPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3dNode != 0) && (here->SOI3dNodePrime != 0)) + { + while (here->SOI3D_dpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3D_dpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3dNodePrime != 0) && (here->SOI3dNode != 0)) + { + while (here->SOI3DP_dPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3DP_dPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNode != 0) && (here->SOI3sNode != 0)) + { + while (here->SOI3S_sPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3S_sPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNode != 0) && (here->SOI3sNodePrime != 0)) + { + while (here->SOI3S_spPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3S_spPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNodePrime != 0) && (here->SOI3sNode != 0)) + { + while (here->SOI3SP_sPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3SP_sPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gfNode != 0) && (here->SOI3gfNode != 0)) + { + while (here->SOI3GF_gfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GF_gfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gfNode != 0) && (here->SOI3gbNode != 0)) + { + while (here->SOI3GF_gbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GF_gbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gfNode != 0) && (here->SOI3dNodePrime != 0)) + { + while (here->SOI3GF_dpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GF_dpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gfNode != 0) && (here->SOI3sNodePrime != 0)) + { + while (here->SOI3GF_spPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GF_spPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gfNode != 0) && (here->SOI3bNode != 0)) + { + while (here->SOI3GF_bPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GF_bPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gbNode != 0) && (here->SOI3gfNode != 0)) + { + while (here->SOI3GB_gfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GB_gfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gbNode != 0) && (here->SOI3gbNode != 0)) + { + while (here->SOI3GB_gbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GB_gbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gbNode != 0) && (here->SOI3dNodePrime != 0)) + { + while (here->SOI3GB_dpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GB_dpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gbNode != 0) && (here->SOI3sNodePrime != 0)) + { + while (here->SOI3GB_spPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GB_spPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gbNode != 0) && (here->SOI3bNode != 0)) + { + while (here->SOI3GB_bPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GB_bPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3bNode != 0) && (here->SOI3gfNode != 0)) + { + while (here->SOI3B_gfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3B_gfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3bNode != 0) && (here->SOI3gbNode != 0)) + { + while (here->SOI3B_gbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3B_gbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3bNode != 0) && (here->SOI3dNodePrime != 0)) + { + while (here->SOI3B_dpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3B_dpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3bNode != 0) && (here->SOI3sNodePrime != 0)) + { + while (here->SOI3B_spPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3B_spPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3bNode != 0) && (here->SOI3bNode != 0)) + { + while (here->SOI3B_bPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3B_bPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3dNodePrime != 0) && (here->SOI3gfNode != 0)) + { + while (here->SOI3DP_gfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3DP_gfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3dNodePrime != 0) && (here->SOI3gbNode != 0)) + { + while (here->SOI3DP_gbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3DP_gbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3dNodePrime != 0) && (here->SOI3dNodePrime != 0)) + { + while (here->SOI3DP_dpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3DP_dpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3dNodePrime != 0) && (here->SOI3sNodePrime != 0)) + { + while (here->SOI3DP_spPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3DP_spPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3dNodePrime != 0) && (here->SOI3bNode != 0)) + { + while (here->SOI3DP_bPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3DP_bPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNodePrime != 0) && (here->SOI3gfNode != 0)) + { + while (here->SOI3SP_gfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3SP_gfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNodePrime != 0) && (here->SOI3gbNode != 0)) + { + while (here->SOI3SP_gbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3SP_gbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNodePrime != 0) && (here->SOI3dNodePrime != 0)) + { + while (here->SOI3SP_dpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3SP_dpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNodePrime != 0) && (here->SOI3sNodePrime != 0)) + { + while (here->SOI3SP_spPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3SP_spPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNodePrime != 0) && (here->SOI3bNode != 0)) + { + while (here->SOI3SP_bPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3SP_bPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3branch != 0)) + { + while (here->SOI3TOUT_ibrPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_ibrPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3branch != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3IBR_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3IBR_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3TOUT_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3tout1Node != 0)) + { + while (here->SOI3TOUT_tout1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_tout1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout1Node != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3TOUT1_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT1_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout1Node != 0) && (here->SOI3tout1Node != 0)) + { + while (here->SOI3TOUT1_tout1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT1_tout1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout1Node != 0) && (here->SOI3tout2Node != 0)) + { + while (here->SOI3TOUT1_tout2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT1_tout2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout2Node != 0) && (here->SOI3tout1Node != 0)) + { + while (here->SOI3TOUT2_tout1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT2_tout1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout2Node != 0) && (here->SOI3tout2Node != 0)) + { + while (here->SOI3TOUT2_tout2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT2_tout2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout2Node != 0) && (here->SOI3tout3Node != 0)) + { + while (here->SOI3TOUT2_tout3Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT2_tout3Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout3Node != 0) && (here->SOI3tout2Node != 0)) + { + while (here->SOI3TOUT3_tout2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT3_tout2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout3Node != 0) && (here->SOI3tout3Node != 0)) + { + while (here->SOI3TOUT3_tout3Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT3_tout3Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout3Node != 0) && (here->SOI3tout4Node != 0)) + { + while (here->SOI3TOUT3_tout4Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT3_tout4Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout4Node != 0) && (here->SOI3tout3Node != 0)) + { + while (here->SOI3TOUT4_tout3Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT4_tout3Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3tout4Node != 0) && (here->SOI3tout4Node != 0)) + { + while (here->SOI3TOUT4_tout4Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT4_tout4Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3TOUT_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3gfNode != 0)) + { + while (here->SOI3TOUT_gfPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_gfPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3gbNode != 0)) + { + while (here->SOI3TOUT_gbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_gbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3dNodePrime != 0)) + { + while (here->SOI3TOUT_dpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_dpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3sNodePrime != 0)) + { + while (here->SOI3TOUT_spPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_spPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3toutNode != 0) && (here->SOI3bNode != 0)) + { + while (here->SOI3TOUT_bPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3TOUT_bPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gfNode != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3GF_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GF_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3gbNode != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3GB_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3GB_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3dNodePrime != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3DP_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3DP_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3sNodePrime != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3SP_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3SP_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SOI3bNode != 0) && (here->SOI3toutNode != 0)) + { + while (here->SOI3B_toutPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SOI3B_toutPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/soi3/soi3ext.h b/src/spicelib/devices/soi3/soi3ext.h index 13a0363dd..8f1b4b8fe 100644 --- a/src/spicelib/devices/soi3/soi3ext.h +++ b/src/spicelib/devices/soi3/soi3ext.h @@ -67,6 +67,7 @@ extern int SOI3convTest(GENmodel*,CKTcircuit*); extern int SOI3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int SOI3bindCSC(GENmodel*, CKTcircuit*); -extern int SOI3bindCSCComplex(GENmodel*, CKTcircuit*); +extern int SOI3bindCSC (GENmodel*, CKTcircuit*) ; +extern int SOI3bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int SOI3bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/soi3/soi3init.c b/src/spicelib/devices/soi3/soi3init.c index 8f15397fd..c37b6bd48 100644 --- a/src/spicelib/devices/soi3/soi3init.c +++ b/src/spicelib/devices/soi3/soi3init.c @@ -76,6 +76,7 @@ SPICEdev SOI3info = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ SOI3bindCSC, /* DEVbindCSCComplex */ SOI3bindCSCComplex, + /* DEVbindCSCComplexToReal */ SOI3bindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/sw/swbindCSC.c b/src/spicelib/devices/sw/swbindCSC.c index 791c38ddb..67e22df90 100644 --- a/src/spicelib/devices/sw/swbindCSC.c +++ b/src/spicelib/devices/sw/swbindCSC.c @@ -84,3 +84,49 @@ SWbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +SWbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + SWmodel *model = (SWmodel *)inModel ; + SWinstance *here ; + int i ; + + /* loop through all the sw models */ + for ( ; model != NULL ; model = model->SWnextModel) + { + /* loop through all the instances of the model */ + for (here = model->SWinstances ; here != NULL ; here = here->SWnextInstance) + { + i = 0 ; + if ((here->SWposNode != 0) && (here->SWposNode != 0)) + { + while (here->SWposPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SWposPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SWposNode != 0) && (here->SWnegNode != 0)) + { + while (here->SWposNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SWposNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SWnegNode != 0) && (here->SWposNode != 0)) + { + while (here->SWnegPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SWnegPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->SWnegNode != 0) && (here->SWnegNode != 0)) + { + while (here->SWnegNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->SWnegNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/sw/swext.h b/src/spicelib/devices/sw/swext.h index 10c60d010..83053b05c 100644 --- a/src/spicelib/devices/sw/swext.h +++ b/src/spicelib/devices/sw/swext.h @@ -19,6 +19,7 @@ extern int SWnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int SWtrunc(GENmodel*,CKTcircuit*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int SWbindCSC(GENmodel*, CKTcircuit*); -extern int SWbindCSCComplex(GENmodel*, CKTcircuit*); +extern int SWbindCSC (GENmodel*, CKTcircuit*) ; +extern int SWbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int SWbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/sw/swinit.c b/src/spicelib/devices/sw/swinit.c index 23b6fd414..0e833444f 100644 --- a/src/spicelib/devices/sw/swinit.c +++ b/src/spicelib/devices/sw/swinit.c @@ -77,6 +77,7 @@ SPICEdev SWinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ SWbindCSC, /* DEVbindCSCComplex */ SWbindCSCComplex, + /* DEVbindCSCComplexToReal */ SWbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/tra/trabindCSC.c b/src/spicelib/devices/tra/trabindCSC.c index c1e4e6967..68773a0f7 100644 --- a/src/spicelib/devices/tra/trabindCSC.c +++ b/src/spicelib/devices/tra/trabindCSC.c @@ -264,3 +264,175 @@ TRAbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +TRAbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + TRAmodel *model = (TRAmodel *)inModel ; + TRAinstance *here ; + int i ; + + /* loop through all the tra models */ + for ( ; model != NULL ; model = model->TRAnextModel) + { + /* loop through all the instances of the model */ + for (here = model->TRAinstances ; here != NULL ; here = here->TRAnextInstance) + { + i = 0 ; + if ((here->TRAbrEq1 != 0) && (here->TRAbrEq2 != 0)) + { + while (here->TRAibr1Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr1Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq1 != 0) && (here->TRAintNode1 != 0)) + { + while (here->TRAibr1Int1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr1Int1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq1 != 0) && (here->TRAnegNode1 != 0)) + { + while (here->TRAibr1Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq1 != 0) && (here->TRAnegNode2 != 0)) + { + while (here->TRAibr1Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr1Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq1 != 0) && (here->TRAposNode2 != 0)) + { + while (here->TRAibr1Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr1Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq2 != 0) && (here->TRAbrEq1 != 0)) + { + while (here->TRAibr2Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr2Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq2 != 0) && (here->TRAintNode2 != 0)) + { + while (here->TRAibr2Int2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr2Int2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq2 != 0) && (here->TRAnegNode1 != 0)) + { + while (here->TRAibr2Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr2Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq2 != 0) && (here->TRAnegNode2 != 0)) + { + while (here->TRAibr2Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAbrEq2 != 0) && (here->TRAposNode1 != 0)) + { + while (here->TRAibr2Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAibr2Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAintNode1 != 0) && (here->TRAbrEq1 != 0)) + { + while (here->TRAint1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAint1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAintNode1 != 0) && (here->TRAintNode1 != 0)) + { + while (here->TRAint1Int1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAint1Int1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAintNode1 != 0) && (here->TRAposNode1 != 0)) + { + while (here->TRAint1Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAint1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAintNode2 != 0) && (here->TRAbrEq2 != 0)) + { + while (here->TRAint2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAint2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAintNode2 != 0) && (here->TRAintNode2 != 0)) + { + while (here->TRAint2Int2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAint2Int2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAintNode2 != 0) && (here->TRAposNode2 != 0)) + { + while (here->TRAint2Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAint2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAnegNode1 != 0) && (here->TRAbrEq1 != 0)) + { + while (here->TRAneg1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAneg1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAnegNode2 != 0) && (here->TRAbrEq2 != 0)) + { + while (here->TRAneg2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRAneg2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAposNode1 != 0) && (here->TRAintNode1 != 0)) + { + while (here->TRApos1Int1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRApos1Int1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAposNode1 != 0) && (here->TRAposNode1 != 0)) + { + while (here->TRApos1Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRApos1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAposNode2 != 0) && (here->TRAintNode2 != 0)) + { + while (here->TRApos2Int2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRApos2Int2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TRAposNode2 != 0) && (here->TRAposNode2 != 0)) + { + while (here->TRApos2Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TRApos2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/tra/traext.h b/src/spicelib/devices/tra/traext.h index 2f02f4772..57166fbc7 100644 --- a/src/spicelib/devices/tra/traext.h +++ b/src/spicelib/devices/tra/traext.h @@ -18,6 +18,7 @@ extern int TRAtemp(GENmodel*,CKTcircuit*); extern int TRAtrunc(GENmodel*,CKTcircuit*,double*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int TRAbindCSC(GENmodel*, CKTcircuit*); -extern int TRAbindCSCComplex(GENmodel*, CKTcircuit*); +extern int TRAbindCSC (GENmodel*, CKTcircuit*) ; +extern int TRAbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int TRAbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/tra/trainit.c b/src/spicelib/devices/tra/trainit.c index ddf6ffa82..bf866743f 100644 --- a/src/spicelib/devices/tra/trainit.c +++ b/src/spicelib/devices/tra/trainit.c @@ -76,6 +76,7 @@ SPICEdev TRAinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ TRAbindCSC, /* DEVbindCSCComplex */ TRAbindCSCComplex, + /* DEVbindCSCComplexToReal */ TRAbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/txl/txlbindCSC.c b/src/spicelib/devices/txl/txlbindCSC.c index 5b3cb8fd8..0a3ec0e81 100644 --- a/src/spicelib/devices/txl/txlbindCSC.c +++ b/src/spicelib/devices/txl/txlbindCSC.c @@ -184,3 +184,119 @@ TXLbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +TXLbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + TXLmodel *model = (TXLmodel *)inModel ; + TXLinstance *here ; + int i ; + + /* loop through all the txl models */ + for ( ; model != NULL ; model = model->TXLnextModel) + { + /* loop through all the instances of the model */ + for (here = model->TXLinstances ; here != NULL ; here = here->TXLnextInstance) + { + i = 0 ; + if ((here->TXLposNode != 0) && (here->TXLposNode != 0)) + { + while (here->TXLposPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLposPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLposNode != 0) && (here->TXLnegNode != 0)) + { + while (here->TXLposNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLposNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLnegNode != 0) && (here->TXLposNode != 0)) + { + while (here->TXLnegPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLnegPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLnegNode != 0) && (here->TXLnegNode != 0)) + { + while (here->TXLnegNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLnegNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLibr1 != 0) && (here->TXLposNode != 0)) + { + while (here->TXLibr1Posptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLibr1Posptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLibr2 != 0) && (here->TXLnegNode != 0)) + { + while (here->TXLibr2Negptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLibr2Negptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLnegNode != 0) && (here->TXLibr2 != 0)) + { + while (here->TXLnegIbr2ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLnegIbr2ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLposNode != 0) && (here->TXLibr1 != 0)) + { + while (here->TXLposIbr1ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLposIbr1ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLibr1 != 0) && (here->TXLibr1 != 0)) + { + while (here->TXLibr1Ibr1ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLibr1Ibr1ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLibr2 != 0) && (here->TXLibr2 != 0)) + { + while (here->TXLibr2Ibr2ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLibr2Ibr2ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLibr1 != 0) && (here->TXLnegNode != 0)) + { + while (here->TXLibr1Negptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLibr1Negptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLibr2 != 0) && (here->TXLposNode != 0)) + { + while (here->TXLibr2Posptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLibr2Posptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLibr1 != 0) && (here->TXLibr2 != 0)) + { + while (here->TXLibr1Ibr2ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLibr1Ibr2ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->TXLibr2 != 0) && (here->TXLibr1 != 0)) + { + while (here->TXLibr2Ibr1ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->TXLibr2Ibr1ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/txl/txlext.h b/src/spicelib/devices/txl/txlext.h index d1f80c67b..21c042311 100644 --- a/src/spicelib/devices/txl/txlext.h +++ b/src/spicelib/devices/txl/txlext.h @@ -1,4 +1,3 @@ - extern int TXLaccept(CKTcircuit*,GENmodel*); extern int TXLask(CKTcircuit*, GENinstance*, int, IFvalue*, IFvalue*); extern int TXLdelete(GENmodel*,IFuid,GENinstance**); @@ -14,6 +13,7 @@ extern int TXLsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int TXLunsetup(GENmodel*, CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int TXLbindCSC(GENmodel*, CKTcircuit*); -extern int TXLbindCSCComplex(GENmodel*, CKTcircuit*); +extern int TXLbindCSC (GENmodel*, CKTcircuit*) ; +extern int TXLbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int TXLbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/txl/txlinit.c b/src/spicelib/devices/txl/txlinit.c index da661e85f..aa8ac7508 100644 --- a/src/spicelib/devices/txl/txlinit.c +++ b/src/spicelib/devices/txl/txlinit.c @@ -81,6 +81,7 @@ SPICEdev TXLinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ TXLbindCSC, /* DEVbindCSCComplex */ TXLbindCSCComplex, + /* DEVbindCSCComplexToReal */ TXLbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/urc/urcinit.c b/src/spicelib/devices/urc/urcinit.c index b4a5c8851..7d8746c6f 100644 --- a/src/spicelib/devices/urc/urcinit.c +++ b/src/spicelib/devices/urc/urcinit.c @@ -76,6 +76,7 @@ SPICEdev URCinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ NULL, /* DEVbindCSCComplex */ NULL, + /* DEVbindCSCComplexToReal */ NULL, #endif }; diff --git a/src/spicelib/devices/vbic/vbicbindCSC.c b/src/spicelib/devices/vbic/vbicbindCSC.c index 1ac5a8391..5a24c9549 100644 --- a/src/spicelib/devices/vbic/vbicbindCSC.c +++ b/src/spicelib/devices/vbic/vbicbindCSC.c @@ -554,3 +554,378 @@ VBICbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +VBICbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + VBICmodel *model = (VBICmodel *)inModel ; + VBICinstance *here ; + int i ; + + /* loop through all the vbic models */ + for ( ; model != NULL ; model = model->VBICnextModel) + { + /* loop through all the instances of the model */ + for (here = model->VBICinstances ; here != NULL ; here = here->VBICnextInstance) + { + i = 0 ; + if ((here->VBICcollNode != 0) && (here->VBICcollNode != 0)) + { + while (here->VBICcollCollPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCollPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseNode != 0) && (here->VBICbaseNode != 0)) + { + while (here->VBICbaseBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICemitNode != 0) && (here->VBICemitNode != 0)) + { + while (here->VBICemitEmitPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICemitEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICsubsNode != 0) && (here->VBICsubsNode != 0)) + { + while (here->VBICsubsSubsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICsubsSubsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCXNode != 0) && (here->VBICcollCXNode != 0)) + { + while (here->VBICcollCXCollCXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCXCollCXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCINode != 0) && (here->VBICcollCINode != 0)) + { + while (here->VBICcollCICollCIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCICollCIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBXNode != 0) && (here->VBICbaseBXNode != 0)) + { + while (here->VBICbaseBXBaseBXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBXBaseBXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBINode != 0) && (here->VBICbaseBINode != 0)) + { + while (here->VBICbaseBIBaseBIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBIBaseBIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICemitEINode != 0) && (here->VBICemitEINode != 0)) + { + while (here->VBICemitEIEmitEIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICemitEIEmitEIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBPNode != 0) && (here->VBICbaseBPNode != 0)) + { + while (here->VBICbaseBPBaseBPPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBPBaseBPPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICsubsSINode != 0) && (here->VBICsubsSINode != 0)) + { + while (here->VBICsubsSISubsSIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICsubsSISubsSIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseNode != 0) && (here->VBICemitNode != 0)) + { + while (here->VBICbaseEmitPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICemitNode != 0) && (here->VBICbaseNode != 0)) + { + while (here->VBICemitBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICemitBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseNode != 0) && (here->VBICcollNode != 0)) + { + while (here->VBICbaseCollPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseCollPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollNode != 0) && (here->VBICbaseNode != 0)) + { + while (here->VBICcollBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollNode != 0) && (here->VBICcollCXNode != 0)) + { + while (here->VBICcollCollCXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCollCXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseNode != 0) && (here->VBICbaseBXNode != 0)) + { + while (here->VBICbaseBaseBXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBaseBXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICemitNode != 0) && (here->VBICemitEINode != 0)) + { + while (here->VBICemitEmitEIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICemitEmitEIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICsubsNode != 0) && (here->VBICsubsSINode != 0)) + { + while (here->VBICsubsSubsSIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICsubsSubsSIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCXNode != 0) && (here->VBICcollCINode != 0)) + { + while (here->VBICcollCXCollCIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCXCollCIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCXNode != 0) && (here->VBICbaseBXNode != 0)) + { + while (here->VBICcollCXBaseBXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCXBaseBXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCXNode != 0) && (here->VBICbaseBINode != 0)) + { + while (here->VBICcollCXBaseBIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCXBaseBIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCXNode != 0) && (here->VBICbaseBPNode != 0)) + { + while (here->VBICcollCXBaseBPPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCXBaseBPPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCINode != 0) && (here->VBICbaseBINode != 0)) + { + while (here->VBICcollCIBaseBIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCIBaseBIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCINode != 0) && (here->VBICemitEINode != 0)) + { + while (here->VBICcollCIEmitEIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCIEmitEIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBXNode != 0) && (here->VBICbaseBINode != 0)) + { + while (here->VBICbaseBXBaseBIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBXBaseBIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBXNode != 0) && (here->VBICemitEINode != 0)) + { + while (here->VBICbaseBXEmitEIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBXEmitEIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBXNode != 0) && (here->VBICbaseBPNode != 0)) + { + while (here->VBICbaseBXBaseBPPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBXBaseBPPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBXNode != 0) && (here->VBICsubsSINode != 0)) + { + while (here->VBICbaseBXSubsSIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBXSubsSIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBINode != 0) && (here->VBICemitEINode != 0)) + { + while (here->VBICbaseBIEmitEIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBIEmitEIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBPNode != 0) && (here->VBICsubsSINode != 0)) + { + while (here->VBICbaseBPSubsSIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBPSubsSIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCXNode != 0) && (here->VBICcollNode != 0)) + { + while (here->VBICcollCXCollPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCXCollPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBXNode != 0) && (here->VBICbaseNode != 0)) + { + while (here->VBICbaseBXBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBXBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICemitEINode != 0) && (here->VBICemitNode != 0)) + { + while (here->VBICemitEIEmitPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICemitEIEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICsubsSINode != 0) && (here->VBICsubsNode != 0)) + { + while (here->VBICsubsSISubsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICsubsSISubsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICcollCINode != 0) && (here->VBICcollCXNode != 0)) + { + while (here->VBICcollCICollCXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICcollCICollCXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBINode != 0) && (here->VBICcollCXNode != 0)) + { + while (here->VBICbaseBICollCXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBICollCXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBPNode != 0) && (here->VBICcollCXNode != 0)) + { + while (here->VBICbaseBPCollCXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBPCollCXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBXNode != 0) && (here->VBICcollCINode != 0)) + { + while (here->VBICbaseBXCollCIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBXCollCIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBINode != 0) && (here->VBICcollCINode != 0)) + { + while (here->VBICbaseBICollCIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBICollCIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICemitEINode != 0) && (here->VBICcollCINode != 0)) + { + while (here->VBICemitEICollCIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICemitEICollCIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBPNode != 0) && (here->VBICcollCINode != 0)) + { + while (here->VBICbaseBPCollCIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBPCollCIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBINode != 0) && (here->VBICbaseBXNode != 0)) + { + while (here->VBICbaseBIBaseBXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBIBaseBXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICemitEINode != 0) && (here->VBICbaseBXNode != 0)) + { + while (here->VBICemitEIBaseBXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICemitEIBaseBXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBPNode != 0) && (here->VBICbaseBXNode != 0)) + { + while (here->VBICbaseBPBaseBXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBPBaseBXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICsubsSINode != 0) && (here->VBICbaseBXNode != 0)) + { + while (here->VBICsubsSIBaseBXPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICsubsSIBaseBXPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICemitEINode != 0) && (here->VBICbaseBINode != 0)) + { + while (here->VBICemitEIBaseBIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICemitEIBaseBIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICbaseBPNode != 0) && (here->VBICbaseBINode != 0)) + { + while (here->VBICbaseBPBaseBIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICbaseBPBaseBIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICsubsSINode != 0) && (here->VBICcollCINode != 0)) + { + while (here->VBICsubsSICollCIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICsubsSICollCIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICsubsSINode != 0) && (here->VBICbaseBINode != 0)) + { + while (here->VBICsubsSIBaseBIPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICsubsSIBaseBIPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VBICsubsSINode != 0) && (here->VBICbaseBPNode != 0)) + { + while (here->VBICsubsSIBaseBPPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VBICsubsSIBaseBPPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/vbic/vbicext.h b/src/spicelib/devices/vbic/vbicext.h index 91ad38ed5..c5f25d9c3 100644 --- a/src/spicelib/devices/vbic/vbicext.h +++ b/src/spicelib/devices/vbic/vbicext.h @@ -29,6 +29,7 @@ extern int VBICnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); #endif #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int VBICbindCSC(GENmodel*, CKTcircuit*); -extern int VBICbindCSCComplex(GENmodel*, CKTcircuit*); +extern int VBICbindCSC (GENmodel*, CKTcircuit*) ; +extern int VBICbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int VBICbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/vbic/vbicinit.c b/src/spicelib/devices/vbic/vbicinit.c index 4e0f840bb..e60138b87 100644 --- a/src/spicelib/devices/vbic/vbicinit.c +++ b/src/spicelib/devices/vbic/vbicinit.c @@ -81,6 +81,7 @@ SPICEdev VBICinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ VBICbindCSC, /* DEVbindCSCComplex */ VBICbindCSCComplex, + /* DEVbindCSCComplexToReal */ VBICbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/vccs/vccsbindCSC.c b/src/spicelib/devices/vccs/vccsbindCSC.c index adbb5f9f6..c3b45dc65 100644 --- a/src/spicelib/devices/vccs/vccsbindCSC.c +++ b/src/spicelib/devices/vccs/vccsbindCSC.c @@ -84,3 +84,49 @@ VCCSbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +VCCSbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + VCCSmodel *model = (VCCSmodel *)inModel ; + VCCSinstance *here ; + int i ; + + /* loop through all the VoltageControlledCurrentSource models */ + for ( ; model != NULL ; model = model->VCCSnextModel) + { + /* loop through all the instances of the model */ + for (here = model->VCCSinstances ; here != NULL ; here = here->VCCSnextInstance) + { + i = 0 ; + if ((here->VCCSposNode != 0) && (here->VCCScontPosNode != 0)) + { + while (here->VCCSposContPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCCSposContPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VCCSposNode != 0) && (here->VCCScontNegNode != 0)) + { + while (here->VCCSposContNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCCSposContNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VCCSnegNode != 0) && (here->VCCScontPosNode != 0)) + { + while (here->VCCSnegContPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCCSnegContPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VCCSnegNode != 0) && (here->VCCScontNegNode != 0)) + { + while (here->VCCSnegContNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCCSnegContNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/vccs/vccsext.h b/src/spicelib/devices/vccs/vccsext.h index de002b97c..33e57df9e 100644 --- a/src/spicelib/devices/vccs/vccsext.h +++ b/src/spicelib/devices/vccs/vccsext.h @@ -17,6 +17,7 @@ extern void VCCSsPrint(GENmodel*,CKTcircuit*); extern int VCCSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int VCCSbindCSC(GENmodel*, CKTcircuit*); -extern int VCCSbindCSCComplex(GENmodel*, CKTcircuit*); +extern int VCCSbindCSC (GENmodel*, CKTcircuit*) ; +extern int VCCSbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int VCCSbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/vccs/vccsinit.c b/src/spicelib/devices/vccs/vccsinit.c index d4fd62074..6b7aa0083 100644 --- a/src/spicelib/devices/vccs/vccsinit.c +++ b/src/spicelib/devices/vccs/vccsinit.c @@ -76,6 +76,7 @@ SPICEdev VCCSinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ VCCSbindCSC, /* DEVbindCSCComplex */ VCCSbindCSCComplex, + /* DEVbindCSCComplexToReal */ VCCSbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/vcvs/vcvsbindCSC.c b/src/spicelib/devices/vcvs/vcvsbindCSC.c index 3ed75dc63..941da6f1d 100644 --- a/src/spicelib/devices/vcvs/vcvsbindCSC.c +++ b/src/spicelib/devices/vcvs/vcvsbindCSC.c @@ -104,3 +104,63 @@ VCVSbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +VCVSbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + VCVSmodel *model = (VCVSmodel *)inModel ; + VCVSinstance *here ; + int i ; + + /* loop through all the VoltageControlledVoltageSource models */ + for ( ; model != NULL ; model = model->VCVSnextModel) + { + /* loop through all the instances of the model */ + for (here = model->VCVSinstances ; here != NULL ; here = here->VCVSnextInstance) + { + i = 0 ; + if ((here->VCVSposNode != 0) && (here->VCVSbranch != 0)) + { + while (here->VCVSposIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCVSposIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VCVSnegNode != 0) && (here->VCVSbranch != 0)) + { + while (here->VCVSnegIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCVSnegIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VCVSbranch != 0) && (here->VCVSnegNode != 0)) + { + while (here->VCVSibrNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCVSibrNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VCVSbranch != 0) && (here->VCVSposNode != 0)) + { + while (here->VCVSibrPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCVSibrPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VCVSbranch != 0) && (here->VCVScontPosNode != 0)) + { + while (here->VCVSibrContPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCVSibrContPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VCVSbranch != 0) && (here->VCVScontNegNode != 0)) + { + while (here->VCVSibrContNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VCVSibrContNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} \ No newline at end of file diff --git a/src/spicelib/devices/vcvs/vcvsext.h b/src/spicelib/devices/vcvs/vcvsext.h index 33a9cf353..1fc321ad1 100644 --- a/src/spicelib/devices/vcvs/vcvsext.h +++ b/src/spicelib/devices/vcvs/vcvsext.h @@ -19,6 +19,7 @@ extern int VCVSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int VCVSunsetup(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int VCVSbindCSC(GENmodel*, CKTcircuit*); -extern int VCVSbindCSCComplex(GENmodel*, CKTcircuit*); +extern int VCVSbindCSC (GENmodel*, CKTcircuit*) ; +extern int VCVSbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int VCVSbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/vcvs/vcvsinit.c b/src/spicelib/devices/vcvs/vcvsinit.c index 1fc9a2401..4508f4800 100644 --- a/src/spicelib/devices/vcvs/vcvsinit.c +++ b/src/spicelib/devices/vcvs/vcvsinit.c @@ -76,6 +76,7 @@ SPICEdev VCVSinfo = { #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) /* DEVbindCSC */ VCVSbindCSC, /* DEVbindCSCComplex */ VCVSbindCSCComplex, + /* DEVbindCSCComplexToReal */ VCVSbindCSCComplexToReal, #endif }; diff --git a/src/spicelib/devices/vsrc/vsrcbindCSC.c b/src/spicelib/devices/vsrc/vsrcbindCSC.c index 58aa66725..c280329ef 100644 --- a/src/spicelib/devices/vsrc/vsrcbindCSC.c +++ b/src/spicelib/devices/vsrc/vsrcbindCSC.c @@ -90,3 +90,49 @@ VSRCbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) } return(OK); } + +int +VSRCbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + VSRCmodel *model = (VSRCmodel *)inModel ; + VSRCinstance *here ; + int i ; + + /* loop through all the source models */ + for ( ; model != NULL ; model = model->VSRCnextModel) + { + /* loop through all the instances of the model */ + for (here = model->VSRCinstances ; here != NULL ; here = here->VSRCnextInstance) + { + i = 0 ; + if ((here->VSRCposNode != 0) && (here->VSRCbranch != 0)) + { + while (here->VSRCposIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VSRCposIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VSRCnegNode != 0) && (here->VSRCbranch != 0)) + { + while (here->VSRCnegIbrptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VSRCnegIbrptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VSRCbranch != 0) && (here->VSRCnegNode != 0)) + { + while (here->VSRCibrNegptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VSRCibrNegptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + + i = 0 ; + if ((here->VSRCbranch != 0) && (here->VSRCposNode != 0)) + { + while (here->VSRCibrPosptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; + here->VSRCibrPosptr = ckt->CKTmatrix->CKTbind_CSC [i] ; + } + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/vsrc/vsrcext.h b/src/spicelib/devices/vsrc/vsrcext.h index 8ba57766e..ad65f8fa2 100644 --- a/src/spicelib/devices/vsrc/vsrcext.h +++ b/src/spicelib/devices/vsrc/vsrcext.h @@ -20,6 +20,7 @@ extern int VSRCpzSetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int VSRCtemp(GENmodel*,CKTcircuit*); #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) -extern int VSRCbindCSC(GENmodel*, CKTcircuit*); -extern int VSRCbindCSCComplex(GENmodel*, CKTcircuit*); +extern int VSRCbindCSC (GENmodel*, CKTcircuit*) ; +extern int VSRCbindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int VSRCbindCSCComplexToReal (GENmodel*, CKTcircuit*) ; #endif diff --git a/src/spicelib/devices/vsrc/vsrcinit.c b/src/spicelib/devices/vsrc/vsrcinit.c index 8cdebcbcf..2fbb812e2 100644 --- a/src/spicelib/devices/vsrc/vsrcinit.c +++ b/src/spicelib/devices/vsrc/vsrcinit.c @@ -74,8 +74,9 @@ SPICEdev VSRCinfo = { /* DEVinstSize */ &VSRCiSize, /* DEVmodSize */ &VSRCmSize, #if defined(KLU) || defined(SuperLU) || defined(UMFPACK) - /* DEVbindklu */ VSRCbindCSC, - /* DEVbindkluComplex */ VSRCbindCSCComplex, + /* DEVbindCSC */ VSRCbindCSC, + /* DEVbindCSCComplex */ VSRCbindCSCComplex, + /* DEVbindCSCComplexToReal */ VSRCbindCSCComplexToReal, #endif };