Fix NAN error in numd2 area report and crashes when a doping file is missing. Update examples/cider so that the test circuits all run; add case sensitivity tests for rootfile and ic.file parameter strings enclosed in a single pair of double quotes.
This commit is contained in:
parent
5cd919ebc1
commit
43520d9b8a
|
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
ngspice -b pz1.cir
|
||||||
|
|
||||||
|
and the operating point file 'PEBJT1--OP.0.q1' is generated.
|
||||||
|
|
||||||
|
The .model in the included library 'pebjt1.lib' has an output rootfile
|
||||||
|
parameter which determines the PEBJT1-- prefix. The mixed case in the name
|
||||||
|
of the generated OP file is retained. Without any rootfile or output statement
|
||||||
|
in the .model, the file created will be named 'OP.0.q1'.
|
||||||
|
|
@ -10,8 +10,6 @@ IEE 13 2 0.1mA
|
||||||
Q1 11 12 13 M_NPN AREA=8
|
Q1 11 12 13 M_NPN AREA=8
|
||||||
Q2 21 22 13 M_NPN AREA=8
|
Q2 21 22 13 M_NPN AREA=8
|
||||||
|
|
||||||
.DC VBBP 2.75v 3.25001v 10mv
|
|
||||||
.PRINT V(21) V(11)
|
|
||||||
|
|
||||||
.MODEL M_NPN nbjt level=2
|
.MODEL M_NPN nbjt level=2
|
||||||
+ title TWO-DIMENSIONAL NUMERICAL POLYSILICON EMITTER BIPOLAR TRANSISTOR
|
+ title TWO-DIMENSIONAL NUMERICAL POLYSILICON EMITTER BIPOLAR TRANSISTOR
|
||||||
|
|
@ -54,4 +52,6 @@ Q2 21 22 13 M_NPN AREA=8
|
||||||
+ models bgn srh auger conctau concmob fieldmob
|
+ models bgn srh auger conctau concmob fieldmob
|
||||||
|
|
||||||
.OPTIONS ACCT BYPASS=1
|
.OPTIONS ACCT BYPASS=1
|
||||||
|
.DC VBBP 2.75v 3.25001v 10mv
|
||||||
|
.PRINT DC V(21) V(11)
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
**
|
||||||
|
* Numerical models for a
|
||||||
|
* polysilicon emitter complementary bipolar process.
|
||||||
|
* The default device size is 1um by 10um (LxW)
|
||||||
|
**
|
||||||
|
|
||||||
|
.model M_NPN nbjt level=1
|
||||||
|
+ title One-Dimensional Numerical Bipolar
|
||||||
|
+ options base.depth=0.15 base.area=0.1 base.length=1.0 defa=10p
|
||||||
|
+ x.mesh loc=-0.2 n=1
|
||||||
|
+ x.mesh loc=0.0 n=51
|
||||||
|
+ x.mesh wid=0.15 h.e=0.0001 h.m=.004 r=1.2
|
||||||
|
+ x.mesh wid=1.15 h.s=0.0001 h.m=.004 r=1.2
|
||||||
|
+ domain num=1 material=1 x.l=0.0
|
||||||
|
+ domain num=2 material=2 x.h=0.0
|
||||||
|
+ material num=1 silicon
|
||||||
|
+ mobility mat=1 concmod=ct fieldmod=ct
|
||||||
|
+ material num=2 polysilicon
|
||||||
|
+ mobility mat=2 concmod=ct fieldmod=ct
|
||||||
|
+ doping gauss n.type conc=3e20 x.l=-0.2 x.h=0.0 char.len=0.047
|
||||||
|
+ doping gauss p.type conc=5e18 x.l=-0.2 x.h=0.0 char.len=0.100
|
||||||
|
+ doping unif n.type conc=1e16 x.l=0.0 x.h=1.3
|
||||||
|
+ doping gauss n.type conc=5e19 x.l=1.3 x.h=1.3 char.len=0.100
|
||||||
|
+ models bgn srh auger conctau concmob fieldmob ^aval
|
||||||
|
+ method devtol=1e-12 ac=direct itlim=15
|
||||||
|
+ output rootfile="PEBJT1--" Psi N.CONC P.conc
|
||||||
|
|
||||||
|
.model M_NPSUB numd level=1
|
||||||
|
+ title One-Dimensional Numerical Collector-Substrate Diode
|
||||||
|
+ options defa=10p
|
||||||
|
+ x.mesh loc=1.3 n=1
|
||||||
|
+ x.mesh loc=2.0 n=101
|
||||||
|
+ domain num=1 material=1
|
||||||
|
+ material num=1 silicon
|
||||||
|
+ mobility mat=1 concmod=ct fieldmod=ct
|
||||||
|
+ doping gauss n.type conc=5e19 x.l=1.3 x.h=1.3 char.len=0.100
|
||||||
|
+ doping unif p.type conc=1e15 x.l=0.0 x.h=2.0
|
||||||
|
+ models bgn srh auger conctau concmob fieldmob ^aval
|
||||||
|
+ method devtol=1e-12 itlim=10
|
||||||
|
|
||||||
|
.model M_PNP nbjt level=1
|
||||||
|
+ title One-Dimensional Numerical Bipolar
|
||||||
|
+ options base.depth=0.2 base.area=0.1 base.length=1.0 defa=10p
|
||||||
|
+ x.mesh loc=-0.2 n=1
|
||||||
|
+ x.mesh loc=0.0 n=51
|
||||||
|
+ x.mesh wid=0.20 h.e=0.0001 h.m=.004 r=1.2
|
||||||
|
+ x.mesh wid=1.10 h.s=0.0001 h.m=.004 r=1.2
|
||||||
|
+ domain num=1 material=1 x.l=0.0
|
||||||
|
+ domain num=2 material=2 x.h=0.0
|
||||||
|
+ material num=1 silicon
|
||||||
|
+ mobility mat=1 concmod=ct fieldmod=ct
|
||||||
|
+ material num=2 polysilicon
|
||||||
|
+ mobility mat=2 concmod=ct fieldmod=ct
|
||||||
|
+ doping gauss p.type conc=3e20 x.l=-0.2 x.h=0.0 char.len=0.047
|
||||||
|
+ doping gauss n.type conc=5e17 x.l=-0.2 x.h=0.0 char.len=0.200
|
||||||
|
+ doping unif p.type conc=1e16 x.l=0.0 x.h=1.3
|
||||||
|
+ doping gauss p.type conc=5e19 x.l=1.3 x.h=1.3 char.len=0.100
|
||||||
|
+ models bgn srh auger conctau concmob fieldmob ^aval
|
||||||
|
+ method devtol=1e-12 ac=direct itlim=15
|
||||||
|
|
||||||
|
.model M_PNSUB numd level=1
|
||||||
|
+ title One-Dimensional Numerical Collector-Substrate Diode
|
||||||
|
+ options defa=10p
|
||||||
|
+ x.mesh loc=1.3 n=1
|
||||||
|
+ x.mesh loc=2.0 n=101
|
||||||
|
+ domain num=1 material=1
|
||||||
|
+ material num=1 silicon
|
||||||
|
+ mobility mat=1 concmod=ct fieldmod=ct
|
||||||
|
+ doping gauss p.type conc=5e19 x.l=1.3 x.h=1.3 char.len=0.100
|
||||||
|
+ doping unif n.type conc=1e15 x.l=0.0 x.h=2.0
|
||||||
|
+ models bgn srh auger conctau concmob fieldmob ^aval
|
||||||
|
+ method devtol=1e-12 itlim=10
|
||||||
|
|
@ -13,4 +13,5 @@ CL 5 0 0.1pF
|
||||||
|
|
||||||
.PZ 3 0 5 0 vol pz
|
.PZ 3 0 5 0 vol pz
|
||||||
|
|
||||||
|
.PRINT PZ ALL
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
PZ Analysis of a Common Emitter Amplifier
|
||||||
|
|
||||||
|
Vcc 1 0 5v
|
||||||
|
Vee 2 0 0v
|
||||||
|
|
||||||
|
Vin 3 0 0.7838 AC 1
|
||||||
|
RS 3 4 1K
|
||||||
|
Q1 5 4 2 M_NPN AREA=4 SAVE
|
||||||
|
RL 1 5 2.5k
|
||||||
|
CL 5 0 0.1pF
|
||||||
|
|
||||||
|
.INCLUDE pebjt1.lib
|
||||||
|
|
||||||
|
.PZ 3 0 5 0 vol pz
|
||||||
|
|
||||||
|
.PRINT PZ ALL
|
||||||
|
.OP
|
||||||
|
.END
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
ngspice -b pd1.cir
|
||||||
|
|
||||||
|
This will generate the operating point file 'Pre-Pin-Diode-OP.0.d1', which
|
||||||
|
is read as the ic.file (initial condition file) for 'pindiode.cir'.
|
||||||
|
Note that if there is no output line in the .model section of 'pd1.cir',
|
||||||
|
the generated file will be named 'OP.0.d1'. In this case the ic.file value
|
||||||
|
in 'pindiode.cir' would need to be chenged to match it.
|
||||||
|
|
||||||
|
Then:
|
||||||
|
|
||||||
|
ngspice -b pindiode.cir
|
||||||
|
|
||||||
|
can be run which will input 'Pre-Pin-Diode-OP.0.d1'. If you do not run
|
||||||
|
'pd1.cir' first, the 'pindiode.cir' simulation will run OK but tell you it
|
||||||
|
cannot find the iinitial condition file.
|
||||||
|
|
@ -29,7 +29,8 @@ D1 1 2 M_PN AREA=100
|
||||||
.option acct bypass=0 abstol=1e-18 itl2=100
|
.option acct bypass=0 abstol=1e-18 itl2=100
|
||||||
.op
|
.op
|
||||||
.ac dec 10 100kHz 10gHz
|
.ac dec 10 100kHz 10gHz
|
||||||
|
.print ac i(Vpp)
|
||||||
.dc Vpp -3.0v 2.0001v 50mv
|
.dc Vpp -3.0v 2.0001v 50mv
|
||||||
.print i(Vpp)
|
.print dc i(Vpp)
|
||||||
|
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,6 @@ D1 3 2 M_PN area=100
|
||||||
|
|
||||||
.option acct bypass=1 abstol=1e-15 itl2=100
|
.option acct bypass=1 abstol=1e-15 itl2=100
|
||||||
.tran 0.001ns 1.0ns
|
.tran 0.001ns 1.0ns
|
||||||
.print i(Vpp)
|
.print tran i(Vpp)
|
||||||
|
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
PRE-PIN-DIODE TWO-DIMENSIONAL PIN-DIODE CIRCUIT
|
||||||
|
|
||||||
|
VIN 1 0 0.0v (PWL 0ns 0.8v 1ns -50.0v)
|
||||||
|
L1 1 2 0.5uH
|
||||||
|
VD 2 3 0.0v
|
||||||
|
D1 3 0 M_PIN AREA=200 save
|
||||||
|
VRC 2 4 0.0v
|
||||||
|
R1 4 5 100
|
||||||
|
C1 5 0 1.0nF
|
||||||
|
|
||||||
|
.MODEL M_PIN NUMD LEVEL=2
|
||||||
|
+ options defw=1000u
|
||||||
|
+ x.mesh n=1 l=0.0
|
||||||
|
+ x.mesh n=2 l=0.2
|
||||||
|
+ x.mesh n=4 l=0.4
|
||||||
|
+ x.mesh n=8 l=0.6
|
||||||
|
+ x.mesh n=13 l=1.0
|
||||||
|
+
|
||||||
|
+ y.mesh n=1 l=0.0
|
||||||
|
+ y.mesh n=9 l=4.0
|
||||||
|
+ y.mesh n=24 l=10.0
|
||||||
|
+ y.mesh n=29 l=15.0
|
||||||
|
+ y.mesh n=34 l=20.0
|
||||||
|
+
|
||||||
|
+ domain num=1 material=1
|
||||||
|
+ material num=1 silicon tn=20ns tp=20ns
|
||||||
|
+
|
||||||
|
+ electrode num=1 x.l=0.6 x.h=1.0 y.h=0.0
|
||||||
|
+ electrode num=2 y.l=20.0
|
||||||
|
+
|
||||||
|
+ doping gauss p.type conc=1.0e20 char.len=1.076 x.l=0.75 x.h=1.1 y.h=0.0
|
||||||
|
+ + lat.rotate ratio=0.1
|
||||||
|
+ doping unif n.type conc=1.0e14
|
||||||
|
+ doping gauss n.type conc=1.0e20 char.len=1.614 x.l=-0.1 x.h=1.1 y.l=20.0
|
||||||
|
+
|
||||||
|
+ models bgn srh auger conctau concmob fieldmob
|
||||||
|
+ output rootfile="Pre-Pin-Diode-"
|
||||||
|
|
||||||
|
.OPTION ACCT BYPASS=1
|
||||||
|
* .TRAN 1NS 100NS
|
||||||
|
* .PRINT TRAN v(3) I(VIN)
|
||||||
|
.op
|
||||||
|
|
||||||
|
.END
|
||||||
|
|
@ -3,7 +3,7 @@ TWO-DIMENSIONAL PIN-DIODE CIRCUIT
|
||||||
VIN 1 0 0.0v (PWL 0ns 0.8v 1ns -50.0v)
|
VIN 1 0 0.0v (PWL 0ns 0.8v 1ns -50.0v)
|
||||||
L1 1 2 0.5uH
|
L1 1 2 0.5uH
|
||||||
VD 2 3 0.0v
|
VD 2 3 0.0v
|
||||||
D1 3 0 M_PIN AREA=200 IC.FILE="OP.0.d1"
|
D1 3 0 M_PIN AREA=200 IC.FILE="Pre-Pin-Diode-OP.0.d1"
|
||||||
VRC 2 4 0.0v
|
VRC 2 4 0.0v
|
||||||
R1 4 5 100
|
R1 4 5 100
|
||||||
C1 5 0 1.0nF
|
C1 5 0 1.0nF
|
||||||
|
|
@ -38,5 +38,6 @@ C1 5 0 1.0nF
|
||||||
.OPTION ACCT BYPASS=1
|
.OPTION ACCT BYPASS=1
|
||||||
.TRAN 1NS 100NS
|
.TRAN 1NS 100NS
|
||||||
.PRINT TRAN v(3) I(VIN)
|
.PRINT TRAN v(3) I(VIN)
|
||||||
|
.PLOT TRAN v(3) I(VIN)
|
||||||
|
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,6 @@ CB 3 4 0.1pf
|
||||||
+ method ac=direct onec
|
+ method ac=direct onec
|
||||||
|
|
||||||
.tran 0.2ns 40ns
|
.tran 0.2ns 40ns
|
||||||
.print v(4)
|
.print tran v(4)
|
||||||
.options acct bypass=1 method=gear
|
.options acct bypass=1 method=gear
|
||||||
.end
|
.end
|
||||||
|
|
|
||||||
|
|
@ -31,4 +31,5 @@ IREF 7 0 50UA
|
||||||
.TRAN 0.1NS 50NS
|
.TRAN 0.1NS 50NS
|
||||||
|
|
||||||
.OPTIONS ACCT BYPASS=1 METHOD=GEAR
|
.OPTIONS ACCT BYPASS=1 METHOD=GEAR
|
||||||
|
.PRINT TRAN I(VB)
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -26,4 +26,5 @@ M8 8 9 1 1 M_PMOS_1 W=15U L=1U
|
||||||
.DC VPL -5MV 5MV 0.1MV
|
.DC VPL -5MV 5MV 0.1MV
|
||||||
|
|
||||||
.OPTIONS ACCT BYPASS=1 METHOD=GEAR
|
.OPTIONS ACCT BYPASS=1 METHOD=GEAR
|
||||||
|
.print DC V(3) V(4) V(8)
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,6 @@ VBN 2 26 0.0V
|
||||||
+ OUTPUT ^ALL.DEBUG
|
+ OUTPUT ^ALL.DEBUG
|
||||||
|
|
||||||
.TRAN 0.1NS 5.0NS
|
.TRAN 0.1NS 5.0NS
|
||||||
.PRINT V(4)
|
.PRINT TRAN V(4)
|
||||||
.OPTIONS ACCT BYPASS=1 METHOD=GEAR
|
.OPTIONS ACCT BYPASS=1 METHOD=GEAR
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ D1 1 2 M_RES AREA=1
|
||||||
*.OP
|
*.OP
|
||||||
*.DC VPP 0.0v 10.01v 0.1v
|
*.DC VPP 0.0v 10.01v 0.1v
|
||||||
.TRAN 1s 10.001s 0s 0.1s
|
.TRAN 1s 10.001s 0s 0.1s
|
||||||
.PRINT I(VPP)
|
.PRINT TRAN I(VPP)
|
||||||
|
|
||||||
.OPTION ACCT BYPASS=1
|
.OPTION ACCT BYPASS=1
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ D1 1 2 M_RES AREA=1
|
||||||
*.OP
|
*.OP
|
||||||
.DC VPP 0.0v 10.01v 0.1v
|
.DC VPP 0.0v 10.01v 0.1v
|
||||||
*.TRAN 1s 100.001s 0s 0.2s
|
*.TRAN 1s 100.001s 0s 0.2s
|
||||||
.PRINT I(VPP)
|
.PRINT DC I(VPP)
|
||||||
|
|
||||||
.OPTION ACCT BYPASS=1 RELTOL=1e-12
|
.OPTION ACCT BYPASS=1 RELTOL=1e-12
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -26,5 +26,5 @@ RL 1 2 1.0K
|
||||||
|
|
||||||
.OPTION ACCT BYPASS=1 METHOD=GEAR
|
.OPTION ACCT BYPASS=1 METHOD=GEAR
|
||||||
.TRAN 0.5MS 50MS
|
.TRAN 0.5MS 50MS
|
||||||
.PRINT I(VLINE)
|
.PRINT TRAN I(VLINE)
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,6 @@ DT 4 2 M_PIN AREA=1
|
||||||
|
|
||||||
.OPTION ACCT BYPASS=1
|
.OPTION ACCT BYPASS=1
|
||||||
.TRAN 0.1NS 10NS
|
.TRAN 0.1NS 10NS
|
||||||
.PRINT TRAN V(3) I(VIN)
|
.PRINT TRAN V(3) I(VNN)
|
||||||
|
|
||||||
.END
|
.END
|
||||||
|
|
|
||||||
|
|
@ -354,6 +354,7 @@ ONEmemStats(FILE *file, ONEdevice *pDevice)
|
||||||
int numContactNodes;
|
int numContactNodes;
|
||||||
|
|
||||||
|
|
||||||
|
if (!pDevice) { return; }
|
||||||
fprintf(file, "----------------------------------------\n");
|
fprintf(file, "----------------------------------------\n");
|
||||||
fprintf(file, "Device %s Memory Usage:\n", pDevice->name);
|
fprintf(file, "Device %s Memory Usage:\n", pDevice->name);
|
||||||
fprintf(file, "Item Count Bytes\n");
|
fprintf(file, "Item Count Bytes\n");
|
||||||
|
|
@ -425,10 +426,12 @@ void
|
||||||
ONEcpuStats(FILE *file, ONEdevice *pDevice)
|
ONEcpuStats(FILE *file, ONEdevice *pDevice)
|
||||||
{
|
{
|
||||||
static const char cpuFormat[] = "%-20s%10g%10g%10g%10g%10g\n";
|
static const char cpuFormat[] = "%-20s%10g%10g%10g%10g%10g\n";
|
||||||
ONEstats *pStats = pDevice->pStats;
|
ONEstats *pStats = NULL;
|
||||||
double total;
|
double total;
|
||||||
int iTotal;
|
int iTotal;
|
||||||
|
|
||||||
|
if (!pDevice) { return; }
|
||||||
|
pStats = pDevice->pStats;
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
"----------------------------------------------------------------------\n");
|
"----------------------------------------------------------------------\n");
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ int readAsciiData(const char *fileName, int impType, DOPtable **ppTable)
|
||||||
(void) fprintf(cp_err, "unable to open SUPREM file \"%s\": %s\n",
|
(void) fprintf(cp_err, "unable to open SUPREM file \"%s\": %s\n",
|
||||||
fileName, strerror(errno));
|
fileName, strerror(errno));
|
||||||
xrc = -1;
|
xrc = -1;
|
||||||
goto EXITPOINT;
|
return xrc; /* return immediately, nothing to free */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get sign of concentrations */
|
/* Get sign of concentrations */
|
||||||
|
|
@ -156,16 +156,15 @@ int readSupremData(const char *fileName, int fileType, int impType,
|
||||||
|
|
||||||
/* read the Suprem data file */
|
/* read the Suprem data file */
|
||||||
if ( fileType == 0 ) { /* BINARY FILE */
|
if ( fileType == 0 ) { /* BINARY FILE */
|
||||||
const int rc = SUPbinRead(fileName, x, conc, &impType,
|
xrc = SUPbinRead(fileName, x, conc, &impType, &numNodes);
|
||||||
&numNodes);
|
|
||||||
if (rc != 0) {
|
|
||||||
(void) fprintf(cp_err, "Data input failed.\n");
|
|
||||||
xrc = -1;
|
|
||||||
goto EXITPOINT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SUPascRead( fileName, x, conc, &impType, &numNodes );
|
xrc = SUPascRead( fileName, x, conc, &impType, &numNodes );
|
||||||
|
}
|
||||||
|
if (xrc != 0) {
|
||||||
|
(void) fprintf(cp_err, "Data input failed.\n");
|
||||||
|
xrc = -1;
|
||||||
|
return xrc; /* return immediately, nothing to free */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate 2-D array to read in data of x-coordinate and N(x) */
|
/* allocate 2-D array to read in data of x-coordinate and N(x) */
|
||||||
|
|
@ -200,7 +199,7 @@ int readSupremData(const char *fileName, int fileType, int impType,
|
||||||
printf("%e %e\n", profileData[ 0 ][ index ], profileData[ 1 ][ index ]);
|
printf("%e %e\n", profileData[ 0 ][ index ], profileData[ 1 ][ index ]);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
EXITPOINT:
|
|
||||||
if (xrc != 0) {
|
if (xrc != 0) {
|
||||||
free_profile_data(profileData);
|
free_profile_data(profileData);
|
||||||
free(tmpTable);
|
free(tmpTable);
|
||||||
|
|
|
||||||
|
|
@ -380,6 +380,7 @@ TWOmemStats(FILE *file, TWOdevice *pDevice)
|
||||||
TWOchannel *pChannel;
|
TWOchannel *pChannel;
|
||||||
int numContactNodes;
|
int numContactNodes;
|
||||||
|
|
||||||
|
if (!pDevice) { return; }
|
||||||
fprintf(file, "----------------------------------------\n");
|
fprintf(file, "----------------------------------------\n");
|
||||||
fprintf(file, "Device %s Memory Usage:\n", pDevice->name );
|
fprintf(file, "Device %s Memory Usage:\n", pDevice->name );
|
||||||
fprintf(file, "Item Count Bytes\n");
|
fprintf(file, "Item Count Bytes\n");
|
||||||
|
|
@ -460,10 +461,12 @@ void
|
||||||
TWOcpuStats(FILE *file, TWOdevice *pDevice)
|
TWOcpuStats(FILE *file, TWOdevice *pDevice)
|
||||||
{
|
{
|
||||||
static const char cpuFormat[] = "%-20s%10g%10g%10g%10g%10g\n";
|
static const char cpuFormat[] = "%-20s%10g%10g%10g%10g%10g\n";
|
||||||
TWOstats *pStats = pDevice->pStats;
|
TWOstats *pStats = NULL;
|
||||||
double total;
|
double total;
|
||||||
int iTotal;
|
int iTotal;
|
||||||
|
|
||||||
|
if (!pDevice) { return; }
|
||||||
|
pStats = pDevice->pStats;
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
"----------------------------------------------------------------------\n");
|
"----------------------------------------------------------------------\n");
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,72 @@ static int inp_poly_2g6_compat(struct card* deck);
|
||||||
static void inp_poly_err(struct card *deck);
|
static void inp_poly_err(struct card *deck);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CIDER
|
||||||
|
static char *keep_case_of_cider_param(char *buffer)
|
||||||
|
{
|
||||||
|
int numq = 0, keep_case = 0;
|
||||||
|
char *s = 0;
|
||||||
|
/* Retain the case of strings enclosed in double quotes for
|
||||||
|
output rootfile and doping infile params within Cider .model
|
||||||
|
statements. Also for the ic.file filename param in an element
|
||||||
|
instantiation statement.
|
||||||
|
No nested double quotes.
|
||||||
|
*/
|
||||||
|
for (s = buffer; *s && (*s != '\n'); s++) {
|
||||||
|
if (*s == '\"') {
|
||||||
|
numq++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (numq == 2) {
|
||||||
|
/* One pair of double quotes */
|
||||||
|
for (s = buffer; *s && (*s != '\n'); s++) {
|
||||||
|
if (*s == '\"') {
|
||||||
|
keep_case = (keep_case == 0 ? 1 : 0);
|
||||||
|
}
|
||||||
|
if (!keep_case) {
|
||||||
|
*s = tolower_c(*s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (s = buffer; *s && (*s != '\n'); s++) {
|
||||||
|
*s = tolower_c(*s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int is_comment_or_blank(char *buffer)
|
||||||
|
{
|
||||||
|
/* Assume line buffers have initial whitespace removed */
|
||||||
|
switch (buffer[0]) {
|
||||||
|
case '*':
|
||||||
|
case '$':
|
||||||
|
case '#':
|
||||||
|
case '\n':
|
||||||
|
case '\0':
|
||||||
|
return 1;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int turn_off_case_retention(char *buffer)
|
||||||
|
{
|
||||||
|
if (buffer[0] == '.') {
|
||||||
|
if (ciprefix(".model", buffer)) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (is_comment_or_blank(buffer)) {
|
||||||
|
return 0;
|
||||||
|
} else if (buffer[0] == '+') {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* insert a new card, just behind the given card */
|
/* insert a new card, just behind the given card */
|
||||||
static struct card *insert_new_line(
|
static struct card *insert_new_line(
|
||||||
|
|
@ -1012,6 +1078,9 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
|
||||||
static int is_control = 0; /* We are reading from a .control section */
|
static int is_control = 0; /* We are reading from a .control section */
|
||||||
|
|
||||||
bool found_end = FALSE, shell_eol_continuation = FALSE;
|
bool found_end = FALSE, shell_eol_continuation = FALSE;
|
||||||
|
#ifdef CIDER
|
||||||
|
static int in_cider_model = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* First read in all lines & put them in the struct cc */
|
/* First read in all lines & put them in the struct cc */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
@ -1238,6 +1307,27 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
|
||||||
* double quotes are printed. */
|
* double quotes are printed. */
|
||||||
{
|
{
|
||||||
char *s;
|
char *s;
|
||||||
|
#ifdef CIDER
|
||||||
|
if (ciprefix(".model", buffer)) {
|
||||||
|
if (strcasestr(buffer, " numos") ||
|
||||||
|
strcasestr(buffer, " numd") || /* Also numd2 */
|
||||||
|
strcasestr(buffer, " nbjt")) { /* Also nbjt2 */
|
||||||
|
in_cider_model = 1;
|
||||||
|
} else {
|
||||||
|
in_cider_model = 0;
|
||||||
|
}
|
||||||
|
#ifdef TRACE
|
||||||
|
printf("Found .model Cider model is %s\n",
|
||||||
|
(in_cider_model ? "ON" : "OFF"));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (in_cider_model && turn_off_case_retention(buffer)) {
|
||||||
|
in_cider_model = 0;
|
||||||
|
#ifdef TRACE
|
||||||
|
printf("Cider model is OFF\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (ciprefix("plot", buffer) || ciprefix("gnuplot", buffer) ||
|
if (ciprefix("plot", buffer) || ciprefix("gnuplot", buffer) ||
|
||||||
ciprefix("hardcopy", buffer)) {
|
ciprefix("hardcopy", buffer)) {
|
||||||
/* lower case excluded for tokens following title, xlabel,
|
/* lower case excluded for tokens following title, xlabel,
|
||||||
|
|
@ -1316,6 +1406,15 @@ struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
|
||||||
*s = tolower_c(*s);
|
*s = tolower_c(*s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef CIDER
|
||||||
|
else if (in_cider_model && !is_comment_or_blank(buffer) &&
|
||||||
|
(ciprefix(".model", buffer) || buffer[0] == '+')) {
|
||||||
|
s = keep_case_of_cider_param(buffer);
|
||||||
|
}
|
||||||
|
else if (strcasestr(buffer, "ic.file")) {
|
||||||
|
s = keep_case_of_cider_param(buffer);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/* no lower case letters for lines beginning with: */
|
/* no lower case letters for lines beginning with: */
|
||||||
else if (!ciprefix("write", buffer) &&
|
else if (!ciprefix("write", buffer) &&
|
||||||
!ciprefix("wrdata", buffer) &&
|
!ciprefix("wrdata", buffer) &&
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ NUMD2ask(CKTcircuit *ckt, GENinstance *inInst, int which, IFvalue *value, IFvalu
|
||||||
return (OK);
|
return (OK);
|
||||||
case NUMD2_AREA:
|
case NUMD2_AREA:
|
||||||
value->rValue = inst->NUMD2area;
|
value->rValue = inst->NUMD2area;
|
||||||
break;
|
return (OK);
|
||||||
case NUMD2_TEMP:
|
case NUMD2_TEMP:
|
||||||
value->rValue = inst->NUMD2temp - CONSTCtoK;
|
value->rValue = inst->NUMD2temp - CONSTCtoK;
|
||||||
return (OK);
|
return (OK);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue