21 changed files with 856 additions and 912 deletions
-
23ChangeLog
-
974DEVICES
-
2src/spicelib/analysis/acan.c
-
2src/spicelib/analysis/cktdest.c
-
4src/spicelib/analysis/cktdisto.c
-
4src/spicelib/analysis/cktdump.c
-
2src/spicelib/analysis/cktfbran.c
-
2src/spicelib/analysis/cktic.c
-
2src/spicelib/analysis/cktload.c
-
2src/spicelib/analysis/cktnoise.c
-
2src/spicelib/analysis/cktop.c
-
2src/spicelib/analysis/cktpzld.c
-
2src/spicelib/analysis/cktpzset.c
-
4src/spicelib/analysis/cktsetup.c
-
2src/spicelib/analysis/ckttemp.c
-
2src/spicelib/analysis/ckttrunc.c
-
2src/spicelib/analysis/ckttyplk.c
-
2src/spicelib/devices/cktaccept.c
-
144src/spicelib/devices/dev.c
-
581src/spicelib/devices/dev_old.c
-
2src/spicelib/parser/inptyplk.c
@ -1,776 +1,198 @@ |
|||
DEVICES |
|||
--------------------------------------------------------------------------- |
|||
|
|||
This file contains the status of devices available in ngspice. This file |
|||
will be updated every time the device specific code is altered or changed. |
|||
This file is useful in writing ngspice documentation. |
|||
|
|||
|
|||
*************************************************************************** |
|||
************************* Linear devices ******************************** |
|||
*************************************************************************** |
|||
|
|||
CAP - Capacitor |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: C |
|||
Level: 1 (and only) |
|||
Dir: devices/cap |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel Multiplier |
|||
- Temperature difference from circuit temperature |
|||
- Preliminary technology scaling support |
|||
- Model capacitance |
|||
- Cj calculation based on relative dielectric constant |
|||
and insulator thickness |
|||
|
|||
IND - Inductor |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: L |
|||
Level: 1 (and only) |
|||
Dir: devices/ind |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel Multiplier |
|||
- Temperature difference from circuit temperature |
|||
- Preliminary technology scaling support |
|||
- Model inductance |
|||
- Inductance calculation for toroids or solenoids |
|||
on the model line. |
|||
|
|||
RES - Simple linear resistor |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: R |
|||
Level: 1 (and only) |
|||
Dir: devices/res |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel Multiplier |
|||
- Different value for ac analysis |
|||
- Temperature difference from circuit temperature |
|||
- Noiseless resistor |
|||
- Flicker noise |
|||
- Preliminary technology scaling support |
|||
|
|||
|
|||
*************************************************************************** |
|||
********************* Distributed elements ******************************** |
|||
*************************************************************************** |
|||
|
|||
CPL - Simple Coupled Multiconductor Lines (Kspice) |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: P |
|||
Level: 1 (and only) |
|||
Dir: devices/cpl |
|||
Status: |
|||
|
|||
This model comes from swec and kspice. It is not documented, if |
|||
you have kspice docs, can you write a short description |
|||
of its use ? |
|||
|
|||
- Does not implement parallel code switches |
|||
- Probably a lot of memory leaks |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Better integrated into ngspice adding CPLask, CPLmAsk and |
|||
CPLunsetup functions |
|||
|
|||
|
|||
LTRA - Lossy Transmission line |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: O |
|||
Level: 1 (and only) |
|||
Dir: devices/ltra |
|||
Status: |
|||
|
|||
Original spice model. |
|||
|
|||
- Does not implement parallel code switches |
|||
|
|||
TRA - Transmission line |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: T |
|||
Level: 1 (and only) |
|||
Dir: devices/tra |
|||
Status: |
|||
|
|||
Original spice model. |
|||
|
|||
- Does not implement parallel code switches |
|||
|
|||
TXL - Simple Lossy Transmission Line (Kspice) |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: Y |
|||
Level: 1 (and only) |
|||
Dir: devices/txl |
|||
Status: |
|||
|
|||
This model comes from kspice. It is not documented, if |
|||
you have kspice docs, can you write a short description |
|||
of its use ? |
|||
|
|||
There is some code left out from compilation: |
|||
TXLaccept and TXLfindBr. Any ideas ? |
|||
|
|||
- Does not implement parallel code switches |
|||
|
|||
|
|||
URC - Uniform distributed RC line |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: U |
|||
Level: 1 (and only) |
|||
Dir: devices/urc |
|||
Status: |
|||
|
|||
Original spice model. |
|||
|
|||
- Does not implement parallel code switches |
|||
|
|||
|
|||
*************************************************************************** |
|||
**************************** V/I Sources ***************************** |
|||
*************************************************************************** |
|||
|
|||
ASRC - Arbitrary Source |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: B |
|||
Level: 1 (and only) |
|||
Dir: devices/asrc |
|||
Status: |
|||
|
|||
The arbitrary source code has been corrected with the patch |
|||
available on the Internet. There is still an issue to fix, the |
|||
current of current-controlled generators. |
|||
|
|||
CCCS - Current Controlled Current Source |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: F |
|||
Level: 1 (and only) |
|||
Dir: devices/cccs |
|||
Status: |
|||
|
|||
Original spice model. |
|||
|
|||
CCVS - Current Controlled Voltage Source |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: H |
|||
Level: 1 (and only) |
|||
Dir: devices/ccvs |
|||
Status: |
|||
|
|||
Original spice model. |
|||
|
|||
ISRC - Independent Current Source |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: I |
|||
Level: 1 (and only) |
|||
Dir: devices/isrc |
|||
Status: |
|||
|
|||
This is the original spice device improved by Alan Gillespie |
|||
with the following features: |
|||
|
|||
- Source ramping |
|||
- Check for non-monotonic series in PWL |
|||
|
|||
|
|||
VCCS - Voltage Controlled Current Source |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: G |
|||
Level: 1 (and only) |
|||
Dir: devices/vccs |
|||
Status: |
|||
|
|||
Original spice model. |
|||
|
|||
VCVS - Voltage Controlled Voltage Source |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: E |
|||
Level: 1 (and only) |
|||
Dir: devices/vcvs |
|||
Status: |
|||
|
|||
Original spice model. |
|||
|
|||
VSRC - Independent Voltage Source |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: V |
|||
Level: 1 (and only) |
|||
Dir: devices/vsrc |
|||
Status: |
|||
|
|||
This is the original spice device improved by Alan Gillespie |
|||
with the following features: |
|||
|
|||
- Source ramping |
|||
- Check for non-monotonic series in PWL |
|||
|
|||
|
|||
*************************************************************************** |
|||
**************************** Switches **************************** |
|||
*************************************************************************** |
|||
|
|||
CSW - Current controlled switch |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: W |
|||
Level: 1 (and only) |
|||
Dir: devices/csw |
|||
Status: |
|||
|
|||
This model comes from Jon Engelbert |
|||
|
|||
|
|||
SW - Voltage controlled switch |
|||
Initial release |
|||
Ver: N/A |
|||
Class: S |
|||
Level: 1 (and only) |
|||
Dir: devices/sw |
|||
Status: |
|||
|
|||
This model comes from Jon Engelbert |
|||
|
|||
|
|||
*************************************************************************** |
|||
**************************** Diodes **************************** |
|||
*************************************************************************** |
|||
|
|||
DIO - Junction Diode |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: D |
|||
Level: 1 (and only) |
|||
Dir: devices/dio |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel Multiplier |
|||
- Temperature difference from circuit temperature |
|||
- Forward and reverse knee currents |
|||
- Periphery (sidewall) effects |
|||
- Temperature correction of some parameters |
|||
|
|||
|
|||
*************************************************************************** |
|||
************************* Bipolar Devices ************************* |
|||
*************************************************************************** |
|||
|
|||
BJT - Bipolar Junction Transistor |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: Q |
|||
Level: 1 |
|||
Dir: devices/bjt |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel Multiplier |
|||
- Temperature difference from circuit temperature |
|||
- Different area parameters for collector, base and emitter |
|||
|
|||
BJT2 - Bipolar Junction Transistor |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: Q |
|||
Level: 2 |
|||
Dir: devices/bjt2 |
|||
Status: |
|||
|
|||
This is the BJT model written by Alan Gillespie to support lateral |
|||
devices. The model has been hacked by Dietmar Warning fixing some bugs |
|||
and adding some features (temp. correction on resistors). |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Temperature correction on rc,rb,re |
|||
- Parallel Multiplier |
|||
- Temperature difference from circuit temperature |
|||
- Different area parameters for collector, base and emitter |
|||
|
|||
VBIC - Bipolar Junction Transistor |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: Q |
|||
Level: 4 |
|||
Dir: devices/vbic |
|||
Status: |
|||
|
|||
This is the Vertical Bipolar InterCompany model. |
|||
The author of VBIC is Colin McAndrew mcandrew@ieee.org |
|||
Spice3 Implementation: Dietmar Warning DAnalyse GmbH |
|||
warning@danalyse.de |
|||
Web Site: |
|||
http://www.designers-guide.com/VBIC/index.html |
|||
|
|||
Notes: This is the 4 terminals model, without excess phase |
|||
and thermal network. |
|||
|
|||
|
|||
*************************************************************************** |
|||
***************************** FET Devices *************************** |
|||
*************************************************************************** |
|||
|
|||
JFET - Junction Field Effect transistor |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: J |
|||
Level: 1 |
|||
Dir: devices/jfet |
|||
Status: |
|||
|
|||
This is the original spice JFET model. |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Alan Gillespie's modified diode model |
|||
- Parallel multiplier |
|||
- Instance temperature as difference for circuit temperature |
|||
|
|||
JFET2 - Junction Field Effect Transistor (PS model) |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: J |
|||
Level: 2 |
|||
Dir: devices/jfet2 |
|||
Status: |
|||
|
|||
This is the Parker Skellern model for MESFETs. |
|||
|
|||
Web Site: |
|||
http://www.elec.mq.edu.au/cnerf/models/psmodel/ |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Instance temperature as difference for circuit temperature |
|||
|
|||
|
|||
*************************************************************************** |
|||
*************************** HFET devices *************************** |
|||
*************************************************************************** |
|||
|
|||
Added code from macspice3f4 HFET1&2 and MESA model |
|||
Original note: |
|||
Added device calls for Mesfet models and HFET models |
|||
provided by Trond Ytterdal as of Nov 98 |
|||
|
|||
HFET1 - Heterostructure Field Effect Transistor Level 1 |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: Z |
|||
Level: 5 |
|||
Dir: devices/hfet1 |
|||
Status: |
|||
|
|||
This is the Heterostructure Field Effect Transistor model from: |
|||
K. Lee, M. Shur, T. A. Fjeldly and T. Ytterdal |
|||
"Semiconductor Device Modeling in VLSI", |
|||
1993, Prentice Hall, New Jersey |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Instance temperature as difference for circuit temperature |
|||
- Added pole-zero analysis |
|||
|
|||
|
|||
HFET2 - Heterostructure Field Effect Transistor Level 2 |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: Z |
|||
Level: 6 |
|||
Dir: devices/hfet2 |
|||
Status: |
|||
|
|||
Simplified version of hfet1 |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Instance temperature as difference for circuit temperature |
|||
- Added pole-zero analysis |
|||
|
|||
|
|||
*************************************************************************** |
|||
*************************** MES devices *************************** |
|||
*************************************************************************** |
|||
|
|||
MES - MESFET model |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: Z |
|||
Level: 1 |
|||
Dir: devices/mes |
|||
Status: |
|||
|
|||
This is the original spice3 MESFET model (Statz). |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Alan Gillespie junction diodes implementation |
|||
|
|||
|
|||
Added code from macspice3f4 HFET1&2 and MESA model |
|||
Original note: |
|||
Added device calls for Mesfet models and HFET models |
|||
provided by Trond Ytterdal as of Nov 98 |
|||
|
|||
MESA - MESFET model (MacSpice3f4) |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: Z |
|||
Level: 2,3,4 |
|||
Dir: devices/mesa |
|||
Status: |
|||
|
|||
This is a multilevel model. It contains code for mesa levels |
|||
2,3 and 4 |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Instance temperature as difference from circuit temperature |
|||
- Added pole-zero analysis |
|||
|
|||
|
|||
*************************************************************************** |
|||
**************************** MOS devices **************************** |
|||
*************************************************************************** |
|||
|
|||
MOS1 - Level 1 MOS model |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: M |
|||
Level: 1 |
|||
Dir: devices/mos1 |
|||
Status: |
|||
|
|||
This is the so-called Schichman-Hodges model. |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Temperature difference from circuit temperature |
|||
|
|||
|
|||
MOS2 - Level 2 MOS model |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: M |
|||
Level: 2 |
|||
Dir: devices/mos2 |
|||
Status: |
|||
|
|||
This is the so-called Grove-Frohman model. |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Temperature difference from circuit temperature |
|||
|
|||
|
|||
MOS3 - Level 3 MOS model |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: M |
|||
Level: 3 |
|||
Dir: devices/mos3 |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Temperature difference from circuit temperature |
|||
|
|||
|
|||
MOS6 - Level 6 MOS model |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: M |
|||
Level: 6 |
|||
Dir: devices/mos6 |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Temperature difference from circuit temperature |
|||
|
|||
|
|||
MOS9 - Level 9 MOS model |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: M |
|||
Level: 9 |
|||
Dir: devices/mos9 |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Temperature difference from circuit temperature |
|||
|
|||
|
|||
BSIM1 - BSIM model level 1 |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: M |
|||
Level: 4 |
|||
Dir: devices/bsim1 |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Noise analysis |
|||
|
|||
BUGS: |
|||
Distortion analysis probably does not |
|||
work with "parallel" devices. Equations |
|||
are too intricate to deal with. Any one |
|||
has ideas on the subject ? |
|||
|
|||
|
|||
BSIM2 - BSIM model level 2 |
|||
Initial Release. |
|||
Ver: N/A |
|||
Class: M |
|||
Level: 5 |
|||
Dir: devices/bsim2 |
|||
Status: |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel multiplier |
|||
- Noise analysis |
|||
|
|||
|
|||
BSIM3v0 - BSIM model level 3 |
|||
Initial Release. |
|||
Ver: 3.0 |
|||
Class: M |
|||
Level: 52 |
|||
Dir: devices/bsim3v0 |
|||
Status: TO BE TESTED AND IMPROVED |
|||
|
|||
|
|||
BSIM3v0 - BSIM model level 3 |
|||
Initial Release. |
|||
Ver: 3.0 |
|||
Class: M |
|||
Level: 51 |
|||
Dir: devices/bsim3v1a |
|||
Status: TO BE TESTED AND IMPROVED |
|||
|
|||
This is the BSIM3v3.0 model modified by Alan Gillespie. |
|||
|
|||
|
|||
BSIM3v1 - BSIM model level 3 |
|||
Initial Release. |
|||
Ver: 3.1 |
|||
Class: M |
|||
Level: 50 |
|||
Dir: devices/bsim3v1 |
|||
Status: TO BE TESTED |
|||
|
|||
|
|||
BSIM3v1 - BSIM model level 3 |
|||
Initial Release. |
|||
Ver: 3.1 |
|||
Class: M |
|||
Level: 49 |
|||
Dir: devices/bsim3v1s |
|||
Status: TO BE TESTED AND IMPROVED |
|||
|
|||
This is the BSIM3v3.1 model modified by Serban Popescu. |
|||
This is level 49 model. It is an implementation that supports |
|||
"HDIF" and "M" parameters. |
|||
|
|||
|
|||
BSIM3 - BSIM model level 3 |
|||
Initial Release. |
|||
Ver: 3.2.4 |
|||
Class: M |
|||
Level: 8 |
|||
Dir: devices/bsim3 |
|||
Status: TO BE TESTED |
|||
|
|||
This is the BSIM3v3.2.4 model from Berkeley device group. |
|||
You can find some test netlists with results for this model |
|||
on its web site. |
|||
|
|||
Web site: |
|||
http://www-device.eecs.berkeley.edu/~bsim3 |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel Multiplier |
|||
- ACM Area Calculation Method |
|||
- Multirevision code (supports all 3v3.2 minor revisions) |
|||
- NodesetFix |
|||
|
|||
|
|||
BSIM4 - BSIM model level 4 (0.18 um) |
|||
Initial Release. |
|||
Ver: 4.5.0 |
|||
Class: M |
|||
Level: 14 |
|||
Dir: devices/bsim4 |
|||
Status: TO BE TESTED |
|||
|
|||
This is the BSIM4 device model from Berkeley Device Group. |
|||
Test are available on its web site. |
|||
|
|||
Web site: |
|||
http://www-device.eecs.berkeley.edu/~bsim3/bsim4.html |
|||
|
|||
Updated to 4.5.0 YET UNTESTED. |
|||
|
|||
|
|||
HiSIM - Hiroshima-university STARC IGFET Model |
|||
Initial Release. |
|||
Ver: 1.2.0 |
|||
Class: M |
|||
Level: 64 |
|||
Dir: devices/hisim |
|||
Status: |
|||
|
|||
This is the HiSIM model available from Hiroshima University |
|||
(Ultra-Small Device Engineering Laboratory) |
|||
|
|||
Web site: |
|||
http://home.hiroshima-u.ac.jp/usdl/HiSIM.shtml |
|||
http://www.starc.or.jp/kaihatu/pdgr/hisim/index.html |
|||
|
|||
Enhancements over the original model: |
|||
|
|||
- Parallel Multiplier |
|||
- NodesetFix |
|||
|
|||
|
|||
*************************************************************************** |
|||
***************************** SOI Devices **************************** |
|||
*************************************************************************** |
|||
|
|||
BSIM3SOI_FD - SOI model (fully depleted devices) |
|||
Initial Release. |
|||
Ver: 2.1 |
|||
Class: M |
|||
Level: 55 |
|||
Dir: devices/bsim3soi_fd |
|||
Status: TO BE TESTED. |
|||
|
|||
FD model has been integrated. |
|||
There is a bsim3soifd directory under the test |
|||
hierarchy. Test circuits come from the bsim3soi |
|||
|
|||
Web site at: |
|||
http://www-device.eecs.berkeley.edu/~bsimsoi |
|||
|
|||
*) rework-14: removed #ifndef NEWCONV code. |
|||
|
|||
|
|||
BSIM3SOI_DD - SOI Model (dynamic depletion model) |
|||
Initial Release. |
|||
Ver: 2.1 |
|||
Class: M |
|||
Level: 56 |
|||
Dir: devices/bsim3soi_dd |
|||
Status: TO BE TESTED. |
|||
|
|||
There is a bsim3soidd directory under the |
|||
test hierarchy. Test circuits come from bsim3soi |
|||
|
|||
Web site at: |
|||
http://www-device.eecs.berkeley.edu/~bsimsoi |
|||
|
|||
*) rework-14: removed #ifndef NEWCONV code. |
|||
|
|||
|
|||
BSIM3SOI_PD - SOI model (partially depleted devices) |
|||
Initial Release. |
|||
Ver: 2.2.1 |
|||
Class: M |
|||
Level: 57 |
|||
Dir: devices/bsim3soi_pd |
|||
Status: TO BE TESTED. |
|||
|
|||
PD model has been integrated. |
|||
There is a bsim3soipd directory under the test |
|||
hierarchy. Test circuits come from the bsim3soi |
|||
|
|||
Web site at: |
|||
http://www-device.eecs.berkeley.edu/~bsimsoi |
|||
|
|||
*) rework-14: removed #ifndef NEWCONV code. |
|||
|
|||
|
|||
BSIMSOI - SOI model (partially/full depleted devices) |
|||
Initial Release. |
|||
Ver: 3.0 |
|||
Class: M |
|||
Level: 58 |
|||
Dir: devices/bsim3soi |
|||
Status: TO BE TESTED. |
|||
|
|||
This is the newer version from Berkeley. |
|||
Usable for partially/full depleted devices. |
|||
|
|||
Web site at: |
|||
http://www-device.eecs.berkeley.edu/~bsimsoi |
|||
|
|||
|
|||
SOI3 - STAG SOI3 Model |
|||
Initial Release. |
|||
Ver: 2.6 |
|||
Class: M |
|||
Level: 62 |
|||
Dir: devices/soi3 |
|||
Status: TO BE TESTED |
|||
|
|||
Web site at: |
|||
http://www.micro.ecs.soton.ac.uk/stag/ |
|||
|
|||
|
|||
*************************************************************************** |
|||
**************** Other devices not released as source code **************** |
|||
*************************************************************************** |
|||
|
|||
EKV - EKV model |
|||
Initial Release. |
|||
Ver: 2.6 |
|||
Class: M |
|||
Level: 44 |
|||
Dir: devices/ekv |
|||
Status: TO BE TESTED |
|||
|
|||
Note: This model is not released in source code. |
|||
You have to obtain the source code from the address below. |
|||
|
|||
Web site at: |
|||
http://legwww.epfl.ch/ekv/ |
|||
src/frontend/device.c: ft_sim->devices[dg->dev_type_no]->name, |
|||
src/frontend/device.c: ft_sim->devices[dg->dev_type_no]->description); |
|||
src/frontend/device.c: if (ft_sim->devices[dg->dev_type_no]->numModelParms) { |
|||
src/frontend/device.c: } else if (ft_sim->devices[dg->dev_type_no]->numModelParms) { |
|||
src/frontend/device.c: ft_sim->devices[dg->dev_type_no]->name, |
|||
src/frontend/device.c: ft_sim->devices[dg->dev_type_no]->description); |
|||
src/frontend/device.c: xcount = *ft_sim->devices[dg->dev_type_no]->numInstanceParms; |
|||
src/frontend/device.c: plist = ft_sim->devices[dg->dev_type_no]->instanceParms; |
|||
src/frontend/device.c: xcount = *ft_sim->devices[dg->dev_type_no]->numModelParms; |
|||
src/frontend/device.c: plist = ft_sim->devices[dg->dev_type_no]->modelParms; |
|||
src/frontend/device.c: xcount = *ft_sim->devices[dg->dev_type_no]->numInstanceParms; |
|||
src/frontend/device.c: plist = ft_sim->devices[dg->dev_type_no]->instanceParms; |
|||
src/frontend/device.c: xcount = *ft_sim->devices[dg->dev_type_no]->numModelParms; |
|||
src/frontend/device.c: plist = ft_sim->devices[dg->dev_type_no]->modelParms; |
|||
src/frontend/device.c: (*ft_sim->askInstanceQuest)(ft_curckt->ci_ckt, dg->instance, |
|||
src/frontend/device.c: (*ft_sim->askModelQuest)(ft_curckt->ci_ckt, dg->model, |
|||
src/frontend/gens.c: && (ft_sim->devices[dg->dev_type_no]->flags |
|||
src/frontend/misccoms.c: (void) sprintf(buf, SYSTEM_MAIL, ft_sim->simulator, |
|||
src/frontend/misccoms.c: ft_sim->version, Bug_Addr); |
|||
src/frontend/misccoms.c: fprintf(cp_out, "** %s-%s : %s\n", ft_sim->simulator, |
|||
src/frontend/misccoms.c: ft_sim->version, ft_sim->description); |
|||
src/frontend/misccoms.c: fprintf(cp_out, "** %s-%s\n", ft_sim->simulator, |
|||
src/frontend/misccoms.c: ft_sim->version); |
|||
src/frontend/misccoms.c: fprintf(cp_out, "** %s-%s : %s\n", ft_sim->simulator, |
|||
src/frontend/misccoms.c: ft_sim->version, ft_sim->description); |
|||
src/frontend/misccoms.c: } else if (!eq(ft_sim->version, s)) { |
|||
src/frontend/misccoms.c: wl->wl_word, ft_sim->version); |
|||
src/frontend/misccoms.c: printf("%s-%s done\n", ft_sim->simulator, ft_sim->version); |
|||
src/frontend/outitf.c: fprintf(run->fp, "Command: version %s\n", ft_sim->version); |
|||
src/frontend/shyu.c: err=(*(ft_sim->deleteTask))(ft_curckt->ci_ckt, |
|||
src/frontend/shyu.c: err = (*(ft_sim->newTask))(ft_curckt->ci_ckt, |
|||
src/frontend/shyu.c: for(j=0;j<ft_sim->numAnalyses;j++) { |
|||
src/frontend/shyu.c: if(strcmp(ft_sim->analyses[j]->name,"options")==0) { |
|||
src/frontend/shyu.c: err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"options", |
|||
src/frontend/shyu.c: for(j=0;j<ft_sim->numAnalyses;j++) { |
|||
src/frontend/shyu.c: if(strcmp(ft_sim->analyses[j]->name,"SEN")==0) { |
|||
src/frontend/shyu.c: err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"sense", |
|||
src/frontend/shyu.c: for(j=0;j<ft_sim->numAnalyses;j++) { |
|||
src/frontend/shyu.c: if(strcmp(ft_sim->analyses[j]->name,"AC")==0) { |
|||
src/frontend/shyu.c: err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"acan", |
|||
src/frontend/shyu.c: for(i=0;i<ft_sim->numAnalyses;i++) { |
|||
src/frontend/shyu.c: if(strcmp(ft_sim->analyses[i]->name,"DCOP")==0) { |
|||
src/frontend/shyu.c: err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"dcop", |
|||
src/frontend/shyu.c: for(i=0;i<ft_sim->numAnalyses;i++) { |
|||
src/frontend/shyu.c: if(strcmp(ft_sim->analyses[i]->name,"DCTransfer")==0) { |
|||
src/frontend/shyu.c: err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"DCtransfer", |
|||
src/frontend/shyu.c: for(j=0;j<ft_sim->numAnalyses;j++) { |
|||
src/frontend/shyu.c: if(strcmp(ft_sim->analyses[j]->name,"TRAN")==0) { |
|||
src/frontend/shyu.c: err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"tranan", |
|||
src/frontend/shyu.c: for(i=0;i<ft_sim->analyses[save]->numParms;i++) { |
|||
src/frontend/shyu.c: ft_sim->analyses[save]->analysisParms[i]. |
|||
src/frontend/shyu.c: if(ft_sim->analyses[save]->analysisParms[i]. |
|||
src/frontend/shyu.c: error = (*(ft_sim->setAnalysisParm))(ckt, |
|||
src/frontend/shyu.c: senseJob, ft_sim->analyses[save]-> |
|||
src/frontend/shyu.c: parm = INPgetValue(ckt,&line,ft_sim-> |
|||
src/frontend/shyu.c: error = (*(ft_sim->setAnalysisParm))(ckt, |
|||
src/frontend/shyu.c: senseJob, ft_sim->analyses[save]-> |
|||
src/frontend/shyu.c: if(i==ft_sim->analyses[save]->numParms) { |
|||
src/frontend/shyu.c: if((err = (*(ft_sim->doAnalyses))(ckt, 1, ft_curckt->ci_curTask))!=OK){ |
|||
src/frontend/spiceif.c: err = (*(ft_sim->newCircuit))(&ckt); |
|||
src/frontend/spiceif.c: (*(ft_sim->newTask))(ckt,(void**)&(ft_curckt->ci_defTask),taskUid); |
|||
src/frontend/spiceif.c: (*(ft_sim->newTask))(ckt,(void**)&(ft_curckt->ci_defTask),taskUid, |
|||
src/frontend/spiceif.c: for(j=0;j<ft_sim->numAnalyses;j++) { |
|||
src/frontend/spiceif.c: if(strcmp(ft_sim->analyses[j]->name,"options")==0) { |
|||
src/frontend/spiceif.c: err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,optUid, |
|||
src/frontend/spiceif.c: (INPtables *) *tab,ft_curckt->ci_defTask, ft_sim->nodeParms, |
|||
src/frontend/spiceif.c: ft_sim->numNodeParms); |
|||
src/frontend/spiceif.c: err=(*(ft_sim->deleteTask))(ft_curckt->ci_ckt, |
|||
src/frontend/spiceif.c: err = (*(ft_sim->newTask))(ft_curckt->ci_ckt, |
|||
src/frontend/spiceif.c: err = (*(ft_sim->newTask))(ft_curckt->ci_ckt, |
|||
src/frontend/spiceif.c: for(j=0;j<ft_sim->numAnalyses;j++) { |
|||
src/frontend/spiceif.c: if(strcmp(ft_sim->analyses[j]->name,"options")==0) { |
|||
src/frontend/spiceif.c: err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,optUid, |
|||
src/frontend/spiceif.c: if ((err = (*(ft_sim->doAnalyses))(ckt, 1, ft_curckt->ci_curTask))!=OK){ |
|||
src/frontend/spiceif.c: if ((err = (*(ft_sim->doAnalyses))(ckt, 0, ft_curckt->ci_curTask))!=OK){ |
|||
src/frontend/spiceif.c: for(i=0;i<ft_sim->numAnalyses;i++) { |
|||
src/frontend/spiceif.c: if(strcmp(ft_sim->analyses[i]->name,"options")==0) { |
|||
src/frontend/spiceif.c: for (i = 0; i < ft_sim->analyses[which]->numParms; i++) |
|||
src/frontend/spiceif.c: if (eq(ft_sim->analyses[which]->analysisParms[i].keyword, name) && |
|||
src/frontend/spiceif.c: (ft_sim->analyses[which]->analysisParms[i].dataType & IF_SET)) |
|||
src/frontend/spiceif.c: if (i == ft_sim->analyses[which]->numParms) { |
|||
src/frontend/spiceif.c: switch (ft_sim->analyses[which]->analysisParms[i].dataType & IF_VARTYPES) { |
|||
src/frontend/spiceif.c: ft_sim->analyses[which]->analysisParms[i].dataType); |
|||
src/frontend/spiceif.c: if ((err = (*(ft_sim->setAnalysisParm))(cc, (void *)ft_curckt->ci_curOpt, |
|||
src/frontend/spiceif.c: ft_sim->analyses[which]->analysisParms[i].id, &pval, |
|||
src/frontend/spiceif.c: if ((err = (*(ft_sim->setAnalysisParm))(cc, (void *)ft_curckt->ci_defOpt, |
|||
src/frontend/spiceif.c: ft_sim->analyses[which]->analysisParms[i].id, &pval, |
|||
src/frontend/spiceif.c: switch(ft_sim->analyses[which]->analysisParms[i].dataType & IF_VARTYPES) { |
|||
src/frontend/spiceif.c: (*(ft_sim->deleteCircuit))(cc); |
|||
src/frontend/spiceif.c: device = ft_sim->devices[typecode]; |
|||
src/frontend/spiceif.c: device = ft_sim->devices[typecode]; |
|||
src/frontend/spiceif.c: device = ft_sim->devices[typecode]; |
|||
src/frontend/spiceif.c: err = (*(ft_sim->askInstanceQuest))((void *)ckt, (void *)dev, |
|||
src/frontend/spiceif.c: err = (*(ft_sim->askModelQuest))((void*)ckt, (void *) mod, |
|||
src/frontend/spiceif.c: err = (*(ft_sim->setInstanceParm))((void *)ckt, (void *)dev, |
|||
src/frontend/spiceif.c: err = (*(ft_sim->setModelParm))((void*)ckt, (void *) mod, |
|||
src/frontend/spiceif.c: err = (*(ft_sim->findInstance))((void *)ck,&type,devptr,name,NULL,NULL); |
|||
src/frontend/spiceif.c: err = (*(ft_sim->findModel))((void *)ck,&type,modptr,name); |
|||
src/frontend/spiceif.c: for(i=0;i<ft_sim->analyses[which]->numParms;i++) { |
|||
src/frontend/spiceif.c: if(strcmp(ft_sim->analyses[which]->analysisParms[i].keyword,name)==0) { |
|||
src/frontend/spiceif.c: return( (*(ft_sim->askAnalysisQuest))(ckt,anal, |
|||
src/frontend/spiceif.c: ft_sim->analyses[which]->analysisParms[i].id,parm, |
|||
src/frontend/spiceif.c: for(i=0;i<ft_sim->numAnalyses;i++) { |
|||
src/frontend/spiceif.c: if(strcmp(ft_sim->analyses[i]->name,"TRAN")==0){ |
|||
src/frontend/spiceif.c: err =(*(ft_sim->findAnalysis))(ci->ci_ckt,&which, &anal,tranUid, |
|||
src/frontend/spiceif.c: for(i=0;i<ft_sim->numAnalyses;i++) { |
|||
src/frontend/spiceif.c: if(strcmp(ft_sim->analyses[i]->name,"options")==0) { |
|||
src/frontend/spiceif.c: for (i = 0; i < ft_sim->analyses[which]->numParms; i++) |
|||
src/frontend/spiceif.c: if (eq(ft_sim->analyses[which]->analysisParms[i].keyword, name)) |
|||
src/frontend/spiceif.c: if (i == ft_sim->analyses[which]->numParms) |
|||
src/frontend/spiceif.c: if ((*(ft_sim->askAnalysisQuest))(ckt, ft_curckt->ci_curTask, |
|||
src/frontend/spiceif.c: ft_sim->analyses[which]->analysisParms[i].id, &parm, |
|||
src/frontend/spiceif.c: return (parmtovar(&parm, &(ft_sim->analyses[which]->analysisParms[i]))); |
|||
src/frontend/spiceif.c: for (i = 0, vars = v = NULL; i<ft_sim->analyses[which]->numParms; i++) { |
|||
src/frontend/spiceif.c: if(!(ft_sim->analyses[which]->analysisParms[i].dataType&IF_ASK)) { |
|||
src/frontend/spiceif.c: if ((*(ft_sim->askAnalysisQuest))(ckt, ft_curckt->ci_curTask, |
|||
src/frontend/spiceif.c: ft_sim->analyses[which]->analysisParms[i].id, |
|||
src/frontend/spiceif.c: &(ft_sim->analyses[which]->analysisParms[i])); |
|||
src/frontend/spiceif.c: &(ft_sim->analyses[which]->analysisParms[i])); |
|||
src/frontend/where.c: msg = (*ft_sim->nonconvErr)((void *) (ft_curckt->ci_ckt), 0); |
|||
src/frontend/where.c: msg = (*ft_sim->nonconvErr)((void *) (ft_curckt->ci_ckt), 0); |
|||
src/include/inpmacs.h:error=(*(ft_sim->func))args;\ |
|||
src/main.c: cp_program = ft_sim->simulator; |
|||
src/spicelib/devices/dev.c: * ft_sim->numDevices = num_devices(); |
|||
src/spicelib/devices/dev.c: ft_sim->numDevices = DEVNUM; |
|||
src/spicelib/devices/dev.c: ft_sim->devices = devices_ptr(); |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "NOISE") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "OP") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "DISTO") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "AC") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "PZ") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "DC") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "TF") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "TRAN") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "SENS") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->numAnalyses; i++) { |
|||
src/spicelib/parser/inp2dot.c: if (strcmp(ft_sim->analyses[i]->name, "SENS2") == 0) { |
|||
src/spicelib/parser/inp2dot.c: for (i = 0; i < ft_sim->analyses[which]->numParms; i++) { |
|||
src/spicelib/parser/inp2dot.c: ft_sim->analyses[which]->analysisParms[i].keyword)) { |
|||
src/spicelib/parser/inp2dot.c: if (ft_sim->analyses[which]->analysisParms[i].dataType & IF_FLAG) { |
|||
src/spicelib/parser/inp2dot.c: (*(ft_sim->setAnalysisParm)) (ckt, foo, |
|||
src/spicelib/parser/inp2dot.c: ft_sim->analyses[which]->analysisParms[i].id, |
|||
src/spicelib/parser/inp2dot.c: ft_sim->analyses[which]->analysisParms[i].dataType, tab); |
|||
src/spicelib/parser/inp2dot.c: (*(ft_sim->setAnalysisParm)) (ckt, foo, |
|||
src/spicelib/parser/inp2dot.c: ft_sim-> |
|||
src/spicelib/parser/inp2dot.c: if (i == ft_sim->analyses[which]->numParms) { |
|||
src/spicelib/parser/inpapnam.c: if (parmname && ft_sim->analyses[type]) { |
|||
src/spicelib/parser/inpapnam.c: for (i = 0; i < ft_sim->analyses[type]->numParms; i++) |
|||
src/spicelib/parser/inpapnam.c: ft_sim->analyses[type]->analysisParms[i].keyword) == |
|||
src/spicelib/parser/inpapnam.c: return (*(ft_sim->setAnalysisParm)) (ckt, analPtr, |
|||
src/spicelib/parser/inpapnam.c: ft_sim-> |
|||
src/spicelib/parser/inpdoopt.c: for(i=0;i<ft_sim->numAnalyses;i++) { |
|||
src/spicelib/parser/inpdoopt.c: prm = ft_sim->analyses[i]; |
|||
src/spicelib/parser/inpdoopt.c: error = (*(ft_sim->setAnalysisParm))(ckt,anal, |
|||
src/spicelib/parser/inpdpar.c: for (i = 0; i < (*(*(ft_sim->devices)[dev]).numInstanceParms); i++) { |
|||
src/spicelib/parser/inpdpar.c: ((*(ft_sim->devices)[dev]).instanceParms[i]. |
|||
src/spicelib/parser/inpdpar.c: ((*(ft_sim->devices)[dev]). |
|||
src/spicelib/parser/inpdpar.c: error = (*(ft_sim->setInstanceParm)) (ckt, fast, |
|||
src/spicelib/parser/inpdpar.c: (*(ft_sim->devices) |
|||
src/spicelib/parser/inpdpar.c: if (i == (*(*(ft_sim->devices)[dev]).numInstanceParms)) { |
|||
src/spicelib/parser/inpgmod.c: error = (*(ft_sim->newModel)) (ckt, (modtmp)->INPmodType, |
|||
src/spicelib/parser/inpgmod.c: for (j = 0; j < (* (*(ft_sim->devices)[(modtmp)->INPmodType]).numModelParms); j++) { |
|||
src/spicelib/parser/inpgmod.c: if (strcmp("cpl", ((*(ft_sim->devices) [ (modtmp)->INPmodType ]).modelParms[j].keyword)) == 0) { |
|||
src/spicelib/parser/inpgmod.c: if (strcmp(parm,((*(ft_sim->devices)[(modtmp)->INPmodType]).modelParms[j].keyword)) == 0) { |
|||
src/spicelib/parser/inpgmod.c: val = INPgetValue(ckt, &line, ((* (ft_sim->devices)[(modtmp)->INPmodType]).modelParms[j].dataType), tab); |
|||
src/spicelib/parser/inpgmod.c: error = (*(ft_sim->setModelParm)) (ckt, ((modtmp)->INPmodfast), |
|||
src/spicelib/parser/inpgmod.c: (* (ft_sim->devices)[(modtmp)->INPmodType]).modelParms[j].id, |
|||
src/spicelib/parser/inpgmod.c: (*(ft_sim->devices) |
|||
src/spicelib/parser/inpgtitl.c: error = (*(ft_sim->newCircuit)) (ckt); |
|||
src/spicelib/parser/inppname.c: for (i = 0; i < (*(*(ft_sim->devices)[dev]).numInstanceParms); i++) { |
|||
src/spicelib/parser/inppname.c: ((*(ft_sim->devices)[dev]).instanceParms[i].keyword)) == |
|||
src/spicelib/parser/inppname.c: (*(ft_sim->setInstanceParm)) (ckt, fast, |
|||
src/spicelib/parser/inppname.c: (*(ft_sim->devices)[dev]). |
|||
src/spicelib/parser/inppname.c: if (i == (*(*(ft_sim->devices)[dev]).numInstanceParms)) { |
|||
src/spicelib/parser/inpptree.c: for (i = 0; i < ft_sim->numSpecSigs; i++) |
|||
src/spicelib/parser/inpptree.c: if (!strcmp(ft_sim->specSigs[i], buf)) |
|||
src/spicelib/parser/inpptree.c: if (i < ft_sim->numSpecSigs) { |
|||
src/spicelib/parser/inpsymt.c: error = (*(ft_sim->newNode)) (ckt, &t->t_node, *token); |
|||
src/spicelib/parser/inpsymt.c: error = (*(ft_sim->groundNode)) (ckt, &t->t_node, *token); |
|||
src/spicelib/parser/inptyplk.c: for (i = 0; i < ft_sim->numDevices; i++) { |
|||
src/spicelib/parser/inptyplk.c: printf("In INPtypelook, checking model type = %s against existing model = %s, . . .\n", type, (*(ft_sim->devices)[i]).name ); |
|||
src/spicelib/parser/inptyplk.c: if ((ft_sim->devices)[i] && strcmp(type, (*(ft_sim->devices)[i]).name) == 0) { |
|||
src/xspice/mif/mifgetmod.c: error = (*(ft_sim->newModel))( ckt,(modtmp)->INPmodType, |
|||
src/xspice/mif/mifgetmod.c: for(j=0;j<*((*(ft_sim->devices)[(modtmp)->INPmodType]).numModelParms); j++) { |
|||
src/xspice/mif/mifgetmod.c: if (strcmp(parm,((*(ft_sim->devices) [ (modtmp)-> |
|||
src/xspice/mif/mifgetmod.c: ((*(ft_sim->devices)[(modtmp)-> |
|||
src/xspice/mif/mifgetmod.c: error = (*(ft_sim->setModelParm))(ckt, |
|||
src/xspice/mif/mifgetmod.c: (*(ft_sim->devices)[(modtmp)->INPmodType ]). |
|||
src/xspice/mif/mifgetmod.c: if(j >= *((*(ft_sim->devices)[(modtmp)->INPmodType]).numModelParms)) |
|||
@ -0,0 +1,581 @@ |
|||
/* NG-SPICE -- An electrical circuit simulator |
|||
* |
|||
* Copyright (c) 1990 University of California |
|||
* Copyright (c) 2000 Arno W. Peters |
|||
* |
|||
* $Id$ |
|||
* |
|||
* Permission to use, copy, modify, and distribute this software and |
|||
* its documentation without fee, and without a written agreement is |
|||
* hereby granted, provided that the above copyright notice, this |
|||
* paragraph and the following three paragraphs appear in all copies. |
|||
* |
|||
* This software program and documentation are copyrighted by their |
|||
* authors. The software program and documentation are supplied "as |
|||
* is", without any accompanying services from the authors. The |
|||
* authors do not warrant that the operation of the program will be |
|||
* uninterrupted or error-free. The end-user understands that the |
|||
* program was developed for research purposes and is advised not to |
|||
* rely exclusively on the program for any reason. |
|||
* |
|||
* IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR DIRECT, |
|||
* INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING |
|||
* LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS |
|||
* DOCUMENTATION, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE |
|||
* POSSIBILITY OF SUCH DAMAGE. THE AUTHORS SPECIFICALLY DISCLAIMS ANY |
|||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE |
|||
* SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE AUTHORS |
|||
* HAVE NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, |
|||
* ENHANCEMENTS, OR MODIFICATIONS. */ |
|||
|
|||
#include "config.h" |
|||
#include "assert.h" |
|||
|
|||
#include "devdefs.h" |
|||
#include "ifsim.h" |
|||
|
|||
#include "dev.h" |
|||
#include "memory.h" /* to alloc, realloc devices*/ |
|||
|
|||
|
|||
#ifdef XSPICE |
|||
/*saj headers for xspice*/ |
|||
#include <string.h> /* for strcpy, strcat*/ |
|||
#ifndef HAS_WINDOWS |
|||
#include <dlfcn.h> /* to load libraries*/ |
|||
#else /* ifdef HAS_WINDOWS */ |
|||
#include <windows.h> |
|||
#include "wstdio.h" |
|||
void *dlopen (const char *, int); |
|||
void *dlsym (void *, const char *); |
|||
int dlclose (void *); |
|||
char *dlerror (void); |
|||
#define RTLD_LAZY 1 /* lazy function call binding */ |
|||
#define RTLD_NOW 2 /* immediate function call binding */ |
|||
#define RTLD_GLOBAL 4 /* symbols in this dlopen'ed obj are visible to other dlopen'ed objs */ |
|||
static char errstr[128]; |
|||
#endif /* ifndef HAS_WINDOWS */ |
|||
#include "dllitf.h" /* the coreInfo Structure*/ |
|||
#include "evtudn.h" /*Use defined nodes */ |
|||
|
|||
Evt_Udn_Info_t **g_evt_udn_info = NULL; |
|||
int g_evt_num_udn_types = 0; |
|||
|
|||
/*The digital node type */ |
|||
extern Evt_Udn_Info_t idn_digital_info; |
|||
|
|||
int add_udn(int,Evt_Udn_Info_t **); |
|||
/*saj*/ |
|||
#endif |
|||
|
|||
|
|||
#include "asrc/asrcitf.h" |
|||
#include "bjt/bjtitf.h" |
|||
#include "bjt2/bjt2itf.h" |
|||
#include "bsim1/bsim1itf.h" |
|||
#include "bsim2/bsim2itf.h" |
|||
#include "bsim3/bsim3itf.h" |
|||
#include "bsim3v0/bsim3v0itf.h" |
|||
#include "bsim3v1/bsim3v1itf.h" |
|||
#include "bsim3v1a/bsim3v1aitf.h" |
|||
#include "bsim3v1s/bsim3v1sitf.h" |
|||
#include "bsim3soi/b3soiitf.h" |
|||
#include "bsim4/bsim4itf.h" |
|||
#include "bsim3soi_pd/b3soipditf.h" |
|||
#include "bsim3soi_fd/b3soifditf.h" |
|||
#include "bsim3soi_dd/b3soidditf.h" |
|||
#include "cap/capitf.h" |
|||
#include "cccs/cccsitf.h" |
|||
#include "ccvs/ccvsitf.h" |
|||
#include "csw/cswitf.h" |
|||
#include "dio/dioitf.h" |
|||
#include "hfet1/hfetitf.h" |
|||
#include "hfet2/hfet2itf.h" |
|||
#include "hisim/hsm1itf.h" |
|||
#include "ind/inditf.h" |
|||
#include "isrc/isrcitf.h" |
|||
#include "jfet/jfetitf.h" |
|||
#include "jfet2/jfet2itf.h" |
|||
#include "ltra/ltraitf.h" |
|||
#include "mes/mesitf.h" |
|||
#include "mesa/mesaitf.h" |
|||
#include "mos1/mos1itf.h" |
|||
#include "mos2/mos2itf.h" |
|||
#include "mos3/mos3itf.h" |
|||
#include "mos6/mos6itf.h" |
|||
#include "mos9/mos9itf.h" |
|||
#include "cpl/cplitf.h" |
|||
#include "res/resitf.h" |
|||
#include "soi3/soi3itf.h" |
|||
#include "sw/switf.h" |
|||
#include "tra/traitf.h" |
|||
#include "txl/txlitf.h" |
|||
#include "urc/urcitf.h" |
|||
#include "vbic/vbicitf.h" |
|||
#include "vccs/vccsitf.h" |
|||
#include "vcvs/vcvsitf.h" |
|||
#include "vsrc/vsrcitf.h" |
|||
#ifdef ADMS |
|||
#include "adms/hicum0/hicum0itf.h" |
|||
#include "adms/hicum2/hicum2itf.h" |
|||
#include "adms/mextram/mextramitf.h" |
|||
#include "adms/ekv/ekvitf.h" |
|||
#include "adms/psp102/psp102itf.h" |
|||
#endif |
|||
#ifdef CIDER |
|||
/* Numerical devices (Cider integration) */ |
|||
#include "nbjt/nbjtitf.h" |
|||
#include "nbjt2/nbjt2itf.h" |
|||
#include "numd/numditf.h" |
|||
#include "numd2/numd2itf.h" |
|||
#include "numos/numositf.h" |
|||
#endif |
|||
#ifdef NDEV |
|||
#include "ndev/ndevitf.h" |
|||
#endif |
|||
|
|||
/*saj in xspice the DEVices size can be varied so DEVNUM is an int*/ |
|||
#ifdef CIDER |
|||
|
|||
#ifdef ADMS |
|||
|
|||
#ifdef NDEV |
|||
#ifdef XSPICE |
|||
static int DEVNUM = 57; |
|||
#else |
|||
#define DEVNUM 57 |
|||
#endif |
|||
#else /* no ndev */ |
|||
#ifdef XSPICE |
|||
static int DEVNUM = 56; |
|||
#else |
|||
#define DEVNUM 56 |
|||
#endif |
|||
#endif /* NDEV */ |
|||
|
|||
#else /* NOT ADMS */ |
|||
#ifdef NDEV |
|||
#ifdef XSPICE |
|||
static int DEVNUM = 53; |
|||
#else |
|||
#define DEVNUM 53 |
|||
#endif |
|||
#else |
|||
#ifdef XSPICE |
|||
static int DEVNUM = 52; |
|||
#else |
|||
#define DEVNUM 52 |
|||
#endif |
|||
#endif /* NDEV */ |
|||
#endif /* ADMS */ |
|||
|
|||
#else /* NOT CIDER */ |
|||
|
|||
#ifdef ADMS |
|||
|
|||
#ifdef NDEV |
|||
#ifdef XSPICE |
|||
static int DEVNUM = 53; /* was 52 */ |
|||
#else |
|||
#define DEVNUM 53 /* was 52 */ |
|||
#endif |
|||
#else /* no ndev */ |
|||
#ifdef XSPICE |
|||
static int DEVNUM = 52; /* was 51 */ |
|||
#else |
|||
#define DEVNUM 52 /* was 51 */ |
|||
#endif |
|||
#endif /* NDEV */ |
|||
|
|||
#else /* NOT ADMS */ |
|||
|
|||
#ifdef NDEV |
|||
#ifdef XSPICE |
|||
static int DEVNUM = 48; |
|||
#else |
|||
#define DEVNUM 48 |
|||
#endif |
|||
#else /* no ndev */ |
|||
#ifdef XSPICE |
|||
static int DEVNUM = 47; |
|||
#else |
|||
#define DEVNUM 47 |
|||
#endif |
|||
#endif /* NDEV */ |
|||
|
|||
#endif /* ADMS */ |
|||
|
|||
#endif /* CIDER */ |
|||
|
|||
/*Make this dynamic for later attempt to make all devices dynamic*/ |
|||
SPICEdev **DEVices=NULL; |
|||
|
|||
/*Flag to indicate that device type it is, |
|||
*0 = normal spice device |
|||
*1 = xspice device |
|||
*/ |
|||
#ifdef XSPICE |
|||
int *DEVicesfl=NULL; |
|||
int DEVflag(int type){ |
|||
if(type < DEVNUM && type >= 0) |
|||
return DEVicesfl[type]; |
|||
else |
|||
return -1; |
|||
} |
|||
#endif |
|||
|
|||
|
|||
void |
|||
spice_init_devices(void) |
|||
{ |
|||
#ifdef XSPICE |
|||
/*Initilise the structs and add digital node type */ |
|||
g_evt_udn_info = (Evt_Udn_Info_t **)MALLOC(sizeof(Evt_Udn_Info_t *)); |
|||
g_evt_num_udn_types = 1; |
|||
g_evt_udn_info[0] = &idn_digital_info; |
|||
|
|||
DEVicesfl = (int *)tmalloc(DEVNUM*sizeof(int)); |
|||
/* tmalloc should automatically zero the array! */ |
|||
#endif |
|||
|
|||
DEVices = (SPICEdev **)tmalloc(DEVNUM*sizeof(SPICEdev *)); |
|||
/* URC device MUST precede both resistors and capacitors */ |
|||
DEVices[ 0] = get_urc_info(); |
|||
DEVices[ 1] = get_asrc_info(); |
|||
DEVices[ 2] = get_bjt_info(); |
|||
DEVices[ 3] = get_bjt2_info(); |
|||
DEVices[ 4] = get_bsim1_info(); |
|||
DEVices[ 5] = get_bsim2_info(); |
|||
DEVices[ 6] = get_bsim3_info(); |
|||
DEVices[ 7] = get_bsim3v0_info(); |
|||
DEVices[ 8] = get_bsim3v1_info(); |
|||
DEVices[ 9] = get_bsim3v1a_info(); |
|||
DEVices[10] = get_bsim3v1s_info(); |
|||
DEVices[11] = get_b3soi_info(); |
|||
DEVices[12] = get_bsim4_info(); |
|||
DEVices[13] = get_b3soipd_info(); |
|||
DEVices[14] = get_b3soifd_info(); |
|||
DEVices[15] = get_b3soidd_info(); |
|||
DEVices[16] = get_cap_info(); |
|||
DEVices[17] = get_cccs_info(); |
|||
DEVices[18] = get_ccvs_info(); |
|||
DEVices[19] = get_cpl_info(); |
|||
DEVices[20] = get_csw_info(); |
|||
DEVices[21] = get_dio_info(); |
|||
DEVices[22] = get_hfeta_info(); |
|||
DEVices[23] = get_hfet2_info(); |
|||
DEVices[24] = get_hsm1_info(); |
|||
DEVices[25] = get_ind_info(); |
|||
DEVices[26] = get_mut_info(); |
|||
DEVices[27] = get_isrc_info(); |
|||
DEVices[28] = get_jfet_info(); |
|||
DEVices[29] = get_jfet2_info(); |
|||
DEVices[30] = get_ltra_info(); |
|||
DEVices[31] = get_mes_info(); |
|||
DEVices[32] = get_mesa_info(); |
|||
DEVices[33] = get_mos1_info(); |
|||
DEVices[34] = get_mos2_info(); |
|||
DEVices[35] = get_mos3_info(); |
|||
DEVices[36] = get_mos6_info(); |
|||
DEVices[37] = get_mos9_info(); |
|||
DEVices[38] = get_res_info(); |
|||
DEVices[39] = get_soi3_info(); |
|||
DEVices[40] = get_sw_info(); |
|||
DEVices[41] = get_tra_info(); |
|||
DEVices[42] = get_txl_info(); |
|||
DEVices[43] = get_vbic_info(); |
|||
DEVices[44] = get_vccs_info(); |
|||
DEVices[45] = get_vcvs_info(); |
|||
DEVices[46] = get_vsrc_info(); |
|||
#ifdef CIDER |
|||
DEVices[47] = get_nbjt_info(); |
|||
DEVices[48] = get_nbjt2_info(); |
|||
DEVices[49] = get_numd_info(); |
|||
DEVices[50] = get_numd2_info(); |
|||
DEVices[51] = get_numos_info(); |
|||
#ifdef ADMS |
|||
DEVices[52] = get_hicum0_info(); |
|||
DEVices[53] = get_hicum2_info(); |
|||
DEVices[54] = get_mextram_info(); |
|||
DEVices[55] = get_ekv_info(); |
|||
DEVices[56] = get_psp102_info(); |
|||
#ifdef NDEV /* NDEV */ |
|||
DEVices[57] = get_ndev_info(); |
|||
assert(58 == DEVNUM); |
|||
#else |
|||
assert(57 == DEVNUM); |
|||
#endif |
|||
#else /* NOT ADMS */ |
|||
#ifdef NDEV /* NDEV */ |
|||
DEVices[52] = get_ndev_info(); |
|||
assert(53 == DEVNUM); |
|||
#else |
|||
assert(52 == DEVNUM); |
|||
#endif |
|||
#endif /* ADMS */ |
|||
#else /* NOT CIDER */ |
|||
#ifdef ADMS |
|||
DEVices[47] = get_hicum0_info(); |
|||
DEVices[48] = get_hicum2_info(); |
|||
DEVices[49] = get_mextram_info(); |
|||
DEVices[50] = get_ekv_info(); |
|||
DEVices[51] = get_psp102_info(); |
|||
#ifdef NDEV /* NDEV */ |
|||
DEVices[52] = get_ndev_info(); |
|||
assert(53 == DEVNUM); |
|||
#else |
|||
assert(52 == DEVNUM); |
|||
#endif |
|||
#else /* NOT ADMS */ |
|||
#ifdef NDEV /* NDEV */ |
|||
DEVices[47] = get_ndev_info(); |
|||
assert(48 == DEVNUM); |
|||
#else |
|||
assert(47 == DEVNUM); |
|||
#endif |
|||
#endif /* ADMS */ |
|||
#endif /* CIDER */ |
|||
return; |
|||
} |
|||
|
|||
int |
|||
num_devices(void) |
|||
{ |
|||
return DEVNUM; |
|||
} |
|||
|
|||
IFdevice ** |
|||
devices_ptr(void) |
|||
{ |
|||
return (IFdevice **) DEVices; |
|||
} |
|||
|
|||
SPICEdev ** |
|||
devices(void) |
|||
{ |
|||
return DEVices; |
|||
} |
|||
|
|||
|
|||
#ifdef DEVLIB |
|||
/*not yet usable*/ |
|||
|
|||
#ifdef ADMS |
|||
#define DEVICES_USED {"asrc", "bjt", "bjt2", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v2", "bsim3v1", "bsim4", "bsim3soipd", "bsim3soifd", "bsim3soidd", \ |
|||
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \ |
|||
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "hicum2", "mextram", "ekv", "psp102"} |
|||
#else |
|||
#define DEVICES_USED {"asrc", "bjt", "bjt2", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v2", "bsim3v1", "bsim4", "bsim3soipd", "bsim3soifd", "bsim3soidd", \ |
|||
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \ |
|||
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc"} |
|||
#endif |
|||
int load_dev(char *name) { |
|||
char *msg; |
|||
char libname[50]; |
|||
void *lib; |
|||
SPICEdev *(*fetch)(void)=NULL; |
|||
SPICEdev *device; |
|||
|
|||
strcpy(libname, "lib"); |
|||
strcat(libname,name); |
|||
strcat(libname,".so"); |
|||
|
|||
lib = dlopen(libname,RTLD_NOW); |
|||
if(!lib){ |
|||
msg = dlerror(); |
|||
printf("%s\n", msg); |
|||
return 1; |
|||
} |
|||
|
|||
strcpy(libname, "get_"); |
|||
strcat(libname,name); |
|||
strcat(libname,"_info"); |
|||
fetch = dlsym(lib,libname); |
|||
|
|||
if(!fetch){ |
|||
msg = dlerror(); |
|||
printf("%s\n", msg); |
|||
return 1; |
|||
} |
|||
device = fetch(); |
|||
add_device(1,&device,0); |
|||
return 0; |
|||
} |
|||
|
|||
void load_alldevs(void){ |
|||
char *devs[] = DEVICES_USED; |
|||
int num = sizeof(devs)/sizeof(char *); |
|||
int i; |
|||
for(i=0; i< num;i++) |
|||
load_dev(devs[i]); |
|||
return; |
|||
} |
|||
#endif |
|||
|
|||
/*-------------------- XSPICE additions below ----------------------*/ |
|||
#ifdef XSPICE |
|||
#include "mif.h" |
|||
#include "cm.h" |
|||
#include "cpextern.h" |
|||
#include "fteext.h" /* for ft_sim */ |
|||
#include "cktdefs.h" /* for DEVmaxnum */ |
|||
|
|||
static void relink() { |
|||
/* added by SDB; DEVmaxnum is an external int defined in cktdefs.h */ |
|||
extern int DEVmaxnum; |
|||
|
|||
/* |
|||
* This replacement done by SDB on 6.11.2003 |
|||
* |
|||
* ft_sim->numDevices = num_devices(); |
|||
* DEVmaxnum = num_devices(); |
|||
*/ |
|||
ft_sim->numDevices = DEVNUM; |
|||
DEVmaxnum = DEVNUM; |
|||
|
|||
ft_sim->devices = devices_ptr(); |
|||
return; |
|||
} |
|||
|
|||
int add_device(int n, SPICEdev **devs, int flag){ |
|||
int i; |
|||
DEVices = (SPICEdev **)trealloc(DEVices,(DEVNUM+n)*sizeof(SPICEdev *)); |
|||
DEVicesfl = (int *)trealloc(DEVicesfl,(DEVNUM+n)*sizeof(int)); |
|||
for(i = 0; i < n;i++){ |
|||
/*debug*/printf("Added device: %s\n",devs[i]->DEVpublic.name); |
|||
DEVices[DEVNUM+i] = devs[i]; |
|||
|
|||
/* added by SDB on 6.20.2003 */ |
|||
DEVices[DEVNUM+i]->DEVinstSize = &MIFiSize; |
|||
|
|||
DEVicesfl[DEVNUM+i] = flag; |
|||
} |
|||
DEVNUM += n; |
|||
relink(); |
|||
return 0; |
|||
} |
|||
|
|||
int add_udn(int n,Evt_Udn_Info_t **udns){ |
|||
int i; |
|||
g_evt_udn_info = (Evt_Udn_Info_t **)trealloc(g_evt_udn_info,(g_evt_num_udn_types+n)*sizeof(Evt_Udn_Info_t *)); |
|||
for(i = 0; i < n;i++){ |
|||
/*debug*/printf("Added udn: %s\n",udns[i]->name); |
|||
g_evt_udn_info[g_evt_num_udn_types+i] = udns[i]; |
|||
} |
|||
g_evt_num_udn_types += n; |
|||
return 0; |
|||
} |
|||
|
|||
extern struct coreInfo_t coreInfo; |
|||
|
|||
int load_opus(char *name){ |
|||
void *lib; |
|||
const char *msg; |
|||
int *num=NULL; |
|||
struct coreInfo_t **core; |
|||
SPICEdev **devs; |
|||
Evt_Udn_Info_t **udns; |
|||
void *(*fetch)(void)=NULL; |
|||
|
|||
lib = dlopen(name,RTLD_NOW); |
|||
if(!lib){ |
|||
msg = dlerror(); |
|||
printf("%s\n", msg); |
|||
return 1; |
|||
} |
|||
|
|||
fetch = dlsym(lib,"CMdevNum"); |
|||
if(fetch){ |
|||
num = (int *)(*fetch)(); |
|||
printf("Got %u devices.\n",*num); |
|||
fetch = NULL; |
|||
}else{ |
|||
msg = dlerror(); |
|||
printf("%s\n", msg); |
|||
return 1; |
|||
} |
|||
|
|||
fetch = dlsym(lib,"CMdevs"); |
|||
if(fetch){ |
|||
devs = (SPICEdev **)(*fetch)(); |
|||
fetch = NULL; |
|||
}else{ |
|||
msg = dlerror(); |
|||
printf("%s\n", msg); |
|||
return 1; |
|||
} |
|||
|
|||
fetch = dlsym(lib,"CMgetCoreItfPtr"); |
|||
if(fetch){ |
|||
core = (struct coreInfo_t **)(*fetch)(); |
|||
*core = &coreInfo; |
|||
fetch = NULL; |
|||
}else{ |
|||
msg = dlerror(); |
|||
printf("%s\n", msg); |
|||
return 1; |
|||
} |
|||
add_device(*num,devs,1); |
|||
|
|||
fetch = dlsym(lib,"CMudnNum"); |
|||
if(fetch){ |
|||
num = (int *)(*fetch)(); |
|||
printf("Got %u udns.\n",*num); |
|||
fetch = NULL; |
|||
}else{ |
|||
msg = dlerror(); |
|||
printf("%s\n", msg); |
|||
return 1; |
|||
} |
|||
|
|||
fetch = dlsym(lib,"CMudns"); |
|||
if(fetch){ |
|||
udns = (Evt_Udn_Info_t **)(*fetch)(); |
|||
fetch = NULL; |
|||
}else{ |
|||
msg = dlerror(); |
|||
printf("%s\n", msg); |
|||
return 1; |
|||
} |
|||
|
|||
add_udn(*num,udns); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
#if defined(__MINGW32__) || defined(HAS_WINDOWS) |
|||
|
|||
void *dlopen(const char *name,int type) |
|||
{ |
|||
return LoadLibrary(name); |
|||
} |
|||
|
|||
void *dlsym(void *hDll, const char *funcname) |
|||
{ |
|||
return GetProcAddress(hDll, funcname); |
|||
} |
|||
|
|||
char *dlerror(void) |
|||
{ |
|||
LPVOID lpMsgBuf; |
|||
|
|||
FormatMessage( |
|||
FORMAT_MESSAGE_ALLOCATE_BUFFER | |
|||
FORMAT_MESSAGE_FROM_SYSTEM | |
|||
FORMAT_MESSAGE_IGNORE_INSERTS, |
|||
NULL, |
|||
GetLastError(), |
|||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), |
|||
(LPTSTR) &lpMsgBuf, |
|||
0, |
|||
NULL |
|||
); |
|||
strcpy(errstr,lpMsgBuf); |
|||
LocalFree(lpMsgBuf); |
|||
return errstr; |
|||
} |
|||
#endif |
|||
|
|||
#endif |
|||
/*-------------------- end of XSPICE additions ----------------------*/ |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue